public static SubEntity BuildSubEntity(RegistrationFormAdminDetailView parent, int templateId, string entityName)
        {
            var displayName = string.Empty;
            if (entityName == RegistrationFormAdminDetailView._registrationFormLeftColumn)
            {
                _columnId = 1;
                displayName = LeftColumn;
            }
            else
            {
                _columnId = 2;
                displayName = RightColumn;
            }

            _templateId = templateId;
            _subEntity = parent._viewModel.SubEntities.FirstOrDefault(s => s.EntityName == entityName);

            if (_subEntity == null)
                _subEntity = new SubEntity() { EntityName = entityName, DisplayName = displayName, CanAddExisting = true, CanCreateNew = true, CanDelete = true };
            else
                _subEntity.Records = new List<SubEntityRecord>();

            AddExistingRecords(parent, templateId);
            AddNewRecordTemplate(parent);

            return _subEntity;
        }
        public static List<SubEntityRecord> GetDropdownValues(RegistrationFormAdminDetailView parent, int eventId)
        {
            int eventRegistrationEntityId = GetEventRegistrationFormEntityId(parent);

            var columns = CommonUtils.GetDynamicColumnInstances(parent, eventRegistrationEntityId);
            var records = new List<SubEntityRecord>();

            foreach (var item in columns)
            {
                var record = new SubEntityRecord();
                record.DisplayName = item.Name;
                record.Id = item.Id;

                record.Fields.Add(new Field(_id, "Id", FieldTypes.Hidden, item.Id));
                record.Fields.Add(new Field(_fieldName, "Field Name", FieldTypes.Label, item.Name));
                record.Fields.Add(new Field(_fieldLabel, "Field Label", FieldTypes.Text, item.FormLabel, true));
                record.Fields.Add(new Field(_isRequired, "Is Required", FieldTypes.Checkbox, item.IsRequired));
                record.Fields.Add(new Field(_dataType, "Data Type", FieldTypes.Dropdown, item.DataType)
                    {
                        Options = new List<KeyValuePair<object, object>>()
                    {
                        new KeyValuePair<object,object>("nvarchar","Text"),
                        new KeyValuePair<object,object>("int","Number"),
                        new KeyValuePair<object,object>("datetime","Date"),
                        new KeyValuePair<object,object>("dropdown","Dropdown"),
                        new KeyValuePair<object,object>("contentEditor","Content Editor")
                    },
                        OnChangeCommand = "DataTypeChanged",
                        IsDisabled = true
                    });
                record.Fields.Add(new Field(_maxSize, "Max Length", FieldTypes.Hidden, item.DataSize, true));
                record.Fields.Add(new Field(_dropdownOptions, "Dropdown Options", FieldTypes.Hidden, item.DropDownValues, true));
                record.Fields.Add(new Field(_isMultiLine, "Is Multiline", FieldTypes.Hidden, item.IsMultiline, true));

                record.Fields = SetupFieldVisibility(record.Fields);
                records.Add(record);
            }

            return records;
        }
        private static List<DynamicColumnsCollection> MakeColumnsList(RegistrationFormAdminDetailView parent, List<DynamicColumnsCollection> columns, List<SubEntityRecord> recordList, DynamicFormDto form)
        {
            int eventRegistrationEntityId = GetEventRegistrationFormEntityId(parent);

            var columnCollection = new DynamicColumnsCollection();
            int i = 0;

            foreach (var record in recordList)
            {
                //if dynamicColumnInstance Id = 0 then it's new, so save it.
                var dynamicColumnInstanceId = int.Parse(CommonUtils.GetFieldValue(record.Fields, _id));

                if (dynamicColumnInstanceId == 0)
                    dynamicColumnInstanceId = AddDynamicColumnInstant(parent, eventRegistrationEntityId, record);
                else
                    UpdateDynamicColumnInstant(parent, eventRegistrationEntityId, record, dynamicColumnInstanceId);

                var column = new DynamicFormsDynamicColumnDto
                {
                    DynamicForm = form,
                    FormOrder = i++,
                    DynamicColumnInstance = new DynamicColumnInstanceDto
                    {
                        Id = dynamicColumnInstanceId
                    }
                };

                columnCollection.Add(column);
            }

            columns.Add(columnCollection);

            return columns;
        }
        private static void UpdateDynamicColumnInstant(RegistrationFormAdminDetailView parent, int eventRegistrationEntityId, SubEntityRecord record, int dynamicColumnInstanceId)
        {
            var dataSize = CommonUtils.GetFieldValue(record.Fields, _maxSize);

            var updateRequest = new UpdateDynamicColumnInstanceRequest
            {
                EntityId = eventRegistrationEntityId,
                Name = CommonUtils.GetFieldValue(record.Fields, _fieldName),
                FormLabel = CommonUtils.GetFieldValue(record.Fields, _fieldLabel),
                DataType = CommonUtils.GetFieldValue(record.Fields, _dataType),
                IsRequired = GetBooleanValue(record, _isRequired),
                IsMultiline = GetBooleanValue(record, _isMultiLine),
                DataSize = string.IsNullOrEmpty(dataSize) ? new int?() : int.Parse(dataSize),
                DropDownValues = CommonUtils.GetFieldValue(record.Fields, _dropdownOptions),
                FormOrder = 1,
                Id = dynamicColumnInstanceId
            };

            updateRequest.SelectSqlText = GetSelectSqlText(updateRequest.Name, updateRequest.DataType, updateRequest.DataSize);

            var response = parent.ProcessRequest<UpdateDynamicColumnInstanceResponse>(updateRequest);
            if (response.Id == 0 && response.Message == StatusMessage.DuplicateData)
            {
                throw new BusinessException("A Dynamic Column already exists with the specified name");
            }
        }
 private static int GetEventRegistrationFormEntityId(RegistrationFormAdminDetailView parent)
 {
     var entityRequest = new ReadDynamicColumnEntityRequest
     {
         EntityName = "EventRegistration",
         EntityNamespace = "MEDSEEK.eHealth.Apps.Events.SharePoint"
     };
     int eventRegistrationEntityId = parent.ProcessRequest<ReadDynamicColumnEntityResponse>(entityRequest).DynamicColumnEntity.Id;
     return eventRegistrationEntityId;
 }
        private static List<DynamicFormsDynamicColumnDto> GetColumnFields(RegistrationFormAdminDetailView parent, int formId)
        {
            var formRequest = new ReadDynamicFormRequest { FormId = formId };
            var formResponse = parent.ProcessRequest<ReadDynamicFormResponse>(formRequest);

            var request = new GetAllDynamicFormsDynamicColumnsRequest { FormId = formId };
            var response = parent.ProcessRequest<GetAllDynamicFormsDynamicColumnsResponse>(request);

            return response.Columns.Where(c => c.FormColumn == _columnId).ToList();
        }
        private static void AddNewRecordTemplate(RegistrationFormAdminDetailView parent)
        {
            _subEntity.NewRecordTemplate = new SubEntityRecord() { };

            _subEntity.NewRecordTemplate.Fields.Add(new Field(_id, "Id", FieldTypes.Hidden, 0));
            _subEntity.NewRecordTemplate.Fields.Add(new Field(_fieldName, "Field Name", FieldTypes.Text, string.Empty, true) { Focus = true });
            _subEntity.NewRecordTemplate.Fields.Add(new Field(_fieldLabel, "Field Label", FieldTypes.Text, string.Empty, true));
            _subEntity.NewRecordTemplate.Fields.Add(new Field(_isRequired, "Is Required", FieldTypes.Checkbox, false));
            _subEntity.NewRecordTemplate.Fields.Add(new Field(_dataType, "Data Type", FieldTypes.Dropdown, "Text")
            {
                Options = new List<KeyValuePair<object, object>>()
                {
                    new KeyValuePair<object,object>("nvarchar","Text"),
                    new KeyValuePair<object,object>("int","Number"),
                    new KeyValuePair<object,object>("datetime","Date"),
                    new KeyValuePair<object,object>("dropdown","Dropdown"),
                    new KeyValuePair<object,object>("contentEditor","Content Editor")
                },
                OnChangeCommand = "DataTypeChanged",
                IsDisabled = false
            });
            _subEntity.NewRecordTemplate.Fields.Add(new Field(_maxSize, "Max Length", FieldTypes.Hidden, string.Empty, true));
            _subEntity.NewRecordTemplate.Fields.Add(new Field(_dropdownOptions, "Dropdown Options", FieldTypes.Hidden, string.Empty, true));
            _subEntity.NewRecordTemplate.Fields.Add(new Field(_isMultiLine, "Is Multiline", FieldTypes.Hidden, false, true));
        }
        private static void AddExistingRecords(RegistrationFormAdminDetailView parent, int templateId)
        {
            if (templateId > 0)
            {
                var forms = GetColumnFields(parent, templateId);

                foreach (var form in forms)
                {
                    var record = new SubEntityRecord();
                    var fields = new List<Field>();

                    fields.Add(new Field(_id, "Id", FieldTypes.Hidden, form.DynamicColumnInstance.Id));
                    fields.Add(new Field(_fieldName, "Field Name", FieldTypes.Text, form.DynamicColumnInstance.Name, true) { IsDisabled = true });
                    fields.Add(new Field(_fieldLabel, "Field Label", FieldTypes.Text, form.DynamicColumnInstance.FormLabel, true));
                    fields.Add(new Field(_isRequired, "Is Required", FieldTypes.Checkbox, form.DynamicColumnInstance.IsRequired, false));
                    fields.Add(new Field(_dataTypeDisplay, "Data Type", FieldTypes.Label, GetFriendlyDataTypeForDynamicFields(form.DynamicColumnInstance.DataType)));
                    fields.Add(new Field(_dataType, "DataType", FieldTypes.Hidden, form.DynamicColumnInstance.DataType));

                    switch (form.DynamicColumnInstance.DataType)
                    {
                        case "nvarchar":
                            fields.Add(new Field(_maxSize, "Max Length", FieldTypes.Label, form.DynamicColumnInstance.DataSize, false));
                            fields.Add(new Field(_isMultiLine, "Is Multiline", FieldTypes.Label, form.DynamicColumnInstance.IsMultiline, false));
                            fields.Add(new Field(_dropdownOptions, "Dropdown Options", FieldTypes.Hidden, string.Empty, false));
                            break;

                        case "dropdown":
                            fields.Add(new Field(_maxSize, "Max Length", FieldTypes.Hidden, string.Empty, false));
                            fields.Add(new Field(_isMultiLine, "Is Multiline", FieldTypes.Hidden, string.Empty, false));
                            fields.Add(new Field(_dropdownOptions, "Dropdown Options", FieldTypes.MultiLineText, form.DynamicColumnInstance.DropDownValues, true));
                            break;

                        default:
                            fields.Add(new Field(_maxSize, "Max Length", FieldTypes.Hidden, string.Empty, false));
                            fields.Add(new Field(_isMultiLine, "Is Multiline", FieldTypes.Hidden, string.Empty, false));
                            fields.Add(new Field(_dropdownOptions, "Dropdown Options", FieldTypes.Hidden, string.Empty, false));
                            break;
                    }

                    record.Fields = fields;

                    _subEntity.Records.Add(record);
                }
            }
        }
        public static int Save(RegistrationFormAdminDetailView parent, List<SubEntity> subEntities, string templateName)
        {
            try
            {
                if (string.IsNullOrEmpty(templateName.Trim()))
                    throw new Exception("Template Name required.");

                var columns = new List<DynamicColumnsCollection>();

                var form = new DynamicFormDto
                {
                    Name = templateName,
                    IsTemplate = true,
                    Id = _templateId,
                    LabelPosition = string.Empty
                };

                var fieldList = new List<object>();

                ValidateSubEntitites(subEntities);

                //build columns from both left and right subentities
                foreach (var sub in subEntities)
                {
                    var records = sub.Records.Where(a => a.Action != RecordActions.Deleted).ToList();
                    columns = MakeColumnsList(parent, columns, records, form);

                    //get fieldNames from both left and right columns, and then check for duplicates.
                    var subEntityFields = records.Where(r => r.Fields != null).Select(f => f.Fields);
                    foreach (var item in subEntityFields.ToList())
                    {
                        var fieldName = item.Where(r => r.FieldName == _fieldName).Select(r => r.FieldValue).First();
                        fieldList.Add(fieldName);
                    }
                }

                var duplicates = fieldList.GroupBy(x => x).Where(g => g.Count() > 1).Select(g => g.Key).ToList();
                if (duplicates.Count() > 0)
                {
                    var errorMessage = string.Format("The following fields appear in the template more than once, please remove the field from either the Left or Right Column: {0}", string.Join(", ", duplicates));
                    throw new Exception(errorMessage);
                }

                if (_templateId > 0)
                {
                    var request = new UpdateDynamicFormWithColumnsRequest { Form = form, FieldsInColumns = columns };
                    parent.ProcessRequest<UpdateDynamicFormWithColumnsResponse>(request);
                }
                else
                {
                    var request = new AddDynamicFormWithColumnsRequest { Form = form, FieldsInColumns = columns };
                    _templateId = parent.ProcessRequest<AddDynamicFormWithColumnsResponse>(request).Id;
                }

                return _templateId;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }