From fd7ffb7cca5a3fbd14120ddf60f27ebad807fede Mon Sep 17 00:00:00 2001 From: nicolas63 Date: Sun, 6 Dec 2020 20:24:15 +0100 Subject: [PATCH] [Blazor] Added one to many, many to many and enum support for blazor front (#478) Added one to many, many to many and enum support for blazor front --- .github/workflows/test-integration-jwt.yml | 2 +- .../Project.Client/Project.Client.csproj.ejs | 1 + .../AbstractEntityService.cs.ejs | 20 ++++-- .../src/Project.Client/Models/Model.cs.ejs | 3 +- .../Pages/Entities/Entity/Entity.razor.ejs | 21 ++++-- .../Entities/Entity/EntityDetail.razor.ejs | 24 +++++-- .../Entities/Entity/EntityUpdate.razor.cs.ejs | 72 +++++++++++++------ .../Entities/Entity/EntityUpdate.razor.ejs | 30 ++++++-- .../EntityService/EntityService.cs.ejs | 2 +- .../Entities/Entity/EntityDetailTest.cs.ejs | 5 ++ .../Pages/Entities/Entity/EntityTest.cs.ejs | 6 +- .../Entities/Entity/EntityUpdateTest.cs.ejs | 42 +++++++---- .../Project.Domain.Services/Service.cs.ejs | 4 +- .../src/Project.Domain/Entities/Entity.cs.ejs | 2 +- .../dotnetcore/src/Project.Dto/Dto.cs.ejs | 2 +- .../Data/Repositories/EntityRepository.cs.ejs | 19 ++--- .../Controllers/EntityController.cs.ejs | 5 +- generators/entity/index.js | 2 + generators/server/files.js | 5 -- .../Constants/Constants.cs.ejs | 1 - .../Interfaces/IUnitOfWork.cs.ejs | 2 +- .../Extensions/DbContextExtensions.cs.ejs | 31 -------- .../Data/Extensions/DbSetExtensions.cs.ejs | 4 +- .../Data/Repositories/UnitOfWork.cs.ejs | 11 ++- .../Project/Configuration/MvcStartup.cs.ejs | 1 - .../ProblemDetailsStartup.cs.ejs | 2 +- .../dotnetcore/src/Project/Program.cs.ejs | 2 + test-integration/scripts/01-init-env.sh | 10 ++- .../scripts/04-generate-entities-sample.sh | 6 +- ...05-run-generated-client-tests-of-sample.sh | 4 +- 30 files changed, 208 insertions(+), 133 deletions(-) delete mode 100644 generators/server/templates/dotnetcore/src/Project.Infrastructure/Data/Extensions/DbContextExtensions.cs.ejs diff --git a/.github/workflows/test-integration-jwt.yml b/.github/workflows/test-integration-jwt.yml index c3eabe1c3..0f3c5e928 100644 --- a/.github/workflows/test-integration-jwt.yml +++ b/.github/workflows/test-integration-jwt.yml @@ -22,7 +22,7 @@ jobs: - app-type: jwt-with-angular-app arg: 'import-jdl' - app-type: jwt-with-blazor-app - arg: 'blazor' + arg: 'import-jdl blazor' - app-type: jwt-with-mssql-app arg: 'no' - app-type: jwt-with-mysql-app diff --git a/generators/client/templates/blazor/src/Project.Client/Project.Client.csproj.ejs b/generators/client/templates/blazor/src/Project.Client/Project.Client.csproj.ejs index e6ed62f3d..d7913b748 100644 --- a/generators/client/templates/blazor/src/Project.Client/Project.Client.csproj.ejs +++ b/generators/client/templates/blazor/src/Project.Client/Project.Client.csproj.ejs @@ -84,6 +84,7 @@ + diff --git a/generators/client/templates/blazor/src/Project.Client/Services/EntityServices/AbstractEntityService.cs.ejs b/generators/client/templates/blazor/src/Project.Client/Services/EntityServices/AbstractEntityService.cs.ejs index 74ce5fb48..d20280464 100644 --- a/generators/client/templates/blazor/src/Project.Client/Services/EntityServices/AbstractEntityService.cs.ejs +++ b/generators/client/templates/blazor/src/Project.Client/Services/EntityServices/AbstractEntityService.cs.ejs @@ -16,6 +16,8 @@ using System; using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Json; +using System.Text.Json; +using System.Text.Json.Serialization; using System.Threading.Tasks; using <%= namespace %>.Client.Models; using Microsoft.AspNetCore.Components.Authorization; @@ -26,6 +28,7 @@ namespace <%= namespace %>.Client.Services.EntityServices { private const string AuthorizationHeader = "Authorization"; private readonly AuthenticationStateProvider _authenticationStateProvider; + private readonly JsonSerializerOptions _options; protected readonly HttpClient _httpClient; @@ -44,26 +47,35 @@ namespace <%= namespace %>.Client.Services.EntityServices _httpClient.DefaultRequestHeaders.Add(AuthorizationHeader, $"Bearer {JwtToken.IdToken}"); } BaseUrl = baseUrl; + _options = new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true, + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + Converters = + { + new JsonStringEnumConverter(JsonNamingPolicy.CamelCase), + } + }; } public virtual async Task> GetAll() { - return await _httpClient.GetFromJsonAsync>(BaseUrl); + return await _httpClient.GetFromJsonAsync>(BaseUrl, _options); } public virtual async Task Get(string id) { - return await _httpClient.GetFromJsonAsync($"{BaseUrl}/{id}"); + return await _httpClient.GetFromJsonAsync($"{BaseUrl}/{id}", _options); } public virtual async Task Add(T model) { - await _httpClient.PostAsJsonAsync(BaseUrl,model); + await _httpClient.PostAsJsonAsync(BaseUrl, model, _options); } public virtual async Task Update(T model) { - await _httpClient.PutAsJsonAsync(BaseUrl, model); + await _httpClient.PutAsJsonAsync(BaseUrl, model, _options); } public virtual async Task Delete(string id) diff --git a/generators/entity-client/templates/blazor/src/Project.Client/Models/Model.cs.ejs b/generators/entity-client/templates/blazor/src/Project.Client/Models/Model.cs.ejs index 6f12d78ab..70a25684b 100644 --- a/generators/entity-client/templates/blazor/src/Project.Client/Models/Model.cs.ejs +++ b/generators/entity-client/templates/blazor/src/Project.Client/Models/Model.cs.ejs @@ -30,6 +30,7 @@ using <%= namespace %>.Crosscutting.Enums; <%_ } _%> using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; namespace <%= namespace %>.Client.Models { @@ -51,7 +52,7 @@ namespace <%= namespace %>.Client.Models [Required] <%_ } _%> <%_ if (fields[idx].fieldIsEnum) { _%> - public <%= fields[idx].fieldType %>? <%= fieldNamePascalized %> { get; set; } + public <%= fields[idx].fieldType %> <%= fieldNamePascalized %> { get; set; } <%_ } else { _%> public <%= fieldType %> <%= fieldNamePascalized %> { get; set; } <%_ } _%> diff --git a/generators/entity-client/templates/blazor/src/Project.Client/Pages/Entities/Entity/Entity.razor.ejs b/generators/entity-client/templates/blazor/src/Project.Client/Pages/Entities/Entity/Entity.razor.ejs index e266d95ad..7a7ba111c 100644 --- a/generators/entity-client/templates/blazor/src/Project.Client/Pages/Entities/Entity/Entity.razor.ejs +++ b/generators/entity-client/templates/blazor/src/Project.Client/Pages/Entities/Entity/Entity.razor.ejs @@ -50,7 +50,7 @@ _%> @if (<%= entityClassNamePluralized %>.Count == 0) {
- No <%= lowerCasedEntityClassPlural %> found + No <%= entityClassNamePluralized %> found
} else @@ -58,13 +58,13 @@ _%>
- + <%_ fields.forEach(field => { _%> <%_ }); _%> <%_ relationships.forEach(relation => { - if(relation.relationshipType === 'one-to-one') { _%> + if(relation.relationshipType === 'one-to-one' || relation.relationshipType === 'many-to-one' || ((relation.relationshipType === 'many-to-many' || relation.relationshipType === 'one-to-many') && relation.ownerSide === true)) { _%> <%_ } }); _%> @@ -80,14 +80,23 @@ _%> <%_ }); _%> <%_ relationships.forEach(relation => { - if(relation.relationshipType === 'one-to-one') { _%> + if(relation.relationshipType === 'one-to-one' || relation.relationshipType === 'many-to-one') { _%> + <%_ } else if ((relation.relationshipType === 'many-to-many' || relation.relationshipType === 'one-to-many') && relation.ownerSide === true ) { _%> + <%_ } }); _%> diff --git a/generators/entity-client/templates/blazor/src/Project.Client/Pages/Entities/Entity/EntityDetail.razor.ejs b/generators/entity-client/templates/blazor/src/Project.Client/Pages/Entities/Entity/EntityDetail.razor.ejs index d7c772938..8921e83ce 100644 --- a/generators/entity-client/templates/blazor/src/Project.Client/Pages/Entities/Entity/EntityDetail.razor.ejs +++ b/generators/entity-client/templates/blazor/src/Project.Client/Pages/Entities/Entity/EntityDetail.razor.ejs @@ -28,19 +28,29 @@ _%> @<%= entityClassName %>.<%= field.fieldNamePascalized %> <%_ }); _%> - <%_ relationships.forEach(relation => { - if(relation.relationshipType === 'one-to-one') { _%> -
<%= relation.otherEntityNamePascalized %>
+ <%_ relationships.forEach(relation => { + if(relation.relationshipType === 'one-to-one' || relation.relationshipType === 'many-to-one' ) { _%> +
<%= relation.relationshipFieldNamePascalized %>
- @if (<%= entityClassName %>.<%= relation.otherEntityNamePascalized %> != null) + @if (<%= entityClassName %>.<%= relation.relationshipFieldNamePascalized %> != null) { }
- <%_ } - }); _%> + <%_ } else if ((relation.relationshipType === 'many-to-many' || relation.relationshipType === 'one-to-many') && relation.ownerSide === true ) { _%> +
<%= relation.relationshipFieldNamePascalized %>
+
+ @foreach (var <%= relation.otherEntityNameLowerCased %> in <%= entityClassName %>.<%= relation.relationshipFieldNamePascalizedPlural %>){ + + @<%= relation.otherEntityNameLowerCased %>.Id + @if (<%= relation.otherEntityNameLowerCased %> != <%= entityClassName %>.<%= relation.relationshipFieldNamePascalizedPlural %>.Last()) { , } + + } +
+ <%_ + }}); _%>
ID<%= field.fieldNameHumanized %><%= relation.relationshipNameHumanized %>@<%= lowerCasedEntityClass %>.<%= field.fieldNamePascalized %> - @if (<%= lowerCasedEntityClass %>.Region != null) + @if (<%= lowerCasedEntityClass %>.<%= relation.relationshipFieldNamePascalized %> != null) { } + + @foreach (var <%= relation.relationshipFieldNameLowerCased %> in <%= lowerCasedEntityClass %>.<%= relation.relationshipFieldNamePascalizedPlural %>){ + + @<%= relation.relationshipFieldNameLowerCased %>.Id + @if (<%= relation.relationshipFieldNameLowerCased %> != <%= lowerCasedEntityClass %>.<%= relation.relationshipFieldNamePascalizedPlural %>.Last()) { , } + + }