public string GetMatterProvisionExtraProperties()

in tree/master/cloud/src/solution/Microsoft.Legal.MatterCenter.Service/Microsoft.Legal.MatterCenter.Repository/Matter/MatterRepository.cs [1832:2030]


        public string GetMatterProvisionExtraProperties(string contentTypeName, Client client)
        {
            try
            {
                var clientContext = spoAuthorization.GetClientContext(client.Url);
                FieldCollection fieldCollection = contentTypeName.GetFieldsInContentType(clientContext);

                //To get configuration settings...
                var listQuery = string.Format(CultureInfo.InvariantCulture, camlQueries.MatterConfigurationsListQuery,
                        searchSettings.ManagedPropertyTitle, searchSettings.MatterConfigurationTitleValue);
                ListItem settingsItem = spList.GetData(clientContext,
                    listNames.MatterConfigurationsList, listQuery).FirstOrDefault();

                IList<MatterExtraFields> addFields = new List<MatterExtraFields>();

                if (settingsItem != null) 
                {
                    Newtonsoft.Json.Linq.JObject settingConfig = (Newtonsoft.Json.Linq.JObject)
                        JsonConvert.DeserializeObject(WebUtility.HtmlDecode(Convert.ToString(
                            settingsItem.FieldValues["ConfigurationValue"])));

                    if (settingConfig != null && settingConfig.GetValue("AdditionalFieldValues") != null)
                    {
                        foreach (var objField in settingConfig.GetValue("AdditionalFieldValues"))
                        {
                            addFields.Add(new MatterExtraFields
                            {
                                FieldName = objField["FieldName"].ToString(),
                                IsDisplayInUI = String.IsNullOrWhiteSpace(objField["IsDisplayInUI"].ToString()) ? "false"
                                                 : objField["IsDisplayInUI"].ToString(),
                                IsMandatory = String.IsNullOrWhiteSpace(objField["IsMandatory"].ToString()) ? "false"
                                                 : objField["IsMandatory"].ToString()
                            });
                        }
                    }
                }
                //When the document is getting uploaded we have to send the default values of Additional Matter
                //content type site columns so that the user can override/update those values for the document 
                //that is getting uploaded.
                //Get all site columns that are present in 'Additional Matter Properties' content type.
               
                Dictionary<string, string> matterExtraPropertiesDefaultValues = new Dictionary<string, string>();              
                CamlQuery query = new CamlQuery();
                if (client.Name != null)
                {
                    Web web = clientContext.Web;
                    ListCollection lists = web.Lists;
                    List selectedList = lists.GetByTitle(client.Name);
                    spContentTypes.AssignContentType(clientContext, contentTypeName, selectedList);
                    FieldCollection contentTypeFields = contentTypeName.GetFieldsInContentType(clientContext);
                    FieldCollection fields = spList.GetMatterExtraDefaultSiteColumns(clientContext, selectedList);
                    if (fields != null && contentTypeFields != null && contentTypeFields.Count > 0)
                    {
                        foreach (var field in fields)
                        {
                            foreach (var contentTypeField in contentTypeFields)
                            {
                                //If document library field name is part of content type field name 
                                //then update default value of tht column name to the value 
                                //of that column name.
                                if (field.InternalName == contentTypeField.InternalName)
                                {
                                    if (field.Group == contentTypesSettings.OneDriveContentTypeGroup)
                                    {
                                        string fieldValue = string.Empty;
                                        if (field.TypeAsString.ToLower() == "datetime")
                                        {
                                            if (!string.IsNullOrEmpty(field.DefaultValue))
                                            {
                                                fieldValue = DateTime.Parse(field.DefaultValue).ToString("MM/dd/yyyy");
                                            }
                                        }
                                        else
                                        {
                                            fieldValue = field.DefaultValue;
                                        }
                                        matterExtraPropertiesDefaultValues.Add(field.InternalName, fieldValue);
                                    }
                                }
                            }
                        }
                    }
                } 
                StringBuilder sb = new StringBuilder();
                JsonWriter jw = new JsonTextWriter(new StringWriter(sb));
                jw.Formatting = Formatting.Indented;
                jw.WriteStartObject();

                jw.WritePropertyName("Fields");
                jw.WriteStartArray();
                foreach (var field in fieldCollection)
                {
                    if (field.Group == this.contentTypesSettings.OneDriveContentTypeGroup)
                    {
                        jw.WriteStartObject();
                        jw.WritePropertyName("name");
                        jw.WriteValue(field.Title);

                        jw.WritePropertyName("fieldInternalName");
                        jw.WriteValue(field.InternalName);

                        jw.WritePropertyName("required");
                        string isRequired= "false";
                        string required = "false";
                        string isDisplayInUI = "false";
                       
                        foreach (var item in addFields)
                        {
                        
                            if(item.FieldName== field.InternalName)
                            {
                                 isRequired = addFields.Count > 0 ? addFields.Where(x => x.FieldName == field.InternalName).SingleOrDefault().IsMandatory : field.Required.ToString();
                                 required = string.IsNullOrWhiteSpace(isRequired) ? false.ToString() : isRequired.ToLower();
                                 isDisplayInUI = addFields.Count > 0 ? addFields.Where(x => x.FieldName == field.InternalName).SingleOrDefault().IsDisplayInUI : "false";
                                break;
                            }
                           
                        }
                       
                        jw.WriteValue(required);

                        jw.WritePropertyName("displayInUI");
                       
                        isDisplayInUI = string.IsNullOrWhiteSpace(isDisplayInUI) ? "false" : isDisplayInUI;
                        jw.WriteValue(isDisplayInUI);

                        jw.WritePropertyName("originalType");
                        jw.WriteValue(field.TypeAsString);
                        jw.WritePropertyName("defaultValue");
                        if (client.Name!=null && matterExtraPropertiesDefaultValues!=null && matterExtraPropertiesDefaultValues.Count>0 && matterExtraPropertiesDefaultValues.ContainsKey(field.InternalName)) {
                            jw.WriteValue(matterExtraPropertiesDefaultValues[field.InternalName]);
                        }
                        else {
                            jw.WriteValue(field.DefaultValue);
                        }
                        jw.WritePropertyName("description");
                        jw.WriteValue(field.Description);

                        if (field.TypeAsString == "Choice")
                        {
                            jw.WritePropertyName("type");
                            jw.WriteValue(Convert.ToString(((Microsoft.SharePoint.Client.FieldChoice)field).EditFormat));
                            List<string> options = GetChoiceFieldValues(clientContext, field);
                            jw.WritePropertyName("values");
                            jw.WriteStartArray();
                            int optionCounter = 1;

                            foreach (string option in options)
                            {
                                jw.WriteStartObject();
                                jw.WritePropertyName("choiceId");
                                jw.WriteValue(optionCounter);
                                jw.WritePropertyName("choiceValue");
                                jw.WriteValue(option);
                                optionCounter++;
                                jw.WriteEndObject();
                            }
                            jw.WriteEndArray();
                        }
                        else if (field.TypeAsString == "MultiChoice")
                        {
                            jw.WritePropertyName("type");
                            jw.WriteValue(Convert.ToString(((Microsoft.SharePoint.Client.FieldMultiChoice)field).TypeAsString));
                            List<string> options = GetChoiceFieldValues(clientContext, field);
                            jw.WritePropertyName("values");
                            jw.WriteStartArray();
                            int optionCounter = 1;

                            foreach (string option in options)
                            {
                                jw.WriteStartObject();
                                jw.WritePropertyName("choiceId");
                                jw.WriteValue(optionCounter);
                                jw.WritePropertyName("choiceValue");
                                jw.WriteValue(option);
                                optionCounter++;
                                jw.WriteEndObject();
                            }

                            jw.WriteEndArray();
                        }
                        else
                        {
                            jw.WritePropertyName("type");
                            jw.WriteValue(Convert.ToString(field.TypeAsString));
                        }
                        jw.WriteEndObject();
                    }
                }
                jw.WriteEndArray();
                jw.WriteEndObject();
                return sb.ToString();
            }
            catch (Exception ex)
            {
                customLogger.LogError(ex, MethodBase.GetCurrentMethod().DeclaringType.Name, MethodBase.GetCurrentMethod().Name, logTables.SPOLogTable);
                throw;
            }
        }