11import { createComponent } from 'solid-js'
2+ import type {
3+ Cell ,
4+ CellData ,
5+ Header ,
6+ RowData ,
7+ TableFeatures ,
8+ } from '@tanstack/table-core'
29import type { JSX } from 'solid-js'
310
411export function flexRender < TProps > (
@@ -14,10 +21,66 @@ export function flexRender<TProps>(
1421 return Comp
1522}
1623
17- export function FlexRender < TProps > (
18- props : {
19- Comp : ( ( _props : TProps ) => JSX . Element ) | JSX . Element | undefined
20- } & TProps ,
21- ) : JSX . Element {
22- return flexRender ( props . Comp , props )
24+ /**
25+ * Simplified component wrapper of `flexRender`. Use this utility component to render headers, cells, or footers with custom markup.
26+ * Only one prop (`cell`, `header`, or `footer`) may be passed.
27+ * @example <FlexRender cell={cell} />
28+ * @example <FlexRender header={header} />
29+ * @example <FlexRender footer={footer} />
30+ */
31+ export type FlexRenderProps <
32+ TFeatures extends TableFeatures ,
33+ TData extends RowData ,
34+ TValue extends CellData = CellData ,
35+ > =
36+ | { cell : Cell < TFeatures , TData , TValue > ; header ?: never ; footer ?: never }
37+ | {
38+ header : Header < TFeatures , TData , TValue >
39+ cell ?: never
40+ footer ?: never
41+ }
42+ | {
43+ footer : Header < TFeatures , TData , TValue >
44+ cell ?: never
45+ header ?: never
46+ }
47+
48+ /**
49+ * Simplified component wrapper of `flexRender`. Use this utility component to render headers, cells, or footers with custom markup.
50+ * Only one prop (`cell`, `header`, or `footer`) may be passed.
51+ * @example
52+ * ```tsx
53+ * <FlexRender cell={cell} />
54+ * <FlexRender header={header} />
55+ * <FlexRender footer={footer} />
56+ * ```
57+ *
58+ * This replaces calling `flexRender` directly like this:
59+ * ```tsx
60+ * flexRender(cell.column.columnDef.cell, cell.getContext())
61+ * flexRender(header.column.columnDef.header, header.getContext())
62+ * flexRender(footer.column.columnDef.footer, footer.getContext())
63+ * ```
64+ */
65+ export function FlexRender <
66+ TFeatures extends TableFeatures ,
67+ TData extends RowData ,
68+ TValue extends CellData = CellData ,
69+ > ( props : FlexRenderProps < TFeatures , TData , TValue > ) {
70+ if ( 'cell' in props && props . cell ) {
71+ return flexRender ( props . cell . column . columnDef . cell , props . cell . getContext ( ) )
72+ }
73+ if ( 'header' in props && props . header ) {
74+ return flexRender (
75+ props . header . column . columnDef . header ,
76+ props . header . getContext ( ) ,
77+ )
78+ }
79+ if ( 'footer' in props && props . footer ) {
80+ return flexRender (
81+ props . footer . column . columnDef . footer ,
82+ props . footer . getContext ( ) ,
83+ )
84+ }
85+ return null
2386}
0 commit comments