* Creates the sorted list of all events. * @param {boolean} limitNumberOfEntries Whether to filter returned events for display. * @returns {object[]} Array with events.
(limitNumberOfEntries)
| 471 | * @returns {object[]} Array with events. |
| 472 | */ |
| 473 | createEventList (limitNumberOfEntries) { |
| 474 | let now = moment(); |
| 475 | let future = now.clone().startOf("day").add(this.config.maximumNumberOfDays, "days"); |
| 476 | |
| 477 | let events = []; |
| 478 | |
| 479 | for (const calendarUrl in this.calendarData) { |
| 480 | const calendar = this.calendarData[calendarUrl].events; |
| 481 | let remainingEntries = this.maximumEntriesForUrl(calendarUrl); |
| 482 | let maxPastDaysCompare = now.clone().subtract(this.maximumPastDaysForUrl(calendarUrl), "days"); |
| 483 | let by_url_calevents = []; |
| 484 | for (const e in calendar) { |
| 485 | const event = JSON.parse(JSON.stringify(calendar[e])); // clone object |
| 486 | const eventStartDateMoment = this.timestampToMoment(event.startDate); |
| 487 | const eventEndDateMoment = this.timestampToMoment(event.endDate); |
| 488 | |
| 489 | if (this.config.hidePrivate && event.class === "PRIVATE") { |
| 490 | // do not add the current event, skip it |
| 491 | continue; |
| 492 | } |
| 493 | if (limitNumberOfEntries) { |
| 494 | if (eventEndDateMoment.isBefore(maxPastDaysCompare)) { |
| 495 | continue; |
| 496 | } |
| 497 | if (this.config.hideOngoing && eventStartDateMoment.isBefore(now)) { |
| 498 | continue; |
| 499 | } |
| 500 | if (this.config.hideDuplicates && this.listContainsEvent(events, event)) { |
| 501 | continue; |
| 502 | } |
| 503 | } |
| 504 | |
| 505 | event.url = calendarUrl; |
| 506 | event.today = eventStartDateMoment.isSame(now, "d"); |
| 507 | event.dayBeforeYesterday = eventStartDateMoment.isSame(now.clone().subtract(2, "days"), "d"); |
| 508 | event.yesterday = eventStartDateMoment.isSame(now.clone().subtract(1, "days"), "d"); |
| 509 | event.tomorrow = eventStartDateMoment.isSame(now.clone().add(1, "days"), "d"); |
| 510 | event.dayAfterTomorrow = eventStartDateMoment.isSame(now.clone().add(2, "days"), "d"); |
| 511 | |
| 512 | /* |
| 513 | * if sliceMultiDayEvents is set to true, multiday events (events exceeding at least one midnight) are sliced into days, |
| 514 | * otherwise, esp. in dateheaders mode it is not clear how long these events are. |
| 515 | */ |
| 516 | const maxCount = eventEndDateMoment.diff(eventStartDateMoment, "days"); |
| 517 | if (this.config.sliceMultiDayEvents && maxCount > 1) { |
| 518 | const splitEvents = []; |
| 519 | let midnight |
| 520 | = eventStartDateMoment |
| 521 | .clone() |
| 522 | .startOf("day") |
| 523 | .add(1, "day") |
| 524 | .endOf("day"); |
| 525 | let count = 1; |
| 526 | while (eventEndDateMoment.isAfter(midnight)) { |
| 527 | const thisEvent = JSON.parse(JSON.stringify(event)); // clone object |
| 528 | thisEvent.today = this.timestampToMoment(thisEvent.startDate).isSame(now, "d"); |
| 529 | thisEvent.tomorrow = this.timestampToMoment(thisEvent.startDate).isSame(now.clone().add(1, "days"), "d"); |
| 530 | thisEvent.endDate = midnight.clone().subtract(1, "day").format("x"); |