UNPKG

29.9 kBJavaScriptView Raw
1var __assign = (this && this.__assign) || function () {
2 __assign = Object.assign || function(t) {
3 for (var s, i = 1, n = arguments.length; i < n; i++) {
4 s = arguments[i];
5 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6 t[p] = s[p];
7 }
8 return t;
9 };
10 return __assign.apply(this, arguments);
11};
12var __spreadArrays = (this && this.__spreadArrays) || function () {
13 for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
14 for (var r = Array(s), k = 0, i = 0; i < il; i++)
15 for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
16 r[k] = a[j];
17 return r;
18};
19export var DAYS_OF_WEEK;
20(function (DAYS_OF_WEEK) {
21 DAYS_OF_WEEK[DAYS_OF_WEEK["SUNDAY"] = 0] = "SUNDAY";
22 DAYS_OF_WEEK[DAYS_OF_WEEK["MONDAY"] = 1] = "MONDAY";
23 DAYS_OF_WEEK[DAYS_OF_WEEK["TUESDAY"] = 2] = "TUESDAY";
24 DAYS_OF_WEEK[DAYS_OF_WEEK["WEDNESDAY"] = 3] = "WEDNESDAY";
25 DAYS_OF_WEEK[DAYS_OF_WEEK["THURSDAY"] = 4] = "THURSDAY";
26 DAYS_OF_WEEK[DAYS_OF_WEEK["FRIDAY"] = 5] = "FRIDAY";
27 DAYS_OF_WEEK[DAYS_OF_WEEK["SATURDAY"] = 6] = "SATURDAY";
28})(DAYS_OF_WEEK || (DAYS_OF_WEEK = {}));
29var DEFAULT_WEEKEND_DAYS = [
30 DAYS_OF_WEEK.SUNDAY,
31 DAYS_OF_WEEK.SATURDAY,
32];
33var DAYS_IN_WEEK = 7;
34var HOURS_IN_DAY = 24;
35var MINUTES_IN_HOUR = 60;
36export var SECONDS_IN_DAY = 60 * 60 * 24;
37function getExcludedSeconds(dateAdapter, _a) {
38 var startDate = _a.startDate, seconds = _a.seconds, excluded = _a.excluded, precision = _a.precision;
39 if (excluded.length < 1) {
40 return 0;
41 }
42 var addSeconds = dateAdapter.addSeconds, getDay = dateAdapter.getDay, addDays = dateAdapter.addDays;
43 var endDate = addSeconds(startDate, seconds - 1);
44 var dayStart = getDay(startDate);
45 var dayEnd = getDay(endDate);
46 var result = 0; // Calculated in seconds
47 var current = startDate;
48 var _loop_1 = function () {
49 var day = getDay(current);
50 if (excluded.some(function (excludedDay) { return excludedDay === day; })) {
51 result += calculateExcludedSeconds(dateAdapter, {
52 dayStart: dayStart,
53 dayEnd: dayEnd,
54 day: day,
55 precision: precision,
56 startDate: startDate,
57 endDate: endDate,
58 });
59 }
60 current = addDays(current, 1);
61 };
62 while (current < endDate) {
63 _loop_1();
64 }
65 return result;
66}
67function calculateExcludedSeconds(dateAdapter, _a) {
68 var precision = _a.precision, day = _a.day, dayStart = _a.dayStart, dayEnd = _a.dayEnd, startDate = _a.startDate, endDate = _a.endDate;
69 var differenceInSeconds = dateAdapter.differenceInSeconds, endOfDay = dateAdapter.endOfDay, startOfDay = dateAdapter.startOfDay;
70 if (precision === 'minutes') {
71 if (day === dayStart) {
72 return differenceInSeconds(endOfDay(startDate), startDate) + 1;
73 }
74 else if (day === dayEnd) {
75 return differenceInSeconds(endDate, startOfDay(endDate)) + 1;
76 }
77 }
78 return SECONDS_IN_DAY;
79}
80function getWeekViewEventSpan(dateAdapter, _a) {
81 var event = _a.event, offset = _a.offset, startOfWeekDate = _a.startOfWeekDate, excluded = _a.excluded, precision = _a.precision, totalDaysInView = _a.totalDaysInView;
82 var max = dateAdapter.max, differenceInSeconds = dateAdapter.differenceInSeconds, addDays = dateAdapter.addDays, endOfDay = dateAdapter.endOfDay, differenceInDays = dateAdapter.differenceInDays;
83 var span = SECONDS_IN_DAY;
84 var begin = max([event.start, startOfWeekDate]);
85 if (event.end) {
86 switch (precision) {
87 case 'minutes':
88 span = differenceInSeconds(event.end, begin);
89 break;
90 default:
91 span =
92 differenceInDays(addDays(endOfDay(event.end), 1), begin) *
93 SECONDS_IN_DAY;
94 break;
95 }
96 }
97 var offsetSeconds = offset * SECONDS_IN_DAY;
98 var totalLength = offsetSeconds + span;
99 // the best way to detect if an event is outside the week-view
100 // is to check if the total span beginning (from startOfWeekDay or event start) exceeds the total days in the view
101 var secondsInView = totalDaysInView * SECONDS_IN_DAY;
102 if (totalLength > secondsInView) {
103 span = secondsInView - offsetSeconds;
104 }
105 span -= getExcludedSeconds(dateAdapter, {
106 startDate: begin,
107 seconds: span,
108 excluded: excluded,
109 precision: precision,
110 });
111 return span / SECONDS_IN_DAY;
112}
113function getWeekViewEventOffset(dateAdapter, _a) {
114 var event = _a.event, startOfWeekDate = _a.startOfWeek, excluded = _a.excluded, precision = _a.precision;
115 var differenceInDays = dateAdapter.differenceInDays, startOfDay = dateAdapter.startOfDay, differenceInSeconds = dateAdapter.differenceInSeconds;
116 if (event.start < startOfWeekDate) {
117 return 0;
118 }
119 var offset = 0;
120 switch (precision) {
121 case 'days':
122 offset =
123 differenceInDays(startOfDay(event.start), startOfWeekDate) *
124 SECONDS_IN_DAY;
125 break;
126 case 'minutes':
127 offset = differenceInSeconds(event.start, startOfWeekDate);
128 break;
129 }
130 offset -= getExcludedSeconds(dateAdapter, {
131 startDate: startOfWeekDate,
132 seconds: offset,
133 excluded: excluded,
134 precision: precision,
135 });
136 return Math.abs(offset / SECONDS_IN_DAY);
137}
138function isEventIsPeriod(dateAdapter, _a) {
139 var event = _a.event, periodStart = _a.periodStart, periodEnd = _a.periodEnd;
140 var isSameSecond = dateAdapter.isSameSecond;
141 var eventStart = event.start;
142 var eventEnd = event.end || event.start;
143 if (eventStart > periodStart && eventStart < periodEnd) {
144 return true;
145 }
146 if (eventEnd > periodStart && eventEnd < periodEnd) {
147 return true;
148 }
149 if (eventStart < periodStart && eventEnd > periodEnd) {
150 return true;
151 }
152 if (isSameSecond(eventStart, periodStart) ||
153 isSameSecond(eventStart, periodEnd)) {
154 return true;
155 }
156 if (isSameSecond(eventEnd, periodStart) ||
157 isSameSecond(eventEnd, periodEnd)) {
158 return true;
159 }
160 return false;
161}
162export function getEventsInPeriod(dateAdapter, _a) {
163 var events = _a.events, periodStart = _a.periodStart, periodEnd = _a.periodEnd;
164 return events.filter(function (event) {
165 return isEventIsPeriod(dateAdapter, { event: event, periodStart: periodStart, periodEnd: periodEnd });
166 });
167}
168function getWeekDay(dateAdapter, _a) {
169 var date = _a.date, _b = _a.weekendDays, weekendDays = _b === void 0 ? DEFAULT_WEEKEND_DAYS : _b;
170 var startOfDay = dateAdapter.startOfDay, isSameDay = dateAdapter.isSameDay, getDay = dateAdapter.getDay;
171 var today = startOfDay(new Date());
172 var day = getDay(date);
173 return {
174 date: date,
175 day: day,
176 isPast: date < today,
177 isToday: isSameDay(date, today),
178 isFuture: date > today,
179 isWeekend: weekendDays.indexOf(day) > -1,
180 };
181}
182export function getWeekViewHeader(dateAdapter, _a) {
183 var viewDate = _a.viewDate, weekStartsOn = _a.weekStartsOn, _b = _a.excluded, excluded = _b === void 0 ? [] : _b, weekendDays = _a.weekendDays, _c = _a.viewStart, viewStart = _c === void 0 ? dateAdapter.startOfWeek(viewDate, { weekStartsOn: weekStartsOn }) : _c, _d = _a.viewEnd, viewEnd = _d === void 0 ? dateAdapter.addDays(viewStart, DAYS_IN_WEEK) : _d;
184 var addDays = dateAdapter.addDays, getDay = dateAdapter.getDay;
185 var days = [];
186 var date = viewStart;
187 while (date < viewEnd) {
188 if (!excluded.some(function (e) { return getDay(date) === e; })) {
189 days.push(getWeekDay(dateAdapter, { date: date, weekendDays: weekendDays }));
190 }
191 date = addDays(date, 1);
192 }
193 return days;
194}
195export function getDifferenceInDaysWithExclusions(dateAdapter, _a) {
196 var date1 = _a.date1, date2 = _a.date2, excluded = _a.excluded;
197 var date = date1;
198 var diff = 0;
199 while (date < date2) {
200 if (excluded.indexOf(dateAdapter.getDay(date)) === -1) {
201 diff++;
202 }
203 date = dateAdapter.addDays(date, 1);
204 }
205 return diff;
206}
207export function getAllDayWeekEvents(dateAdapter, _a) {
208 var _b = _a.events, events = _b === void 0 ? [] : _b, _c = _a.excluded, excluded = _c === void 0 ? [] : _c, _d = _a.precision, precision = _d === void 0 ? 'days' : _d, _e = _a.absolutePositionedEvents, absolutePositionedEvents = _e === void 0 ? false : _e, viewStart = _a.viewStart, viewEnd = _a.viewEnd;
209 viewStart = dateAdapter.startOfDay(viewStart);
210 viewEnd = dateAdapter.endOfDay(viewEnd);
211 var differenceInSeconds = dateAdapter.differenceInSeconds, differenceInDays = dateAdapter.differenceInDays;
212 var maxRange = getDifferenceInDaysWithExclusions(dateAdapter, {
213 date1: viewStart,
214 date2: viewEnd,
215 excluded: excluded,
216 });
217 var totalDaysInView = differenceInDays(viewEnd, viewStart) + 1;
218 var eventsMapped = events
219 .filter(function (event) { return event.allDay; })
220 .map(function (event) {
221 var offset = getWeekViewEventOffset(dateAdapter, {
222 event: event,
223 startOfWeek: viewStart,
224 excluded: excluded,
225 precision: precision,
226 });
227 var span = getWeekViewEventSpan(dateAdapter, {
228 event: event,
229 offset: offset,
230 startOfWeekDate: viewStart,
231 excluded: excluded,
232 precision: precision,
233 totalDaysInView: totalDaysInView,
234 });
235 return { event: event, offset: offset, span: span };
236 })
237 .filter(function (e) { return e.offset < maxRange; })
238 .filter(function (e) { return e.span > 0; })
239 .map(function (entry) { return ({
240 event: entry.event,
241 offset: entry.offset,
242 span: entry.span,
243 startsBeforeWeek: entry.event.start < viewStart,
244 endsAfterWeek: (entry.event.end || entry.event.start) > viewEnd,
245 }); })
246 .sort(function (itemA, itemB) {
247 var startSecondsDiff = differenceInSeconds(itemA.event.start, itemB.event.start);
248 if (startSecondsDiff === 0) {
249 return differenceInSeconds(itemB.event.end || itemB.event.start, itemA.event.end || itemA.event.start);
250 }
251 return startSecondsDiff;
252 });
253 var allDayEventRows = [];
254 var allocatedEvents = [];
255 eventsMapped.forEach(function (event, index) {
256 if (allocatedEvents.indexOf(event) === -1) {
257 allocatedEvents.push(event);
258 var rowSpan_1 = event.span + event.offset;
259 var otherRowEvents = eventsMapped
260 .slice(index + 1)
261 .filter(function (nextEvent) {
262 if (nextEvent.offset >= rowSpan_1 &&
263 rowSpan_1 + nextEvent.span <= totalDaysInView &&
264 allocatedEvents.indexOf(nextEvent) === -1) {
265 var nextEventOffset = nextEvent.offset - rowSpan_1;
266 if (!absolutePositionedEvents) {
267 nextEvent.offset = nextEventOffset;
268 }
269 rowSpan_1 += nextEvent.span + nextEventOffset;
270 allocatedEvents.push(nextEvent);
271 return true;
272 }
273 });
274 var weekEvents = __spreadArrays([event], otherRowEvents);
275 var id = weekEvents
276 .filter(function (weekEvent) { return weekEvent.event.id; })
277 .map(function (weekEvent) { return weekEvent.event.id; })
278 .join('-');
279 allDayEventRows.push(__assign({ row: weekEvents }, (id ? { id: id } : {})));
280 }
281 });
282 return allDayEventRows;
283}
284function getWeekViewHourGrid(dateAdapter, _a) {
285 var events = _a.events, viewDate = _a.viewDate, hourSegments = _a.hourSegments, hourDuration = _a.hourDuration, dayStart = _a.dayStart, dayEnd = _a.dayEnd, weekStartsOn = _a.weekStartsOn, excluded = _a.excluded, weekendDays = _a.weekendDays, segmentHeight = _a.segmentHeight, viewStart = _a.viewStart, viewEnd = _a.viewEnd, minimumEventHeight = _a.minimumEventHeight;
286 var dayViewHourGrid = getDayViewHourGrid(dateAdapter, {
287 viewDate: viewDate,
288 hourSegments: hourSegments,
289 hourDuration: hourDuration,
290 dayStart: dayStart,
291 dayEnd: dayEnd,
292 });
293 var weekDays = getWeekViewHeader(dateAdapter, {
294 viewDate: viewDate,
295 weekStartsOn: weekStartsOn,
296 excluded: excluded,
297 weekendDays: weekendDays,
298 viewStart: viewStart,
299 viewEnd: viewEnd,
300 });
301 var setHours = dateAdapter.setHours, setMinutes = dateAdapter.setMinutes, getHours = dateAdapter.getHours, getMinutes = dateAdapter.getMinutes;
302 return weekDays.map(function (day) {
303 var dayView = getDayView(dateAdapter, {
304 events: events,
305 viewDate: day.date,
306 hourSegments: hourSegments,
307 dayStart: dayStart,
308 dayEnd: dayEnd,
309 segmentHeight: segmentHeight,
310 eventWidth: 1,
311 hourDuration: hourDuration,
312 minimumEventHeight: minimumEventHeight,
313 });
314 var hours = dayViewHourGrid.map(function (hour) {
315 var segments = hour.segments.map(function (segment) {
316 var date = setMinutes(setHours(day.date, getHours(segment.date)), getMinutes(segment.date));
317 return __assign(__assign({}, segment), { date: date });
318 });
319 return __assign(__assign({}, hour), { segments: segments });
320 });
321 function getColumnCount(allEvents, prevOverlappingEvents) {
322 var columnCount = Math.max.apply(Math, prevOverlappingEvents.map(function (iEvent) { return iEvent.left + 1; }));
323 var nextOverlappingEvents = allEvents
324 .filter(function (iEvent) { return iEvent.left >= columnCount; })
325 .filter(function (iEvent) {
326 return (getOverLappingWeekViewEvents(prevOverlappingEvents, iEvent.top, iEvent.top + iEvent.height).length > 0);
327 });
328 if (nextOverlappingEvents.length > 0) {
329 return getColumnCount(allEvents, nextOverlappingEvents);
330 }
331 else {
332 return columnCount;
333 }
334 }
335 var mappedEvents = dayView.events.map(function (event) {
336 var columnCount = getColumnCount(dayView.events, getOverLappingWeekViewEvents(dayView.events, event.top, event.top + event.height));
337 var width = 100 / columnCount;
338 return __assign(__assign({}, event), { left: event.left * width, width: width });
339 });
340 return {
341 hours: hours,
342 date: day.date,
343 events: mappedEvents.map(function (event) {
344 var overLappingEvents = getOverLappingWeekViewEvents(mappedEvents.filter(function (otherEvent) { return otherEvent.left > event.left; }), event.top, event.top + event.height);
345 if (overLappingEvents.length > 0) {
346 return __assign(__assign({}, event), { width: Math.min.apply(Math, overLappingEvents.map(function (otherEvent) { return otherEvent.left; })) - event.left });
347 }
348 return event;
349 }),
350 };
351 });
352}
353export function getWeekView(dateAdapter, _a) {
354 var _b = _a.events, events = _b === void 0 ? [] : _b, viewDate = _a.viewDate, weekStartsOn = _a.weekStartsOn, _c = _a.excluded, excluded = _c === void 0 ? [] : _c, _d = _a.precision, precision = _d === void 0 ? 'days' : _d, _e = _a.absolutePositionedEvents, absolutePositionedEvents = _e === void 0 ? false : _e, hourSegments = _a.hourSegments, hourDuration = _a.hourDuration, dayStart = _a.dayStart, dayEnd = _a.dayEnd, weekendDays = _a.weekendDays, segmentHeight = _a.segmentHeight, minimumEventHeight = _a.minimumEventHeight, _f = _a.viewStart, viewStart = _f === void 0 ? dateAdapter.startOfWeek(viewDate, { weekStartsOn: weekStartsOn }) : _f, _g = _a.viewEnd, viewEnd = _g === void 0 ? dateAdapter.endOfWeek(viewDate, { weekStartsOn: weekStartsOn }) : _g;
355 if (!events) {
356 events = [];
357 }
358 var startOfDay = dateAdapter.startOfDay, endOfDay = dateAdapter.endOfDay;
359 viewStart = startOfDay(viewStart);
360 viewEnd = endOfDay(viewEnd);
361 var eventsInPeriod = getEventsInPeriod(dateAdapter, {
362 events: events,
363 periodStart: viewStart,
364 periodEnd: viewEnd,
365 });
366 var header = getWeekViewHeader(dateAdapter, {
367 viewDate: viewDate,
368 weekStartsOn: weekStartsOn,
369 excluded: excluded,
370 weekendDays: weekendDays,
371 viewStart: viewStart,
372 viewEnd: viewEnd,
373 });
374 return {
375 allDayEventRows: getAllDayWeekEvents(dateAdapter, {
376 events: eventsInPeriod,
377 excluded: excluded,
378 precision: precision,
379 absolutePositionedEvents: absolutePositionedEvents,
380 viewStart: viewStart,
381 viewEnd: viewEnd,
382 }),
383 period: {
384 events: eventsInPeriod,
385 start: header[0].date,
386 end: endOfDay(header[header.length - 1].date),
387 },
388 hourColumns: getWeekViewHourGrid(dateAdapter, {
389 events: events,
390 viewDate: viewDate,
391 hourSegments: hourSegments,
392 hourDuration: hourDuration,
393 dayStart: dayStart,
394 dayEnd: dayEnd,
395 weekStartsOn: weekStartsOn,
396 excluded: excluded,
397 weekendDays: weekendDays,
398 segmentHeight: segmentHeight,
399 viewStart: viewStart,
400 viewEnd: viewEnd,
401 minimumEventHeight: minimumEventHeight,
402 }),
403 };
404}
405export function getMonthView(dateAdapter, _a) {
406 var _b = _a.events, events = _b === void 0 ? [] : _b, viewDate = _a.viewDate, weekStartsOn = _a.weekStartsOn, _c = _a.excluded, excluded = _c === void 0 ? [] : _c, _d = _a.viewStart, viewStart = _d === void 0 ? dateAdapter.startOfMonth(viewDate) : _d, _e = _a.viewEnd, viewEnd = _e === void 0 ? dateAdapter.endOfMonth(viewDate) : _e, weekendDays = _a.weekendDays;
407 if (!events) {
408 events = [];
409 }
410 var startOfWeek = dateAdapter.startOfWeek, endOfWeek = dateAdapter.endOfWeek, differenceInDays = dateAdapter.differenceInDays, startOfDay = dateAdapter.startOfDay, addHours = dateAdapter.addHours, endOfDay = dateAdapter.endOfDay, isSameMonth = dateAdapter.isSameMonth, getDay = dateAdapter.getDay, getMonth = dateAdapter.getMonth;
411 var start = startOfWeek(viewStart, { weekStartsOn: weekStartsOn });
412 var end = endOfWeek(viewEnd, { weekStartsOn: weekStartsOn });
413 var eventsInMonth = getEventsInPeriod(dateAdapter, {
414 events: events,
415 periodStart: start,
416 periodEnd: end,
417 });
418 var initialViewDays = [];
419 var previousDate;
420 var _loop_2 = function (i) {
421 // hacky fix for https://github.com/mattlewis92/angular-calendar/issues/173
422 var date;
423 if (previousDate) {
424 date = startOfDay(addHours(previousDate, HOURS_IN_DAY));
425 if (previousDate.getTime() === date.getTime()) {
426 // DST change, so need to add 25 hours
427 /* istanbul ignore next */
428 date = startOfDay(addHours(previousDate, HOURS_IN_DAY + 1));
429 }
430 previousDate = date;
431 }
432 else {
433 date = previousDate = start;
434 }
435 if (!excluded.some(function (e) { return getDay(date) === e; })) {
436 var day = getWeekDay(dateAdapter, {
437 date: date,
438 weekendDays: weekendDays,
439 });
440 var eventsInPeriod = getEventsInPeriod(dateAdapter, {
441 events: eventsInMonth,
442 periodStart: startOfDay(date),
443 periodEnd: endOfDay(date),
444 });
445 day.inMonth = isSameMonth(date, viewDate);
446 day.events = eventsInPeriod;
447 day.badgeTotal = eventsInPeriod.length;
448 initialViewDays.push(day);
449 }
450 };
451 for (var i = 0; i < differenceInDays(end, start) + 1; i++) {
452 _loop_2(i);
453 }
454 var days = [];
455 var totalDaysVisibleInWeek = DAYS_IN_WEEK - excluded.length;
456 if (totalDaysVisibleInWeek < DAYS_IN_WEEK) {
457 for (var i = 0; i < initialViewDays.length; i += totalDaysVisibleInWeek) {
458 var row = initialViewDays.slice(i, i + totalDaysVisibleInWeek);
459 var isRowInMonth = row.some(function (day) { return viewStart <= day.date && day.date < viewEnd; });
460 if (isRowInMonth) {
461 days = __spreadArrays(days, row);
462 }
463 }
464 }
465 else {
466 days = initialViewDays;
467 }
468 var rows = Math.floor(days.length / totalDaysVisibleInWeek);
469 var rowOffsets = [];
470 for (var i = 0; i < rows; i++) {
471 rowOffsets.push(i * totalDaysVisibleInWeek);
472 }
473 return {
474 rowOffsets: rowOffsets,
475 totalDaysVisibleInWeek: totalDaysVisibleInWeek,
476 days: days,
477 period: {
478 start: days[0].date,
479 end: endOfDay(days[days.length - 1].date),
480 events: eventsInMonth,
481 },
482 };
483}
484function getOverLappingWeekViewEvents(events, top, bottom) {
485 return events.filter(function (previousEvent) {
486 var previousEventTop = previousEvent.top;
487 var previousEventBottom = previousEvent.top + previousEvent.height;
488 if (top < previousEventBottom && previousEventBottom < bottom) {
489 return true;
490 }
491 else if (top < previousEventTop && previousEventTop < bottom) {
492 return true;
493 }
494 else if (previousEventTop <= top && bottom <= previousEventBottom) {
495 return true;
496 }
497 return false;
498 });
499}
500function getDayView(dateAdapter, _a) {
501 var events = _a.events, viewDate = _a.viewDate, hourSegments = _a.hourSegments, dayStart = _a.dayStart, dayEnd = _a.dayEnd, eventWidth = _a.eventWidth, segmentHeight = _a.segmentHeight, hourDuration = _a.hourDuration, minimumEventHeight = _a.minimumEventHeight;
502 var setMinutes = dateAdapter.setMinutes, setHours = dateAdapter.setHours, startOfDay = dateAdapter.startOfDay, startOfMinute = dateAdapter.startOfMinute, endOfDay = dateAdapter.endOfDay, differenceInMinutes = dateAdapter.differenceInMinutes;
503 var startOfView = setMinutes(setHours(startOfDay(viewDate), sanitiseHours(dayStart.hour)), sanitiseMinutes(dayStart.minute));
504 var endOfView = setMinutes(setHours(startOfMinute(endOfDay(viewDate)), sanitiseHours(dayEnd.hour)), sanitiseMinutes(dayEnd.minute));
505 endOfView.setSeconds(59, 999);
506 var previousDayEvents = [];
507 var eventsInPeriod = getEventsInPeriod(dateAdapter, {
508 events: events.filter(function (event) { return !event.allDay; }),
509 periodStart: startOfView,
510 periodEnd: endOfView,
511 });
512 var dayViewEvents = eventsInPeriod
513 .sort(function (eventA, eventB) {
514 return eventA.start.valueOf() - eventB.start.valueOf();
515 })
516 .map(function (event) {
517 var eventStart = event.start;
518 var eventEnd = event.end || eventStart;
519 var startsBeforeDay = eventStart < startOfView;
520 var endsAfterDay = eventEnd > endOfView;
521 var hourHeightModifier = (hourSegments * segmentHeight) / (hourDuration || MINUTES_IN_HOUR);
522 var top = 0;
523 if (eventStart > startOfView) {
524 // adjust the difference in minutes if the user's offset is different between the start of the day and the event (e.g. when going to or from DST)
525 var eventOffset = dateAdapter.getTimezoneOffset(eventStart);
526 var startOffset = dateAdapter.getTimezoneOffset(startOfView);
527 var diff = startOffset - eventOffset;
528 top += differenceInMinutes(eventStart, startOfView) + diff;
529 }
530 top *= hourHeightModifier;
531 top = Math.floor(top);
532 var startDate = startsBeforeDay ? startOfView : eventStart;
533 var endDate = endsAfterDay ? endOfView : eventEnd;
534 var timezoneOffset = dateAdapter.getTimezoneOffset(startDate) -
535 dateAdapter.getTimezoneOffset(endDate);
536 var height = differenceInMinutes(endDate, startDate) + timezoneOffset;
537 if (!event.end) {
538 height = segmentHeight;
539 }
540 else {
541 height *= hourHeightModifier;
542 }
543 if (minimumEventHeight && height < minimumEventHeight) {
544 height = minimumEventHeight;
545 }
546 height = Math.floor(height);
547 var bottom = top + height;
548 var overlappingPreviousEvents = getOverLappingWeekViewEvents(previousDayEvents, top, bottom);
549 var left = 0;
550 while (overlappingPreviousEvents.some(function (previousEvent) { return previousEvent.left === left; })) {
551 left += eventWidth;
552 }
553 var dayEvent = {
554 event: event,
555 height: height,
556 width: eventWidth,
557 top: top,
558 left: left,
559 startsBeforeDay: startsBeforeDay,
560 endsAfterDay: endsAfterDay,
561 };
562 previousDayEvents.push(dayEvent);
563 return dayEvent;
564 });
565 var width = Math.max.apply(Math, dayViewEvents.map(function (event) { return event.left + event.width; }));
566 var allDayEvents = getEventsInPeriod(dateAdapter, {
567 events: events.filter(function (event) { return event.allDay; }),
568 periodStart: startOfDay(startOfView),
569 periodEnd: endOfDay(endOfView),
570 });
571 return {
572 events: dayViewEvents,
573 width: width,
574 allDayEvents: allDayEvents,
575 period: {
576 events: eventsInPeriod,
577 start: startOfView,
578 end: endOfView,
579 },
580 };
581}
582function sanitiseHours(hours) {
583 return Math.max(Math.min(23, hours), 0);
584}
585function sanitiseMinutes(minutes) {
586 return Math.max(Math.min(59, minutes), 0);
587}
588function getDayViewHourGrid(dateAdapter, _a) {
589 var viewDate = _a.viewDate, hourSegments = _a.hourSegments, hourDuration = _a.hourDuration, dayStart = _a.dayStart, dayEnd = _a.dayEnd;
590 var setMinutes = dateAdapter.setMinutes, setHours = dateAdapter.setHours, startOfDay = dateAdapter.startOfDay, startOfMinute = dateAdapter.startOfMinute, endOfDay = dateAdapter.endOfDay, addMinutes = dateAdapter.addMinutes, addHours = dateAdapter.addHours, addDays = dateAdapter.addDays;
591 var hours = [];
592 var startOfView = setMinutes(setHours(startOfDay(viewDate), sanitiseHours(dayStart.hour)), sanitiseMinutes(dayStart.minute));
593 var endOfView = setMinutes(setHours(startOfMinute(endOfDay(viewDate)), sanitiseHours(dayEnd.hour)), sanitiseMinutes(dayEnd.minute));
594 var segmentDuration = (hourDuration || MINUTES_IN_HOUR) / hourSegments;
595 var startOfViewDay = startOfDay(viewDate);
596 var endOfViewDay = endOfDay(viewDate);
597 var dateAdjustment = function (d) { return d; };
598 // this means that we change from or to DST on this day and that's going to cause problems so we bump the date
599 if (dateAdapter.getTimezoneOffset(startOfViewDay) !==
600 dateAdapter.getTimezoneOffset(endOfViewDay)) {
601 startOfViewDay = addDays(startOfViewDay, 1);
602 startOfView = addDays(startOfView, 1);
603 endOfView = addDays(endOfView, 1);
604 dateAdjustment = function (d) { return addDays(d, -1); };
605 }
606 var dayDuration = hourDuration
607 ? (HOURS_IN_DAY * 60) / hourDuration
608 : MINUTES_IN_HOUR;
609 for (var i = 0; i < dayDuration; i++) {
610 var segments = [];
611 for (var j = 0; j < hourSegments; j++) {
612 var date = addMinutes(addMinutes(startOfView, i * (hourDuration || MINUTES_IN_HOUR)), j * segmentDuration);
613 if (date >= startOfView && date < endOfView) {
614 segments.push({
615 date: dateAdjustment(date),
616 displayDate: date,
617 isStart: j === 0,
618 });
619 }
620 }
621 if (segments.length > 0) {
622 hours.push({ segments: segments });
623 }
624 }
625 return hours;
626}
627export var EventValidationErrorMessage;
628(function (EventValidationErrorMessage) {
629 EventValidationErrorMessage["NotArray"] = "Events must be an array";
630 EventValidationErrorMessage["StartPropertyMissing"] = "Event is missing the `start` property";
631 EventValidationErrorMessage["StartPropertyNotDate"] = "Event `start` property should be a javascript date object. Do `new Date(event.start)` to fix it.";
632 EventValidationErrorMessage["EndPropertyNotDate"] = "Event `end` property should be a javascript date object. Do `new Date(event.end)` to fix it.";
633 EventValidationErrorMessage["EndsBeforeStart"] = "Event `start` property occurs after the `end`";
634})(EventValidationErrorMessage || (EventValidationErrorMessage = {}));
635export function validateEvents(events, log) {
636 var isValid = true;
637 function isError(msg, event) {
638 log(msg, event);
639 isValid = false;
640 }
641 if (!Array.isArray(events)) {
642 log(EventValidationErrorMessage.NotArray, events);
643 return false;
644 }
645 events.forEach(function (event) {
646 if (!event.start) {
647 isError(EventValidationErrorMessage.StartPropertyMissing, event);
648 }
649 else if (!(event.start instanceof Date)) {
650 isError(EventValidationErrorMessage.StartPropertyNotDate, event);
651 }
652 if (event.end) {
653 if (!(event.end instanceof Date)) {
654 isError(EventValidationErrorMessage.EndPropertyNotDate, event);
655 }
656 if (event.start > event.end) {
657 isError(EventValidationErrorMessage.EndsBeforeStart, event);
658 }
659 }
660 });
661 return isValid;
662}
663//# sourceMappingURL=calendar-utils.js.map
\No newline at end of file