Skip to content

Commit 8198588

Browse files
committed
feat: add solid createTableHook
1 parent c03bc58 commit 8198588

4 files changed

Lines changed: 1157 additions & 89 deletions

File tree

Lines changed: 73 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1-
import { createComponent } from 'solid-js'
1+
import { Match, Switch, createComponent } from 'solid-js'
22
import type { JSX } from 'solid-js'
3+
import type {
4+
Cell,
5+
CellData,
6+
Header,
7+
RowData,
8+
TableFeatures,
9+
} from '@tanstack/table-core'
310

411
export 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
}

packages/solid-table/src/createTableHelper.ts

Lines changed: 0 additions & 81 deletions
This file was deleted.

0 commit comments

Comments
 (0)