From 601b502c8c5882869d4c545123290376f780cf6c Mon Sep 17 00:00:00 2001 From: Leon Hoppe Date: Sat, 9 Nov 2024 10:39:17 +0100 Subject: [PATCH] Improved developer experience for AdminContext's --- .../Generators/IAdminPageGenerator.cs | 2 +- .../Generators/IAdminPropertyGenerator.cs | 41 +++++++++-------- .../Implementation/AdminPageGenerator.cs | 14 +++--- .../Implementation/AdminPropertyGenerator.cs | 45 +++++++++---------- src/HopFrame.Web/HopAdminContext.cs | 8 ++-- test/FrontendTest/AdminContext.cs | 2 +- 6 files changed, 53 insertions(+), 59 deletions(-) diff --git a/src/HopFrame.Web.Admin/Generators/IAdminPageGenerator.cs b/src/HopFrame.Web.Admin/Generators/IAdminPageGenerator.cs index dc09056..12591bb 100644 --- a/src/HopFrame.Web.Admin/Generators/IAdminPageGenerator.cs +++ b/src/HopFrame.Web.Admin/Generators/IAdminPageGenerator.cs @@ -22,7 +22,7 @@ public interface IAdminPageGenerator { IAdminPageGenerator ConfigureRepository() where TRepository : ModelRepository; - IAdminPropertyGenerator Property(Expression> propertyExpression); + IAdminPropertyGenerator Property(Expression> propertyExpression); IAdminPageGenerator ListingProperty(Expression> propertyExpression); } diff --git a/src/HopFrame.Web.Admin/Generators/IAdminPropertyGenerator.cs b/src/HopFrame.Web.Admin/Generators/IAdminPropertyGenerator.cs index e8442b1..7f138bb 100644 --- a/src/HopFrame.Web.Admin/Generators/IAdminPropertyGenerator.cs +++ b/src/HopFrame.Web.Admin/Generators/IAdminPropertyGenerator.cs @@ -2,28 +2,27 @@ using System.Linq.Expressions; namespace HopFrame.Web.Admin.Generators; -public interface IAdminPropertyGenerator { +public interface IAdminPropertyGenerator { - IAdminPropertyGenerator Sortable(bool sortable); - IAdminPropertyGenerator Editable(bool editable); - IAdminPropertyGenerator DisplayValueWhileEditing(bool display); - IAdminPropertyGenerator DisplayInListing(bool display = true); - IAdminPropertyGenerator Ignore(bool ignore = true); - IAdminPropertyGenerator Generated(bool generated = true); - IAdminPropertyGenerator Bold(bool bold = true); - IAdminPropertyGenerator Unique(bool unique = true); + IAdminPropertyGenerator Sortable(bool sortable); + IAdminPropertyGenerator Editable(bool editable); + IAdminPropertyGenerator DisplayValueWhileEditing(bool display); + IAdminPropertyGenerator DisplayInListing(bool display = true); + IAdminPropertyGenerator Ignore(bool ignore = true); + IAdminPropertyGenerator Generated(bool generated = true); + IAdminPropertyGenerator Bold(bool bold = true); + IAdminPropertyGenerator Unique(bool unique = true); - IAdminPropertyGenerator DisplayName(string displayName); - IAdminPropertyGenerator Description(string description); - IAdminPropertyGenerator Prefix(string prefix); - IAdminPropertyGenerator Validator(Func validator); - IAdminPropertyGenerator IsSelector(bool selector = true); - IAdminPropertyGenerator IsSelector(bool selector = true); - IAdminPropertyGenerator Parser(Func parser); - IAdminPropertyGenerator Parser(Func parser); - IAdminPropertyGenerator ParserForListType(Func parser); - IAdminPropertyGenerator ParserForListType(Func parser); - IAdminPropertyGenerator DisplayProperty(Expression> propertyExpression); - IAdminPropertyGenerator DisplayPropertyForListType(Expression> propertyExpression); + IAdminPropertyGenerator DisplayName(string displayName); + IAdminPropertyGenerator Description(string description); + IAdminPropertyGenerator Prefix(string prefix); + IAdminPropertyGenerator Validator(Func validator); + IAdminPropertyGenerator IsSelector(bool selector = true); + IAdminPropertyGenerator IsSelector(bool selector = true); + IAdminPropertyGenerator Parser(Func parser); + IAdminPropertyGenerator Parser(Func parser); + IAdminPropertyGenerator Parser(Func parser); + IAdminPropertyGenerator DisplayProperty(Expression> propertyExpression); + IAdminPropertyGenerator DisplayProperty(Expression> propertyExpression); } \ No newline at end of file diff --git a/src/HopFrame.Web.Admin/Generators/Implementation/AdminPageGenerator.cs b/src/HopFrame.Web.Admin/Generators/Implementation/AdminPageGenerator.cs index f61225b..2718e15 100644 --- a/src/HopFrame.Web.Admin/Generators/Implementation/AdminPageGenerator.cs +++ b/src/HopFrame.Web.Admin/Generators/Implementation/AdminPageGenerator.cs @@ -21,16 +21,16 @@ internal sealed class AdminPageGenerator : IAdminPageGenerator, var type = typeof(TModel); var properties = type.GetProperties(); - var generatorType = typeof(AdminPropertyGenerator<>); + var generatorType = typeof(AdminPropertyGenerator<,>); foreach (var property in properties) { var attributes = property.GetCustomAttributes(false); - var genericType = generatorType.MakeGenericType(property.PropertyType); + var genericType = generatorType.MakeGenericType(property.PropertyType, type); var generator = Activator.CreateInstance(genericType, [property.Name, property.PropertyType]); var method = genericType - .GetMethod(nameof(AdminPropertyGenerator.ApplyConfigurationFromAttributes))? + .GetMethod(nameof(AdminPropertyGenerator.ApplyConfigurationFromAttributes))? .MakeGenericMethod(type); method?.Invoke(generator, [this, attributes, property]); @@ -102,13 +102,13 @@ internal sealed class AdminPageGenerator : IAdminPageGenerator, return this; } - public IAdminPropertyGenerator Property(Expression> propertyExpression) { + public IAdminPropertyGenerator Property(Expression> propertyExpression) { var property = GetPropertyInfo(propertyExpression); if (_propertyGenerators.TryGetValue(property.Name, out var propertyGenerator)) - return propertyGenerator as AdminPropertyGenerator; + return propertyGenerator as AdminPropertyGenerator; - 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; generator?.ApplyConfigurationFromAttributes(this, property.GetCustomAttributes(false), property); _propertyGenerators.Add(property.Name, generator); @@ -125,7 +125,7 @@ internal sealed class AdminPageGenerator : IAdminPageGenerator, var properties = new List(); foreach (var generator in _propertyGenerators.Values) { - var method = generator.GetType().GetMethod(nameof(AdminPropertyGenerator.Compile)); + var method = generator.GetType().GetMethod(nameof(AdminPropertyGenerator.Compile)); var prop = method?.Invoke(generator, []) as AdminPageProperty; properties.Add(prop); } diff --git a/src/HopFrame.Web.Admin/Generators/Implementation/AdminPropertyGenerator.cs b/src/HopFrame.Web.Admin/Generators/Implementation/AdminPropertyGenerator.cs index 5bbe01f..73767a6 100644 --- a/src/HopFrame.Web.Admin/Generators/Implementation/AdminPropertyGenerator.cs +++ b/src/HopFrame.Web.Admin/Generators/Implementation/AdminPropertyGenerator.cs @@ -8,112 +8,107 @@ using HopFrame.Web.Admin.Models; namespace HopFrame.Web.Admin.Generators.Implementation; -internal sealed class AdminPropertyGenerator(string name, Type type) : IAdminPropertyGenerator, IGenerator { +internal sealed class AdminPropertyGenerator(string name, Type type) : IAdminPropertyGenerator, IGenerator { private readonly AdminPageProperty _property = new() { Name = name, Type = type }; - public IAdminPropertyGenerator Sortable(bool sortable) { + public IAdminPropertyGenerator Sortable(bool sortable) { _property.Sortable = sortable; return this; } - public IAdminPropertyGenerator Editable(bool editable) { + public IAdminPropertyGenerator Editable(bool editable) { _property.Editable = editable; return this; } - public IAdminPropertyGenerator DisplayValueWhileEditing(bool display) { + public IAdminPropertyGenerator DisplayValueWhileEditing(bool display) { _property.EditDisplayValue = display; return this; } - public IAdminPropertyGenerator DisplayInListing(bool display = true) { + public IAdminPropertyGenerator DisplayInListing(bool display = true) { _property.DisplayInListing = display; _property.Sortable = false; return this; } - public IAdminPropertyGenerator Ignore(bool ignore = false) { + public IAdminPropertyGenerator Ignore(bool ignore = false) { _property.Ignore = ignore; return this; } - public IAdminPropertyGenerator Generated(bool generated = true) { + public IAdminPropertyGenerator Generated(bool generated = true) { _property.Generated = generated; return this; } - public IAdminPropertyGenerator Bold(bool bold = true) { + public IAdminPropertyGenerator Bold(bool bold = true) { _property.Bold = bold; return this; } - public IAdminPropertyGenerator Unique(bool unique = true) { + public IAdminPropertyGenerator Unique(bool unique = true) { _property.Unique = unique; return this; } - public IAdminPropertyGenerator DisplayName(string displayName) { + public IAdminPropertyGenerator DisplayName(string displayName) { _property.DisplayName = displayName; return this; } - public IAdminPropertyGenerator Description(string description) { + public IAdminPropertyGenerator Description(string description) { _property.Description = description; return this; } - public IAdminPropertyGenerator Prefix(string prefix) { + public IAdminPropertyGenerator Prefix(string prefix) { _property.Prefix = prefix; return this; } - public IAdminPropertyGenerator Validator(Func validator) { + public IAdminPropertyGenerator Validator(Func validator) { _property.Validator = o => validator.Invoke((TProperty)o); return this; } - public IAdminPropertyGenerator IsSelector(bool selector = true) { + public IAdminPropertyGenerator IsSelector(bool selector = true) { _property.Selector = selector; return this; } - public IAdminPropertyGenerator IsSelector(bool selector = true) { + public IAdminPropertyGenerator IsSelector(bool selector = true) { _property.Selector = true; _property.SelectorType = typeof(TSelectorType); return this; } - public IAdminPropertyGenerator Parser(Func parser) { + public IAdminPropertyGenerator Parser(Func parser) { _property.Parser = (o, s) => parser.Invoke((TModel)o, s.ToString()); return this; } - public IAdminPropertyGenerator Parser(Func parser) { + public IAdminPropertyGenerator Parser(Func parser) { _property.Parser = (o, s) => parser.Invoke((TModel)o, (TInput)s); return this; } - public IAdminPropertyGenerator ParserForListType(Func parser) { - _property.Parser = (o, s) => parser.Invoke((TModel)o, s.ToString()); - return this; - } - - public IAdminPropertyGenerator ParserForListType(Func parser) { + public IAdminPropertyGenerator Parser(Func parser) { _property.Parser = (o, s) => parser.Invoke((TModel)o, (TInput)s); return this; } - public IAdminPropertyGenerator DisplayProperty(Expression> propertyExpression) { + public IAdminPropertyGenerator DisplayProperty(Expression> propertyExpression) { var property = AdminPageGenerator.GetPropertyInfo(propertyExpression); _property.DisplayPropertyName = property.Name; return this; } - public IAdminPropertyGenerator DisplayPropertyForListType(Expression> propertyExpression) { + public IAdminPropertyGenerator DisplayProperty(Expression> propertyExpression) { var property = AdminPageGenerator.GetPropertyInfo(propertyExpression); _property.DisplayPropertyName = property.Name; return this; diff --git a/src/HopFrame.Web/HopAdminContext.cs b/src/HopFrame.Web/HopAdminContext.cs index 4e45dfe..e0ab493 100644 --- a/src/HopFrame.Web/HopAdminContext.cs +++ b/src/HopFrame.Web/HopAdminContext.cs @@ -40,8 +40,8 @@ public class HopAdminContext : AdminPagesContext { generator.Page().Property(u => u.Permissions) .DisplayInListing(false) - .DisplayPropertyForListType(p => p.PermissionName) - .ParserForListType((user, perm) => new Permission { + .DisplayProperty(p => p.PermissionName) + .Parser((user, perm) => new Permission { GrantedAt = DateTime.Now, PermissionName = perm, User = user @@ -78,8 +78,8 @@ public class HopAdminContext : AdminPagesContext { generator.Page().Property(g => g.Permissions) .DisplayInListing(false) - .DisplayPropertyForListType(p => p.PermissionName) - .ParserForListType((group, perm) => new Permission { + .DisplayProperty(p => p.PermissionName) + .Parser((group, perm) => new Permission { GrantedAt = DateTime.Now, PermissionName = perm, Group = group diff --git a/test/FrontendTest/AdminContext.cs b/test/FrontendTest/AdminContext.cs index 6be48c9..3c9af86 100644 --- a/test/FrontendTest/AdminContext.cs +++ b/test/FrontendTest/AdminContext.cs @@ -25,7 +25,7 @@ public class AdminContext : AdminPagesContext { generator.Page
() .Property(a => a.AddressId) .IsSelector() - .Parser((model, e) => model.AddressId = e.EmployeeId); + .Parser((model, e) => model.AddressId = e.EmployeeId); generator.Page() .ConfigureRepository()