Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions AutoCrudAdmin.Demo.sln
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{
Analyzers\stylecop.json = Analyzers\stylecop.json
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{8D4B258F-4B65-42AC-9A42-0F2254F12CCC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoCrudAdmin.Tests", "tests\AutoCrudAdmin.Tests\AutoCrudAdmin.Tests.csproj", "{1FB1ED95-D654-4BA1-B73E-630714A99665}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoCrudAdmin.Demo.SqlServer.Tests", "tests\AutoCrudAdmin.Demo.SqlServer.Tests\AutoCrudAdmin.Demo.SqlServer.Tests.csproj", "{4526F658-4DE7-4B43-9461-6B43E8A6ADF3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -44,11 +50,21 @@ Global
{24C3C7CC-79CF-4498-A7F8-B4B4C4E0F4C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{24C3C7CC-79CF-4498-A7F8-B4B4C4E0F4C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{24C3C7CC-79CF-4498-A7F8-B4B4C4E0F4C9}.Release|Any CPU.Build.0 = Release|Any CPU
{1FB1ED95-D654-4BA1-B73E-630714A99665}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1FB1ED95-D654-4BA1-B73E-630714A99665}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1FB1ED95-D654-4BA1-B73E-630714A99665}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1FB1ED95-D654-4BA1-B73E-630714A99665}.Release|Any CPU.Build.0 = Release|Any CPU
{4526F658-4DE7-4B43-9461-6B43E8A6ADF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4526F658-4DE7-4B43-9461-6B43E8A6ADF3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4526F658-4DE7-4B43-9461-6B43E8A6ADF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4526F658-4DE7-4B43-9461-6B43E8A6ADF3}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{32BFD1FE-2923-468D-93C0-7FED0FCC2F77} = {54C80D9E-2664-431C-A8AC-0D490C119760}
{F9DC587B-E2AF-48D8-8A26-AACBC2F268D8} = {54C80D9E-2664-431C-A8AC-0D490C119760}
{4A584F16-FABE-4D30-AC34-958D04E5CDDE} = {54C80D9E-2664-431C-A8AC-0D490C119760}
{24C3C7CC-79CF-4498-A7F8-B4B4C4E0F4C9} = {54C80D9E-2664-431C-A8AC-0D490C119760}
{1FB1ED95-D654-4BA1-B73E-630714A99665} = {8D4B258F-4B65-42AC-9A42-0F2254F12CCC}
{4526F658-4DE7-4B43-9461-6B43E8A6ADF3} = {8D4B258F-4B65-42AC-9A42-0F2254F12CCC}
EndGlobalSection
EndGlobal
138 changes: 71 additions & 67 deletions src/AutoCrudAdmin/AutoCrudAdmin.csproj
Original file line number Diff line number Diff line change
@@ -1,75 +1,79 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<OutputType>Library</OutputType>
<PackageId>AutoCrudAdmin</PackageId>
<Version>1.1.26</Version>
<Authors>Doncho Minkov</Authors>
<Company>Minkov</Company>
<IsPackable>true</IsPackable>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageReadmeFile>README.md</PackageReadmeFile>
<RepositoryUrl>https://github.com/Minkov/AutoCrudAdmin</RepositoryUrl>
<RepositoryType>git</RepositoryType>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<OutputType>Library</OutputType>
<PackageId>AutoCrudAdmin</PackageId>
<Version>1.1.26</Version>
<Authors>Doncho Minkov</Authors>
<Company>Minkov</Company>
<IsPackable>true</IsPackable>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageReadmeFile>README.md</PackageReadmeFile>
<RepositoryUrl>https://github.com/Minkov/AutoCrudAdmin</RepositoryUrl>
<RepositoryType>git</RepositoryType>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0"/>
<PackageReference Include="NonFactors.Grid.Core.Mvc6" Version="6.2.4"/>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0"/>
<PackageReference Include="NonFactors.Grid.Core.Mvc6" Version="6.2.4"/>
</ItemGroup>

<!-- <PropertyGroup>-->
<!-- <AnalysisLevel>5.0</AnalysisLevel>-->
<!-- <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>-->
<!-- <CodeAnalysisRuleSet>AutoCrudAdmin.ruleset</CodeAnalysisRuleSet>-->
<!-- </PropertyGroup>-->
<!-- <PropertyGroup>-->
<!-- <AnalysisLevel>5.0</AnalysisLevel>-->
<!-- <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>-->
<!-- <CodeAnalysisRuleSet>AutoCrudAdmin.ruleset</CodeAnalysisRuleSet>-->
<!-- </PropertyGroup>-->

<ItemGroup>
<_ContentIncludedByDefault Remove="Pages\Admin\Index.cshtml"/>
<_ContentIncludedByDefault Remove="Views\ProjectsAdmin\Index.cshtml"/>
<_ContentIncludedByDefault Remove="wwwroot\css\mvc-grid.css"/>
<_ContentIncludedByDefault Remove="wwwroot\css\site.css"/>
<_ContentIncludedByDefault Remove="wwwroot\favicon.ico"/>
<_ContentIncludedByDefault Remove="wwwroot\js\mvc-grid.js"/>
<_ContentIncludedByDefault Remove="wwwroot\js\site.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.min.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.min.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.min.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.min.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.min.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.min.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.js.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.min.js.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.js.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.min.js.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\LICENSE"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\jquery.validate.unobtrusive.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\jquery.validate.unobtrusive.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\LICENSE.txt"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\additional-methods.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\additional-methods.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\jquery.validate.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\jquery.validate.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\LICENSE.md"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.min.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\LICENSE.txt"/>
</ItemGroup>
<ItemGroup>
<InternalsVisibleTo Include="$(AssemblyName).Tests"/>
</ItemGroup>

<ItemGroup>
<None Include="..\..\docs\README.md" Pack="true" PackagePath="\"/>
</ItemGroup>
<ItemGroup>
<_ContentIncludedByDefault Remove="Pages\Admin\Index.cshtml"/>
<_ContentIncludedByDefault Remove="Views\ProjectsAdmin\Index.cshtml"/>
<_ContentIncludedByDefault Remove="wwwroot\css\mvc-grid.css"/>
<_ContentIncludedByDefault Remove="wwwroot\css\site.css"/>
<_ContentIncludedByDefault Remove="wwwroot\favicon.ico"/>
<_ContentIncludedByDefault Remove="wwwroot\js\mvc-grid.js"/>
<_ContentIncludedByDefault Remove="wwwroot\js\site.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.min.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.min.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.min.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.min.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.min.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.min.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.js.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.min.js.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.js.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.min.js.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\LICENSE"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\jquery.validate.unobtrusive.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\jquery.validate.unobtrusive.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\LICENSE.txt"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\additional-methods.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\additional-methods.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\jquery.validate.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\jquery.validate.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\LICENSE.md"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.min.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\LICENSE.txt"/>
</ItemGroup>

<ItemGroup>
<None Include="..\..\docs\README.md" Pack="true" PackagePath="\"/>
</ItemGroup>

</Project>
8 changes: 4 additions & 4 deletions src/AutoCrudAdmin/Helpers/ReflectionHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,19 +58,19 @@ private static IEnumerable<PropertyInfo> GetDbSetProperties()
.ToList();

var entityTypes = dbSetTypes
.Select(dbSet => dbSet.PropertyType.GenericTypeArguments.FirstOrDefault())
.Select(dbSet => dbSet.PropertyType.GenericTypeArguments.First())
.Distinct()
.ToHashSet();

var uniqueEntityTypes = entityTypes
.Where(parent =>
parent?.IsGenericParameter == true
&& entityTypes.All(child => child?.IsSubclassOfAnyType(parent) != true))
!parent.IsGenericParameter
&& !entityTypes.Any(child => child.IsSubclassOfAnyType(parent)))
.ToHashSet();

return dbSetTypes
.DistinctBy(x => x.PropertyType.GenericTypeArguments.FirstOrDefault())
.Where(x => uniqueEntityTypes.Contains(x.PropertyType.GenericTypeArguments.FirstOrDefault()))
.Where(x => uniqueEntityTypes.Contains(x.PropertyType.GenericTypeArguments.First()))
.OrderBy(x => x.Name)
.ToList();
}
Expand Down
6 changes: 3 additions & 3 deletions src/AutoCrudAdmin/Views/Shared/MvcGrid/_Grid.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@
}

