Browse Source

Merge branch 'dev' into RequireEmailVerificationToRegister

pull/21973/head
maliming 2 years ago
parent
commit
b0d4d0ee32
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 18
      Directory.Packages.props
  2. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
  3. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json
  4. 2
      docs/en/cli/index.md
  5. 20
      docs/en/docs-nav.json
  6. 2
      docs/en/release-info/migration-guides/abp-9-0.md
  7. 2
      docs/en/release-info/release-notes.md
  8. 2
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/toast/abp-toast.css
  9. 9
      latest-versions.json
  10. 25
      modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs
  11. 6
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs
  12. 9
      modules/docs/src/Volo.Docs.Web/Utils/DefaultDocsLinkGenerator.cs
  13. 1
      modules/openiddict/app/OpenIddict.Demo.Server/EntityFrameworkCore/ServerDataSeedContributor.cs
  14. 20
      modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20250215074649_Initial.Designer.cs
  15. 5
      modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20250215074649_Initial.cs
  16. 18
      modules/openiddict/app/OpenIddict.Demo.Server/Migrations/ServerDbContextModelSnapshot.cs
  17. 1
      modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs
  18. 2
      modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor
  19. 98
      modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs
  20. 2
      npm/ng-packs/package.json
  21. 2
      npm/ng-packs/packages/components/package.json
  22. 14
      npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html
  23. 27
      npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts
  24. 4
      npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html
  25. 8
      npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts

18
Directory.Packages.props

@ -111,10 +111,10 @@
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.1" /> <PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageVersion Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="9.0.0" /> <PackageVersion Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="9.0.0" />
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" /> <PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.3.0" /> <PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.5.0" />
<PackageVersion Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="8.3.0" /> <PackageVersion Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="8.5.0" />
<PackageVersion Include="Microsoft.IdentityModel.Tokens" Version="8.3.0" /> <PackageVersion Include="Microsoft.IdentityModel.Tokens" Version="8.5.0" />
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.3.0" /> <PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.5.0" />
<PackageVersion Include="Minio" Version="6.0.3" /> <PackageVersion Include="Minio" Version="6.0.3" />
<PackageVersion Include="MongoDB.Driver" Version="3.1.0" /> <PackageVersion Include="MongoDB.Driver" Version="3.1.0" />
<PackageVersion Include="NEST" Version="7.17.5" /> <PackageVersion Include="NEST" Version="7.17.5" />
@ -126,11 +126,11 @@
<PackageVersion Include="NUglify" Version="1.21.9" /> <PackageVersion Include="NUglify" Version="1.21.9" />
<PackageVersion Include="Nullable" Version="1.3.1" /> <PackageVersion Include="Nullable" Version="1.3.1" />
<PackageVersion Include="Octokit" Version="13.0.1" /> <PackageVersion Include="Octokit" Version="13.0.1" />
<PackageVersion Include="OpenIddict.Abstractions" Version="6.0.0" /> <PackageVersion Include="OpenIddict.Abstractions" Version="6.1.0" />
<PackageVersion Include="OpenIddict.Core" Version="6.0.0" /> <PackageVersion Include="OpenIddict.Core" Version="6.1.0" />
<PackageVersion Include="OpenIddict.Server.AspNetCore" Version="6.0.0" /> <PackageVersion Include="OpenIddict.Server.AspNetCore" Version="6.1.0" />
<PackageVersion Include="OpenIddict.Validation.AspNetCore" Version="6.0.0" /> <PackageVersion Include="OpenIddict.Validation.AspNetCore" Version="6.1.0" />
<PackageVersion Include="OpenIddict.Validation.ServerIntegration" Version="6.0.0" /> <PackageVersion Include="OpenIddict.Validation.ServerIntegration" Version="6.1.0" />
<PackageVersion Include="Oracle.EntityFrameworkCore" Version="9.23.60" /> <PackageVersion Include="Oracle.EntityFrameworkCore" Version="9.23.60" />
<PackageVersion Include="Polly" Version="8.4.2" /> <PackageVersion Include="Polly" Version="8.4.2" />
<PackageVersion Include="Polly.Extensions.Http" Version="3.0.0" /> <PackageVersion Include="Polly.Extensions.Http" Version="3.0.0" />

4
abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json

@ -688,6 +688,8 @@
"Permission:UserCleanUp": "User Clean Up", "Permission:UserCleanUp": "User Clean Up",
"AllowPrivateQuestion": "Allow Private Question", "AllowPrivateQuestion": "Allow Private Question",
"Permission:Campaigns": "Campaigns", "Permission:Campaigns": "Campaigns",
"Permission:Licenses": "License Settings" "Permission:Licenses": "License Settings",
"BlockUserPolicy": "Block User Policy",
"Permission:BlockUserPolicy": "Block User Policy"
} }
} }

3
abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json

@ -252,6 +252,7 @@
"DoYouAgreePrivacyPolicy": "By clicking <b>Subscribe</b> button you agree to the <a href=\"/terms-conditions\">Terms & Conditions</a> and <a href=\"/privacy\">Privacy Policy</a>.", "DoYouAgreePrivacyPolicy": "By clicking <b>Subscribe</b> button you agree to the <a href=\"/terms-conditions\">Terms & Conditions</a> and <a href=\"/privacy\">Privacy Policy</a>.",
"AbpConferenceDescription": "ABP Conference is a virtual event for .NET developers to learn and connect with the community.", "AbpConferenceDescription": "ABP Conference is a virtual event for .NET developers to learn and connect with the community.",
"Mobile": "Mobile", "Mobile": "Mobile",
"MetaTwitterCard": "summary_large_image" "MetaTwitterCard": "summary_large_image",
"IPAddress": "IP Address"
} }
} }

2
docs/en/cli/index.md

@ -44,7 +44,7 @@ Here, is the list of all available commands before explaining their details:
* **`add-package-ref`**: Adds package to given project. * **`add-package-ref`**: Adds package to given project.
* **`install-module`**: Adds a [multi-package application module](../modules/index.md) to a given module. * **`install-module`**: Adds a [multi-package application module](../modules/index.md) to a given module.
* **`install-local-module`**: Installs a local module to given module. * **`install-local-module`**: Installs a local module to given module.
* **`list-modules`**: Lists names of open-source application modules. * **`list-modules`**: Lists names of application modules.
* **`list-templates`**: Lists the names of available templates to create a solution. * **`list-templates`**: Lists the names of available templates to create a solution.
* **`get-source`**: Downloads the source code of a module. * **`get-source`**: Downloads the source code of a module.
* **`add-source-code`**: Downloads the source code and replaces package references with project references. * **`add-source-code`**: Downloads the source code and replaces package references with project references.

20
docs/en/docs-nav.json

@ -130,7 +130,7 @@
{ {
"text": "Book Store Application (with ABP Suite)", "text": "Book Store Application (with ABP Suite)",
"isLazyExpandable": true, "isLazyExpandable": true,
"path": "tutorials/book-store-with-abp-suite/index.md", "path": "tutorials/book-store-with-abp-suite",
"items": [ "items": [
{ {
"text": "Overview", "text": "Overview",
@ -162,11 +162,11 @@
{ {
"text": "Modular Monolith Application", "text": "Modular Monolith Application",
"isLazyExpandable": true, "isLazyExpandable": true,
"path": "tutorials/modular-crm/index.md", "path": "tutorials/modular-crm",
"items": [ "items": [
{ {
"text": "Overview", "text": "Overview",
"path": "tutorials/modular-crm/index.md", "path": "tutorials/modular-crm",
"isIndex": true "isIndex": true
}, },
{ {
@ -206,11 +206,11 @@
{ {
"text": "Microservice Solution", "text": "Microservice Solution",
"isLazyExpandable": true, "isLazyExpandable": true,
"path": "tutorials/microservice/index.md", "path": "tutorials/microservice",
"items": [ "items": [
{ {
"text": "Overview", "text": "Overview",
"path": "tutorials/microservice/index.md", "path": "tutorials/microservice",
"isIndex": true "isIndex": true
}, },
{ {
@ -246,19 +246,19 @@
{ {
"text": "Mobile Application Development", "text": "Mobile Application Development",
"isLazyExpandable": true, "isLazyExpandable": true,
"path": "tutorials/mobile/index.md", "path": "tutorials/mobile",
"items": [ "items": [
{ {
"text": "Overview", "text": "Overview",
"path": "tutorials/mobile/index.md" "path": "tutorials/mobile"
}, },
{ {
"text": "MAUI", "text": "MAUI",
"path": "tutorials/mobile/maui/index.md" "path": "tutorials/mobile/maui"
}, },
{ {
"text": "React Native", "text": "React Native",
"path": "tutorials/mobile/react-native/index.md" "path": "tutorials/mobile/react-native"
} }
] ]
}, },
@ -2689,7 +2689,7 @@
}, },
{ {
"text": "Knowledge Base", "text": "Knowledge Base",
"path": "kb/index.md" "path": "kb"
}, },
{ {
"text": "Penetration Test Report", "text": "Penetration Test Report",

2
docs/en/release-info/migration-guides/abp-9-0.md

@ -2,7 +2,7 @@
This document is a guide for upgrading ABP v8.x solutions to ABP v9.0. There are some changes in this version that may affect your applications, please read it carefully and apply the necessary changes to your application. This document is a guide for upgrading ABP v8.x solutions to ABP v9.0. There are some changes in this version that may affect your applications, please read it carefully and apply the necessary changes to your application.
> ABP upgraded to .NET 9.0, so you need to move your solutions to .NET 9.0 if you want to use the ABP 9.0. You can check the [Migrate from ASP.NET Core 8.0 to 9.0](https://learn.microsoft.com/en-us/aspnet/core/migration/80-90) documentation. > ABP has upgraded to .NET 9.0, so if you plan to use ABP 9.0, you’ll need to migrate your solutions to .NET 9.0. You can refer to the [Migrate from ASP.NET Core 8.0 to 9.0](https://learn.microsoft.com/en-us/aspnet/core/migration/80-90) documentation for guidance. However, ABP’s NuGet packages are compatible with both .NET 8 and .NET 9, allowing developers to continue using .NET 8 while still enjoying the latest features and improvements of the ABP Framework without upgrading their SDK.
## Open-Source (Framework) ## Open-Source (Framework)

2
docs/en/release-info/release-notes.md

@ -18,6 +18,8 @@ This is currently a RC (release-candidate) and you can see the detailed **[blog
See the detailed **[blog post / announcement](https://abp.io/blog/abp-9-0-stable-release-with-dotnet-9-0)** for the v9.0 release. See the detailed **[blog post / announcement](https://abp.io/blog/abp-9-0-stable-release-with-dotnet-9-0)** for the v9.0 release.
> **Note**: ABP has upgraded to .NET 9.0, so if you plan to use ABP 9.0, you’ll need to migrate your solutions to .NET 9.0. You can refer to the [Migrate from ASP.NET Core 8.0 to 9.0](https://learn.microsoft.com/en-us/aspnet/core/migration/80-90) documentation for guidance. However, ABP’s NuGet packages are compatible with both .NET 8 and .NET 9, allowing developers to continue using .NET 8 while still enjoying the latest features and improvements of the ABP Framework without upgrading their SDK.
* Upgraded to .NET 9.0 * Upgraded to .NET 9.0
* Introducing the `Extension Property Policy` * Introducing the `Extension Property Policy`
* Google Cloud Storage BLOB Provider * Google Cloud Storage BLOB Provider

2
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/toast/abp-toast.css

@ -9,9 +9,11 @@
z-index: 1900; z-index: 1900;
right: 30px; right: 30px;
bottom: 30px; bottom: 30px;
pointer-events: none;
} }
.abp-toast { .abp-toast {
pointer-events: auto;
display: grid; display: grid;
grid-template-columns: 35px 1fr; grid-template-columns: 35px 1fr;
gap: 5px; gap: 5px;

9
latest-versions.json

@ -1,4 +1,13 @@
[ [
{
"version": "9.0.5",
"releaseDate": "",
"type": "stable",
"message": "",
"leptonx": {
"version": "4.0.6"
}
},
{ {
"version": "9.0.4", "version": "9.0.4",
"releaseDate": "", "releaseDate": "",

25
modules/docs/src/Volo.Docs.Web/DocsUiOptions.cs

@ -38,6 +38,31 @@ namespace Volo.Docs
public SingleProjectModeOptions SingleProjectMode { get; } = new (); public SingleProjectModeOptions SingleProjectMode { get; } = new ();
public bool EnableEnlargeImage { get; set; } = true; public bool EnableEnlargeImage { get; set; } = true;
public Func<string, string> DocumentLinksNormalizer { get; set; } = link =>
{
if (!link.EndsWith("/Index", StringComparison.OrdinalIgnoreCase))
{
return link;
}
return link.Substring(0, link.LastIndexOf("/Index", StringComparison.OrdinalIgnoreCase));
};
public Func<string, string?> RedirectUrlResolver { get; set; } = url =>
{
if (!url.EndsWith("/Index", StringComparison.OrdinalIgnoreCase))
{
return null;
}
return url.Substring(0, url.LastIndexOf("/Index", StringComparison.OrdinalIgnoreCase));
};
public string? GetRedirectUrlIfNeeded(string url)
{
return RedirectUrlResolver.Invoke(url);
}
private string GetFormattedRoutePrefix() private string GetFormattedRoutePrefix()
{ {

6
modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs

@ -131,6 +131,12 @@ namespace Volo.Docs.Pages.Documents.Project
return Redirect(decodedUrl); return Redirect(decodedUrl);
} }
var redirectUrl = _uiOptions.GetRedirectUrlIfNeeded(displayUrl);
if (redirectUrl != null)
{
return RedirectPermanent(redirectUrl);
}
return await SetPageAsync(); return await SetPageAsync();
} }

9
modules/docs/src/Volo.Docs.Web/Utils/DefaultDocsLinkGenerator.cs

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Net; using System.Net;
using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Docs.Pages.Documents.Project; using Volo.Docs.Pages.Documents.Project;
@ -9,10 +10,13 @@ namespace Volo.Docs.Utils;
public class DefaultDocsLinkGenerator : IDocsLinkGenerator, ITransientDependency public class DefaultDocsLinkGenerator : IDocsLinkGenerator, ITransientDependency
{ {
protected LinkGenerator LinkGenerator { get; } protected LinkGenerator LinkGenerator { get; }
protected IOptions<DocsUiOptions> DocsUiOptions { get; }
public DefaultDocsLinkGenerator(LinkGenerator linkGenerator) public DefaultDocsLinkGenerator(LinkGenerator linkGenerator, IOptions<DocsUiOptions> docsUiOptions)
{ {
LinkGenerator = linkGenerator; LinkGenerator = linkGenerator;
DocsUiOptions = docsUiOptions;
} }
@ -26,6 +30,7 @@ public class DefaultDocsLinkGenerator : IDocsLinkGenerator, ITransientDependency
}; };
var encodedUrl = LinkGenerator.GetPathByPage("/Documents/Project/Index", values: routeValues); var encodedUrl = LinkGenerator.GetPathByPage("/Documents/Project/Index", values: routeValues);
return encodedUrl?.Replace("%2F", "/"); //Document name can contain path separator(/), so we need to decode it. var url = encodedUrl?.Replace("%2F", "/"); //Document name can contain path separator(/), so we need to decode it.
return DocsUiOptions.Value.DocumentLinksNormalizer?.Invoke(url);
} }
} }

1
modules/openiddict/app/OpenIddict.Demo.Server/EntityFrameworkCore/ServerDataSeedContributor.cs

@ -71,6 +71,7 @@ public class ServerDataSeedContributor : IDataSeedContributor, ITransientDepende
OpenIddictConstants.Permissions.Endpoints.Introspection, OpenIddictConstants.Permissions.Endpoints.Introspection,
OpenIddictConstants.Permissions.Endpoints.Revocation, OpenIddictConstants.Permissions.Endpoints.Revocation,
OpenIddictConstants.Permissions.Endpoints.EndSession, OpenIddictConstants.Permissions.Endpoints.EndSession,
OpenIddictConstants.Permissions.Endpoints.PushedAuthorization,
OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode, OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode,
OpenIddictConstants.Permissions.GrantTypes.Implicit, OpenIddictConstants.Permissions.GrantTypes.Implicit,

20
modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20241005085943_Initial.Designer.cs → modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20250215074649_Initial.Designer.cs

@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore;
namespace OpenIddict.Demo.Server.Migrations namespace OpenIddict.Demo.Server.Migrations
{ {
[DbContext(typeof(ServerDbContext))] [DbContext(typeof(ServerDbContext))]
[Migration("20241005085943_Initial")] [Migration("20250215074649_Initial")]
partial class Initial partial class Initial
{ {
/// <inheritdoc /> /// <inheritdoc />
@ -22,7 +22,7 @@ namespace OpenIddict.Demo.Server.Migrations
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder modelBuilder
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer)
.HasAnnotation("ProductVersion", "9.0.0-rc.1.24451.1") .HasAnnotation("ProductVersion", "9.0.0")
.HasAnnotation("Relational:MaxIdentifierLength", 128); .HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
@ -162,6 +162,10 @@ namespace OpenIddict.Demo.Server.Migrations
.HasColumnType("nvarchar(40)") .HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp"); .HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<string>("Description") b.Property<string>("Description")
.HasMaxLength(256) .HasMaxLength(256)
.HasColumnType("nvarchar(256)"); .HasColumnType("nvarchar(256)");
@ -238,6 +242,10 @@ namespace OpenIddict.Demo.Server.Migrations
.HasColumnType("nvarchar(40)") .HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp"); .HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<int>("EntityVersion") b.Property<int>("EntityVersion")
.HasColumnType("int"); .HasColumnType("int");
@ -394,13 +402,6 @@ namespace OpenIddict.Demo.Server.Migrations
.HasMaxLength(64) .HasMaxLength(64)
.HasColumnType("nvarchar(64)"); .HasColumnType("nvarchar(64)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.IsRequired()
.HasMaxLength(40)
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<string>("Device") b.Property<string>("Device")
.IsRequired() .IsRequired()
.HasMaxLength(64) .HasMaxLength(64)
@ -411,7 +412,6 @@ namespace OpenIddict.Demo.Server.Migrations
.HasColumnType("nvarchar(64)"); .HasColumnType("nvarchar(64)");
b.Property<string>("ExtraProperties") b.Property<string>("ExtraProperties")
.IsRequired()
.HasColumnType("nvarchar(max)") .HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties"); .HasColumnName("ExtraProperties");

5
modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20241005085943_Initial.cs → modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20250215074649_Initial.cs

@ -23,6 +23,7 @@ namespace OpenIddict.Demo.Server.Migrations
RegexDescription = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: true), RegexDescription = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: true),
Description = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true), Description = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true),
ValueType = table.Column<int>(type: "int", nullable: false), ValueType = table.Column<int>(type: "int", nullable: false),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: false), ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: false),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: false) ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: false)
}, },
@ -188,6 +189,7 @@ namespace OpenIddict.Demo.Server.Migrations
IsStatic = table.Column<bool>(type: "bit", nullable: false), IsStatic = table.Column<bool>(type: "bit", nullable: false),
IsPublic = table.Column<bool>(type: "bit", nullable: false), IsPublic = table.Column<bool>(type: "bit", nullable: false),
EntityVersion = table.Column<int>(type: "int", nullable: false), EntityVersion = table.Column<int>(type: "int", nullable: false),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: false), ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: false),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: false) ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: false)
}, },
@ -235,8 +237,7 @@ namespace OpenIddict.Demo.Server.Migrations
IpAddresses = table.Column<string>(type: "nvarchar(2048)", maxLength: 2048, nullable: true), IpAddresses = table.Column<string>(type: "nvarchar(2048)", maxLength: 2048, nullable: true),
SignedIn = table.Column<DateTime>(type: "datetime2", nullable: false), SignedIn = table.Column<DateTime>(type: "datetime2", nullable: false),
LastAccessed = table.Column<DateTime>(type: "datetime2", nullable: true), LastAccessed = table.Column<DateTime>(type: "datetime2", nullable: true),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: false), ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: true)
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: false)
}, },
constraints: table => constraints: table =>
{ {

18
modules/openiddict/app/OpenIddict.Demo.Server/Migrations/ServerDbContextModelSnapshot.cs

@ -19,7 +19,7 @@ namespace OpenIddict.Demo.Server.Migrations
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder modelBuilder
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer)
.HasAnnotation("ProductVersion", "9.0.0-rc.1.24451.1") .HasAnnotation("ProductVersion", "9.0.0")
.HasAnnotation("Relational:MaxIdentifierLength", 128); .HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
@ -159,6 +159,10 @@ namespace OpenIddict.Demo.Server.Migrations
.HasColumnType("nvarchar(40)") .HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp"); .HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<string>("Description") b.Property<string>("Description")
.HasMaxLength(256) .HasMaxLength(256)
.HasColumnType("nvarchar(256)"); .HasColumnType("nvarchar(256)");
@ -235,6 +239,10 @@ namespace OpenIddict.Demo.Server.Migrations
.HasColumnType("nvarchar(40)") .HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp"); .HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<int>("EntityVersion") b.Property<int>("EntityVersion")
.HasColumnType("int"); .HasColumnType("int");
@ -391,13 +399,6 @@ namespace OpenIddict.Demo.Server.Migrations
.HasMaxLength(64) .HasMaxLength(64)
.HasColumnType("nvarchar(64)"); .HasColumnType("nvarchar(64)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.IsRequired()
.HasMaxLength(40)
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<string>("Device") b.Property<string>("Device")
.IsRequired() .IsRequired()
.HasMaxLength(64) .HasMaxLength(64)
@ -408,7 +409,6 @@ namespace OpenIddict.Demo.Server.Migrations
.HasColumnType("nvarchar(64)"); .HasColumnType("nvarchar(64)");
b.Property<string>("ExtraProperties") b.Property<string>("ExtraProperties")
.IsRequired()
.HasColumnType("nvarchar(max)") .HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties"); .HasColumnName("ExtraProperties");

1
modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs

@ -65,6 +65,7 @@ public class AbpOpenIddictAspNetCoreModule : AbpModule
.SetDeviceAuthorizationEndpointUris("device") .SetDeviceAuthorizationEndpointUris("device")
.SetIntrospectionEndpointUris("connect/introspect") .SetIntrospectionEndpointUris("connect/introspect")
.SetEndSessionEndpointUris("connect/endsession") .SetEndSessionEndpointUris("connect/endsession")
.SetPushedAuthorizationEndpointUris("connect/par")
.SetRevocationEndpointUris("connect/revocat") .SetRevocationEndpointUris("connect/revocat")
.SetTokenEndpointUris("connect/token") .SetTokenEndpointUris("connect/token")
.SetUserInfoEndpointUris("connect/userinfo") .SetUserInfoEndpointUris("connect/userinfo")

2
modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor

@ -24,7 +24,7 @@
</Column> </Column>
<Column ColumnSize="ColumnSize.IsAuto"> <Column ColumnSize="ColumnSize.IsAuto">
<Field> <Field>
<Check Disabled="_selectAllDisabled" Cursor="Cursor.Pointer" @bind-Checked="@GrantAll" TValue="bool"> <Check Disabled="_selectAllDisabled" Cursor="Cursor.Pointer" CheckedChanged="@GrantAllAsync" Checked="@GrantAll" TValue="bool">
@L["SelectAllInAllTabs"] @L["SelectAllInAllTabs"]
</Check> </Check>
</Field> </Field>

98
modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs

@ -38,43 +38,7 @@ public partial class PermissionManagementModal
protected string _permissionGroupSearchText; protected string _permissionGroupSearchText;
protected bool GrantAll { protected bool GrantAll { get; set; }
get {
if (_notGrantedPermissionCount == 0)
{
return true;
}
return false;
}
set {
if (_groups == null)
{
return;
}
_grantedPermissionCount = 0;
_notGrantedPermissionCount = 0;
Task.Run(()=>OnPermissionGroupSearchTextChangedAsync(null));
foreach (var permission in _allGroups.SelectMany(x => x.Permissions))
{
if (!IsDisabledPermission(permission))
{
permission.IsGranted = value;
if (value)
{
_grantedPermissionCount++;
}
else
{
_notGrantedPermissionCount++;
}
}
}
}
}
protected Dictionary<string, int> _permissionDepths = new Dictionary<string, int>(); protected Dictionary<string, int> _permissionDepths = new Dictionary<string, int>();
@ -98,6 +62,8 @@ public partial class PermissionManagementModal
_groups = _allGroups.ToList(); _groups = _allGroups.ToList();
NormalizePermissionGroup(); NormalizePermissionGroup();
GrantAll = _notGrantedPermissionCount == 0;
await InvokeAsync(_modal.Show); await InvokeAsync(_modal.Show);
} }
@ -106,17 +72,57 @@ public partial class PermissionManagementModal
await HandleErrorAsync(ex); await HandleErrorAsync(ex);
} }
} }
protected virtual async Task GrantAllAsync(bool grantAll)
{
GrantAll = grantAll;
if (_allGroups == null)
{
return;
}
_grantedPermissionCount = 0;
_notGrantedPermissionCount = 0;
await OnPermissionGroupSearchTextChangedAsync(string.Empty);
foreach (var permission in _allGroups.SelectMany(x => x.Permissions))
{
if (IsDisabledPermission(permission))
{
continue;
}
permission.IsGranted = grantAll;
if (grantAll)
{
_grantedPermissionCount++;
}
else
{
_notGrantedPermissionCount++;
}
}
await InvokeAsync(StateHasChanged);
}
protected void NormalizePermissionGroup() protected virtual void NormalizePermissionGroup(bool checkDisabledPermissions = true)
{ {
_selectAllDisabled = _groups.All(IsPermissionGroupDisabled); _selectAllDisabled = _groups.All(IsPermissionGroupDisabled);
_grantedPermissionCount = 0; _grantedPermissionCount = 0;
_notGrantedPermissionCount = 0; _notGrantedPermissionCount = 0;
_disabledPermissions.Clear(); if (checkDisabledPermissions)
{
_disabledPermissions.Clear();
}
foreach (var permission in _groups.SelectMany(x => x.Permissions)) foreach (var permission in _groups.SelectMany(x => x.Permissions))
{ {
if (permission.IsGranted && permission.GrantedProviders.All(x => x.ProviderName != _providerName)) if (checkDisabledPermissions && permission.IsGranted && permission.GrantedProviders.All(x => x.ProviderName != _providerName))
{ {
_disabledPermissions.Add(permission); _disabledPermissions.Add(permission);
continue; continue;
@ -269,19 +275,19 @@ public partial class PermissionManagementModal
permission.IsGranted = value; permission.IsGranted = value;
} }
protected PermissionGrantInfoDto GetParentPermission(PermissionGroupDto permissionGroup, PermissionGrantInfoDto permission) protected virtual PermissionGrantInfoDto GetParentPermission(PermissionGroupDto permissionGroup, PermissionGrantInfoDto permission)
{ {
return permissionGroup.Permissions.First(x => x.Name == permission.ParentName); return permissionGroup.Permissions.First(x => x.Name == permission.ParentName);
} }
protected List<PermissionGrantInfoDto> GetChildPermissions(PermissionGroupDto permissionGroup, PermissionGrantInfoDto permission) protected virtual List<PermissionGrantInfoDto> GetChildPermissions(PermissionGroupDto permissionGroup, PermissionGrantInfoDto permission)
{ {
var childPermissions = new List<PermissionGrantInfoDto>(); var childPermissions = new List<PermissionGrantInfoDto>();
GetChildPermissions(childPermissions, permissionGroup.Permissions, permission); GetChildPermissions(childPermissions, permissionGroup.Permissions, permission);
return childPermissions; return childPermissions;
} }
protected void GetChildPermissions(List<PermissionGrantInfoDto> allChildPermissions, List<PermissionGrantInfoDto> permissions, PermissionGrantInfoDto permission) protected virtual void GetChildPermissions(List<PermissionGrantInfoDto> allChildPermissions, List<PermissionGrantInfoDto> permissions, PermissionGrantInfoDto permission)
{ {
var childPermissions = permissions.Where(x => x.ParentName == permission.Name).ToList(); var childPermissions = permissions.Where(x => x.ParentName == permission.Name).ToList();
if (childPermissions.Count == 0) if (childPermissions.Count == 0)
@ -297,7 +303,7 @@ public partial class PermissionManagementModal
} }
} }
protected bool IsDisabledPermission(PermissionGrantInfoDto permissionGrantInfo) protected virtual bool IsDisabledPermission(PermissionGrantInfoDto permissionGrantInfo)
{ {
return _disabledPermissions.Any(x => x == permissionGrantInfo); return _disabledPermissions.Any(x => x == permissionGrantInfo);
} }
@ -341,9 +347,9 @@ public partial class PermissionManagementModal
} }
_permissionGroupSearchText = value; _permissionGroupSearchText = value;
_groups = _permissionGroupSearchText.IsNullOrWhiteSpace() ? _allGroups : _allGroups.Where(x => x.DisplayName.Contains(_permissionGroupSearchText, StringComparison.OrdinalIgnoreCase) || x.Permissions.Any(permission => permission.DisplayName.Contains(_permissionGroupSearchText, StringComparison.OrdinalIgnoreCase))).ToList(); _groups = _permissionGroupSearchText.IsNullOrWhiteSpace() ? _allGroups.ToList() : _allGroups.Where(x => x.DisplayName.Contains(_permissionGroupSearchText, StringComparison.OrdinalIgnoreCase) || x.Permissions.Any(permission => permission.DisplayName.Contains(_permissionGroupSearchText, StringComparison.OrdinalIgnoreCase))).ToList();
NormalizePermissionGroup(); NormalizePermissionGroup(false);
await InvokeAsync(StateHasChanged); await InvokeAsync(StateHasChanged);
} }

2
npm/ng-packs/package.json

@ -112,7 +112,7 @@
"lerna": "^4.0.0", "lerna": "^4.0.0",
"lint-staged": "^13.0.0", "lint-staged": "^13.0.0",
"ng-packagr": "~19.1.0", "ng-packagr": "~19.1.0",
"ng-zorro-antd": "^19.0.0-beta.0", "ng-zorro-antd": "~19.0.0",
"nx": "~20.3.0", "nx": "~20.3.0",
"postcss": "^8.0.0", "postcss": "^8.0.0",
"postcss-import": "14.1.0", "postcss-import": "14.1.0",

2
npm/ng-packs/packages/components/package.json

@ -12,7 +12,7 @@
}, },
"dependencies": { "dependencies": {
"chart.js": "^3.5.1", "chart.js": "^3.5.1",
"ng-zorro-antd": "^19.0.0-beta.0", "ng-zorro-antd": "~19.0.0",
"@ctrl/tinycolor": "^4.0.0", "@ctrl/tinycolor": "^4.0.0",
"tslib": "^2.0.0" "tslib": "^2.0.0"
}, },

14
npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html

@ -9,18 +9,18 @@
[nzExpandedKeys]="expandedKeys" [nzExpandedKeys]="expandedKeys"
[nzExpandedIcon]="expandedIconTemplate?.template || defaultIconTemplate" [nzExpandedIcon]="expandedIconTemplate?.template || defaultIconTemplate"
(nzExpandChange)="onExpandedKeysChange($event)" (nzExpandChange)="onExpandedKeysChange($event)"
(nzCheckBoxChange)="onCheckboxChange($event)" (nzCheckboxChange)="onCheckboxChange($event)"
(nzOnDrop)="onDrop($event)" (nzOnDrop)="onDrop($event)"
[nzNoAnimation]="noAnimation" [nzNoAnimation]="noAnimation"
(nzContextMenu)="dropdowns[$event.node?.key]?.toggle()" (nzContextMenu)="dropdowns[$event.node?.key]?.toggle()"
></nz-tree> />
<ng-template #treeTemplate let-node> <ng-template #treeTemplate let-node>
<div <div
[class.selected]="isNodeSelected(node)" [class.selected]="isNodeSelected(node)"
[title]="node.title" [title]="node.title"
(click)="onSelectedNodeChange(node)" (click)="onSelectedNodeChange(node)"
> >
<ng-container *ngTemplateOutlet="nodeTemplate; context: { $implicit: node }"></ng-container> <ng-container *ngTemplateOutlet="nodeTemplate; context: { $implicit: node }" />
<ng-template #nodeTemplate let-node> <ng-template #nodeTemplate let-node>
<div class="d-inline-flex align-items-center abp-ellipsis-inline"> <div class="d-inline-flex align-items-center abp-ellipsis-inline">
@ -29,7 +29,7 @@
customNodeTemplate ? customNodeTemplate?.template : defaultNodeTemplate; customNodeTemplate ? customNodeTemplate?.template : defaultNodeTemplate;
context: { $implicit: node } context: { $implicit: node }
" "
></ng-container> />
</div> </div>
@if (menu) { @if (menu) {
@ -48,7 +48,7 @@
aria-hidden="true" aria-hidden="true"
></i> ></i>
<div ngbDropdownMenu> <div ngbDropdownMenu>
<ng-template *ngTemplateOutlet="menu; context: { $implicit: node }"></ng-template> <ng-template *ngTemplateOutlet="menu; context: { $implicit: node }" />
</div> </div>
</div> </div>
} }
@ -62,8 +62,8 @@
<ng-template #defaultIconTemplate let-node let-origin="origin"> <ng-template #defaultIconTemplate let-node let-origin="origin">
<i aria-hidden="true"> <i aria-hidden="true">
<ng-container *ngTemplateOutlet="node.isExpanded ? minusIcon : plusIcon"></ng-container <ng-container *ngTemplateOutlet="node.isExpanded ? minusIcon : plusIcon"
></i> /></i>
</ng-template> </ng-template>
<ng-template #minusIcon> <ng-template #minusIcon>

27
npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts

@ -4,21 +4,20 @@ import {
Component, Component,
ContentChild, ContentChild,
EventEmitter, EventEmitter,
Inject, inject,
Input, Input,
OnInit, OnInit,
Optional,
Output, Output,
TemplateRef, TemplateRef,
ViewEncapsulation, ViewEncapsulation,
} from '@angular/core'; } from '@angular/core';
import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap';
import { NzFormatBeforeDropEvent, NzFormatEmitEvent, NzTreeNode } from 'ng-zorro-antd/tree'; import { NzFormatBeforeDropEvent, NzFormatEmitEvent, NzTreeNode } from 'ng-zorro-antd/tree';
import { LazyLoadService, LOADING_STRATEGY, SubscriptionService } from '@abp/ng.core';
import { of } from 'rxjs'; import { of } from 'rxjs';
import { DISABLE_TREE_STYLE_LOADING_TOKEN } from '../disable-tree-style-loading.token';
import { TreeNodeTemplateDirective } from '../templates/tree-node-template.directive'; import { TreeNodeTemplateDirective } from '../templates/tree-node-template.directive';
import { ExpandedIconTemplateDirective } from '../templates/expanded-icon-template.directive'; import { ExpandedIconTemplateDirective } from '../templates/expanded-icon-template.directive';
import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap';
import { LazyLoadService, LOADING_STRATEGY, SubscriptionService } from '@abp/ng.core';
import { DISABLE_TREE_STYLE_LOADING_TOKEN } from '../disable-tree-style-loading.token';
export type DropEvent = NzFormatEmitEvent & { pos: number }; export type DropEvent = NzFormatEmitEvent & { pos: number };
@ -32,19 +31,15 @@ export type DropEvent = NzFormatEmitEvent & { pos: number };
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
}) })
export class TreeComponent implements OnInit { export class TreeComponent implements OnInit {
private lazyLoadService = inject(LazyLoadService);
private subscriptionService = inject(SubscriptionService);
private cdr = inject(ChangeDetectorRef);
private disableTreeStyleLoading = inject(DISABLE_TREE_STYLE_LOADING_TOKEN, { optional: true });
dropPosition: number; dropPosition: number;
dropdowns = {} as { [key: string]: NgbDropdown }; dropdowns = {} as { [key: string]: NgbDropdown };
constructor(
private lazyLoadService: LazyLoadService,
private subscriptionService: SubscriptionService,
@Optional()
@Inject(DISABLE_TREE_STYLE_LOADING_TOKEN)
private disableTreeStyleLoading: boolean | undefined,
private cdr: ChangeDetectorRef,
) {}
@ContentChild('menu') menu: TemplateRef<any>; @ContentChild('menu') menu: TemplateRef<any>;
@ContentChild(TreeNodeTemplateDirective) customNodeTemplate: TreeNodeTemplateDirective; @ContentChild(TreeNodeTemplateDirective) customNodeTemplate: TreeNodeTemplateDirective;
@ContentChild(ExpandedIconTemplateDirective) expandedIconTemplate: ExpandedIconTemplateDirective; @ContentChild(ExpandedIconTemplateDirective) expandedIconTemplate: ExpandedIconTemplateDirective;
@ -88,7 +83,7 @@ export class TreeComponent implements OnInit {
return node; return node;
} }
if (node.children) { if (node.children) {
let res = this.findNode(target, node.children); const res = this.findNode(target, node.children);
if (res) { if (res) {
return res; return res;
} }
@ -138,7 +133,7 @@ export class TreeComponent implements OnInit {
} }
setSelectedNode(node: any) { setSelectedNode(node: any) {
let newSelectedNode = this.findNode(node, this.nodes); const newSelectedNode = this.findNode(node, this.nodes);
this.selectedNode = { ...newSelectedNode }; this.selectedNode = { ...newSelectedNode };
this.cdr.markForCheck(); this.cdr.markForCheck();
} }

4
npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.html

@ -40,7 +40,9 @@
</div> </div>
</div> </div>
<fieldset class="border rounded-4 p-3"> <fieldset class="border rounded-4 p-3">
<legend class="px-1 h5 mb-0">{{ 'AbpPermissionManagement::PermissionGroup' | abpLocalization }}</legend> <legend class="px-1 h5 mb-0">
{{ 'AbpPermissionManagement::PermissionGroup' | abpLocalization }}
</legend>
<div class="row"> <div class="row">
<div class="col-md-4"> <div class="col-md-4">
<div class="overflow-auto lpx-scroll-pills-container scroll-in-modal"> <div class="overflow-auto lpx-scroll-pills-container scroll-in-modal">

8
npm/ng-packs/packages/permission-management/src/lib/components/permission-management.component.ts

@ -164,6 +164,7 @@ export class PermissionManagementComponent
let groups = this.permissionGroupSignal(); let groups = this.permissionGroupSignal();
if (!search) { if (!search) {
this.setSelectedGroup(groups[0]);
return groups; return groups;
} }
@ -176,9 +177,7 @@ export class PermissionManagementComponent
if (groups.length) { if (groups.length) {
this.setSelectedGroup(groups[0]); this.setSelectedGroup(groups[0]);
this.disabledSelectAllInAllTabs = false;
} else { } else {
this.disabledSelectAllInAllTabs = true;
this.selectedGroupPermissions = []; this.selectedGroupPermissions = [];
} }
@ -323,6 +322,9 @@ export class PermissionManagementComponent
); );
const selectedPermissions = selectablePermissions.filter(per => per.isGranted); const selectedPermissions = selectablePermissions.filter(per => per.isGranted);
const element = document.querySelector('#select-all-in-this-tabs') as any; const element = document.querySelector('#select-all-in-this-tabs') as any;
if (!element) {
return;
}
if (selectedPermissions.length === selectablePermissions.length) { if (selectedPermissions.length === selectablePermissions.length) {
element.indeterminate = false; element.indeterminate = false;
@ -373,7 +375,7 @@ export class PermissionManagementComponent
onClickSelectAll() { onClickSelectAll() {
if (this.filter()) { if (this.filter()) {
this.filter.set(''); this.filter.set('');
} }
this.permissions = this.permissions.map(permission => ({ this.permissions = this.permissions.map(permission => ({
...permission, ...permission,

Loading…
Cancel
Save