public TimeSlot(DayOfWeek day, DateTime time, int slotSpan) { if (TheGivenDayIsNotASchoolDay(day)) { throw new ArgumentOutOfRangeException(nameof(day), "The provided day is not a valid school day"); } if (TheGivenTimeIsOutsideSchoolHours(time)) { throw new ArgumentOutOfRangeException(nameof(time), "The provided time is outside normal school hours"); } Day = day; Time = time; SlotSpan = slotSpan; Id = TimeSlotHelpers.GenerateIdFromDaysAndTime(day, time); _classes = new HashSet <Class>(_acceptedNumberOfClasses); }
private TimeSlot FindOrCreateTimeSlotForClass(Class newClass) { TimeSpan classDuration = newClass.EndTime.TimeOfDay - newClass.StartTime.TimeOfDay; const int slotDurationInMinutes = 5; const int slotOffset = 1; int numberOfTimeSlotsClassSpans = ((int)classDuration.TotalMinutes / slotDurationInMinutes) + slotOffset; string slotId = TimeSlotHelpers.GenerateIdFromDaysAndTime(newClass.Day, newClass.StartTime); TimeSlot timeSlot = _timeSlots.SingleOrDefault(slot => slot.Id.Equals(slotId, StringComparison.InvariantCultureIgnoreCase) && slot.SlotSpan == numberOfTimeSlotsClassSpans); if (timeSlot == null) { timeSlot = new TimeSlot(day: newClass.Day, time: newClass.StartTime, slotSpan: numberOfTimeSlotsClassSpans); _timeSlots.Add(timeSlot); } return(timeSlot); }
private string SetHtmlTableBodyRows(WeeklySchedule weeklySchedule, string weeklyScheduleHtmlPage) { string tbodyContent = String.Empty; foreach (DayOfWeek day in weeklySchedule.SchoolDays) { int rowSpan = CalculateRowsDaySpans(day, weeklySchedule); if (rowSpan == 0) { continue; } var dayColumns = new Dictionary <string, string>(); int rowIndex = 0; var dayRows = new Dictionary <string, string>(); while (rowIndex < rowSpan) { string row = String.Empty; if (rowIndex == 0) { row += $"<tr><td rowspan='{rowSpan}'>{day.ToString()}</td>"; } else { row = "<tr>"; } dayRows.Add(GetRowIdFromIndex(rowIndex), row); // Populate all columns for a given row within a day foreach (DateTime time in weeklySchedule.SchoolTimes) { dayColumns.Add(GetColumnId(day, time, rowIndex), $"<td> </td>"); } rowIndex++; } foreach (DateTime time in weeklySchedule.SchoolTimes) { string slotId = TimeSlotHelpers.GenerateIdFromDaysAndTime(day, time); IEnumerable <TimeSlot> timeSlots = weeklySchedule.TimeSlots.Where(slot => slot.Id.Equals(slotId, StringComparison.InvariantCulture)); foreach (TimeSlot timeSlot in timeSlots) { if (timeSlot == null) { continue; } for (int classIndex = 0; classIndex < timeSlot.Classes.Count(); classIndex++) { Class @class = timeSlot.Classes.ElementAt(classIndex); string columnId = GetColumnId(day, @class.StartTime, classIndex); if (dayColumns.ContainsKey(columnId)) { string td = dayColumns[columnId]; td = $@"<td colspan={timeSlot.SlotSpan}>" + $"{@class.Name} - {@class.Section}<br>" + $"{@class.Title}<br>" + $"{@class.StartTime.ToShortTimeString()} to {@class.EndTime.ToShortTimeString()}" + "</td>"; dayColumns[columnId] = td; RemoveSpannedOverColumns(@class.StartTime, @class.EndTime, classIndex, day, dayColumns); } } } } rowIndex = 0; while (rowIndex < rowSpan) { string rowData = dayRows[GetRowIdFromIndex(rowIndex)]; IEnumerable <string> keys = dayColumns.Keys.Where(key => key.Contains($"_{rowIndex}_")); foreach (string key in keys) { rowData += dayColumns[key]; } tbodyContent += rowData + "</tr>"; rowIndex++; } } weeklyScheduleHtmlPage = weeklyScheduleHtmlPage.Replace("#TableBody#", tbodyContent); return(weeklyScheduleHtmlPage); }