arrange method

  1. @override
List<OrganizedCalendarEventData<T>> arrange({
  1. required List<CalendarEventData<T>> events,
  2. required double height,
  3. required double width,
  4. required double heightPerMinute,
})
override

This method will arrange all the events in and return List of OrganizedCalendarEventData.

Implementation

@override
List<OrganizedCalendarEventData<T>> arrange({
  required List<CalendarEventData<T>> events,
  required double height,
  required double width,
  required double heightPerMinute,
}) {
  final arrangedEvents = <OrganizedCalendarEventData<T>>[];

  for (final event in events) {
    final startTime = event.startTime ?? DateTime.now();
    final endTime = event.endTime ?? startTime;

    assert(
        !(endTime.getTotalMinutes <= startTime.getTotalMinutes),
        "Assertion fail for event: \n$event\n"
        "startDate must be less than endDate.\n"
        "This error occurs when you does not provide startDate or endDate in "
        "CalendarEventDate or provided endDate occurs before startDate.");

    final eventStart = startTime.getTotalMinutes;
    final eventEnd = endTime.getTotalMinutes;

    final arrangeEventLen = arrangedEvents.length;

    var eventIndex = -1;

    for (var i = 0; i < arrangeEventLen; i++) {
      final arrangedEventStart =
          arrangedEvents[i].startDuration?.getTotalMinutes ?? 0;
      final arrangedEventEnd =
          arrangedEvents[i].endDuration?.getTotalMinutes ?? 0;

      if ((arrangedEventStart >= eventStart &&
              arrangedEventStart <= eventEnd) ||
          (arrangedEventEnd >= eventStart && arrangedEventEnd <= eventEnd) ||
          (eventStart >= arrangedEventStart &&
              eventStart <= arrangedEventEnd) ||
          (eventEnd >= arrangedEventStart && eventEnd <= arrangedEventEnd)) {
        eventIndex = i;
        break;
      }
    }

    if (eventIndex == -1) {
      final top = eventStart * heightPerMinute;
      final bottom = height - eventEnd * heightPerMinute;

      final newEvent = OrganizedCalendarEventData<T>(
        top: top,
        bottom: bottom,
        left: 0,
        right: 0,
        startDuration: startTime.copyFromMinutes(eventStart),
        endDuration: endTime.copyFromMinutes(eventEnd),
        events: [event],
      );

      arrangedEvents.add(newEvent);
    } else {
      final arrangedEventData = arrangedEvents[eventIndex];

      final arrangedEventStart =
          arrangedEventData.startDuration?.getTotalMinutes ?? 0;
      final arrangedEventEnd =
          arrangedEventData.endDuration?.getTotalMinutes ?? 0;

      final startDuration = math.min(eventStart, arrangedEventStart);
      final endDuration = math.max(eventEnd, arrangedEventEnd);

      final top = startDuration * heightPerMinute;
      final bottom = height - endDuration * heightPerMinute;

      final newEvent = OrganizedCalendarEventData<T>(
        top: top,
        bottom: bottom,
        left: 0,
        right: 0,
        startDuration:
            arrangedEventData.startDuration?.copyFromMinutes(startDuration),
        endDuration:
            arrangedEventData.endDuration?.copyFromMinutes(endDuration),
        events: arrangedEventData.events..add(event),
      );

      arrangedEvents[eventIndex] = newEvent;
    }
  }

  return arrangedEvents;
}