public void SaveTemplate(string jsonString, MedicalProfileTemplate template)
 {
     List<CustomSnippet> snippetChanged = snippetBusiness.ConvertJsonStringToCustomSnippetList(jsonString, template);
     List<CustomSnippet> snippetDB = _db.CustomSnippets.Where(
         s => s.MedicalProfileTemplateId == template.MedicalProfileTemplateId)
         .OrderBy(s=>s.Position)
         .ToList();
     snippetBusiness.SaveSnippetList(snippetDB, snippetChanged, template);
 }
 public ActionResult Edit(MedicalProfileTemplate medicalProfileTemplate)
 {
     if (ModelState.IsValid)
     {
         _db.Entry(medicalProfileTemplate).State = EntityState.Modified;
         _db.SaveChanges();
     }
     return RedirectToAction("Index");
 }
 public ActionResult CreateFromName(string name)
 {
     MedicalProfileTemplate template = new MedicalProfileTemplate
     {
         MedicalProfileTemplateName = name
     };
     _db.MedicalProfileTemplates.Add(template);
     _db.SaveChanges();
     return RedirectToAction("Editor", new { id = template.MedicalProfileTemplateId });
 }
 public JObject CheckTemplateChanged(string jsonString, MedicalProfileTemplate template)
 {
     List<CustomSnippet> snippetChanged = snippetBusiness.ConvertJsonStringToCustomSnippetList(jsonString, template);
     List<CustomSnippet> snippetDB = _db.CustomSnippets.Where(
         s => s.MedicalProfileTemplateId == template.MedicalProfileTemplateId)
         .OrderBy(s => s.Position)
         .ToList();
     JObject result = snippetBusiness.CompareChanges(snippetDB, snippetChanged, template);
     return result;
 }
 public JObject CheckTemplateChanged(string jsonString, MedicalProfileTemplate template)
 {
     dynamic result = business.CheckTemplateChanged(jsonString, template);
     return result;
 }
 public JObject SaveTemplate(string jsonString, MedicalProfileTemplate template)
 {
     business.SaveTemplate(jsonString, template);
     dynamic result = new JObject();
     result.status = "success";
     return result;
 }
        public JObject CompareChanges(List<CustomSnippet> snippetDB, List<CustomSnippet> snippetChanged, MedicalProfileTemplate template)
        {
            var numChangeStaticItem = 0;
            var numChangeDynamicItem = 0;
            var numDeleteStaticItem = 0;
            var numDeleteDynamicItem = 0;
            var numMedicalProfileUsage = _db.MedicalProfiles.Where(
                x => x.MedicalProfileTemplateId == template.MedicalProfileTemplateId).Count();
            dynamic changedList = new JArray();
            dynamic removeList = new JArray();

            //Loop to find which item have been changed
            foreach (CustomSnippet snippetChangeItem in snippetChanged)
            {
                //Existing item
                if (snippetChangeItem.CustomSnippetId > 0)
                {
                    var existItem = snippetDB.Where(x => x.CustomSnippetId == snippetChangeItem.CustomSnippetId).Single();

                    /*
                     * Mapping one-one data
                     * Change it not affect data
                     */
                    if (existItem.Title.Equals("Static Text") || existItem.Title.Equals("Form Name"))
                    {
                        for (int i = 0; i < existItem.CustomSnippetFields.Count; i++)
                        {
                            string fieldName = existItem.CustomSnippetFields.ElementAt(i).FieldName;
                            string oldValue = existItem.CustomSnippetFields.ElementAt(i).Value;
                            string newValue = snippetChangeItem.CustomSnippetFields.ElementAt(i).Value;
                            if (!oldValue.Equals(newValue) && !fieldName.Equals("id"))
                            {
                                dynamic changedItem = new JObject();
                                changedItem.oldValue = oldValue;
                                changedItem.newValue = newValue;
                                changedList.Add(changedItem);
                                numChangeStaticItem++;
                            }
                        }
                    }
                    /*
                     * Custom element
                     * Dangerous when change
                     * Posible to lost data
                     */
                    else
                    {
                        for (int i = 0; i < existItem.CustomSnippetFields.Count; i++)
                        {
                            string fieldName = existItem.CustomSnippetFields.ElementAt(i).FieldName;
                            string oldValue = existItem.CustomSnippetFields.ElementAt(i).Value;
                            string newValue = snippetChangeItem.CustomSnippetFields.ElementAt(i).Value;
                            if (!oldValue.Equals(newValue) && !fieldName.Equals("id"))
                            {
                                dynamic changedItem = new JObject();
                                changedItem.oldValue = oldValue;
                                changedItem.newValue = newValue;
                                changedList.Add(changedItem);
                                numChangeDynamicItem++;
                            }
                        }
                    }
                }
            }

            //Loop to file which item have been removed
            foreach (CustomSnippet snippetExistItem in snippetDB)
            {
                var snippetChangedItem = snippetChanged.Where(x => x.CustomSnippetId == snippetExistItem.CustomSnippetId).SingleOrDefault();

                /* This element have been removed
                 * in the list
                 * really dangerous
                 */
                if (snippetChangedItem == null)
                {
                    dynamic removedItem = new JObject();
                    string oldValue = snippetExistItem.CustomSnippetFields.Where(
                        x => (x.FieldName.Equals("label")
                         || x.FieldName.Equals("name")))
                        .FirstOrDefault().Value;
                    removedItem.oldValue = oldValue;
                    removeList.Add(removedItem);

                    if (snippetExistItem.Title.Equals("Static Text") || snippetExistItem.Title.Equals("Form Name"))
                        numDeleteStaticItem++;
                    else
                        numDeleteDynamicItem++;
                }
            }

            dynamic result = new JObject();
            result.numChangeStaticItem = numChangeStaticItem;
            result.numChangeDynamicItem = numChangeDynamicItem;
            result.numDeleteStaticItem = numDeleteStaticItem;
            result.numDeleteDynamicItem = numDeleteDynamicItem;
            result.changedList = changedList;
            result.removeList = removeList;
            result.numMedicalProfileUsage = numMedicalProfileUsage;
            return result;
        }
        public void SaveSnippetList(List<CustomSnippet> snippetDB, List<CustomSnippet> snippetChanged, MedicalProfileTemplate template)
        {
            //Loop to file which item have been changed
            foreach (CustomSnippet snippetChangeItem in snippetChanged)
            {
                //Existing item
                if (snippetChangeItem.CustomSnippetId > 0)
                {
                    var existItem = snippetDB.Where(x => x.CustomSnippetId == snippetChangeItem.CustomSnippetId).Single();
                    for (int i = 0; i < existItem.CustomSnippetFields.Count; i++)
                    {
                        var oldField = existItem.CustomSnippetFields.ElementAt(i);
                        var newField = snippetChangeItem.CustomSnippetFields.ElementAt(i);
                        oldField.Value = newField.Value;
                        existItem.Position = snippetChangeItem.Position;
                        existItem.ParentId = snippetChangeItem.ParentId;
                        existItem.PositionInTable = snippetChangeItem.PositionInTable;
                    }
                }
                //New added item
                else
                {
                    _db.CustomSnippets.Add(snippetChangeItem);
                }
            }

            //Loop to file which item have been removed
            foreach (CustomSnippet snippetExistItem in snippetDB)
            {
                var snippetChangedItem = snippetChanged.Where(x => x.CustomSnippetId == snippetExistItem.CustomSnippetId).SingleOrDefault();

                if (snippetChangedItem == null)
                {
                    _db.CustomSnippets.Remove(snippetExistItem);
                }
            }
            _db.SaveChanges();

            //Store Id to CustomSnippetField
            List<CustomSnippet> snippetLatest = _db.CustomSnippets.Where(
                s => s.MedicalProfileTemplateId == template.MedicalProfileTemplateId)
                .OrderBy(s => s.Position)
                .ToList();
            foreach (CustomSnippet snippetItem in snippetLatest)
            {
                for (int i = 0; i < snippetItem.CustomSnippetFields.Count; i++)
                {
                    var field = snippetItem.CustomSnippetFields.ElementAt(i);
                    if (field.FieldName.Equals("id"))
                    {
                        field.Value = snippetItem.CustomSnippetId.ToString();
                    }
                }
            }
            _db.SaveChanges();
        }
        public List<CustomSnippet> ConvertJsonStringToCustomSnippetList(string jsonString, MedicalProfileTemplate template)
        {
            List<CustomSnippet> resultCustomSnippetList = new List<CustomSnippet>();

            JArray listSnippets = JArray.Parse(jsonString) as JArray;
            int position = 0;
            foreach (dynamic snippet in listSnippets)
            {
                CustomSnippet customSnippet = new CustomSnippet { Title = snippet.title,
                    Name = snippet.name,
                    MedicalProfileTemplateId = template.MedicalProfileTemplateId };

                /*
                 * This is for mapping one-one attribute
                 * we don't need to track it
                 */
                if (snippet.title == "Static Text")
                {
                    var SnippetTypeDic = new Dictionary<string, SnippetType> {
                        { "Custom", SnippetType.Custom },
                        { "User", SnippetType.User },
                        { "Patient", SnippetType.Patient },
                        { "PersonalHealthRecord", SnippetType.PersonalHealthRecord }
                    };
                    string str = ((object)snippet.snippettype).ToString();
                    customSnippet.SnippetType = SnippetTypeDic[((object)snippet.snippettype).ToString()];
                    customSnippet.SnippetFieldName = snippet.fieldname;
                }
                position++;
                if (snippet.parentId != null)
                {
                    customSnippet.ParentId = snippet.parentId;
                    customSnippet.PositionInTable = snippet.positionInTable;
                }
                customSnippet.Position = position;
                resultCustomSnippetList.Add(customSnippet);
                customSnippet.CustomSnippetFields = new Collection<CustomSnippetField>();
                if (snippet.fields != null)
                {
                    foreach (dynamic snippetField in snippet.fields)
                    {
                        dynamic metadata = snippetField.Value;

                        if ("id".Equals(snippetField.Name))
                        {
                            if (metadata.value == null)
                                customSnippet.CustomSnippetId = 0;
                            else
                                customSnippet.CustomSnippetId = metadata.value;
                        }

                        CustomSnippetField customSnippetField = new CustomSnippetField
                        {
                            CustomSnippet = customSnippet,
                            FieldName = snippetField.Name,
                            Label = metadata.label,
                            Type = metadata.type,
                            Value = ((object)metadata.value).ToString(),
                            Name = metadata.name
                        };
                        customSnippet.CustomSnippetFields.Add(customSnippetField);
                    }
                }
            }
            return resultCustomSnippetList;
        }