-
-
Notifications
You must be signed in to change notification settings - Fork 3.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
columnDef.header not being rendered when it's a JSX element #5751
Comments
That's what flexRender is for |
@KevinVandy thanks, maybe, but I can't figure out how to get the header context from within the column? To show what I mean consider this example where I'm doing this:
This works well UNTIL I click the checkbox to hide the column, then See Codesandbox: https://codesandbox.io/p/devbox/distracted-babycat-c8jddy?workspaceId=790e1583-3209-4b95-9825-3e0704bc5629 |
@ThibaultJanBeyer I'm trying to achieve the same thing, were you able to resolve this on your own? My idea was to iterate over headers instead, but they disappear from the list once a column is hidden |
Please just follow one of the hundred examples in the docs |
No @Salet I was unfortunately not able to resolve this, the issue is, like you say, that the headers can't be accessed from the table anymore once hidden. (as seen here https://codesandbox.io/p/devbox/distracted-babycat-c8jddy?workspaceId=790e1583-3209-4b95-9825-3e0704bc5629) |
@KevinVandy Example in the docs shows the exact problem that @ThibaultJanBeyer and me are trying to overcome. Take a look: |
@KevinVandy Please just give us ONE of the hundred examples where the header is non-string and we will follow it. You either treat it as string or use @Salet Here's how I did it: {table
.getAllColumns()
.filter((column) => typeof column.accessorFn !== 'undefined' && column.getCanHide())
.map((column) => {
const header = table.getFlatHeaders().find(h => h.id === column.id);
return (
<DropdownMenuCheckboxItem
key={column.id}
className="capitalize"
checked={column.getIsVisible()}
onCheckedChange={(value) => column.toggleVisibility()}
>
{flexRender(column.columnDef.header, header!.getContext())}
</DropdownMenuCheckboxItem>
);
})} But I didn't like it after all. Headers might be complex, but all we need is just user-friendly localized column name. const sorter = <TAccessor extends DeepKeys<T>, TValue = ColumnDef<T, TAccessor>>(
accessor: TAccessor,
title: string,
{ meta, ...rest }: Partial<IdentifiedColumnDef<T>> = {}
) => {
return c.accessor(accessor, {
meta: {
...meta,
columnName: title,
},
...rest,
header: ({ column }) => <DataTableColumnHeader column={column} title={title} />,
enableSorting: true,
} as any);
}; |
TanStack Table version
v8.20.5
Framework/Library version
v18.3.1
Describe the bug and the steps to reproduce it
The documentation points out to write:
However
{column.columnDef.header}
gives a type error and also does not seem to render anything when the header part is a React Element.Here is a working reproduction of the issue: https://codesandbox.io/p/devbox/pensive-nash-rhj46y?file=%2Fsrc%2Fmain.tsx%3A124%2C42
(forked from this example and only changed the line 124 to
{column.columnDef.header}
)As you can clearly see only the headers that are defined as strings are being rendered:

Thanks for your help and the great table!
Your Minimal, Reproducible Example - (Sandbox Highly Recommended)
https://codesandbox.io/p/devbox/pensive-nash-rhj46y?file=%2Fsrc%2Fmain.tsx%3A124%2C42
Screenshots or Videos (Optional)
Do you intend to try to help solve this bug with your own PR?
None
Terms & Code of Conduct
The text was updated successfully, but these errors were encountered: