This commit is contained in:
2020-03-17 17:59:12 +00:00
parent 63c278014f
commit 54efbd9df8
6 changed files with 13 additions and 250 deletions

View File

@@ -8,7 +8,6 @@
//PICKLISTS: //PICKLISTS:
todo: all template routes and actual backing code and also validation, needs to validate templates
todo: clean out unneeded leftovers from AyaPickListFieldDefinition todo: clean out unneeded leftovers from AyaPickListFieldDefinition
todo: add pickers for all CORE objects (User...?) todo: add pickers for all CORE objects (User...?)
todo: write a guide in ayatype for what to do when making a new core object as there are a few things now todo: write a guide in ayatype for what to do when making a new core object as there are a few things now

View File

@@ -1,36 +1,24 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Text;
using AyaNova.Biz; using AyaNova.Biz;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Microsoft.EntityFrameworkCore;
namespace AyaNova.PickList namespace AyaNova.PickList
{ {
/// <summary> /// <summary>
/// PickList object base class /// PickList object base class
/// </summary> /// </summary>
internal abstract class AyaPickList : IAyaPickList internal abstract class AyaPickList : IAyaPickList
{ {
public AyaPickList() public AyaPickList()
{ {}
}
public string SQLFrom { get; set; } public string SQLFrom { get; set; }
public List<AyaPickListFieldDefinition> ColumnDefinitions { get; set; } public List<AyaPickListFieldDefinition> ColumnDefinitions { get; set; }
public AuthorizationRoles AllowedRoles { get; set; } public AuthorizationRoles AllowedRoles { get; set; }
public AyaType DefaultListObjectType { get; set; } public AyaType DefaultListObjectType { get; set; }
public string DefaultTemplate { get; set; } public string DefaultTemplate { get; set; }
//return array of field keys in list view //return array of field keys in list view
public List<string> GetFieldListFromTemplate(JArray template) public List<string> GetFieldListFromTemplate(JArray template)
{ {
// [{key:"COLUMN UNIQUE KEY ID",sort:"-" or "+",filter:{any:true/false,items:[{FILTER OBJECT SEE BELOW}]} }, {key:"second column unique key"},{...etc...}]
List<string> ret = new List<string>(); List<string> ret = new List<string>();
for (int i = 0; i < template.Count; i++) for (int i = 0; i < template.Count; i++)
{ {
@@ -39,180 +27,5 @@ namespace AyaNova.PickList
} }
return ret; return ret;
} }
public Newtonsoft.Json.Linq.JArray GenerateListColumnsJSONFromTemplate(JArray template)
{
var ListViewFieldKeys = GetFieldListFromTemplate(template);
var CustomFieldDefinitions = GetCustomFieldDefinitionsForList();
//Generate JSON fragment to return with column definitions
StringBuilder sb = new StringBuilder();
sb.Append("[");
bool FirstColumnAdded = false;
foreach (string s in ListViewFieldKeys)
{
AyaPickListFieldDefinition o = ColumnDefinitions.FirstOrDefault(x => x.FieldKey == s);
#if (DEBUG)
//Developers little helper
if (o == null)
{
throw new System.ArgumentNullException($"DEV ERROR in AyaPickList::GenerateListColumnsJSONFromListView - field {s} specified in ListView was NOT found in ObjectFields list");
}
#endif
if (o != null)
{//Here is where we can vet the field name, if it doesn't exist. For production we'll just ignore those ones
if (FirstColumnAdded)
sb.Append(",");
sb.Append("{");
//Build required part of column definition
if (!o.IsCustomField)
sb.Append($"\"cm\":\"{o.LtKey}\",\"dt\":{(int)o.ColumnDataType}");
else
{
//insert specific type for this custom field
if (CustomFieldDefinitions.ContainsKey(o.LtKey))
{
var customFieldType = CustomFieldDefinitions[o.LtKey];
sb.Append($"\"cm\":\"{o.LtKey}\",\"dt\":{customFieldType}");
}
else
{
//this is normal as there may not be a definition for a Custom field but it's been requested so just treat it like text
sb.Append($"\"cm\":\"{o.LtKey}\",\"dt\":{(int)UiFieldDataType.Text}");
}
}
//Has a AyObjectType? (linkable / openable)
if (o.AyaObjectType != 0)
sb.Append($",\"ay\":{(int)o.AyaObjectType}");
//Row ID column?
if (o.IsRowId)
{
sb.Append($",\"rid\":1");
}
//Has a Enumtype?
if (!string.IsNullOrEmpty(o.EnumType))
sb.Append($",\"et\":\"{AyaNova.Util.StringUtil.TrimTypeName(o.EnumType)}\"");
sb.Append("}");
FirstColumnAdded = true;
}
}
sb.Append("]");
return JArray.Parse(sb.ToString());
}
//Find and return a dictionary of all custom fields definitions for all types in list
//used to build the column array and define specific type defined for custom fields so client datatable
//knows how to format it
private Dictionary<string, int> GetCustomFieldDefinitionsForList()
{
//all keys and types can go in the same list since they are unique to each type of list
//i.e. both users and widget custom fields can be in the same list
Dictionary<string, int> ret = new Dictionary<string, int>();
List<string> typesProcessed = new List<string>();
//custom fields handling
foreach (AyaPickListFieldDefinition d in this.ColumnDefinitions)
{
if (d.IsCustomField)
{
//this relies on the convention I'm using of AyaType name as the first part of all custom fields lT keys, e.g.
//WidgetCustom1 -> Widget
var ayatypename = d.LtKey.Split("Custom")[0];
if (!typesProcessed.Contains(ayatypename))
{
//make sure we do each type only once
typesProcessed.Add(ayatypename);
//fetch it and set it
using (var ct = AyaNova.Util.ServiceProviderProvider.DBContext)
{
var fc = ct.FormCustom.AsNoTracking().SingleOrDefault(x => x.FormKey == ayatypename);
#if (DEBUG)
if (fc == null)
{
throw new System.ArgumentNullException($"AyaPickList:GetCustomFieldDefinitionsForList, Custom field object type {ayatypename} has no FormCustom defined");
}
#endif
//production handling of missing formcustom
if (fc == null)
continue;
//iterate the fields and add each custom one with a type to the return dictionary
var flds = JArray.Parse(fc.Template);
foreach (JToken t in flds)
{
if (t["type"] != null)
{
ret.Add(t["fld"].Value<string>(), t["type"].Value<int>());
}
}
}
}
}
}
/*{[
{
"fld": "Notes",
"required": true
},
{
"fld": "WidgetCustom1",
"required": false,
"type": 1
},
{
"fld": "WidgetCustom2",
"required": true,
"type": 4
},
{
"fld": "WidgetCustom3",
"required": false,
"type": 5
},
{
"fld": "WidgetCustom4",
"required": false,
"type": 6
},
{
"fld": "WidgetCustom5",
"required": false,
"type": 8
},
{
"fld": "WidgetCustom6",
"required": false,
"type": 2
},
{
"fld": "WidgetCustom7",
"required": false,
"type": 3
}
]}*/
return ret;
}
}//eoc }//eoc
}//eons }//eons

View File

@@ -8,62 +8,27 @@ namespace AyaNova.PickList
//This class defines a field used for returning data in list format for UI pick lists //This class defines a field used for returning data in list format for UI pick lists
public class AyaPickListFieldDefinition public class AyaPickListFieldDefinition
{ {
//TODO: Many of these options are redundant for a picklist as this object was copied from datalist
//TODO: remove the redundant options once it's working
//CLIENT / SERVER Unique identifier used at BOTH client and server //CLIENT / SERVER Unique identifier used at BOTH client and server
//also the sql displaycolumnname if identical //also the sql displaycolumnname if identical
public string FieldKey { get; set; } public string FieldKey { get; set; }
//CLIENT Use only for display //CLIENT Use only for display
public string LtKey { get; set; } public string LtKey { get; set; }
// Used for casting query
//CLIENT / SERVER - client display server validation purposes
public bool IsCustomField { get; set; }
//CLIENT / SERVER - client display server validation purposes
public bool IsFilterable { get; set; }
//CLIENT / SERVER - client display server validation purposes
public bool IsSortable { get; set; }
//PL Used for casting query
public UiFieldDataType ColumnDataType { get; set; } public UiFieldDataType ColumnDataType { get; set; }
//CLIENT Use only for display
public string EnumType { get; set; }
//PL Used
public bool IsRowId { get; set; } public bool IsRowId { get; set; }
//PL Used
public bool IsActiveColumn { get; set; } public bool IsActiveColumn { get; set; }
public AyaType AyaObjectType { get; set; } public AyaType AyaObjectType { get; set; }
//PL Used
[JsonIgnore] [JsonIgnore]
public string SqlIdColumnName { get; set; } public string SqlIdColumnName { get; set; }
[JsonIgnore] [JsonIgnore]
public string SqlValueColumnName { get; set; } public string SqlValueColumnName { get; set; }
public AyaPickListFieldDefinition() public AyaPickListFieldDefinition()
{ {
//most common defaults //most common defaults
IsCustomField = false;
IsFilterable = true;
IsSortable = true;
IsRowId = false; IsRowId = false;
IsActiveColumn = false; IsActiveColumn = false;
//Set openable object type to no type which is the default and means it's not a link to another object // AyaObjectType = (int)AyaType.NoType;
AyaObjectType = (int)AyaType.NoType;
} }
@@ -80,10 +45,10 @@ namespace AyaNova.PickList
} }
} }
public bool HasIdColumn() // public bool HasIdColumn()
{ // {
return !string.IsNullOrWhiteSpace(SqlIdColumnName); // return !string.IsNullOrWhiteSpace(SqlIdColumnName);
} // }
} }
} }

View File

@@ -4,29 +4,17 @@ using AyaNova.Biz;
namespace AyaNova.PickList namespace AyaNova.PickList
{ {
internal interface IAyaPickList internal interface IAyaPickList
{ {
//Item has an active column
//sql query from fragment with table joins et //sql query from fragment with table joins et
string SQLFrom { get; set; } string SQLFrom { get; set; }
//List of fields for this object //List of fields for this object
List<AyaPickListFieldDefinition> ColumnDefinitions { get; set; } List<AyaPickListFieldDefinition> ColumnDefinitions { get; set; }
//allowed roles to access this list //allowed roles to access this list
AuthorizationRoles AllowedRoles { get; set; } AuthorizationRoles AllowedRoles { get; set; }
//Default object type to open for rows of this list (use no object if no) //Default object type to open for rows of this list (use no object if no)
AyaType DefaultListObjectType { get; set; } AyaType DefaultListObjectType { get; set; }
//Default / STOCK DataListView when none is specified //Default / STOCK DataListView when none is specified
string DefaultTemplate { get; set; } string DefaultTemplate { get; set; }
Newtonsoft.Json.Linq.JArray GenerateListColumnsJSONFromTemplate(JArray listViewArray);
List<string> GetFieldListFromTemplate(JArray listViewArray); List<string> GetFieldListFromTemplate(JArray listViewArray);
} }
} }

