Browse Source

Merge branch 'dev' into dynamic-claims-middleware

pull/18064/head
maliming 3 years ago
parent
commit
4d5c5d5486
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 3
      Directory.Packages.props
  2. 2
      docs/en/Community-Articles/2023-11-05-EF-Core-8-Complex-Types/POST.MD
  3. 21
      docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/Post.md
  4. BIN
      docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/cover-image.png
  5. 14
      framework/Volo.Abp.sln
  6. 2
      framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/AbpAspNetCoreSignalRModule.cs
  7. 4
      framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/CookieAuthenticationOptionsExtensions.cs
  8. 4
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Auditing/AbpAuditingMiddleware.cs
  9. 20
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs
  10. 5
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Uow/AbpUnitOfWorkMiddleware.cs
  11. 3
      framework/src/Volo.Abp.Imaging.SkiaSharp/FodyWeavers.xml
  12. 30
      framework/src/Volo.Abp.Imaging.SkiaSharp/FodyWeavers.xsd
  13. 28
      framework/src/Volo.Abp.Imaging.SkiaSharp/Volo.Abp.Imaging.SkiaSharp.csproj
  14. 8
      framework/src/Volo.Abp.Imaging.SkiaSharp/Volo/Abp/Imaging/AbpImagingSkiaSharpModule.cs
  15. 98
      framework/src/Volo.Abp.Imaging.SkiaSharp/Volo/Abp/Imaging/SkiaSharpImageResizerContributor.cs
  16. 16
      framework/src/Volo.Abp.Imaging.SkiaSharp/Volo/Abp/Imaging/SkiaSharpResizerOptions.cs
  17. 19
      framework/test/Volo.Abp.Imaging.SkiaSharp.Tests/Volo.Abp.Imaging.SkiaSharp.Tests.csproj
  18. 14
      framework/test/Volo.Abp.Imaging.SkiaSharp.Tests/Volo/Abp/Imaging/AbpImagingMagickNetTestModule.cs
  19. 11
      framework/test/Volo.Abp.Imaging.SkiaSharp.Tests/Volo/Abp/Imaging/AbpImagingSkiaSharpTestModule.cs
  20. 75
      framework/test/Volo.Abp.Imaging.SkiaSharp.Tests/Volo/Abp/Imaging/SkiaSharpImageResizerTests.cs
  21. 7
      modules/docs/src/Volo.Docs.Web/Bundling/PrismjsStyleBundleContributorDocsExtension.cs
  22. 5
      npm/ng-packs/.eslintrc.json
  23. 3
      npm/ng-packs/.gitignore
  24. 5
      npm/ng-packs/packages/account/src/lib/account.module.ts
  25. 2
      npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings-half-row.component.ts
  26. 2
      npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts
  27. 2
      npm/ng-packs/packages/account/src/lib/defaults/default-personal-settings-form-props.ts
  28. 2
      npm/ng-packs/packages/account/src/lib/guards/extensions.guard.ts
  29. 4
      npm/ng-packs/packages/account/src/lib/models/config-options.ts
  30. 2
      npm/ng-packs/packages/account/src/lib/resolvers/extensions.resolver.ts
  31. 2
      npm/ng-packs/packages/account/src/lib/tokens/extensions.token.ts
  32. 3
      npm/ng-packs/packages/components/extensible/README.md
  33. 5
      npm/ng-packs/packages/components/extensible/ng-package.json
  34. 3
      npm/ng-packs/packages/components/extensible/src/lib/components/abstract-actions/abstract-actions.component.ts
  35. 16
      npm/ng-packs/packages/components/extensible/src/lib/components/date-time-picker/extensible-date-time-picker.component.ts
  36. 2
      npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.html
  37. 5
      npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts
  38. 0
      npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.html
  39. 0
      npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.ts
  40. 0
      npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.html
  41. 12
      npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.ts
  42. 0
      npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.html
  43. 0
      npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.ts
  44. 7
      npm/ng-packs/packages/components/extensible/src/lib/components/index.ts
  45. 0
      npm/ng-packs/packages/components/extensible/src/lib/components/page-toolbar/page-toolbar.component.html
  46. 0
      npm/ng-packs/packages/components/extensible/src/lib/components/page-toolbar/page-toolbar.component.ts
  47. 0
      npm/ng-packs/packages/components/extensible/src/lib/constants/extra-properties.ts
  48. 0
      npm/ng-packs/packages/components/extensible/src/lib/directives/prop-data.directive.ts
  49. 0
      npm/ng-packs/packages/components/extensible/src/lib/enums/components.ts
  50. 0
      npm/ng-packs/packages/components/extensible/src/lib/enums/props.enum.ts
  51. 52
      npm/ng-packs/packages/components/extensible/src/lib/extensible.module.ts
  52. 0
      npm/ng-packs/packages/components/extensible/src/lib/models/actions.ts
  53. 0
      npm/ng-packs/packages/components/extensible/src/lib/models/entity-actions.ts
  54. 0
      npm/ng-packs/packages/components/extensible/src/lib/models/entity-props.ts
  55. 0
      npm/ng-packs/packages/components/extensible/src/lib/models/form-props.ts
  56. 0
      npm/ng-packs/packages/components/extensible/src/lib/models/internal/object-extensions.ts
  57. 0
      npm/ng-packs/packages/components/extensible/src/lib/models/object-extensions.ts
  58. 0
      npm/ng-packs/packages/components/extensible/src/lib/models/props.ts
  59. 0
      npm/ng-packs/packages/components/extensible/src/lib/models/toolbar-actions.ts
  60. 0
      npm/ng-packs/packages/components/extensible/src/lib/pipes/create-injector.pipe.ts
  61. 0
      npm/ng-packs/packages/components/extensible/src/lib/services/extensions.service.ts
  62. 0
      npm/ng-packs/packages/components/extensible/src/lib/tokens/extensible-form-view-provider.token.ts
  63. 0
      npm/ng-packs/packages/components/extensible/src/lib/tokens/extensions.token.ts
  64. 0
      npm/ng-packs/packages/components/extensible/src/lib/utils/actions.util.ts
  65. 0
      npm/ng-packs/packages/components/extensible/src/lib/utils/enum.util.ts
  66. 0
      npm/ng-packs/packages/components/extensible/src/lib/utils/factory.util.ts
  67. 9
      npm/ng-packs/packages/components/extensible/src/lib/utils/form-props.util.ts
  68. 0
      npm/ng-packs/packages/components/extensible/src/lib/utils/localization.util.ts
  69. 0
      npm/ng-packs/packages/components/extensible/src/lib/utils/props.util.ts
  70. 0
      npm/ng-packs/packages/components/extensible/src/lib/utils/state.util.ts
  71. 10
      npm/ng-packs/packages/components/extensible/src/lib/utils/typeahead.util.ts
  72. 0
      npm/ng-packs/packages/components/extensible/src/lib/utils/validation.util.ts
  73. 10
      npm/ng-packs/packages/components/extensible/src/public-api.ts
  74. 0
      npm/ng-packs/packages/components/extensible/src/tests/actions.spec.ts
  75. 0
      npm/ng-packs/packages/components/extensible/src/tests/actions.util.spec.ts
  76. 0
      npm/ng-packs/packages/components/extensible/src/tests/date-time.adapter.spec.ts
  77. 0
      npm/ng-packs/packages/components/extensible/src/tests/date.adapter.spec.ts
  78. 0
      npm/ng-packs/packages/components/extensible/src/tests/entity-actions.spec.ts
  79. 0
      npm/ng-packs/packages/components/extensible/src/tests/entity-props.spec.ts
  80. 0
      npm/ng-packs/packages/components/extensible/src/tests/enum.util.spec.ts
  81. 0
      npm/ng-packs/packages/components/extensible/src/tests/extensions.service.spec.ts
  82. 0
      npm/ng-packs/packages/components/extensible/src/tests/factory.util.spec.ts
  83. 0
      npm/ng-packs/packages/components/extensible/src/tests/form-props.spec.ts
  84. 0
      npm/ng-packs/packages/components/extensible/src/tests/form-props.util.spec.ts
  85. 0
      npm/ng-packs/packages/components/extensible/src/tests/localization.util.spec.ts
  86. 0
      npm/ng-packs/packages/components/extensible/src/tests/props.spec.ts
  87. 0
      npm/ng-packs/packages/components/extensible/src/tests/props.util.spec.ts
  88. 0
      npm/ng-packs/packages/components/extensible/src/tests/state.util.spec.ts
  89. 0
      npm/ng-packs/packages/components/extensible/src/tests/time.adapter.spec.ts
  90. 0
      npm/ng-packs/packages/components/extensible/src/tests/toolbar-actions.spec.ts
  91. 0
      npm/ng-packs/packages/components/extensible/src/tests/typeahead.util.spec.ts
  92. 0
      npm/ng-packs/packages/components/extensible/src/tests/validation.util.spec.ts
  93. 8
      npm/ng-packs/packages/components/page/src/page.module.ts
  94. 7
      npm/ng-packs/packages/components/project.json
  95. 2
      npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts
  96. 4
      npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts
  97. 2
      npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-actions.ts
  98. 2
      npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-props.ts
  99. 2
      npm/ng-packs/packages/identity/src/lib/defaults/default-roles-form-props.ts
  100. 2
      npm/ng-packs/packages/identity/src/lib/defaults/default-roles-toolbar-actions.ts

