DFUtils.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using InABox.Core.Notifications;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. namespace InABox.Core
  7. {
  8. public interface IEntityFormUtils
  9. {
  10. public abstract bool CanEditForm(IDigitalFormInstance Form, Entity Entity);
  11. }
  12. public class EntityFormUtils<TForm, TEntity, TEntityLink> : IEntityFormUtils
  13. where TForm : EntityForm<TEntity, TEntityLink>
  14. where TEntity : Entity, new()
  15. where TEntityLink : EntityLink<TEntity>, new()
  16. {
  17. public delegate bool CanEditForm(TForm Form, TEntity Entity);
  18. public CanEditForm CanEdit;
  19. public EntityFormUtils(CanEditForm canEditForm)
  20. {
  21. CanEdit = canEditForm;
  22. }
  23. bool IEntityFormUtils.CanEditForm(IDigitalFormInstance Form, Entity Entity)
  24. => CanEdit((Form as TForm)!, (Entity as TEntity)!);
  25. }
  26. public static class DFUtils
  27. {
  28. private static List<Type>? _fieldTypes;
  29. public static List<Type> GetFieldTypes()
  30. {
  31. _fieldTypes ??= CoreUtils.TypeList(
  32. AppDomain.CurrentDomain.GetAssemblies(),
  33. x => x.IsClass
  34. && !x.IsAbstract
  35. && !x.IsGenericType
  36. && x.GetInterfaces().Any(x => x == typeof(IDFLayoutFormField))).ToList();
  37. return _fieldTypes;
  38. }
  39. public static Type? GetFieldType(string typeName)
  40. {
  41. var type = GetFieldTypes().Where(x => x.FullName == typeName).FirstOrDefault();
  42. if(type != null) return type;
  43. if(Enum.TryParse(typeName, out DigitalFormVariableType variableType))
  44. {
  45. // For the old types
  46. switch (variableType)
  47. {
  48. case DigitalFormVariableType.String:
  49. return typeof(DFLayoutStringField);
  50. case DigitalFormVariableType.Boolean:
  51. return typeof(DFLayoutBooleanField);
  52. case DigitalFormVariableType.Integer:
  53. return typeof(DFLayoutIntegerField);
  54. case DigitalFormVariableType.Double:
  55. return typeof(DFLayoutDoubleField);
  56. case DigitalFormVariableType.Date:
  57. return typeof(DFLayoutDateField);
  58. case DigitalFormVariableType.Time:
  59. return typeof(DFLayoutTimeField);
  60. case DigitalFormVariableType.Choice:
  61. return typeof(DFLayoutOptionField);
  62. case DigitalFormVariableType.Lookup:
  63. return typeof(DFLayoutLookupField);
  64. case DigitalFormVariableType.SignaturePad:
  65. return typeof(DFLayoutSignaturePad);
  66. case DigitalFormVariableType.EmbeddedImage:
  67. return typeof(DFLayoutEmbeddedImage);
  68. case DigitalFormVariableType.MultiImage:
  69. return typeof(DFLayoutMultiImage);
  70. }
  71. }
  72. return null;
  73. }
  74. private static Dictionary<Type, IEntityFormUtils> _formUtils = new Dictionary<Type, IEntityFormUtils>();
  75. public static void AddFormUtils<TForm, TEntity, TEntityLink>(EntityFormUtils<TForm, TEntity, TEntityLink>.CanEditForm editFormFunc)
  76. where TForm : EntityForm<TEntity, TEntityLink>
  77. where TEntity : Entity, new()
  78. where TEntityLink : EntityLink<TEntity>, new()
  79. {
  80. _formUtils.Add(typeof(TForm), new EntityFormUtils<TForm, TEntity, TEntityLink>(editFormFunc));
  81. }
  82. public static bool CanEditForm(Type TForm, IDigitalFormInstance Form, Entity Entity)
  83. {
  84. if(_formUtils.TryGetValue(TForm, out var utils))
  85. {
  86. return utils.CanEditForm(Form, Entity);
  87. }
  88. return false;
  89. }
  90. public static bool CanEditForm<TForm, TEntity, TEntityLink>(TForm Form, TEntity Entity)
  91. where TForm : EntityForm<TEntity, TEntityLink>
  92. where TEntity : Entity, new()
  93. where TEntityLink : EntityLink<TEntity>, new()
  94. {
  95. return CanEditForm(typeof(TForm), Form, Entity);
  96. }
  97. }
  98. }