/// <summary> /// Get all the data to build the calendar. /// </summary> /// <returns></returns> private IEnumerable <CalendarYear> GetCalendarData() { var calendar = Enumerable .Range(0, (int)currentDate.AddMonths(MaximumMonthsToDisplay).Subtract(currentDate).TotalDays) .Select(d => currentDate.AddDays(d)) .Select(d => new { Date = d, Weekday = currentCulture.Calendar.GetDayOfWeek(d), WeekNr = currentCulture.Calendar.GetWeekOfYear(d, currentCulture.DateTimeFormat.CalendarWeekRule, currentCulture.DateTimeFormat.FirstDayOfWeek) }) .GroupBy(d => new { d.Date.Year, d.Date.Month, d.WeekNr }) .GroupBy(d => new { d.Key.Year, d.Key.Month }) .Select(y => new CalendarYear { Month = y.Key.Month, Year = y.Key.Year, Weeks = y.Select(w => new CalendarWeek { Weeknumber = w.Key.WeekNr, Days = w.Select(d => new CalendarDay { Date = d.Date, DayOfWeek = d.Weekday, Status = OccupiedDateRanges != null && OccupiedDateRanges.Any(o => d.Date >= o.Start && d.Date <= o.End) ? DayStatus.Occupied : DayStatus.Free }) }) }); return(calendar); }
/// <summary> /// Get the first occupied date after the selected start. To determine if we can select the MinimumDaysToSelect. /// </summary> /// <returns>DateTime</returns> private DateTime?GetFirstOccupiedDateAfterStartDate() { if (OccupiedDateRanges == null || !startDate.HasValue) { return(null); } return(OccupiedDateRanges.OrderBy(o => o.Start).FirstOrDefault(o => startDate < o.Start)?.Start); }