<div id="@Model.Id" class="mvc-grid mvc-grid-@(Model.FilterMode.ToString().ToLower())-mode" data-name="@Model.Name" data-filter-mode="@Model.FilterMode" data-url="@Model.Url">
<!table@(Model.Attributes)>
<!table @(Model.Attributes)>
<thead>
<tr class="mvc-grid-headers@(Model.FilterMode == GridFilterMode.Header ? " mvc-grid-row-filters" : "")">
@foreach (var column in Model.Columns)
{
var applied = (column.Filter.First ?? column.Filter.Second) == null ? "" : " applied";

<th@(column.AsAttributes())>
<th @(column.AsAttributes())>
@if (column.Filter.IsEnabled == true && !String.IsNullOrEmpty(column.Filter.Name) && Model.FilterMode != GridFilterMode.Row)
{
if (Model.FilterMode == GridFilterMode.Header)
Expand Down Expand Up @@ -138,7 +138,7 @@
<tbody>
@foreach (var row in rows)
{
<!tr@(row.Attributes)>
<!tr @(row.Attributes)>
@foreach (var column in Model.Columns)
{
var classes = (column.IsHidden ? column.CssClasses + " mvc-grid-hidden" : column.CssClasses).Trim();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<NoWarn>SA1600</NoWarn>
</PropertyGroup>

<ItemGroup>
<Content Update="testsettings.json">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</Content>
</ItemGroup>

<ItemGroup>
<PackageReference Include="Bogus" Version="34.0.2" />
<PackageReference Include="FakeItEasy" Version="7.4.0" />
<PackageReference Include="FluentAssertions" Version="6.11.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.3" />
<PackageReference Include="MyTested.AspNetCore.Mvc.Universe" Version="6.0.0" />
<PackageReference Include="xunit" Version="2.5.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\demo\AutoCrudAdmin.Demo.SqlServer\AutoCrudAdmin.Demo.SqlServer.csproj" />
<ProjectReference Include="..\..\src\AutoCrudAdmin\AutoCrudAdmin.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
namespace AutoCrudAdmin.Demo.SqlServer.Tests.Controllers;

using System;
using System.Collections.Generic;
using System.Globalization;
using FluentAssertions;
using Models.Models;
using MyTested.AspNetCore.Mvc;
using SqlServer.Controllers;
using ViewModels;
using Xunit;

public class ProjectsControllerTests
{
[Fact]
public void IndexShouldReturnDefaultViewWithCorrectModel()
=> MyController<ProjectsController>
.Instance()
.Calling(c => c.Index())
.ShouldReturn()
.View("../AutoCrudAdmin/Index");

[Fact]
public void GetCreate_ReturnsViewResult()
=> MyController<ProjectsController>
.Instance()
.Calling(c => c.Create(
new Dictionary<string, string>(),
null))
.ShouldReturn()
.View("../AutoCrudAdmin/EntityForm");

[Theory]
[InlineData("Test Project")]
public void PostCreate_SavesAndRedirects(string name)
=> MyPipeline
.Configuration()
.ShouldMap(request => request
.WithMethod(HttpMethod.Post)
.WithLocation("/Projects/PostCreate")
.WithAntiForgeryToken()
.WithFormFields(new Dictionary<string, string>
{
{ nameof(Project.Name), name },
{ nameof(Project.OpenDate), DateTime.Now.ToString(CultureInfo.CurrentCulture) },
{ nameof(Project.DueDate), DateTime.Now.AddDays(1).ToString(CultureInfo.CurrentCulture) },
}))
.To<ProjectsController>(c => c.PostCreate(
new Dictionary<string, string>
{
{ nameof(Project.Name), name },
{ nameof(Project.OpenDate), DateTime.Now.ToString(CultureInfo.CurrentCulture) },
{ nameof(Project.DueDate), DateTime.Now.AddDays(1).ToString(CultureInfo.CurrentCulture) },
},
new FormFilesContainer()))
.Which()
.ShouldHave()
.Data(data => data
.WithSet<Project>(set => set
.Should()
.ContainSingle(p => p.Name == name)))
.AndAlso()
.ShouldReturn()
.RedirectToAction("Index");
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
namespace AutoCrudAdmin.Demo.SqlServer.Tests.Controllers;

using System.Collections.Generic;
using MyTested.AspNetCore.Mvc;
using SqlServer.Controllers;
using ViewModels.Pages;
using Xunit;

public class TasksControllerTests
{
[Fact]
public void IndexShouldReturnDefaultViewWithCorrectModel()
=> MyController<TasksController>
.Instance()
.Calling(c => c.Index())
.ShouldReturn()
.View(view => view
.WithModelOfType<AutoCrudAdminIndexViewModel>());

[Fact]
public void GetCreate_ReturnsViewResult()
=> MyController<TasksController>
.Instance()
.Calling(c => c.Create(
new Dictionary<string, string>(),
null))
.ShouldReturn()
.View("../AutoCrudAdmin/EntityForm");
}
27 changes: 27 additions & 0 deletions tests/AutoCrudAdmin.Demo.SqlServer.Tests/Data/ProjectTestData.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
namespace AutoCrudAdmin.Demo.SqlServer.Tests.Data;

using System;
using System.Collections.Generic;
using System.Linq;
using Bogus;
using Models.Models;

public static class ProjectTestData
{
public static Project GetProject(int id)
=> new Faker<Project>()
.CustomInstantiator(_ => new Project
{
Id = id,
Name = $"Project {id}",
OpenDate = DateTime.Now,
DueDate = DateTime.Now.AddDays(1),
})
.Generate();

public static List<Project> GetProjects(int total)
=> Enumerable
.Range(1, total)
.Select(GetProject)
.ToList();
}
Loading