public HomeIndexViewModel AssembleHomeIndexViewModel(string userId) { var homeIndexViewModel = new HomeIndexViewModel(); var userTimeZone = _userSettingsService.Get(userId).TimeZone; SetDefaultDatesWhenEmpty(homeIndexViewModel, userTimeZone); return AssembleHomeIndexViewModel(homeIndexViewModel, userId); }
public void Test_Populates_The_Legenda() { var createdOnMin = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById(TIMEZONE)); var createdOnMax = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow.AddDays(3), TimeZoneInfo.FindSystemTimeZoneById(TIMEZONE)); var homeIndexViewModel = new HomeIndexViewModel(createdOnMin, createdOnMax); var actual = HomeAssemblerFactory.SetupHomeAssembler().AssembleHomeIndexViewModel(homeIndexViewModel, It.IsAny<string>()); Assert.IsNotNull(actual.Legenda); }
public void Test_AssembleHomeIndexViewModel_Populates_The_Tag_Property() { var createdOnMin = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById(TIMEZONE)); var createdOnMax = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow.AddDays(3), TimeZoneInfo.FindSystemTimeZoneById(TIMEZONE)); var homeIndexViewModel = new HomeIndexViewModel(createdOnMin, createdOnMax); var actual = GetHomeAssembler().AssembleHomeIndexViewModel(homeIndexViewModel, It.IsAny<string>()); foreach (var entryGroup in actual.EntryGroups) { foreach (var entry in entryGroup.Entries) Assert.IsFalse(string.IsNullOrEmpty(entry.Tag)); } }
public void Test_AssembleHomeIndexViewModel_Groups_Entries_Correctly() { var createdOnMin = new DateTime(2011, 10, 18, 0, 0, 0, DateTimeKind.Local); var createdOnMax = new DateTime(2011, 10, 21, 0, 0, 0, DateTimeKind.Local); var homeIndexViewModel = new HomeIndexViewModel(createdOnMin, createdOnMax); var actual = GetHomeAssembler().AssembleHomeIndexViewModel(homeIndexViewModel, It.IsAny<string>()); var firstEntryGroup = actual.EntryGroups.First(); var secondEntryGroup = actual.EntryGroups.ElementAt(1); var thirdEntryGroup = actual.EntryGroups.ElementAt(2); Assert.AreEqual(1, firstEntryGroup.Entries.Count()); Assert.AreEqual(3, secondEntryGroup.Entries.Count()); Assert.AreEqual(1, thirdEntryGroup.Entries.Count()); }
public void Test_AssembleHomeIndexViewModel_Calculates_EntryPercentages_Correctly() { var createdOnMin = new DateTime(2011, 10, 18, 0, 0, 0, DateTimeKind.Local); var createdOnMax = new DateTime(2011, 10, 21, 0, 0, 0, DateTimeKind.Local); var homeIndexViewModel = new HomeIndexViewModel(createdOnMin, createdOnMax); var actual = GetHomeAssembler().AssembleHomeIndexViewModel(homeIndexViewModel, It.IsAny<string>()); var firstEntryGroup = actual.EntryGroups.First(); var secondEntryGroup = actual.EntryGroups.ElementAt(1); var thirdEntryGroup = actual.EntryGroups.ElementAt(2); Assert.AreEqual(85, Convert.ToInt32(firstEntryGroup.Entries.First().Percentage)); Assert.AreEqual(15, Convert.ToInt32(secondEntryGroup.Entries.First().Percentage)); Assert.AreEqual(50, Convert.ToInt32(secondEntryGroup.Entries.ElementAt(1).Percentage)); Assert.AreEqual(35, Convert.ToInt32(secondEntryGroup.Entries.ElementAt(2).Percentage)); Assert.AreEqual(100, Convert.ToInt32(thirdEntryGroup.Entries.First().Percentage)); }
public ActionResult Index(HomeIndexViewModel indexViewModel) { if (ViewData.ModelState.IsValid) { var model = _homeAssembler.AssembleHomeIndexViewModel(indexViewModel, UserId); ViewData.Model = model; ViewBag.EntryGroups = model.EntryGroups; var userSession = _sessionStore.GetUserSession(); userSession.HomeIndexFrom = indexViewModel.From; userSession.HomeIndexTo = indexViewModel.To; _sessionStore.SaveUserSession(userSession); } else { ViewData.Model = indexViewModel; ViewBag.EntryGroups = indexViewModel.EntryGroups; } return View(); }
// TODO: Wow, this got ugly fast. Can this be simplified? public HomeIndexViewModel AssembleHomeIndexViewModel(HomeIndexViewModel homeIndexViewModelIn, string userId) { var indexViewModelResult = new HomeIndexViewModel(homeIndexViewModelIn.From, homeIndexViewModelIn.To); var userTimeZone = _userSettingsService.Get(userId).TimeZone; SetDefaultDatesWhenEmpty(indexViewModelResult, userTimeZone); // You have to take the userTimeZoneOffset into account, otherwise we end up with too little data var userTimeZoneOffsetToTakeIntoAccountFrom = userTimeZone.BaseUtcOffset.TotalSeconds < 0 ? new TimeSpan() : userTimeZone.BaseUtcOffset; var userTimeZoneOffsetToTakeIntoAccountTo = userTimeZone.BaseUtcOffset.TotalSeconds > 0 ? userTimeZone.BaseUtcOffset : new TimeSpan(); // Get the entries based on universal time var entries = _entryService.GetEntries( indexViewModelResult.From.Value.ToUniversalTime().Subtract(userTimeZoneOffsetToTakeIntoAccountFrom), indexViewModelResult.To.Value.ToUniversalTime().Add(userTimeZoneOffsetToTakeIntoAccountTo), userId); var start = indexViewModelResult.From.Value; var stop = indexViewModelResult.To.Value; LoadLegenda(indexViewModelResult, entries); while (start < stop) { var startOfTheDay = start.Date; var endOfTheDay = start.Date.AddDays(1); foreach (var entry in entries) { var entryCreatedOnUserTimeZone = TimeZoneInfo.ConvertTimeFromUtc(entry.CreatedOn, userTimeZone); var entryStoppedOnUserTimeZone = (DateTime?)DateTime.MaxValue; if (entry.StoppedOn.HasValue) entryStoppedOnUserTimeZone = TimeZoneInfo.ConvertTimeFromUtc(entry.StoppedOn.Value, userTimeZone); if (entryStoppedOnUserTimeZone < startOfTheDay || entryCreatedOnUserTimeZone > endOfTheDay) continue; HomeIndexViewModelEntry viewModelEntry = null; if (entryCreatedOnUserTimeZone <= startOfTheDay && entryStoppedOnUserTimeZone >= endOfTheDay) { viewModelEntry = new HomeIndexViewModelEntry(100, startOfTheDay, endOfTheDay); } else if (entryCreatedOnUserTimeZone <= startOfTheDay) { var diff = entryStoppedOnUserTimeZone.Value.Subtract(startOfTheDay); var diffPercent = (diff.TotalSeconds / SECONDS_IN_DAY) * 100; viewModelEntry = new HomeIndexViewModelEntry( diffPercent, startOfTheDay, entryStoppedOnUserTimeZone.Value); } else if (entryStoppedOnUserTimeZone.Value >= endOfTheDay) { var diff = endOfTheDay.Subtract(entryCreatedOnUserTimeZone); var diffPercent = (diff.TotalSeconds / SECONDS_IN_DAY) * 100; viewModelEntry = new HomeIndexViewModelEntry( diffPercent, entryCreatedOnUserTimeZone, endOfTheDay); } else { var diff = entryStoppedOnUserTimeZone.Value.Subtract(entryCreatedOnUserTimeZone); var diffPercent = (diff.TotalSeconds / SECONDS_IN_DAY) * 100; viewModelEntry = new HomeIndexViewModelEntry( diffPercent, entryCreatedOnUserTimeZone, entryStoppedOnUserTimeZone.Value); } viewModelEntry.Tag = entry.Tag == null ? string.Empty : entry.Tag.TitleCasedName; viewModelEntry.Color = entry.Tag == null ? string.Empty : entry.Tag.Color; viewModelEntry.Title = string.Format("{0} ({1}-{2}): {3}", new object[] { viewModelEntry.Tag, viewModelEntry.Start.ToShortTimeString(), viewModelEntry.End.ToShortTimeString(), entry.Description }); if (indexViewModelResult.EntryGroups.Any(eg => eg.Date == startOfTheDay)) { var oldEntryGroup = indexViewModelResult.EntryGroups.Where(eg => eg.Date == startOfTheDay).First(); var newEntryGroup = new HomeIndexViewModelEntryGroup(oldEntryGroup.Date); newEntryGroup.Entries = oldEntryGroup.Entries; newEntryGroup.Entries.Add(viewModelEntry); indexViewModelResult.EntryGroups.RemoveAll(eg => eg.Date == startOfTheDay); indexViewModelResult.EntryGroups.Add(newEntryGroup); } else { var entryGroup = new HomeIndexViewModelEntryGroup(startOfTheDay); entryGroup.Entries.Add(viewModelEntry); indexViewModelResult.EntryGroups.Add(entryGroup); } } start = start.AddDays(1); } return indexViewModelResult; }
public HomeIndexViewModel AssembleHomeIndexViewModel(string userId, DateTime from, DateTime to) { var homeIndexViewModel = new HomeIndexViewModel(from, to); return AssembleHomeIndexViewModel(homeIndexViewModel, userId); }
private void SetDefaultDatesWhenEmpty(HomeIndexViewModel indexViewModelResult, TimeZoneInfo userTimeZone) { var nowDate = _timeService.GetNow(); var defaultFromDate = nowDate.AddDays(-14); var defaultToDate = nowDate.AddDays(1); if (!indexViewModelResult.From.HasValue) indexViewModelResult.From = TimeZoneInfo.ConvertTimeFromUtc(defaultFromDate, userTimeZone).Date; if (!indexViewModelResult.To.HasValue) indexViewModelResult.To = TimeZoneInfo.ConvertTimeFromUtc(defaultToDate, userTimeZone).Date; }
private void LoadLegenda(HomeIndexViewModel indexViewModel, IEnumerable<Entry> entries) { var tags = entries.Select(e => e.Tag).Distinct(); indexViewModel.Legenda = tags.Select(t => new HomeIndexViewModelLegendaTag(t.TitleCasedName, t.Color)) .OrderBy(t => t.Name) .ToList(); }