Moved populator methods to corresponding classes

This commit is contained in:
2024-10-06 11:26:54 +02:00
parent 6a110d5b8b
commit dd67bba07d
5 changed files with 113 additions and 106 deletions

View File

@@ -8,6 +8,7 @@ public interface IAdminPropertyGenerator {
IAdminPropertyGenerator DisplayInListing(bool display = true); IAdminPropertyGenerator DisplayInListing(bool display = true);
IAdminPropertyGenerator Bold(bool isBold = true); IAdminPropertyGenerator Bold(bool isBold = true);
IAdminPropertyGenerator Ignore(bool ignore = true); IAdminPropertyGenerator Ignore(bool ignore = true);
IAdminPropertyGenerator Generated(bool generated = true);
IAdminPropertyGenerator DisplayName(string displayName); IAdminPropertyGenerator DisplayName(string displayName);
IAdminPropertyGenerator Description(string description); IAdminPropertyGenerator Description(string description);

View File

@@ -1,6 +1,3 @@
using System.Reflection;
using HopFrame.Web.Admin.Attributes;
using HopFrame.Web.Admin.Attributes.Classes;
using HopFrame.Web.Admin.Models; using HopFrame.Web.Admin.Models;
using HopFrame.Web.Admin.Providers; using HopFrame.Web.Admin.Providers;
@@ -14,9 +11,8 @@ internal class AdminContextGenerator : IAdminContextGenerator {
if (_adminPages.TryGetValue(typeof(TModel), out var pageGenerator)) if (_adminPages.TryGetValue(typeof(TModel), out var pageGenerator))
return pageGenerator as IAdminPageGenerator<TModel>; return pageGenerator as IAdminPageGenerator<TModel>;
var generator = Activator.CreateInstance(typeof(IAdminPageGenerator<TModel>)) as IAdminPageGenerator<TModel>; var generator = Activator.CreateInstance(typeof(IAdminPageGenerator<TModel>)) as AdminPageGenerator<TModel>;
generator?.ApplyConfigurationFromAttributes(typeof(TModel).GetCustomAttributes(false));
ApplyConfigurationFromAttributes(generator, typeof(TModel).GetCustomAttributes(false));
_adminPages.Add(typeof(TModel), generator); _adminPages.Add(typeof(TModel), generator);
@@ -43,10 +39,8 @@ internal class AdminContextGenerator : IAdminContextGenerator {
var pageGeneratorType = typeof(AdminPageGenerator<>).MakeGenericType(propertyType); var pageGeneratorType = typeof(AdminPageGenerator<>).MakeGenericType(propertyType);
var generatorInstance = Activator.CreateInstance(pageGeneratorType, [property.Name]); // Calls constructor with title attribute var generatorInstance = Activator.CreateInstance(pageGeneratorType, [property.Name]); // Calls constructor with title attribute
var populatorMethod = typeof(AdminContextGenerator) var populatorMethod = pageGeneratorType.GetMethod(nameof(AdminPageGenerator<TContext>.ApplyConfigurationFromAttributes));
.GetMethod(nameof(ApplyConfigurationFromAttributes))? populatorMethod?.Invoke(generatorInstance, [propertyType.GetCustomAttributes(false)]);
.MakeGenericMethod(propertyType);
populatorMethod?.Invoke(this, [generatorInstance, propertyType.GetCustomAttributes()]);
_adminPages.Add(propertyType, generatorInstance); _adminPages.Add(propertyType, generatorInstance);
} }
@@ -62,37 +56,7 @@ internal class AdminContextGenerator : IAdminContextGenerator {
return context; return context;
} }
public void ApplyConfigurationFromAttributes<TModel>(IAdminPageGenerator<TModel> generator, object[] attributes) {
if (attributes.Any(a => a is AdminNameAttribute)) {
var attribute = attributes.Single(a => a is AdminNameAttribute) as AdminNameAttribute;
generator.Title(attribute?.Name);
}
if (attributes.Any(a => a is AdminDescriptionAttribute)) {
var attribute = attributes.Single(a => a is AdminDescriptionAttribute) as AdminDescriptionAttribute;
generator.Description(attribute?.Description);
}
if (attributes.Any(a => a is AdminUrlAttribute)) {
var attribute = attributes.Single(a => a is AdminUrlAttribute) as AdminUrlAttribute;
generator.Url(attribute?.Url);
}
if (attributes.Any(a => a is AdminPermissionsAttribute)) {
var attribute = attributes.Single(a => a is AdminPermissionsAttribute) as AdminPermissionsAttribute;
generator.CreatePermission(attribute?.Permissions.Create);
generator.UpdatePermission(attribute?.Permissions.Update);
generator.ViewPermission(attribute?.Permissions.View);
generator.DeletePermission(attribute?.Permissions.Delete);
}
if (attributes.Any(a => a is AdminButtonConfigAttribute)) {
var attribute = attributes.Single(a => a is AdminButtonConfigAttribute) as AdminButtonConfigAttribute;
generator.ShowCreateButton(attribute?.ShowCreateButton == true);
generator.ShowUpdateButton(attribute?.ShowUpdateButton == true);
generator.ShowDeleteButton(attribute?.ShowDeleteButton == true);
}
}
public static void RegisterPages(AdminPagesContext context, IAdminPagesProvider provider) { public static void RegisterPages(AdminPagesContext context, IAdminPagesProvider provider) {
var properties = context.GetType().GetProperties(); var properties = context.GetType().GetProperties();

View File

@@ -1,20 +1,19 @@
using System.ComponentModel; using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Reflection; using System.Reflection;
using HopFrame.Web.Admin.Attributes; using HopFrame.Web.Admin.Attributes;
using HopFrame.Web.Admin.Attributes.Members; using HopFrame.Web.Admin.Attributes.Classes;
using HopFrame.Web.Admin.Models; using HopFrame.Web.Admin.Models;
namespace HopFrame.Web.Admin.Generators.Implementation; namespace HopFrame.Web.Admin.Generators.Implementation;
internal sealed class AdminPageGenerator<TModel> : IAdminPageGenerator<TModel>, IGenerator<AdminPage<TModel>> { internal sealed class AdminPageGenerator<TModel> : IAdminPageGenerator<TModel>, IGenerator<AdminPage<TModel>> {
private readonly AdminPage<TModel> _page; public readonly AdminPage<TModel> Page;
private readonly IDictionary<string, AdminPropertyGenerator> _propertyGenerators; private readonly IDictionary<string, AdminPropertyGenerator> _propertyGenerators;
public AdminPageGenerator() { public AdminPageGenerator() {
_page = new AdminPage<TModel> { Page = new AdminPage<TModel> {
Permissions = new AdminPagePermissions() Permissions = new AdminPagePermissions()
}; };
_propertyGenerators = new Dictionary<string, AdminPropertyGenerator>(); _propertyGenerators = new Dictionary<string, AdminPropertyGenerator>();
@@ -26,8 +25,7 @@ internal sealed class AdminPageGenerator<TModel> : IAdminPageGenerator<TModel>,
var attributes = property.GetCustomAttributes(false); var attributes = property.GetCustomAttributes(false);
var generator = Activator.CreateInstance(typeof(AdminPropertyGenerator), [property.Name, property.PropertyType]) as AdminPropertyGenerator; var generator = Activator.CreateInstance(typeof(AdminPropertyGenerator), [property.Name, property.PropertyType]) as AdminPropertyGenerator;
generator?.ApplyConfigurationFromAttributes(this, attributes, property);
ApplyConfigurationFromAttributes(generator, attributes, property);
_propertyGenerators.Add(property.Name, generator); _propertyGenerators.Add(property.Name, generator);
} }
@@ -38,66 +36,66 @@ internal sealed class AdminPageGenerator<TModel> : IAdminPageGenerator<TModel>,
} }
public IAdminPageGenerator<TModel> Title(string title) { public IAdminPageGenerator<TModel> Title(string title) {
_page.Title = title; Page.Title = title;
_page.Url ??= title.ToLower(); Page.Url ??= title.ToLower();
return this; return this;
} }
public IAdminPageGenerator<TModel> Description(string description) { public IAdminPageGenerator<TModel> Description(string description) {
_page.Description = description; Page.Description = description;
return this; return this;
} }
public IAdminPageGenerator<TModel> Url(string url) { public IAdminPageGenerator<TModel> Url(string url) {
_page.Url = url; Page.Url = url;
return this; return this;
} }
public IAdminPageGenerator<TModel> ViewPermission(string permission) { public IAdminPageGenerator<TModel> ViewPermission(string permission) {
_page.Permissions.View = permission; Page.Permissions.View = permission;
return this; return this;
} }
public IAdminPageGenerator<TModel> CreatePermission(string permission) { public IAdminPageGenerator<TModel> CreatePermission(string permission) {
_page.Permissions.Create = permission; Page.Permissions.Create = permission;
return this; return this;
} }
public IAdminPageGenerator<TModel> UpdatePermission(string permission) { public IAdminPageGenerator<TModel> UpdatePermission(string permission) {
_page.Permissions.Update = permission; Page.Permissions.Update = permission;
return this; return this;
} }
public IAdminPageGenerator<TModel> DeletePermission(string permission) { public IAdminPageGenerator<TModel> DeletePermission(string permission) {
_page.Permissions.Delete = permission; Page.Permissions.Delete = permission;
return this; return this;
} }
public IAdminPageGenerator<TModel> ShowCreateButton(bool show) { public IAdminPageGenerator<TModel> ShowCreateButton(bool show) {
_page.ShowCreateButton = show; Page.ShowCreateButton = show;
return this; return this;
} }
public IAdminPageGenerator<TModel> ShowDeleteButton(bool show) { public IAdminPageGenerator<TModel> ShowDeleteButton(bool show) {
_page.ShowDeleteButton = show; Page.ShowDeleteButton = show;
return this; return this;
} }
public IAdminPageGenerator<TModel> ShowUpdateButton(bool show) { public IAdminPageGenerator<TModel> ShowUpdateButton(bool show) {
_page.ShowUpdateButton = show; Page.ShowUpdateButton = show;
return this; return this;
} }
public IAdminPageGenerator<TModel> DefaultSort<TProperty>(Expression<Func<TModel, TProperty>> propertyExpression, ListSortDirection direction) { public IAdminPageGenerator<TModel> DefaultSort<TProperty>(Expression<Func<TModel, TProperty>> propertyExpression, ListSortDirection direction) {
var property = GetPropertyInfo(propertyExpression); var property = GetPropertyInfo(propertyExpression);
_page.DefaultSortPropertyName = property.Name; Page.DefaultSortPropertyName = property.Name;
_page.DefaultSortDirection = direction; Page.DefaultSortDirection = direction;
return this; return this;
} }
public IAdminPageGenerator<TModel> ConfigureRepository<TRepository>() where TRepository : IModelRepository<TModel> { public IAdminPageGenerator<TModel> ConfigureRepository<TRepository>() where TRepository : IModelRepository<TModel> {
_page.RepositoryProvider = typeof(TRepository); Page.RepositoryProvider = typeof(TRepository);
return this; return this;
} }
@@ -108,7 +106,7 @@ internal sealed class AdminPageGenerator<TModel> : IAdminPageGenerator<TModel>,
return propertyGenerator; return propertyGenerator;
var generator = Activator.CreateInstance(typeof(AdminPropertyGenerator), new { property.Name, property.PropertyType }) as AdminPropertyGenerator; var generator = Activator.CreateInstance(typeof(AdminPropertyGenerator), new { property.Name, property.PropertyType }) as AdminPropertyGenerator;
ApplyConfigurationFromAttributes(generator, property.GetCustomAttributes(false), property); generator?.ApplyConfigurationFromAttributes(this, property.GetCustomAttributes(false), property);
_propertyGenerators.Add(property.Name, generator); _propertyGenerators.Add(property.Name, generator);
return generator; return generator;
@@ -121,51 +119,9 @@ internal sealed class AdminPageGenerator<TModel> : IAdminPageGenerator<TModel>,
properties.Add(generator.Compile()); properties.Add(generator.Compile());
} }
_page.Properties = properties; Page.Properties = properties;
return _page; return Page;
}
private void ApplyConfigurationFromAttributes(AdminPropertyGenerator generator, object[] attributes, PropertyInfo property) {
if (attributes.Any(a => a is KeyAttribute)) {
_page.DefaultSortPropertyName = property.Name;
generator.Bold();
generator.Editable(false);
}
if (attributes.Any(a => a is AdminUnsortableAttribute))
generator.Sortable(false);
if (attributes.Any(a => a is AdminUneditableAttribute))
generator.Editable(false);
if (attributes.Any(a => a is AdminBoldAttribute))
generator.Bold();
if (attributes.Any(a => a is AdminIgnoreAttribute)) {
var attribute = attributes.Single(a => a is AdminIgnoreAttribute) as AdminIgnoreAttribute;
generator.DisplayInListing(false);
generator.Sortable(false);
generator.Ignore(attribute?.OnlyForListing == false);
}
if (attributes.Any(a => a is AdminHideValueAttribute))
generator.DisplayValueWhileEditing(false);
if (attributes.Any(a => a is AdminNameAttribute)) {
var attribute = attributes.Single(a => a is AdminNameAttribute) as AdminNameAttribute;
generator.DisplayName(attribute?.Name);
}
if (attributes.Any(a => a is AdminDescriptionAttribute)) {
var attribute = attributes.Single(a => a is AdminDescriptionAttribute) as AdminDescriptionAttribute;
generator.Description(attribute?.Description);
}
if (attributes.Any(a => a is AdminPrefixAttribute)) {
var attribute = attributes.Single(a => a is AdminPrefixAttribute) as AdminPrefixAttribute;
generator.Prefix(attribute?.Prefix);
}
} }
private static PropertyInfo GetPropertyInfo<TSource, TProperty>(Expression<Func<TSource, TProperty>> propertyLambda) { private static PropertyInfo GetPropertyInfo<TSource, TProperty>(Expression<Func<TSource, TProperty>> propertyLambda) {
@@ -189,4 +145,35 @@ internal sealed class AdminPageGenerator<TModel> : IAdminPageGenerator<TModel>,
return propInfo; return propInfo;
} }
public void ApplyConfigurationFromAttributes(object[] attributes) {
if (attributes.Any(a => a is AdminNameAttribute)) {
var attribute = attributes.Single(a => a is AdminNameAttribute) as AdminNameAttribute;
Title(attribute?.Name);
}
if (attributes.Any(a => a is AdminDescriptionAttribute)) {
var attribute = attributes.Single(a => a is AdminDescriptionAttribute) as AdminDescriptionAttribute;
Description(attribute?.Description);
}
if (attributes.Any(a => a is AdminUrlAttribute)) {
var attribute = attributes.Single(a => a is AdminUrlAttribute) as AdminUrlAttribute;
Url(attribute?.Url);
}
if (attributes.Any(a => a is AdminPermissionsAttribute)) {
var attribute = attributes.Single(a => a is AdminPermissionsAttribute) as AdminPermissionsAttribute;
CreatePermission(attribute?.Permissions.Create);
UpdatePermission(attribute?.Permissions.Update);
ViewPermission(attribute?.Permissions.View);
DeletePermission(attribute?.Permissions.Delete);
}
if (attributes.Any(a => a is AdminButtonConfigAttribute)) {
var attribute = attributes.Single(a => a is AdminButtonConfigAttribute) as AdminButtonConfigAttribute;
ShowCreateButton(attribute?.ShowCreateButton == true);
ShowUpdateButton(attribute?.ShowUpdateButton == true);
ShowDeleteButton(attribute?.ShowDeleteButton == true);
}
}
} }

