From dd67bba07ddc3fd8b205e8d2ec36ec4fd5156eb6 Mon Sep 17 00:00:00 2001 From: Leon Hoppe Date: Sun, 6 Oct 2024 11:26:54 +0200 Subject: [PATCH] Moved populator methods to corresponding classes --- .../Generators/IAdminPropertyGenerator.cs | 1 + .../Implementation/AdminContextGenerator.cs | 44 +------ .../Implementation/AdminPageGenerator.cs | 117 ++++++++---------- .../Implementation/AdminPropertyGenerator.cs | 56 ++++++++- .../Models/AdminPageProperty.cs | 1 + 5 files changed, 113 insertions(+), 106 deletions(-) diff --git a/src/HopFrame.Web.Admin/Generators/IAdminPropertyGenerator.cs b/src/HopFrame.Web.Admin/Generators/IAdminPropertyGenerator.cs index 45802bb..d9349af 100644 --- a/src/HopFrame.Web.Admin/Generators/IAdminPropertyGenerator.cs +++ b/src/HopFrame.Web.Admin/Generators/IAdminPropertyGenerator.cs @@ -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); diff --git a/src/HopFrame.Web.Admin/Generators/Implementation/AdminContextGenerator.cs b/src/HopFrame.Web.Admin/Generators/Implementation/AdminContextGenerator.cs index 6596a2f..0446be9 100644 --- a/src/HopFrame.Web.Admin/Generators/Implementation/AdminContextGenerator.cs +++ b/src/HopFrame.Web.Admin/Generators/Implementation/AdminContextGenerator.cs @@ -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; - var generator = Activator.CreateInstance(typeof(IAdminPageGenerator)) as IAdminPageGenerator; - - ApplyConfigurationFromAttributes(generator, typeof(TModel).GetCustomAttributes(false)); + var generator = Activator.CreateInstance(typeof(IAdminPageGenerator)) as AdminPageGenerator; + 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.ApplyConfigurationFromAttributes)); + populatorMethod?.Invoke(generatorInstance, [propertyType.GetCustomAttributes(false)]); _adminPages.Add(propertyType, generatorInstance); } @@ -62,37 +56,7 @@ internal class AdminContextGenerator : IAdminContextGenerator { return context; } - public void ApplyConfigurationFromAttributes(IAdminPageGenerator 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(); diff --git a/src/HopFrame.Web.Admin/Generators/Implementation/AdminPageGenerator.cs b/src/HopFrame.Web.Admin/Generators/Implementation/AdminPageGenerator.cs index bad320e..2975892 100644 --- a/src/HopFrame.Web.Admin/Generators/Implementation/AdminPageGenerator.cs +++ b/src/HopFrame.Web.Admin/Generators/Implementation/AdminPageGenerator.cs @@ -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 : IAdminPageGenerator, IGenerator> { - private readonly AdminPage _page; + public readonly AdminPage Page; private readonly IDictionary _propertyGenerators; public AdminPageGenerator() { - _page = new AdminPage { + Page = new AdminPage { Permissions = new AdminPagePermissions() }; _propertyGenerators = new Dictionary(); @@ -26,8 +25,7 @@ internal sealed class AdminPageGenerator : IAdminPageGenerator, 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 : IAdminPageGenerator, } public IAdminPageGenerator Title(string title) { - _page.Title = title; - _page.Url ??= title.ToLower(); + Page.Title = title; + Page.Url ??= title.ToLower(); return this; } public IAdminPageGenerator Description(string description) { - _page.Description = description; + Page.Description = description; return this; } public IAdminPageGenerator Url(string url) { - _page.Url = url; + Page.Url = url; return this; } public IAdminPageGenerator ViewPermission(string permission) { - _page.Permissions.View = permission; + Page.Permissions.View = permission; return this; } public IAdminPageGenerator CreatePermission(string permission) { - _page.Permissions.Create = permission; + Page.Permissions.Create = permission; return this; } public IAdminPageGenerator UpdatePermission(string permission) { - _page.Permissions.Update = permission; + Page.Permissions.Update = permission; return this; } public IAdminPageGenerator DeletePermission(string permission) { - _page.Permissions.Delete = permission; + Page.Permissions.Delete = permission; return this; } public IAdminPageGenerator ShowCreateButton(bool show) { - _page.ShowCreateButton = show; + Page.ShowCreateButton = show; return this; } public IAdminPageGenerator ShowDeleteButton(bool show) { - _page.ShowDeleteButton = show; + Page.ShowDeleteButton = show; return this; } public IAdminPageGenerator ShowUpdateButton(bool show) { - _page.ShowUpdateButton = show; + Page.ShowUpdateButton = show; return this; } public IAdminPageGenerator DefaultSort(Expression> 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 ConfigureRepository() where TRepository : IModelRepository { - _page.RepositoryProvider = typeof(TRepository); + Page.RepositoryProvider = typeof(TRepository); return this; } @@ -108,7 +106,7 @@ internal sealed class AdminPageGenerator : IAdminPageGenerator, 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 : IAdminPageGenerator, 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(Expression> propertyLambda) { @@ -189,4 +145,35 @@ internal sealed class AdminPageGenerator : IAdminPageGenerator, 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); + } + } } \ No newline at end of file diff --git a/src/HopFrame.Web.Admin/Generators/Implementation/AdminPropertyGenerator.cs b/src/HopFrame.Web.Admin/Generators/Implementation/AdminPropertyGenerator.cs index cab1b2d..ca756a0 100644 --- a/src/HopFrame.Web.Admin/Generators/Implementation/AdminPropertyGenerator.cs +++ b/src/HopFrame.Web.Admin/Generators/Implementation/AdminPropertyGenerator.cs @@ -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(AdminPageGenerator 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); + } + } } \ No newline at end of file diff --git a/src/HopFrame.Web.Admin/Models/AdminPageProperty.cs b/src/HopFrame.Web.Admin/Models/AdminPageProperty.cs index daaab90..906618d 100644 --- a/src/HopFrame.Web.Admin/Models/AdminPageProperty.cs +++ b/src/HopFrame.Web.Admin/Models/AdminPageProperty.cs @@ -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]