This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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);
|
||||||
}
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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",
|
||||||
|
|||||||
@@ -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"
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user