3
Directory.Packages.props

@ -140,6 +140,9 @@
<PackageVersion Include="Shouldly" Version="4.0.3" />
<PackageVersion Include="SixLabors.ImageSharp" Version="3.0.2" />
<PackageVersion Include="SixLabors.ImageSharp.Drawing" Version="2.0.0" />
<PackageVersion Include="SkiaSharp" Version="2.88.6" />
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="2.88.6" />
<PackageVersion Include="SkiaSharp.NativeAssets.macOS" Version="2.88.6" />
<PackageVersion Include="Slugify.Core" Version="4.0.1" />
<PackageVersion Include="Spectre.Console" Version="0.47.0" />
<PackageVersion Include="StackExchange.Redis" Version="2.6.122" />

2
docs/en/Community-Articles/2023-11-05-EF-Core-8-Complex-Types/POST.MD

@ -105,7 +105,7 @@ And update the database:
dotnet ef database update
````
If you check the fields of the `Customers` table in your dayabase, you will see the following fields:
If you check the fields of the `Customers` table in your database, you will see the following fields:
* `Id`
* `Name`

21
docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/Post.md

@ -1,6 +1,9 @@
# Blazor's History and Full-stack Web UI
Blazor is a web framework that allows developers to build interactive web applications using .NET instead of JavaScript. The first version of Blazor was **released on May 14, 2020**. Since its initial release, Blazor has evolved with the new versions. Until now, six different versions have been declared. Sometimes, it can be not very clear to see the differences between these approaches. First, let's try to understand these.
![Cover Image](cover-image.png)
Blazor is a web framework that allows developers to build interactive web applications using .NET instead of JavaScript. The first version of Blazor was released on May 14, 2020. Since its initial release, Blazor has evolved with the new versions. Until now, six different versions have been declared. Sometimes, it can be not very clear to see the differences between these approaches. First, let's try to understand these.
* **Blazor-Server**: >> *Loads fast at first* >> In this version, heavy things are done in the server. Browsers are thin clients and download a small page for the first load. The page updates are done via SignalR connection. This was released with .NET Core 3.
* **Blazor WebAssembly (WASM):** >> *Loads slow at first* >> In this version, some binary files are being downloaded to the browser. This approach takes longer initialization time than the "Server" approach. The hard work is done on the browser.
@ -40,7 +43,7 @@ You can switch between two rendering modes and even mix them on the same page. W
## How it works?
## How it works?
### Rendering on Server
@ -50,25 +53,27 @@ You can add `WebComponentRenderMode.Server` to your Blazor components so that th
And sure you can add `WebComponentRenderMode.Server` to your page level, and the complete page will be rendered as a server component. All inputs on this page can work as an interactive server component like SPA mode.
And sure, you can add `WebComponentRenderMode.Server` to your page level, and the complete page will be rendered as a server component. All inputs on this page can work as an interactive server component like SPA mode.
![image-20231106172638604](image-20231106172638604.png)
### Rendering on client
### Rendering on Client
You can switch to WebAssembly mode by writing `WebComponentRenderMode.WebAssembly` attribute to your page. By doing so, the whole page should run interactively using WebAssembly. This time there's no server connection anymore because it loads the binaries (WebAssembly runtimes) at the page load.
![image-20231106173021958](image-20231106173021958.png)
## How it works?
## Enabling the Blazor Fullstack UI?
To enable Blazor Full-stack Web UI, you need to write `net8.0;net7.0-browser` into the `TargetFrameworks` area of your `csproj` file. These two keywords change your app like this; `net8.0` framework renders on the server, and `net7.0-browser` framework renders on the browser.
![image-20231106173411309](image-20231106173411309.png)
## Let the System decide on WebAssembly or Server approach
## Let the System Decide WebAssembly or Server Approach
You can let the system decide whether it uses `WebAssembly` or `Server`. This can be done with the `Auto` mode of the `WebComponentRenderMode`. In this case, it will not load binary files (WebAssembly files) for the initial page that has `WebComponentRenderMode.Server` attribute, but whenever the user navigates to a page that has `WebComponentRenderMode.WebAssembly`, it will download the runtimes. This will allow us to load the initial page very fast, and when we need interactivity, we can switch to `WebAssembly` and wait for the binaries to download. But this download will be done one time because it will be cached.
@ -80,10 +85,10 @@ You can let the system decide whether it uses `WebAssembly` or `Server`. This ca
I summarized the new generation Blazor in a very simple way. This architecture will be useful to everyone who uses Blazor.
---
*Resources:*
* You can check out Dan Roth's GitHub issue 👉 [github.com/dotnet/aspnetcore/issues/46636](https://github.com/dotnet/aspnetcore/issues/46636).
* You can check Dan Roth's GitHub issue 👉 [github.com/dotnet/aspnetcore/issues/46636](https://github.com/dotnet/aspnetcore/issues/46636).
* Steven Sanderson's YouTube video is very good for understanding these concepts 👉 [Blazor United Prototype Video](https://youtu.be/48G_CEGXZZM).

BIN
docs/en/Community-Articles/2023-11-06-Blazor-Fullstack-Web-Ui/cover-image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 676 KiB

14
framework/Volo.Abp.sln

