From 79b02589c9883ee2579c3a62c68c80012c6cddec Mon Sep 17 00:00:00 2001 From: Goran Smit Date: Wed, 12 Feb 2025 15:29:25 +0100 Subject: [PATCH] #3237: Unable to edit AdminSeats with CoreAdmin on MasterUsers --- .../Controllers/CoreAdminDataController.cs | 6 +++--- .../CoreAdminConfigurationExtensions.cs | 7 +++---- src/DotNetEd.CoreAdmin/CoreAdminSecurityOptions.cs | 2 +- .../DiscoveredDbSetEntityType.cs | 2 +- src/DotNetEd.CoreAdmin/DotNetEd.CoreAdmin.csproj | 2 +- .../Views/Shared/EditorTemplates/Enum.cshtml | 14 ++++++++++---- .../Views/Shared/_CoreAdminLayout.cshtml | 1 + 7 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/DotNetEd.CoreAdmin/Controllers/CoreAdminDataController.cs b/src/DotNetEd.CoreAdmin/Controllers/CoreAdminDataController.cs index 00d8a83..224f8b2 100644 --- a/src/DotNetEd.CoreAdmin/Controllers/CoreAdminDataController.cs +++ b/src/DotNetEd.CoreAdmin/Controllers/CoreAdminDataController.cs @@ -49,7 +49,7 @@ public IActionResult Index(string id) var dbContextObject = (DbContext)this.HttpContext.RequestServices.GetRequiredService(dbSetEntity.DbContextType); if (dbSetEntity.ConnectionString != null) { - dbContextObject.Database.GetDbConnection().ConnectionString = dbSetEntity.ConnectionString; + dbContextObject.Database.GetDbConnection().ConnectionString = dbSetEntity.ConnectionString(); } var query = dbContextObject.Set(viewModel.EntityType); @@ -98,7 +98,7 @@ private object GetDbSetValueOrNull(string dbSetName, out DbContext dbContextObje dbContextObject = (DbContext)this.HttpContext.RequestServices.GetRequiredService(dbSetEntity.DbContextType); if (dbSetEntity.ConnectionString != null) { - dbContextObject.Database.GetDbConnection().ConnectionString = dbSetEntity.ConnectionString; + dbContextObject.Database.GetDbConnection().ConnectionString = dbSetEntity.ConnectionString(); } typeOfEntity = dbSetProperty.PropertyType.GetGenericArguments()[0]; @@ -364,7 +364,7 @@ public async Task DeleteEntityPost([FromForm] DataDeleteViewModel var dbContextObject = (DbContext)this.HttpContext.RequestServices.GetRequiredService(dbSetEntity.DbContextType); if (dbSetEntity.ConnectionString != null) { - dbContextObject.Database.GetDbConnection().ConnectionString = dbSetEntity.ConnectionString; + dbContextObject.Database.GetDbConnection().ConnectionString = dbSetEntity.ConnectionString(); } var dbSetValue = dbSetProperty.GetValue(dbContextObject); diff --git a/src/DotNetEd.CoreAdmin/CoreAdminConfigurationExtensions.cs b/src/DotNetEd.CoreAdmin/CoreAdminConfigurationExtensions.cs index 5504c31..107f8da 100644 --- a/src/DotNetEd.CoreAdmin/CoreAdminConfigurationExtensions.cs +++ b/src/DotNetEd.CoreAdmin/CoreAdminConfigurationExtensions.cs @@ -7,7 +7,6 @@ using Npgsql; using System; using System.Collections.Generic; -using System.Data.SqlClient; using System.Linq; using System.Reflection; using System.Threading.Tasks; @@ -133,12 +132,12 @@ private static void FindDbContexts(IServiceCollection services, CoreAdminOptions if (serviceType.IsSubclassOf(typeof(DbContext)) && !discoveredServices.Any(x => x.DbContextType == serviceType)) { - Dictionary databaseName2ConnectionStrings = new Dictionary(); - if (options.Context2ConnectionStrings != null && options.Context2ConnectionStrings.TryGetValue(serviceType.Name, out List connectionStrings)) + Dictionary> databaseName2ConnectionStrings = new Dictionary>(); + if (options.Context2ConnectionStrings != null && options.Context2ConnectionStrings.TryGetValue(serviceType.Name, out List> connectionStrings)) { foreach (var connectionString in connectionStrings) { - NpgsqlConnectionStringBuilder builder = new NpgsqlConnectionStringBuilder(connectionString); + NpgsqlConnectionStringBuilder builder = new NpgsqlConnectionStringBuilder(connectionString()); databaseName2ConnectionStrings.Add(builder.Database, connectionString); } } diff --git a/src/DotNetEd.CoreAdmin/CoreAdminSecurityOptions.cs b/src/DotNetEd.CoreAdmin/CoreAdminSecurityOptions.cs index c4db679..419501c 100644 --- a/src/DotNetEd.CoreAdmin/CoreAdminSecurityOptions.cs +++ b/src/DotNetEd.CoreAdmin/CoreAdminSecurityOptions.cs @@ -19,7 +19,7 @@ public class CoreAdminOptions public GridFilterMode FilterMode { get; set; } public string Title { get; set; } = "Amplifi Admin Portal"; public string FirebaseApiKey { get; set; } - public Dictionary> Context2ConnectionStrings { get; set; } + public Dictionary>> Context2ConnectionStrings { get; set; } public string ApiUrl { get; set; } public string AllowedRole { get; set; } public long SuperAdminId { get; set; } diff --git a/src/DotNetEd.CoreAdmin/DiscoveredDbSetEntityType.cs b/src/DotNetEd.CoreAdmin/DiscoveredDbSetEntityType.cs index cebda26..8979bf5 100644 --- a/src/DotNetEd.CoreAdmin/DiscoveredDbSetEntityType.cs +++ b/src/DotNetEd.CoreAdmin/DiscoveredDbSetEntityType.cs @@ -8,6 +8,6 @@ public class DiscoveredDbSetEntityType public string Name { get; internal set; } public Type DbSetType { get; internal set; } public Type UnderlyingType { get; internal set; } - public string ConnectionString { get; internal set; } + public Func ConnectionString { get; internal set; } } } diff --git a/src/DotNetEd.CoreAdmin/DotNetEd.CoreAdmin.csproj b/src/DotNetEd.CoreAdmin/DotNetEd.CoreAdmin.csproj index 937a602..466b6eb 100644 --- a/src/DotNetEd.CoreAdmin/DotNetEd.CoreAdmin.csproj +++ b/src/DotNetEd.CoreAdmin/DotNetEd.CoreAdmin.csproj @@ -6,7 +6,7 @@ false false AmplifiAdminPortal - 3.0.2 + 3.0.3 Automagically add an Admin Panel to your .NET 8 web app. Core Admin Panel for ASP.NET Core amplifi diff --git a/src/DotNetEd.CoreAdmin/Views/Shared/EditorTemplates/Enum.cshtml b/src/DotNetEd.CoreAdmin/Views/Shared/EditorTemplates/Enum.cshtml index c281913..74f03dd 100644 --- a/src/DotNetEd.CoreAdmin/Views/Shared/EditorTemplates/Enum.cshtml +++ b/src/DotNetEd.CoreAdmin/Views/Shared/EditorTemplates/Enum.cshtml @@ -1,12 +1,18 @@ @model object -@if (ViewData.ModelMetadata.ModelType.IsEnum) +@if (ViewData.ModelMetadata.ModelType.IsEnum || Nullable.GetUnderlyingType(ViewData.ModelMetadata.ModelType)?.IsEnum == true) { - var values = Enum.GetValues(ViewData.ModelMetadata.ModelType); - var names = Enum.GetNames(ViewData.ModelMetadata.ModelType); + var propertyType = Nullable.GetUnderlyingType(ViewData.ModelMetadata.ModelType) ?? ViewData.ModelMetadata.ModelType; + var values = Enum.GetValues(propertyType); + var names = Enum.GetNames(propertyType); var items = new List(); + if (Nullable.GetUnderlyingType(ViewData.ModelMetadata.ModelType) != null) // If nullable type add null item + { + items.Add(new SelectListItem() { Text = "", Value = null, Selected = (Model == null) }); + } + for (var i = 0; i < values.Length; i++) { - items.Add(new SelectListItem() { Text = names[i], Value = values.GetValue(i).ToString(), Selected = (Model.ToString() == values.GetValue(i).ToString()) }); + items.Add(new SelectListItem() { Text = names[i], Value = values.GetValue(i).ToString(), Selected = (Model?.ToString() == values.GetValue(i).ToString()) }); } @Html.DropDownList("", items, new {@class = "form-control"}) diff --git a/src/DotNetEd.CoreAdmin/Views/Shared/_CoreAdminLayout.cshtml b/src/DotNetEd.CoreAdmin/Views/Shared/_CoreAdminLayout.cshtml index 9c8abc3..dd019a1 100644 --- a/src/DotNetEd.CoreAdmin/Views/Shared/_CoreAdminLayout.cshtml +++ b/src/DotNetEd.CoreAdmin/Views/Shared/_CoreAdminLayout.cshtml @@ -49,6 +49,7 @@ @options?.Title   Logout +