@@ -6,7 +6,7 @@ dayjs.extend(weekOfYear)
66dayjs . extend ( weekYear )
77dayjs . extend ( localeData )
88import type React from "react"
9- import { Fragment , forwardRef } from "react"
9+ import { Fragment , type RefObject , useRef } from "react"
1010
1111// if more locales then english and germans are needed, we need to enable them first here
1212import "dayjs/locale/de"
@@ -15,7 +15,12 @@ import "dayjs/locale/de"
1515//import "dayjs/locale/it"
1616//import "dayjs/locale/nl"
1717
18- import type { TimeTableViewType } from "./TimeTable"
18+ import type {
19+ TimeSlotBooking ,
20+ TimeTableEntry ,
21+ TimeTableGroup ,
22+ TimeTableViewType ,
23+ } from "./TimeTable"
1924import type { TimeFrameDay } from "./TimeTableConfigStore"
2025
2126const headerTimeSlotFormat : { [ viewType in TimeTableViewType ] : string } = {
@@ -52,22 +57,36 @@ export function headerText(
5257 }
5358}
5459
55- export type CustomHeaderRowTimeSlotProps = {
60+ export type CustomHeaderRowTimeSlotProps <
61+ G extends TimeTableGroup ,
62+ I extends TimeSlotBooking ,
63+ > = {
5664 timeSlot : Dayjs
5765 timeSlotMinutes : number
5866 isLastOfDay : boolean
5967 viewType : TimeTableViewType
6068 timeFrameOfDay : TimeFrameDay
69+ entries : TimeTableEntry < G , I > [ ]
70+ slotsArray : readonly Dayjs [ ]
71+ tableCellRef : RefObject < HTMLTableCellElement >
6172}
6273
63- export type CustomHeaderRowHeaderProps = {
74+ export type CustomHeaderRowHeaderProps <
75+ G extends TimeTableGroup ,
76+ I extends TimeSlotBooking ,
77+ > = {
6478 slotsArray : readonly Dayjs [ ]
6579 viewType : TimeTableViewType
6680 timeFrameOfDay : TimeFrameDay
81+ entries : TimeTableEntry < G , I > [ ]
6782}
6883
69- type TimeTableHeaderProps = {
84+ type TimeTableHeaderProps <
85+ G extends TimeTableGroup ,
86+ I extends TimeSlotBooking ,
87+ > = {
7088 slotsArray : readonly Dayjs [ ]
89+ timeSlotMinutes : number
7190 groupHeaderColumnWidth : number | string
7291 columnWidth : number | string
7392 startDate : Dayjs
@@ -80,29 +99,38 @@ type TimeTableHeaderProps = {
8099 weekStartsOnSunday : boolean
81100 locale ?: "en" | "de"
82101
102+ entries : TimeTableEntry < G , I > [ ]
83103 customHeaderRow ?: {
84- timeSlot : ( props : CustomHeaderRowTimeSlotProps ) => JSX . Element
85- header : ( props : CustomHeaderRowHeaderProps ) => JSX . Element
104+ timeSlot : ( props : CustomHeaderRowTimeSlotProps < G , I > ) => JSX . Element
105+ header : ( props : CustomHeaderRowHeaderProps < G , I > ) => JSX . Element
86106 }
107+
108+ tableHeaderRef : React . Ref < HTMLTableSectionElement >
87109}
88110
89- export const LPTimeTableHeader = forwardRef ( function TimeTableHeader (
90- {
91- slotsArray,
92- groupHeaderColumnWidth,
93- columnWidth,
94- startDate,
95- endDate,
96- viewType,
97- showTimeSlotHeader,
98- timeFrameDay,
99- dateHeaderTextFormat,
100- weekStartsOnSunday,
101- locale,
102- customHeaderRow,
103- } : TimeTableHeaderProps ,
104- tableHeaderRef : React . Ref < HTMLTableSectionElement > ,
105- ) {
111+ const headerCellBaseClassname =
112+ "bg-surface border-transparent border-b-border after:border-border relative select-none border-0 border-b-2 border-solid p-0 pl-1 font-bold after:absolute after:bottom-[1px] after:right-0 after:top-0 after:h-full after:border-solid"
113+
114+ export const LPTimeTableHeader = function TimeTableHeader <
115+ G extends TimeTableGroup ,
116+ I extends TimeSlotBooking ,
117+ > ( {
118+ slotsArray,
119+ timeSlotMinutes,
120+ groupHeaderColumnWidth,
121+ columnWidth,
122+ startDate,
123+ endDate,
124+ viewType,
125+ showTimeSlotHeader,
126+ timeFrameDay,
127+ dateHeaderTextFormat,
128+ weekStartsOnSunday,
129+ locale,
130+ customHeaderRow,
131+ entries,
132+ tableHeaderRef,
133+ } : TimeTableHeaderProps < G , I > ) {
106134 const currentLocale = dayjs . locale ( )
107135 if ( locale && locale !== currentLocale ) {
108136 dayjs . locale ( locale )
@@ -254,7 +282,7 @@ export const LPTimeTableHeader = forwardRef(function TimeTableHeader(
254282 < th
255283 key = { `timeheader${ slot . unix ( ) } ` }
256284 colSpan = { 2 }
257- className = { `bg-surface border-transparent border-b-border after:border-border relative select-none border-0 border-b-2 border-solid p-0 pl-1 font-bold after:absolute after:bottom-[1px] after:right-0 after:top-0 after:h-full after:border-solid ${
285+ className = { `${ headerCellBaseClassname } ${
258286 isLastOfDay ? "after:border-l-2" : ""
259287 } ${ showTimeSlotHeader ? "pt-1" : "" } `}
260288 >
@@ -278,33 +306,83 @@ export const LPTimeTableHeader = forwardRef(function TimeTableHeader(
278306 slotsArray,
279307 timeFrameOfDay : timeFrameDay ,
280308 viewType,
309+ entries,
281310 } ) }
282311 </ th >
283312 { slotsArray . map ( ( slot , i ) => {
284313 const isLastOfDay =
285314 i === slotsArray . length - 1 ||
286315 ! slotsArray [ i + 1 ] . isSame ( slot , "day" )
287316 return (
288- < th
317+ < CustomHeaderRowCell
318+ customHeaderRow = { customHeaderRow }
319+ timeSlot = { slot }
320+ timeSlotMinutes = { timeSlotMinutes }
321+ timeFrameOfDay = { timeFrameDay }
322+ slotsArray = { slotsArray }
323+ entries = { entries }
324+ showTimeSlotHeader = { showTimeSlotHeader }
325+ viewType = { viewType }
326+ isLastOfDay = { isLastOfDay }
289327 key = { `timeheader${ slot . unix ( ) } ` }
290- colSpan = { 2 }
291- className = { `bg-surface border-transparent border-b-border after:border-border relative select-none border-0 border-b-2 border-solid p-0 pl-1 font-bold after:absolute after:bottom-[1px] after:right-0 after:top-0 after:h-full after:border-solid ${
292- isLastOfDay ? "after:border-l-2" : ""
293- } ${ showTimeSlotHeader ? "pt-1" : "" } `}
294- >
295- { customHeaderRow . timeSlot ( {
296- timeSlot : slot ,
297- timeSlotMinutes : 60 ,
298- isLastOfDay,
299- timeFrameOfDay : timeFrameDay ,
300- viewType,
301- } ) }
302- </ th >
328+ />
303329 )
304330 } ) }
305331 </ tr >
306332 ) }
307333 </ thead >
308334 </ >
309335 )
310- } )
336+ }
337+
338+ function CustomHeaderRowCell <
339+ G extends TimeTableGroup ,
340+ I extends TimeSlotBooking ,
341+ > ( {
342+ timeSlot,
343+ timeSlotMinutes,
344+ isLastOfDay,
345+ viewType,
346+ timeFrameOfDay,
347+ entries,
348+ slotsArray,
349+ showTimeSlotHeader,
350+ customHeaderRow,
351+ } : {
352+ timeSlot : Dayjs
353+ timeSlotMinutes : number
354+ isLastOfDay : boolean
355+ viewType : TimeTableViewType
356+ timeFrameOfDay : TimeFrameDay
357+ entries : TimeTableEntry < G , I > [ ]
358+ slotsArray : readonly Dayjs [ ]
359+ showTimeSlotHeader : boolean
360+ customHeaderRow : {
361+ timeSlot : ( props : CustomHeaderRowTimeSlotProps < G , I > ) => JSX . Element
362+ header : ( props : CustomHeaderRowHeaderProps < G , I > ) => JSX . Element
363+ }
364+ } ) {
365+ const ref = useRef < HTMLTableCellElement > ( null )
366+
367+ return (
368+ < th
369+ key = { `timeheader${ timeSlot . unix ( ) } ` }
370+ colSpan = { 2 }
371+ className = { `${ headerCellBaseClassname } ${
372+ isLastOfDay ? "after:border-l-2" : ""
373+ } ${ showTimeSlotHeader ? "pt-1" : "" } `}
374+ ref = { ref }
375+ >
376+ { customHeaderRow . timeSlot ( {
377+ timeSlot,
378+ timeSlotMinutes,
379+ isLastOfDay,
380+ timeFrameOfDay,
381+ viewType,
382+ entries,
383+ slotsArray,
384+ tableCellRef : ref ,
385+ } ) }
386+ </ th >
387+ )
388+ }
0 commit comments