using System.Linq; using System.Collections.Generic; using Newtonsoft.Json.Linq; using System.Text; namespace AyaNova.Biz { //************************************************ // This contains all the fields that are: // - Customizable on forms // - In grid list templates //In addition it serves as a source for valid object keys in AvailableObjectKeys // public static class ObjectFields { //DEFINE VALID KEYS HERE //For objects that are both list and edit form it's just the name of the object //For objects that are compound list objects or reporting objects it's whatever uniquely but clearly identifies that public const string WIDGET_KEY = "widget"; public const string USER_KEY = "user"; public static List AvailableObjectKeys { get { List l = new List{ WIDGET_KEY, USER_KEY }; return l; } } public static bool IsValidObjectKey(string key) { return AvailableObjectKeys.Contains(key); } public static List ObjectFieldsList(string key) { /* ***************************** WARNING: Be careful here, if a standard field is hideable and also it's DB SCHEMA is set to NON NULLABLE then the CLIENT end needs to set a default ***************************** Otherwise the hidden field can't be set and the object can't be saved EVER Defaults of paramterless constructor: SharedLTKey = false; Hideable = true; Custom = false; Filterable = true; Sortable = true; MiniAvailable = true; */ List l = new List(); switch (key) { case WIDGET_KEY: #region WIDGET_KEY l.Add(new ObjectField { Key = "WidgetName", PropertyName = "Name", DataType = (int)AyaDataType.Text, Hideable = false }); l.Add(new ObjectField { Key = "WidgetSerial", PropertyName = "Serial", DataType = (int)AyaDataType.Integer }); l.Add(new ObjectField { Key = "WidgetDollarAmount", PropertyName = "DollarAmount", DataType = (int)AyaDataType.Currency }); l.Add(new ObjectField { Key = "WidgetCount", PropertyName = "Count", DataType = (int)AyaDataType.Integer }); l.Add(new ObjectField { Key = "WidgetRoles", PropertyName = "Roles", DataType = (int)AyaDataType.Enum, EnumType = typeof(AuthorizationRoles).ToString() }); l.Add(new ObjectField { Key = "WidgetStartDate", PropertyName = "StartDate", DataType = (int)AyaDataType.DateTime }); l.Add(new ObjectField { Key = "WidgetEndDate", PropertyName = "EndDate", DataType = (int)AyaDataType.DateTime }); l.Add(new ObjectField { Key = "WidgetNotes", PropertyName = "Notes", DataType = (int)AyaDataType.Text }); l.Add(new ObjectField { Key = "Active", PropertyName = "Active", DataType = (int)AyaDataType.Bool, Hideable = false, SharedLTKey = true }); l.Add(new ObjectField { Key = "Tags", PropertyName = "Tags", DataType = (int)AyaDataType.Tags, SharedLTKey = true }); l.Add(new ObjectField { Key = "WidgetCustom1", PropertyName = "WidgetCustom1", Custom = true }); l.Add(new ObjectField { Key = "WidgetCustom2", PropertyName = "WidgetCustom2", Custom = true }); l.Add(new ObjectField { Key = "WidgetCustom3", PropertyName = "WidgetCustom3", Custom = true }); l.Add(new ObjectField { Key = "WidgetCustom4", PropertyName = "WidgetCustom4", Custom = true }); l.Add(new ObjectField { Key = "WidgetCustom5", PropertyName = "WidgetCustom5", Custom = true }); l.Add(new ObjectField { Key = "WidgetCustom6", PropertyName = "WidgetCustom6", Custom = true }); l.Add(new ObjectField { Key = "WidgetCustom7", PropertyName = "WidgetCustom7", Custom = true }); l.Add(new ObjectField { Key = "WidgetCustom8", PropertyName = "WidgetCustom8", Custom = true }); l.Add(new ObjectField { Key = "WidgetCustom9", PropertyName = "WidgetCustom9", Custom = true }); l.Add(new ObjectField { Key = "WidgetCustom10", PropertyName = "WidgetCustom10", Custom = true }); l.Add(new ObjectField { Key = "WidgetCustom11", PropertyName = "WidgetCustom11", Custom = true }); l.Add(new ObjectField { Key = "WidgetCustom12", PropertyName = "WidgetCustom12", Custom = true }); l.Add(new ObjectField { Key = "WidgetCustom13", PropertyName = "WidgetCustom13", Custom = true }); l.Add(new ObjectField { Key = "WidgetCustom14", PropertyName = "WidgetCustom14", Custom = true }); l.Add(new ObjectField { Key = "WidgetCustom15", PropertyName = "WidgetCustom15", Custom = true }); l.Add(new ObjectField { Key = "WidgetCustom16", PropertyName = "WidgetCustom16", Custom = true }); break; #endregion case USER_KEY: #region USER_KEY l.Add(new ObjectField { Key = "Name", PropertyName = "Name", SharedLTKey = true, DataType = (int)AyaDataType.Text, Hideable = false }); l.Add(new ObjectField { Key = "UserEmployeeNumber", PropertyName = "EmployeeNumber", DataType = (int)AyaDataType.Text }); l.Add(new ObjectField { Key = "AuthorizationRoles", PropertyName = "Roles", Hideable = false, DataType = (int)AyaDataType.Enum, EnumType = typeof(AuthorizationRoles).ToString() }); l.Add(new ObjectField { Key = "UserNotes", PropertyName = "Notes", DataType = (int)AyaDataType.Text }); l.Add(new ObjectField { Key = "UserUserType", PropertyName = "UserType", Hideable = false, DataType = (int)AyaDataType.Enum, EnumType = typeof(UserType).ToString() }); l.Add(new ObjectField { Key = "Active", PropertyName = "Active", DataType = (int)AyaDataType.Bool, Hideable = false, SharedLTKey = true }); l.Add(new ObjectField { Key = "Tags", PropertyName = "Tags", DataType = (int)AyaDataType.Tags, SharedLTKey = true }); l.Add(new ObjectField { Key = "UserCustom1", PropertyName = "UserCustom1", Custom = true }); l.Add(new ObjectField { Key = "UserCustom2", PropertyName = "UserCustom2", Custom = true }); l.Add(new ObjectField { Key = "UserCustom3", PropertyName = "UserCustom3", Custom = true }); l.Add(new ObjectField { Key = "UserCustom4", PropertyName = "UserCustom4", Custom = true }); l.Add(new ObjectField { Key = "UserCustom5", PropertyName = "UserCustom5", Custom = true }); l.Add(new ObjectField { Key = "UserCustom6", PropertyName = "UserCustom6", Custom = true }); l.Add(new ObjectField { Key = "UserCustom7", PropertyName = "UserCustom7", Custom = true }); l.Add(new ObjectField { Key = "UserCustom8", PropertyName = "UserCustom8", Custom = true }); l.Add(new ObjectField { Key = "UserCustom9", PropertyName = "UserCustom9", Custom = true }); l.Add(new ObjectField { Key = "UserCustom10", PropertyName = "UserCustom10", Custom = true }); l.Add(new ObjectField { Key = "UserCustom11", PropertyName = "UserCustom11", Custom = true }); l.Add(new ObjectField { Key = "UserCustom12", PropertyName = "UserCustom12", Custom = true }); l.Add(new ObjectField { Key = "UserCustom13", PropertyName = "UserCustom13", Custom = true }); l.Add(new ObjectField { Key = "UserCustom14", PropertyName = "UserCustom14", Custom = true }); l.Add(new ObjectField { Key = "UserCustom15", PropertyName = "UserCustom15", Custom = true }); l.Add(new ObjectField { Key = "UserCustom16", PropertyName = "UserCustom16", Custom = true }); break; #endregion default: throw new System.ArgumentOutOfRangeException($"ObjectFields: {key} is not a valid object key"); } return l; } public static string TranslateLTCustomFieldToInternalCustomFieldName(string lTCustomFieldName) { var i = System.Convert.ToInt32(System.Text.RegularExpressions.Regex.Replace( lTCustomFieldName, // Our input "[^0-9]", // Select everything that is not in the range of 0-9 "" // Replace that with an empty string. )); return $"c{i}"; } //Accept a json template //return a column list suitable for api list return public static string GenerateListColumnJSONFromTemplate(string ObjectKey, string template) { //parse the template var jtemplate = JObject.Parse(template); var fields = ObjectFieldsList(ObjectKey); //convert to strings (https://stackoverflow.com/a/33836599/8939) var fullFields = ((JArray)jtemplate["full"]).ToObject(); //Generate JSON fragment to return with column definitions StringBuilder sb = new StringBuilder(); sb.Append("["); var isFirstColumn = true; foreach (string s in fullFields) { ObjectField o = fields.FirstOrDefault(x => x.Key == s); if (o != null) {//Here is where we can vet the field name, if it doesn't exist though, for now we'll just ignore it if (!isFirstColumn) { sb.Append(","); } sb.Append("{"); //Build required part of column definition sb.Append($"\"cm\":\"{o.Key}\",\"dt\":{(int)o.DataType}"); //Has a AyObjectType? (linkable / openable) if (o.AyObjectType != 0) sb.Append($",\"ay\":{(int)o.AyObjectType}"); sb.Append("}"); isFirstColumn = false; } } sb.Append("]"); return sb.ToString(); } }//eoc ObjectFields public class ObjectField { public string Key { get; set; } public string PropertyName { get; set; } public bool Hideable { get; set; } public bool SharedLTKey { get; set; } public bool Custom { get; set; } public bool Filterable { get; set; } public bool Sortable { get; set; } public bool MiniAvailable { get; set; } public int DataType { get; set; } //If it's an enum DataType then this is the specific enum type which sb the name of the class that holds the enum in the server project public string EnumType { get; set; } //if field is a reference to another object (i.e. a client in a workorders list) //then the type to open is set here public int AyObjectType { get; set; } public ObjectField() { //most common defaults SharedLTKey = false; Hideable = true; Custom = false; Filterable = true; Sortable = true; MiniAvailable = true; //Set openable object type to no type which is the default and means it's not a link to another object AyObjectType = (int)AyaType.NoType; } } }//ens