View File

@@ -46,7 +46,6 @@ namespace AyaNova.PickList
{ {
LtKey = "UserName", LtKey = "UserName",
FieldKey = "username", FieldKey = "username",
AyaObjectType = AyaType.User,
ColumnDataType = UiFieldDataType.Text, ColumnDataType = UiFieldDataType.Text,
SqlIdColumnName = "auser.id", SqlIdColumnName = "auser.id",
SqlValueColumnName = "auser.name", SqlValueColumnName = "auser.name",

View File

@@ -46,7 +46,7 @@ namespace AyaNova.PickList
{ {
LtKey = "WidgetName", LtKey = "WidgetName",
FieldKey = "widgetname", FieldKey = "widgetname",
AyaObjectType = AyaType.Widget, //AyaObjectType = AyaType.Widget,
ColumnDataType = UiFieldDataType.Text, ColumnDataType = UiFieldDataType.Text,
SqlIdColumnName = "awidget.id", SqlIdColumnName = "awidget.id",
SqlValueColumnName = "awidget.name", SqlValueColumnName = "awidget.name",
@@ -66,7 +66,6 @@ namespace AyaNova.PickList
FieldKey = "username", FieldKey = "username",
LtKey = "User", LtKey = "User",
ColumnDataType = UiFieldDataType.Text, ColumnDataType = UiFieldDataType.Text,
AyaObjectType = AyaType.User,
SqlIdColumnName = "auser.id", SqlIdColumnName = "auser.id",
SqlValueColumnName = "auser.name" SqlValueColumnName = "auser.name"
}); });