@ -459,6 +459,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Imaging.AspNetCore
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Maui.Client", "src\Volo.Abp.Maui.Client\Volo.Abp.Maui.Client.csproj", "{F19A6E0C-F719-4ED9-A024-14E4B8D40883}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Imaging.SkiaSharp", "src\Volo.Abp.Imaging.SkiaSharp\Volo.Abp.Imaging.SkiaSharp.csproj", "{198683D0-7DC6-40F2-B81B-8E446E70A9DE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Imaging.SkiaSharp.Tests", "test\Volo.Abp.Imaging.SkiaSharp.Tests\Volo.Abp.Imaging.SkiaSharp.Tests.csproj", "{DFAF8763-D1D6-4EB4-B459-20E31007FE2F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -1369,6 +1373,14 @@ Global
{F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Release|Any CPU.Build.0 = Release|Any CPU
{198683D0-7DC6-40F2-B81B-8E446E70A9DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{198683D0-7DC6-40F2-B81B-8E446E70A9DE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{198683D0-7DC6-40F2-B81B-8E446E70A9DE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{198683D0-7DC6-40F2-B81B-8E446E70A9DE}.Release|Any CPU.Build.0 = Release|Any CPU
{DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -1600,6 +1612,8 @@ Global
{62B2B8C9-8F24-4D31-894F-C1F0728D32AB} = {447C8A77-E5F0-4538-8687-7383196D04EA}
{983B0136-384B-4439-B374-31111FFAA286} = {447C8A77-E5F0-4538-8687-7383196D04EA}
{F19A6E0C-F719-4ED9-A024-14E4B8D40883} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{198683D0-7DC6-40F2-B81B-8E446E70A9DE} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{DFAF8763-D1D6-4EB4-B459-20E31007FE2F} = {447C8A77-E5F0-4538-8687-7383196D04EA}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5}

2
framework/src/Volo.Abp.AspNetCore.SignalR/Volo/Abp/AspNetCore/SignalR/AbpAspNetCoreSignalRModule.cs

@ -78,7 +78,7 @@ public class AbpAspNetCoreSignalRModule : AbpModule
{
foreach (var routePattern in routePatterns)
{
options.IgnoredUrls.AddIfNotContains(x => routePattern.StartsWith(x), () => routePattern);
options.IgnoredUrls.AddIfNotContains(x => routePattern.StartsWith(x, StringComparison.OrdinalIgnoreCase), () => routePattern);
}
});

4
framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/CookieAuthenticationOptionsExtensions.cs

@ -28,8 +28,8 @@ public static class CookieAuthenticationOptionsExtensions
var logger = principalContext.HttpContext.RequestServices.GetRequiredService<ILogger<CookieAuthenticationOptions>>();
var tokenExpiresAt = principalContext.Properties.Items[".Token.expires_at"];
if (DateTimeOffset.TryParseExact(tokenExpiresAt, "o", null, DateTimeStyles.RoundtripKind, out var expiresAt) &&
var tokenExpiresAt = principalContext.Properties.GetString(".Token.expires_at");
if (!tokenExpiresAt.IsNullOrWhiteSpace() && DateTimeOffset.TryParseExact(tokenExpiresAt, "o", null, DateTimeStyles.RoundtripKind, out var expiresAt) &&
expiresAt < DateTimeOffset.UtcNow.Subtract(advance.Value))
{
logger.LogInformation("The access_token is expired.");

4
framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Auditing/AbpAuditingMiddleware.cs

@ -100,12 +100,12 @@ public class AbpAuditingMiddleware : IMiddleware, ITransientDependency
}
if (!AuditingOptions.IsEnabledForIntegrationServices &&
context.Request.Path.Value.StartsWith($"/{AbpAspNetCoreConsts.DefaultIntegrationServiceApiPrefix}/"))
context.Request.Path.Value.StartsWith($"/{AbpAspNetCoreConsts.DefaultIntegrationServiceApiPrefix}/", StringComparison.OrdinalIgnoreCase))
{
return true;
}
if (AspNetCoreAuditingOptions.IgnoredUrls.Any(x => context.Request.Path.Value.StartsWith(x)))
if (AspNetCoreAuditingOptions.IgnoredUrls.Any(x => context.Request.Path.Value.StartsWith(x, StringComparison.OrdinalIgnoreCase)))
{
return true;
}

20
framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/AbpSecurityHeadersMiddleware.cs

@ -33,7 +33,7 @@ public class AbpSecurityHeadersMiddleware : IMiddleware, ITransientDependency
var requestAcceptTypeHtml = context.Request.Headers["Accept"].Any(x =>
x!.Contains("text/html") || x.Contains("*/*") || x.Contains("application/xhtml+xml"));
var endpoint = context.GetEndpoint();
if (endpoint?.Metadata.GetMetadata<IgnoreAbpSecurityHeaderAttribute>() != null)
@ -42,11 +42,11 @@ public class AbpSecurityHeadersMiddleware : IMiddleware, ITransientDependency
return;
}
if (!requestAcceptTypeHtml
|| !Options.Value.UseContentSecurityPolicyHeader
|| await AlwaysIgnoreContentTypes(context)
if (!requestAcceptTypeHtml
|| !Options.Value.UseContentSecurityPolicyHeader
|| await AlwaysIgnoreContentTypes(context)
|| endpoint == null
|| Options.Value.IgnoredScriptNoncePaths.Any(x => context.Request.Path.StartsWithSegments(x.EnsureStartsWith('/'))))
|| Options.Value.IgnoredScriptNoncePaths.Any(x => context.Request.Path.StartsWithSegments(x.EnsureStartsWith('/'), StringComparison.OrdinalIgnoreCase)))
{
AddOtherHeaders(context);
await next.Invoke(context);
@ -71,7 +71,7 @@ public class AbpSecurityHeadersMiddleware : IMiddleware, ITransientDependency
{
return Task.CompletedTask;
}
if (context.Response.StatusCode is < 200 or > 299)
{
return Task.CompletedTask;
@ -85,7 +85,7 @@ public class AbpSecurityHeadersMiddleware : IMiddleware, ITransientDependency
AddOtherHeaders(context);
await next.Invoke(context);
}
private async Task<bool> AlwaysIgnoreContentTypes(HttpContext context)
{
foreach (var selector in Options.Value.IgnoredScriptNonceSelectors)
@ -95,7 +95,7 @@ public class AbpSecurityHeadersMiddleware : IMiddleware, ITransientDependency
return true;
}
}
return false;
}
@ -130,7 +130,7 @@ public class AbpSecurityHeadersMiddleware : IMiddleware, ITransientDependency
var newScriptSrcValue = scriptSrcValue + nonceStr;
return Options.Value.ContentSecurityPolicyValue!.Replace(scriptSrcValue!, newScriptSrcValue);
}
protected virtual void AddHeader(HttpContext context, string key, string value, bool overrideIfExists = false)
{
@ -142,4 +142,4 @@ public class AbpSecurityHeadersMiddleware : IMiddleware, ITransientDependency
context.Response.Headers.AddIfNotContains(new KeyValuePair<string, StringValues>(key, value));
}
}
}

5
framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Uow/AbpUnitOfWorkMiddleware.cs

@ -1,4 +1,5 @@
using System.Linq;
using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Options;
@ -38,6 +39,6 @@ public class AbpUnitOfWorkMiddleware : IMiddleware, ITransientDependency
private bool IsIgnoredUrl(HttpContext context)
{
return context.Request.Path.Value != null &&
_options.IgnoredUrls.Any(x => context.Request.Path.Value.StartsWith(x));
_options.IgnoredUrls.Any(x => context.Request.Path.Value.StartsWith(x, StringComparison.OrdinalIgnoreCase));
}
}

3
framework/src/Volo.Abp.Imaging.SkiaSharp/FodyWeavers.xml

@ -0,0 +1,3 @@
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<ConfigureAwait ContinueOnCapturedContext="false" />
</Weavers>

