public IActionResult Index(string sortOrder, string searchString, string SelectedRank, string SelectedGrade, int page = 1) { // init the VM class JobDescriptionListViewModel vm = new JobDescriptionListViewModel { // set the VM properties to the parameters CurrentFilter = searchString, CurrentSort = sortOrder, SelectedGrade = SelectedGrade, SelectedRank = SelectedRank, // set the sorts to the opposite of the current sortOrder to facilitate building sorting hyperlinks GradeSort = String.IsNullOrEmpty(sortOrder) ? "grade_desc" : "", NameSort = sortOrder == "JobName" ? "jobName_desc" : "JobName", RankSort = sortOrder == "Rank" ? "rank_desc" : "Rank" }; // lower any search string text to facilitate comparison. string lowerSearchString = ""; if (!String.IsNullOrEmpty(searchString)) { char[] arr = searchString.ToCharArray(); arr = Array.FindAll <char>(arr, (c => (char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-'))); lowerSearchString = new string(arr); lowerSearchString = lowerSearchString.ToLower(); } // Query for documents that match the provided parameters, if any, and convert them to List Items vm.Jobs = _repository.Jobs.Where(x => (String.IsNullOrEmpty(SelectedRank) || x.JobDataXml.Element("Rank").Value == SelectedRank) && (String.IsNullOrEmpty(SelectedGrade) || x.JobDataXml.Element("Grade").Value == SelectedGrade) && (String.IsNullOrEmpty(searchString) || x.JobName.ToLower().Contains(lowerSearchString))) .Skip((page - 1) * PageSize) .Take(PageSize) .ToList().ConvertAll(x => new JobDescriptionListViewModeltem(x)); // Separate Query to determine total number of matching documents, as the list above is Skip().Take() int totalItems = _repository.Jobs.Where(x => (String.IsNullOrEmpty(SelectedRank) || x.JobDataXml.Element("Rank").Value == SelectedRank) && (String.IsNullOrEmpty(SelectedGrade) || x.JobDataXml.Element("Grade").Value == SelectedGrade) && (String.IsNullOrEmpty(searchString) || x.JobName.ToLower().Contains(lowerSearchString))) .Count(); // Sort the list according to the provided sorting parameter, if any. Defaults to order by ascending Grade if no sorting parameter is present. switch (sortOrder) { case "grade_desc": vm.Jobs = vm.Jobs.OrderByDescending(x => x.Grade).ToList(); break; case "jobName_desc": vm.Jobs = vm.Jobs.OrderByDescending(x => x.JobName).ToList(); break; case "JobName": vm.Jobs = vm.Jobs.OrderBy(x => x.JobName).ToList(); break; case "rank_desc": vm.Jobs = vm.Jobs.OrderByDescending(x => x.Rank).ToList(); break; case "Rank": vm.Jobs = vm.Jobs.OrderBy(x => x.Rank).ToList(); break; default: vm.Jobs = vm.Jobs.OrderBy(x => x.Grade).ToList(); break; } // Set the PagingInfo to facilitate page control vm.PagingInfo = new PagingInfo { CurrentPage = page, TotalItems = totalItems, ItemsPerPage = PageSize }; // Populate the VM's lists to populate the search form drop downs vm.HydrateLists(_repository.Jobs.Select(x => x.JobDataXml.Element("Rank").Value).Distinct().ToList(), _repository.Jobs.Select(x => x.JobDataXml.Element("Grade").Value).Distinct().ToList()); ViewData["Title"] = "Job Descriptions List"; ViewData["ActiveNavBarMenuLink"] = "Job Descriptions"; return(View(vm)); }
public IActionResult UserIndex(string sortOrder, string searchString, string SelectedRank, string SelectedGrade, int page = 1) { JobDescriptionListViewModel vm = new JobDescriptionListViewModel(); vm.CurrentFilter = searchString; vm.CurrentSort = sortOrder; vm.SelectedGrade = SelectedGrade; vm.SelectedRank = SelectedRank; vm.GradeSort = String.IsNullOrEmpty(sortOrder) ? "grade_desc" : ""; vm.NameSort = sortOrder == "JobName" ? "jobName_desc" : "JobName"; vm.RankSort = sortOrder == "Rank" ? "rank_desc" : "Rank"; string lowerSearchString = ""; if (!String.IsNullOrEmpty(searchString)) { char[] arr = searchString.ToCharArray(); arr = Array.FindAll <char>(arr, (c => (char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-'))); lowerSearchString = new string(arr); lowerSearchString = lowerSearchString.ToLower(); } vm.Jobs = _repository.Jobs.Where(x => (String.IsNullOrEmpty(SelectedRank) || x.JobDataXml.Element("Rank").Value == SelectedRank) && (String.IsNullOrEmpty(SelectedGrade) || x.JobDataXml.Element("Grade").Value == SelectedGrade) && (String.IsNullOrEmpty(searchString) || x.JobName.ToLower().Contains(lowerSearchString))) .Skip((page - 1) * PageSize) .Take(PageSize) .ToList().ConvertAll(x => new JobDescriptionListViewModeltem(x)); int totalItems = _repository.Jobs.Where(x => (String.IsNullOrEmpty(SelectedRank) || x.JobDataXml.Element("Rank").Value == SelectedRank) && (String.IsNullOrEmpty(SelectedGrade) || x.JobDataXml.Element("Grade").Value == SelectedGrade) && (String.IsNullOrEmpty(searchString) || x.JobName.ToLower().Contains(lowerSearchString))) .Count(); switch (sortOrder) { case "grade_desc": vm.Jobs = vm.Jobs.OrderByDescending(x => x.Grade).ToList(); break; case "jobName_desc": vm.Jobs = vm.Jobs.OrderByDescending(x => x.JobName).ToList(); break; case "JobName": vm.Jobs = vm.Jobs.OrderBy(x => x.JobName).ToList(); break; case "rank_desc": vm.Jobs = vm.Jobs.OrderByDescending(x => x.Rank).ToList(); break; case "Rank": vm.Jobs = vm.Jobs.OrderBy(x => x.Rank).ToList(); break; default: vm.Jobs = vm.Jobs.OrderBy(x => x.Grade).ToList(); break; } vm.PagingInfo = new PagingInfo { CurrentPage = page, TotalItems = totalItems, ItemsPerPage = PageSize }; vm.HydrateLists(_repository.Jobs.Select(x => x.JobDataXml.Element("Rank").Value).Distinct().ToList(), _repository.Jobs.Select(x => x.JobDataXml.Element("Grade").Value).Distinct().ToList()); ViewData["Title"] = "Job Descriptions List"; ViewData["ActiveNavBarMenuLink"] = "Job Descriptions"; return(View(vm)); }