public async Task <IActionResult> Create(CaseReportFormOptionGroupViewModel optionGroupVM)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var optionGroup = new CaseReportFormOptionGroup();
                    optionGroup.Name    = optionGroupVM.Name;
                    optionGroup.Choices = new List <CaseReportFormOptionChoice>();
                    foreach (string choiceName in optionGroupVM.Options)
                    {
                        var optionChoice = new CaseReportFormOptionChoice();
                        optionChoice.Name = choiceName;
                        optionChoice.CaseReportFormOptionGroup = optionGroup;
                        optionGroup.Choices.Add(optionChoice);
                    }

                    _context.Add(optionGroup);
                    await _context.SaveChangesAsync();

                    return(Json(new { result = "ok" }));
                }
                else
                {
                    Hashtable errors = ModelStateHelper.Errors(ModelState);
                    return(Json(new { success = false, errors }));
                }
            }
            catch (DbUpdateException)
            {
                return(null);
            }
        }
        private static void AddCaseResultFormDefaultOptionDropdowns(AspergillosisContext context)
        {
            var caseReportFormOptionGroups = new CaseReportFormOptionGroup[]
            {
                new CaseReportFormOptionGroup {
                    Name = "Specimen"
                },
                new CaseReportFormOptionGroup {
                    Name = "Serology Result"
                }
            };

            foreach (var item in caseReportFormOptionGroups)
            {
                context.Add(item);
            }

            var caseReportFormSerologyOptionChoices = new String[] {
                "Positive",
                "Weakly Positive",
                "Negative"
            };

            var caseReportFormSpecimenOptionChoices = new String[]
            {
                "Blood", "Sputum", "Fungal isolate"
            };

            var serologyOptionGroup = caseReportFormOptionGroups
                                      .Where(crfog => crfog.Name.Contains("Serology Result"))
                                      .FirstOrDefault();

            foreach (string serologyOptName in caseReportFormSerologyOptionChoices)
            {
                CaseReportFormOptionChoice serologyOpt = new CaseReportFormOptionChoice();
                serologyOpt.CaseReportFormOptionGroup = serologyOptionGroup;
                serologyOpt.Name = serologyOptName;
                context.CaseReportFormOptionChoices.Add(serologyOpt);
            }

            var specimenOptionGroup = caseReportFormOptionGroups
                                      .Where(crfog => crfog.Name.Contains("Specimen"))
                                      .FirstOrDefault();

            foreach (string serologyOptName in caseReportFormSpecimenOptionChoices)
            {
                CaseReportFormOptionChoice serologyOpt = new CaseReportFormOptionChoice();
                serologyOpt.CaseReportFormOptionGroup = specimenOptionGroup;
                serologyOpt.Name = serologyOptName;
                context.CaseReportFormOptionChoices.Add(serologyOpt);
            }
        }
        public IActionResult EditOptionGroupItem(int?id, CaseReportFormOptionGroupViewModel optionGroup)
        {
            if (id == null)
            {
                return(NotFound());
            }
            var foundItem = _context.CaseReportFormOptionGroups
                            .Include(crfog => crfog.Choices)
                            .Where(crfc => crfc.ID == id)
                            .FirstOrDefault();

            if (foundItem == null)
            {
                return(NotFound());
            }
            var optionsNames     = optionGroup.Options;
            var dbOptionsChoices = foundItem.Choices.Select(c => c.Name).ToList();
            var dbOptionsItems   = foundItem.Choices.ToList();
            var toDeleteOptions  = dbOptionsChoices.Except(optionsNames);
            var toInsertOptions  = optionsNames.Except(dbOptionsChoices);

            if (toDeleteOptions.Count() > 0)
            {
                var dbDeleteList = _context.CaseReportFormOptionChoices
                                   .Where(crfoc => toDeleteOptions.Contains(crfoc.Name) && crfoc.CaseReportFormOptionGroupId == id);
                _context.CaseReportFormOptionChoices.RemoveRange(dbDeleteList);
            }
            if (toInsertOptions.Count() > 0)
            {
                foreach (var optionName in toInsertOptions)
                {
                    var option = new CaseReportFormOptionChoice()
                    {
                        CaseReportFormOptionGroupId = id.Value,
                        Name = optionName
                    };
                    _context.CaseReportFormOptionChoices.Add(option);
                }
            }
            foundItem.Name = optionGroup.Name;
            if (TryValidateModel(foundItem))
            {
                try
                {
                    _context.Update(foundItem);
                    _context.SaveChanges();
                }
                catch (DbUpdateException /* ex */)
                {
                    ModelState.AddModelError("", "Unable to save changes. " +
                                             "Try again, and if the problem persists, " +
                                             "see your system administrator.");
                }
            }
            else
            {
                Hashtable errors = ModelStateHelper.Errors(ModelState);
                return(Json(new { success = false, errors }));
            }

            return(Json(new { result = "ok" }));
        }