30
framework/src/Volo.Abp.Imaging.SkiaSharp/FodyWeavers.xsd

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. -->
<xs:element name="Weavers">
<xs:complexType>
<xs:all>
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" />
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="VerifyAssembly" type="xs:boolean">
<xs:annotation>
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="VerifyIgnoreCodes" type="xs:string">
<xs:annotation>
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="GenerateXsd" type="xs:boolean">
<xs:annotation>
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>

28
framework/src/Volo.Abp.Imaging.SkiaSharp/Volo.Abp.Imaging.SkiaSharp.csproj

@ -0,0 +1,28 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\configureawait.props" />
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0</TargetFrameworks>
<Nullable>enable</Nullable>
<WarningsAsErrors>Nullable</WarningsAsErrors>
<PackageId>Volo.Abp.Imaging.SkiaSharp</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Imaging.Abstractions\Volo.Abp.Imaging.Abstractions.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="SkiaSharp" />
<PackageReference Include="SkiaSharp.NativeAssets.Linux" Condition="$([MSBuild]::IsOSPlatform('Linux'))" />
<PackageReference Include="SkiaSharp.NativeAssets.macOS" Condition="$([MSBuild]::IsOSPlatform('OSX'))" />
</ItemGroup>
</Project>

8
framework/src/Volo.Abp.Imaging.SkiaSharp/Volo/Abp/Imaging/AbpImagingSkiaSharpModule.cs

@ -0,0 +1,8 @@
using Volo.Abp.Modularity;
namespace Volo.Abp.Imaging;
[DependsOn(typeof(AbpImagingAbstractionsModule))]
public class AbpImagingSkiaSharpModule : AbpModule
{
}

98
framework/src/Volo.Abp.Imaging.SkiaSharp/Volo/Abp/Imaging/SkiaSharpImageResizerContributor.cs

@ -0,0 +1,98 @@
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using SkiaSharp;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http;
namespace Volo.Abp.Imaging;
public class SkiaSharpImageResizerContributor : IImageResizerContributor, ITransientDependency
{
protected SkiaSharpResizerOptions Options { get; }
public SkiaSharpImageResizerContributor(IOptions<SkiaSharpResizerOptions> options)
{
Options = options.Value;
}
public virtual async Task<ImageResizeResult<byte[]>> TryResizeAsync(byte[] bytes, ImageResizeArgs resizeArgs, string? mimeType = null, CancellationToken cancellationToken = default)
{
if (!mimeType.IsNullOrWhiteSpace() && !CanResize(mimeType))
{
return new ImageResizeResult<byte[]>(bytes, ImageProcessState.Unsupported);
}
using (var memoryStream = new MemoryStream(bytes))
{
var result = await TryResizeAsync(memoryStream, resizeArgs, mimeType, cancellationToken);
if (result.State != ImageProcessState.Done)
{
return new ImageResizeResult<byte[]>(bytes, result.State);
}
var newBytes = await result.Result.GetAllBytesAsync(cancellationToken);
result.Result.Dispose();
return new ImageResizeResult<byte[]>(newBytes, result.State);
}
}
public virtual async Task<ImageResizeResult<Stream>> TryResizeAsync(Stream stream, ImageResizeArgs resizeArgs, string? mimeType = null, CancellationToken cancellationToken = default)
{
if (!mimeType.IsNullOrWhiteSpace() && !CanResize(mimeType))
{
return new ImageResizeResult<Stream>(stream, ImageProcessState.Unsupported);
}
var (memoryBitmapStream, memorySkCodecStream) = await CreateMemoryStream(stream);
using (var original = SKBitmap.Decode(memoryBitmapStream))
{
using (var resized = original.Resize(new SKImageInfo(resizeArgs.Width, resizeArgs.Height), Options.SKFilterQuality))
{
using (var image = SKImage.FromBitmap(resized))
{
using (var codec = SKCodec.Create(memorySkCodecStream))
{
var memoryStream = new MemoryStream();
image.Encode(codec.EncodedFormat, Options.Quality).SaveTo(memoryStream);
return new ImageResizeResult<Stream>(memoryStream, ImageProcessState.Done);
}
}
}
}
}
protected virtual async Task<(MemoryStream, MemoryStream)> CreateMemoryStream(Stream stream)
{
var streamPosition = stream.Position;
var memoryBitmapStream = new MemoryStream();
var memorySkCodecStream = new MemoryStream();
await stream.CopyToAsync(memoryBitmapStream);
stream.Position = streamPosition;
await stream.CopyToAsync(memorySkCodecStream);
stream.Position = streamPosition;
memoryBitmapStream.Position = 0;
memorySkCodecStream.Position = 0;
return (memoryBitmapStream, memorySkCodecStream);
}
protected virtual bool CanResize(string? mimeType)
{
return mimeType switch {
MimeTypes.Image.Jpeg => true,
MimeTypes.Image.Png => true,
MimeTypes.Image.Webp => true,
_ => false
};
}
}

16
framework/src/Volo.Abp.Imaging.SkiaSharp/Volo/Abp/Imaging/SkiaSharpResizerOptions.cs

@ -0,0 +1,16 @@
using SkiaSharp;
namespace Volo.Abp.Imaging;
public class SkiaSharpResizerOptions
{
public SKFilterQuality SKFilterQuality { get; set; }
public int Quality { get; set; }
public SkiaSharpResizerOptions()
{
SKFilterQuality = SKFilterQuality.None;
Quality = 75;
}
}

19
framework/test/Volo.Abp.Imaging.SkiaSharp.Tests/Volo.Abp.Imaging.SkiaSharp.Tests.csproj

@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.test.props" />
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<ProjectReference Include="..\Volo.Abp.Imaging.Abstractions.Tests\Volo.Abp.Imaging.Abstractions.Tests.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.Imaging.SkiaSharp\Volo.Abp.Imaging.SkiaSharp.csproj" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Volo\Abp\Imaging\Files\**" />
</ItemGroup>
</Project>

14
framework/test/Volo.Abp.Imaging.SkiaSharp.Tests/Volo/Abp/Imaging/AbpImagingMagickNetTestModule.cs

@ -0,0 +1,14 @@
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;
namespace Volo.Abp.Imaging;
[DependsOn(
typeof(AbpAutofacModule),
typeof(AbpImagingSkiaSharpModule),
typeof(AbpTestBaseModule)
)]
public class AbpImagingSkiaSharpTestModule : AbpModule
{
}

11
framework/test/Volo.Abp.Imaging.SkiaSharp.Tests/Volo/Abp/Imaging/AbpImagingSkiaSharpTestModule.cs

@ -0,0 +1,11 @@
using Volo.Abp.Testing;
namespace Volo.Abp.Imaging;
public abstract class AbpImagingSkiaSharpTestBase : AbpIntegratedTest<AbpImagingSkiaSharpTestModule>
{
protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options)
{
options.UseAutofac();
}
}

75
framework/test/Volo.Abp.Imaging.SkiaSharp.Tests/Volo/Abp/Imaging/SkiaSharpImageResizerTests.cs

