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 Bold(bool isBold = true);
IAdminPropertyGenerator Ignore(bool ignore = true);
IAdminPropertyGenerator Generated(bool generated = true);
IAdminPropertyGenerator DisplayName(string displayName);
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.Providers;
@@ -14,9 +11,8 @@ internal class AdminContextGenerator : IAdminContextGenerator {
if (_adminPages.TryGetValue(typeof(TModel), out var pageGenerator))
return pageGenerator as IAdminPageGenerator<TModel>;
var generator = Activator.CreateInstance(typeof(IAdminPageGenerator<TModel>)) as IAdminPageGenerator<TModel>;
ApplyConfigurationFromAttributes(generator, typeof(TModel).GetCustomAttributes(false));
var generator = Activator.CreateInstance(typeof(IAdminPageGenerator<TModel>)) as AdminPageGenerator<TModel>;
generator?.ApplyConfigurationFromAttributes(typeof(TModel).GetCustomAttributes(false));
_adminPages.Add(typeof(TModel), generator);
@@ -43,10 +39,8 @@ internal class AdminContextGenerator : IAdminContextGenerator {
var pageGeneratorType = typeof(AdminPageGenerator<>).MakeGenericType(propertyType);
var generatorInstance = Activator.CreateInstance(pageGeneratorType, [property.Name]); // Calls constructor with title attribute
var populatorMethod = typeof(AdminContextGenerator)
.GetMethod(nameof(ApplyConfigurationFromAttributes))?
.MakeGenericMethod(propertyType);
populatorMethod?.Invoke(this, [generatorInstance, propertyType.GetCustomAttributes()]);
var populatorMethod = pageGeneratorType.GetMethod(nameof(AdminPageGenerator<TContext>.ApplyConfigurationFromAttributes));
populatorMethod?.Invoke(generatorInstance, [propertyType.GetCustomAttributes(false)]);
_adminPages.Add(propertyType, generatorInstance);
}
@@ -62,37 +56,7 @@ internal class AdminContextGenerator : IAdminContextGenerator {
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) {
var properties = context.GetType().GetProperties();

View File

@@ -1,20 +1,19 @@
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq.Expressions;
using System.Reflection;
using HopFrame.Web.Admin.Attributes;
using HopFrame.Web.Admin.Attributes.Members;
using HopFrame.Web.Admin.Attributes.Classes;
using HopFrame.Web.Admin.Models;
namespace HopFrame.Web.Admin.Generators.Implementation;
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;
public AdminPageGenerator() {
_page = new AdminPage<TModel> {
Page = new AdminPage<TModel> {
Permissions = new AdminPagePermissions()
};
_propertyGenerators = new Dictionary<string, AdminPropertyGenerator>();
@@ -26,8 +25,7 @@ internal sealed class AdminPageGenerator<TModel> : IAdminPageGenerator<TModel>,
var attributes = property.GetCustomAttributes(false);
var generator = Activator.CreateInstance(typeof(AdminPropertyGenerator), [property.Name, property.PropertyType]) as AdminPropertyGenerator;
ApplyConfigurationFromAttributes(generator, attributes, property);
generator?.ApplyConfigurationFromAttributes(this, attributes, property);
_propertyGenerators.Add(property.Name, generator);
}
@@ -38,66 +36,66 @@ internal sealed class AdminPageGenerator<TModel> : IAdminPageGenerator<TModel>,
}
public IAdminPageGenerator<TModel> Title(string title) {
_page.Title = title;
_page.Url ??= title.ToLower();
Page.Title = title;
Page.Url ??= title.ToLower();
return this;
}
public IAdminPageGenerator<TModel> Description(string description) {
_page.Description = description;
Page.Description = description;
return this;
}
public IAdminPageGenerator<TModel> Url(string url) {
_page.Url = url;
Page.Url = url;
return this;
}
public IAdminPageGenerator<TModel> ViewPermission(string permission) {
_page.Permissions.View = permission;
Page.Permissions.View = permission;
return this;
}
public IAdminPageGenerator<TModel> CreatePermission(string permission) {
_page.Permissions.Create = permission;
Page.Permissions.Create = permission;
return this;
}
public IAdminPageGenerator<TModel> UpdatePermission(string permission) {
_page.Permissions.Update = permission;
Page.Permissions.Update = permission;
return this;
}
public IAdminPageGenerator<TModel> DeletePermission(string permission) {
_page.Permissions.Delete = permission;
Page.Permissions.Delete = permission;
return this;
}
public IAdminPageGenerator<TModel> ShowCreateButton(bool show) {
_page.ShowCreateButton = show;
Page.ShowCreateButton = show;
return this;
}
public IAdminPageGenerator<TModel> ShowDeleteButton(bool show) {
_page.ShowDeleteButton = show;
Page.ShowDeleteButton = show;
return this;
}
public IAdminPageGenerator<TModel> ShowUpdateButton(bool show) {
_page.ShowUpdateButton = show;
Page.ShowUpdateButton = show;
return this;
}
public IAdminPageGenerator<TModel> DefaultSort<TProperty>(Expression<Func<TModel, TProperty>> propertyExpression, ListSortDirection direction) {
var property = GetPropertyInfo(propertyExpression);
_page.DefaultSortPropertyName = property.Name;
_page.DefaultSortDirection = direction;
Page.DefaultSortPropertyName = property.Name;
Page.DefaultSortDirection = direction;
return this;
}
public IAdminPageGenerator<TModel> ConfigureRepository<TRepository>() where TRepository : IModelRepository<TModel> {
_page.RepositoryProvider = typeof(TRepository);
Page.RepositoryProvider = typeof(TRepository);
return this;
}
@@ -108,7 +106,7 @@ internal sealed class AdminPageGenerator<TModel> : IAdminPageGenerator<TModel>,
return propertyGenerator;
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);
return generator;
@@ -121,51 +119,9 @@ internal sealed class AdminPageGenerator<TModel> : IAdminPageGenerator<TModel>,
properties.Add(generator.Compile());
}
_page.Properties = properties;
Page.Properties = properties;
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);
}
return Page;
}
private static PropertyInfo GetPropertyInfo<TSource, TProperty>(Expression<Func<TSource, TProperty>> propertyLambda) {
@@ -189,4 +145,35 @@ internal sealed class AdminPageGenerator<TModel> : IAdminPageGenerator<TModel>,
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;
namespace HopFrame.Web.Admin.Generators.Implementation;
@@ -40,6 +45,11 @@ internal sealed class AdminPropertyGenerator(string name, Type type) : IAdminPro
return this;
}
public IAdminPropertyGenerator Generated(bool generated = true) {
_property.Generated = generated;
return this;
}
public IAdminPropertyGenerator DisplayName(string displayName) {
_property.DisplayName = displayName;
return this;
@@ -57,7 +67,51 @@ internal sealed class AdminPropertyGenerator(string name, Type type) : IAdminPro
public AdminPageProperty Compile() {
_property.DisplayName ??= _property.Name;
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 Editable { get; set; } = true;
public bool EditDisplayValue { get; set; } = true;
public bool Generated { get; set; }
public bool Bold { get; set; }
public bool Ignore { get; set; }
[JsonIgnore]