private static void LoadItemIntoSection(XmlElement e, ref QuestionnaireSection section) { QuestionnaireItem item = new QuestionnaireItem(); item.ActionId = GetNodeValue(e, "ActionId"); item.DisplayId = GetNodeValue(e, "DisplayId"); item.Attributes = QuestionnaireItemAttributes.CanSkip; //TODO item.ScoringNote = GetNodeValue(e, "ScoringNote"); if (GetNodeValue(e, "BestScore") == "Highest") { item.HigherIsBetter = true; } else { item.HigherIsBetter = false; } try { item.SummaryText = GetNodeValue(e, "Summary"); } catch (Exception exp) { Error = "The summary: \n doesn't exist"; Form1.Print("The summary: doesn't exist" + exp.ToString()); logReport.returnError("The summary: doesn't exist" + exp.ToString()); } QuestionnaireElement x = item; LoadTextVersionsIntoElement(e, ref x); LoadOptionGroupsIntoItem(e, ref item); section.Elements.Add(item); }
private int DiveV1(int index, int level, List <Questionnaire.ItemComponent> itemComponents, QuestionnaireItem[] questionnaireItems) { int currentIndex = index; Questionnaire.ItemComponent item = null; for (; currentIndex < questionnaireItems.Length; currentIndex++) { QuestionnaireItem questionnaireItem = questionnaireItems[currentIndex]; _logger.LogDebug($"Questionnaire Item: {questionnaireItem.LinkId} - {questionnaireItem.Type} - {questionnaireItem.Text}"); int currentLevel = questionnaireItem.LinkId.Split('.').Length - 1; if (currentLevel == level) { item = CreateItemComponentV1(questionnaireItem); itemComponents.Add(item); } else if (currentLevel > level) { if (item == null) { throw new Exception("LinkId cannot bypass a level, i.e. jumping from 1.1 to 1.1.1.1"); } currentIndex = DiveV1(currentIndex, currentLevel, item.Item, questionnaireItems); } else if (currentLevel < level) { // If current level is less than the entry level then break out of loop and return from recursion level. break; } } return(currentIndex - 1); }
protected void vQuestionnaire_List_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { QuestionnaireItem QuestionnaireItem = (QuestionnaireItem)e.Item.DataItem; string Result = ""; if (_Results.Count() > 0) { Result = _Results[e.Item.ItemIndex].Split(':')[1]; } //vTitle Literal vTitle = (Literal)e.Item.FindControl("vTitle"); vTitle.Text = string.Format("{0}. {1}", QuestionnaireItem.Sort.ToString(), QuestionnaireItem.Title); //QuestionnaireItem switch (QuestionnaireItem.OptionType) { case OptionType.單選: RadioButtonList vRadioButtonList = (RadioButtonList)e.Item.FindControl("vRadioButtonList"); vRadioButtonList.Visible = true; foreach (string Option in QuestionnaireItem.Options) { vRadioButtonList.Items.Add(new ListItem(Option, Option)); } vRadioButtonList.SelectedValue = Result; break; case OptionType.多選: CheckBoxList vCheckBoxList = (CheckBoxList)e.Item.FindControl("vCheckBoxList"); vCheckBoxList.Visible = true; foreach (string Option in QuestionnaireItem.Options) { vCheckBoxList.Items.Add(new ListItem(Option, Option)); } vCheckBoxList.SelectedValue = Result; break; case OptionType.單行文字方塊: Repeater vTextBoxList = (Repeater)e.Item.FindControl("vTextBoxList"); vTextBoxList.Visible = true; //將單行文字方塊要 Render 的格式改成 "標題:答案",並傳給 ItemDataBound List <string> QAs = new List <string>(); for (int i = 0; i < QuestionnaireItem.Options.Count(); i++) { string Option = QuestionnaireItem.Options[i]; QAs.Add(string.Format("{0}:{1}", Option, (string.IsNullOrWhiteSpace(Result)) ? "" : Result.Split(',')[i])); } vTextBoxList.DataSource = QAs; vTextBoxList.DataBind(); break; } } }
private static void LoadOptionGroupsIntoItem(XmlElement i, ref QuestionnaireItem item) { foreach (XmlElement og in i.GetElementsByTagName("OptionGroup")) { QuestionnaireItemOptionGroup opgrp = new QuestionnaireItemOptionGroup(); LoadOptionGroup(og, ref opgrp); } }
/// <summary> /// Filters an items TextVersion instances /// </summary> /// <param name="item">The item to filter in</param> /// <param name="instance">The instance to filter on</param> /// <param name="platform">The platform to filter on</param> /// <param name="audience">The audience to filter on</param> internal static void Filter(ref QuestionnaireItem item, Instance instance, Platform platform, UserTypes audience) { item.TextVersions = item.TextVersions.Where(i => i.SupportsInstance(instance) && i.SupportsPlatform(platform) && i.SupportsAudience(audience)).ToList(); item.Instructions = item.Instructions.Where(i => i.SupportsInstance(instance) && i.SupportsPlatform(platform) && i.SupportsAudience(audience)).ToList(); if (item.OptionGroups != null) { foreach (QuestionnaireItemOptionGroup group in item.OptionGroups) { group.TextVersions = group.TextVersions.Where(i => i.SupportsInstance(instance) && i.SupportsPlatform(platform) && i.SupportsAudience(audience)).ToList(); } } }
/// <summary> /// Updates all the text inside the Questionnaire with the proper replacement values. /// Includes, Instructions, TextVersions, DefaultValues, etc. /// </summary> /// <param name="q">The questionnaire to update</param> /// <param name="objectsForParsing">Any objects that are available should be passed on as they may be used as part of the parsing process.</param> public void UpdateQuestionnaireTexts(Questionnaire q, Dictionary <ReplaceableObjectKeys, object> objectsForParsing) { ReplaceableRetriever retriever = new ReplaceableRetriever(this.ahm, objectsForParsing); TextParser <ReplaceableObjectKeys> parser = new TextParser <ReplaceableObjectKeys>(); foreach (QuestionnaireSection section in q.Sections) { foreach (TextVersion v in section.Instructions) { v.Text = parser.ParseMessage(v.Text, retriever); } foreach (QuestionnaireElement element in section.Elements) { foreach (TextVersion v in element.TextVersions) { v.Text = parser.ParseMessage(v.Text, retriever); } if (element.GetType() == typeof(QuestionnaireItem)) { QuestionnaireItem item = (QuestionnaireItem)element; foreach (TextVersion v in item.TextVersions) { v.Text = parser.ParseMessage(v.Text, retriever); } item.SummaryText = parser.ParseMessage(item.SummaryText, retriever); foreach (QuestionnaireItemOptionGroup group in item.OptionGroups) { foreach (TextVersion v in group.TextVersions) { v.Text = parser.ParseMessage(v.Text, retriever); } group.DefaultValue = parser.ParseMessage(group.DefaultValue, retriever); foreach (QuestionnaireItemOption option in group.Options) { option.DefaultValue = parser.ParseMessage(option.DefaultValue, retriever); option.Text = parser.ParseMessage(option.Text, retriever); } } } } } }
/// <summary> /// Filtes the different text versions inside a Questionnaire and it's sections and items down the line. /// </summary> /// <param name="q">The questionnaire to modify</param> /// <param name="instance">The instance to filter on</param> /// <param name="platform">The platform to filter on</param> /// <param name="audience">The audience to filter on</param> public static void Filter(ref Questionnaire q, Instance instance, Platform platform, UserTypes audience) { q.IntroductionMessages = q.IntroductionMessages.Where(i => i.SupportsInstance(instance) && i.SupportsPlatform(platform) && i.SupportsAudience(audience)).ToList(); q.Descriptions = q.Descriptions.Where(i => i.SupportsInstance(instance) && i.SupportsPlatform(platform) && i.SupportsAudience(audience)).ToList(); foreach (QuestionnaireSection s in q.Sections) { s.Instructions = s.Instructions.Where(i => i.SupportsInstance(instance) && i.SupportsPlatform(platform) && i.SupportsAudience(audience)).ToList(); foreach (QuestionnaireElement e in s.Elements) { e.TextVersions = e.TextVersions.Where(i => i.SupportsInstance(instance) && i.SupportsPlatform(platform) && i.SupportsAudience(audience)).ToList(); if (e.GetType() == typeof(QuestionnaireItem)) { QuestionnaireItem item = (QuestionnaireItem)e; Utilities.Filter(ref item, instance, platform, audience); } } } }
private static void LoadItemIntoSection(XmlElement e, ref QuestionnaireSection section) { QuestionnaireItem item = new QuestionnaireItem(); item.ActionId = GetNodeValue(e, "ActionId"); item.DisplayId = GetNodeValue(e, "DisplayId"); item.Attributes = QuestionnaireItemAttributes.CanSkip; //TODO item.SummaryText = GetNodeValue(e, "Summary"); QuestionnaireElement x = item; LoadTextVersionsIntoElement(e, ref x); LoadOptionGroupsIntoItem(e, ref item); section.Elements.Add(item); }
protected void Page_Load(object sender, EventArgs e) { if (IsPostBack == false) { _Argument = LeftHand.Gadget.Encoder.DictionaryDecoder(Server.UrlDecode(Request.QueryString.ToString())); } switch (_Argument["Mode"]) { case "Add": _QuestionnaireItem = new QuestionnaireItem("", "", OptionType.單選); break; case "Edit": _QuestionnaireItem = QuestionnaireItemManager.GetById(_Argument["Id"]); break; } }
private QuestionnaireItem AddItemToSection(QuestionnaireSection section, string actionId, string displayId, string text, Platform platform, Instance instance) { QuestionnaireItem item = new QuestionnaireItem() { ActionId = actionId, DisplayId = displayId, OrderInSection = section.Elements.Count + 1, Section = section, }; item.TextVersions.Add(new QuestionnaireElementTextVersion() { SupportedInstances = instance, SupportedPlatforms = platform, Text = text }); section.Elements.Add(item); return(item); }
/// <summary> /// Gets the full questionniare. Only the Id or the name has to be provided /// </summary> /// <param name="id">The Id of the questionnaire. If null or empty is not used</param> /// <param name="name">The name of the questionniare. If null or empty is not used</param> /// <returns>The questionniare requested</returns> private Questionnaire GetFullQuestionnaire(int?id = null, string name = null) { Questionnaire result = this.QuestionnaireQuery(id, name).SingleOrDefault(); if (result == null) { return(null); } if (result.GetType() == typeof(ProInstrument)) { ProInstrument ins = (ProInstrument)result; ins.Domains = this.context.ProDomains.Where(d => d.Instrument.Id == result.Id).Include(d => d.ResultRanges).ToList(); } result.Tags = this.context.QuestionnaireTags.Where(q => q.QuestionnaireName == result.Name).Select(q => q.Tag).ToList(); result.Sections = result.Sections.OrderBy(p => p.OrderInInstrument).ToList(); foreach (QuestionnaireSection section in result.Sections) { section.Instructions.Count(); section.Elements = section.Elements.OrderBy(e => e.OrderInSection).ToList(); foreach (QuestionnaireElement el in section.Elements) { if (el.GetType() == typeof(QuestionnaireItem)) { QuestionnaireItem item = (QuestionnaireItem)el; item.OptionGroups = item.OptionGroups.OrderBy(o => o.OrderInItem).ToList(); item.OptionGroups = this.context.QuestionnaireItemOptionGroups.Where(og => og.Item.Id == item.Id).Include(og => og.Options).ToList(); foreach (QuestionnaireItemOptionGroup g in item.OptionGroups) { g.TextVersions = this.context.QuestionnaireItemOptionGroupTextVersions.Where(tv => tv.QuestionnaireItemOptionGroup.Id == g.Id).ToList(); g.Options = g.Options.OrderBy(o => o.OrderInGroup).ToList(); } item.Instructions = this.context.QuestionnaireItemInstructions.Where(i => i.Item.Id == item.Id).ToList(); } } } return(result); }
private QuestionnaireItemOptionGroup AddOptionGroupToItem(QuestionnaireItem item, MyDictionary options, int rangeStep, QuestionnaireResponseType type) { QuestionnaireItemOptionGroup qog = new QuestionnaireItemOptionGroup(); qog.OrderInItem = item.OptionGroups.Count + 1; qog.RangeStep = rangeStep; qog.ResponseType = type; foreach (int v in options.Keys) { qog.Options.Add(new QuestionnaireItemOption() { Text = options[v].Text, Value = v, Group = qog, Action = options[v].Action }); } qog.Item = item; item.OptionGroups.Add(qog); return(qog); }
protected void vQuestionnaireItem_List_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { QuestionnaireItem QuestionnaireItem = (QuestionnaireItem)e.Item.DataItem; //vTitle Label vTitle = (Label)e.Item.FindControl("vTitle"); vTitle.Text = QuestionnaireItem.Title; //vShortTitle Label vShortTitle = (Label)e.Item.FindControl("vShortTitle"); vShortTitle.Text = string.Format("( {0} )", QuestionnaireItem.ShortTitle); //vOptionType Label vOptionType = (Label)e.Item.FindControl("vOptionType"); vOptionType.Text = string.Format("類型:{0}", QuestionnaireItem.OptionType.ToString()); //vOption_List Repeater vOption_List = (Repeater)e.Item.FindControl("vOption_List"); vOption_List.DataSource = QuestionnaireItem.Options; vOption_List.DataBind(); //Sort Literal vSort = (Literal)e.Item.FindControl("vSort"); vSort.Text = QuestionnaireItem.Sort.ToString(); //Edit Dictionary <string, string> Argument = new Dictionary <string, string>(); Argument.Add("Mode", "Edit"); Argument.Add("Id", QuestionnaireItem.Id); HyperLink vEdit = (HyperLink)e.Item.FindControl("vEdit"); vEdit.NavigateUrl = "/Order/Manager/QuestionnaireItem_Modify.aspx?" + Server.UrlEncode(LeftHand.Gadget.Encoder.DictionaryEncoder(Argument)); } }
private IList <Questionnaire> GetQuestionnairesFromFlatFileFormatV1(string path) { if (string.IsNullOrWhiteSpace(path)) { throw new ArgumentNullException(nameof(path)); } if (!File.Exists(path)) { throw new FileNotFoundException($"File not found: '{path}'", path); } IList <Questionnaire> questionnaires = new List <Questionnaire>(); var engine = new MasterDetailEngine <QuestionnaireHeader, QuestionnaireItem>(new MasterDetailSelector(RecordSelector)) { Encoding = new UTF8Encoding() }; MasterDetails <QuestionnaireHeader, QuestionnaireItem>[] masterDetails = engine.ReadFile(path); foreach (MasterDetails <QuestionnaireHeader, QuestionnaireItem> masterDetail in masterDetails) { _logger.LogDebug($"Questionnaire: {masterDetail.Master.Name} - {masterDetail.Master.Title}"); Questionnaire questionnaire = new Questionnaire(); questionnaire.Meta = new Meta { Profile = new string[] { "http://ehelse.no/fhir/StructureDefinition/sdf-Questionnaire" } }; questionnaire.Id = string.IsNullOrWhiteSpace(masterDetail.Master.Id) ? null : masterDetail.Master.Id; questionnaire.Url = string.IsNullOrWhiteSpace(masterDetail.Master.Url) ? null : masterDetail.Master.Url; questionnaire.Version = string.IsNullOrWhiteSpace(masterDetail.Master.Version) ? null : masterDetail.Master.Version; questionnaire.Name = string.IsNullOrWhiteSpace(masterDetail.Master.Name) ? null : masterDetail.Master.Name; questionnaire.Title = string.IsNullOrWhiteSpace(masterDetail.Master.Title) ? null : masterDetail.Master.Title; questionnaire.Status = string.IsNullOrWhiteSpace(masterDetail.Master.Status) ? null : EnumUtility.ParseLiteral <PublicationStatus>(masterDetail.Master.Status); questionnaire.Date = string.IsNullOrWhiteSpace(masterDetail.Master.Date) ? null : masterDetail.Master.Date; questionnaire.Publisher = string.IsNullOrWhiteSpace(masterDetail.Master.Publisher) ? null : masterDetail.Master.Publisher; questionnaire.Description = string.IsNullOrWhiteSpace(masterDetail.Master.Description) ? null : new Markdown(masterDetail.Master.Description); questionnaire.Purpose = string.IsNullOrWhiteSpace(masterDetail.Master.Purpose) ? null : new Markdown(masterDetail.Master.Purpose); questionnaire.Contact = string.IsNullOrWhiteSpace(masterDetail.Master.Contact) ? null : new List <ContactDetail> { new ContactDetail { Telecom = new List <ContactPoint> { new ContactPoint { System = ContactPoint.ContactPointSystem.Url, Value = masterDetail.Master.Contact } } } }; if (!string.IsNullOrWhiteSpace(masterDetail.Master.Language)) { questionnaire.Language = masterDetail.Master.Language; // TODO: Vi trenger definere Visningsnavn for språket, eksempelvis: Norsk (bokmål), osv. questionnaire.Meta.Tag.Add(new Coding("urn:ietf:bcp:47", questionnaire.Language)); } IList <string> linkIds = new List <string>(); Questionnaire.ItemComponent item = null; for (int i = 0; i < masterDetail.Details.Length; i++) { QuestionnaireItem questionnaireItem = masterDetail.Details[i]; if (linkIds.IndexOf(questionnaireItem.LinkId) > 0) { throw new DuplicateLinkIdException(questionnaireItem.LinkId); } _logger.LogDebug($"Questionnaire Item: {questionnaireItem.LinkId} - {questionnaireItem.Type} - {questionnaireItem.Text}"); int level = questionnaireItem.LinkId.Split('.').Length - 1; if (level > 0) { i = DiveV1(i, level, item.Item, masterDetail.Details); } else { item = CreateItemComponentV1(questionnaireItem); questionnaire.Item.Add(item); } } questionnaires.Add(questionnaire); } return(questionnaires); }
public static void FillResponse(QuestionnaireItem i) { if (i is ChoiceQuestion) { var cq = (ChoiceQuestion)i; cq.Choices[0].IsSelected = true; if (cq.Choices[0].ContingencyQuestion != null) { FillResponse(cq.Choices[0].ContingencyQuestion); } } else if (i is DateQuestion) { ((DateQuestion)i).ResponseValue = DateTime.Now; } else if (i is IntegerQuestion) { ((IntegerQuestion)i).ResponseValue = 100; } else if (i is MatrixQuestion) { var q = i as MatrixQuestion; var columns = q.ColumnSection; //Create response of each column foreach (var j in columns.Children) { FillResponse(j); } //Create response of each row question foreach (var rq in q.Children) { columns.CreateOrUpdateResponseValue(); rq.ResponseValue = columns.ResponseValue; } //q.CreateResponseValue(); } else if (i is MoneyQuestion) { ((MoneyQuestion)i).ResponseValue = 1234.56m; } else if (i is RealNumberQuestion) { ((RealNumberQuestion)i).ResponseValue = 11111.1234d; } else if (i is TextQuestion) { ((TextQuestion)i).ResponseValue = "Text response " + DateTime.Now.ToUniversalTime(); } else if (i is BasicQuestionSection) { var q = i as BasicQuestionSection; foreach (var rq in q.Children) { FillResponse(rq); } } else if (i is GeneralItemSection) { var q = i as GeneralItemSection; foreach (var rq in q.Children) { FillResponse(rq); } } }
public void AddFullProInstrumentTest() { ProInstrument pro = new ProInstrument(); pro.Name = "OES2"; pro.Status = QuestionnaireStatus.Indevelopment; pro.IsActive = true; pro.Tags.Add(new Tag() { TagName = "Gender", Value = "Male" }); pro.Tags.Add(new Tag() { TagName = "Gender", Value = "Female" }); { ProDomain d1 = new ProDomain(); d1.Name = "Total Domain"; d1.Audience = PCHI.Model.Users.UserTypes.Patient; d1.Description = "Hello"; d1.ScoreFormula = "{OES.1} + {OES.2}"; { ProDomainResultRange r1 = new ProDomainResultRange(); r1.Start = 0; r1.End = 10; r1.Meaning = "Great"; d1.ResultRanges.Add(r1); } { ProDomainResultRange r2 = new ProDomainResultRange(); r2.Start = 11; r2.End = 20; r2.Meaning = "Oops"; d1.ResultRanges.Add(r2); } pro.Domains.Add(d1); } { ProDomain d2 = new ProDomain(); d2.Name = "Sleep Domain"; d2.Audience = PCHI.Model.Users.UserTypes.Patient; d2.Description = "Hello"; d2.ScoreFormula = "{OES.1} + {OES.2}"; { ProDomainResultRange r1 = new ProDomainResultRange(); r1.Start = 0; r1.End = 10; r1.Meaning = "Great"; d2.ResultRanges.Add(r1); } { ProDomainResultRange r2 = new ProDomainResultRange(); r2.Start = 11; r2.End = 20; r2.Meaning = "Oops"; d2.ResultRanges.Add(r2); } pro.Domains.Add(d2); } pro.Concept = new QuestionnaireConcept() { Name = "Elbow", Description = "Tests Elbow Condition" }; { QuestionnaireSection section = new QuestionnaireSection() { OrderInInstrument = 1, Questionnaire = pro }; pro.Sections.Add(section); AddTextToSection(section, "Intro1", @"", Platform.Classic | Platform.Chat, Instance.Baseline | Instance.Followup); AddTextToSection(section, "Intro2", @"Please make sure you answer all the questions that follow by ticking one option for every question.", Platform.Classic | Platform.Chat, Instance.Baseline | Instance.Followup); } { //Dictionary<int, string> options = null; //var options;// = new MyDictionary(); QuestionnaireSection section = new QuestionnaireSection() { OrderInInstrument = 2, Questionnaire = pro }; pro.Sections.Add(section); { // same options apply to items 1 to 4 MyDictionary options = new MyDictionary() { { 4, new ValuesOption() { Action = "", Text = "No difficulty" } }, { 3, new ValuesOption() { Action = "", Text = "A little bit of difficulty" } }, { 2, new ValuesOption() { Action = "", Text = "Moderate difficulty" } }, { 1, new ValuesOption() { Action = "", Text = "Extreme difficulty" } }, { 0, new ValuesOption() { Action = "", Text = "Impossible to do" } } }; QuestionnaireItem qi = AddItemToSection(section, "OES.1", "1.", @"<strong>During the past 4 weeks</strong>, have you had difficulty lifting things in your home, such as putting out the rubbish, <u>because of your elbow problem</u>?", Platform.Classic | Platform.Chat, Instance.Baseline | Instance.Followup); AddOptionGroupToItem(qi, options, 0, QuestionnaireResponseType.List); qi = AddItemToSection(section, "OES.2", "2.", @"<strong>During the past 4 weeks</strong>, have you had difficulty lifting things in your home, such as putting out the rubbish, <u>because of your elbow problem</u>?", Platform.Classic | Platform.Chat, Instance.Baseline | Instance.Followup); AddOptionGroupToItem(qi, options, 0, QuestionnaireResponseType.List); qi = AddItemToSection(section, "OES.3", "3.", @"<strong>During the past 4 weeks</strong>, have you had difficulty washing yourself all over, <u>because of your elbow problem</u>?", Platform.Classic | Platform.Chat, Instance.Baseline | Instance.Followup); AddOptionGroupToItem(qi, options, 0, QuestionnaireResponseType.List); qi = AddItemToSection(section, "OES.4", "4.", @"<strong>During the past 4 weeks</strong>, have you had difficulty dressing yourself, <u>because of your elbow problem</u>?", Platform.Classic | Platform.Chat, Instance.Baseline | Instance.Followup); AddOptionGroupToItem(qi, options, 0, QuestionnaireResponseType.List); qi = AddItemToSection(section, "OES.5", "5.", @"How difficult is for you to get up and down off the floor/gound?", Platform.Classic | Platform.Chat, Instance.Baseline | Instance.Followup); options = new MyDictionary() { { 0, new ValuesOption() { Action = "", Text = "Extreme difficulty" } }, { 100, new ValuesOption() { Action = "", Text = "No difficulty at all" } } }; AddOptionGroupToItem(qi, options, 10, QuestionnaireResponseType.Range); qi = AddItemToSection(section, "OES.6", "6.", @"How much trouble do you have with sexual activity because of your hip?", Platform.Classic | Platform.Chat, Instance.Baseline | Instance.Followup); options = new MyDictionary() { { 0, new ValuesOption() { Action = "MakeItemNotApplicable", Text = "This is not relevant to me" } } }; AddOptionGroupToItem(qi, options, 0, QuestionnaireResponseType.ConditionalItem); options = new MyDictionary() { { 0, new ValuesOption() { Action = "", Text = "Several trouble" } }, { 100, new ValuesOption() { Action = "", Text = "No trouble at all" } } }; AddOptionGroupToItem(qi, options, 10, QuestionnaireResponseType.Range); qi = AddItemToSection(section, "OES.7", "7.", @"How much trouble do you have pushing, pulling, lifting or carrying heavy objects at work?", Platform.Classic | Platform.Chat, Instance.Baseline | Instance.Followup); options = new MyDictionary() { { 0, new ValuesOption() { Action = "MakeItemNotApplicable", Text = "I do not do these actions in my activities" } } }; AddOptionGroupToItem(qi, options, 0, QuestionnaireResponseType.ConditionalItem); options = new MyDictionary() { { 0, new ValuesOption() { Action = "", Text = "Several trouble" } }, { 100, new ValuesOption() { Action = "", Text = "No trouble at all" } } }; AddOptionGroupToItem(qi, options, 10, QuestionnaireResponseType.Range); qi = AddItemToSection(section, "OES.8", "8.", @"How concern are you about cutting/changing directions during your sport or recreational activities?", Platform.Classic | Platform.Chat, Instance.Baseline | Instance.Followup); options = new MyDictionary() { { 0, new ValuesOption() { Action = "MakeItemNotApplicable", Text = "I do not do this action in my activities" } } }; AddOptionGroupToItem(qi, options, 0, QuestionnaireResponseType.ConditionalItem); options = new MyDictionary() { { 0, new ValuesOption() { Action = "", Text = "Extremly concerned" } }, { 100, new ValuesOption() { Action = "", Text = "Not concerned at all" } } }; AddOptionGroupToItem(qi, options, 10, QuestionnaireResponseType.Range); qi = AddItemToSection(section, "OES.9", "9.", @"Please indicate the sport or instrument which is most important to you:", Platform.Classic | Platform.Chat, Instance.Baseline | Instance.Followup); options = new MyDictionary() { { 0, new ValuesOption() { Action = "", Text = "" } } }; AddOptionGroupToItem(qi, options, 0, QuestionnaireResponseType.Text); qi = AddItemToSection(section, "OES.10", "10.", @"Enter your comments below:", Platform.Classic | Platform.Chat, Instance.Baseline | Instance.Followup); AddOptionGroupToItem(qi, options, 0, QuestionnaireResponseType.Text); //Part to add the definition for the body control qi = AddItemToSection(section, "OES.11", "11.", @"Select the parts of your body with some kind of mal functioning:", Platform.Classic | Platform.Chat, Instance.Baseline | Instance.Followup); options = new MyDictionary() { { 0, new ValuesOption() { Action = "", Text = "Burning" } }, { 1, new ValuesOption() { Action = "", Text = "Numbness" } }, { 2, new ValuesOption() { Action = "", Text = "Pins-Needles" } }, { 3, new ValuesOption() { Action = "", Text = "Stabbing" } }, { 4, new ValuesOption() { Action = "", Text = "Ache" } } }; AddOptionGroupToItem(qi, options, 0, QuestionnaireResponseType.MultiSelect); //Optiongroup for each body part /* * qiog1.OrderInItem = 1; * { * qiog1.Options.Add(new QuestionnaireItemOption() { Text = "None", Value = 0, Group = qiog1 }); * qiog1.Options.Add(new QuestionnaireItemOption() { Text = "Mild", Value = 1, Group = qiog1 }); * qiog1.Options.Add(new QuestionnaireItemOption() { Text = "Moderate", Value = 2, Group = qiog1 }); * qiog1.Options.Add(new QuestionnaireItemOption() { Text = "Severe", Value = 3, Group = qiog1 }); * qiog1.Options.Add(new QuestionnaireItemOption() { Text = "Unbearable", Value = 4, Group = qiog1 }); * qiog1.Item = q1; * } * * q1.OptionGroups.Add(qiog1); * section.Elements.Add(q1); * q1.Section = section; * */ } } { QuestionnaireSection section = new QuestionnaireSection() { OrderInInstrument = 3, Questionnaire = pro }; pro.Sections.Add(section); AddTextToSection(section, "Footer1", @"Thank you for answering. You are done now and the results will be reported to your physician.", Platform.Classic, Instance.Baseline | Instance.Followup); AddTextToSection(section, "Footer1", @"Thank you for answering. You are done now and I will evaluate the results as soon as possible.", Platform.Chat, Instance.Baseline | Instance.Followup); } new AccessHandlerManager().QuestionnaireAccessHandler.AddFullQuestionnaire(pro); }
private static Questionnaire.ItemComponent CreateItemComponentV1(QuestionnaireItem item) { Questionnaire.QuestionnaireItemType?itemType = EnumUtility.ParseLiteral <Questionnaire.QuestionnaireItemType>(item.Type); if (!itemType.HasValue) { throw new Exception($"QuestionnaireItemType at question with linkId: {item.LinkId} is not conforming to any valid literals. QuestionnaireItemType: {item.Type}"); } Questionnaire.ItemComponent itemComponent = new Questionnaire.ItemComponent { Type = itemType, }; itemComponent.LinkId = string.IsNullOrWhiteSpace(item.LinkId) ? null : item.LinkId; itemComponent.Prefix = string.IsNullOrWhiteSpace(item.Prefix) ? null : item.Prefix; itemComponent.Text = string.IsNullOrWhiteSpace(item.Text) ? null : item.Text; if (!string.IsNullOrWhiteSpace(item.EnableWhen)) { itemComponent.EnableWhen = ParseEnableWhen(item.EnableWhen).ToList(); // TODO: Defaults to 'any' in the first iteration of "migrate to R4". itemComponent.EnableBehavior = Questionnaire.EnableWhenBehavior.Any; } if (itemType != Questionnaire.QuestionnaireItemType.Group && itemType != Questionnaire.QuestionnaireItemType.Display) { itemComponent.Required = item.Required.HasValue ? item.Required : null; itemComponent.ReadOnly = item.ReadOnly; itemComponent.Initial = string.IsNullOrEmpty(item.Initial) ? null : new List <Questionnaire.InitialComponent> { new Questionnaire.InitialComponent { Value = GetElement(itemType.Value, item.Initial) } }; } if (itemType != Questionnaire.QuestionnaireItemType.Display) { itemComponent.Repeats = item.Repeats; } if (!string.IsNullOrWhiteSpace(item.ValidationText)) { itemComponent.SetStringExtension(Constants.ValidationTextUri, item.ValidationText); } if (!string.IsNullOrWhiteSpace(item.ReferenceValue) && item.ReferenceValue.IndexOf('#') == 0) { itemComponent.AnswerValueSetElement = new Canonical($"#{item.ReferenceValue.Substring(1)}"); } if (!string.IsNullOrWhiteSpace(item.EntryFormat)) { itemComponent.SetStringExtension(Constants.EntryFormatUri, item.EntryFormat); } if (item.MaxValue.HasValue) { itemComponent.SetIntegerExtension(Constants.MaxValueUri, item.MaxValue.Value); } if (item.MinValue.HasValue) { itemComponent.SetIntegerExtension(Constants.MinValueUri, item.MinValue.Value); } return(itemComponent); }
public static void Initialize(QuestionnairesContext context) { context.Database.EnsureCreated(); if (context.Questionnaires.Any()) { return; //If this happens the DB already exists and has been seeded with test data } var questionnaires = new Questionnaire[] { new Questionnaire { Title = "Example questionnaire", IntroText = "A questionnaire on an example topic" } }; foreach (Questionnaire q in questionnaires) { context.Questionnaires.Add(q); } context.SaveChanges(); var sections = new QuestionnaireSection[] { new QuestionnaireSection { QuestionnaireID = 1, Title = "Section 1", IntroText = "Intro 1" }, new QuestionnaireSection { QuestionnaireID = 1, Title = "Section 2", IntroText = "Intro 2" } }; foreach (QuestionnaireSection s in sections) { context.QuestionnaireSections.Add(s); } context.SaveChanges(); var items = new QuestionnaireItem[] { new QuestionnaireItem { QuestionnaireSectionID = 1, ItemText = "Item 1", ItemType = ItemTypes.Text }, new QuestionnaireItem { QuestionnaireSectionID = 1, ItemText = "Item 2", ItemType = ItemTypes.Value }, new QuestionnaireItem { QuestionnaireSectionID = 1, ItemText = "Item 3", ItemType = ItemTypes.Likert }, new QuestionnaireItem { QuestionnaireSectionID = 2, ItemText = "Item 4", ItemType = ItemTypes.Text }, new QuestionnaireItem { QuestionnaireSectionID = 2, ItemText = "Item 5", ItemType = ItemTypes.Value }, new QuestionnaireItem { QuestionnaireSectionID = 2, ItemText = "Item 6", ItemType = ItemTypes.Likert } }; foreach (QuestionnaireItem i in items) { context.QuestionnaireItems.Add(i); } context.SaveChanges(); }
protected void vSendButton_Click(object sender, EventArgs e) { try { List <string> Errors = new List <string>(); #region QuestionResult; string QuestionResult = ""; int QuestionnaireItemIndex = 0; foreach (RepeaterItem RepeaterItem in this.vQuestionnaire_List.Items) { QuestionnaireItem QuestionnaireItem = _QuestionnaireItems[QuestionnaireItemIndex]; switch (QuestionnaireItem.OptionType) { case OptionType.單選: RadioButtonList vRadioButtonList = (RadioButtonList)RepeaterItem.FindControl("vRadioButtonList"); if (string.IsNullOrWhiteSpace(vRadioButtonList.SelectedValue)) { Errors.Add(string.Format("請填寫第{0}題的答案", QuestionnaireItem.Sort)); } QuestionResult += string.Format("{0}:{1}<br />", QuestionnaireItem.ShortTitle, vRadioButtonList.SelectedValue); break; case OptionType.多選: CheckBoxList vCheckBoxList = (CheckBoxList)RepeaterItem.FindControl("vCheckBoxList"); if (string.IsNullOrWhiteSpace(vCheckBoxList.SelectedValue)) { Errors.Add(string.Format("請填寫第{0}題的答案", QuestionnaireItem.Sort)); } QuestionResult += string.Format("{0}:{1}<br />", QuestionnaireItem.ShortTitle, vCheckBoxList.SelectedValue); break; case OptionType.單行文字方塊: List <string> OptionResult = new List <string>(); Repeater vTextBoxList = (Repeater)RepeaterItem.FindControl("vTextBoxList"); foreach (RepeaterItem TextBoxItem in vTextBoxList.Items) { string Option = ((TextBox)TextBoxItem.FindControl("vResult")).Text.Trim().Replace(" ", ""); if (string.IsNullOrWhiteSpace(Option)) { Errors.Add(string.Format("請填寫第{0}題第{1}項的答案", QuestionnaireItem.Sort, TextBoxItem.ItemIndex + 1)); } OptionResult.Add(Option); } QuestionResult += string.Format("{0}:{1}<br />", QuestionnaireItem.ShortTitle, string.Join(",", OptionResult)); break; } QuestionnaireItemIndex += 1; } #endregion #region vSystemRemark; string SystemRemark = this.vSystemRemark.Value.Trim(); #endregion if (Errors.Count > 0) { throw new Exception(string.Join("\\r\\n", Errors)); } _CurrentOrderItem.QuestionResult = QuestionResult; _CurrentOrderItem.SyatemRemark = SystemRemark; OrderItemManager.Save(_CurrentOrderItem); ScriptManager.RegisterClientScriptBlock(this.Page, this.Page.GetType(), "Message", "top.location.replace('Finish_Form.aspx');", true); } catch (Exception ex) { LeftHand.Gadget.Dialog.Alert(ex.Message); } }
/// <summary> /// Adds a full Pro Instrument to the database, including all related objects such as ProItem and ProOption /// </summary> /// <param name="questionnaire">The <see cref="Questionnaire"/> to add to the database</param> public void AddFullQuestionnaire(Questionnaire questionnaire) { if (this.context.QuestionnaireConcepts.Any(pc => pc.Id == questionnaire.Concept.Id || pc.Name.Equals(questionnaire.Concept.Name, StringComparison.CurrentCultureIgnoreCase))) { questionnaire.Concept = this.context.QuestionnaireConcepts.Where(pc => pc.Id == questionnaire.Concept.Id || pc.Name.Equals(questionnaire.Concept.Name, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault(); this.context.Entry(questionnaire.Concept).State = System.Data.Entity.EntityState.Modified; } else { this.context.QuestionnaireConcepts.Add(questionnaire.Concept); } this.context.Questionnaires.Add(questionnaire); foreach (QuestionnaireIntroductionMessage m in questionnaire.IntroductionMessages) { m.Questionnaire = questionnaire; this.context.QuestionnaireIntroductionMessages.Add(m); } foreach (QuestionnaireDescription desc in questionnaire.Descriptions) { desc.Questionnaire = questionnaire; this.context.QuestionnaireDescriptions.Add(desc); } if (questionnaire.GetType() == typeof(ProInstrument)) { ProInstrument inst = (ProInstrument)questionnaire; foreach (ProDomain dom in inst.Domains) { dom.Instrument = questionnaire; this.context.ProDomains.Add(dom); foreach (ProDomainResultRange range in dom.ResultRanges) { range.Domain = dom; this.context.ProDomainResultRanges.Add(range); } } } int sectionOrderCount = 0; foreach (QuestionnaireSection sec in questionnaire.Sections) { sec.OrderInInstrument = sectionOrderCount++; int itemOrderCount = 0; sec.Questionnaire = questionnaire; this.context.QuestionnaireSections.Add(sec); foreach (QuestionnaireSectionInstruction instruction in sec.Instructions) { instruction.Section = sec; this.context.QuestionnaireSectionInstructions.Add(instruction); } foreach (QuestionnaireElement element in sec.Elements) { element.OrderInSection = itemOrderCount++; foreach (QuestionnaireElementTextVersion version in element.TextVersions) { version.QuestionnaireElement = element; this.context.QuestionnaireElementTextVersions.Add(version); } if (element.GetType() == typeof(QuestionnaireText)) { QuestionnaireText text = (QuestionnaireText)element; text.Section = sec; this.context.QuestionnaireElements.Add(text); } else if (element.GetType() == typeof(QuestionnaireItem)) { QuestionnaireItem item = (QuestionnaireItem)element; item.Section = sec; this.context.QuestionnaireElements.Add(item); foreach (QuestionnaireItemInstruction instruction in item.Instructions) { instruction.Item = item; this.context.QuestionnaireItemInstructions.Add(instruction); } int groupOrderCount = 0; foreach (QuestionnaireItemOptionGroup group in item.OptionGroups) { foreach (QuestionnaireItemOptionGroupTextVersion version in group.TextVersions) { version.QuestionnaireItemOptionGroup = group; this.context.QuestionnaireItemOptionGroupTextVersions.Add(version); } group.OrderInItem = groupOrderCount++; group.Item = item; this.context.QuestionnaireItemOptionGroups.Add(group); int optionOrderCount = 0; foreach (QuestionnaireItemOption o in group.Options) { o.OrderInGroup = optionOrderCount++; o.Group = group; this.context.QuestionnaireItemOptions.Add(o); } } } } } try { this.context.SaveChanges(); foreach (Tag t in questionnaire.Tags) { this.AddTagToQuestionnaireByName(t, questionnaire.Name); } } catch (DbEntityValidationException e) { string errorResult = string.Empty; foreach (var eve in e.EntityValidationErrors) { errorResult += "Entity of type \" " + eve.Entry.Entity.GetType().Name + "\" in state \"" + eve.Entry.State + "\" has the following validation errors: \n"; foreach (var ve in eve.ValidationErrors) { errorResult += "- Property: \"" + ve.PropertyName + "\", Error: \"" + ve.ErrorMessage + "\" \n"; } } throw new DbEntityValidationException(errorResult, e); } }
public QuestionnaireItemViewModel(QuestionnaireItem item) { this.Id = item.Id; this.Key = item.Key; this.Value = item.Value; }