@@ -191,21 +191,52 @@ export function Calendar() {
191191 } , [ ] ) ;
192192
193193 const renderEvents = ( day : Date , isCurrent : boolean ) => {
194+ const weekStart = startOfWeek ( day , { weekStartsOn : 0 } ) ;
195+ const weekEnd = addDays ( weekStart , 6 ) ;
196+
197+ const weekEvents = eventsWithRow . filter ( ( event ) => event . end >= weekStart && event . start <= weekEnd ) ;
198+
199+ const weekStack : { [ eventId : string ] : number } = { } ;
200+ weekEvents
201+ . sort ( ( a , b ) => a . start . getTime ( ) - b . start . getTime ( ) )
202+ . forEach ( ( event ) => {
203+ let row = 0 ;
204+ while (
205+ Object . entries ( weekStack ) . some ( ( [ id , assignedRow ] ) => {
206+ if ( id === event . id ) return false ;
207+ const assignedEvent = weekEvents . find ( ( e ) => e . id === id ) ;
208+ if ( ! assignedEvent ) return false ;
209+ const eventStartInWeek = event . start < weekStart ? weekStart : event . start ;
210+ const eventEndInWeek = event . end > weekEnd ? weekEnd : event . end ;
211+ const assignedStartInWeek = assignedEvent . start < weekStart ? weekStart : assignedEvent . start ;
212+ const assignedEndInWeek = assignedEvent . end > weekEnd ? weekEnd : assignedEvent . end ;
213+ return (
214+ assignedRow === row && eventStartInWeek <= assignedEndInWeek && assignedStartInWeek <= eventEndInWeek
215+ ) ;
216+ } )
217+ ) {
218+ row ++ ;
219+ }
220+ weekStack [ event . id ] = row ;
221+ } ) ;
222+
194223 const typeFilterValues = typeFilters . map ( ( f ) => f . value ) ;
195224 const selectedTypeFilters = selectedFilters . filter ( ( f ) => typeFilterValues . includes ( f ) ) ;
196225 const selectedTitleFilters = selectedFilters . filter ( ( f ) => ! typeFilterValues . includes ( f ) ) ;
197226
198- const eventsOfTheDay = eventsWithRow . filter ( ( event ) => {
199- if ( ! isInEventRange ( day , event ) ) return false ;
200- if ( selectedTypeFilters . length > 0 && selectedTitleFilters . length > 0 ) {
201- return selectedTypeFilters . includes ( event . type ) && selectedTitleFilters . includes ( event . title ) ;
202- } else if ( selectedTypeFilters . length > 0 ) {
203- return selectedTypeFilters . includes ( event . type ) ;
204- } else if ( selectedTitleFilters . length > 0 ) {
205- return selectedTitleFilters . includes ( event . title ) ;
206- }
207- return true ;
208- } ) ;
227+ const eventsOfTheDay = eventsWithRow
228+ . filter ( ( event ) => {
229+ if ( ! isInEventRange ( day , event ) ) return false ;
230+ if ( selectedTypeFilters . length > 0 && selectedTitleFilters . length > 0 ) {
231+ return selectedTypeFilters . includes ( event . type ) && selectedTitleFilters . includes ( event . title ) ;
232+ } else if ( selectedTypeFilters . length > 0 ) {
233+ return selectedTypeFilters . includes ( event . type ) ;
234+ } else if ( selectedTitleFilters . length > 0 ) {
235+ return selectedTitleFilters . includes ( event . title ) ;
236+ }
237+ return true ;
238+ } )
239+ . map ( ( event ) => ( { ...event , row : weekStack [ event . id ] ?? 0 } ) ) ;
209240
210241 const maxRow = eventsOfTheDay . length > 0 ? Math . max ( ...eventsOfTheDay . map ( ( e ) => e . row ) ) : - 1 ;
211242 const numRows = maxRow + 1 ;
0 commit comments