Moved populator methods to corresponding classes
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user