Exemple #1
0
        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);
        }
Exemple #2
0
        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();
            });
        }
Exemple #5
0
        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();
            }
        }
Exemple #6
0
        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();
            });
        }