private void UpdateClassroomInstructors(string[] selectedInstructors, VirtualClassroom classroomToUpdate)
        {
            if (selectedInstructors == null)
            {
                classroomToUpdate.Instructors = new List <Instructor>();
                return;
            }

            var selectedInstructorsHs = new HashSet <string>(selectedInstructors);
            var classroomInstructors  = new HashSet <int>
                                            (classroomToUpdate.Instructors.Select(i => i.InstructorId));

            foreach (var instructor in _context.Instructors)
            {
                if (selectedInstructorsHs.Contains(instructor.InstructorId.ToString()))
                {
                    if (!classroomInstructors.Contains(instructor.InstructorId))
                    {
                        classroomToUpdate.Instructors.Add(instructor);
                    }
                }
                else
                {
                    if (classroomInstructors.Contains(instructor.InstructorId))
                    {
                        classroomToUpdate.Instructors.Remove(instructor);
                    }
                }
            }
        }
        private void UpdateClassroomStudents(string[] selectedStudents, VirtualClassroom classroomToUpdate)
        {
            if (selectedStudents == null)
            {
                classroomToUpdate.Students = new List <Student>();
                return;
            }

            var selectedStudentsHs = new HashSet <string>(selectedStudents);
            var classroomStudents  = new HashSet <int>
                                         (classroomToUpdate.Students.Select(i => i.StudentId));

            foreach (var student in _context.Students)
            {
                if (selectedStudentsHs.Contains(student.StudentId.ToString()))
                {
                    if (!classroomStudents.Contains(student.StudentId))
                    {
                        classroomToUpdate.Students.Add(student);
                    }
                }
                else
                {
                    if (classroomStudents.Contains(student.StudentId))
                    {
                        classroomToUpdate.Students.Remove(student);
                    }
                }
            }
        }
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            VirtualClassroom virtualInstructor =
                _context.VirtualClassrooms
                .Include(s => s.Instructors)
                .Single(v => v.Id == id);
            VirtualClassroom virtualStudent =
                _context.VirtualClassrooms
                .Include(s => s.Students)
                .Single(v => v.Id == id);

            PopulateAssignedInstructorData(virtualInstructor);
            PopulateAssignedStudentData(virtualStudent);
            VirtualClassroom virtualClassroom = _context.VirtualClassrooms.Find(id);

            if (virtualClassroom == null)
            {
                return(HttpNotFound());
            }
            ViewBag.CourseId   = new SelectList(_context.Courses, "Id", "Name", virtualClassroom.CourseId);
            ViewBag.SemesterId = new SelectList(_context.Semesters, "Id", "Title", virtualClassroom.SemesterId);
            return(View(virtualClassroom));
        }
        public ActionResult Create(VirtualClassroomFormViewModel viewModel, string[] selectedInstructors, string[] selectedStudents)
        {
            if (!ModelState.IsValid)
            {
                viewModel.Courses = _context.Courses.ToList();
                return(View("_Create", viewModel));
            }
            var virtualClassroom = new VirtualClassroom
            {
                AdministratorId = User.Identity.GetUserId(),
                ClassroomName   = viewModel.ClassroomName,
                SemesterId      = viewModel.SemesterId,
                CourseId        = viewModel.CourseId,
                Instructors     = new List <Instructor>(),
                Students        = new List <Student>()
            };

            foreach (var instructorId in selectedInstructors)
            {
                var instructors = _context.Instructors.Find(int.Parse(instructorId));
                virtualClassroom.Instructors.Add(instructors);
            }
            foreach (var studentId in selectedStudents)
            {
                var students = _context.Students.Find(int.Parse(studentId));
                virtualClassroom.Students.Add(students);
            }


            _context.VirtualClassrooms.Add(virtualClassroom);
            _context.SaveChanges();

            return(RedirectToAction("AdminIndex"));
        }
        public ActionResult Edit(int?id, string[] selectedInstructors, string[] selectedStudents)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            VirtualClassroom virtualInstructor =
                _context.VirtualClassrooms
                .Include(s => s.Instructors)
                .Single(v => v.Id == id);
            VirtualClassroom virtualStudent =
                _context.VirtualClassrooms
                .Include(s => s.Students)
                .Single(v => v.Id == id);

            if (TryUpdateModel(virtualInstructor, "",
                               new string[] { "Id", "ClassroomName", "CourseId", "SemesterId" }))
            {
                try
                {
                    UpdateClassroomInstructors(selectedInstructors, virtualInstructor);
                    UpdateClassroomStudents(selectedStudents, virtualStudent);
                    _context.SaveChanges();
                    return(RedirectToAction("AdminIndex"));
                }
                catch (RetryLimitExceededException)
                {
                    ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
                }
            }
            else if (TryUpdateModel(virtualStudent, "",
                                    new string[] { "Id", "ClassroomName", "CourseId", "SemesterId" }))
            {
                try
                {
                    UpdateClassroomStudents(selectedStudents, virtualStudent);
                    UpdateClassroomInstructors(selectedInstructors, virtualInstructor);
                    _context.SaveChanges();
                    return(RedirectToAction("AdminIndex"));
                }
                catch (RetryLimitExceededException)
                {
                    ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
                }
            }
            PopulateAssignedInstructorData(virtualInstructor);
            PopulateAssignedStudentData(virtualStudent);
            VirtualClassroom virtualClassroom = _context.VirtualClassrooms.Find(id);

            if (ModelState.IsValid)
            {
                _context.Entry(virtualClassroom).State = EntityState.Modified;
                _context.SaveChanges();
                return(RedirectToAction("AdminIndex"));
            }
            ViewBag.CourseId   = new SelectList(_context.Courses, "Id", "Name", virtualClassroom.CourseId);
            ViewBag.SemesterId = new SelectList(_context.Semesters, "Id", "Title", virtualClassroom.SemesterId);
            return(View(virtualClassroom));
        }
        private void PopulateAssignedStudentData(VirtualClassroom virtualClassroom)
        {
            var allStudents       = _context.Students.OrderBy(i => i.LastName);
            var classroomStudents = new HashSet <int>(virtualClassroom.Students.Select(c => c.StudentId));
            var viewModel         = new List <AssignedStudentData>();

            foreach (var student in allStudents)
            {
                viewModel.Add(new AssignedStudentData
                {
                    StudentId = student.StudentId,
                    FullName  = student.FullName,
                    Assigned  = classroomStudents.Contains(student.StudentId)
                });
            }
            ViewBag.Students = viewModel;
        }
        private void PopulateAssignedInstructorData(VirtualClassroom virtualClassroom)
        {
            var allInstructors       = _context.Instructors.OrderBy(i => i.LastName);
            var classroomInstructors = new HashSet <int>(virtualClassroom.Instructors.Select(c => c.InstructorId));
            var viewModel            = new List <AssignedInstructorData>();

            foreach (var instructor in allInstructors)
            {
                viewModel.Add(new AssignedInstructorData
                {
                    InstructorId = instructor.InstructorId,
                    FullName     = instructor.FullName,
                    Assigned     = classroomInstructors.Contains(instructor.InstructorId)
                });
            }
            ViewBag.Instructors = viewModel;
        }