@ -0,0 +1,75 @@
using System.IO;
using System.Threading.Tasks;
using Shouldly;
using Xunit;
namespace Volo.Abp.Imaging;
public class SkiaSharpImageResizerTests : AbpImagingSkiaSharpTestBase
{
public IImageResizer ImageResizer { get; }
public SkiaSharpImageResizerTests()
{
ImageResizer = GetRequiredService<IImageResizer>();
}
[Fact]
public async Task Should_Resize_Jpg()
{
await using var jpegImage = ImageFileHelper.GetJpgTestFileStream();
var resizedImage = await ImageResizer.ResizeAsync(jpegImage, new ImageResizeArgs(100, 100));
resizedImage.ShouldNotBeNull();
resizedImage.State.ShouldBe(ImageProcessState.Done);
resizedImage.Result.Length.ShouldBeLessThan(jpegImage.Length);
resizedImage.Result.Dispose();
}
[Fact]
public async Task Should_Resize_Png()
{
await using var pngImage = ImageFileHelper.GetPngTestFileStream();
var resizedImage = await ImageResizer.ResizeAsync(pngImage, new ImageResizeArgs(100, 100));
resizedImage.ShouldNotBeNull();
resizedImage.State.ShouldBe(ImageProcessState.Done);
resizedImage.Result.Length.ShouldBeLessThan(pngImage.Length);
resizedImage.Result.Dispose();
}
[Fact]
public async Task Should_Resize_Webp()
{
await using var webpImage = ImageFileHelper.GetWebpTestFileStream();
var resizedImage = await ImageResizer.ResizeAsync(webpImage, new ImageResizeArgs(100, 100));
resizedImage.ShouldNotBeNull();
resizedImage.State.ShouldBe(ImageProcessState.Done);
resizedImage.Result.Length.ShouldBeLessThan(webpImage.Length);
resizedImage.Result.Dispose();
}
[Fact]
public async Task Should_Resize_Stream_And_Byte_Array_The_Same()
{
await using var jpegImage = ImageFileHelper.GetJpgTestFileStream();
var resizedImage1 = await ImageResizer.ResizeAsync(jpegImage, new ImageResizeArgs(100, 100));
var resizedImage2 = await ImageResizer.ResizeAsync(await jpegImage.GetAllBytesAsync(), new ImageResizeArgs(100, 100));
resizedImage1.ShouldNotBeNull();
resizedImage1.State.ShouldBe(ImageProcessState.Done);
resizedImage1.Result.Length.ShouldBeLessThan(jpegImage.Length);
resizedImage2.ShouldNotBeNull();
resizedImage2.State.ShouldBe(ImageProcessState.Done);
resizedImage2.Result.LongLength.ShouldBeLessThan(jpegImage.Length);
resizedImage1.Result.Length.ShouldBe(resizedImage2.Result.LongLength);
resizedImage1.Result.Dispose();
}
}

7
modules/docs/src/Volo.Docs.Web/Bundling/PrismjsStyleBundleContributorDocsExtension.cs

