1- import { createComponent } from 'solid-js'
1+ import { Match , Switch , createComponent } from 'solid-js'
22import type { JSX } from 'solid-js'
3+ import type {
4+ Cell ,
5+ CellData ,
6+ Header ,
7+ RowData ,
8+ TableFeatures ,
9+ } from '@tanstack/table-core'
310
411export function flexRender < TProps > (
512 Comp : ( ( _props : TProps ) => JSX . Element ) | JSX . Element | undefined ,
@@ -14,10 +21,69 @@ 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+ return (
71+ < Switch >
72+ < Match when = { 'cell' in props && props . cell } >
73+ { ( cell ) =>
74+ flexRender ( cell ( ) . column . columnDef . cell , cell ( ) . getContext ( ) )
75+ }
76+ </ Match >
77+ < Match when = { 'header' in props && props . header } >
78+ { ( header ) =>
79+ flexRender ( header ( ) . column . columnDef . header , header ( ) . getContext ( ) )
80+ }
81+ </ Match >
82+ < Match when = { 'footer' in props && props . footer } >
83+ { ( footer ) =>
84+ flexRender ( footer ( ) . column . columnDef . footer , footer ( ) . getContext ( ) )
85+ }
86+ </ Match >
87+ </ Switch >
88+ )
2389}
0 commit comments