View File

@@ -1,3 +1,8 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Reflection;
using HopFrame.Web.Admin.Attributes;
using HopFrame.Web.Admin.Attributes.Members;
using HopFrame.Web.Admin.Models; using HopFrame.Web.Admin.Models;
namespace HopFrame.Web.Admin.Generators.Implementation; namespace HopFrame.Web.Admin.Generators.Implementation;
@@ -40,6 +45,11 @@ internal sealed class AdminPropertyGenerator(string name, Type type) : IAdminPro
return this; return this;
} }
public IAdminPropertyGenerator Generated(bool generated = true) {
_property.Generated = generated;
return this;
}
public IAdminPropertyGenerator DisplayName(string displayName) { public IAdminPropertyGenerator DisplayName(string displayName) {
_property.DisplayName = displayName; _property.DisplayName = displayName;
return this; return this;
@@ -57,7 +67,51 @@ internal sealed class AdminPropertyGenerator(string name, Type type) : IAdminPro
public AdminPageProperty Compile() { public AdminPageProperty Compile() {
_property.DisplayName ??= _property.Name; _property.DisplayName ??= _property.Name;
return _property; return _property;
} }
public void ApplyConfigurationFromAttributes<T>(AdminPageGenerator<T> pageGenerator, object[] attributes, PropertyInfo property) {
if (attributes.Any(a => a is KeyAttribute)) {
pageGenerator.Page.DefaultSortPropertyName = property.Name;
Bold();
Editable(false);
}
if (attributes.Any(a => a is AdminUnsortableAttribute))
Sortable(false);
if (attributes.Any(a => a is AdminUneditableAttribute))
Editable(false);
if (attributes.Any(a => a is AdminBoldAttribute))
Bold();
if (attributes.Any(a => a is AdminIgnoreAttribute)) {
var attribute = attributes.Single(a => a is AdminIgnoreAttribute) as AdminIgnoreAttribute;
DisplayInListing(false);
Sortable(false);
Ignore(attribute?.OnlyForListing == false);
}
if (attributes.Any(a => a is AdminHideValueAttribute))
DisplayValueWhileEditing(false);
if (attributes.Any(a => a is DatabaseGeneratedAttribute))
Generated();
if (attributes.Any(a => a is AdminNameAttribute)) {
var attribute = attributes.Single(a => a is AdminNameAttribute) as AdminNameAttribute;
DisplayName(attribute?.Name);
}
if (attributes.Any(a => a is AdminDescriptionAttribute)) {
var attribute = attributes.Single(a => a is AdminDescriptionAttribute) as AdminDescriptionAttribute;
Description(attribute?.Description);
}
if (attributes.Any(a => a is AdminPrefixAttribute)) {
var attribute = attributes.Single(a => a is AdminPrefixAttribute) as AdminPrefixAttribute;
Prefix(attribute?.Prefix);
}
}
} }

View File

@@ -12,6 +12,7 @@ public sealed class AdminPageProperty {
public bool Sortable { get; set; } = true; public bool Sortable { get; set; } = true;
public bool Editable { get; set; } = true; public bool Editable { get; set; } = true;
public bool EditDisplayValue { get; set; } = true; public bool EditDisplayValue { get; set; } = true;
public bool Generated { get; set; }
public bool Bold { get; set; } public bool Bold { get; set; }
public bool Ignore { get; set; } public bool Ignore { get; set; }
[JsonIgnore] [JsonIgnore]