diff --git a/src/Month.jsx b/src/Month.jsx index fcb36c9af..1d04ce79d 100644 --- a/src/Month.jsx +++ b/src/Month.jsx @@ -19,8 +19,9 @@ import Overlay from 'react-overlays/lib/Overlay'; import BackgroundCells from './BackgroundCells'; import { dateFormat } from './utils/propTypes'; -import { segStyle, inRange, eventSegments, eventLevels, sortEvents } from './utils/eventLevels'; - +import { + segStyle, inRange, eventSegments + , endOfRange, eventLevels, sortEvents } from './utils/eventLevels'; let eventsForWeek = (evts, start, end, props) => evts.filter(e => inRange(e, start, end, props)); @@ -132,8 +133,7 @@ let MonthView = React.createClass({ }, renderWeek(week, weekIdx, content) { - let first = week[0] - let last = week[week.length - 1] + let { first, last } = endOfRange(week); let evts = eventsForWeek(this.props.events, week[0], week[week.length - 1], this.props) evts.sort((a, b) => sortEvents(a, b, this.props)) @@ -200,8 +200,7 @@ let MonthView = React.createClass({ }, renderRowLevel(segments, week, idx){ - let first = week[0] - let last = week[week.length - 1] + let { first, last } = endOfRange(week); return ( this._showMore(segments, week[slot - 1], weekIdx, slot) diff --git a/src/TimeGrid.jsx b/src/TimeGrid.jsx index 2864a5be6..4706a1919 100644 --- a/src/TimeGrid.jsx +++ b/src/TimeGrid.jsx @@ -20,10 +20,13 @@ import { notify } from './utils/helpers'; import { navigate } from './utils/constants'; import { accessor as get } from './utils/accessors'; -import { inRange, eventSegments, eventLevels, sortEvents, segStyle } from './utils/eventLevels'; +import { + inRange, eventSegments, endOfRange + , eventLevels, sortEvents, segStyle } from './utils/eventLevels'; const MIN_ROWS = 2; + let TimeGrid = React.createClass({ propTypes: { @@ -154,8 +157,7 @@ let TimeGrid = React.createClass({ }, renderAllDayEvents(range, levels){ - let first = range[0] - , last = range[range.length - 1]; + let { first, last } = endOfRange(range); while (levels.length < MIN_ROWS ) levels.push([]) diff --git a/src/utils/dates.js b/src/utils/dates.js index d29009622..6e1eb182a 100644 --- a/src/utils/dates.js +++ b/src/utils/dates.js @@ -122,6 +122,8 @@ let dates = Object.assign(dateMath, { return Math.abs(+dateA - +dateB) // the .round() handles an edge case + // with DST where the total won't be exact + // since one day in the range may be shorter/longer by an hour return Math.round(Math.abs( (+dates.startOf(dateA, unit) / MILLI[unit]) - (+dates.startOf(dateB, unit) / MILLI[unit]) )) diff --git a/src/utils/eventLevels.js b/src/utils/eventLevels.js index 3deac4858..c9b34be42 100644 --- a/src/utils/eventLevels.js +++ b/src/utils/eventLevels.js @@ -1,16 +1,23 @@ import dates from './dates'; import { accessor as get } from './accessors'; -export function eventSegments(event, first, last, { startAccessor, endAccessor, culture }){ +export function endOfRange(dateRange, unit = 'day') { + return { + first: dateRange[0], + last: dates.add(dateRange[dateRange.length - 1], 1, unit) + } +} + +export function eventSegments(event, first, last, { startAccessor, endAccessor, culture }) { let slots = dates.diff(first, last, 'day') let start = dates.max(dates.startOf(get(event, startAccessor), 'day'), first); - let end = dates.min(dates.ceil(get(event, endAccessor), 'day'), dates.add(last, 1, 'day')) + let end = dates.min(dates.ceil(get(event, endAccessor), 'day'), last) + let padding = dates.diff(first, start, 'day'); let span = dates.diff(start, end, 'day'); - span = Math.floor(Math.max(Math.min(span, slots), 1)); - - let padding = Math.floor(dates.diff(first, start, 'day')); + span = Math.min(span, slots) + span = Math.max(span, 1); return { event, @@ -54,14 +61,13 @@ export function eventLevels(rowSegments, limit = Infinity){ } export function inRange(e, start, end, { startAccessor, endAccessor }){ - let eStart = get(e, startAccessor) - let eEnd = get(e, endAccessor) + let eStart = dates.startOf(get(e, startAccessor), 'day') + let eEnd = dates.ceil(get(e, endAccessor), 'day') - let starts = dates.inRange(eStart, start, end, 'day') - let during = dates.lt(eStart, start, 'day') && dates.gt(eEnd, end, 'day') - let ends = dates.lt(eStart, start) && dates.inRange(eEnd, start, end, 'day') + let startsBeforeEnd = dates.lte(eStart, end, 'day') + let endsAfterStart = dates.gt(eEnd, start, 'day') - return starts || ends || during + return startsBeforeEnd && endsAfterStart }