@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Linq;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
namespace Volo.Docs.Bundling
@ -7,7 +8,11 @@ namespace Volo.Docs.Bundling
{
public override void ConfigureBundle(BundleConfigurationContext context)
{
context.Files.ReplaceOne("/libs/prismjs/themes/prism.css","/libs/prismjs/themes/prism-okaidia.css");
var prismCss = context.Files.FirstOrDefault(x => x.FileName == "/libs/prismjs/themes/prism.css");
if (prismCss != null)
{
prismCss.FileName = "/libs/prismjs/themes/prism-okaidia.css";
}
context.Files.AddIfNotContains("/libs/prismjs/plugins/line-highlight/prism-line-highlight.css");
context.Files.AddIfNotContains("/libs/prismjs/plugins/toolbar/prism-toolbar.css");
context.Files.AddIfNotContains("/libs/prismjs/plugins/diff-highlight/prism-diff-highlight.css");

5
npm/ng-packs/.eslintrc.json

@ -2,6 +2,9 @@
"root": true,
"ignorePatterns": ["**/*"],
"plugins": ["@nx"],
"rules": {
"@typescript-eslint/no-explicit-any": "off"
},
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
@ -25,9 +28,11 @@
"files": ["*.ts", "*.tsx"],
"extends": ["plugin:@nx/typescript"],
"rules": {
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-namespace": "off",
"@typescript-eslint/no-empty-function": ["warn"],
"@typescript-eslint/no-empty-interface": ["warn"]
}
},
{

3
npm/ng-packs/.gitignore

@ -56,3 +56,6 @@ Thumbs.db
*.internal.*
.angular
.nx/
.nx/cache

5
npm/ng-packs/packages/account/src/lib/account.module.ts

@ -16,10 +16,11 @@ import { AuthenticationFlowGuard } from './guards/authentication-flow.guard';
import { ForgotPasswordComponent } from './components/forgot-password/forgot-password.component';
import { ResetPasswordComponent } from './components/reset-password/reset-password.component';
import { RE_LOGIN_CONFIRMATION_TOKEN } from './tokens';
import { UiExtensionsModule } from '@abp/ng.theme.shared/extensions';
import { ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS } from './tokens/extensions.token';
import { AccountExtensionsGuard } from './guards/extensions.guard';
import { PersonalSettingsHalfRowComponent } from './components/personal-settings/personal-settings-half-row.component';
import { ExtensibleModule } from "@abp/ng.components/extensible";
const declarations = [
LoginComponent,
@ -40,7 +41,7 @@ const declarations = [
ThemeSharedModule,
NgbDropdownModule,
NgxValidateCoreModule,
UiExtensionsModule,
ExtensibleModule,
],
exports: [...declarations],
})

2
npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings-half-row.component.ts

@ -3,7 +3,7 @@ import {
EXTENSIONS_FORM_PROP,
FormProp,
EXTENSIBLE_FORM_VIEW_PROVIDER,
} from '@abp/ng.theme.shared/extensions';
} from '@abp/ng.components/extensible';
import { UntypedFormGroup } from '@angular/forms';
@Component({

2
npm/ng-packs/packages/account/src/lib/components/personal-settings/personal-settings.component.ts

@ -11,7 +11,7 @@ import {
EXTENSIONS_IDENTIFIER,
FormPropData,
generateFormFromProps,
} from '@abp/ng.theme.shared/extensions';
} from '@abp/ng.components/extensible';
import { eAccountComponents } from '../../enums';
@Component({

2
npm/ng-packs/packages/account/src/lib/defaults/default-personal-settings-form-props.ts

@ -1,4 +1,4 @@
import { ePropType, FormProp } from '@abp/ng.theme.shared/extensions';
import { ePropType, FormProp } from '@abp/ng.components/extensible';
import { UpdateProfileDto } from '@abp/ng.account.core/proxy';
import { Validators } from '@angular/forms';
import { PersonalSettingsHalfRowComponent } from '../components/personal-settings/personal-settings-half-row.component';

2
npm/ng-packs/packages/account/src/lib/guards/extensions.guard.ts

@ -9,7 +9,7 @@ import {
getObjectExtensionEntitiesFromStore,
mapEntitiesToContributors,
mergeWithDefaultProps,
} from '@abp/ng.theme.shared/extensions';
} from '@abp/ng.components/extensible';
import {
ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS,

4
npm/ng-packs/packages/account/src/lib/models/config-options.ts

@ -1,5 +1,5 @@
import { eAccountComponents } from '../enums';
import { EditFormPropContributorCallback } from '@abp/ng.theme.shared/extensions';
import { EditFormPropContributorCallback } from '@abp/ng.components/extensible';
import { UpdateProfileDto } from '@abp/ng.account.core/proxy';
export interface AccountConfigOptions {
@ -9,4 +9,4 @@ export interface AccountConfigOptions {
}
export type AccountEditFormPropContributors = Partial<{
[eAccountComponents.PersonalSettings]: EditFormPropContributorCallback<UpdateProfileDto>[];
}>;
}>;

2
npm/ng-packs/packages/account/src/lib/resolvers/extensions.resolver.ts

@ -6,7 +6,7 @@ import {
getObjectExtensionEntitiesFromStore,
mapEntitiesToContributors,
mergeWithDefaultProps,
} from '@abp/ng.theme.shared/extensions';
} from '@abp/ng.components/extensible';
import { eAccountComponents } from '../enums';
import { ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS, DEFAULT_ACCOUNT_FORM_PROPS } from '../tokens';
import { ResolveFn } from '@angular/router';

2
npm/ng-packs/packages/account/src/lib/tokens/extensions.token.ts

@ -1,7 +1,7 @@
import { eAccountComponents } from '../enums';
import { DEFAULT_PERSONAL_SETTINGS_UPDATE_FORM_PROPS } from '../defaults/default-personal-settings-form-props';
import { InjectionToken } from '@angular/core';
import { EditFormPropContributorCallback } from '@abp/ng.theme.shared/extensions';
import { EditFormPropContributorCallback } from '@abp/ng.components/extensible';
import { UpdateProfileDto } from '@abp/ng.account.core/proxy';
export const DEFAULT_ACCOUNT_FORM_PROPS = {

3
npm/ng-packs/packages/components/extensible/README.md

@ -0,0 +1,3 @@
# @abp/ng.components/extensible
Secondary entry point of `@abp/ng.components`. It can be used by importing from `@abp/ng.components/extensible`.

5
npm/ng-packs/packages/components/extensible/ng-package.json

@ -0,0 +1,5 @@
{
"lib": {
"entryFile": "src/public-api.ts"
}
}

3
npm/ng-packs/packages/theme-shared/extensions/src/lib/components/abstract-actions/abstract-actions.component.ts → npm/ng-packs/packages/components/extensible/src/lib/components/abstract-actions/abstract-actions.component.ts

@ -16,9 +16,8 @@ export abstract class AbstractActionsComponent<
@Input() record!: InferredData<L>['record'];
constructor(injector: Injector) {
protected constructor(injector: Injector) {
super();
this.getInjected = injector.get.bind(injector);
const extensions = injector.get(ExtensionsService);
const name = injector.get(EXTENSIONS_IDENTIFIER);

16
npm/ng-packs/packages/theme-shared/extensions/src/lib/components/date-time-picker/date-time-picker.component.ts → npm/ng-packs/packages/components/extensible/src/lib/components/date-time-picker/extensible-date-time-picker.component.ts

@ -14,13 +14,13 @@ import {
NgbTimeAdapter,
NgbTimepicker,
} from '@ng-bootstrap/ng-bootstrap';
import { DateTimeAdapter } from '../../adapters/date-time.adapter';
import { FormProp } from '../../models/form-props';
import { selfFactory } from '../../utils/factory.util';
import { DateTimeAdapter } from '@abp/ng.theme.shared';
@Component({
exportAs: 'abpDateTimePicker',
selector: 'abp-date-time-picker',
exportAs: 'abpExtensibleDateTimePicker',
selector: 'abp-extensible-date-time-picker',
template: `
<input
[id]="prop.id"
@ -57,7 +57,7 @@ import { selfFactory } from '../../utils/factory.util';
},
],
})
export class DateTimePickerComponent {
export class ExtensibleDateTimePickerComponent {
@Input() prop!: FormProp;
@Input() meridian = false;
@ -66,11 +66,11 @@ export class DateTimePickerComponent {
constructor(public readonly cdRef: ChangeDetectorRef) {}
setDate(datestr: string) {
this.date.writeValue(datestr);
setDate(dateStr: string) {
this.date.writeValue(dateStr);
}
setTime(datestr: string) {
this.time.writeValue(datestr);
setTime(dateStr: string) {
this.time.writeValue(dateStr);
}
}

2
npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.html → npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.html

@ -124,7 +124,7 @@
<ng-template ngSwitchCase="dateTime">
<ng-template [ngTemplateOutlet]="label"></ng-template>
<abp-date-time-picker [prop]="prop" [meridian]="meridian"></abp-date-time-picker>
<abp-extensible-date-time-picker [prop]="prop" [meridian]="meridian" />
</ng-template>
<ng-template ngSwitchCase="textarea">

5
npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts → npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts

@ -24,15 +24,14 @@ import {
import { NgbDateAdapter, NgbTimeAdapter } from '@ng-bootstrap/ng-bootstrap';
import { Observable, of } from 'rxjs';
import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators';
import { DateAdapter } from '../../adapters/date.adapter';
import { TimeAdapter } from '../../adapters/time.adapter';
import { DateAdapter, TimeAdapter } from '@abp/ng.theme.shared';
import { EXTRA_PROPERTIES_KEY } from '../../constants/extra-properties';
import { ePropType } from '../../enums/props.enum';
import { FormProp } from '../../models/form-props';
import { PropData } from '../../models/props';
import { selfFactory } from '../../utils/factory.util';
import { addTypeaheadTextSuffix } from '../../utils/typeahead.util';
import { eThemeSharedComponents } from '../../enums/components';
import { eThemeSharedComponents } from "../../enums/components";
@Component({
selector: 'abp-extensible-form-prop',

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.html → npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.html

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form.component.ts → npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-table/extensible-table.component.html → npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.html

12
npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-table/extensible-table.component.ts → npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.ts

@ -13,8 +13,6 @@ import {
Component,
EventEmitter,
Inject,
InjectFlags,
InjectionToken,
Injector,
Input,
LOCALE_ID,
@ -23,7 +21,6 @@ import {
SimpleChanges,
TemplateRef,
TrackByFunction,
Type,
} from '@angular/core';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@ -41,7 +38,7 @@ import {
const DEFAULT_ACTIONS_COLUMN_WIDTH = 150;
@Component({
@Component({
exportAs: 'abpExtensibleTable',
selector: 'abp-extensible-table',
templateUrl: './extensible-table.component.html',
@ -67,7 +64,7 @@ export class ExtensibleTableComponent<R = any> implements OnChanges {
@Output() tableActivate = new EventEmitter();
getInjected: <T>(token: Type<T> | InjectionToken<T>, notFoundValue?: T, flags?: InjectFlags) => T;
getInjected: typeof this.injector.get
hasAtLeastOnePermittedAction: boolean;
@ -150,7 +147,7 @@ export class ExtensibleTableComponent<R = any> implements OnChanges {
ngOnChanges({ data }: SimpleChanges) {
if (!data?.currentValue) return;
if (data.currentValue.length < 1) {
this.list.totalCount = this.recordsTotal
}
@ -166,7 +163,7 @@ export class ExtensibleTableComponent<R = any> implements OnChanges {
value,
};
if (prop.value.component) {
const injector = Injector.create({
record[propKey].injector = Injector.create({
providers: [
{
provide: PROP_DATA_STREAM,
@ -175,7 +172,6 @@ export class ExtensibleTableComponent<R = any> implements OnChanges {
],
parent: this.injector,
});
record[propKey].injector = injector;
record[propKey].component = prop.value.component;
}
});

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/components/grid-actions/grid-actions.component.html → npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.html

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/components/grid-actions/grid-actions.component.ts → npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.ts

7
npm/ng-packs/packages/components/extensible/src/lib/components/index.ts

@ -0,0 +1,7 @@
export * from './abstract-actions/abstract-actions.component';
export * from './extensible-form/extensible-form.component';
export * from './extensible-form/extensible-form-prop.component';
export * from './extensible-table/extensible-table.component';
export * from './date-time-picker/extensible-date-time-picker.component';
export * from './grid-actions/grid-actions.component';
export * from './page-toolbar/page-toolbar.component';

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/components/page-toolbar/page-toolbar.component.html → npm/ng-packs/packages/components/extensible/src/lib/components/page-toolbar/page-toolbar.component.html

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/components/page-toolbar/page-toolbar.component.ts → npm/ng-packs/packages/components/extensible/src/lib/components/page-toolbar/page-toolbar.component.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/constants/extra-properties.ts → npm/ng-packs/packages/components/extensible/src/lib/constants/extra-properties.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/directives/prop-data.directive.ts → npm/ng-packs/packages/components/extensible/src/lib/directives/prop-data.directive.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/enums/components.ts → npm/ng-packs/packages/components/extensible/src/lib/enums/components.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/enums/props.enum.ts → npm/ng-packs/packages/components/extensible/src/lib/enums/props.enum.ts

52
npm/ng-packs/packages/theme-shared/extensions/src/lib/ui-extensions.module.ts → npm/ng-packs/packages/components/extensible/src/lib/extensible.module.ts

@ -1,6 +1,7 @@
import { NgModule } from '@angular/core';
import { CoreModule } from '@abp/ng.core';
import { ThemeSharedModule } from '@abp/ng.theme.shared';
import { NgModule } from '@angular/core';
import { NgxValidateCoreModule } from '@ngx-validate/core';
import {
NgbDatepickerModule,
NgbDropdownModule,
@ -8,37 +9,27 @@ import {
NgbTooltipModule,
NgbTypeaheadModule,
} from '@ng-bootstrap/ng-bootstrap';
import { NgxValidateCoreModule } from '@ngx-validate/core';
import { DateTimePickerComponent } from './components/date-time-picker/date-time-picker.component';
import { ExtensibleFormPropComponent } from './components/extensible-form/extensible-form-prop.component';
import { ExtensibleFormComponent } from './components/extensible-form/extensible-form.component';
import { ExtensibleTableComponent } from './components/extensible-table/extensible-table.component';
import { GridActionsComponent } from './components/grid-actions/grid-actions.component';
import { PageToolbarComponent } from './components/page-toolbar/page-toolbar.component';
import { DisabledDirective } from './directives/disabled.directive';
import {
ExtensibleFormComponent,
ExtensibleFormPropComponent,
ExtensibleTableComponent,
GridActionsComponent,
PageToolbarComponent,
ExtensibleDateTimePickerComponent
} from './components';
import { PropDataDirective } from './directives/prop-data.directive';
import { CreateInjectorPipe } from './pipes/create-injector.pipe';
import { DisabledDirective } from '@abp/ng.theme.shared';
@NgModule({
exports: [
DateTimePickerComponent,
PageToolbarComponent,
GridActionsComponent,
ExtensibleFormComponent,
ExtensibleTableComponent,
PropDataDirective,
DisabledDirective,
CreateInjectorPipe,
],
declarations: [
DateTimePickerComponent,
ExtensibleDateTimePickerComponent,
PageToolbarComponent,
GridActionsComponent,
ExtensibleFormPropComponent,
ExtensibleFormComponent,
ExtensibleTableComponent,
PropDataDirective,
DisabledDirective,
CreateInjectorPipe,
],
imports: [
@ -49,13 +40,16 @@ import { CreateInjectorPipe } from './pipes/create-injector.pipe';
NgbDropdownModule,
NgbTimepickerModule,
NgbTypeaheadModule,
NgbTooltipModule
NgbTooltipModule,
DisabledDirective,
],
exports: [
PageToolbarComponent,
GridActionsComponent,
ExtensibleFormComponent,
ExtensibleTableComponent,
PropDataDirective,
CreateInjectorPipe,
],
})
export class BaseUiExtensionsModule {}
@NgModule({
exports: [BaseUiExtensionsModule],
imports: [BaseUiExtensionsModule],
})
export class UiExtensionsModule {}
export class ExtensibleModule {}

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/models/actions.ts → npm/ng-packs/packages/components/extensible/src/lib/models/actions.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/models/entity-actions.ts → npm/ng-packs/packages/components/extensible/src/lib/models/entity-actions.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/models/entity-props.ts → npm/ng-packs/packages/components/extensible/src/lib/models/entity-props.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/models/form-props.ts → npm/ng-packs/packages/components/extensible/src/lib/models/form-props.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/models/internal/object-extensions.ts → npm/ng-packs/packages/components/extensible/src/lib/models/internal/object-extensions.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/models/object-extensions.ts → npm/ng-packs/packages/components/extensible/src/lib/models/object-extensions.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/models/props.ts → npm/ng-packs/packages/components/extensible/src/lib/models/props.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/models/toolbar-actions.ts → npm/ng-packs/packages/components/extensible/src/lib/models/toolbar-actions.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/pipes/create-injector.pipe.ts → npm/ng-packs/packages/components/extensible/src/lib/pipes/create-injector.pipe.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/services/extensions.service.ts → npm/ng-packs/packages/components/extensible/src/lib/services/extensions.service.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/tokens/extensible-form-view-provider.token.ts → npm/ng-packs/packages/components/extensible/src/lib/tokens/extensible-form-view-provider.token.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/tokens/extensions.token.ts → npm/ng-packs/packages/components/extensible/src/lib/tokens/extensions.token.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/actions.util.ts → npm/ng-packs/packages/components/extensible/src/lib/utils/actions.util.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/enum.util.ts → npm/ng-packs/packages/components/extensible/src/lib/utils/enum.util.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/factory.util.ts → npm/ng-packs/packages/components/extensible/src/lib/utils/factory.util.ts

9
npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/form-props.util.ts → npm/ng-packs/packages/components/extensible/src/lib/utils/form-props.util.ts

@ -1,11 +1,10 @@
import { UntypedFormControl, UntypedFormGroup } from '@angular/forms';
import { DateTimeAdapter } from '../adapters/date-time.adapter';
import { DateAdapter } from '../adapters/date.adapter';
import { TimeAdapter } from '../adapters/time.adapter';
import { DateTimeAdapter,DateAdapter,TimeAdapter } from '@abp/ng.theme.shared';
import { EXTRA_PROPERTIES_KEY } from '../constants/extra-properties';
import { ePropType } from '../enums/props.enum';
import { FormProp, FormPropList } from "../models/form-props";
import { InferredProp, PropData } from "../models/props";
import { FormPropList } from "../models/form-props";
import { PropData } from "../models/props";
import { ExtensionsService } from '../services/extensions.service';
import { EXTENSIONS_IDENTIFIER } from '../tokens/extensions.token';

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/localization.util.ts → npm/ng-packs/packages/components/extensible/src/lib/utils/localization.util.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/props.util.ts → npm/ng-packs/packages/components/extensible/src/lib/utils/props.util.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/state.util.ts → npm/ng-packs/packages/components/extensible/src/lib/utils/state.util.ts

10
npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/typeahead.util.ts → npm/ng-packs/packages/components/extensible/src/lib/utils/typeahead.util.ts

@ -39,11 +39,11 @@ export function createTypeaheadOptions(
}
export function getTypeaheadType(lookup: ExtensionPropertyUiLookupDto, name: string) {
return Boolean(lookup.url)
? ePropType.Typeahead
: name.endsWith(TYPEAHEAD_TEXT_SUFFIX)
? ePropType.Hidden
: undefined;
if (!!lookup.url) {
return ePropType.Typeahead;
} else {
return name.endsWith(TYPEAHEAD_TEXT_SUFFIX) ? ePropType.Hidden : undefined;
}
}
export function createTypeaheadDisplayNameGenerator(

0
npm/ng-packs/packages/theme-shared/extensions/src/lib/utils/validation.util.ts → npm/ng-packs/packages/components/extensible/src/lib/utils/validation.util.ts

10
npm/ng-packs/packages/theme-shared/extensions/src/public-api.ts → npm/ng-packs/packages/components/extensible/src/public-api.ts

@ -1,14 +1,10 @@
export * from './lib/adapters/date-time.adapter';
export * from './lib/adapters/date.adapter';
export * from './lib/adapters/time.adapter';
export * from './lib/components/date-time-picker/date-time-picker.component';
export * from './lib/components/date-time-picker/extensible-date-time-picker.component';
export * from './lib/components/extensible-form/extensible-form-prop.component';
export * from './lib/components/extensible-form/extensible-form.component';
export * from './lib/components/extensible-table/extensible-table.component';
export * from './lib/components/grid-actions/grid-actions.component';
export * from './lib/components/page-toolbar/page-toolbar.component';
export * from './lib/constants/extra-properties';
export * from './lib/directives/disabled.directive';
export * from './lib/directives/prop-data.directive';
export * from './lib/enums/props.enum';
export * from './lib/enums/components';
@ -66,8 +62,8 @@ export * from './lib/pipes/create-injector.pipe';
export * from './lib/services/extensions.service';
export * from './lib/tokens/extensions.token';
export * from './lib/tokens/extensible-form-view-provider.token';
export * from './lib/ui-extensions.module';
export * from './lib/utils/actions.util';
export * from './lib/utils/actions.util';
export * from './lib/utils/form-props.util';
export * from './lib/utils/props.util';
export * from './lib/utils/state.util';
export * from './lib/extensible.module';

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/actions.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/actions.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/actions.util.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/actions.util.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/date-time.adapter.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/date-time.adapter.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/date.adapter.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/date.adapter.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/entity-actions.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/entity-actions.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/entity-props.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/entity-props.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/enum.util.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/enum.util.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/extensions.service.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/extensions.service.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/factory.util.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/factory.util.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/form-props.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/form-props.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/form-props.util.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/form-props.util.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/localization.util.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/localization.util.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/props.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/props.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/props.util.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/props.util.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/state.util.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/time.adapter.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/time.adapter.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/toolbar-actions.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/toolbar-actions.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/typeahead.util.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/typeahead.util.spec.ts

0
npm/ng-packs/packages/theme-shared/extensions/src/tests/validation.util.spec.ts → npm/ng-packs/packages/components/extensible/src/tests/validation.util.spec.ts

8
npm/ng-packs/packages/components/page/src/page.module.ts

@ -1,7 +1,6 @@
import { CoreModule } from '@abp/ng.core';
import { ThemeSharedModule } from '@abp/ng.theme.shared';
import { UiExtensionsModule } from '@abp/ng.theme.shared/extensions';
import { CommonModule } from '@angular/common';
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { PagePartDirective } from './page-part.directive';
import {
@ -10,6 +9,7 @@ import {
PageToolbarContainerComponent,
} from './page-parts.component';
import { PageComponent } from './page.component';
import {ExtensibleModule} from "@abp/ng.components/extensible";
const exportedDeclarations = [
PageComponent,
@ -21,7 +21,7 @@ const exportedDeclarations = [
@NgModule({
declarations: [...exportedDeclarations],
imports: [CommonModule, UiExtensionsModule, CoreModule, ThemeSharedModule],
exports: [...exportedDeclarations, UiExtensionsModule],
imports: [CommonModule, CoreModule, ThemeSharedModule, ExtensibleModule],
exports: [...exportedDeclarations],
})
export class PageModule {}

7
npm/ng-packs/packages/components/project.json

@ -32,7 +32,12 @@
"lint": {
"executor": "@nx/linter:eslint",
"options": {
"lintFilePatterns": ["packages/components/src/**/*.ts", "packages/components/src/**/*.html"]
"lintFilePatterns": [
"packages/components/src/**/*.ts",
"packages/components/src/**/*.html",
"packages/components/extensible/**/*.ts",
"packages/components/extensible/**/*.html"
]
},
"outputs": ["{options.outputFile}"]
}

2
npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts

@ -6,7 +6,7 @@ import {
EXTENSIONS_IDENTIFIER,
FormPropData,
generateFormFromProps,
} from '@abp/ng.theme.shared/extensions';
} from '@abp/ng.components/extensible';
import { Component, Injector, OnInit } from '@angular/core';
import { UntypedFormGroup } from '@angular/forms';
import { finalize } from 'rxjs/operators';

4
npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts

@ -11,7 +11,7 @@ import {
EXTENSIONS_IDENTIFIER,
FormPropData,
generateFormFromProps,
} from '@abp/ng.theme.shared/extensions';
} from '@abp/ng.components/extensible';
import {
Component,
Injector,
@ -60,7 +60,7 @@ export class UsersComponent implements OnInit {
permissionManagementKey = ePermissionManagementComponents.PermissionManagement;
entityDisplayName: string;
inputKey=eFormComponets.FormCheckboxComponent
trackByFn: TrackByFunction<AbstractControl> = (index, item) => Object.keys(item)[0] || index;

2
npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-actions.ts

@ -1,5 +1,5 @@
import { IdentityRoleDto } from '@abp/ng.identity/proxy';
import { EntityAction } from '@abp/ng.theme.shared/extensions';
import { EntityAction } from '@abp/ng.components/extensible';
import { RolesComponent } from '../components/roles/roles.component';
export const DEFAULT_ROLES_ENTITY_ACTIONS = EntityAction.createMany<IdentityRoleDto>([

2
npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-props.ts

@ -1,6 +1,6 @@
import { escapeHtmlChars, LocalizationService } from '@abp/ng.core';
import { IdentityRoleDto } from '@abp/ng.identity/proxy';
import { EntityProp, ePropType } from '@abp/ng.theme.shared/extensions';
import { EntityProp, ePropType } from '@abp/ng.components/extensible';
import { of } from 'rxjs';
export const DEFAULT_ROLES_ENTITY_PROPS = EntityProp.createMany<IdentityRoleDto>([

2
npm/ng-packs/packages/identity/src/lib/defaults/default-roles-form-props.ts

@ -1,5 +1,5 @@
import { IdentityRoleDto } from '@abp/ng.identity/proxy';
import { ePropType, FormProp, PropData, PropPredicate } from "@abp/ng.theme.shared/extensions";
import { ePropType, FormProp, PropData, PropPredicate } from "@abp/ng.components/extensible";
import { Validators } from '@angular/forms';
export const DEFAULT_ROLES_CREATE_FORM_PROPS = FormProp.createMany<IdentityRoleDto>([

2
npm/ng-packs/packages/identity/src/lib/defaults/default-roles-toolbar-actions.ts

@ -1,5 +1,5 @@
import { IdentityRoleDto } from '@abp/ng.identity/proxy';
import { ToolbarAction } from '@abp/ng.theme.shared/extensions';
import { ToolbarAction } from '@abp/ng.components/extensible';
import { RolesComponent } from '../components/roles/roles.component';
export const DEFAULT_ROLES_TOOLBAR_ACTIONS = ToolbarAction.createMany<IdentityRoleDto[]>([

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save