Skip to content

Commit 69ffcfb

Browse files
committed
added code from master of event sort for multi day (bigcalendar#2502)
1 parent f6f8b15 commit 69ffcfb

6 files changed

Lines changed: 78 additions & 14 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "rbc-fork-react-big-calendar",
3-
"version": "0.33.12",
3+
"version": "0.33.16",
44
"description": "Calendar! with events",
55
"author": {
66
"name": "Jason Quense",

src/Month.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import Overlay from 'react-overlays/Overlay'
1515
import DateContentRow from './DateContentRow'
1616
import Header from './Header'
1717
import DateHeader from './DateHeader'
18-
import { inRange, sortEvents } from './utils/eventLevels'
18+
import { inRange, sortWeekEvents } from './utils/eventLevels'
1919

2020
let eventsForWeek = (evts, start, end, accessors, localizer) =>
2121
evts.filter(e => inRange(e, start, end, accessors, localizer))
@@ -130,7 +130,7 @@ class MonthView extends React.Component {
130130
localizer
131131
)
132132

133-
weeksEvents.sort((a, b) => sortEvents(a, b, accessors, localizer))
133+
const sorted = sortWeekEvents(weeksEvents, accessors, localizer)
134134

135135
return (
136136
<DateContentRow
@@ -141,7 +141,7 @@ class MonthView extends React.Component {
141141
getNow={getNow}
142142
date={date}
143143
range={week}
144-
events={weeksEvents}
144+
events={sorted}
145145
maxRows={showAllEvents ? Infinity : rowLimit}
146146
selected={selected}
147147
selectable={selectable}

src/localizer.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ function getMinutesFromMidnight(start) {
7575
return diff(daystart, start, 'minutes') + getDstOffset(daystart, start)
7676
}
7777

78+
function daySpan(start, end) {
79+
return duration(start, end, 'day')
80+
}
81+
7882
// These two are used by DateSlotMetrics
7983
function continuesPrior(start, first) {
8084
return lt(start, first, 'day')
@@ -94,13 +98,13 @@ function sortEvents({
9498
}) {
9599
let startSort = +startOf(aStart, 'day') - +startOf(bStart, 'day')
96100

97-
let durA = diff(aStart, ceil(aEnd, 'day'), 'day')
101+
let durA = daySpan(aStart, aEnd)
98102

99-
let durB = diff(bStart, ceil(bEnd, 'day'), 'day')
103+
let durB = daySpan(bStart, bEnd)
100104

101105
return (
102106
startSort || // sort by start Day first
103-
Math.max(durB, 1) - Math.max(durA, 1) || // events spanning multiple days go first
107+
durB - durA || // events spanning multiple days go first
104108
!!bAllDay - !!aAllDay || // then allDay single day events
105109
+aStart - +bStart || // then sort by start time
106110
+aEnd - +bEnd // then sort by end time
@@ -167,13 +171,14 @@ export class DateLocalizer {
167171
this.min = spec.min || min
168172
this.max = spec.max || max
169173
this.minutes = spec.minutes || minutes
174+
this.daySpan = spec.daySpan || daySpan
170175
this.firstVisibleDay = spec.firstVisibleDay || firstVisibleDay
171176
this.lastVisibleDay = spec.lastVisibleDay || lastVisibleDay
172177
this.visibleDays = spec.visibleDays || visibleDays
173178

174179
this.getSlotDate = spec.getSlotDate || getSlotDate
175180
this.getTimezoneOffset =
176-
spec.getTimezoneOffset || (value => value.getTimezoneOffset())
181+
spec.getTimezoneOffset || ((value) => value.getTimezoneOffset())
177182
this.getDstOffset = spec.getDstOffset || getDstOffset
178183
this.getTotalMin = spec.getTotalMin || getTotalMin
179184
this.getMinutesFromMidnight =

src/localizers/luxon.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -310,20 +310,26 @@ export default function(DateTime, { firstDayOfWeek = 7 } = {}) {
310310
return gte(end, last)
311311
}
312312

313+
function daySpan(start, end) {
314+
const dtStart = DateTime.fromJSDate(start)
315+
const dtEnd = DateTime.fromJSDate(end)
316+
return dtEnd.diff(dtStart).as('days')
317+
}
318+
313319
// These two are used by eventLevels
314320
function sortEvents({
315321
evtA: { start: aStart, end: aEnd, allDay: aAllDay },
316322
evtB: { start: bStart, end: bEnd, allDay: bAllDay },
317323
}) {
318324
const startSort = +startOf(aStart, 'day') - +startOf(bStart, 'day')
319325

320-
const durA = diff(aStart, ceil(aEnd, 'day'), 'day')
326+
const durA = daySpan(aStart, aEnd)
321327

322-
const durB = diff(bStart, ceil(bEnd, 'day'), 'day')
328+
const durB = daySpan(bStart, bEnd)
323329

324330
return (
325331
startSort || // sort by start Day first
326-
Math.max(durB, 1) - Math.max(durA, 1) || // events spanning multiple days go first
332+
durB - durA || // events spanning multiple days go first
327333
!!bAllDay - !!aAllDay || // then allDay single day events
328334
+aStart - +bStart || // then sort by start time *don't need moment conversion here
329335
+aEnd - +bEnd // then sort by end time *don't need moment conversion here either
@@ -415,6 +421,7 @@ export default function(DateTime, { firstDayOfWeek = 7 } = {}) {
415421
sortEvents,
416422
inEventRange,
417423
isSameDate,
424+
daySpan,
418425
browserTZOffset,
419426
})
420427
}

src/localizers/moment.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -289,20 +289,27 @@ export default function(moment) {
289289
return mEnd.isSameOrAfter(mLast, 'minutes')
290290
}
291291

292+
function daySpan(start, end) {
293+
const mStart = moment(start)
294+
const mEnd = moment(end)
295+
const dur = moment.duration(mEnd.diff(mStart))
296+
return dur.days()
297+
}
298+
292299
// These two are used by eventLevels
293300
function sortEvents({
294301
evtA: { start: aStart, end: aEnd, allDay: aAllDay },
295302
evtB: { start: bStart, end: bEnd, allDay: bAllDay },
296303
}) {
297304
const startSort = +startOf(aStart, 'day') - +startOf(bStart, 'day')
298305

299-
const durA = diff(aStart, ceil(aEnd, 'day'), 'day')
306+
const durA = daySpan(aStart, aEnd)
300307

301-
const durB = diff(bStart, ceil(bEnd, 'day'), 'day')
308+
const durB = daySpan(bStart, bEnd)
302309

303310
return (
304311
startSort || // sort by start Day first
305-
Math.max(durB, 1) - Math.max(durA, 1) || // events spanning multiple days go first
312+
durB - durA || // events spanning multiple days go first
306313
!!bAllDay - !!aAllDay || // then allDay single day events
307314
+aStart - +bStart || // then sort by start time *don't need moment conversion here
308315
+aEnd - +bEnd // then sort by end time *don't need moment conversion here either
@@ -398,6 +405,7 @@ export default function(moment) {
398405
sortEvents,
399406
inEventRange,
400407
isSameDate,
408+
daySpan,
401409
browserTZOffset,
402410
})
403411
}

src/utils/eventLevels.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,50 @@ export function segsOverlap(seg, otherSegs) {
7676
)
7777
}
7878

79+
export function sortWeekEvents(events, accessors, localizer) {
80+
const base = [...events]
81+
const multiDayEvents = []
82+
const standardEvents = []
83+
base.forEach((event) => {
84+
const startCheck = accessors.start(event)
85+
const endCheck = accessors.end(event)
86+
if (localizer.daySpan(startCheck, endCheck) > 1) {
87+
multiDayEvents.push(event)
88+
} else {
89+
standardEvents.push(event)
90+
}
91+
})
92+
const multiSorted = multiDayEvents.sort((a, b) =>
93+
sortEvents(a, b, accessors, localizer)
94+
)
95+
const standardSorted = standardEvents.sort((a, b) =>
96+
sortEvents(a, b, accessors, localizer)
97+
)
98+
return [...multiSorted, ...standardSorted]
99+
}
100+
101+
export function sortWeekEvents(events, accessors, localizer) {
102+
const base = [...events]
103+
const multiDayEvents = []
104+
const standardEvents = []
105+
base.forEach((event) => {
106+
const startCheck = accessors.start(event)
107+
const endCheck = accessors.end(event)
108+
if (localizer.daySpan(startCheck, endCheck) > 1) {
109+
multiDayEvents.push(event)
110+
} else {
111+
standardEvents.push(event)
112+
}
113+
})
114+
const multiSorted = multiDayEvents.sort((a, b) =>
115+
sortEvents(a, b, accessors, localizer)
116+
)
117+
const standardSorted = standardEvents.sort((a, b) =>
118+
sortEvents(a, b, accessors, localizer)
119+
)
120+
return [...multiSorted, ...standardSorted]
121+
}
122+
79123
export function sortEvents(eventA, eventB, accessors, localizer) {
80124
const evtA = {
81125
start: accessors.start(eventA),

0 commit comments

Comments
 (0)