public async System.Threading.Tasks.Task TestDeletingClassSchedule() { DataChanges changes = new DataChanges(); changes.Add(new DataItemSchedule() { Identifier = Guid.NewGuid(), UpperIdentifier = base.CurrentClassId, StartTime = new DateTime(2015, 1, 1, 8, 00, 00, DateTimeKind.Utc), EndTime = new DateTime(2015, 1, 1, 8, 50, 00, DateTimeKind.Utc), Room = "Modern Languages 201", ScheduleWeek = Schedule.Week.BothWeeks, ScheduleType = Schedule.Type.Normal, DayOfWeek = DayOfWeek.Monday }); await DataStore.ProcessLocalChanges(changes); var viewModel = await ViewModelClass.LoadAsync(base.LocalAccountId, base.CurrentClassId, new DateTime(2015, 1, 1, 0, 0, 0, DateTimeKind.Utc)); Assert.AreEqual(1, viewModel.Class.Schedules.Count); var schedule = viewModel.Class.Schedules[0]; changes = new DataChanges(); changes.DeleteItem(schedule.Identifier); await DataStore.ProcessLocalChanges(changes); viewModel = await ViewModelClass.LoadAsync(base.LocalAccountId, base.CurrentClassId, new DateTime(2015, 1, 1, 0, 0, 0, DateTimeKind.Utc)); Assert.AreEqual(0, viewModel.Class.Schedules.Count); }
public async Task DeleteItem(Guid identifier) { DataChanges changes = new DataChanges(); changes.DeleteItem(identifier); await PowerPlannerApp.Current.SaveChanges(changes); }
public async Task TestCascadeDeleteYear() { Guid freshmanId = Guid.NewGuid(); Guid tempId; DataChanges changes = new DataChanges(); changes.Add(new DataItemYear() { Identifier = freshmanId, Name = "Freshman" }); changes.Add(new DataItemSemester() { Identifier = Guid.NewGuid(), UpperIdentifier = changes.EditedItems.OfType <DataItemYear>().First().Identifier, Name = "Fall" }); changes.Add(new DataItemSemester() { Identifier = Guid.NewGuid(), UpperIdentifier = changes.EditedItems.OfType <DataItemYear>().First().Identifier, Name = "Spring" }); changes.Add(new DataItemYear() { Identifier = Guid.NewGuid(), Name = "Sophomore" }); changes.Add(new DataItemSemester() { Identifier = Guid.NewGuid(), UpperIdentifier = changes.EditedItems.OfType <DataItemYear>().First(i => i.Name.Equals("Sophomore")).Identifier, Name = "Fall - Sophomore" }); await DataStore.ProcessLocalChanges(changes); Assert.AreEqual(2, DataStore.TableYears.Count(), "Database count of years incorrect"); Assert.AreEqual(3, DataStore.TableSemesters.Count(), "Database count of semesters incorrect"); changes = new DataChanges(); changes.DeleteItem(freshmanId); await DataStore.ProcessLocalChanges(changes); Assert.AreEqual(1, DataStore.TableYears.Count(), "Database count of years incorrect"); Assert.AreEqual(1, DataStore.TableSemesters.Count(), "Database count of semesters incorrect"); }
public void Delete() { TryStartDataOperationAndThenNavigate(async delegate { // Get the existing schedules List <ViewItemSchedule> existingSchedules = EditParams != null ? EditParams.GroupedSchedules.ToList() : new List <ViewItemSchedule>(); if (existingSchedules.Count > 0) { DataChanges changes = new DataChanges(); foreach (var s in existingSchedules) { changes.DeleteItem(s.Identifier); } await PowerPlannerApp.Current.SaveChanges(changes); } }, delegate { this.RemoveViewModel(); }); }
public async void Save() { try { if (!AreWeightsValid()) { await new PortableMessageDialog(PowerPlannerResources.GetString("String_InvalidWeightCategoriesMessageBody"), PowerPlannerResources.GetString("String_InvalidWeightCategoriesMessageHeader")).ShowAsync(); return; } DataChanges changes = new DataChanges(); // Process weight category changes List <EditingWeightCategoryViewModel> newWeights = new List <EditingWeightCategoryViewModel>(WeightCategories); List <BaseViewItemMegaItem> lostGrades = new List <BaseViewItemMegaItem>(); //handle weights that were deleted foreach (ViewItemWeightCategory existing in Class.WeightCategories) { //if that existing weight isn't in the new weights list if (!newWeights.Any(i => i.Identifier == existing.Identifier)) { //mark it for deletion changes.DeleteItem(existing.Identifier); //add all of its grades to the lost grades lostGrades.AddRange(existing.Grades); } } //if there aren't any weights, need to add the default All Grades if (newWeights.Count == 0) { newWeights.Add(new EditingWeightCategoryViewModel() { Name = PowerPlannerResources.GetString("WeightCategory_AllGrades"), Weight = 100 }); } Guid firstCategory = newWeights.First().Identifier; //strip away any existing weight categories that didn't change foreach (EditingWeightCategoryViewModel newWeight in newWeights.ToArray()) { ViewItemWeightCategory existing = Class.WeightCategories.FirstOrDefault(i => i.Identifier == newWeight.Identifier); if (existing != null) { //if the name and/or value didn't change, we'll remove it from the main list if (existing.Name.Equals(newWeight.Name) && existing.WeightValue == newWeight.Weight) { newWeights.Remove(newWeight); } } } //and now process the new/changed weights foreach (EditingWeightCategoryViewModel changed in newWeights) { DataItemWeightCategory w; ViewItemWeightCategory existing = Class.WeightCategories.FirstOrDefault(i => i.Identifier == changed.Identifier); //if existing, serialize if (existing != null) { w = new DataItemWeightCategory() { Identifier = existing.Identifier } } ; else { w = new DataItemWeightCategory() { Identifier = Guid.NewGuid(), UpperIdentifier = Class.Identifier }; //if we didn't have a first category yet if (firstCategory == Guid.Empty) { firstCategory = w.Identifier; } } w.Name = changed.Name; w.WeightValue = changed.Weight; changes.Add(w); } // And then move the lost grades into the first available weight category foreach (var lostGrade in lostGrades.OfType <ViewItemGrade>()) { DataItemGrade g = new DataItemGrade() { Identifier = lostGrade.Identifier }; g.UpperIdentifier = firstCategory; changes.Add(g); } foreach (var lostGrade in lostGrades.OfType <ViewItemTaskOrEvent>()) { DataItemMegaItem g = new DataItemMegaItem() { Identifier = lostGrade.Identifier }; g.WeightCategoryIdentifier = firstCategory; changes.Add(g); } TryStartDataOperationAndThenNavigate(delegate { return(PowerPlannerApp.Current.SaveChanges(changes)); }, delegate { this.RemoveViewModel(); }); } catch (Exception ex) { TelemetryExtension.Current?.TrackException(ex); await new PortableMessageDialog("Error encountered while saving. Your error report has been sent to the developer.", "Error").ShowAsync(); } }
public async System.Threading.Tasks.Task Save() { try { List <EditingClassScheduleItemView.ScheduleData> desiredSchedules = scheduleEditors.SelectMany(i => i.GetSchedules()).ToList(); foreach (var s in desiredSchedules) { if (s.StartTime.TimeOfDay > s.EndTime.TimeOfDay) { await new MessageDialog("End times must be greater than start times. Check your schedules and ensure that the end times are greater than the start times.", "Invalid end time").ShowAsync(); return; } } List <DataItemSchedule> currentSchedules = Class.Schedules.Select(i => new DataItemSchedule() { Identifier = i.Identifier }).ToList(); DataChanges changes = new DataChanges(); //if we have more desired schedules than existing, we add some extras for (int i = currentSchedules.Count; i < desiredSchedules.Count; i++) { currentSchedules.Add(new DataItemSchedule() { Identifier = Guid.NewGuid(), UpperIdentifier = Class.Identifier }); } //if we have less desired schedules than existing, we delete some existing while (currentSchedules.Count > desiredSchedules.Count) { changes.DeleteItem(currentSchedules.Last().Identifier); currentSchedules.RemoveAt(currentSchedules.Count - 1); } //now merge changes for (int i = 0; i < currentSchedules.Count; i++) { DataItemSchedule current = currentSchedules[i]; var desired = desiredSchedules[i]; current.StartTime = desired.StartTime; current.EndTime = desired.EndTime; current.Room = desired.Room; current.ScheduleWeek = desired.Week; current.DayOfWeek = desired.Day; current.ScheduleType = PowerPlannerSending.Schedule.Type.Normal; changes.Add(current); } //save changes //await App.SaveChanges(changes); close(); } catch (Exception ex) { TelemetryExtension.Current?.TrackException(ex); await new MessageDialog("Failed to save. Your error has been sent to the developer.", "Error").ShowAsync(); } }
public void Save() { TryStartDataOperationAndThenNavigate(async delegate { if (StartTime >= EndTime) { new PortableMessageDialog("Your end time must be greater than your start time.", "Invalid end time").Show(); return; } if (DayOfWeeks.Count == 0) { new PortableMessageDialog("You must select at least one day of week. If you want to delete this time, use the delete option in the menu.", "No day of weeks").Show(); return; } var updatedAndNewSchedules = new List <DataItemSchedule>(); Guid classId = AddParams != null ? AddParams.Class.Identifier : EditParams.GroupedSchedules.First().Class.Identifier; // Get the existing schedules List <ViewItemSchedule> existingSchedules = EditParams != null ? EditParams.GroupedSchedules.ToList() : new List <ViewItemSchedule>(); for (int i = 0; i < DayOfWeeks.Count; i++) { DayOfWeek dayOfWeek = DayOfWeeks[i]; // First try to find an existing schedule that already matches this day of week ViewItemSchedule existingSchedule = existingSchedules.FirstOrDefault(s => s.DayOfWeek == dayOfWeek); // If we couldn't find one, try picking a schedule that doesn't have any day of week matches if (existingSchedule == null) { existingSchedule = existingSchedules.FirstOrDefault(s => !DayOfWeeks.Contains(s.DayOfWeek)); } // Remove the schedule we added if (existingSchedule != null) { existingSchedules.Remove(existingSchedule); } DataItemSchedule dataItem = new DataItemSchedule() { Identifier = existingSchedule != null ? existingSchedule.Identifier : Guid.NewGuid(), UpperIdentifier = classId, StartTime = AsUtc(StartTime), EndTime = AsUtc(EndTime), Room = Room, DayOfWeek = dayOfWeek, ScheduleWeek = ScheduleWeek, ScheduleType = PowerPlannerSending.Schedule.Type.Normal }; updatedAndNewSchedules.Add(dataItem); } // Deleted schedules are any remaining existing schedules var deletedScheduleIds = existingSchedules.Select(i => i.Identifier).ToArray(); DataChanges changes = new DataChanges(); foreach (var s in updatedAndNewSchedules) { changes.Add(s); } foreach (var id in deletedScheduleIds) { changes.DeleteItem(id); } if (!changes.IsEmpty()) { await PowerPlannerApp.Current.SaveChanges(changes); } }, delegate { this.RemoveViewModel(); }); }