@@ -30,25 +30,29 @@ import classNames from "@calcom/ui/classNames";
30
30
import { useColumnSizingVars } from "../hooks" ;
31
31
import { usePersistentColumnResizing } from "../lib/resizing" ;
32
32
33
- export type DataTableProps < TData > = {
33
+ export type DataTablePropsFromWrapper < TData > = {
34
34
table : ReactTableType < TData > ;
35
35
tableContainerRef : React . RefObject < HTMLDivElement > ;
36
36
isPending ?: boolean ;
37
- onRowMouseclick ?: ( row : Row < TData > ) => void ;
38
- onScroll ?: ( e : Pick < React . UIEvent < HTMLDivElement , UIEvent > , "target" > ) => void ;
39
- tableOverlay ?: React . ReactNode ;
40
37
variant ?: "default" | "compact" ;
41
38
testId ?: string ;
42
39
bodyTestId ?: string ;
43
- hideHeader ?: boolean ;
44
40
children ?: React . ReactNode ;
45
- identifier ?: string ;
46
- enableColumnResizing ?: boolean ;
47
41
className ?: string ;
48
42
containerClassName ?: string ;
43
+ headerClassName ?: string ;
44
+ rowClassName ?: string ;
49
45
paginationMode ?: "infinite" | "standard" ;
50
46
} ;
51
47
48
+ export type DataTableProps < TData > = DataTablePropsFromWrapper < TData > & {
49
+ onRowMouseclick ?: ( row : Row < TData > ) => void ;
50
+ onScroll ?: ( e : Pick < React . UIEvent < HTMLDivElement , UIEvent > , "target" > ) => void ;
51
+ tableOverlay ?: React . ReactNode ;
52
+ identifier ?: string ;
53
+ enableColumnResizing ?: boolean ;
54
+ } ;
55
+
52
56
export function DataTable < TData > ( {
53
57
table,
54
58
tableContainerRef,
@@ -57,13 +61,14 @@ export function DataTable<TData>({
57
61
onRowMouseclick,
58
62
onScroll,
59
63
children,
60
- hideHeader,
61
64
identifier : _identifier ,
62
65
enableColumnResizing,
63
66
testId,
64
67
bodyTestId,
65
68
className,
66
69
containerClassName,
70
+ headerClassName,
71
+ rowClassName,
67
72
paginationMode = "infinite" ,
68
73
...rest
69
74
} : DataTableProps < TData > & React . ComponentPropsWithoutRef < "div" > ) {
@@ -145,44 +150,42 @@ export function DataTable<TData>({
145
150
...columnSizingVars ,
146
151
...( Boolean ( enableColumnResizing ) && { width : table . getTotalSize ( ) } ) ,
147
152
} } >
148
- { ! hideHeader && (
149
- < TableHeader className = "sticky top-0 z-10" >
150
- { table . getHeaderGroups ( ) . map ( ( headerGroup : HeaderGroup < TData > ) => (
151
- < TableRow key = { headerGroup . id } className = "hover:bg-subtle flex w-full" >
152
- { headerGroup . headers . map ( ( header : Header < TData , unknown > ) => {
153
- const { column } = header ;
154
- return (
155
- < TableHead
156
- key = { header . id }
157
- style = { {
158
- ...( column . getIsPinned ( ) === "left" && { left : `${ column . getStart ( "left" ) } px` } ) ,
159
- ...( column . getIsPinned ( ) === "right" && { right : `${ column . getStart ( "right" ) } px` } ) ,
160
- width : `var(--header-${ kebabCase ( header ?. id ) } -size)` ,
161
- } }
162
- className = { classNames (
163
- "relative flex shrink-0 items-center" ,
164
- "bg-subtle" ,
165
- column . getIsPinned ( ) && "top-0 z-20 sm:sticky"
166
- ) } >
167
- < TableHeadLabel header = { header } />
168
- { Boolean ( enableColumnResizing ) && header . column . getCanResize ( ) && (
169
- < div
170
- onMouseDown = { header . getResizeHandler ( ) }
171
- onTouchStart = { header . getResizeHandler ( ) }
172
- className = { classNames (
173
- "group absolute right-0 top-0 h-full w-[5px] cursor-col-resize touch-none select-none opacity-[0.1] hover:opacity-50" ,
174
- header . column . getIsResizing ( ) && "!opacity-75"
175
- ) } >
176
- < div className = "bg-inverted mx-auto h-full w-[1px]" />
177
- </ div >
178
- ) }
179
- </ TableHead >
180
- ) ;
181
- } ) }
182
- </ TableRow >
183
- ) ) }
184
- </ TableHeader >
185
- ) }
153
+ < TableHeader className = { classNames ( "sticky top-0 z-10" , headerClassName ) } >
154
+ { table . getHeaderGroups ( ) . map ( ( headerGroup : HeaderGroup < TData > ) => (
155
+ < TableRow key = { headerGroup . id } className = "hover:bg-subtle flex w-full" >
156
+ { headerGroup . headers . map ( ( header : Header < TData , unknown > ) => {
157
+ const { column } = header ;
158
+ return (
159
+ < TableHead
160
+ key = { header . id }
161
+ style = { {
162
+ ...( column . getIsPinned ( ) === "left" && { left : `${ column . getStart ( "left" ) } px` } ) ,
163
+ ...( column . getIsPinned ( ) === "right" && { right : `${ column . getStart ( "right" ) } px` } ) ,
164
+ width : `var(--header-${ kebabCase ( header ?. id ) } -size)` ,
165
+ } }
166
+ className = { classNames (
167
+ "relative flex shrink-0 items-center" ,
168
+ "bg-subtle" ,
169
+ column . getIsPinned ( ) && "top-0 z-20 sm:sticky"
170
+ ) } >
171
+ < TableHeadLabel header = { header } />
172
+ { Boolean ( enableColumnResizing ) && header . column . getCanResize ( ) && (
173
+ < div
174
+ onMouseDown = { header . getResizeHandler ( ) }
175
+ onTouchStart = { header . getResizeHandler ( ) }
176
+ className = { classNames (
177
+ "group absolute right-0 top-0 h-full w-[5px] cursor-col-resize touch-none select-none opacity-[0.1] hover:opacity-50" ,
178
+ header . column . getIsResizing ( ) && "!opacity-75"
179
+ ) } >
180
+ < div className = "bg-inverted mx-auto h-full w-[1px]" />
181
+ </ div >
182
+ ) }
183
+ </ TableHead >
184
+ ) ;
185
+ } ) }
186
+ </ TableRow >
187
+ ) ) }
188
+ </ TableHeader >
186
189
{ /* When resizing any column we will render this special memoized version of our table body */ }
187
190
{ table . getState ( ) . columnSizingInfo . isResizingColumn ? (
188
191
< MemoizedTableBody
@@ -194,6 +197,7 @@ export function DataTable<TData>({
194
197
isPending = { isPending }
195
198
onRowMouseclick = { onRowMouseclick }
196
199
paginationMode = { paginationMode }
200
+ rowClassName = { rowClassName }
197
201
/>
198
202
) : (
199
203
< DataTableBody
@@ -205,6 +209,7 @@ export function DataTable<TData>({
205
209
isPending = { isPending }
206
210
onRowMouseclick = { onRowMouseclick }
207
211
paginationMode = { paginationMode }
212
+ rowClassName = { rowClassName }
208
213
/>
209
214
) }
210
215
</ TableNew >
@@ -224,7 +229,8 @@ const MemoizedTableBody = memo(
224
229
prev . variant === next . variant &&
225
230
prev . isPending === next . isPending &&
226
231
prev . onRowMouseclick === next . onRowMouseclick &&
227
- prev . paginationMode === next . paginationMode
232
+ prev . paginationMode === next . paginationMode &&
233
+ prev . rowClassName === next . rowClassName
228
234
) as typeof DataTableBody ;
229
235
230
236
type DataTableBodyProps < TData > = {
@@ -236,6 +242,7 @@ type DataTableBodyProps<TData> = {
236
242
isPending ?: boolean ;
237
243
onRowMouseclick ?: ( row : Row < TData > ) => void ;
238
244
paginationMode ?: "infinite" | "standard" ;
245
+ rowClassName ?: string ;
239
246
} ;
240
247
241
248
type RowToRender < TData > = {
@@ -252,6 +259,7 @@ function DataTableBody<TData>({
252
259
isPending,
253
260
onRowMouseclick,
254
261
paginationMode,
262
+ rowClassName,
255
263
} : DataTableBodyProps < TData > & { paginationMode ?: "infinite" | "standard" } ) {
256
264
const { t } = useLocale ( ) ;
257
265
const virtualItems = rowVirtualizer . getVirtualItems ( ) ;
@@ -297,7 +305,7 @@ function DataTableBody<TData>({
297
305
width : "100%" ,
298
306
} ) ,
299
307
} }
300
- className = { classNames ( onRowMouseclick && "hover:cursor-pointer" , "group" ) } >
308
+ className = { classNames ( onRowMouseclick && "hover:cursor-pointer" , "group" , rowClassName ) } >
301
309
{ row . getVisibleCells ( ) . map ( ( cell ) => {
302
310
const column = cell . column ;
303
311
return (
0 commit comments