Browse Source

Refactor and add advanced theme settings

pull/44/head
liangshiwei 3 weeks ago
parent
commit
2ddb7d0afc
  1. 44
      Directory.Packages.props
  2. 156
      README.BlazorServer.md
  3. 164
      README.BlazorWebAssembly.md
  4. 215
      README.WebApp.md
  5. 56
      README.md
  6. BIN
      img/theme-home.png
  7. BIN
      img/theme-settings-panel.png
  8. 242
      lsw.Abp.AntDesignUI.sln
  9. 1
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorAntDesignThemeScriptContributor.cs
  10. 2
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Themes/AntDesignTheme/LanguageSwitch.razor
  11. 4
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/AbpAspNetCoreComponentsWebAntDesignThemeModule.cs
  12. 8
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/AbpPageHeader.razor
  13. 1
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.csproj
  14. 102
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Settings/AntDesignSettingsProvider.cs
  15. 13
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Settings/IAntDesignSettingsProvider.cs
  16. 154
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/DefaultLayout.razor
  17. 180
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/DefaultLayout.razor.cs
  18. 12
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/MainMenu.razor
  19. 70
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/MainMenu.razor.cs
  20. 10
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/MainMenuItem.razor
  21. 15
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/MainMenuItem.razor.cs
  22. 3
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/NavToolbar.razor
  23. 25
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/NavToolbar.razor.cs
  24. 147
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/ThemeSettingPanel.razor
  25. 281
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/ThemeSettingPanel.razor.cs
  26. 1039
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/wwwroot/libs/abp/css/theme.css
  27. 200
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/wwwroot/libs/abp/js/theme-settings.js
  28. 3
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.Bundling/BlazorWebAssemblyAntDesignThemeScriptContributor.cs
  29. 1
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/ComponentsComponentsBundleContributor.cs
  30. 2
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/LanguageSwitch.razor
  31. 31
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/AbpAntDesignThemeManagementApplicationContractsModule.cs
  32. 22
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Dtos/AntDesignThemePreferenceDto.cs
  33. 16
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Dtos/UpdateAntDesignThemePreferenceDto.cs
  34. 10
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Dtos/UpdateAntDesignThemeSettingsAvailabilityDto.cs
  35. 3
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/FodyWeavers.xml
  36. 16
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/IAntDesignThemePreferenceAppService.cs
  37. 8
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Localization/AntDesignThemeManagementResource.cs
  38. 48
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Localization/Resources/AntDesignThemeManagement/en.json
  39. 48
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Localization/Resources/AntDesignThemeManagement/zh-Hans.json
  40. 22
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Lsw.Abp.AntDesignThemeManagement.Application.Contracts.csproj
  41. 26
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Permissions/AntDesignThemeManagementPermissionDefinitionProvider.cs
  42. 8
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Permissions/AntDesignThemeManagementPermissions.cs
  43. 115
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Settings/AntDesignThemeManagementSettingDefinitionProvider.cs
  44. 24
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Settings/AntDesignThemeManagementSettingNames.cs
  45. 42
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Settings/AntDesignThemeSettingDefaults.cs
  46. 12
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application/AbpAntDesignThemeManagementApplicationModule.cs
  47. 284
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application/AntDesignThemePreferenceAppService.cs
  48. 3
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application/FodyWeavers.xml
  49. 18
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application/Lsw.Abp.AntDesignThemeManagement.Application.csproj
  50. 14
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor.Server/AbpAntDesignThemeManagementBlazorServerModule.cs
  51. 3
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor.Server/FodyWeavers.xml
  52. 16
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor.Server/Lsw.Abp.AntDesignThemeManagement.Blazor.Server.csproj
  53. 22
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly/AbpAntDesignThemeManagementBlazorWebAssemblyModule.cs
  54. 3
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly/FodyWeavers.xml
  55. 19
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly/Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly.csproj
  56. 23
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor/AbpAntDesignThemeManagementBlazorModule.cs
  57. 3
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor/FodyWeavers.xml
  58. 16
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor/Lsw.Abp.AntDesignThemeManagement.Blazor.csproj
  59. 36
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor/Pages/SettingManagement/ThemeSettingsManagementGroup/ThemeSettingsManagementGroupViewComponent.razor
  60. 120
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor/Pages/SettingManagement/ThemeSettingsManagementGroup/ThemeSettingsManagementGroupViewComponent.razor.cs
  61. 36
      modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor/Settings/AntDesignThemeManagementSettingContributor.cs
  62. 2
      modules/FeatureManagement/Lsw.Abp.FeatureManagement.Blazor.AntDesignUI/Components/FeatureManagementModal.razor
  63. 6
      modules/PermissionManagement/Lsw.Abp.PermissionManagement.Blazor.AntDesignUI/Components/PermissionManagementModal.razor
  64. 2
      modules/SettingManagement/Lsw.Abp.SettingManagement.Blazor.AntDesignUI/Pages/SettingManagement/AntDesignThemeGroup/AntDesignThemeGroupViewComponent.razor.cs
  65. 32
      modules/SettingManagement/Lsw.Abp.SettingManagement.Blazor.AntDesignUI/Pages/SettingManagement/SettingManagement.razor
  66. 32
      modules/SettingManagement/Lsw.Abp.SettingManagement.Blazor.AntDesignUI/Pages/SettingManagement/SettingManagement.razor.cs
  67. 8
      modules/SettingManagement/Lsw.Abp.SettingManagement.Blazor.AntDesignUI/Settings/AntDesignSettingDefultPageContributor.cs
  68. 70
      samples/WebApp/README.md
  69. 1
      samples/WebApp/src/BookStore.Blazor.Client/BookStore.Blazor.Client.csproj
  70. 2
      samples/WebApp/src/BookStore.Blazor.Client/BookStoreBlazorClientModule.cs
  71. 1
      samples/WebApp/src/BookStore.Blazor/BookStore.Blazor.csproj
  72. 6
      samples/WebApp/src/BookStore.Blazor/BookStoreBlazorModule.cs
  73. 3743
      samples/WebApp/src/BookStore.Blazor/package-lock.json
  74. 4
      samples/WebApp/src/BookStore.Blazor/package.json
  75. 612
      samples/WebApp/src/BookStore.Blazor/yarn.lock
  76. 21
      samples/WebApp/src/BookStore.MongoDB/MongoDb/MongoDbBookStoreDbSchemaMigrator.cs
  77. 72
      samples/WebAppBlazorServer/README.md
  78. 3
      samples/WebAppBlazorServer/src/BookStore.Blazor/BookStore.Blazor.abppkg
  79. 1
      samples/WebAppBlazorServer/src/BookStore.Blazor/BookStore.Blazor.csproj
  80. 6
      samples/WebAppBlazorServer/src/BookStore.Blazor/BookStoreBlazorModule.cs
  81. 3743
      samples/WebAppBlazorServer/src/BookStore.Blazor/package-lock.json
  82. 4
      samples/WebAppBlazorServer/src/BookStore.Blazor/package.json
  83. 612
      samples/WebAppBlazorServer/src/BookStore.Blazor/yarn.lock
  84. 21
      samples/WebAppBlazorServer/src/BookStore.MongoDB/MongoDb/MongoDbBookStoreDbSchemaMigrator.cs
  85. 75
      samples/WebAppBlazorWebAssembly/README.md
  86. 1
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/BookStore.Blazor.Client.csproj
  87. 2
      samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/BookStoreBlazorClientModule.cs
  88. 2
      samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/appsettings.json
  89. 5
      samples/WebAppBlazorWebAssembly/src/BookStore.HttpApi.Host/BookStore.HttpApi.Host.abppkg
  90. 1
      samples/WebAppBlazorWebAssembly/src/BookStore.HttpApi.Host/BookStore.HttpApi.Host.csproj
  91. 5
      samples/WebAppBlazorWebAssembly/src/BookStore.HttpApi.Host/BookStoreHttpApiHostModule.cs
  92. 2
      samples/WebAppBlazorWebAssembly/src/BookStore.HttpApi.Host/appsettings.json
  93. 2
      samples/WebAppBlazorWebAssembly/src/BookStore.HttpApi.Host/package.json
  94. 335
      samples/WebAppBlazorWebAssembly/src/BookStore.HttpApi.Host/yarn.lock
  95. 21
      samples/WebAppBlazorWebAssembly/src/BookStore.MongoDB/MongoDb/MongoDbBookStoreDbSchemaMigrator.cs
  96. 2
      src/Lsw.Abp.AntDesignUI/AbpCrudPageBase.cs

44
Directory.Packages.props

@ -1,12 +1,12 @@
<Project>
<PropertyGroup>
<VoloAbpPackageVersion>10.0.0</VoloAbpPackageVersion>
<VoloAbpLeptonxPackageVersion>5.0.0</VoloAbpLeptonxPackageVersion>
<VoloAbpStudioPackageVersion>2.1.4</VoloAbpStudioPackageVersion>
<AntPackageVersion>1.5.1</AntPackageVersion>
<MicrosoftExtensionsPackageVersion>10.0.0</MicrosoftExtensionsPackageVersion>
<MicrosoftAspNetCorePackageVersion>10.0.0</MicrosoftAspNetCorePackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>10.0.0</MicrosoftEntityFrameworkCorePackageVersion>
<VoloAbpPackageVersion>10.3.0</VoloAbpPackageVersion>
<VoloAbpLeptonxPackageVersion>5.3.0</VoloAbpLeptonxPackageVersion>
<VoloAbpStudioPackageVersion>2.2.7</VoloAbpStudioPackageVersion>
<AntPackageVersion>1.6.1</AntPackageVersion>
<MicrosoftExtensionsPackageVersion>10.0.7</MicrosoftExtensionsPackageVersion>
<MicrosoftAspNetCorePackageVersion>10.0.7</MicrosoftAspNetCorePackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>10.0.7</MicrosoftEntityFrameworkCorePackageVersion>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<!-- Abp Framework -->
@ -134,30 +134,30 @@
<PackageVersion Include="Microsoft.Extensions.Http.Polly" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Embedded" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="10.0.203" />
</ItemGroup>
<!-- Serilog -->
<ItemGroup>
<PackageVersion Include="Serilog.AspNetCore" Version="8.0.2" />
<PackageVersion Include="Serilog.Extensions.Logging" Version="8.0.0" />
<PackageVersion Include="Serilog.Sinks.Async" Version="2.0.0" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageVersion Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageVersion Include="Serilog.AspNetCore" Version="10.0.0" />
<PackageVersion Include="Serilog.Extensions.Logging" Version="10.0.0" />
<PackageVersion Include="Serilog.Sinks.Async" Version="2.1.0" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.1.1" />
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
</ItemGroup>
<!-- Test -->
<ItemGroup>
<PackageVersion Include="NSubstitute.Analyzers.CSharp" Version="1.0.17" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageVersion Include="NSubstitute" Version="5.1.0" />
<PackageVersion Include="Shouldly" Version="4.2.1" />
<PackageVersion Include="xunit" Version="2.9.2" />
<PackageVersion Include="xunit.extensibility.execution" Version="2.9.2" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.1" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.5.1" />
<PackageVersion Include="NSubstitute" Version="5.3.0" />
<PackageVersion Include="Shouldly" Version="4.3.0" />
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="xunit.extensibility.execution" Version="2.9.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
</ItemGroup>
<!-- Fody -->
<ItemGroup>
<PackageVersion Include="ConfigureAwait.Fody" Version="3.3.2" />
<PackageVersion Include="Fody" Version="6.8.2" />
<PackageVersion Include="ConfigureAwait.Fody" Version="3.4.0" />
<PackageVersion Include="Fody" Version="6.9.3" />
</ItemGroup>
<!-- Other -->
<ItemGroup>
@ -165,7 +165,7 @@
<PackageVersion Include="MongoSandbox8.runtime.linux-x64" Version="2.0.0" />
<PackageVersion Include="MongoSandbox8.runtime.osx-arm64" Version="2.0.0" />
<PackageVersion Include="MongoSandbox8.runtime.win-x64" Version="2.0.0" />
<PackageVersion Include="Microsoft.Data.SqlClient" Version="5.2.2" />
<PackageVersion Include="Microsoft.Data.SqlClient" Version="7.0.1" />
</ItemGroup>
<ItemGroup>
<!-- AntDesign -->

156
README.BlazorServer.md

@ -1,70 +1,106 @@
The first step is to use ABP CLI to create a new project.
## ABP Blazor Server - AntDesign Theme
`abp new BookStore -u blazor-server -t app`
Use this guide for an ABP `blazor-server` application. The matching working sample is `samples/WebAppBlazorServer`.
> See the [ABP official documentation](https://docs.abp.io) to learn [ABP framework](https://github.com/abpframework/abp).
![Advanced theme settings panel](img/theme-settings-panel.png)
**Replace LeptonXLiteTheme with AntBlazorTheme packages**
* Replace `Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme` with `Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme`
* Replace `Volo.Abp.Identity.Blazor.Server` with `Lsw.Abp.IdentityManagement.Blazor.Server.AntDesignUI`
* Replace `Volo.Abp.SettingManagement.Blazor.Server` with `Lsw.Abp.SettingManagement.Blazor.Server.AntDesignUI`
* Replace `Volo.Abp.TenantManagement.Blazor.Server` with `Lsw.Abp.TenantManagement.Blazor.Server.AntDesignUI`
* Replace `Volo.Abp.FeatureManagement.Blazor.Server` with `Lsw.Abp.FeatureManagement.Blazor.Server.AntDesignUI`
## 1. Create The App
```bash
abp new BookStore -u blazor-server -t app
```
**Open `_Imports.razor` and add with the following:**
The paths below use the generated `BookStore` solution layout.
```csharp
@using AntDesign
@using Lsw.Abp.AntDesignUI
@using Lsw.Abp.AntDesignUI.Components
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Layout
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Bundling
```
## 2. Add References
Add these references to `src/BookStore.Blazor/BookStore.Blazor.csproj`:
**Open `BookStoreBlazorModule` make the following changes:**
- `Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme`
- `Lsw.Abp.IdentityManagement.Blazor.Server.AntDesignUI`
- `Lsw.Abp.TenantManagement.Blazor.Server.AntDesignUI`
- `Lsw.Abp.SettingManagement.Blazor.Server.AntDesignUI`
- `Lsw.Abp.FeatureManagement.Blazor.Server.AntDesignUI`
- `Lsw.Abp.AntDesignThemeManagement.Blazor.Server`
* Remove the `ConfigureBlazorise` method
* Fix wrong using namespace
* Update module dependencies
* For example, replace `AbpIdentityBlazorServerModule` with `AbpIdentityBlazorServerAntDesignModule`
Use `ProjectReference` inside this repository, or the same package names when consuming NuGet packages.
**Open `BookStoreMenuContributor` to update icon:**
Remove the old Blazorise-based Blazor packages from `BookStore.Blazor.csproj` if they exist:
* `"fas fa-home"` to `IconType.Outline.Home`
* `"fa fa-cog"` to `IconType.Outline.Setting`
- `Blazorise.Bootstrap5`
- `Blazorise.Icons.FontAwesome`
- `Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme`
- `Volo.Abp.Identity.Blazor.Server`
- `Volo.Abp.TenantManagement.Blazor.Server`
- `Volo.Abp.SettingManagement.Blazor.Server`
- `Volo.Abp.FeatureManagement.Blazor.Server`
**Remove all Blazorise packages.**
Do not remove `Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite` unless you also replace the MVC/account-page theme.
**Replace `BlazorLeptonXLiteThemeBundles` with `BlazorAntDesignThemeBundles`**
## 3. Update `BookStoreBlazorModule`
**Open `Index.razor` and replace with the following:**
Open `src/BookStore.Blazor/BookStoreBlazorModule.cs`.
In the existing `[DependsOn]`, replace the generated Blazor UI module entries with these AntDesign entries:
```csharp
typeof(AbpIdentityBlazorServerAntDesignModule),
typeof(AbpTenantManagementBlazorServerAntDesignModule),
typeof(AbpAspNetCoreComponentsServerAntDesignThemeModule),
typeof(AbpFeatureManagementBlazorServerAntDesignModule),
typeof(AbpAntDesignThemeManagementBlazorServerModule),
typeof(AbpSettingManagementBlazorServerAntDesignModule)
```
Configure the AntDesign bundle, router, and theme management API:
```csharp
@page "/"
@inherits BookStoreComponentBase
private void ConfigureBundles()
{
Configure<AbpBundlingOptions>(options =>
{
options.StyleBundles.Configure(
BlazorAntDesignThemeBundles.Styles.Global,
bundle => { bundle.AddFiles("/global-styles.css"); }
);
});
}
private void ConfigureRouter(ServiceConfigurationContext context)
{
Configure<AbpRouterOptions>(options =>
{
options.AppAssembly = typeof(BookStoreBlazorModule).Assembly;
});
}
private void ConfigureAutoApiControllers()
{
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly);
options.ConventionalControllers.Create(typeof(AbpAntDesignThemeManagementApplicationModule).Assembly);
});
}
```
<AbpPageHeader Title="Index"></AbpPageHeader>
Call these methods from `ConfigureServices`. Remove the old Blazorise provider setup if it exists.
<div class="page-content">
<div style="text-align: center">
<Alert Type="@AlertType.Success"
Message="Success"
Description=" Congratulations, BookStore is successfully running!"
ShowIcon="true"/>
## 4. Update Razor Files
<Divider/>
Add these imports to `src/BookStore.Blazor/_Imports.razor`:
</div>
</div>
```razor
@using AntDesign
@using Lsw.Abp.AntDesignUI
@using Lsw.Abp.AntDesignUI.Components
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Layout
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Bundling
```
**Open `Routes.razor` and replace with the following:**
Use the AntDesign layout in `src/BookStore.Blazor/Components/Routes.razor`:
```csharp
```razor
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Routing
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Themes.AntDesignTheme
@using Microsoft.Extensions.Options
@ -81,8 +117,34 @@ The first step is to use ABP CLI to create a new project.
</Router>
```
Run the `dotnet build` & `abp bundle` command in the `BookStore.Blazor` folder.
Use the AntDesign bundles in `src/BookStore.Blazor/Components/App.razor`:
```razor
@using Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.Bundling
<AbpStyles BundleName="@BlazorAntDesignThemeBundles.Styles.Global" />
<Routes @rendermode="InteractiveServer" />
<AbpScripts BundleName="@BlazorAntDesignThemeBundles.Scripts.Global" />
```
## 5. Build And Run
From the solution root:
```bash
dotnet build
```
To run this repository sample:
```bash
cd samples/WebAppBlazorServer
dotnet run --project .\src\BookStore.DbMigrator\
dotnet run --project .\src\BookStore.Blazor\
```
That's all, enjoy your code :).
Open `https://localhost:44322`.
![3](img/3.png)
Log in with `admin` / `1q2w3E*`, then verify that the AntDesign layout and right-side theme settings panel are visible.

164
README.BlazorWebAssembly.md

@ -1,70 +1,131 @@
The first step is to use ABP CLI to create a new project.
## ABP Blazor WebAssembly - AntDesign Theme
`abp new BookStore -u blazor -t app`
Use this guide for an ABP `blazor` WebAssembly application. The matching working sample is `samples/WebAppBlazorWebAssembly`.
> See the [ABP official documentation](https://docs.abp.io) to learn [ABP framework](https://github.com/abpframework/abp).
![Advanced theme settings panel](img/theme-settings-panel.png)
**Replace LeptonXLiteTheme with AntBlazorTheme packages**
## 1. Create The App
* Replace `Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme` with `Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme`
* Replace `Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme.Bundling` with `Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.Bundling`
* Replace `Volo.Abp.Identity.Blazor.WebAssembly` with `Lsw.Abp.IdentityManagement.Blazor.WebAssembly.AntDesignUI`
* Replace `Volo.Abp.SettingManagement.Blazor.WebAssembly` with `Lsw.Abp.SettingManagement.Blazor.WebAssembly.AntDesignUI`
* Replace `Volo.Abp.TenantManagement.Blazor.WebAssembly` with `Lsw.Abp.TenantManagement.Blazor.WebAssembly.AntDesignUI`
* Replace `Volo.Abp.FeatureManagement.Blazor.WebAssembly` with `Lsw.Abp.FeatureManagement.Blazor.WebAssembly.AntDesignUI`
```bash
abp new BookStore -u blazor -t app
```
The paths below use the generated `BookStore` solution layout.
## 2. Add References
Add these references to `src/BookStore.Blazor.Client/BookStore.Blazor.Client.csproj`:
- `Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme`
- `Lsw.Abp.IdentityManagement.Blazor.WebAssembly.AntDesignUI`
- `Lsw.Abp.TenantManagement.Blazor.WebAssembly.AntDesignUI`
- `Lsw.Abp.SettingManagement.Blazor.WebAssembly.AntDesignUI`
- `Lsw.Abp.FeatureManagement.Blazor.WebAssembly.AntDesignUI`
- `Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly`
Add this reference to `src/BookStore.HttpApi.Host/BookStore.HttpApi.Host.csproj`:
- `Lsw.Abp.AntDesignThemeManagement.Application`
Add this reference to `src/BookStore.Blazor/BookStore.Blazor.csproj`:
- `Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.Bundling`
Use `ProjectReference` inside this repository, or the same package names when consuming NuGet packages.
Remove the old Blazorise-based Blazor packages from the same projects if they exist:
- `Blazorise.Bootstrap5`
- `Blazorise.Icons.FontAwesome`
- `Blazorise.Components`
- `Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme`
- `Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme.Bundling`
- `Volo.Abp.Identity.Blazor.WebAssembly`
- `Volo.Abp.TenantManagement.Blazor.WebAssembly`
- `Volo.Abp.SettingManagement.Blazor.WebAssembly`
- `Volo.Abp.FeatureManagement.Blazor.WebAssembly`
Do not remove `Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite` from the HTTP API host unless you also replace the MVC/account-page theme.
## 3. Update The WebAssembly Client
Open `src/BookStore.Blazor.Client/BookStoreBlazorClientModule.cs`.
In the existing `[DependsOn]`, use these AntDesign entries:
```csharp
typeof(AbpIdentityBlazorWebAssemblyAntDesignModule),
typeof(AbpSettingManagementBlazorWebAssemblyAntDesignModule),
typeof(AbpFeatureManagementBlazorWebAssemblyAntDesignModule),
typeof(AbpTenantManagementBlazorWebAssemblyAntDesignModule),
typeof(AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule),
typeof(AbpAntDesignThemeManagementBlazorWebAssemblyModule)
```
**Open `_Imports.razor` and add with the following:**
Configure the client router:
```csharp
@using AntDesign
@using Lsw.Abp.AntDesignUI
@using Lsw.Abp.AntDesignUI.Components
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Layout
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Bundling
private void ConfigureRouter(ServiceConfigurationContext context)
{
Configure<AbpRouterOptions>(options =>
{
options.AppAssembly = typeof(BookStoreBlazorClientModule).Assembly;
});
}
```
**Open `BookStoreBlazorClientModule` make the following changes:**
Remove the old Blazorise provider setup if it exists.
* Remove the `ConfigureBlazorise` method
* Fix wrong using namespace
* Update module dependencies
* For example, replace `AbpIdentityBlazorWebAssemblyModule` with `AbpIdentityBlazorWebAssemblyAntDesignModule`
## 4. Update The HTTP API Host
**Open `BookStoreMenuContributor` to update icon:**
Open `src/BookStore.HttpApi.Host/BookStoreHttpApiHostModule.cs`.
* `"fas fa-home"` to `IconType.Outline.Home`
* `"fa fa-cog"` to `IconType.Outline.Setting`
Add the theme management application module to `[DependsOn]`:
**Open `Index.razor` and replace with the following:**
```csharp
typeof(AbpAntDesignThemeManagementApplicationModule)
```
Expose the theme management application service:
```csharp
@page "/"
@inherits BookStoreComponentBase
private void ConfigureConventionalControllers()
{
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly);
options.ConventionalControllers.Create(typeof(AbpAntDesignThemeManagementApplicationModule).Assembly);
});
}
```
<AbpPageHeader Title="Index"></AbpPageHeader>
## 5. Update The Blazor Host
<div class="page-content">
<div style="text-align: center">
<Alert Type="@AlertType.Success"
Message="Success"
Description=" Congratulations, BookStore is successfully running!"
ShowIcon="true"/>
Open `src/BookStore.Blazor/BookStoreBlazorModule.cs`.
<Divider/>
Add the WebAssembly AntDesign bundling module to `[DependsOn]`:
</div>
</div>
```csharp
typeof(AbpAspNetCoreComponentsWebAssemblyAntDesignThemeBundlingModule)
```
**Open `Routes.razor` and replace with the following:**
## 6. Update Razor Files
```csharp
Add these imports to `src/BookStore.Blazor.Client/_Imports.razor`:
```razor
@using AntDesign
@using Lsw.Abp.AntDesignUI
@using Lsw.Abp.AntDesignUI.Components
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Layout
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Bundling
```
Use the AntDesign layout in `src/BookStore.Blazor.Client/Routes.razor`:
```razor
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Routing
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Themes.AntDesignTheme
@using Microsoft.Extensions.Options
@using Volo.Abp.AspNetCore.Components.WebAssembly.WebApp
<Router AppAssembly="typeof(Program).Assembly" AdditionalAssemblies="WebAppAdditionalAssembliesHelper.GetAssemblies<BookStoreBlazorClientModule>()">
@ -78,8 +139,23 @@ The first step is to use ABP CLI to create a new project.
</Router>
```
Run the `dotnet build` & `abp bundle` command in the `BookStore.Blazor` folder.
## 7. Build And Run
From the solution root:
```bash
dotnet build
```
To run this repository sample, start all three projects:
```bash
cd samples/WebAppBlazorWebAssembly
dotnet run --project .\src\BookStore.DbMigrator\
dotnet run --project .\src\BookStore.HttpApi.Host\
dotnet run --project .\src\BookStore.Blazor\
```
That's all, enjoy your code :).
Open `https://localhost:44376`.
![3](img/3.png)
Log in with `admin` / `1q2w3E*`, then verify that the AntDesign layout and right-side theme settings panel are visible.

215
README.WebApp.md

@ -1,69 +1,162 @@
## ABP Blazor WebApp - AntDesign Theme
The first step is to use ABP CLI to create a new project.
Use this guide for an ABP `blazor-webapp` application. The matching working sample is `samples/WebApp`.
`abp new BookStore -u blazor-webapp -t app`
![Advanced theme settings panel](img/theme-settings-panel.png)
> See the [ABP official documentation](https://docs.abp.io) to learn [ABP framework](https://github.com/abpframework/abp).
## 1. Create The App
**Replace LeptonXLiteTheme with AntBlazorTheme packages**
```bash
abp new BookStore -u blazor-webapp -t app
```
The paths below use the generated `BookStore` solution layout.
## 2. Add References
Add these references to `src/BookStore.Blazor/BookStore.Blazor.csproj`:
- `Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme`
- `Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.Bundling`
- `Lsw.Abp.IdentityManagement.Blazor.Server.AntDesignUI`
- `Lsw.Abp.TenantManagement.Blazor.Server.AntDesignUI`
- `Lsw.Abp.AntDesignThemeManagement.Blazor.Server`
* Replace `Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme` with `Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme`
* Replace `Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme.Bundling` with `Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.Bundling`
* Replace `Volo.Abp.Identity.Blazor.WebAssembly` with `Lsw.Abp.IdentityManagement.Blazor.WebAssembly.AntDesignUI`
* Replace `Volo.Abp.SettingManagement.Blazor.WebAssembly` with `Lsw.Abp.SettingManagement.Blazor.WebAssembly.AntDesignUI`
* Replace `Volo.Abp.TenantManagement.Blazor.WebAssembly` with `Lsw.Abp.TenantManagement.Blazor.WebAssembly.AntDesignUI`
* Replace `Volo.Abp.FeatureManagement.Blazor.WebAssembly` with `Lsw.Abp.FeatureManagement.Blazor.WebAssembly.AntDesignUI`
Add these references to `src/BookStore.Blazor.Client/BookStore.Blazor.Client.csproj`:
- `Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme`
- `Lsw.Abp.IdentityManagement.Blazor.WebAssembly.AntDesignUI`
- `Lsw.Abp.TenantManagement.Blazor.WebAssembly.AntDesignUI`
- `Lsw.Abp.SettingManagement.Blazor.WebAssembly.AntDesignUI`
- `Lsw.Abp.FeatureManagement.Blazor.WebAssembly.AntDesignUI`
- `Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly`
* Replace `Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme` with `Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme`
* Replace `Volo.Abp.Identity.Blazor.Server` with `Lsw.Abp.IdentityManagement.Blazor.Server.AntDesignUI`
* Replace `Volo.Abp.SettingManagement.Blazor.Server` with `Lsw.Abp.SettingManagement.Blazor.Server.AntDesignUI`
* Replace `Volo.Abp.TenantManagement.Blazor.Server` with `Lsw.Abp.TenantManagement.Blazor.Server.AntDesignUI`
* Replace `Volo.Abp.FeatureManagement.Blazor.Server` with `Lsw.Abp.FeatureManagement.Blazor.Server.AntDesignUI`
Use `ProjectReference` inside this repository, or the same package names when consuming NuGet packages.
**Remove all Blazorise packages.**
Remove the old Blazorise-based Blazor packages from the same projects if they exist:
**Replace `BlazorLeptonXLiteThemeBundles` with `BlazorAntDesignThemeBundles`**
- `Blazorise.Bootstrap5`
- `Blazorise.Icons.FontAwesome`
- `Blazorise.Components`
- `Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme`
- `Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme`
- `Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme.Bundling`
- `Volo.Abp.Identity.Blazor.Server`
- `Volo.Abp.Identity.Blazor.WebAssembly`
- `Volo.Abp.TenantManagement.Blazor.Server`
- `Volo.Abp.TenantManagement.Blazor.WebAssembly`
- `Volo.Abp.SettingManagement.Blazor.Server`
- `Volo.Abp.SettingManagement.Blazor.WebAssembly`
- `Volo.Abp.FeatureManagement.Blazor.Server`
- `Volo.Abp.FeatureManagement.Blazor.WebAssembly`
**Open `_Imports.razor` and add with the following:**
Do not remove `Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite` unless you also replace the MVC/account-page theme.
## 3. Update The WebApp Host Module
Open `src/BookStore.Blazor/BookStoreBlazorModule.cs`.
In the existing `[DependsOn]`, replace the generated Blazor UI module entries with these AntDesign entries:
```csharp
@using AntDesign
@using Lsw.Abp.AntDesignUI
@using Lsw.Abp.AntDesignUI.Components
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Layout
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Bundling
typeof(AbpIdentityBlazorServerAntDesignModule),
typeof(AbpTenantManagementBlazorServerAntDesignModule),
typeof(AbpAntDesignThemeManagementBlazorServerModule),
typeof(AbpAspNetCoreComponentsServerAntDesignThemeModule),
typeof(AbpAspNetCoreComponentsWebAssemblyAntDesignThemeBundlingModule)
```
**Open `BookStoreBlazorModule` make the following changes:**
Configure the AntDesign bundle, router, and theme management API:
```csharp
private void ConfigureBundles()
{
Configure<AbpBundlingOptions>(options =>
{
options.Parameters.InteractiveAuto = true;
options.StyleBundles.Configure(
BlazorAntDesignThemeBundles.Styles.Global,
bundle => { bundle.AddFiles("/global-styles.css"); }
);
});
}
private void ConfigureRouter(ServiceConfigurationContext context)
{
Configure<AbpRouterOptions>(options =>
{
options.AppAssembly = typeof(BookStoreBlazorModule).Assembly;
options.AdditionalAssemblies.Add(typeof(BookStoreBlazorClientModule).Assembly);
});
}
private void ConfigureAutoApiControllers()
{
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly);
options.ConventionalControllers.Create(typeof(AbpAntDesignThemeManagementApplicationModule).Assembly);
});
}
```
* Remove the `ConfigureBlazorise` method
* Fix wrong using namespace
* Update module dependencies
* For example: replace `AbpIdentityBlazorServerModule` with `AbpIdentityBlazorServerAntDesignModule`
* For example: replace `AbpAspNetCoreComponentsServerLeptonXLiteThemeModule` with `AbpAspNetCoreComponentsServerAntDesignThemeModule`
Call these methods from `ConfigureServices`. Remove the old Blazorise provider setup if it exists.
**Open `BookStoreBlazorClientModule` make the following changes:**
## 4. Update The WebAssembly Client Module
* Remove the `ConfigureBlazorise` method
* Fix wrong using namespace
* Update module dependencies
* For example: replace `AbpIdentityBlazorWebAssemblyModule` with `AbpIdentityBlazorWebAssemblyAntDesignModule`
* For example: replace `AbpAspNetCoreComponentsWebAssemblyLeptonXLiteThemeModule` with `AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule`
Open `src/BookStore.Blazor.Client/BookStoreBlazorClientModule.cs`.
**Open `BookStoreMenuContributor` to update icon:**
In the existing `[DependsOn]`, use these AntDesign entries:
* `"fas fa-home"` to `IconType.Outline.Home`
* `"fa fa-cog"` to `IconType.Outline.Setting`
```csharp
typeof(AbpSettingManagementBlazorWebAssemblyAntDesignModule),
typeof(AbpFeatureManagementBlazorWebAssemblyAntDesignModule),
typeof(AbpIdentityBlazorWebAssemblyAntDesignModule),
typeof(AbpTenantManagementBlazorWebAssemblyAntDesignModule),
typeof(AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule),
typeof(AbpAntDesignThemeManagementBlazorWebAssemblyModule)
```
**Open `Routes.razor` and replace with the following:**
Configure the client router:
```csharp
private void ConfigureRouter(ServiceConfigurationContext context)
{
Configure<AbpRouterOptions>(options =>
{
options.AppAssembly = typeof(BookStoreBlazorClientModule).Assembly;
options.AdditionalAssemblies.Add(typeof(BookStoreBlazorClientModule).Assembly);
});
}
```
Remove the old Blazorise provider setup if it exists.
## 5. Update Razor Files
Add these imports to both `_Imports.razor` files:
- `src/BookStore.Blazor/_Imports.razor`
- `src/BookStore.Blazor.Client/_Imports.razor`
```razor
@using AntDesign
@using Lsw.Abp.AntDesignUI
@using Lsw.Abp.AntDesignUI.Components
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Layout
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Bundling
```
Use the AntDesign layout in `src/BookStore.Blazor.Client/Routes.razor`:
```razor
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Routing
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Themes.AntDesignTheme
@using Microsoft.Extensions.Options
@inject IOptions<AbpRouterOptions> RouterOptions
<Router AppAssembly="typeof(Program).Assembly" AdditionalAssemblies="RouterOptions.Value.AdditionalAssemblies">
<Found Context="routeData">
<AuthorizeRouteView RouteData="routeData" DefaultLayout="typeof(DefaultLayout)">
@ -75,30 +168,38 @@ The first step is to use ABP CLI to create a new project.
</Router>
```
**Open `Index.razor` and replace with the following:**
Use the AntDesign bundles in `src/BookStore.Blazor/Components/App.razor`:
```csharp
@page "/"
@inherits BookStoreComponentBase
```razor
@using Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.Bundling
<AbpStyles BundleName="@BlazorAntDesignThemeBundles.Styles.Global"
WebAssemblyStyleFiles="GlobalStyles"
@rendermode="InteractiveAuto" />
<AbpPageHeader Title="Index"></AbpPageHeader>
<Routes @rendermode="InteractiveAuto" />
<div class="page-content">
<div style="text-align: center">
<AbpScripts BundleName="@BlazorAntDesignThemeBundles.Scripts.Global"
WebAssemblyScriptFiles="GlobalScripts"
@rendermode="InteractiveAuto" />
```
<Alert Type="@AlertType.Success"
Message="Success"
Description=" Congratulations, BookStore is successfully running!"
ShowIcon="true"/>
## 6. Build And Run
<Divider/>
From the solution root:
</div>
</div>
```bash
dotnet build
```
Run the `dotnet build` & `abp bundle` command in the `BookStore.Blazor.Client` folder.
To run this repository sample:
```bash
cd samples/WebApp
dotnet run --project .\src\BookStore.DbMigrator\
dotnet run --project .\src\BookStore.Blazor\
```
That's all, enjoy your code :).
Open `https://localhost:44320`.
![3](img/3.png)
Log in with `admin` / `1q2w3E*`, then verify that the AntDesign layout and right-side theme settings panel are visible.

56
README.md

@ -1,25 +1,55 @@
# Lsw.Abp.AntDesignUI
**An Abp Blazor Theme based [Ant-Design-Blazor](https://github.com/ant-design-blazor/ant-design-blazor) !**
ABP Blazor UI theme and module set based on [Ant Design Blazor](https://github.com/ant-design-blazor/ant-design-blazor).
[![NuGet](https://img.shields.io/nuget/v/Lsw.Abp.AntDesignUI.svg)](https://www.nuget.org/packages/Lsw.Abp.AntDesignUI/)
[![NuGet](https://img.shields.io/nuget/dt/Lsw.Abp.AntDesignUI.svg)](https://www.nuget.org/packages/Lsw.Abp.AntDesignUI/)
## Samples
## Features
Lsw.Abp.AntDesignUI provides an Ant Design Pro-style application shell for ABP Blazor applications.
- Refactored application layout with side and top navigation.
- Responsive sidebar behavior for desktop and mobile screens.
- Light, menu-dark, and real-dark visual styles.
- Runtime controls for content width, fixed header, fixed sidebar, split menus, and page regions.
- Floating theme settings panel for authenticated users.
- Admin-managed theme setting availability through ABP Setting Management.
- AntDesign UI implementations for common ABP management modules.
## Theme Settings
Authenticated users can open the settings panel from the right side of the application and change the layout without restarting the app.
The panel includes:
* [Blazor WebApp(Auto mode) sample](/samples/WebApp/)
* [Blazor WebApp(Server mode) sample](/samples/WebAppBlazorServer/)
* [Blazor WebApp(WebAssembly mode) sample](/samples/WebAppBlazorWebAssembly/)
- Page style selection.
- Navigation mode selection.
- Content width and fixed layout switches.
- Header, footer, menu, and menu header visibility.
- Weak color mode.
Administrators can choose which groups are visible from `Administration -> Settings -> Theme settings management`.
## Screenshots
![AntDesign theme home page](img/theme-home.png)
![Advanced theme settings panel](img/theme-settings-panel.png)
## Samples
![1](img/1.png)
![2](img/2.png)
- [WebApp (Auto mode)](./samples/WebApp/)
- [WebApp Blazor Server](./samples/WebAppBlazorServer/)
- [WebApp Blazor WebAssembly](./samples/WebAppBlazorWebAssembly/)
## Quick Start
Sample login:
* [Change the theme of the ABP project to AntBlazorTheme for Blazor WebApp.](./README.WebApp.md)
* [Change the theme of the ABP project to AntBlazorTheme for Blazor Server.](./README.BlazorServer.md)
* [Change the theme of the ABP project to AntBlazorTheme for Blazor WebAssembly.](./README.BlazorWebAssembly.md)
- Username: `admin`
- Password: `1q2w3E*`
## Road map
## Usage Guides
Updating...
- [Use AntDesign theme in ABP Blazor WebApp](./README.WebApp.md)
- [Use AntDesign theme in ABP Blazor Server](./README.BlazorServer.md)
- [Use AntDesign theme in ABP Blazor WebAssembly](./README.BlazorWebAssembly.md)

BIN
img/theme-home.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
img/theme-settings-panel.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

242
lsw.Abp.AntDesignUI.sln

@ -67,92 +67,328 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Solution Items", ".Solutio
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.Bundling", "modules\AntDesignTheme\Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.Bundling\Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.Bundling.csproj", "{9FE3143F-08A8-444F-B6B9-D4533FB57674}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AntDesignThemeManagement", "AntDesignThemeManagement", "{C071317A-33DD-81B8-DE1C-2EFAA26D6A66}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lsw.Abp.AntDesignThemeManagement.Application.Contracts", "modules\AntDesignThemeManagement\Lsw.Abp.AntDesignThemeManagement.Application.Contracts\Lsw.Abp.AntDesignThemeManagement.Application.Contracts.csproj", "{26EB7F51-1239-4C81-A840-91AB48C30111}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lsw.Abp.AntDesignThemeManagement.Application", "modules\AntDesignThemeManagement\Lsw.Abp.AntDesignThemeManagement.Application\Lsw.Abp.AntDesignThemeManagement.Application.csproj", "{3AEE1B0F-D26D-4156-A9A2-90FEAE7F111C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lsw.Abp.AntDesignThemeManagement.Blazor", "modules\AntDesignThemeManagement\Lsw.Abp.AntDesignThemeManagement.Blazor\Lsw.Abp.AntDesignThemeManagement.Blazor.csproj", "{C18F5B9D-6171-456B-A972-2EF091C6FB15}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lsw.Abp.AntDesignThemeManagement.Blazor.Server", "modules\AntDesignThemeManagement\Lsw.Abp.AntDesignThemeManagement.Blazor.Server\Lsw.Abp.AntDesignThemeManagement.Blazor.Server.csproj", "{4E47F110-D37D-4C48-86CB-457295976000}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly", "modules\AntDesignThemeManagement\Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly\Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly.csproj", "{3A3C7948-3D00-416D-842C-030F3EEA91C0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9EA4AA35-DEFC-4C25-8333-78137853EC5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9EA4AA35-DEFC-4C25-8333-78137853EC5D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9EA4AA35-DEFC-4C25-8333-78137853EC5D}.Debug|x64.ActiveCfg = Debug|Any CPU
{9EA4AA35-DEFC-4C25-8333-78137853EC5D}.Debug|x64.Build.0 = Debug|Any CPU
{9EA4AA35-DEFC-4C25-8333-78137853EC5D}.Debug|x86.ActiveCfg = Debug|Any CPU
{9EA4AA35-DEFC-4C25-8333-78137853EC5D}.Debug|x86.Build.0 = Debug|Any CPU
{9EA4AA35-DEFC-4C25-8333-78137853EC5D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9EA4AA35-DEFC-4C25-8333-78137853EC5D}.Release|Any CPU.Build.0 = Release|Any CPU
{9EA4AA35-DEFC-4C25-8333-78137853EC5D}.Release|x64.ActiveCfg = Release|Any CPU
{9EA4AA35-DEFC-4C25-8333-78137853EC5D}.Release|x64.Build.0 = Release|Any CPU
{9EA4AA35-DEFC-4C25-8333-78137853EC5D}.Release|x86.ActiveCfg = Release|Any CPU
{9EA4AA35-DEFC-4C25-8333-78137853EC5D}.Release|x86.Build.0 = Release|Any CPU
{FD90132E-3B0E-4677-A7CE-8783FCC5E427}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FD90132E-3B0E-4677-A7CE-8783FCC5E427}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FD90132E-3B0E-4677-A7CE-8783FCC5E427}.Debug|x64.ActiveCfg = Debug|Any CPU
{FD90132E-3B0E-4677-A7CE-8783FCC5E427}.Debug|x64.Build.0 = Debug|Any CPU
{FD90132E-3B0E-4677-A7CE-8783FCC5E427}.Debug|x86.ActiveCfg = Debug|Any CPU
{FD90132E-3B0E-4677-A7CE-8783FCC5E427}.Debug|x86.Build.0 = Debug|Any CPU
{FD90132E-3B0E-4677-A7CE-8783FCC5E427}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FD90132E-3B0E-4677-A7CE-8783FCC5E427}.Release|Any CPU.Build.0 = Release|Any CPU
{FD90132E-3B0E-4677-A7CE-8783FCC5E427}.Release|x64.ActiveCfg = Release|Any CPU
{FD90132E-3B0E-4677-A7CE-8783FCC5E427}.Release|x64.Build.0 = Release|Any CPU
{FD90132E-3B0E-4677-A7CE-8783FCC5E427}.Release|x86.ActiveCfg = Release|Any CPU
{FD90132E-3B0E-4677-A7CE-8783FCC5E427}.Release|x86.Build.0 = Release|Any CPU
{EF106F75-3B60-4C72-902D-DDE46EEF7D84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EF106F75-3B60-4C72-902D-DDE46EEF7D84}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EF106F75-3B60-4C72-902D-DDE46EEF7D84}.Debug|x64.ActiveCfg = Debug|Any CPU
{EF106F75-3B60-4C72-902D-DDE46EEF7D84}.Debug|x64.Build.0 = Debug|Any CPU
{EF106F75-3B60-4C72-902D-DDE46EEF7D84}.Debug|x86.ActiveCfg = Debug|Any CPU
{EF106F75-3B60-4C72-902D-DDE46EEF7D84}.Debug|x86.Build.0 = Debug|Any CPU
{EF106F75-3B60-4C72-902D-DDE46EEF7D84}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EF106F75-3B60-4C72-902D-DDE46EEF7D84}.Release|Any CPU.Build.0 = Release|Any CPU
{EF106F75-3B60-4C72-902D-DDE46EEF7D84}.Release|x64.ActiveCfg = Release|Any CPU
{EF106F75-3B60-4C72-902D-DDE46EEF7D84}.Release|x64.Build.0 = Release|Any CPU
{EF106F75-3B60-4C72-902D-DDE46EEF7D84}.Release|x86.ActiveCfg = Release|Any CPU
{EF106F75-3B60-4C72-902D-DDE46EEF7D84}.Release|x86.Build.0 = Release|Any CPU
{B5CBA610-B248-489F-9840-05DF0C1AAC69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B5CBA610-B248-489F-9840-05DF0C1AAC69}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B5CBA610-B248-489F-9840-05DF0C1AAC69}.Debug|x64.ActiveCfg = Debug|Any CPU
{B5CBA610-B248-489F-9840-05DF0C1AAC69}.Debug|x64.Build.0 = Debug|Any CPU
{B5CBA610-B248-489F-9840-05DF0C1AAC69}.Debug|x86.ActiveCfg = Debug|Any CPU
{B5CBA610-B248-489F-9840-05DF0C1AAC69}.Debug|x86.Build.0 = Debug|Any CPU
{B5CBA610-B248-489F-9840-05DF0C1AAC69}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B5CBA610-B248-489F-9840-05DF0C1AAC69}.Release|Any CPU.Build.0 = Release|Any CPU
{B5CBA610-B248-489F-9840-05DF0C1AAC69}.Release|x64.ActiveCfg = Release|Any CPU
{B5CBA610-B248-489F-9840-05DF0C1AAC69}.Release|x64.Build.0 = Release|Any CPU
{B5CBA610-B248-489F-9840-05DF0C1AAC69}.Release|x86.ActiveCfg = Release|Any CPU
{B5CBA610-B248-489F-9840-05DF0C1AAC69}.Release|x86.Build.0 = Release|Any CPU
{62606EC9-E888-47C0-BBAC-E7E40652DFD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{62606EC9-E888-47C0-BBAC-E7E40652DFD3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{62606EC9-E888-47C0-BBAC-E7E40652DFD3}.Debug|x64.ActiveCfg = Debug|Any CPU
{62606EC9-E888-47C0-BBAC-E7E40652DFD3}.Debug|x64.Build.0 = Debug|Any CPU
{62606EC9-E888-47C0-BBAC-E7E40652DFD3}.Debug|x86.ActiveCfg = Debug|Any CPU
{62606EC9-E888-47C0-BBAC-E7E40652DFD3}.Debug|x86.Build.0 = Debug|Any CPU
{62606EC9-E888-47C0-BBAC-E7E40652DFD3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{62606EC9-E888-47C0-BBAC-E7E40652DFD3}.Release|Any CPU.Build.0 = Release|Any CPU
{62606EC9-E888-47C0-BBAC-E7E40652DFD3}.Release|x64.ActiveCfg = Release|Any CPU
{62606EC9-E888-47C0-BBAC-E7E40652DFD3}.Release|x64.Build.0 = Release|Any CPU
{62606EC9-E888-47C0-BBAC-E7E40652DFD3}.Release|x86.ActiveCfg = Release|Any CPU
{62606EC9-E888-47C0-BBAC-E7E40652DFD3}.Release|x86.Build.0 = Release|Any CPU
{E59DA556-0472-4409-BDCE-C992F73531F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E59DA556-0472-4409-BDCE-C992F73531F5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E59DA556-0472-4409-BDCE-C992F73531F5}.Debug|x64.ActiveCfg = Debug|Any CPU
{E59DA556-0472-4409-BDCE-C992F73531F5}.Debug|x64.Build.0 = Debug|Any CPU
{E59DA556-0472-4409-BDCE-C992F73531F5}.Debug|x86.ActiveCfg = Debug|Any CPU
{E59DA556-0472-4409-BDCE-C992F73531F5}.Debug|x86.Build.0 = Debug|Any CPU
{E59DA556-0472-4409-BDCE-C992F73531F5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E59DA556-0472-4409-BDCE-C992F73531F5}.Release|Any CPU.Build.0 = Release|Any CPU
{E59DA556-0472-4409-BDCE-C992F73531F5}.Release|x64.ActiveCfg = Release|Any CPU
{E59DA556-0472-4409-BDCE-C992F73531F5}.Release|x64.Build.0 = Release|Any CPU
{E59DA556-0472-4409-BDCE-C992F73531F5}.Release|x86.ActiveCfg = Release|Any CPU
{E59DA556-0472-4409-BDCE-C992F73531F5}.Release|x86.Build.0 = Release|Any CPU
{782E3414-6807-49A6-A7C4-9239BBACE0AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{782E3414-6807-49A6-A7C4-9239BBACE0AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{782E3414-6807-49A6-A7C4-9239BBACE0AE}.Debug|x64.ActiveCfg = Debug|Any CPU
{782E3414-6807-49A6-A7C4-9239BBACE0AE}.Debug|x64.Build.0 = Debug|Any CPU
{782E3414-6807-49A6-A7C4-9239BBACE0AE}.Debug|x86.ActiveCfg = Debug|Any CPU
{782E3414-6807-49A6-A7C4-9239BBACE0AE}.Debug|x86.Build.0 = Debug|Any CPU
{782E3414-6807-49A6-A7C4-9239BBACE0AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{782E3414-6807-49A6-A7C4-9239BBACE0AE}.Release|Any CPU.Build.0 = Release|Any CPU
{782E3414-6807-49A6-A7C4-9239BBACE0AE}.Release|x64.ActiveCfg = Release|Any CPU
{782E3414-6807-49A6-A7C4-9239BBACE0AE}.Release|x64.Build.0 = Release|Any CPU
{782E3414-6807-49A6-A7C4-9239BBACE0AE}.Release|x86.ActiveCfg = Release|Any CPU
{782E3414-6807-49A6-A7C4-9239BBACE0AE}.Release|x86.Build.0 = Release|Any CPU
{995DD783-AAA5-450A-AF5C-6DFA513343F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{995DD783-AAA5-450A-AF5C-6DFA513343F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{995DD783-AAA5-450A-AF5C-6DFA513343F8}.Debug|x64.ActiveCfg = Debug|Any CPU
{995DD783-AAA5-450A-AF5C-6DFA513343F8}.Debug|x64.Build.0 = Debug|Any CPU
{995DD783-AAA5-450A-AF5C-6DFA513343F8}.Debug|x86.ActiveCfg = Debug|Any CPU
{995DD783-AAA5-450A-AF5C-6DFA513343F8}.Debug|x86.Build.0 = Debug|Any CPU
{995DD783-AAA5-450A-AF5C-6DFA513343F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{995DD783-AAA5-450A-AF5C-6DFA513343F8}.Release|Any CPU.Build.0 = Release|Any CPU
{995DD783-AAA5-450A-AF5C-6DFA513343F8}.Release|x64.ActiveCfg = Release|Any CPU
{995DD783-AAA5-450A-AF5C-6DFA513343F8}.Release|x64.Build.0 = Release|Any CPU
{995DD783-AAA5-450A-AF5C-6DFA513343F8}.Release|x86.ActiveCfg = Release|Any CPU
{995DD783-AAA5-450A-AF5C-6DFA513343F8}.Release|x86.Build.0 = Release|Any CPU
{496912B1-C4E3-477E-8AF8-D95DFC604B7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{496912B1-C4E3-477E-8AF8-D95DFC604B7C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{496912B1-C4E3-477E-8AF8-D95DFC604B7C}.Debug|x64.ActiveCfg = Debug|Any CPU
{496912B1-C4E3-477E-8AF8-D95DFC604B7C}.Debug|x64.Build.0 = Debug|Any CPU
{496912B1-C4E3-477E-8AF8-D95DFC604B7C}.Debug|x86.ActiveCfg = Debug|Any CPU
{496912B1-C4E3-477E-8AF8-D95DFC604B7C}.Debug|x86.Build.0 = Debug|Any CPU
{496912B1-C4E3-477E-8AF8-D95DFC604B7C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{496912B1-C4E3-477E-8AF8-D95DFC604B7C}.Release|Any CPU.Build.0 = Release|Any CPU
{496912B1-C4E3-477E-8AF8-D95DFC604B7C}.Release|x64.ActiveCfg = Release|Any CPU
{496912B1-C4E3-477E-8AF8-D95DFC604B7C}.Release|x64.Build.0 = Release|Any CPU
{496912B1-C4E3-477E-8AF8-D95DFC604B7C}.Release|x86.ActiveCfg = Release|Any CPU
{496912B1-C4E3-477E-8AF8-D95DFC604B7C}.Release|x86.Build.0 = Release|Any CPU
{C8437CD7-37CB-40B7-8862-96A1533C1818}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C8437CD7-37CB-40B7-8862-96A1533C1818}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C8437CD7-37CB-40B7-8862-96A1533C1818}.Debug|x64.ActiveCfg = Debug|Any CPU
{C8437CD7-37CB-40B7-8862-96A1533C1818}.Debug|x64.Build.0 = Debug|Any CPU
{C8437CD7-37CB-40B7-8862-96A1533C1818}.Debug|x86.ActiveCfg = Debug|Any CPU
{C8437CD7-37CB-40B7-8862-96A1533C1818}.Debug|x86.Build.0 = Debug|Any CPU
{C8437CD7-37CB-40B7-8862-96A1533C1818}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C8437CD7-37CB-40B7-8862-96A1533C1818}.Release|Any CPU.Build.0 = Release|Any CPU
{C8437CD7-37CB-40B7-8862-96A1533C1818}.Release|x64.ActiveCfg = Release|Any CPU
{C8437CD7-37CB-40B7-8862-96A1533C1818}.Release|x64.Build.0 = Release|Any CPU
{C8437CD7-37CB-40B7-8862-96A1533C1818}.Release|x86.ActiveCfg = Release|Any CPU
{C8437CD7-37CB-40B7-8862-96A1533C1818}.Release|x86.Build.0 = Release|Any CPU
{C404A7B8-8271-417D-B02C-20EDC7FB48B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C404A7B8-8271-417D-B02C-20EDC7FB48B7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C404A7B8-8271-417D-B02C-20EDC7FB48B7}.Debug|x64.ActiveCfg = Debug|Any CPU
{C404A7B8-8271-417D-B02C-20EDC7FB48B7}.Debug|x64.Build.0 = Debug|Any CPU
{C404A7B8-8271-417D-B02C-20EDC7FB48B7}.Debug|x86.ActiveCfg = Debug|Any CPU
{C404A7B8-8271-417D-B02C-20EDC7FB48B7}.Debug|x86.Build.0 = Debug|Any CPU
{C404A7B8-8271-417D-B02C-20EDC7FB48B7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C404A7B8-8271-417D-B02C-20EDC7FB48B7}.Release|Any CPU.Build.0 = Release|Any CPU
{C404A7B8-8271-417D-B02C-20EDC7FB48B7}.Release|x64.ActiveCfg = Release|Any CPU
{C404A7B8-8271-417D-B02C-20EDC7FB48B7}.Release|x64.Build.0 = Release|Any CPU
{C404A7B8-8271-417D-B02C-20EDC7FB48B7}.Release|x86.ActiveCfg = Release|Any CPU
{C404A7B8-8271-417D-B02C-20EDC7FB48B7}.Release|x86.Build.0 = Release|Any CPU
{268E0BF9-A6A4-4255-835C-0995CE4B3F2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{268E0BF9-A6A4-4255-835C-0995CE4B3F2E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{268E0BF9-A6A4-4255-835C-0995CE4B3F2E}.Debug|x64.ActiveCfg = Debug|Any CPU
{268E0BF9-A6A4-4255-835C-0995CE4B3F2E}.Debug|x64.Build.0 = Debug|Any CPU
{268E0BF9-A6A4-4255-835C-0995CE4B3F2E}.Debug|x86.ActiveCfg = Debug|Any CPU
{268E0BF9-A6A4-4255-835C-0995CE4B3F2E}.Debug|x86.Build.0 = Debug|Any CPU
{268E0BF9-A6A4-4255-835C-0995CE4B3F2E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{268E0BF9-A6A4-4255-835C-0995CE4B3F2E}.Release|Any CPU.Build.0 = Release|Any CPU
{268E0BF9-A6A4-4255-835C-0995CE4B3F2E}.Release|x64.ActiveCfg = Release|Any CPU
{268E0BF9-A6A4-4255-835C-0995CE4B3F2E}.Release|x64.Build.0 = Release|Any CPU
{268E0BF9-A6A4-4255-835C-0995CE4B3F2E}.Release|x86.ActiveCfg = Release|Any CPU
{268E0BF9-A6A4-4255-835C-0995CE4B3F2E}.Release|x86.Build.0 = Release|Any CPU
{55BB2D05-7DCF-4BA4-B9E4-823A98C2B626}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{55BB2D05-7DCF-4BA4-B9E4-823A98C2B626}.Debug|Any CPU.Build.0 = Debug|Any CPU
{55BB2D05-7DCF-4BA4-B9E4-823A98C2B626}.Debug|x64.ActiveCfg = Debug|Any CPU
{55BB2D05-7DCF-4BA4-B9E4-823A98C2B626}.Debug|x64.Build.0 = Debug|Any CPU
{55BB2D05-7DCF-4BA4-B9E4-823A98C2B626}.Debug|x86.ActiveCfg = Debug|Any CPU
{55BB2D05-7DCF-4BA4-B9E4-823A98C2B626}.Debug|x86.Build.0 = Debug|Any CPU
{55BB2D05-7DCF-4BA4-B9E4-823A98C2B626}.Release|Any CPU.ActiveCfg = Release|Any CPU
{55BB2D05-7DCF-4BA4-B9E4-823A98C2B626}.Release|Any CPU.Build.0 = Release|Any CPU
{55BB2D05-7DCF-4BA4-B9E4-823A98C2B626}.Release|x64.ActiveCfg = Release|Any CPU
{55BB2D05-7DCF-4BA4-B9E4-823A98C2B626}.Release|x64.Build.0 = Release|Any CPU
{55BB2D05-7DCF-4BA4-B9E4-823A98C2B626}.Release|x86.ActiveCfg = Release|Any CPU
{55BB2D05-7DCF-4BA4-B9E4-823A98C2B626}.Release|x86.Build.0 = Release|Any CPU
{2E033BD6-16C2-4F3A-ADD5-C08D6FB8482B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2E033BD6-16C2-4F3A-ADD5-C08D6FB8482B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2E033BD6-16C2-4F3A-ADD5-C08D6FB8482B}.Debug|x64.ActiveCfg = Debug|Any CPU
{2E033BD6-16C2-4F3A-ADD5-C08D6FB8482B}.Debug|x64.Build.0 = Debug|Any CPU
{2E033BD6-16C2-4F3A-ADD5-C08D6FB8482B}.Debug|x86.ActiveCfg = Debug|Any CPU
{2E033BD6-16C2-4F3A-ADD5-C08D6FB8482B}.Debug|x86.Build.0 = Debug|Any CPU
{2E033BD6-16C2-4F3A-ADD5-C08D6FB8482B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2E033BD6-16C2-4F3A-ADD5-C08D6FB8482B}.Release|Any CPU.Build.0 = Release|Any CPU
{2E033BD6-16C2-4F3A-ADD5-C08D6FB8482B}.Release|x64.ActiveCfg = Release|Any CPU
{2E033BD6-16C2-4F3A-ADD5-C08D6FB8482B}.Release|x64.Build.0 = Release|Any CPU
{2E033BD6-16C2-4F3A-ADD5-C08D6FB8482B}.Release|x86.ActiveCfg = Release|Any CPU
{2E033BD6-16C2-4F3A-ADD5-C08D6FB8482B}.Release|x86.Build.0 = Release|Any CPU
{3D8714C4-B78B-4B5E-8675-F6531C21AE2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3D8714C4-B78B-4B5E-8675-F6531C21AE2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3D8714C4-B78B-4B5E-8675-F6531C21AE2C}.Debug|x64.ActiveCfg = Debug|Any CPU
{3D8714C4-B78B-4B5E-8675-F6531C21AE2C}.Debug|x64.Build.0 = Debug|Any CPU
{3D8714C4-B78B-4B5E-8675-F6531C21AE2C}.Debug|x86.ActiveCfg = Debug|Any CPU
{3D8714C4-B78B-4B5E-8675-F6531C21AE2C}.Debug|x86.Build.0 = Debug|Any CPU
{3D8714C4-B78B-4B5E-8675-F6531C21AE2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3D8714C4-B78B-4B5E-8675-F6531C21AE2C}.Release|Any CPU.Build.0 = Release|Any CPU
{3D8714C4-B78B-4B5E-8675-F6531C21AE2C}.Release|x64.ActiveCfg = Release|Any CPU
{3D8714C4-B78B-4B5E-8675-F6531C21AE2C}.Release|x64.Build.0 = Release|Any CPU
{3D8714C4-B78B-4B5E-8675-F6531C21AE2C}.Release|x86.ActiveCfg = Release|Any CPU
{3D8714C4-B78B-4B5E-8675-F6531C21AE2C}.Release|x86.Build.0 = Release|Any CPU
{F3ADEF50-755E-4FCB-9746-C946CB0306B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F3ADEF50-755E-4FCB-9746-C946CB0306B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F3ADEF50-755E-4FCB-9746-C946CB0306B3}.Debug|x64.ActiveCfg = Debug|Any CPU
{F3ADEF50-755E-4FCB-9746-C946CB0306B3}.Debug|x64.Build.0 = Debug|Any CPU
{F3ADEF50-755E-4FCB-9746-C946CB0306B3}.Debug|x86.ActiveCfg = Debug|Any CPU
{F3ADEF50-755E-4FCB-9746-C946CB0306B3}.Debug|x86.Build.0 = Debug|Any CPU
{F3ADEF50-755E-4FCB-9746-C946CB0306B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F3ADEF50-755E-4FCB-9746-C946CB0306B3}.Release|Any CPU.Build.0 = Release|Any CPU
{F3ADEF50-755E-4FCB-9746-C946CB0306B3}.Release|x64.ActiveCfg = Release|Any CPU
{F3ADEF50-755E-4FCB-9746-C946CB0306B3}.Release|x64.Build.0 = Release|Any CPU
{F3ADEF50-755E-4FCB-9746-C946CB0306B3}.Release|x86.ActiveCfg = Release|Any CPU
{F3ADEF50-755E-4FCB-9746-C946CB0306B3}.Release|x86.Build.0 = Release|Any CPU
{BBA243C1-EEAD-42EE-ABA3-6912BE5F41D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BBA243C1-EEAD-42EE-ABA3-6912BE5F41D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BBA243C1-EEAD-42EE-ABA3-6912BE5F41D8}.Debug|x64.ActiveCfg = Debug|Any CPU
{BBA243C1-EEAD-42EE-ABA3-6912BE5F41D8}.Debug|x64.Build.0 = Debug|Any CPU
{BBA243C1-EEAD-42EE-ABA3-6912BE5F41D8}.Debug|x86.ActiveCfg = Debug|Any CPU
{BBA243C1-EEAD-42EE-ABA3-6912BE5F41D8}.Debug|x86.Build.0 = Debug|Any CPU
{BBA243C1-EEAD-42EE-ABA3-6912BE5F41D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BBA243C1-EEAD-42EE-ABA3-6912BE5F41D8}.Release|Any CPU.Build.0 = Release|Any CPU
{BBA243C1-EEAD-42EE-ABA3-6912BE5F41D8}.Release|x64.ActiveCfg = Release|Any CPU
{BBA243C1-EEAD-42EE-ABA3-6912BE5F41D8}.Release|x64.Build.0 = Release|Any CPU
{BBA243C1-EEAD-42EE-ABA3-6912BE5F41D8}.Release|x86.ActiveCfg = Release|Any CPU
{BBA243C1-EEAD-42EE-ABA3-6912BE5F41D8}.Release|x86.Build.0 = Release|Any CPU
{2DCCFE7C-4BC5-46F8-8493-82352CE0EE71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2DCCFE7C-4BC5-46F8-8493-82352CE0EE71}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2DCCFE7C-4BC5-46F8-8493-82352CE0EE71}.Debug|x64.ActiveCfg = Debug|Any CPU
{2DCCFE7C-4BC5-46F8-8493-82352CE0EE71}.Debug|x64.Build.0 = Debug|Any CPU
{2DCCFE7C-4BC5-46F8-8493-82352CE0EE71}.Debug|x86.ActiveCfg = Debug|Any CPU
{2DCCFE7C-4BC5-46F8-8493-82352CE0EE71}.Debug|x86.Build.0 = Debug|Any CPU
{2DCCFE7C-4BC5-46F8-8493-82352CE0EE71}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2DCCFE7C-4BC5-46F8-8493-82352CE0EE71}.Release|Any CPU.Build.0 = Release|Any CPU
{2DCCFE7C-4BC5-46F8-8493-82352CE0EE71}.Release|x64.ActiveCfg = Release|Any CPU
{2DCCFE7C-4BC5-46F8-8493-82352CE0EE71}.Release|x64.Build.0 = Release|Any CPU
{2DCCFE7C-4BC5-46F8-8493-82352CE0EE71}.Release|x86.ActiveCfg = Release|Any CPU
{2DCCFE7C-4BC5-46F8-8493-82352CE0EE71}.Release|x86.Build.0 = Release|Any CPU
{90DBF0A4-253D-4E75-8221-17455B404551}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{90DBF0A4-253D-4E75-8221-17455B404551}.Debug|Any CPU.Build.0 = Debug|Any CPU
{90DBF0A4-253D-4E75-8221-17455B404551}.Debug|x64.ActiveCfg = Debug|Any CPU
{90DBF0A4-253D-4E75-8221-17455B404551}.Debug|x64.Build.0 = Debug|Any CPU
{90DBF0A4-253D-4E75-8221-17455B404551}.Debug|x86.ActiveCfg = Debug|Any CPU
{90DBF0A4-253D-4E75-8221-17455B404551}.Debug|x86.Build.0 = Debug|Any CPU
{90DBF0A4-253D-4E75-8221-17455B404551}.Release|Any CPU.ActiveCfg = Release|Any CPU
{90DBF0A4-253D-4E75-8221-17455B404551}.Release|Any CPU.Build.0 = Release|Any CPU
{90DBF0A4-253D-4E75-8221-17455B404551}.Release|x64.ActiveCfg = Release|Any CPU
{90DBF0A4-253D-4E75-8221-17455B404551}.Release|x64.Build.0 = Release|Any CPU
{90DBF0A4-253D-4E75-8221-17455B404551}.Release|x86.ActiveCfg = Release|Any CPU
{90DBF0A4-253D-4E75-8221-17455B404551}.Release|x86.Build.0 = Release|Any CPU
{9FE3143F-08A8-444F-B6B9-D4533FB57674}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9FE3143F-08A8-444F-B6B9-D4533FB57674}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9FE3143F-08A8-444F-B6B9-D4533FB57674}.Debug|x64.ActiveCfg = Debug|Any CPU
{9FE3143F-08A8-444F-B6B9-D4533FB57674}.Debug|x64.Build.0 = Debug|Any CPU
{9FE3143F-08A8-444F-B6B9-D4533FB57674}.Debug|x86.ActiveCfg = Debug|Any CPU
{9FE3143F-08A8-444F-B6B9-D4533FB57674}.Debug|x86.Build.0 = Debug|Any CPU
{9FE3143F-08A8-444F-B6B9-D4533FB57674}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9FE3143F-08A8-444F-B6B9-D4533FB57674}.Release|Any CPU.Build.0 = Release|Any CPU
{9FE3143F-08A8-444F-B6B9-D4533FB57674}.Release|x64.ActiveCfg = Release|Any CPU
{9FE3143F-08A8-444F-B6B9-D4533FB57674}.Release|x64.Build.0 = Release|Any CPU
{9FE3143F-08A8-444F-B6B9-D4533FB57674}.Release|x86.ActiveCfg = Release|Any CPU
{9FE3143F-08A8-444F-B6B9-D4533FB57674}.Release|x86.Build.0 = Release|Any CPU
{26EB7F51-1239-4C81-A840-91AB48C30111}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{26EB7F51-1239-4C81-A840-91AB48C30111}.Debug|Any CPU.Build.0 = Debug|Any CPU
{26EB7F51-1239-4C81-A840-91AB48C30111}.Debug|x64.ActiveCfg = Debug|Any CPU
{26EB7F51-1239-4C81-A840-91AB48C30111}.Debug|x64.Build.0 = Debug|Any CPU
{26EB7F51-1239-4C81-A840-91AB48C30111}.Debug|x86.ActiveCfg = Debug|Any CPU
{26EB7F51-1239-4C81-A840-91AB48C30111}.Debug|x86.Build.0 = Debug|Any CPU
{26EB7F51-1239-4C81-A840-91AB48C30111}.Release|Any CPU.ActiveCfg = Release|Any CPU
{26EB7F51-1239-4C81-A840-91AB48C30111}.Release|Any CPU.Build.0 = Release|Any CPU
{26EB7F51-1239-4C81-A840-91AB48C30111}.Release|x64.ActiveCfg = Release|Any CPU
{26EB7F51-1239-4C81-A840-91AB48C30111}.Release|x64.Build.0 = Release|Any CPU
{26EB7F51-1239-4C81-A840-91AB48C30111}.Release|x86.ActiveCfg = Release|Any CPU
{26EB7F51-1239-4C81-A840-91AB48C30111}.Release|x86.Build.0 = Release|Any CPU
{3AEE1B0F-D26D-4156-A9A2-90FEAE7F111C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3AEE1B0F-D26D-4156-A9A2-90FEAE7F111C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3AEE1B0F-D26D-4156-A9A2-90FEAE7F111C}.Debug|x64.ActiveCfg = Debug|Any CPU
{3AEE1B0F-D26D-4156-A9A2-90FEAE7F111C}.Debug|x64.Build.0 = Debug|Any CPU
{3AEE1B0F-D26D-4156-A9A2-90FEAE7F111C}.Debug|x86.ActiveCfg = Debug|Any CPU
{3AEE1B0F-D26D-4156-A9A2-90FEAE7F111C}.Debug|x86.Build.0 = Debug|Any CPU
{3AEE1B0F-D26D-4156-A9A2-90FEAE7F111C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3AEE1B0F-D26D-4156-A9A2-90FEAE7F111C}.Release|Any CPU.Build.0 = Release|Any CPU
{3AEE1B0F-D26D-4156-A9A2-90FEAE7F111C}.Release|x64.ActiveCfg = Release|Any CPU
{3AEE1B0F-D26D-4156-A9A2-90FEAE7F111C}.Release|x64.Build.0 = Release|Any CPU
{3AEE1B0F-D26D-4156-A9A2-90FEAE7F111C}.Release|x86.ActiveCfg = Release|Any CPU
{3AEE1B0F-D26D-4156-A9A2-90FEAE7F111C}.Release|x86.Build.0 = Release|Any CPU
{C18F5B9D-6171-456B-A972-2EF091C6FB15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C18F5B9D-6171-456B-A972-2EF091C6FB15}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C18F5B9D-6171-456B-A972-2EF091C6FB15}.Debug|x64.ActiveCfg = Debug|Any CPU
{C18F5B9D-6171-456B-A972-2EF091C6FB15}.Debug|x64.Build.0 = Debug|Any CPU
{C18F5B9D-6171-456B-A972-2EF091C6FB15}.Debug|x86.ActiveCfg = Debug|Any CPU
{C18F5B9D-6171-456B-A972-2EF091C6FB15}.Debug|x86.Build.0 = Debug|Any CPU
{C18F5B9D-6171-456B-A972-2EF091C6FB15}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C18F5B9D-6171-456B-A972-2EF091C6FB15}.Release|Any CPU.Build.0 = Release|Any CPU
{C18F5B9D-6171-456B-A972-2EF091C6FB15}.Release|x64.ActiveCfg = Release|Any CPU
{C18F5B9D-6171-456B-A972-2EF091C6FB15}.Release|x64.Build.0 = Release|Any CPU
{C18F5B9D-6171-456B-A972-2EF091C6FB15}.Release|x86.ActiveCfg = Release|Any CPU
{C18F5B9D-6171-456B-A972-2EF091C6FB15}.Release|x86.Build.0 = Release|Any CPU
{4E47F110-D37D-4C48-86CB-457295976000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4E47F110-D37D-4C48-86CB-457295976000}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4E47F110-D37D-4C48-86CB-457295976000}.Debug|x64.ActiveCfg = Debug|Any CPU
{4E47F110-D37D-4C48-86CB-457295976000}.Debug|x64.Build.0 = Debug|Any CPU
{4E47F110-D37D-4C48-86CB-457295976000}.Debug|x86.ActiveCfg = Debug|Any CPU
{4E47F110-D37D-4C48-86CB-457295976000}.Debug|x86.Build.0 = Debug|Any CPU
{4E47F110-D37D-4C48-86CB-457295976000}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4E47F110-D37D-4C48-86CB-457295976000}.Release|Any CPU.Build.0 = Release|Any CPU
{4E47F110-D37D-4C48-86CB-457295976000}.Release|x64.ActiveCfg = Release|Any CPU
{4E47F110-D37D-4C48-86CB-457295976000}.Release|x64.Build.0 = Release|Any CPU
{4E47F110-D37D-4C48-86CB-457295976000}.Release|x86.ActiveCfg = Release|Any CPU
{4E47F110-D37D-4C48-86CB-457295976000}.Release|x86.Build.0 = Release|Any CPU
{3A3C7948-3D00-416D-842C-030F3EEA91C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3A3C7948-3D00-416D-842C-030F3EEA91C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3A3C7948-3D00-416D-842C-030F3EEA91C0}.Debug|x64.ActiveCfg = Debug|Any CPU
{3A3C7948-3D00-416D-842C-030F3EEA91C0}.Debug|x64.Build.0 = Debug|Any CPU
{3A3C7948-3D00-416D-842C-030F3EEA91C0}.Debug|x86.ActiveCfg = Debug|Any CPU
{3A3C7948-3D00-416D-842C-030F3EEA91C0}.Debug|x86.Build.0 = Debug|Any CPU
{3A3C7948-3D00-416D-842C-030F3EEA91C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3A3C7948-3D00-416D-842C-030F3EEA91C0}.Release|Any CPU.Build.0 = Release|Any CPU
{3A3C7948-3D00-416D-842C-030F3EEA91C0}.Release|x64.ActiveCfg = Release|Any CPU
{3A3C7948-3D00-416D-842C-030F3EEA91C0}.Release|x64.Build.0 = Release|Any CPU
{3A3C7948-3D00-416D-842C-030F3EEA91C0}.Release|x86.ActiveCfg = Release|Any CPU
{3A3C7948-3D00-416D-842C-030F3EEA91C0}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -184,6 +420,12 @@ Global
{2DCCFE7C-4BC5-46F8-8493-82352CE0EE71} = {9F013513-EC16-46DF-BDEF-C9B5F0DA6C12}
{90DBF0A4-253D-4E75-8221-17455B404551} = {9F013513-EC16-46DF-BDEF-C9B5F0DA6C12}
{9FE3143F-08A8-444F-B6B9-D4533FB57674} = {9F013513-EC16-46DF-BDEF-C9B5F0DA6C12}
{C071317A-33DD-81B8-DE1C-2EFAA26D6A66} = {0C432416-770F-4331-84E6-5835408A9BD8}
{26EB7F51-1239-4C81-A840-91AB48C30111} = {C071317A-33DD-81B8-DE1C-2EFAA26D6A66}
{3AEE1B0F-D26D-4156-A9A2-90FEAE7F111C} = {C071317A-33DD-81B8-DE1C-2EFAA26D6A66}
{C18F5B9D-6171-456B-A972-2EF091C6FB15} = {C071317A-33DD-81B8-DE1C-2EFAA26D6A66}
{4E47F110-D37D-4C48-86CB-457295976000} = {C071317A-33DD-81B8-DE1C-2EFAA26D6A66}
{3A3C7948-3D00-416D-842C-030F3EEA91C0} = {C071317A-33DD-81B8-DE1C-2EFAA26D6A66}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {783A95E2-ACD4-4E6D-B0FC-1D05ADEB9244}

1
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorAntDesignThemeScriptContributor.cs

@ -8,5 +8,6 @@ public class BlazorAntDesignThemeScriptContributor: BundleContributor
public override void ConfigureBundle(BundleConfigurationContext context)
{
context.Files.AddIfNotContains("/_content/AntDesign/js/ant-design-blazor.js");
context.Files.AddIfNotContains("/_content/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/libs/abp/js/theme-settings.js");
}
}

2
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Themes/AntDesignTheme/LanguageSwitch.razor

@ -21,7 +21,7 @@
</Overlay>
<ChildContent>
<a class="ant-dropdown-link" @onclick:preventDefault>
@_currentLanguage.DisplayName <Icon Type="down" />
<Icon Type="global" Theme="IconThemeType.Outline" /> @_currentLanguage.DisplayName <Icon Type="down" />
</a>
</ChildContent>
</Dropdown>

4
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/AbpAspNetCoreComponentsWebAntDesignThemeModule.cs

@ -1,4 +1,5 @@
using Lsw.Abp.AntDesignUI;
using Lsw.Abp.AntDesignThemeManagement;
using Lsw.Abp.AntDesignUI;
using Volo.Abp.AspNetCore.Components.Web.Security;
using Volo.Abp.Modularity;
using Volo.Abp.UI.Navigation;
@ -7,6 +8,7 @@ namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme;
[DependsOn(
typeof(AbpAntDesignUIModule),
typeof(AbpAntDesignThemeManagementApplicationContractsModule),
typeof(AbpUiNavigationModule)
)]
public class AbpAspNetCoreComponentsWebAntDesignThemeModule : AbpModule

8
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Layout/AbpPageHeader.razor

@ -2,7 +2,7 @@
@inject IOptions<PageHeaderOptions> Options
<Row Class="ant-design-row-breadcrumb">
<Col Span="12">
<Col Span="12" Class="ant-design-page-breadcrumb-col">
<Breadcrumb Class="ant-design-breadcrumb">
@if (Options.Value.RenderBreadcrumbs && BreadcrumbItems.Any())
{
@ -26,17 +26,17 @@
</Breadcrumb>
</Col>
<Col Span="12">
<Col Span="12" Class="ant-design-page-toolbar-col">
@if (Options.Value.RenderToolbar)
{
<Row Justify="RowJustify.End">
<Row Class="ant-design-page-toolbar-row" Justify="RowJustify.End">
@if (Toolbar == null)
{
@ChildContent
}
@foreach (var toolbarItemRender in ToolbarItemRenders)
{
<div style="margin: 0 5px">
<div class="ant-design-page-toolbar-item">
@toolbarItemRender
</div>
}

1
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.csproj

@ -14,6 +14,7 @@
<ItemGroup>
<ProjectReference Include="..\..\..\src\Lsw.Abp.AntDesignUI\Lsw.Abp.AntDesignUI.csproj" />
<ProjectReference Include="..\..\AntDesignThemeManagement\Lsw.Abp.AntDesignThemeManagement.Application.Contracts\Lsw.Abp.AntDesignThemeManagement.Application.Contracts.csproj" />
</ItemGroup>

102
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Settings/AntDesignSettingsProvider.cs

@ -1,40 +1,96 @@
using System;
using System.Security.AccessControl;
using System;
using System.Threading.Tasks;
using AntDesign;
using AntDesign.Core.Helpers.MemberPath;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Options;
using Lsw.Abp.AntDesignThemeManagement;
using Lsw.Abp.AntDesignThemeManagement.Dtos;
using Lsw.Abp.AntDesignThemeManagement.Settings;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Settings;
using Volo.Abp.Users;
namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Settings;
public class AntDesignSettingsProvider : IAntDesignSettingsProvider, IScopedDependency
{
//TODO use SettingProvider instead of AbpAntDesignThemeOptions
// [Inject]
// protected ISettingProvider SettingProvider { get; set; }
[Inject]
public IOptions<AbpAntDesignThemeOptions> Options { get; set; }
public delegate Task AntDesignSettingChangedHandler();
public event AntDesignSettingChangedHandler SettingChanged;
public Task<MenuPlacement> GetMenuPlacementAsync()
protected IAntDesignThemePreferenceAppService ThemePreferenceAppService { get; }
protected ICurrentUser CurrentUser { get; }
public AntDesignSettingsProvider(
IAntDesignThemePreferenceAppService themePreferenceAppService,
ICurrentUser currentUser)
{
ThemePreferenceAppService = themePreferenceAppService;
CurrentUser = currentUser;
}
public event Func<Task>? SettingChanged;
public async Task<AntDesignThemePreferenceDto> GetPreferenceAsync()
{
if (!CurrentUser.IsAuthenticated)
{
return BuildDefaultPreference();
}
try
{
return await ThemePreferenceAppService.GetAsync();
}
catch
{
return BuildDefaultPreference();
}
}
public async Task<MenuPlacement> GetMenuPlacementAsync()
{
var setting = await GetPreferenceAsync();
return setting.NavigationMode == NavigationModes.Top
? MenuPlacement.Top
: MenuPlacement.Left;
}
public async Task<MenuTheme> GetMenuThemeAsync()
{
var setting = await GetPreferenceAsync();
return setting.ThemeStyle == ThemeStyles.Light
? MenuTheme.Light
: MenuTheme.Dark;
}
public async Task ApplyPreferenceAsync(UpdateAntDesignThemePreferenceDto input)
{
return Task.FromResult(Options.Value.Menu.Placement);
await ThemePreferenceAppService.UpdateAsync(input);
await TriggerSettingChangedAsync();
}
public Task<MenuTheme> GetMenuThemeAsync()
public Task TriggerSettingChangedAsync()
{
return Task.FromResult(Options.Value.Menu.Theme);
return SettingChanged?.Invoke() ?? Task.CompletedTask;
}
public Task TriggerSettingChanged()
protected virtual AntDesignThemePreferenceDto BuildDefaultPreference()
{
return SettingChanged?.Invoke();
return new AntDesignThemePreferenceDto
{
ThemeSettingsEnabled = AntDesignThemeSettingDefaults.EnableThemeSettings,
PageStyleSettingEnabled = AntDesignThemeSettingDefaults.EnablePageStyleSetting,
NavigationModeSettingEnabled = AntDesignThemeSettingDefaults.EnableNavigationModeSetting,
RegionalSettingsEnabled = AntDesignThemeSettingDefaults.EnableRegionalSettings,
OtherSettingsEnabled = AntDesignThemeSettingDefaults.EnableOtherSettings,
ThemeStyle = AntDesignThemeSettingDefaults.ThemeStyle,
NavigationMode = AntDesignThemeSettingDefaults.NavigationMode,
ContentWidth = AntDesignThemeSettingDefaults.ContentWidth,
FixedHeader = AntDesignThemeSettingDefaults.FixedHeader,
FixSiderbar = AntDesignThemeSettingDefaults.FixSiderbar,
SplitMenus = AntDesignThemeSettingDefaults.SplitMenus,
ShowHeader = AntDesignThemeSettingDefaults.ShowHeader,
ShowFooter = AntDesignThemeSettingDefaults.ShowFooter,
ShowMenu = AntDesignThemeSettingDefaults.ShowMenu,
ShowMenuHeader = AntDesignThemeSettingDefaults.ShowMenuHeader,
ColorWeak = AntDesignThemeSettingDefaults.ColorWeak
};
}
}

13
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Settings/IAntDesignSettingsProvider.cs

@ -1,16 +1,21 @@
using System;
using System;
using System.Threading.Tasks;
using AntDesign;
using Lsw.Abp.AntDesignThemeManagement.Dtos;
namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Settings;
public interface IAntDesignSettingsProvider
{
Task<AntDesignThemePreferenceDto> GetPreferenceAsync();
Task<MenuPlacement> GetMenuPlacementAsync();
Task<MenuTheme> GetMenuThemeAsync();
Task TriggerSettingChanged();
public event AntDesignSettingsProvider.AntDesignSettingChangedHandler SettingChanged;
Task ApplyPreferenceAsync(UpdateAntDesignThemePreferenceDto input);
Task TriggerSettingChangedAsync();
event Func<Task>? SettingChanged;
}

154
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/DefaultLayout.razor

@ -1,4 +1,4 @@
@inherits LayoutComponentBase
@inherits LayoutComponentBase
@using Microsoft.Extensions.Options
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Settings
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Components
@ -7,79 +7,123 @@
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Components.LayoutHooks
@inject IOptions<AbpAntDesignThemeOptions> Options
@if (Options.Value.Menu.Placement == MenuPlacement.Top)
@if (IsTopNavigation)
{
<Layout Class="ant-design-layout">
<Header Class="@HeaderClass">
<Branding/>
<MainMenu Placement="@MenuPlacement" Theme="@MenuTheme" Collapsed="@Collapsed"/>
<Row Justify="RowJustify.End">
<NavToolbar/>
</Row>
</Header>
<Layout Class="@LayoutClass">
@if (ShowHeader)
{
<Header Class="@HeaderClass">
@if (ShowMenuHeader)
{
<Branding />
}
@if (ShowMenu)
{
<MainMenu Placement="@MenuPlacement" Theme="@MenuTheme" Collapsed="@Collapsed" OnMenuItemClick="OnMainMenuItemClickAsync" />
}
<Row Justify="RowJustify.End">
<NavToolbar />
</Row>
</Header>
}
<Content Class="ant-design-content">
<PageAlert/>
<PageAlert />
<div class="ant-design-body-content">
<LayoutHook Name="@LayoutHooks.Body.First" Layout="@StandardLayouts.Application" />
@Body
<LayoutHook Name="@LayoutHooks.Body.Last" Layout="@StandardLayouts.Application" />
<div class="lsw-pro-page-container">
<LayoutHook Name="@LayoutHooks.Body.First" Layout="@StandardLayouts.Application" />
@Body
<LayoutHook Name="@LayoutHooks.Body.Last" Layout="@StandardLayouts.Application" />
</div>
</div>
<DynamicLayoutComponent />
<UiPageProgress/>
<UiPageProgress />
</Content>
<Footer Class="ant-design-footer"></Footer>
@if (ShowFooter)
{
<Footer Class="ant-design-footer"></Footer>
}
</Layout>
}
else
{
<Layout Class="ant-design-layout">
<Sider
Style="@SiderStyle"
Class="ant-design-side"
Theme="@SiderTheme"
Collapsible
NoTrigger
Collapsed=Collapsed>
<Branding Collapsed="@Collapsed"/>
<MainMenu Placement="@MenuPlacement" Theme="@MenuTheme" Collapsed="@Collapsed"/>
</Sider>
<Layout Class="@LayoutClass">
@if (ShowMenu)
{
<Sider
Style="@SiderStyle"
Class="@SiderClass"
Theme="@SiderTheme"
Collapsible
NoTrigger
Breakpoint="@BreakpointType.Lg"
CollapsedWidth="64"
OnBreakpoint="OnSiderBreakpointChanged"
Collapsed="@Collapsed">
@if (ShowMenuHeader)
{
<Branding Collapsed="@Collapsed" />
}
<MainMenu Placement="@MenuPlacement" Theme="@MenuTheme" Collapsed="@Collapsed" OnMenuItemClick="OnMainMenuItemClickAsync" />
</Sider>
@if (IsMobile && !Collapsed)
{
<div class="lsw-pro-mobile-sider-mask" @onclick="CloseMobileMenu"></div>
}
}
<Layout Class="ant-design-layout">
<Header Class="@HeaderClass">
<div style="float: left">
@if (Collapsed)
{
<Icon Type="menu-unfold" Theme="IconThemeType.Outline" Class="trigger" OnClick="OnCollapse"/>
}
else
@if (ShowHeader)
{
<Header Class="@HeaderClass">
@if (ShowMenu)
{
<Icon Type="menu-fold" Theme="IconThemeType.Outline" Class="trigger" OnClick="OnCollapse"/>
<div class="lsw-pro-header-trigger-wrapper">
@if (Collapsed)
{
<Icon Type="menu-unfold" Theme="IconThemeType.Outline" Class="trigger" OnClick="OnCollapse" />
}
else
{
<Icon Type="menu-fold" Theme="IconThemeType.Outline" Class="trigger" OnClick="OnCollapse" />
}
</div>
}
</div>
<Row Justify="RowJustify.End">
<NavToolbar/>
</Row>
</Header>
<Row Justify="RowJustify.End">
<NavToolbar />
</Row>
</Header>
}
<Content Class="ant-design-content">
<PageAlert/>
<PageAlert />
<div class="ant-design-body-content">
<LayoutHook Name="@LayoutHooks.Body.First" Layout="@StandardLayouts.Application" />
@if (!Options.Value.EnableMultipleTabs)
{
@Body
}
else
{
<ReuseTabs Class="ant-design-body-reusetabs" TabPaneClass="ant-design-body-reusetabs-tabpane" Draggable></ReuseTabs>
}
<LayoutHook Name="@LayoutHooks.Body.Last" Layout="@StandardLayouts.Application" />
<div class="lsw-pro-page-container">
<LayoutHook Name="@LayoutHooks.Body.First" Layout="@StandardLayouts.Application" />
@if (!Options.Value.EnableMultipleTabs)
{
@Body
}
else
{
<ReuseTabs Class="ant-design-body-reusetabs" TabPaneClass="ant-design-body-reusetabs-tabpane" Draggable></ReuseTabs>
}
<LayoutHook Name="@LayoutHooks.Body.Last" Layout="@StandardLayouts.Application" />
</div>
</div>
<DynamicLayoutComponent />
<UiPageProgress/>
<UiPageProgress />
</Content>
<Footer Class="ant-design-footer"></Footer>
@if (ShowFooter)
{
<Footer Class="ant-design-footer"></Footer>
}
</Layout>
</Layout>
}
<ThemeSettingPanel />

180
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/DefaultLayout.razor.cs

@ -1,14 +1,23 @@
using System.Threading.Tasks;
using System;
using System.Threading.Tasks;
using AntDesign;
using Lsw.Abp.AntDesignThemeManagement.Dtos;
using Lsw.Abp.AntDesignThemeManagement.Settings;
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Settings;
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Themes.AntDesignTheme;
public partial class DefaultLayout
public partial class DefaultLayout : IDisposable
{
protected const int MobileCollapsedSiderWidth = 64;
[Inject]
protected IAntDesignSettingsProvider AntDesignSettingsProvider { get; set; } = default!;
[Inject]
protected IAntDesignSettingsProvider AntDesignSettingsProvider { get; set; }
protected IJSRuntime JsRuntime { get; set; } = default!;
protected bool Collapsed { get; set; }
@ -16,37 +25,176 @@ public partial class DefaultLayout
protected MenuTheme MenuTheme { get; set; }
protected string HeaderClass { get; set; }
protected AntDesignThemePreferenceDto Preference { get; set; } = new();
protected string HeaderClass { get; set; } = string.Empty;
protected SiderTheme SiderTheme { get; set; }
protected string SiderStyle { get; set; } = "min-width:256px";
protected string SiderStyle { get; set; } = "min-width:256px;max-width:256px;width:256px;";
protected string SiderClass => IsMobile ? "ant-design-side lsw-pro-side-mobile" : "ant-design-side";
protected string LayoutClass { get; set; } = "ant-design-layout lsw-pro-theme lsw-pro-theme-light";
protected string ThemeBodyClass { get; set; } = "lsw-pro-theme lsw-pro-theme-light";
protected bool IsMobile { get; set; }
protected bool IsTopNavigation => MenuPlacement == MenuPlacement.Top;
protected bool ShowHeader => Preference.ShowHeader;
protected bool ShowFooter => Preference.ShowFooter;
protected bool ShowMenu => Preference.ShowMenu;
protected bool ShowMenuHeader => Preference.ShowMenu && Preference.ShowMenuHeader;
protected bool IsFixedContentWidth => Preference.ContentWidth == ContentWidths.Fixed;
protected override async Task OnInitializedAsync()
{
await SetLayout();
AntDesignSettingsProvider.SettingChanged += OnSettingChanged;
await SetLayoutAsync();
AntDesignSettingsProvider.SettingChanged += OnSettingChangedAsync;
}
protected virtual async Task OnSettingChanged()
protected virtual async Task OnSettingChangedAsync()
{
await SetLayout();
await SetLayoutAsync();
await InvokeAsync(StateHasChanged);
}
private async Task SetLayout()
protected override async Task OnAfterRenderAsync(bool firstRender)
{
MenuTheme = await AntDesignSettingsProvider.GetMenuThemeAsync();
MenuPlacement = await AntDesignSettingsProvider.GetMenuPlacementAsync();
try
{
await JsRuntime.InvokeVoidAsync("lswAntDesignThemeSettings.applyThemeClass", ThemeBodyClass);
}
catch
{
// Ignore transient script loading errors.
}
}
protected virtual async Task SetLayoutAsync()
{
Preference = await AntDesignSettingsProvider.GetPreferenceAsync();
MenuPlacement = Preference.NavigationMode == NavigationModes.Top
? MenuPlacement.Top
: MenuPlacement.Left;
MenuTheme = Preference.ThemeStyle == ThemeStyles.Light
? MenuTheme.Light
: MenuTheme.Dark;
SiderTheme = MenuTheme == MenuTheme.Light ? SiderTheme.Light : SiderTheme.Dark;
var headerBaseClass = IsTopNavigation ? "ant-design-header-top" : "ant-design-header-left";
var headerModeClass = MenuTheme == MenuTheme.Light ? $"{headerBaseClass}-light" : $"{headerBaseClass}-dark";
var fixedClass = Preference.FixedHeader ? "ant-design-header-fixed" : string.Empty;
HeaderClass = $"{headerBaseClass} {headerModeClass} {fixedClass}".Trim();
SiderTheme = MenuTheme == MenuTheme.Light ? SiderTheme.Light : SiderTheme.Dark;
HeaderClass = MenuPlacement == MenuPlacement.Top ? "ant-design-header-top" : "ant-design-header-left";
HeaderClass = MenuTheme == MenuTheme.Light ? $"{HeaderClass} {HeaderClass}-light" : HeaderClass;
LayoutClass = BuildLayoutClass();
ThemeBodyClass = BuildThemeBodyClass();
SiderStyle = BuildSiderStyle();
}
protected virtual void OnCollapse()
{
Collapsed = !Collapsed;
SiderStyle = Collapsed ? "" : "min-width:256px";
SiderStyle = BuildSiderStyle();
}
protected virtual Task OnSiderBreakpointChanged(bool broken)
{
IsMobile = broken;
if (broken)
{
Collapsed = true;
}
else if (Collapsed)
{
Collapsed = false;
}
SiderStyle = BuildSiderStyle();
return InvokeAsync(StateHasChanged);
}
protected virtual void CloseMobileMenu()
{
if (!IsMobile)
{
return;
}
Collapsed = true;
SiderStyle = BuildSiderStyle();
}
protected virtual Task OnMainMenuItemClickAsync()
{
if (IsMobile && !Collapsed)
{
Collapsed = true;
SiderStyle = BuildSiderStyle();
return InvokeAsync(StateHasChanged);
}
return Task.CompletedTask;
}
protected virtual string BuildLayoutClass()
{
var themeClass = GetThemeClass();
var weakClass = Preference.ColorWeak ? "colorWeak" : string.Empty;
var fixedContentClass = IsFixedContentWidth ? "lsw-pro-content-fixed" : "lsw-pro-content-fluid";
var navModeClass = IsTopNavigation ? "lsw-pro-nav-top" : "lsw-pro-nav-side";
return $"ant-design-layout lsw-pro-theme {themeClass} {weakClass} {fixedContentClass} {navModeClass}".Trim();
}
protected virtual string BuildThemeBodyClass()
{
var themeClass = GetThemeClass();
var weakClass = Preference.ColorWeak ? "colorWeak" : string.Empty;
return $"lsw-pro-theme {themeClass} {weakClass}".Trim();
}
protected virtual string GetThemeClass()
{
return Preference.ThemeStyle switch
{
ThemeStyles.Dark => "lsw-pro-theme-dark",
ThemeStyles.RealDark => "lsw-pro-theme-real-dark",
_ => "lsw-pro-theme-light"
};
}
protected virtual string BuildSiderStyle()
{
var width = Collapsed
? (IsMobile ? MobileCollapsedSiderWidth : 80)
: 256;
var mobileSiderStyle = IsMobile
? "position:fixed;left:0;top:0;height:100vh;overflow:auto;z-index:1310;"
: string.Empty;
var fixedSiderStyle = Preference.FixSiderbar
&& !IsMobile
? "position:sticky;top:0;height:100vh;overflow:auto;"
: string.Empty;
return $"min-width:{width}px;max-width:{width}px;width:{width}px;{mobileSiderStyle}{fixedSiderStyle}";
}
public void Dispose()
{
AntDesignSettingsProvider.SettingChanged -= OnSettingChangedAsync;
}
}

12
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/MainMenu.razor

@ -1,10 +1,16 @@
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Settings
<Menu Mode="@(Placement == MenuPlacement.Left? MenuMode.Inline: MenuMode.Horizontal)" Theme="@Theme" InlineCollapsed="@Collapsed">
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Settings
@inherits Volo.Abp.AspNetCore.Components.AbpComponentBase
<Menu @key="MenuRenderKey"
Mode="@MenuMode"
Theme="@Theme"
InlineCollapsed="@InlineCollapsedValue"
AutoCloseDropdown="true"
TriggerSubMenuAction="@TriggerSubMenuAction">
@if (Menu != null)
{
foreach (var menu in Menu.Items)
{
<MainMenuItem Menu="@menu"></MainMenuItem>
<MainMenuItem Menu="@menu" OnItemClick="OnMenuItemClickedAsync"></MainMenuItem>
}
}
</Menu>

70
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/MainMenu.razor.cs

@ -1,38 +1,55 @@
using System;
using System;
using System.Threading.Tasks;
using AntDesign;
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Settings;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.Components;
using Volo.Abp.AspNetCore.Components.Web.Security;
using Volo.Abp.UI.Navigation;
namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Themes.AntDesignTheme;
public partial class MainMenu : IDisposable
public partial class MainMenu : AbpComponentBase, IDisposable
{
protected ApplicationMenu Menu { get; set; }
protected ApplicationMenu Menu { get; set; } = default!;
[Inject]
protected IMenuManager MenuManager { get; set; }
protected IMenuManager MenuManager { get; set; } = default!;
[Inject]
protected ApplicationConfigurationChangedService ApplicationConfigurationChangedService { get; set; }
protected ApplicationConfigurationChangedService ApplicationConfigurationChangedService { get; set; } = default!;
[Parameter]
public MenuPlacement Placement { get; set; }
[Parameter]
public MenuTheme Theme { get; set; }
[Parameter]
public bool Collapsed { get; set; }
[Parameter]
public EventCallback OnMenuItemClick { get; set; }
protected string MenuRenderKey { get; set; } = $"lsw-main-menu-{Guid.NewGuid():N}";
protected MenuMode MenuMode => Placement == MenuPlacement.Left ? MenuMode.Inline : MenuMode.Horizontal;
protected bool InlineCollapsedValue => Placement == MenuPlacement.Left && Collapsed;
protected Trigger TriggerSubMenuAction => Placement == MenuPlacement.Top ? Trigger.Click : Trigger.Hover;
protected override async Task OnInitializedAsync()
{
await GetMenuAsync();
ApplicationConfigurationChangedService.Changed += ApplicationConfigurationChanged;
try
{
await GetMenuAsync();
ApplicationConfigurationChangedService.Changed += ApplicationConfigurationChanged;
}
catch (Exception ex)
{
await HandleErrorAsync(ex);
}
}
private async Task GetMenuAsync()
@ -42,8 +59,29 @@ public partial class MainMenu : IDisposable
private async void ApplicationConfigurationChanged()
{
await GetMenuAsync();
await InvokeAsync(StateHasChanged);
try
{
await GetMenuAsync();
await InvokeAsync(StateHasChanged);
}
catch (Exception ex)
{
await HandleErrorAsync(ex);
}
}
protected virtual async Task OnMenuItemClickedAsync()
{
if (Placement == MenuPlacement.Top)
{
// Force-close any opened top-mode dropdowns once an item is clicked.
MenuRenderKey = $"lsw-main-menu-{Guid.NewGuid():N}";
}
if (OnMenuItemClick.HasDelegate)
{
await OnMenuItemClick.InvokeAsync();
}
}
public void Dispose()

10
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/MainMenuItem.razor

@ -1,4 +1,4 @@
@using Volo.Abp.UI.Navigation
@using Volo.Abp.UI.Navigation
@if (Menu != null)
{
@ -7,7 +7,10 @@
if (Menu.IsLeaf && Menu.Url != null)
{
<MenuItem Key="@elementId" RouterLink="@url" Disabled="@Menu.IsDisabled">
<MenuItem Key="@elementId"
RouterLink="@url"
Disabled="@Menu.IsDisabled"
OnClick="OnClickAsync">
@if (!Menu.Icon.IsNullOrWhiteSpace())
{
<Icon Type="@Menu.Icon" Theme="IconThemeType.Outline"></Icon>
@ -20,14 +23,13 @@
<SubMenu Title="@Menu.DisplayName" TitleTemplate="@GetSubMenuTemplate(Menu)" Key="@elementId">
@foreach (var menuItem in Menu.Items)
{
<MainMenuItem Menu="@menuItem"></MainMenuItem>
<MainMenuItem Menu="@menuItem" OnItemClick="OnItemClick"></MainMenuItem>
}
</SubMenu>
}
}
@{
RenderFragment GetSubMenuTemplate(ApplicationMenuItem menu)
{
return @<span>

15
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/MainMenuItem.razor.cs

@ -1,4 +1,5 @@
using AntDesign;
using System.Threading.Tasks;
using AntDesign;
using Microsoft.AspNetCore.Components;
using Volo.Abp.UI.Navigation;
@ -7,5 +8,15 @@ namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Themes.AntDesignTheme
public partial class MainMenuItem : ComponentBase
{
[Parameter]
public ApplicationMenuItem Menu { get; set; }
public ApplicationMenuItem Menu { get; set; } = default!;
[Parameter]
public EventCallback OnItemClick { get; set; }
protected virtual Task OnClickAsync()
{
return OnItemClick.HasDelegate
? OnItemClick.InvokeAsync()
: Task.CompletedTask;
}
}

3
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/NavToolbar.razor

@ -1,4 +1,5 @@
@foreach (var render in ToolbarItemRenders)
@inherits Volo.Abp.AspNetCore.Components.AbpComponentBase
@foreach (var render in ToolbarItemRenders)
{
@render
}

25
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/NavToolbar.razor.cs

@ -3,11 +3,12 @@ using System.Collections.Generic;
using System.Threading.Tasks;
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Toolbars;
using Microsoft.AspNetCore.Components;
using Volo.Abp.AspNetCore.Components;
using Volo.Abp.AspNetCore.Components.Web.Security;
namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Themes.AntDesignTheme;
public partial class NavToolbar : IDisposable
public partial class NavToolbar : AbpComponentBase, IDisposable
{
[Inject]
private IToolbarManager ToolbarManager { get; set; }
@ -19,8 +20,15 @@ public partial class NavToolbar : IDisposable
protected override async Task OnInitializedAsync()
{
await GetToolbarItemRendersAsync();
ApplicationConfigurationChangedService.Changed += ApplicationConfigurationChanged;
try
{
await GetToolbarItemRendersAsync();
ApplicationConfigurationChangedService.Changed += ApplicationConfigurationChanged;
}
catch (Exception ex)
{
await HandleErrorAsync(ex);
}
}
private async Task GetToolbarItemRendersAsync()
@ -42,8 +50,15 @@ public partial class NavToolbar : IDisposable
private async void ApplicationConfigurationChanged()
{
await GetToolbarItemRendersAsync();
await InvokeAsync(StateHasChanged);
try
{
await GetToolbarItemRendersAsync();
await InvokeAsync(StateHasChanged);
}
catch (Exception ex)
{
await HandleErrorAsync(ex);
}
}
public void Dispose()

147
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/ThemeSettingPanel.razor

@ -0,0 +1,147 @@
@using Lsw.Abp.AntDesignThemeManagement.Settings
@inherits Volo.Abp.AspNetCore.Components.AbpComponentBase
@if (IsVisible)
{
<div id="@HostId"
class="@FloatingButtonClass"
role="button"
tabindex="0"
aria-label="@ThemeL["ThemeSettings"]"
@onclick="TogglePanel"
@onkeydown="OnFabKeyDownAsync">
<span class="lsw-theme-setting-fab-handle lsw-theme-setting-fab-icon" aria-hidden="true">
<Icon Type="setting" Theme="IconThemeType.Outline" />
</span>
</div>
<div class="lsw-theme-setting-mask @(PanelVisible ? "is-open" : string.Empty)" @onclick="ClosePanel"></div>
<aside class="lsw-theme-setting-panel @(PanelVisible ? "is-open" : string.Empty)" tabindex="0">
<div class="lsw-theme-setting-panel-header">
<h3>@ThemeL["ThemeSettings"]</h3>
<button type="button" class="lsw-theme-setting-close" @onclick="ClosePanel" aria-label="Close">
<Icon Type="close" Theme="IconThemeType.Outline" />
</button>
</div>
<div class="lsw-theme-setting-panel-body">
@if (Preference.PageStyleSettingEnabled)
{
<section class="lsw-theme-setting-section">
<h4>@ThemeL["PageStyleSetting"]</h4>
<div class="lsw-theme-style-grid">
@foreach (var style in ThemeStyleOptions)
{
<button
type="button"
class="lsw-theme-style-option @(Preference.ThemeStyle == style.Value ? "active" : string.Empty)"
@onclick="() => SetThemeStyleAsync(style.Value)">
<span class="lsw-theme-style-preview @style.CssClass"></span>
<span class="lsw-theme-style-label">@ThemeL[style.LocalizationKey]</span>
</button>
}
</div>
</section>
}
@if (Preference.NavigationModeSettingEnabled)
{
<section class="lsw-theme-setting-section">
<h4>@ThemeL["NavigationMode"]</h4>
<div class="lsw-theme-style-grid lsw-theme-style-grid-nav">
@foreach (var nav in NavigationOptions)
{
<button
type="button"
class="lsw-theme-style-option @(Preference.NavigationMode == nav.Value ? "active" : string.Empty)"
@onclick="() => SetNavigationModeAsync(nav.Value)">
<span class="lsw-theme-style-preview @nav.CssClass"></span>
<span class="lsw-theme-style-label">@ThemeL[nav.LocalizationKey]</span>
</button>
}
</div>
</section>
<section class="lsw-theme-setting-section">
<div class="lsw-theme-setting-item">
<span>@ThemeL["ContentWidth"]</span>
<select class="lsw-theme-setting-select" value="@Preference.ContentWidth" @onchange="OnContentWidthChangedAsync">
<option value="@ContentWidths.Fluid">@ThemeL["Fluid"]</option>
<option value="@ContentWidths.Fixed">@ThemeL["Fixed"]</option>
</select>
</div>
<div class="lsw-theme-setting-item">
<span>@ThemeL["FixedHeader"]</span>
<label class="lsw-theme-setting-switch">
<input type="checkbox" checked="@Preference.FixedHeader" @onchange="OnFixedHeaderChangedAsync" />
<span></span>
</label>
</div>
<div class="lsw-theme-setting-item">
<span>@ThemeL["WorksOnSideMenuLayout"]</span>
<label class="lsw-theme-setting-switch">
<input type="checkbox" checked="@Preference.FixSiderbar" @onchange="OnFixedSiderbarChangedAsync" />
<span></span>
</label>
</div>
<div class="lsw-theme-setting-item">
<span>@ThemeL["SplitMenus"]</span>
<label class="lsw-theme-setting-switch">
<input type="checkbox" checked="@Preference.SplitMenus" @onchange="OnSplitMenusChangedAsync" />
<span></span>
</label>
</div>
</section>
}
@if (Preference.RegionalSettingsEnabled)
{
<section class="lsw-theme-setting-section">
<h4>@ThemeL["RegionalSettings"]</h4>
<div class="lsw-theme-setting-item">
<span>@ThemeL["Header"]</span>
<label class="lsw-theme-setting-switch">
<input type="checkbox" checked="@Preference.ShowHeader" @onchange="OnShowHeaderChangedAsync" />
<span></span>
</label>
</div>
<div class="lsw-theme-setting-item">
<span>@ThemeL["Footer"]</span>
<label class="lsw-theme-setting-switch">
<input type="checkbox" checked="@Preference.ShowFooter" @onchange="OnShowFooterChangedAsync" />
<span></span>
</label>
</div>
<div class="lsw-theme-setting-item">
<span>@ThemeL["Menu"]</span>
<label class="lsw-theme-setting-switch">
<input type="checkbox" checked="@Preference.ShowMenu" @onchange="OnShowMenuChangedAsync" />
<span></span>
</label>
</div>
<div class="lsw-theme-setting-item">
<span>@ThemeL["MenuHeader"]</span>
<label class="lsw-theme-setting-switch">
<input type="checkbox" checked="@Preference.ShowMenuHeader" @onchange="OnShowMenuHeaderChangedAsync" />
<span></span>
</label>
</div>
</section>
}
@if (Preference.OtherSettingsEnabled)
{
<section class="lsw-theme-setting-section">
<h4>@ThemeL["OtherSettings"]</h4>
<div class="lsw-theme-setting-item">
<span>@ThemeL["WeakMode"]</span>
<label class="lsw-theme-setting-switch">
<input type="checkbox" checked="@Preference.ColorWeak" @onchange="OnColorWeakChangedAsync" />
<span></span>
</label>
</div>
</section>
}
</div>
</aside>
}

281
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/ThemeSettingPanel.razor.cs

@ -0,0 +1,281 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Lsw.Abp.AntDesignThemeManagement.Dtos;
using Lsw.Abp.AntDesignThemeManagement.Localization;
using Lsw.Abp.AntDesignThemeManagement.Settings;
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Settings;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.Extensions.Localization;
using Microsoft.JSInterop;
using Volo.Abp.Users;
namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Themes.AntDesignTheme;
public partial class ThemeSettingPanel : IAsyncDisposable
{
[Inject]
protected IStringLocalizer<AntDesignThemeManagementResource> ThemeL { get; set; } = default!;
[Inject]
protected IAntDesignSettingsProvider AntDesignSettingsProvider { get; set; } = default!;
[Inject]
protected IJSRuntime JsRuntime { get; set; } = default!;
protected bool PanelVisible { get; set; }
protected bool IsVisible { get; set; }
protected AntDesignThemePreferenceDto Preference { get; set; } = new();
protected string HostId { get; } = $"lsw-theme-settings-fab-{Guid.NewGuid():N}";
protected string FloatingButtonClass =>
$"lsw-theme-setting-fab {(PanelVisible ? "lsw-theme-setting-fab-active" : string.Empty)}".Trim();
private bool _isSubscribedToSettingChanged;
private bool _jsInitialized;
protected IReadOnlyList<OptionItem> ThemeStyleOptions { get; } = new[]
{
new OptionItem(ThemeStyles.Light, "Light", "lsw-theme-preview-light"),
new OptionItem(ThemeStyles.Dark, "Dark", "lsw-theme-preview-dark"),
new OptionItem(ThemeStyles.RealDark, "RealDark", "lsw-theme-preview-real-dark")
};
protected IReadOnlyList<OptionItem> NavigationOptions { get; } = new[]
{
new OptionItem(NavigationModes.Side, "Side", "lsw-theme-preview-nav-side"),
new OptionItem(NavigationModes.Top, "Top", "lsw-theme-preview-nav-top")
};
protected override async Task OnInitializedAsync()
{
try
{
if (!CurrentUser.IsAuthenticated)
{
IsVisible = false;
return;
}
AntDesignSettingsProvider.SettingChanged += OnSettingChangedAsync;
_isSubscribedToSettingChanged = true;
Preference = await AntDesignSettingsProvider.GetPreferenceAsync();
IsVisible = Preference.ThemeSettingsEnabled;
}
catch (Exception ex)
{
await HandleErrorAsync(ex);
IsVisible = false;
}
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (!IsVisible || _jsInitialized)
{
return;
}
try
{
await JsRuntime.InvokeVoidAsync("lswAntDesignThemeSettings.initialize", HostId);
_jsInitialized = true;
}
catch (Exception ex)
{
await HandleErrorAsync(ex);
}
}
protected virtual Task TogglePanel()
{
PanelVisible = !PanelVisible;
return Task.CompletedTask;
}
protected virtual Task OnFabKeyDownAsync(KeyboardEventArgs args)
{
if (args.Key is "Enter" or " ")
{
return TogglePanel();
}
return Task.CompletedTask;
}
protected virtual Task ClosePanel()
{
PanelVisible = false;
return Task.CompletedTask;
}
protected virtual async Task SetThemeStyleAsync(string style)
{
Preference.ThemeStyle = style;
await SaveAsync();
}
protected virtual async Task SetNavigationModeAsync(string mode)
{
var previousMode = Preference.NavigationMode;
Preference.NavigationMode = mode;
await SaveAsync();
if (Preference.NavigationMode != mode)
{
Preference.NavigationMode = previousMode;
}
}
protected virtual async Task OnContentWidthChangedAsync(ChangeEventArgs args)
{
Preference.ContentWidth = args.Value?.ToString() ?? ContentWidths.Fluid;
await SaveAsync();
}
protected virtual async Task OnFixedHeaderChangedAsync(ChangeEventArgs args)
{
Preference.FixedHeader = ReadBoolean(args);
await SaveAsync();
}
protected virtual async Task OnFixedSiderbarChangedAsync(ChangeEventArgs args)
{
Preference.FixSiderbar = ReadBoolean(args);
await SaveAsync();
}
protected virtual async Task OnSplitMenusChangedAsync(ChangeEventArgs args)
{
Preference.SplitMenus = ReadBoolean(args);
await SaveAsync();
}
protected virtual async Task OnShowHeaderChangedAsync(ChangeEventArgs args)
{
Preference.ShowHeader = ReadBoolean(args);
await SaveAsync();
}
protected virtual async Task OnShowFooterChangedAsync(ChangeEventArgs args)
{
Preference.ShowFooter = ReadBoolean(args);
await SaveAsync();
}
protected virtual async Task OnShowMenuChangedAsync(ChangeEventArgs args)
{
Preference.ShowMenu = ReadBoolean(args);
await SaveAsync();
}
protected virtual async Task OnShowMenuHeaderChangedAsync(ChangeEventArgs args)
{
Preference.ShowMenuHeader = ReadBoolean(args);
await SaveAsync();
}
protected virtual async Task OnColorWeakChangedAsync(ChangeEventArgs args)
{
Preference.ColorWeak = ReadBoolean(args);
await SaveAsync();
}
protected virtual bool ReadBoolean(ChangeEventArgs args)
{
return args.Value switch
{
bool boolValue => boolValue,
string stringValue when bool.TryParse(stringValue, out var result) => result,
_ => false
};
}
protected virtual async Task SaveAsync()
{
try
{
await AntDesignSettingsProvider.ApplyPreferenceAsync(new UpdateAntDesignThemePreferenceDto
{
ThemeStyle = Preference.ThemeStyle,
NavigationMode = Preference.NavigationMode,
ContentWidth = Preference.ContentWidth,
FixedHeader = Preference.FixedHeader,
FixSiderbar = Preference.FixSiderbar,
SplitMenus = Preference.SplitMenus,
ShowHeader = Preference.ShowHeader,
ShowFooter = Preference.ShowFooter,
ShowMenu = Preference.ShowMenu,
ShowMenuHeader = Preference.ShowMenuHeader,
ColorWeak = Preference.ColorWeak
});
}
catch (Exception ex)
{
await HandleErrorAsync(ex);
try
{
Preference = await AntDesignSettingsProvider.GetPreferenceAsync();
}
catch
{
// Intentionally ignored to keep the panel responsive even if reloading fails.
}
await InvokeAsync(StateHasChanged);
}
}
protected virtual async Task OnSettingChangedAsync()
{
try
{
if (!CurrentUser.IsAuthenticated)
{
return;
}
Preference = await AntDesignSettingsProvider.GetPreferenceAsync();
IsVisible = Preference.ThemeSettingsEnabled;
if (!IsVisible)
{
PanelVisible = false;
}
else
{
_jsInitialized = false;
}
await InvokeAsync(StateHasChanged);
}
catch (Exception ex)
{
await HandleErrorAsync(ex);
}
}
public async ValueTask DisposeAsync()
{
if (_isSubscribedToSettingChanged)
{
AntDesignSettingsProvider.SettingChanged -= OnSettingChangedAsync;
_isSubscribedToSettingChanged = false;
}
try
{
await JsRuntime.InvokeVoidAsync("lswAntDesignThemeSettings.dispose", HostId);
}
catch
{
// Ignore disposal errors when the JS runtime is no longer available.
}
}
protected record OptionItem(string Value, string LocalizationKey, string CssClass);
}

1039
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/wwwroot/libs/abp/css/theme.css

File diff suppressed because it is too large

200
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/wwwroot/libs/abp/js/theme-settings.js

@ -0,0 +1,200 @@
(function () {
if (!window.lswAntDesignThemeSettings) {
window.lswAntDesignThemeSettings = {};
}
const registry = {};
const themeClasses = [
"lsw-pro-theme",
"lsw-pro-theme-light",
"lsw-pro-theme-dark",
"lsw-pro-theme-real-dark",
"colorWeak"
];
function clamp(value, min, max) {
return Math.min(Math.max(value, min), max);
}
function clearFadeTimer(state) {
if (state.fadeTimer) {
window.clearTimeout(state.fadeTimer);
state.fadeTimer = null;
}
}
function scheduleFade(state) {
clearFadeTimer(state);
state.fadeTimer = window.setTimeout(() => {
if (!state.host.classList.contains("lsw-theme-setting-fab-active")) {
state.host.classList.add("lsw-theme-setting-fab-faded");
}
}, 1200);
}
function snapToRight(state, keepTop) {
const host = state.host;
const rect = host.getBoundingClientRect();
const width = rect.width || 48;
const top = keepTop ? rect.top : window.innerHeight * 0.6;
const clampedTop = clamp(top, 24, window.innerHeight - rect.height - 24);
host.style.left = "";
host.style.right = `${Math.round(-width / 2)}px`;
host.style.top = `${Math.round(clampedTop)}px`;
}
function initialize(id) {
const host = document.getElementById(id);
if (!host || registry[id]) {
return;
}
const handle = host;
const state = {
host: host,
pointerId: null,
startX: 0,
startY: 0,
originX: 0,
originY: 0,
moved: false,
fadeTimer: null
};
const onPointerDown = function (evt) {
state.pointerId = evt.pointerId;
state.startX = evt.clientX;
state.startY = evt.clientY;
const rect = host.getBoundingClientRect();
state.originX = rect.left;
state.originY = rect.top;
state.moved = false;
host.classList.remove("lsw-theme-setting-fab-faded");
clearFadeTimer(state);
handle.setPointerCapture(evt.pointerId);
};
const onPointerMove = function (evt) {
if (state.pointerId !== evt.pointerId) {
return;
}
const dx = evt.clientX - state.startX;
const dy = evt.clientY - state.startY;
if (Math.abs(dx) > 3 || Math.abs(dy) > 3) {
state.moved = true;
}
if (!state.moved) {
return;
}
const rect = host.getBoundingClientRect();
const nextLeft = clamp(state.originX + dx, 0, window.innerWidth - rect.width);
const nextTop = clamp(state.originY + dy, 24, window.innerHeight - rect.height - 24);
host.style.right = "";
host.style.left = `${Math.round(nextLeft)}px`;
host.style.top = `${Math.round(nextTop)}px`;
};
const onPointerUp = function (evt) {
if (state.pointerId !== evt.pointerId) {
return;
}
state.pointerId = null;
if (state.moved) {
snapToRight(state, true);
}
scheduleFade(state);
};
const onMouseEnter = function () {
host.classList.remove("lsw-theme-setting-fab-faded");
clearFadeTimer(state);
};
const onMouseLeave = function () {
scheduleFade(state);
};
const onWindowBlur = function () {
if (!host.classList.contains("lsw-theme-setting-fab-active")) {
host.classList.add("lsw-theme-setting-fab-faded");
}
};
const onWindowFocus = function () {
host.classList.remove("lsw-theme-setting-fab-faded");
};
handle.addEventListener("pointerdown", onPointerDown);
handle.addEventListener("pointermove", onPointerMove);
handle.addEventListener("pointerup", onPointerUp);
handle.addEventListener("pointercancel", onPointerUp);
host.addEventListener("mouseenter", onMouseEnter);
host.addEventListener("mouseleave", onMouseLeave);
window.addEventListener("blur", onWindowBlur);
window.addEventListener("focus", onWindowFocus);
registry[id] = {
state: state,
onPointerDown: onPointerDown,
onPointerMove: onPointerMove,
onPointerUp: onPointerUp,
onMouseEnter: onMouseEnter,
onMouseLeave: onMouseLeave,
onWindowBlur: onWindowBlur,
onWindowFocus: onWindowFocus
};
snapToRight(state, false);
scheduleFade(state);
}
function dispose(id) {
const entry = registry[id];
if (!entry) {
return;
}
const host = entry.state.host;
const handle = host;
if (handle) {
handle.removeEventListener("pointerdown", entry.onPointerDown);
handle.removeEventListener("pointermove", entry.onPointerMove);
handle.removeEventListener("pointerup", entry.onPointerUp);
handle.removeEventListener("pointercancel", entry.onPointerUp);
}
host.removeEventListener("mouseenter", entry.onMouseEnter);
host.removeEventListener("mouseleave", entry.onMouseLeave);
window.removeEventListener("blur", entry.onWindowBlur);
window.removeEventListener("focus", entry.onWindowFocus);
clearFadeTimer(entry.state);
delete registry[id];
}
function applyThemeClass(themeClass) {
const body = document.body;
if (!body) {
return;
}
themeClasses.forEach((name) => body.classList.remove(name));
if (themeClass && typeof themeClass === "string") {
themeClass.split(" ")
.map((item) => item.trim())
.filter((item) => item.length > 0)
.forEach((item) => body.classList.add(item));
}
}
window.lswAntDesignThemeSettings.initialize = initialize;
window.lswAntDesignThemeSettings.dispose = dispose;
window.lswAntDesignThemeSettings.applyThemeClass = applyThemeClass;
})();

3
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.Bundling/BlazorWebAssemblyAntDesignThemeScriptContributor.cs

@ -8,5 +8,6 @@ public class BlazorWebAssemblyAntDesignThemeScriptContributor: BundleContributor
public override void ConfigureBundle(BundleConfigurationContext context)
{
context.Files.AddIfNotContains("_content/AntDesign/js/ant-design-blazor.js");
context.Files.AddIfNotContains("_content/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/libs/abp/js/theme-settings.js");
}
}
}

1
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/ComponentsComponentsBundleContributor.cs

@ -10,6 +10,7 @@ public class ComponentsComponentsBundleContributor : IBundleContributor
context.Add("_content/Volo.Abp.AspNetCore.Components.Web/libs/abp/js/abp.js");
context.Add("_content/Volo.Abp.AspNetCore.Components.Web/libs/abp/js/lang-utils.js");
context.Add("_content/AntDesign/js/ant-design-blazor.js");
context.Add("_content/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/libs/abp/js/theme-settings.js");
}
public void AddStyles(BundleContext context)

2
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/LanguageSwitch.razor

@ -20,7 +20,7 @@
</Overlay>
<ChildContent>
<a class="ant-dropdown-link" @onclick:preventDefault>
@_currentLanguage.DisplayName <Icon Type="down" />
<Icon Type="global" Theme="IconThemeType.Outline" /> @_currentLanguage.DisplayName <Icon Type="down" />
</a>
</ChildContent>
</Dropdown>

31
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/AbpAntDesignThemeManagementApplicationContractsModule.cs

@ -0,0 +1,31 @@
using Lsw.Abp.AntDesignThemeManagement.Localization;
using Lsw.Abp.AntDesignThemeManagement.Settings;
using Volo.Abp.Authorization;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.SettingManagement;
using Volo.Abp.VirtualFileSystem;
namespace Lsw.Abp.AntDesignThemeManagement;
[DependsOn(
typeof(AbpAuthorizationModule),
typeof(AbpSettingManagementApplicationContractsModule)
)]
public class AbpAntDesignThemeManagementApplicationContractsModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpAntDesignThemeManagementApplicationContractsModule>();
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<AntDesignThemeManagementResource>("en")
.AddVirtualJson("/Localization/Resources/AntDesignThemeManagement");
});
}
}

22
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Dtos/AntDesignThemePreferenceDto.cs

@ -0,0 +1,22 @@
namespace Lsw.Abp.AntDesignThemeManagement.Dtos;
public class AntDesignThemePreferenceDto
{
public bool ThemeSettingsEnabled { get; set; }
public bool PageStyleSettingEnabled { get; set; }
public bool NavigationModeSettingEnabled { get; set; }
public bool RegionalSettingsEnabled { get; set; }
public bool OtherSettingsEnabled { get; set; }
public string ThemeStyle { get; set; } = string.Empty;
public string NavigationMode { get; set; } = string.Empty;
public string ContentWidth { get; set; } = string.Empty;
public bool FixedHeader { get; set; }
public bool FixSiderbar { get; set; }
public bool SplitMenus { get; set; }
public bool ShowHeader { get; set; }
public bool ShowFooter { get; set; }
public bool ShowMenu { get; set; }
public bool ShowMenuHeader { get; set; }
public bool ColorWeak { get; set; }
}

16
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Dtos/UpdateAntDesignThemePreferenceDto.cs

@ -0,0 +1,16 @@
namespace Lsw.Abp.AntDesignThemeManagement.Dtos;
public class UpdateAntDesignThemePreferenceDto
{
public string ThemeStyle { get; set; } = string.Empty;
public string NavigationMode { get; set; } = string.Empty;
public string ContentWidth { get; set; } = string.Empty;
public bool FixedHeader { get; set; }
public bool FixSiderbar { get; set; }
public bool SplitMenus { get; set; }
public bool ShowHeader { get; set; }
public bool ShowFooter { get; set; }
public bool ShowMenu { get; set; }
public bool ShowMenuHeader { get; set; }
public bool ColorWeak { get; set; }
}

10
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Dtos/UpdateAntDesignThemeSettingsAvailabilityDto.cs

@ -0,0 +1,10 @@
namespace Lsw.Abp.AntDesignThemeManagement.Dtos;
public class UpdateAntDesignThemeSettingsAvailabilityDto
{
public bool ThemeSettingsEnabled { get; set; }
public bool PageStyleSettingEnabled { get; set; }
public bool NavigationModeSettingEnabled { get; set; }
public bool RegionalSettingsEnabled { get; set; }
public bool OtherSettingsEnabled { get; set; }
}

3
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/FodyWeavers.xml

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

16
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/IAntDesignThemePreferenceAppService.cs

@ -0,0 +1,16 @@
using System.Threading.Tasks;
using Lsw.Abp.AntDesignThemeManagement.Dtos;
using Volo.Abp.Application.Services;
namespace Lsw.Abp.AntDesignThemeManagement;
public interface IAntDesignThemePreferenceAppService : IApplicationService
{
Task<AntDesignThemePreferenceDto> GetAsync();
Task UpdateAsync(UpdateAntDesignThemePreferenceDto input);
Task UpdateThemeSettingsAvailabilityAsync(UpdateAntDesignThemeSettingsAvailabilityDto input);
Task SetThemeSettingsEnabledAsync(bool isEnabled);
}

8
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Localization/AntDesignThemeManagementResource.cs

@ -0,0 +1,8 @@
using Volo.Abp.Localization;
namespace Lsw.Abp.AntDesignThemeManagement.Localization;
[LocalizationResourceName("AntDesignThemeManagement")]
public class AntDesignThemeManagementResource
{
}

48
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Localization/Resources/AntDesignThemeManagement/en.json

@ -0,0 +1,48 @@
{
"culture": "en",
"texts": {
"Permission:AntDesignThemeManagement": "Ant Design theme management",
"Permission:AntDesignThemeManagement.Settings": "Manage theme settings switch",
"ThemeSettings": "Theme settings",
"PageStyleSetting": "Page style setting",
"NavigationMode": "Navigation mode",
"ContentWidth": "Content width",
"FixedHeader": "Fixed header",
"WorksOnSideMenuLayout": "Works on side menu layout",
"SplitMenus": "Split menus",
"RegionalSettings": "Regional settings",
"Header": "Header",
"Footer": "Footer",
"Menu": "Menu",
"MenuHeader": "Menu header",
"OtherSettings": "Other settings",
"WeakMode": "Weak mode",
"Light": "Light",
"Dark": "Menu dark",
"RealDark": "Real dark",
"Side": "Side",
"Top": "Top",
"Mix": "Mix",
"Fluid": "Fluid",
"Fixed": "Fixed",
"Submit": "Submit",
"Menu:ThemeSettingsManagement": "Theme settings management",
"SavedSuccessfully": "Saved successfully.",
"Settings:EnableThemeSettings": "Enable theme settings",
"Settings:PageStyleSetting": "Page style setting",
"Settings:NavigationModeSetting": "Navigation mode",
"Settings:RegionalSettings": "Regional settings",
"Settings:OtherSettings": "Other settings",
"Settings:ThemeStyle": "Theme style",
"Settings:NavigationMode": "Navigation mode",
"Settings:ContentWidth": "Content width",
"Settings:FixedHeader": "Fixed header",
"Settings:FixSiderbar": "Fix siderbar",
"Settings:SplitMenus": "Split menus",
"Settings:ShowHeader": "Show header",
"Settings:ShowFooter": "Show footer",
"Settings:ShowMenu": "Show menu",
"Settings:ShowMenuHeader": "Show menu header",
"Settings:ColorWeak": "Weak mode"
}
}

48
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Localization/Resources/AntDesignThemeManagement/zh-Hans.json

@ -0,0 +1,48 @@
{
"culture": "zh-Hans",
"texts": {
"Permission:AntDesignThemeManagement": "AntDesign 主题管理",
"Permission:AntDesignThemeManagement.Settings": "管理主题设置开关",
"ThemeSettings": "主题设置",
"PageStyleSetting": "页面风格设置",
"NavigationMode": "导航模式",
"ContentWidth": "内容宽度",
"FixedHeader": "固定 Header",
"WorksOnSideMenuLayout": "侧边菜单布局生效",
"SplitMenus": "分割菜单",
"RegionalSettings": "区域设置",
"Header": "页头",
"Footer": "页脚",
"Menu": "菜单",
"MenuHeader": "菜单头",
"OtherSettings": "其他设置",
"WeakMode": "色弱模式",
"Light": "明亮",
"Dark": "菜单深色",
"RealDark": "深邃暗色",
"Side": "侧边",
"Top": "顶部",
"Mix": "混合",
"Fluid": "自适应",
"Fixed": "定宽",
"Submit": "提交",
"Menu:ThemeSettingsManagement": "主题设置管理",
"SavedSuccessfully": "保存成功。",
"Settings:EnableThemeSettings": "启用主题设置",
"Settings:PageStyleSetting": "页面风格设置",
"Settings:NavigationModeSetting": "导航模式",
"Settings:RegionalSettings": "区域设置",
"Settings:OtherSettings": "其他设置",
"Settings:ThemeStyle": "主题风格",
"Settings:NavigationMode": "导航模式",
"Settings:ContentWidth": "内容宽度",
"Settings:FixedHeader": "固定 Header",
"Settings:FixSiderbar": "固定侧边栏",
"Settings:SplitMenus": "分割菜单",
"Settings:ShowHeader": "显示页头",
"Settings:ShowFooter": "显示页脚",
"Settings:ShowMenu": "显示菜单",
"Settings:ShowMenuHeader": "显示菜单头",
"Settings:ColorWeak": "色弱模式"
}
}

22
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Lsw.Abp.AntDesignThemeManagement.Application.Contracts.csproj

@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<Import Project="..\..\..\configureawait.props" />
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" />
<PackageReference Include="Volo.Abp.Authorization" />
<PackageReference Include="Volo.Abp.SettingManagement.Application.Contracts" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Localization\Resources\AntDesignThemeManagement\*.json" />
<Content Remove="Localization\Resources\AntDesignThemeManagement\*.json" />
</ItemGroup>
</Project>

26
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Permissions/AntDesignThemeManagementPermissionDefinitionProvider.cs

@ -0,0 +1,26 @@
using Lsw.Abp.AntDesignThemeManagement.Localization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Localization;
namespace Lsw.Abp.AntDesignThemeManagement.Permissions;
public class AntDesignThemeManagementPermissionDefinitionProvider : PermissionDefinitionProvider
{
public override void Define(IPermissionDefinitionContext context)
{
var group = context.AddGroup(
AntDesignThemeManagementPermissions.GroupName,
L("Permission:AntDesignThemeManagement")
);
group.AddPermission(
AntDesignThemeManagementPermissions.Settings,
L("Permission:AntDesignThemeManagement.Settings")
);
}
private static LocalizableString L(string name)
{
return LocalizableString.Create<AntDesignThemeManagementResource>(name);
}
}

8
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Permissions/AntDesignThemeManagementPermissions.cs

@ -0,0 +1,8 @@
namespace Lsw.Abp.AntDesignThemeManagement.Permissions;
public static class AntDesignThemeManagementPermissions
{
public const string GroupName = "Lsw.AntDesignThemeManagement";
public const string Settings = GroupName + ".Settings";
}

115
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Settings/AntDesignThemeManagementSettingDefinitionProvider.cs

@ -0,0 +1,115 @@
using Lsw.Abp.AntDesignThemeManagement.Localization;
using Volo.Abp.Localization;
using Volo.Abp.Settings;
namespace Lsw.Abp.AntDesignThemeManagement.Settings;
public class AntDesignThemeManagementSettingDefinitionProvider : SettingDefinitionProvider
{
public override void Define(ISettingDefinitionContext context)
{
context.Add(
new SettingDefinition(
AntDesignThemeManagementSettingNames.EnableThemeSettings,
AntDesignThemeSettingDefaults.EnableThemeSettings.ToString().ToLowerInvariant(),
L("Settings:EnableThemeSettings"),
isVisibleToClients: true
),
new SettingDefinition(
AntDesignThemeManagementSettingNames.EnablePageStyleSetting,
AntDesignThemeSettingDefaults.EnablePageStyleSetting.ToString().ToLowerInvariant(),
L("Settings:PageStyleSetting"),
isVisibleToClients: true
),
new SettingDefinition(
AntDesignThemeManagementSettingNames.EnableNavigationModeSetting,
AntDesignThemeSettingDefaults.EnableNavigationModeSetting.ToString().ToLowerInvariant(),
L("Settings:NavigationModeSetting"),
isVisibleToClients: true
),
new SettingDefinition(
AntDesignThemeManagementSettingNames.EnableRegionalSettings,
AntDesignThemeSettingDefaults.EnableRegionalSettings.ToString().ToLowerInvariant(),
L("Settings:RegionalSettings"),
isVisibleToClients: true
),
new SettingDefinition(
AntDesignThemeManagementSettingNames.EnableOtherSettings,
AntDesignThemeSettingDefaults.EnableOtherSettings.ToString().ToLowerInvariant(),
L("Settings:OtherSettings"),
isVisibleToClients: true
),
new SettingDefinition(
AntDesignThemeManagementSettingNames.ThemeStyle,
AntDesignThemeSettingDefaults.ThemeStyle,
L("Settings:ThemeStyle"),
isVisibleToClients: true
),
new SettingDefinition(
AntDesignThemeManagementSettingNames.NavigationMode,
AntDesignThemeSettingDefaults.NavigationMode,
L("Settings:NavigationMode"),
isVisibleToClients: true
),
new SettingDefinition(
AntDesignThemeManagementSettingNames.ContentWidth,
AntDesignThemeSettingDefaults.ContentWidth,
L("Settings:ContentWidth"),
isVisibleToClients: true
),
new SettingDefinition(
AntDesignThemeManagementSettingNames.FixedHeader,
AntDesignThemeSettingDefaults.FixedHeader.ToString().ToLowerInvariant(),
L("Settings:FixedHeader"),
isVisibleToClients: true
),
new SettingDefinition(
AntDesignThemeManagementSettingNames.FixSiderbar,
AntDesignThemeSettingDefaults.FixSiderbar.ToString().ToLowerInvariant(),
L("Settings:FixSiderbar"),
isVisibleToClients: true
),
new SettingDefinition(
AntDesignThemeManagementSettingNames.SplitMenus,
AntDesignThemeSettingDefaults.SplitMenus.ToString().ToLowerInvariant(),
L("Settings:SplitMenus"),
isVisibleToClients: true
),
new SettingDefinition(
AntDesignThemeManagementSettingNames.ShowHeader,
AntDesignThemeSettingDefaults.ShowHeader.ToString().ToLowerInvariant(),
L("Settings:ShowHeader"),
isVisibleToClients: true
),
new SettingDefinition(
AntDesignThemeManagementSettingNames.ShowFooter,
AntDesignThemeSettingDefaults.ShowFooter.ToString().ToLowerInvariant(),
L("Settings:ShowFooter"),
isVisibleToClients: true
),
new SettingDefinition(
AntDesignThemeManagementSettingNames.ShowMenu,
AntDesignThemeSettingDefaults.ShowMenu.ToString().ToLowerInvariant(),
L("Settings:ShowMenu"),
isVisibleToClients: true
),
new SettingDefinition(
AntDesignThemeManagementSettingNames.ShowMenuHeader,
AntDesignThemeSettingDefaults.ShowMenuHeader.ToString().ToLowerInvariant(),
L("Settings:ShowMenuHeader"),
isVisibleToClients: true
),
new SettingDefinition(
AntDesignThemeManagementSettingNames.ColorWeak,
AntDesignThemeSettingDefaults.ColorWeak.ToString().ToLowerInvariant(),
L("Settings:ColorWeak"),
isVisibleToClients: true
)
);
}
private static LocalizableString L(string name)
{
return LocalizableString.Create<AntDesignThemeManagementResource>(name);
}
}

24
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Settings/AntDesignThemeManagementSettingNames.cs

@ -0,0 +1,24 @@
namespace Lsw.Abp.AntDesignThemeManagement.Settings;
public static class AntDesignThemeManagementSettingNames
{
public const string GroupName = "Lsw.AntDesignTheme";
public const string EnableThemeSettings = GroupName + ".EnableThemeSettings";
public const string EnablePageStyleSetting = GroupName + ".Enable.PageStyleSetting";
public const string EnableNavigationModeSetting = GroupName + ".Enable.NavigationModeSetting";
public const string EnableRegionalSettings = GroupName + ".Enable.RegionalSettings";
public const string EnableOtherSettings = GroupName + ".Enable.OtherSettings";
public const string ThemeStyle = GroupName + ".ThemeStyle";
public const string NavigationMode = GroupName + ".NavigationMode";
public const string ContentWidth = GroupName + ".ContentWidth";
public const string FixedHeader = GroupName + ".FixedHeader";
public const string FixSiderbar = GroupName + ".FixSiderbar";
public const string SplitMenus = GroupName + ".SplitMenus";
public const string ShowHeader = GroupName + ".Region.Header";
public const string ShowFooter = GroupName + ".Region.Footer";
public const string ShowMenu = GroupName + ".Region.Menu";
public const string ShowMenuHeader = GroupName + ".Region.MenuHeader";
public const string ColorWeak = GroupName + ".ColorWeak";
}

42
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application.Contracts/Settings/AntDesignThemeSettingDefaults.cs

@ -0,0 +1,42 @@
namespace Lsw.Abp.AntDesignThemeManagement.Settings;
public static class AntDesignThemeSettingDefaults
{
public const bool EnableThemeSettings = true;
public const bool EnablePageStyleSetting = true;
public const bool EnableNavigationModeSetting = true;
public const bool EnableRegionalSettings = true;
public const bool EnableOtherSettings = true;
public const string ThemeStyle = ThemeStyles.Light;
public const string NavigationMode = NavigationModes.Side;
public const string ContentWidth = ContentWidths.Fluid;
public const bool FixedHeader = true;
public const bool FixSiderbar = true;
public const bool SplitMenus = false;
public const bool ShowHeader = true;
public const bool ShowFooter = true;
public const bool ShowMenu = true;
public const bool ShowMenuHeader = true;
public const bool ColorWeak = false;
}
public static class ThemeStyles
{
public const string Light = "Light";
public const string Dark = "Dark";
public const string RealDark = "RealDark";
}
public static class NavigationModes
{
public const string Side = "Side";
public const string Top = "Top";
public const string Mix = "Mix";
}
public static class ContentWidths
{
public const string Fluid = "Fluid";
public const string Fixed = "Fixed";
}

12
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application/AbpAntDesignThemeManagementApplicationModule.cs

@ -0,0 +1,12 @@
using Volo.Abp.Modularity;
using Volo.Abp.SettingManagement;
namespace Lsw.Abp.AntDesignThemeManagement;
[DependsOn(
typeof(AbpAntDesignThemeManagementApplicationContractsModule),
typeof(AbpSettingManagementApplicationModule)
)]
public class AbpAntDesignThemeManagementApplicationModule : AbpModule
{
}

284
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application/AntDesignThemePreferenceAppService.cs

@ -0,0 +1,284 @@
using System;
using System.Threading.Tasks;
using Lsw.Abp.AntDesignThemeManagement.Dtos;
using Lsw.Abp.AntDesignThemeManagement.Permissions;
using Lsw.Abp.AntDesignThemeManagement.Settings;
using Volo.Abp.Application.Services;
using Volo.Abp.Authorization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.SettingManagement;
using Volo.Abp.Settings;
namespace Lsw.Abp.AntDesignThemeManagement;
public class AntDesignThemePreferenceAppService : ApplicationService, IAntDesignThemePreferenceAppService
{
protected ISettingProvider AbpSettingProvider { get; }
protected ISettingManager AbpSettingManager { get; }
protected IPermissionChecker PermissionChecker { get; }
public AntDesignThemePreferenceAppService(
ISettingProvider settingProvider,
ISettingManager settingManager,
IPermissionChecker permissionChecker)
{
AbpSettingProvider = settingProvider;
AbpSettingManager = settingManager;
PermissionChecker = permissionChecker;
}
public virtual async Task<AntDesignThemePreferenceDto> GetAsync()
{
var preference = new AntDesignThemePreferenceDto
{
ThemeSettingsEnabled = await GetBoolAsync(
AntDesignThemeManagementSettingNames.EnableThemeSettings,
AntDesignThemeSettingDefaults.EnableThemeSettings),
PageStyleSettingEnabled = await GetBoolAsync(
AntDesignThemeManagementSettingNames.EnablePageStyleSetting,
AntDesignThemeSettingDefaults.EnablePageStyleSetting),
NavigationModeSettingEnabled = await GetBoolAsync(
AntDesignThemeManagementSettingNames.EnableNavigationModeSetting,
AntDesignThemeSettingDefaults.EnableNavigationModeSetting),
RegionalSettingsEnabled = await GetBoolAsync(
AntDesignThemeManagementSettingNames.EnableRegionalSettings,
AntDesignThemeSettingDefaults.EnableRegionalSettings),
OtherSettingsEnabled = await GetBoolAsync(
AntDesignThemeManagementSettingNames.EnableOtherSettings,
AntDesignThemeSettingDefaults.EnableOtherSettings),
ThemeStyle = await GetThemeStyleAsync(),
NavigationMode = await GetNavigationModeAsync(),
ContentWidth = await GetContentWidthAsync(),
FixedHeader = await GetBoolAsync(
AntDesignThemeManagementSettingNames.FixedHeader,
AntDesignThemeSettingDefaults.FixedHeader),
FixSiderbar = await GetBoolAsync(
AntDesignThemeManagementSettingNames.FixSiderbar,
AntDesignThemeSettingDefaults.FixSiderbar),
SplitMenus = await GetBoolAsync(
AntDesignThemeManagementSettingNames.SplitMenus,
AntDesignThemeSettingDefaults.SplitMenus),
ShowHeader = await GetBoolAsync(
AntDesignThemeManagementSettingNames.ShowHeader,
AntDesignThemeSettingDefaults.ShowHeader),
ShowFooter = await GetBoolAsync(
AntDesignThemeManagementSettingNames.ShowFooter,
AntDesignThemeSettingDefaults.ShowFooter),
ShowMenu = await GetBoolAsync(
AntDesignThemeManagementSettingNames.ShowMenu,
AntDesignThemeSettingDefaults.ShowMenu),
ShowMenuHeader = await GetBoolAsync(
AntDesignThemeManagementSettingNames.ShowMenuHeader,
AntDesignThemeSettingDefaults.ShowMenuHeader),
ColorWeak = await GetBoolAsync(
AntDesignThemeManagementSettingNames.ColorWeak,
AntDesignThemeSettingDefaults.ColorWeak)
};
NormalizeThemeSettingsAvailability(preference);
return preference;
}
public virtual async Task UpdateAsync(UpdateAntDesignThemePreferenceDto input)
{
if (!CurrentUser.IsAuthenticated)
{
throw new AbpAuthorizationException("Current user must be authenticated.");
}
await AbpSettingManager.SetForCurrentUserAsync(
AntDesignThemeManagementSettingNames.ThemeStyle,
NormalizeThemeStyle(input.ThemeStyle));
await AbpSettingManager.SetForCurrentUserAsync(
AntDesignThemeManagementSettingNames.NavigationMode,
NormalizeNavigationMode(input.NavigationMode));
await AbpSettingManager.SetForCurrentUserAsync(
AntDesignThemeManagementSettingNames.ContentWidth,
NormalizeContentWidth(input.ContentWidth));
await AbpSettingManager.SetForCurrentUserAsync(
AntDesignThemeManagementSettingNames.FixedHeader,
input.FixedHeader.ToString().ToLowerInvariant());
await AbpSettingManager.SetForCurrentUserAsync(
AntDesignThemeManagementSettingNames.FixSiderbar,
input.FixSiderbar.ToString().ToLowerInvariant());
await AbpSettingManager.SetForCurrentUserAsync(
AntDesignThemeManagementSettingNames.SplitMenus,
input.SplitMenus.ToString().ToLowerInvariant());
await AbpSettingManager.SetForCurrentUserAsync(
AntDesignThemeManagementSettingNames.ShowHeader,
input.ShowHeader.ToString().ToLowerInvariant());
await AbpSettingManager.SetForCurrentUserAsync(
AntDesignThemeManagementSettingNames.ShowFooter,
input.ShowFooter.ToString().ToLowerInvariant());
await AbpSettingManager.SetForCurrentUserAsync(
AntDesignThemeManagementSettingNames.ShowMenu,
input.ShowMenu.ToString().ToLowerInvariant());
await AbpSettingManager.SetForCurrentUserAsync(
AntDesignThemeManagementSettingNames.ShowMenuHeader,
input.ShowMenuHeader.ToString().ToLowerInvariant());
await AbpSettingManager.SetForCurrentUserAsync(
AntDesignThemeManagementSettingNames.ColorWeak,
input.ColorWeak.ToString().ToLowerInvariant());
}
public virtual async Task UpdateThemeSettingsAvailabilityAsync(UpdateAntDesignThemeSettingsAvailabilityDto input)
{
if (!await PermissionChecker.IsGrantedAsync(AntDesignThemeManagementPermissions.Settings))
{
throw new AbpAuthorizationException("Missing permission to update global theme settings.");
}
var normalized = NormalizeThemeSettingsAvailability(input);
await SetThemeSettingsAvailabilityAsync(normalized);
}
public virtual async Task SetThemeSettingsEnabledAsync(bool isEnabled)
{
if (!await PermissionChecker.IsGrantedAsync(AntDesignThemeManagementPermissions.Settings))
{
throw new AbpAuthorizationException("Missing permission to update global theme settings.");
}
var normalized = isEnabled
? new ThemeSettingsAvailability(true, true, true, true, true)
: new ThemeSettingsAvailability(false, false, false, false, false);
await SetThemeSettingsAvailabilityAsync(normalized);
}
protected virtual async Task<string> GetThemeStyleAsync()
{
var value = await GetStringAsync(
AntDesignThemeManagementSettingNames.ThemeStyle,
AntDesignThemeSettingDefaults.ThemeStyle);
return NormalizeThemeStyle(value);
}
protected virtual async Task<string> GetNavigationModeAsync()
{
var value = await GetStringAsync(
AntDesignThemeManagementSettingNames.NavigationMode,
AntDesignThemeSettingDefaults.NavigationMode);
return NormalizeNavigationMode(value);
}
protected virtual async Task<string> GetContentWidthAsync()
{
var value = await GetStringAsync(
AntDesignThemeManagementSettingNames.ContentWidth,
AntDesignThemeSettingDefaults.ContentWidth);
return NormalizeContentWidth(value);
}
protected virtual async Task<string> GetStringAsync(string name, string defaultValue)
{
var value = await AbpSettingProvider.GetOrNullAsync(name);
return string.IsNullOrWhiteSpace(value) ? defaultValue : value;
}
protected virtual async Task<bool> GetBoolAsync(string name, bool defaultValue)
{
var value = await AbpSettingProvider.GetOrNullAsync(name);
return bool.TryParse(value, out var parsed) ? parsed : defaultValue;
}
protected virtual void NormalizeThemeSettingsAvailability(AntDesignThemePreferenceDto preference)
{
var hasAnyEnabledSection = preference.PageStyleSettingEnabled
|| preference.NavigationModeSettingEnabled
|| preference.RegionalSettingsEnabled
|| preference.OtherSettingsEnabled;
preference.ThemeSettingsEnabled = hasAnyEnabledSection;
}
protected virtual ThemeSettingsAvailability NormalizeThemeSettingsAvailability(
UpdateAntDesignThemeSettingsAvailabilityDto input)
{
if (!input.ThemeSettingsEnabled)
{
return new ThemeSettingsAvailability(false, false, false, false, false);
}
var hasAnyEnabledSection = input.PageStyleSettingEnabled
|| input.NavigationModeSettingEnabled
|| input.RegionalSettingsEnabled
|| input.OtherSettingsEnabled;
if (!hasAnyEnabledSection)
{
// Enabling the root switch should turn on all sub-items by default.
return new ThemeSettingsAvailability(true, true, true, true, true);
}
return new ThemeSettingsAvailability(
true,
input.PageStyleSettingEnabled,
input.NavigationModeSettingEnabled,
input.RegionalSettingsEnabled,
input.OtherSettingsEnabled
);
}
protected virtual async Task SetThemeSettingsAvailabilityAsync(ThemeSettingsAvailability availability)
{
await AbpSettingManager.SetGlobalAsync(
AntDesignThemeManagementSettingNames.EnableThemeSettings,
availability.ThemeSettingsEnabled.ToString().ToLowerInvariant());
await AbpSettingManager.SetGlobalAsync(
AntDesignThemeManagementSettingNames.EnablePageStyleSetting,
availability.PageStyleSettingEnabled.ToString().ToLowerInvariant());
await AbpSettingManager.SetGlobalAsync(
AntDesignThemeManagementSettingNames.EnableNavigationModeSetting,
availability.NavigationModeSettingEnabled.ToString().ToLowerInvariant());
await AbpSettingManager.SetGlobalAsync(
AntDesignThemeManagementSettingNames.EnableRegionalSettings,
availability.RegionalSettingsEnabled.ToString().ToLowerInvariant());
await AbpSettingManager.SetGlobalAsync(
AntDesignThemeManagementSettingNames.EnableOtherSettings,
availability.OtherSettingsEnabled.ToString().ToLowerInvariant());
}
protected virtual string NormalizeThemeStyle(string themeStyle)
{
return themeStyle switch
{
ThemeStyles.Light => ThemeStyles.Light,
ThemeStyles.Dark => ThemeStyles.Dark,
ThemeStyles.RealDark => ThemeStyles.RealDark,
_ => AntDesignThemeSettingDefaults.ThemeStyle
};
}
protected virtual string NormalizeNavigationMode(string navigationMode)
{
return navigationMode switch
{
NavigationModes.Side => NavigationModes.Side,
NavigationModes.Top => NavigationModes.Top,
NavigationModes.Mix => NavigationModes.Side,
_ => AntDesignThemeSettingDefaults.NavigationMode
};
}
protected virtual string NormalizeContentWidth(string contentWidth)
{
return contentWidth switch
{
ContentWidths.Fluid => ContentWidths.Fluid,
ContentWidths.Fixed => ContentWidths.Fixed,
_ => AntDesignThemeSettingDefaults.ContentWidth
};
}
protected record ThemeSettingsAvailability(
bool ThemeSettingsEnabled,
bool PageStyleSettingEnabled,
bool NavigationModeSettingEnabled,
bool RegionalSettingsEnabled,
bool OtherSettingsEnabled
);
}

3
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application/FodyWeavers.xml

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

18
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Application/Lsw.Abp.AntDesignThemeManagement.Application.csproj

@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<Import Project="..\..\..\configureawait.props" />
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.SettingManagement.Application" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Lsw.Abp.AntDesignThemeManagement.Application.Contracts\Lsw.Abp.AntDesignThemeManagement.Application.Contracts.csproj" />
</ItemGroup>
</Project>

14
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor.Server/AbpAntDesignThemeManagementBlazorServerModule.cs

@ -0,0 +1,14 @@
using Lsw.Abp.AntDesignThemeManagement.Blazor;
using Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme;
using Volo.Abp.Modularity;
namespace Lsw.Abp.AntDesignThemeManagement.Blazor.Server;
[DependsOn(
typeof(AbpAntDesignThemeManagementBlazorModule),
typeof(AbpAntDesignThemeManagementApplicationModule),
typeof(AbpAspNetCoreComponentsServerAntDesignThemeModule)
)]
public class AbpAntDesignThemeManagementBlazorServerModule : AbpModule
{
}

3
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor.Server/FodyWeavers.xml

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

16
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor.Server/Lsw.Abp.AntDesignThemeManagement.Blazor.Server.csproj

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk.Razor">
<Import Project="..\..\..\common.props" />
<Import Project="..\..\..\configureawait.props" />
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Lsw.Abp.AntDesignThemeManagement.Application\Lsw.Abp.AntDesignThemeManagement.Application.csproj" />
<ProjectReference Include="..\Lsw.Abp.AntDesignThemeManagement.Blazor\Lsw.Abp.AntDesignThemeManagement.Blazor.csproj" />
<ProjectReference Include="..\..\AntDesignTheme\Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme\Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.csproj" />
</ItemGroup>
</Project>

22
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly/AbpAntDesignThemeManagementBlazorWebAssemblyModule.cs

@ -0,0 +1,22 @@
using Lsw.Abp.AntDesignThemeManagement.Blazor;
using Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Http.Client;
using Volo.Abp.Http.Client.IdentityModel.WebAssembly;
using Volo.Abp.Modularity;
namespace Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly;
[DependsOn(
typeof(AbpAntDesignThemeManagementBlazorModule),
typeof(AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule),
typeof(AbpHttpClientIdentityModelWebAssemblyModule)
)]
public class AbpAntDesignThemeManagementBlazorWebAssemblyModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddHttpClientProxies(
typeof(AbpAntDesignThemeManagementApplicationContractsModule).Assembly);
}
}

3
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly/FodyWeavers.xml

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

19
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly/Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly.csproj

@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk.Razor">
<Import Project="..\..\..\common.props" />
<Import Project="..\..\..\configureawait.props" />
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Http.Client.IdentityModel.WebAssembly" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Lsw.Abp.AntDesignThemeManagement.Blazor\Lsw.Abp.AntDesignThemeManagement.Blazor.csproj" />
<ProjectReference Include="..\..\AntDesignTheme\Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme\Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.csproj" />
</ItemGroup>
</Project>

23
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor/AbpAntDesignThemeManagementBlazorModule.cs

@ -0,0 +1,23 @@
using Lsw.Abp.AntDesignThemeManagement.Blazor.Settings;
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme;
using Lsw.Abp.SettingManagement.Blazor.AntDesignUI;
using Volo.Abp.Modularity;
using Volo.Abp.SettingManagement.Blazor;
namespace Lsw.Abp.AntDesignThemeManagement.Blazor;
[DependsOn(
typeof(AbpAntDesignThemeManagementApplicationContractsModule),
typeof(AbpAspNetCoreComponentsWebAntDesignThemeModule),
typeof(AbpSettingManagementBlazorAntDesignModule)
)]
public class AbpAntDesignThemeManagementBlazorModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<SettingManagementComponentOptions>(options =>
{
options.Contributors.Add(new AntDesignThemeManagementSettingContributor());
});
}
}

3
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor/FodyWeavers.xml

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

16
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor/Lsw.Abp.AntDesignThemeManagement.Blazor.csproj

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk.Razor">
<Import Project="..\..\..\common.props" />
<Import Project="..\..\..\configureawait.props" />
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Lsw.Abp.AntDesignThemeManagement.Application.Contracts\Lsw.Abp.AntDesignThemeManagement.Application.Contracts.csproj" />
<ProjectReference Include="..\..\AntDesignTheme\Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme\Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.csproj" />
<ProjectReference Include="..\..\SettingManagement\Lsw.Abp.SettingManagement.Blazor.AntDesignUI\Lsw.Abp.SettingManagement.Blazor.AntDesignUI.csproj" />
</ItemGroup>
</Project>

36
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor/Pages/SettingManagement/ThemeSettingsManagementGroup/ThemeSettingsManagementGroupViewComponent.razor

@ -0,0 +1,36 @@
@inherits Volo.Abp.AspNetCore.Components.AbpComponentBase
@using AntDesign
@using Lsw.Abp.AntDesignThemeManagement.Localization
<div class="lsw-theme-settings-management-root">
<Checkbox @bind-Value="ThemeSettingsEnabled" OnChange="OnThemeSettingsEnabledChanged">
@L["Settings:EnableThemeSettings"]
</Checkbox>
</div>
<div class="lsw-theme-settings-management-children">
<div class="lsw-theme-settings-management-item">
<Checkbox @bind-Value="PageStyleSettingEnabled" OnChange="OnPageStyleSettingEnabledChanged">
@L["Settings:PageStyleSetting"]
</Checkbox>
</div>
<div class="lsw-theme-settings-management-item">
<Checkbox @bind-Value="NavigationModeSettingEnabled" OnChange="OnNavigationModeSettingEnabledChanged">
@L["Settings:NavigationModeSetting"]
</Checkbox>
</div>
<div class="lsw-theme-settings-management-item">
<Checkbox @bind-Value="RegionalSettingsEnabled" OnChange="OnRegionalSettingsEnabledChanged">
@L["Settings:RegionalSettings"]
</Checkbox>
</div>
<div class="lsw-theme-settings-management-item">
<Checkbox @bind-Value="OtherSettingsEnabled" OnChange="OnOtherSettingsEnabledChanged">
@L["Settings:OtherSettings"]
</Checkbox>
</div>
</div>
<div class="lsw-theme-settings-management-actions">
<Button Type="@ButtonType.Primary" OnClick="@SaveAsync">
@L["Submit"]
</Button>
</div>

120
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor/Pages/SettingManagement/ThemeSettingsManagementGroup/ThemeSettingsManagementGroupViewComponent.razor.cs

@ -0,0 +1,120 @@
using System;
using System.Threading.Tasks;
using Lsw.Abp.AntDesignThemeManagement.Dtos;
using Lsw.Abp.AntDesignThemeManagement.Localization;
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Settings;
using Microsoft.AspNetCore.Components;
namespace Lsw.Abp.AntDesignThemeManagement.Blazor.Pages.SettingManagement.ThemeSettingsManagementGroup;
public partial class ThemeSettingsManagementGroupViewComponent
{
[Inject]
protected IAntDesignThemePreferenceAppService AntDesignThemePreferenceAppService { get; set; } = default!;
[Inject]
protected IAntDesignSettingsProvider AntDesignSettingsProvider { get; set; } = default!;
protected bool ThemeSettingsEnabled { get; set; }
protected bool PageStyleSettingEnabled { get; set; }
protected bool NavigationModeSettingEnabled { get; set; }
protected bool RegionalSettingsEnabled { get; set; }
protected bool OtherSettingsEnabled { get; set; }
public ThemeSettingsManagementGroupViewComponent()
{
LocalizationResource = typeof(AntDesignThemeManagementResource);
}
protected override async Task OnInitializedAsync()
{
try
{
var preference = await AntDesignThemePreferenceAppService.GetAsync();
ThemeSettingsEnabled = preference.ThemeSettingsEnabled;
PageStyleSettingEnabled = preference.PageStyleSettingEnabled;
NavigationModeSettingEnabled = preference.NavigationModeSettingEnabled;
RegionalSettingsEnabled = preference.RegionalSettingsEnabled;
OtherSettingsEnabled = preference.OtherSettingsEnabled;
}
catch (Exception ex)
{
await HandleErrorAsync(ex);
}
}
protected virtual void OnThemeSettingsEnabledChanged(bool value)
{
ThemeSettingsEnabled = value;
if (!value)
{
SetAllSubItems(false);
return;
}
SetAllSubItems(true);
}
protected virtual void OnPageStyleSettingEnabledChanged(bool value)
{
PageStyleSettingEnabled = value;
SyncRootSwitchByChildren();
}
protected virtual void OnNavigationModeSettingEnabledChanged(bool value)
{
NavigationModeSettingEnabled = value;
SyncRootSwitchByChildren();
}
protected virtual void OnRegionalSettingsEnabledChanged(bool value)
{
RegionalSettingsEnabled = value;
SyncRootSwitchByChildren();
}
protected virtual void OnOtherSettingsEnabledChanged(bool value)
{
OtherSettingsEnabled = value;
SyncRootSwitchByChildren();
}
protected virtual async Task SaveAsync()
{
try
{
await AntDesignThemePreferenceAppService.UpdateThemeSettingsAvailabilityAsync(
new UpdateAntDesignThemeSettingsAvailabilityDto
{
ThemeSettingsEnabled = ThemeSettingsEnabled,
PageStyleSettingEnabled = PageStyleSettingEnabled,
NavigationModeSettingEnabled = NavigationModeSettingEnabled,
RegionalSettingsEnabled = RegionalSettingsEnabled,
OtherSettingsEnabled = OtherSettingsEnabled
}
);
await AntDesignSettingsProvider.TriggerSettingChangedAsync();
await Message.Success(L["SavedSuccessfully"]);
}
catch (Exception ex)
{
await HandleErrorAsync(ex);
}
}
protected virtual void SetAllSubItems(bool enabled)
{
PageStyleSettingEnabled = enabled;
NavigationModeSettingEnabled = enabled;
RegionalSettingsEnabled = enabled;
OtherSettingsEnabled = enabled;
}
protected virtual void SyncRootSwitchByChildren()
{
ThemeSettingsEnabled = PageStyleSettingEnabled
|| NavigationModeSettingEnabled
|| RegionalSettingsEnabled
|| OtherSettingsEnabled;
}
}

36
modules/AntDesignThemeManagement/Lsw.Abp.AntDesignThemeManagement.Blazor/Settings/AntDesignThemeManagementSettingContributor.cs

@ -0,0 +1,36 @@
using System.Threading.Tasks;
using Lsw.Abp.AntDesignThemeManagement.Blazor.Pages.SettingManagement.ThemeSettingsManagementGroup;
using Lsw.Abp.AntDesignThemeManagement.Localization;
using Lsw.Abp.AntDesignThemeManagement.Permissions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using Volo.Abp.SettingManagement.Blazor;
namespace Lsw.Abp.AntDesignThemeManagement.Blazor.Settings;
public class AntDesignThemeManagementSettingContributor : ISettingComponentContributor
{
public virtual async Task ConfigureAsync(SettingComponentCreationContext context)
{
if (!await CheckPermissionsAsync(context))
{
return;
}
var l = context.ServiceProvider.GetRequiredService<IStringLocalizer<AntDesignThemeManagementResource>>();
context.Groups.Add(
new SettingComponentGroup(
"Lsw.AntDesignThemeManagement",
l["Menu:ThemeSettingsManagement"],
typeof(ThemeSettingsManagementGroupViewComponent)
)
);
}
public virtual async Task<bool> CheckPermissionsAsync(SettingComponentCreationContext context)
{
var authorizationService = context.ServiceProvider.GetRequiredService<IAuthorizationService>();
return await authorizationService.IsGrantedAsync(AntDesignThemeManagementPermissions.Settings);
}
}

2
modules/FeatureManagement/Lsw.Abp.FeatureManagement.Blazor.AntDesignUI/Components/FeatureManagementModal.razor

@ -64,7 +64,7 @@
{
<Checkbox
Disabled="@disabled"
@bind-Checked="@ToggleValues[feature.Name]"
@bind-Value="@ToggleValues[feature.Name]"
OnChange="b => OnSelectedValueChangedAsync(b, feature)">
@feature.DisplayName
</Checkbox>

6
modules/PermissionManagement/Lsw.Abp.PermissionManagement.Blazor.AntDesignUI/Components/PermissionManagementModal.razor

@ -8,7 +8,7 @@
@if (_visible)
{
var grantAll = _groups.All(x => x.Permissions.All(p => p.IsGranted));
<Checkbox @bind-Checked="@grantAll" OnChange="@GrantAllChanged">@L["SelectAllInAllTabs"]</Checkbox>
<Checkbox @bind-Value="@grantAll" OnChange="@GrantAllChanged">@L["SelectAllInAllTabs"]</Checkbox>
<Divider/>
@if (_groups != null)
@ -21,7 +21,7 @@
<h4>@group.DisplayName</h4>
<Divider/>
<Checkbox
@bind-Checked="@selectAllInThisTab"
@bind-Value="@selectAllInThisTab"
OnChange="b => GroupGrantAllChanged(b, group)">
@L["SelectAllInThisTab"]
</Checkbox>
@ -34,7 +34,7 @@
<div style="margin: @margin">
<Checkbox
Disabled="@(IsDisabledPermission(permission))"
@bind-Checked="@permission.IsGranted"
@bind-Value="@permission.IsGranted"
OnChange="b => PermissionChanged(b, group, permission)">
@GetShownName(permission)
</Checkbox>

2
modules/SettingManagement/Lsw.Abp.SettingManagement.Blazor.AntDesignUI/Pages/SettingManagement/AntDesignThemeGroup/AntDesignThemeGroupViewComponent.razor.cs

@ -50,7 +50,7 @@ public partial class AntDesignThemeGroupViewComponent
private async Task UpdateSettingAsync()
{
await AntDesignSettingsProvider.TriggerSettingChanged();
await AntDesignSettingsProvider.TriggerSettingChangedAsync();
await Notify.Success(L["SuccessfullySaved"]);
}

32
modules/SettingManagement/Lsw.Abp.SettingManagement.Blazor.AntDesignUI/Pages/SettingManagement/SettingManagement.razor

@ -1,9 +1,10 @@
@page "/setting-management"
@page "/setting-management"
@using AntDesign
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Layout
@using Microsoft.AspNetCore.Authorization
@using Microsoft.Extensions.Options
@using Volo.Abp.Features
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Layout
@using Volo.Abp.SettingManagement
@attribute [Authorize]
@attribute [RequiresFeature(SettingManagementFeatures.Enable)]
@ -12,23 +13,26 @@
<AbpPageHeader Title="@L["Settings"]" BreadcrumbItems="@BreadcrumbItems"/>
<div class="page-content">
<Tabs ActiveKey="@SelectedGroup" TabPosition="@TabPosition.Left">
<div class="page-content lsw-setting-management-page">
<div class="lsw-setting-management-mobile-selector">
<Select DataSource="@GroupOptions"
ValueName="@nameof(SettingGroupSelectItem.Value)"
LabelName="@nameof(SettingGroupSelectItem.Text)"
@bind-Value="@SelectedGroup"
>
</Select>
</div>
<Tabs Class="lsw-setting-management-tabs"
ActiveKey="@SelectedGroup"
OnChange="@OnSelectedGroupChangedAsync"
TabPosition="@TabPosition.Left">
@foreach (var group in SettingComponentCreationContext.Groups)
{
<TabPane Key="@GetNormalizedString(group.Id)" Tab="@group.DisplayName">
<h4>@group.DisplayName</h4>
<Divider/>
@{
SettingItemRenders.Add(b =>
{
b.OpenComponent(0, group.ComponentType);
b.CloseComponent();
});
}
@SettingItemRenders.Last()
<DynamicComponent Type="@group.ComponentType" />
</TabPane>
}
</Tabs>

32
modules/SettingManagement/Lsw.Abp.SettingManagement.Blazor.AntDesignUI/Pages/SettingManagement/SettingManagement.razor.cs

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Lsw.Abp.AntDesignUI;
using Microsoft.AspNetCore.Components;
@ -25,10 +26,9 @@ public partial class SettingManagement
protected SettingManagementComponentOptions Options => _options.Value;
protected List<RenderFragment> SettingItemRenders { get; set; } = new();
protected string SelectedGroup { get; set; }
protected List<AbpBreadcrumbItem> BreadcrumbItems = new();
protected List<SettingGroupSelectItem> GroupOptions { get; } = new();
protected override async Task OnInitializedAsync()
@ -41,11 +41,37 @@ public partial class SettingManagement
await contributor.ConfigureAsync(SettingComponentCreationContext);
}
SettingItemRenders.Clear();
GroupOptions.Clear();
foreach (var group in SettingComponentCreationContext.Groups)
{
GroupOptions.Add(new SettingGroupSelectItem
{
Text = group.DisplayName,
Value = GetNormalizedString(group.Id)
});
}
if (string.IsNullOrWhiteSpace(SelectedGroup))
{
SelectedGroup = GroupOptions.FirstOrDefault()?.Value ?? string.Empty;
}
}
protected virtual string GetNormalizedString(string value)
{
return value.Replace('.', '_');
}
protected virtual Task OnSelectedGroupChangedAsync(string value)
{
SelectedGroup = value;
return Task.CompletedTask;
}
}
public class SettingGroupSelectItem
{
public string Text { get; set; } = string.Empty;
public string Value { get; set; } = string.Empty;
}

8
modules/SettingManagement/Lsw.Abp.SettingManagement.Blazor.AntDesignUI/Settings/AntDesignSettingDefultPageContributor.cs

@ -4,7 +4,6 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using Volo.Abp.Features;
using Volo.Abp.MultiTenancy;
using Lsw.Abp.SettingManagement.Blazor.AntDesignUI.Pages.SettingManagement.AntDesignThemeGroup;
using Lsw.Abp.SettingManagement.Blazor.AntDesignUI.Pages.SettingManagement.EmailSettingGroup;
using Volo.Abp.SettingManagement;
using Volo.Abp.SettingManagement.Blazor;
@ -30,13 +29,6 @@ public class AntDesignSettingDefultPageContributor : ISettingComponentContributo
)
);
context.Groups.Add(
new SettingComponentGroup(
AntDesignThemeGroupViewComponent.Name,
"Theme",
typeof(AntDesignThemeGroupViewComponent)
)
);
}
public async Task<bool> CheckPermissionsAsync(SettingComponentCreationContext context)

70
samples/WebApp/README.md

@ -1,56 +1,58 @@
# BookStore
# BookStore WebApp Sample
## About this solution
This sample demonstrates the AntDesign theme in ABP Blazor WebApp auto mode.
This is a layered startup solution based on [Domain Driven Design (DDD)](https://abp.io/docs/latest/framework/architecture/domain-driven-design) practises. All the fundamental ABP modules are already installed. Check the [Application Startup Template](https://abp.io/docs/latest/solution-templates/layered-web-application) documentation for more info.
## Prerequisites
### Pre-requirements
- .NET SDK 10.0+
- Node.js 18 or newer
- MongoDB
- ABP CLI (`dotnet tool install -g Volo.Abp.Cli` if needed)
* [.net10.0+ SDK](https://dotnet.microsoft.com/download/dotnet)
* [Node v18 or 20](https://nodejs.org/en)
## Run
### Configurations
Install front-end libraries:
The solution comes with a default configuration that works out of the box. However, you may consider to change the following configuration before running your solution:
### Before running the application
* Run `abp install-libs` command on your solution folder to install client-side package dependencies. This step is automatically done when you create a new solution, if you didn't especially disabled it. However, you should run it yourself if you have first cloned this solution from your source control, or added a new client-side package dependency to your solution.
* Run `BookStore.DbMigrator` to create the initial database. This step is also automatically done when you create a new solution, if you didn't especially disabled it. This should be done in the first run. It is also needed if a new database migration is added to the solution later.
#### Generating a Signing Certificate
In the production environment, you need to use a production signing certificate. ABP Framework sets up signing and encryption certificates in your application and expects an `openiddict.pfx` file in your application.
```bash
abp install-libs
```
To generate a signing certificate, you can use the following command:
Apply database migrations and seed data:
```bash
dotnet dev-certs https -v -ep openiddict.pfx -p b0859b18-d774-4576-aad2-c49c1a9dc2ef
dotnet run --project .\src\BookStore.DbMigrator\
```
> `b0859b18-d774-4576-aad2-c49c1a9dc2ef` is the password of the certificate, you can change it to any password you want.
It is recommended to use **two** RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing.
Start the WebApp host:
For more information, please refer to: [OpenIddict Certificate Configuration](https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html#registering-a-certificate-recommended-for-production-ready-scenarios)
```bash
dotnet run --project .\src\BookStore.Blazor\
```
> Also, see the [Configuring OpenIddict](https://abp.io/docs/latest/Deployment/Configuring-OpenIddict#production-environment) documentation for more information.
Open `https://localhost:44320`.
### Solution structure
## Default Login
This is a layered monolith application that consists of the following applications:
- Username: `admin`
- Password: `1q2w3E*`
* `BookStore.DbMigrator`: A console application which applies the migrations and also seeds the initial data. It is useful on development as well as on production environment.
## What To Verify
- The application uses the refactored AntDesign Pro-style layout.
- The sidebar is responsive and can collapse on smaller screens.
- Authenticated users can open the floating theme settings panel.
- Theme settings apply immediately without restarting the application.
## Deploying the application
## Theme Settings Management
Deploying an ABP application follows the same process as deploying any .NET or ASP.NET Core application. However, there are important considerations to keep in mind. For detailed guidance, refer to ABP's [deployment documentation](https://abp.io/docs/latest/Deployment/Index).
This sample is configured with `AntDesignThemeManagement`.
### Additional resources
Go to `Administration -> Settings -> Theme settings management` to control which sections appear in the user-facing panel:
You can see the following resources to learn more about your solution and the ABP Framework:
- `Enable theme settings`
- `Page style setting`
- `Navigation mode`
- `Regional settings`
- `Other settings`
* [Web Application Development Tutorial](https://abp.io/docs/latest/tutorials/book-store/part-1)
* [Application Startup Template](https://abp.io/docs/latest/startup-templates/application/index)
If all child options are disabled, `Enable theme settings` is automatically disabled.

1
samples/WebApp/src/BookStore.Blazor.Client/BookStore.Blazor.Client.csproj

@ -22,6 +22,7 @@
<ItemGroup>
<ProjectReference Include="..\..\..\..\modules\AntDesignTheme\Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme\Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.csproj" />
<ProjectReference Include="..\..\..\..\modules\AntDesignThemeManagement\Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly\Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly.csproj" />
</ItemGroup>
<ItemGroup>

2
samples/WebApp/src/BookStore.Blazor.Client/BookStoreBlazorClientModule.cs

@ -14,6 +14,7 @@ using Volo.Abp.Mapperly;
using Volo.Abp.Modularity;
using Volo.Abp.UI.Navigation;
using Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme;
using Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly;
using Lsw.Abp.FeatureManagement.Blazor.WebAssembly.AntDesignUI;
using Lsw.Abp.SettingManagement.Blazor.WebAssembly.AntDesignUI;
using Lsw.Abp.TenantManagement.Blazor.WebAssembly.AntDesignUI;
@ -33,6 +34,7 @@ namespace BookStore.Blazor.Client;
typeof(AbpIdentityBlazorWebAssemblyAntDesignModule),
typeof(AbpTenantManagementBlazorWebAssemblyAntDesignModule),
typeof(AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule),
typeof(AbpAntDesignThemeManagementBlazorWebAssemblyModule),
typeof(AbpAutofacWebAssemblyModule),
typeof(AbpMapperlyModule),
typeof(BookStoreHttpApiClientModule)

1
samples/WebApp/src/BookStore.Blazor/BookStore.Blazor.csproj

@ -37,6 +37,7 @@
<ProjectReference Include="..\..\..\..\modules\IdentityManagement\Lsw.Abp.IdentityManagement.Blazor.Server.AntDesignUI\Lsw.Abp.IdentityManagement.Blazor.Server.AntDesignUI.csproj" />
<ProjectReference Include="..\..\..\..\modules\SettingManagement\Lsw.Abp.SettingManagement.Blazor.Server.AntDesignUI\Lsw.Abp.SettingManagement.Blazor.Server.AntDesignUI.csproj" />
<ProjectReference Include="..\..\..\..\modules\TenantManagement\Lsw.Abp.TenantManagement.Blazor.Server.AntDesignUI\Lsw.Abp.TenantManagement.Blazor.Server.AntDesignUI.csproj" />
<ProjectReference Include="..\..\..\..\modules\AntDesignThemeManagement\Lsw.Abp.AntDesignThemeManagement.Blazor.Server\Lsw.Abp.AntDesignThemeManagement.Blazor.Server.csproj" />
</ItemGroup>
<ItemGroup>

6
samples/WebApp/src/BookStore.Blazor/BookStoreBlazorModule.cs

@ -15,7 +15,7 @@ using BookStore.Blazor.Client.Navigation;
using BookStore.MongoDB;
using BookStore.Localization;
using BookStore.MultiTenancy;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi;
using Microsoft.Extensions.Options;
using BookStore.Blazor.Client;
using BookStore.Blazor.Components;
@ -45,6 +45,8 @@ using Volo.Abp.Identity;
using Volo.Abp.OpenIddict;
using Volo.Abp.Account.Web;
using Lsw.Abp.IdentityManagement.Blazor.Server.AntDesignUI;
using Lsw.Abp.AntDesignThemeManagement.Blazor.Server;
using Lsw.Abp.AntDesignThemeManagement;
using Lsw.Abp.TenantManagement.Blazor.Server.AntDesignUI;
namespace BookStore.Blazor;
@ -57,6 +59,7 @@ namespace BookStore.Blazor;
typeof(AbpSwashbuckleModule),
typeof(AbpIdentityBlazorServerAntDesignModule),
typeof(AbpTenantManagementBlazorServerAntDesignModule),
typeof(AbpAntDesignThemeManagementBlazorServerModule),
typeof(AbpAccountWebOpenIddictModule),
//typeof(AbpAspNetCoreComponentsServerLeptonXLiteThemeModule),
typeof(AbpAspNetCoreComponentsServerAntDesignThemeModule),
@ -271,6 +274,7 @@ public class BookStoreBlazorModule : AbpModule
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly);
options.ConventionalControllers.Create(typeof(AbpAntDesignThemeManagementApplicationModule).Assembly);
});
}

3743
samples/WebApp/src/BookStore.Blazor/package-lock.json

File diff suppressed because it is too large

4
samples/WebApp/src/BookStore.Blazor/package.json

@ -3,7 +3,7 @@
"name": "my-app",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.2.0",
"@abp/aspnetcore.components.server.leptonxlitetheme": "~4.2.0"
"@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~5.3.0",
"@abp/aspnetcore.components.server.leptonxlitetheme": "~5.3.0"
}
}

612
samples/WebApp/src/BookStore.Blazor/yarn.lock

@ -2,320 +2,324 @@
# yarn lockfile v1
"@abp/aspnetcore.components.server.leptonxlitetheme@~4.2.0":
version "4.2.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.components.server.leptonxlitetheme/-/aspnetcore.components.server.leptonxlitetheme-4.2.1.tgz#3fb1c687940052cc20e93a282ce8fbc61c0844e7"
integrity sha512-2DgQMU6MPAJ7WmcJUaoouk4eAXP8XhJftdcPh+BjB9rCu5FDQnWHqhT6hQOz1DR+KQ3vD3R8jbyZis1sB8InSw==
dependencies:
"@abp/aspnetcore.components.server.theming" "~9.2.1"
"@abp/aspnetcore.components.server.theming@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.components.server.theming/-/aspnetcore.components.server.theming-9.2.1.tgz#9e9e01f6356b4a5616fb706460b0cde53204075a"
integrity sha512-fxOJwzG7YiMYLxYHKLPL3Cv0pynfivOCLqhG+v60Hz4VTUIDqJDy4EJ2EN+LcEAkpYGglzGNmbGh5je+2anzCA==
dependencies:
"@abp/bootstrap" "~9.2.1"
"@abp/font-awesome" "~9.2.1"
"@abp/aspnetcore.mvc.ui.theme.leptonxlite@~4.2.0":
version "4.2.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.leptonxlite/-/aspnetcore.mvc.ui.theme.leptonxlite-4.2.1.tgz#3e3cc78b0d1d56113d459d61e01125bffada0c21"
integrity sha512-unZMV9HY13Kq00FZROVlo9po+foivENEoM7jUmZWlxOQjxBwa3/VJaxwQIXd9DZOqdpJpi5zUv/pSb6DqiZkfg==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.1"
"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.1.tgz#35f6de6f106c80592ce70d36b6e8b20c64862803"
integrity sha512-kZz1tgUguGHxwG1MRkbkeXn9sIjbCOHJcBU+w+XuWwCqigM2yaE+KgnASDcjCrjQiPu6i73hf9OwtxXY1UbGMQ==
dependencies:
"@abp/aspnetcore.mvc.ui" "~9.2.1"
"@abp/bootstrap" "~9.2.1"
"@abp/bootstrap-datepicker" "~9.2.1"
"@abp/bootstrap-daterangepicker" "~9.2.1"
"@abp/datatables.net-bs5" "~9.2.1"
"@abp/font-awesome" "~9.2.1"
"@abp/jquery-form" "~9.2.1"
"@abp/jquery-validation-unobtrusive" "~9.2.1"
"@abp/lodash" "~9.2.1"
"@abp/luxon" "~9.2.1"
"@abp/malihu-custom-scrollbar-plugin" "~9.2.1"
"@abp/moment" "~9.2.1"
"@abp/select2" "~9.2.1"
"@abp/sweetalert2" "~9.2.1"
"@abp/timeago" "~9.2.1"
"@abp/aspnetcore.mvc.ui@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.1.tgz#8b30f830d85f7e1f4a386b0ef8d0444e2550bc42"
integrity sha512-0C41JpevGynbyHGeKkqLUSVNK64QETsKVyVWY4fSZkChGHlD09Fn3qIlHJInpBqJ9qNYs5VQ7RRP02PSum9mAg==
dependencies:
ansi-colors "^4.1.3"
"@abp/bootstrap-datepicker@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.1.tgz#373c8715d175ca23a8871bacdb5f017b070254aa"
integrity sha512-uaCpz5EDSZYDacjnYoqTiktTDFGnGJPEHYh5eG4BORlQta53Hvak7m2CkRVjdOaXtuPLi6EbWPSh2bHIfhKRyQ==
dependencies:
bootstrap-datepicker "^1.10.0"
"@abp/bootstrap-daterangepicker@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.1.tgz#b49e17a4753b09d49bfad6774a7f185e7e5bf71c"
integrity sha512-kd6LEACfx7CBIQOAiE/RHFp/WnthE2iz/eivl3fwuz1VgAO0CBIQ7hYoX91GaAIQgt+OAcgGbOl2G6E284EM9Q==
dependencies:
bootstrap-daterangepicker "^3.1.0"
"@abp/bootstrap@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.1.tgz#ddf624e95f1dab4a8fce8d20b6dccd2b3d3f1679"
integrity sha512-NghAVP7M/Y2y9GYDu7IWo8oW7EyJEO+1NnPqCudpjWX4C6B27d7ghJ7I0MfrHoRq9/hBJZ07AKf3KMAZQD99ng==
dependencies:
"@abp/core" "~9.2.1"
bootstrap "^5.3.3"
"@abp/core@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.1.tgz#f7c635f1fe88fc3fbbc4accaa6aee2dc3b5631a7"
integrity sha512-onCzS2w+U+wBv5FRDCVE176AiyZDMm1D5GaqiEnpuAwsBncFpFyZedC95dtPmykagJbpOvHVSPOLyZ2jzGjcYg==
dependencies:
"@abp/utils" "~9.2.1"
"@abp/datatables.net-bs5@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.1.tgz#ff69059e96d5341166fa8d08390e9bb352010e5d"
integrity sha512-NEkf8xWTIYFDs9lAAPs0hOL2UD+pnVwyix/9IAtip3BIkyPFpLCniNWbu1WhuNJpfmLHrWPSqIrouR80gGL7PQ==
dependencies:
"@abp/datatables.net" "~9.2.1"
datatables.net-bs5 "^2.1.8"
"@abp/datatables.net@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.1.tgz#0a5ab74ca44cd785efb487f0447e8acdea9d7aa1"
integrity sha512-A9TSPRNUV0eeCPnpGV9Htu9ZylUf3e03smYcbEROQHe+htwhcEV5dz8SLAI90baPi2g7VnyPav/3efaqo+ETdg==
dependencies:
"@abp/jquery" "~9.2.1"
datatables.net "^2.1.8"
"@abp/font-awesome@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.1.tgz#a387f1cf457bdb6e3cd30bd9f4c455a41f8ca0b1"
integrity sha512-RVo3422BItdAAmafSCH/mT1Ux8q6yUz7nswGep4beP1k1VfmFExj1mgVphIpAlH3DWyzfnwUOq7lLWf/Ul2dOA==
dependencies:
"@abp/core" "~9.2.1"
"@fortawesome/fontawesome-free" "^6.6.0"
"@abp/jquery-form@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.1.tgz#727b391c36e8ff46b62cb01be14715a05fe74b4f"
integrity sha512-n6EpUNNRzilOzP5rYTWr9K2mPQbvBQAuxPiwUZpfwf+QpJrs+NppJMaC06HFbHcSkDDy/utd+P1/sqWaJjL/tw==
dependencies:
"@abp/jquery" "~9.2.1"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.1.tgz#98215811818e618d96a1dcac6419962fd39c6fef"
integrity sha512-7no3KxRW3agw4EAM5iTvQjE4+m9JrjuMAV20gAU0uVPB2+sHlluEAks0IU9wz76T+Ac7osferUZz33LgdDvIaw==
dependencies:
"@abp/jquery-validation" "~9.2.1"
jquery-validation-unobtrusive "^4.0.0"
"@abp/jquery-validation@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.1.tgz#559c581523e4e098f2bf67627dfe6c7ef0e1c3c1"
integrity sha512-AEGm3agbwr1f5kmXvpBeiDmsS22P88zVr8NJDICGsgBxZofKndXsDFciNZGu6lXF5qXp8AwGRi//QPaCeQsP8g==
dependencies:
"@abp/jquery" "~9.2.1"
jquery-validation "^1.21.0"
"@abp/jquery@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.1.tgz#bbcc9eab9cef528a8163f5062665ffcf2b87c2f0"
integrity sha512-gdDIKMNEpeUdzUu5C/g6j568ytJ7ifaDxBr1NYf2kJ34p7y6rrBmyY+sL+xR3ZlcGgyPGXyFhTLRD7qTjXlkPg==
dependencies:
"@abp/core" "~9.2.1"
jquery "~3.7.1"
"@abp/lodash@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.1.tgz#a80ab7a908a0332b721277b1193209187fab57d8"
integrity sha512-I2+XYqwMi3+FXCv4xp5hBoJmOszg2WR1gnGc+Qd0zwb2VAbG4MvKVFgM/GUAFD8EKlquGyPf3f+4l5FkaPFkrQ==
dependencies:
"@abp/core" "~9.2.1"
lodash "^4.17.21"
"@abp/luxon@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.1.tgz#7e3d197425813cfc6932cd3f9f09f97ecd2f4fc7"
integrity sha512-2tyOZRmq9jQN0Uhg8WaHfEzL0Xeew04sbA8O9bqw28psRbXaWXEVdElRMBNt50sZkFPhHFoxxFN7PR8obs0Qug==
dependencies:
"@abp/core" "~9.2.1"
luxon "^3.5.0"
"@abp/malihu-custom-scrollbar-plugin@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.1.tgz#b0fa249885d442ba84657c7705df73851cb56db1"
integrity sha512-fzgQZsbN0xLMxEWh7znKAI4j0CPb8ciT/3x+QguGZDJf7OFw0YnEWctfEYJnnGG28HpHs1mh64gjqoeceHy0HQ==
dependencies:
"@abp/core" "~9.2.1"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/moment@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.1.tgz#9982c65d63171962091b08fc4e0d1ea98cc1f0eb"
integrity sha512-V4KH1WmahP0BoaQGLEY4a0AQyfk1cLeNMk3qCPtuqIUbOFwimJY3oQgpelilEwjI3oD/upMzGphjLGrfQLRM2A==
dependencies:
moment "^2.30.1"
"@abp/select2@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.1.tgz#5c3c6a4b0018b533491d6a46540069782559c57a"
integrity sha512-p743cnoohNLKX11ptnBcN5z9+ZyC11M9mwRR6SWbW5f1Eqvbkq03bf2mDFUfukCNis4RefeURZunPlsBOmRn/A==
"@abp/aspnetcore.components.server.leptonxlitetheme@~5.3.0":
"integrity" "sha512-rSkFUgDJiZQ/cKs20AVwyb1YS9KtUwP+OiG4Mr+zIst+GMsLOfK7ZBMd6qlGFN+0dQWVt89EfYckOJimsNE9xg=="
"resolved" "https://registry.npmjs.org/@abp/aspnetcore.components.server.leptonxlitetheme/-/aspnetcore.components.server.leptonxlitetheme-5.3.0.tgz"
"version" "5.3.0"
dependencies:
"@abp/aspnetcore.components.server.theming" "~10.3.0"
"@abp/aspnetcore.components.server.theming@~10.3.0":
"integrity" "sha512-s9MtBQHL5GQAHrZCRczgd0HOWM1++ImeEytT6/znaQRf4iEsR91+MxZdsfuuW4apBJwNO2QqCGefKTmzpxUBzg=="
"resolved" "https://registry.npmjs.org/@abp/aspnetcore.components.server.theming/-/aspnetcore.components.server.theming-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/bootstrap" "~10.3.0"
"@abp/font-awesome" "~10.3.0"
"@abp/aspnetcore.mvc.ui.theme.leptonxlite@~5.3.0":
"integrity" "sha512-gB+Vczz5ZY7wOUjGWgJdcFbhbFRG4nOH/5HMpXWtBxuigapjoofubrgDqVVsOzVtremDRy/uUZomYlEdWiTpQg=="
"resolved" "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui.theme.leptonxlite/-/aspnetcore.mvc.ui.theme.leptonxlite-5.3.0.tgz"
"version" "5.3.0"
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~10.3.0"
"@abp/aspnetcore.mvc.ui.theme.shared@~10.3.0":
"integrity" "sha512-X5xmMSxnIzNJPexvKR9y6jyn0v5n2wscN1SECG/bMI1YdKugMlkfkSuyUmLn+RX9/YdcK0jOsdMhfuzs5mgAOA=="
"resolved" "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/aspnetcore.mvc.ui" "~10.3.0"
"@abp/bootstrap" "~10.3.0"
"@abp/bootstrap-datepicker" "~10.3.0"
"@abp/bootstrap-daterangepicker" "~10.3.0"
"@abp/datatables.net-bs5" "~10.3.0"
"@abp/font-awesome" "~10.3.0"
"@abp/jquery-validation-unobtrusive" "~10.3.0"
"@abp/lodash" "~10.3.0"
"@abp/luxon" "~10.3.0"
"@abp/malihu-custom-scrollbar-plugin" "~10.3.0"
"@abp/moment" "~10.3.0"
"@abp/select2" "~10.3.0"
"@abp/sweetalert2" "~10.3.0"
"@abp/timeago" "~10.3.0"
"@abp/aspnetcore.mvc.ui@~10.3.0":
"integrity" "sha512-kp0XdwrlNz+NeLdxSJ6xdUaB5PM7xdbiLsIyTUcwa7AUKBtcVU6yq6qttbk9VyO0KqDgLywSuEL+9PkFhthuPg=="
"resolved" "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"ansi-colors" "^4.1.3"
"@abp/bootstrap-datepicker@~10.3.0":
"integrity" "sha512-7mRuRRIE4R0yw1cZuoIskgrqZPUa5/SJzse0K6u+/QDqvyLjjOsyE51WuqAXxlVfKpLp/fBvXZwnCDeCRU9iZQ=="
"resolved" "https://registry.npmjs.org/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"bootstrap-datepicker" "^1.10.1"
"@abp/bootstrap-daterangepicker@~10.3.0":
"integrity" "sha512-ejLu3sWhfNDlsXeUXAQudZvPv0xM4McxIK65vuVEZiKIwFSnrLYil8jBi12EJJmAw5yYA/KC0EdyG82E+AWpmA=="
"resolved" "https://registry.npmjs.org/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/moment" "~10.3.0"
"bootstrap-daterangepicker" "^3.1.0"
"@abp/bootstrap@~10.3.0":
"integrity" "sha512-JnVOeJUyR78oo+QURvaNqa9xGZaVux0PRIpFpd4Qsqiiz9FvJrbCuSoBkkZoj/0eH23WoZ3bJxy0K9LDE19qvg=="
"resolved" "https://registry.npmjs.org/@abp/bootstrap/-/bootstrap-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/core" "~10.3.0"
"@abp/popper.js" "~10.3.0"
"bootstrap" "^5.3.8"
"@abp/core@~10.3.0":
"integrity" "sha512-DpL4qrsyCUolypUwxKVDDK8bPVhNbYKx6l2ytUjoOu73CwgPoCSGkvHWrmKIsEsmTfOC9J7+GDErh8jWR/5pVA=="
"resolved" "https://registry.npmjs.org/@abp/core/-/core-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/utils" "~10.3.0"
"@abp/datatables.net-bs5@~10.3.0":
"integrity" "sha512-I8rEU98kEhsNZjVdpPvOcG6F4xr1CgIRb0bTf5bfd8ufzxEUKB+xF9bguJIB5kYwjme8QbMlcJ0V/c+N4iewtQ=="
"resolved" "https://registry.npmjs.org/@abp/datatables.net-bs5/-/datatables.net-bs5-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/datatables.net" "~10.3.0"
"datatables.net-bs5" "^2.3.4"
"@abp/datatables.net@~10.3.0":
"integrity" "sha512-imM25WmO1V0hqeG5iPeLvYMID2HX7SG9drz47qilr74MhpY2i2J7HlsvZDonNkjpxzhK4DHpGeQd6mE2QzG7Hw=="
"resolved" "https://registry.npmjs.org/@abp/datatables.net/-/datatables.net-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/jquery" "~10.3.0"
"datatables.net" "^2.3.4"
"@abp/font-awesome@~10.3.0":
"integrity" "sha512-RUOVHxDyT81hp01DhUuSshKvLM+NiTt9VP+O4/rSj+SOaSJAm3wX7eziCKrDi6H41FwhoZL75CifLhcZVyVO4A=="
"resolved" "https://registry.npmjs.org/@abp/font-awesome/-/font-awesome-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/core" "~10.3.0"
"@fortawesome/fontawesome-free" "^7.0.1"
"@abp/jquery-validation-unobtrusive@~10.3.0":
"integrity" "sha512-j/9fA7tAs1/t3P2U1kKUiDlHAImmseul6KzvV77sNpnms7g4+x6Fgsa+sMzicSRGOLz7lK5RHdBFyvfKxt7/nA=="
"resolved" "https://registry.npmjs.org/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/jquery-validation" "~10.3.0"
"jquery-validation-unobtrusive" "^4.0.0"
"@abp/jquery-validation@~10.3.0":
"integrity" "sha512-Wo95ZJLS1ScKm7dm3zFlEFUKqXrqo3m9+82DX5mFJUVCHHuBPrhxvDjxNJ18z4gpoOUu08uqxX7LFbphtkRM3g=="
"resolved" "https://registry.npmjs.org/@abp/jquery-validation/-/jquery-validation-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/jquery" "~10.3.0"
"jquery-validation" "^1.21.0"
"@abp/jquery@~10.3.0":
"integrity" "sha512-TndX/8bJx5vGAAwIykx2CJUZIFFDkwpD+cUjE45WO2dSrY2M5vNfWiuw95OcLGngO8RaT/gTkFGzPuZqKn9ggg=="
"resolved" "https://registry.npmjs.org/@abp/jquery/-/jquery-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/core" "~10.3.0"
"jquery" "~3.7.1"
"@abp/lodash@~10.3.0":
"integrity" "sha512-7JDU9UlbD+9odhFQjolvyJZ6EQKG5kiL2Pt9T1RMVchNh47iEuZwfi8c+CIxa3YxA3n6lAsZ+8Pmxq4yOku+RQ=="
"resolved" "https://registry.npmjs.org/@abp/lodash/-/lodash-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/core" "~10.3.0"
"lodash" "^4.17.21"
"@abp/luxon@~10.3.0":
"integrity" "sha512-IIi2+odQzuFK4qV1KJ2HtlTewSPby2F9CJFNNtNRMzX/P30dQkAGWpNV5/FZzJwFIihR+zSei5wlu11WpPugsw=="
"resolved" "https://registry.npmjs.org/@abp/luxon/-/luxon-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/core" "~9.2.1"
select2 "^4.0.13"
"@abp/core" "~10.3.0"
"luxon" "^3.7.2"
"@abp/sweetalert2@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.1.tgz#3db7e33855614460d2fdc5e3f8b65530902fcd9a"
integrity sha512-fJYLVxc5pAJoSLIcQYf5xRkPVnVQi/5+xwTgOePy3QeygOrAMpGS7vy+MIq7Mn+tBoEFlQ/Jn+NoB04AIYYPFw==
"@abp/malihu-custom-scrollbar-plugin@~10.3.0":
"integrity" "sha512-hJjwEExP3hKE1MNDG+pcvoHRFUihh3t/0wCPNaoePFd8+QnJuyQ9U0VA+vdtykTxm8uFNE2uaCgyHffoHmzeZA=="
"resolved" "https://registry.npmjs.org/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/core" "~9.2.1"
sweetalert2 "^11.14.1"
"@abp/core" "~10.3.0"
"malihu-custom-scrollbar-plugin" "^3.1.5"
"@abp/timeago@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.1.tgz#6904e2d7bda57b436e3385c5fd1899b9cd806dd8"
integrity sha512-fmsPuBouWR/BvhXN53yJpg1Se06uIL7ox8XOgx1MHCe+1vxbXnFCtM2VujfowWtOSTJOzbL1DHcDpFE7JlkOag==
"@abp/moment@~10.3.0":
"integrity" "sha512-8DKw2jgC/28nLrB/CR9BiyUSt0pUmWF+bEgAsduln6VrSCHn0aRLqgs+wi/9Ol+1bl7pO2wbJOYg1qbnkDhrAQ=="
"resolved" "https://registry.npmjs.org/@abp/moment/-/moment-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/jquery" "~9.2.1"
timeago "^1.6.7"
"moment" "^2.30.1"
"@abp/utils@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.1.tgz#803fd48927ae332309f8a7005806c6aa6e499750"
integrity sha512-+j0SNB/K2j2xTTijy/qCL3ds2c/7OW4nrJ8Ccq17WtEqP+jk2TtJi0EnLqhNTDih0A++XV+pcftUC+cQ0h1cUw==
"@abp/popper.js@~10.3.0":
"integrity" "sha512-Yfafs50t7DKnShxAl9WPpihZxG5cLAt99rJmIyXBYUQIpkHkxDyUIA5b4gCoVCqKgjFDOxG7i6L+Ovd/2N8k7g=="
"resolved" "https://registry.npmjs.org/@abp/popper.js/-/popper.js-10.3.0.tgz"
"version" "10.3.0"
dependencies:
just-compare "^2.3.0"
"@fortawesome/fontawesome-free@^6.6.0":
version "6.7.2"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz#8249de9b7e22fcb3ceb5e66090c30a1d5492b81a"
integrity sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==
"@abp/core" "~10.3.0"
"@popperjs/core" "^2.11.8"
ansi-colors@^4.1.3:
version "4.1.3"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==
bootstrap-datepicker@^1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/bootstrap-datepicker/-/bootstrap-datepicker-1.10.0.tgz#61612bbe8bf0a69a5bce32bbcdda93ebb6ccf24a"
integrity sha512-lWxtSYddAQOpbAO8UhYhHLcK6425eWoSjb5JDvZU3ePHEPF6A3eUr51WKaFy4PccU19JRxUG6wEU3KdhtKfvpg==
dependencies:
jquery ">=3.4.0 <4.0.0"
bootstrap-daterangepicker@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/bootstrap-daterangepicker/-/bootstrap-daterangepicker-3.1.0.tgz#632e6fb2de4b6360c5c0a9d5f6adb9aace051fe8"
integrity sha512-oaQZx6ZBDo/dZNyXGVi2rx5GmFXThyQLAxdtIqjtLlYVaQUfQALl5JZMJJZzyDIX7blfy4ppZPAJ10g8Ma4d/g==
"@abp/select2@~10.3.0":
"integrity" "sha512-6sEIYIakVI1DM3eOqOaxwdG8vkyVFBWvVZhoChPZkgIIQ0EH2JLerHv0pePJEl6mQSxOUrikPA8++B2y+sBnQA=="
"resolved" "https://registry.npmjs.org/@abp/select2/-/select2-10.3.0.tgz"
"version" "10.3.0"
dependencies:
jquery ">=1.10"
moment "^2.9.0"
bootstrap@^5.3.3:
version "5.3.7"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.7.tgz#8640065036124d961d885d80b5945745e1154d90"
integrity sha512-7KgiD8UHjfcPBHEpDNg+zGz8L3LqR3GVwqZiBRFX04a1BCArZOz1r2kjly2HQ0WokqTO0v1nF+QAt8dsW4lKlw==
"@abp/core" "~10.3.0"
"select2" "^4.0.13"
datatables.net-bs5@^2.1.8:
version "2.3.2"
resolved "https://registry.yarnpkg.com/datatables.net-bs5/-/datatables.net-bs5-2.3.2.tgz#cffb8007a9f752a997bc70c0dbe9f545edfd18eb"
integrity sha512-1rh0ZTLoiziIQ4oAtgr+IOYVgJfAIceDnbDe535u8kv191pBAdTrKF6ovQO98Xy9mDXLdLNB7QCrLiV/sgPoQw==
"@abp/sweetalert2@~10.3.0":
"integrity" "sha512-bY5MXEiKja+vk71ujSn8rpzRC45Ge8zvcca1k1vBJs+oKyRCii//JBxa3H0lagZo5r/QwIqv5ihdyLE1xsuLSg=="
"resolved" "https://registry.npmjs.org/@abp/sweetalert2/-/sweetalert2-10.3.0.tgz"
"version" "10.3.0"
dependencies:
datatables.net "2.3.2"
jquery ">=1.7"
"@abp/core" "~10.3.0"
"sweetalert2" "^11.23.0"
datatables.net@2.3.2, datatables.net@^2.1.8:
version "2.3.2"
resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-2.3.2.tgz#6821f6288e6ad3cb6879c33e0e7e11d4091d330b"
integrity sha512-31TzwIQM0+pr2ZOEOEH6dsHd/WSAl5GDDGPezOHPI3mM2NK4lcDyOoG8xXeWmSbVfbi852LNK5C84fpp4Q+qxg==
dependencies:
jquery ">=1.7"
jquery-form@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/jquery-form/-/jquery-form-4.3.0.tgz#7d3961c314a1f2d15298f4af1d3943f54f4149c6"
integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ==
"@abp/timeago@~10.3.0":
"integrity" "sha512-Rgcex+jvM9Z9/E0I5Q3wlC2bY5550/+6xRX407k5ho4gxCccYo3c0Gkpiy5pJRFhTwtBgcNzYxArh6NCez+tDg=="
"resolved" "https://registry.npmjs.org/@abp/timeago/-/timeago-10.3.0.tgz"
"version" "10.3.0"
dependencies:
jquery ">=1.7.2"
jquery-mousewheel@>=3.0.6:
version "3.2.2"
resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.2.2.tgz#48c833f6260ee0c46d438a999e7d0060ec9eed0b"
integrity sha512-JP71xTAg08ZY3hcs9ZbYUZ5i+dkSsz4yRl/zpWkAmtzc+kMs5EfPkpkINSidiLYMaR0MTo3DfFGF9WIezMsFQQ==
dependencies:
jquery ">=1.2.6"
jquery-validation-unobtrusive@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz#dfcf25a558496a2c883db6021d10f5398d15f99d"
integrity sha512-1ervYFFv6LX/rp7ktuLnMakHNG0piNRDyROI8Ir3hL1vPIwylAehB1AY3BPrYJnzW3WmwWryZq+Bz4sazZK9iQ==
dependencies:
jquery "^3.6.0"
jquery-validation ">=1.19"
jquery-validation@>=1.19, jquery-validation@^1.21.0:
version "1.21.0"
resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.21.0.tgz#78fc05ab76020912a246af3661b3f54a438bca93"
integrity sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w==
jquery@>=1.10, jquery@>=1.2.6, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2, "jquery@>=3.4.0 <4.0.0", jquery@^3.6.0, jquery@~3.7.1:
version "3.7.1"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de"
integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==
just-compare@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/just-compare/-/just-compare-2.3.0.tgz#a2adcc1d1940536263275f5a1ef1298bcacfeda7"
integrity sha512-6shoR7HDT+fzfL3gBahx1jZG3hWLrhPAf+l7nCwahDdT9XDtosB9kIF0ZrzUp5QY8dJWfQVr5rnsPqsbvflDzg==
lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
luxon@^3.5.0:
version "3.6.1"
resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.6.1.tgz#d283ffc4c0076cb0db7885ec6da1c49ba97e47b0"
integrity sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==
malihu-custom-scrollbar-plugin@^3.1.5:
version "3.1.5"
resolved "https://registry.yarnpkg.com/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.5.tgz#310cecc5e59415a1c29e9dfb5d2b6e01d66a29ef"
integrity sha512-lwW3LgI+CNDMPnP4ED2la6oYxWMkCXlnhex+s2wuOLhFDFGnGmQuTQVdRK9bvDLpxs10sGlfErVufJy9ztfgJQ==
dependencies:
jquery-mousewheel ">=3.0.6"
moment@^2.30.1, moment@^2.9.0:
version "2.30.1"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae"
integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==
select2@^4.0.13:
version "4.0.13"
resolved "https://registry.yarnpkg.com/select2/-/select2-4.0.13.tgz#0dbe377df3f96167c4c1626033e924372d8ef44d"
integrity sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw==
sweetalert2@^11.14.1:
version "11.22.2"
resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-11.22.2.tgz#d4d82a2edd4e97024306fe37f1bc64fa576e9bc9"
integrity sha512-GFQGzw8ZXF23PO79WMAYXLl4zYmLiaKqYJwcp5eBF07wiI5BYPbZtKi2pcvVmfUQK+FqL1risJAMxugcPbGIyg==
timeago@^1.6.7:
version "1.6.7"
resolved "https://registry.yarnpkg.com/timeago/-/timeago-1.6.7.tgz#afd467c29a911e697fc22a81888c7c3022783cb5"
integrity sha512-FikcjN98+ij0siKH4VO4dZ358PR3oDDq4Vdl1+sN9gWz1/+JXGr3uZbUShYH/hL7bMhcTpPbplJU5Tej4b4jbQ==
dependencies:
jquery ">=1.5.0 <4.0"
"@abp/jquery" "~10.3.0"
"timeago" "^1.6.7"
"@abp/utils@~10.3.0":
"integrity" "sha512-iNehxiqWJQl2wwE9EbsQANPv/ITMh0yUcPATUlG/McoLWdpPcqobx75NxXcHDqW8ZarecqSktjJDZPvaUaD+jA=="
"resolved" "https://registry.npmjs.org/@abp/utils/-/utils-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"just-compare" "^2.3.0"
"@fortawesome/fontawesome-free@^7.0.1":
"integrity" "sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg=="
"resolved" "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz"
"version" "7.2.0"
"@popperjs/core@^2.11.8":
"integrity" "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="
"resolved" "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz"
"version" "2.11.8"
"ansi-colors@^4.1.3":
"integrity" "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="
"resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz"
"version" "4.1.3"
"bootstrap-datepicker@^1.10.1":
"integrity" "sha512-GIe+fsLp9Hi30oW7L2v2Q9/a4+aojrIA2p4ZagtLuKw2lpfQgjJjM0L6vl/lYQydGXWUbpoKbEC/O5tzWIkEKQ=="
"resolved" "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.10.1.tgz"
"version" "1.10.1"
dependencies:
"jquery" ">=3.4.0 <4.0.0"
"bootstrap-daterangepicker@^3.1.0":
"integrity" "sha512-oaQZx6ZBDo/dZNyXGVi2rx5GmFXThyQLAxdtIqjtLlYVaQUfQALl5JZMJJZzyDIX7blfy4ppZPAJ10g8Ma4d/g=="
"resolved" "https://registry.npmjs.org/bootstrap-daterangepicker/-/bootstrap-daterangepicker-3.1.0.tgz"
"version" "3.1.0"
dependencies:
"jquery" ">=1.10"
"moment" "^2.9.0"
"bootstrap@^5.3.8":
"integrity" "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg=="
"resolved" "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz"
"version" "5.3.8"
"datatables.net-bs5@^2.3.4":
"integrity" "sha512-TbFH99QSWm93Kn3teHLFKeyOqYbaiddlHvRFdXUwAvh/fjTMhACWmHG+I43ss8d23OEFHV0WIbN4lpPusZm5zw=="
"resolved" "https://registry.npmjs.org/datatables.net-bs5/-/datatables.net-bs5-2.3.8.tgz"
"version" "2.3.8"
dependencies:
"datatables.net" "2.3.8"
"jquery" ">=1.7"
"datatables.net@^2.3.4":
"integrity" "sha512-uhViowhlDlheAuo5a8TrkQqADsjrtGeOyvrigvr4t0+K3MyAWqClORXWAYIcN9VLX6iIX0C8O9gwJNd01hITRg=="
"resolved" "https://registry.npmjs.org/datatables.net/-/datatables.net-2.3.8.tgz"
"version" "2.3.8"
dependencies:
"jquery" ">=1.7"
"datatables.net@2.3.8":
"integrity" "sha512-uhViowhlDlheAuo5a8TrkQqADsjrtGeOyvrigvr4t0+K3MyAWqClORXWAYIcN9VLX6iIX0C8O9gwJNd01hITRg=="
"resolved" "https://registry.npmjs.org/datatables.net/-/datatables.net-2.3.8.tgz"
"version" "2.3.8"
dependencies:
"jquery" ">=1.7"
"jquery-mousewheel@>=3.0.6":
"integrity" "sha1-BvAzXxbjU6aV5yBr9QUDy1I6buU="
"resolved" "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz"
"version" "3.1.13"
"jquery-validation-unobtrusive@^4.0.0":
"integrity" "sha512-1ervYFFv6LX/rp7ktuLnMakHNG0piNRDyROI8Ir3hL1vPIwylAehB1AY3BPrYJnzW3WmwWryZq+Bz4sazZK9iQ=="
"resolved" "https://registry.npmjs.org/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz"
"version" "4.0.0"
dependencies:
"jquery" "^3.6.0"
"jquery-validation" ">=1.19"
"jquery-validation@^1.21.0", "jquery-validation@>=1.19":
"integrity" "sha512-ePLXLWK7Rh5eR652YsuIu7YPeGlCXrsJUteVw5iZopiU17yaMd3FaDggs6yyNMl56p8TYVeDRmKGK3fPZrMeQw=="
"resolved" "https://registry.npmjs.org/jquery-validation/-/jquery-validation-1.22.1.tgz"
"version" "1.22.1"
"jquery@^1.7 || ^2.0 || ^3.1 || ^4.0", "jquery@^3.6.0", "jquery@>=1.10", "jquery@>=1.5.0 <4.0", "jquery@>=1.7", "jquery@>=3.4.0 <4.0.0", "jquery@~3.7.1":
"integrity" "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
"resolved" "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz"
"version" "3.7.1"
"just-compare@^2.3.0":
"integrity" "sha512-6shoR7HDT+fzfL3gBahx1jZG3hWLrhPAf+l7nCwahDdT9XDtosB9kIF0ZrzUp5QY8dJWfQVr5rnsPqsbvflDzg=="
"resolved" "https://registry.npmjs.org/just-compare/-/just-compare-2.3.0.tgz"
"version" "2.3.0"
"lodash@^4.17.21":
"integrity" "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="
"resolved" "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz"
"version" "4.18.1"
"luxon@^3.7.2":
"integrity" "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="
"resolved" "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz"
"version" "3.7.2"
"malihu-custom-scrollbar-plugin@^3.1.5":
"integrity" "sha1-MQzsxeWUFaHCnp37XStuAdZqKe8="
"resolved" "https://registry.npmjs.org/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.5.tgz"
"version" "3.1.5"
dependencies:
"jquery-mousewheel" ">=3.0.6"
"moment@^2.30.1", "moment@^2.9.0":
"integrity" "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="
"resolved" "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz"
"version" "2.30.1"
"select2@^4.0.13":
"integrity" "sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw=="
"resolved" "https://registry.npmjs.org/select2/-/select2-4.0.13.tgz"
"version" "4.0.13"
"sweetalert2@^11.23.0":
"integrity" "sha512-SLgukW4wicewpW5VOukSXY5Z6DL/z7HCOK2ODSjmQPiSphCN8gJAmh9npoceXOtBRNoDN0xIz+zHYthtfiHmjg=="
"resolved" "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.26.24.tgz"
"version" "11.26.24"
"timeago@^1.6.7":
"integrity" "sha512-FikcjN98+ij0siKH4VO4dZ358PR3oDDq4Vdl1+sN9gWz1/+JXGr3uZbUShYH/hL7bMhcTpPbplJU5Tej4b4jbQ=="
"resolved" "https://registry.npmjs.org/timeago/-/timeago-1.6.7.tgz"
"version" "1.6.7"
dependencies:
"jquery" ">=1.5.0 <4.0"

21
samples/WebApp/src/BookStore.MongoDB/MongoDb/MongoDbBookStoreDbSchemaMigrator.cs

@ -2,6 +2,7 @@
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using MongoDB.Driver;
using BookStore.Data;
@ -26,6 +27,7 @@ public class MongoDbBookStoreDbSchemaMigrator : IBookStoreDbSchemaMigrator, ITra
{
var dbContexts = _serviceProvider.GetServices<IAbpMongoDbContext>();
var connectionStringResolver = _serviceProvider.GetRequiredService<IConnectionStringResolver>();
var configuration = _serviceProvider.GetRequiredService<IConfiguration>();
if (_serviceProvider.GetRequiredService<ICurrentTenant>().IsAvailable)
{
@ -34,9 +36,22 @@ public class MongoDbBookStoreDbSchemaMigrator : IBookStoreDbSchemaMigrator, ITra
foreach (var dbContext in dbContexts)
{
var connectionString =
await connectionStringResolver.ResolveAsync(
ConnectionStringNameAttribute.GetConnStringName(dbContext.GetType()));
var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(dbContext.GetType());
var connectionString = await connectionStringResolver.ResolveAsync(connectionStringName);
if (connectionString.IsNullOrWhiteSpace())
{
connectionString = await connectionStringResolver.ResolveAsync();
}
if (connectionString.IsNullOrWhiteSpace())
{
connectionString = configuration.GetConnectionString("Default");
}
if (connectionString.IsNullOrWhiteSpace())
{
throw new InvalidOperationException(
$"Could not find a MongoDB connection string for '{connectionStringName}' or 'Default'.");
}
var mongoUrl = new MongoUrl(connectionString);
var databaseName = mongoUrl.DatabaseName;
var client = new MongoClient(mongoUrl);

72
samples/WebAppBlazorServer/README.md

@ -1,58 +1,58 @@
# BookStore
# BookStore Blazor Server Sample
## About this solution
This sample demonstrates the AntDesign theme in an ABP Blazor Server application.
This is a layered startup solution based on [Domain Driven Design (DDD)](https://abp.io/docs/latest/framework/architecture/domain-driven-design) practises. All the fundamental ABP modules are already installed. Check the [Application Startup Template](https://abp.io/docs/latest/solution-templates/layered-web-application) documentation for more info.
## Prerequisites
### Pre-requirements
- .NET SDK 10.0+
- Node.js 18 or newer
- MongoDB
- ABP CLI (`dotnet tool install -g Volo.Abp.Cli` if needed)
* [.net10.0+ SDK](https://dotnet.microsoft.com/download/dotnet)
* [Node v18 or 20](https://nodejs.org/en)
## Run
### Configurations
Install front-end libraries:
The solution comes with a default configuration that works out of the box. However, you may consider to change the following configuration before running your solution:
* Check the `ConnectionStrings` in `appsettings.json` files under the `BookStore.Blazor` and `BookStore.DbMigrator` projects and change it if you need.
### Before running the application
* Run `abp install-libs` command on your solution folder to install client-side package dependencies. This step is automatically done when you create a new solution, if you didn't especially disabled it. However, you should run it yourself if you have first cloned this solution from your source control, or added a new client-side package dependency to your solution.
* Run `BookStore.DbMigrator` to create the initial database. This step is also automatically done when you create a new solution, if you didn't especially disabled it. This should be done in the first run. It is also needed if a new database migration is added to the solution later.
#### Generating a Signing Certificate
In the production environment, you need to use a production signing certificate. ABP Framework sets up signing and encryption certificates in your application and expects an `openiddict.pfx` file in your application.
```bash
abp install-libs
```
To generate a signing certificate, you can use the following command:
Apply database migrations and seed data:
```bash
dotnet dev-certs https -v -ep openiddict.pfx -p d6d09f80-360d-4bc1-b9c5-f9cbfc2cb8f3
dotnet run --project .\src\BookStore.DbMigrator\
```
> `d6d09f80-360d-4bc1-b9c5-f9cbfc2cb8f3` is the password of the certificate, you can change it to any password you want.
It is recommended to use **two** RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing.
Start the Blazor Server app:
For more information, please refer to: [OpenIddict Certificate Configuration](https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html#registering-a-certificate-recommended-for-production-ready-scenarios)
```bash
dotnet run --project .\src\BookStore.Blazor\
```
> Also, see the [Configuring OpenIddict](https://abp.io/docs/latest/Deployment/Configuring-OpenIddict#production-environment) documentation for more information.
Open `https://localhost:44322`.
### Solution structure
## Default Login
This is a layered monolith application that consists of the following applications:
- Username: `admin`
- Password: `1q2w3E*`
* `BookStore.DbMigrator`: A console application which applies the migrations and also seeds the initial data. It is useful on development as well as on production environment.
* `BookStore.Blazor`: ASP.NET Core Blazor Server application that is the essential web application of the solution.
## What To Verify
- The application uses the refactored AntDesign Pro-style layout.
- The sidebar is responsive and can collapse on smaller screens.
- Authenticated users can open the floating theme settings panel.
- Theme settings apply immediately without restarting the application.
## Deploying the application
## Theme Settings Management
Deploying an ABP application follows the same process as deploying any .NET or ASP.NET Core application. However, there are important considerations to keep in mind. For detailed guidance, refer to ABP's [deployment documentation](https://abp.io/docs/latest/Deployment/Index).
This sample is configured with `AntDesignThemeManagement`.
### Additional resources
Go to `Administration -> Settings -> Theme settings management` to control which sections appear in the user-facing panel:
You can see the following resources to learn more about your solution and the ABP Framework:
- `Enable theme settings`
- `Page style setting`
- `Navigation mode`
- `Regional settings`
- `Other settings`
* [Web Application Development Tutorial](https://abp.io/docs/latest/tutorials/book-store/part-1)
* [Application Startup Template](https://abp.io/docs/latest/startup-templates/application/index)
If all child options are disabled, `Enable theme settings` is automatically disabled.

3
samples/WebAppBlazorServer/src/BookStore.Blazor/BookStore.Blazor.abppkg

@ -1,3 +1,4 @@
{
"role": "host.blazor-server"
"role": "host.blazor-server",
"projectId": "97bca713-f461-4f87-92d0-fb96867f0a10"
}

1
samples/WebAppBlazorServer/src/BookStore.Blazor/BookStore.Blazor.csproj

@ -34,6 +34,7 @@
<ProjectReference Include="..\..\..\..\modules\SettingManagement\Lsw.Abp.SettingManagement.Blazor.Server.AntDesignUI\Lsw.Abp.SettingManagement.Blazor.Server.AntDesignUI.csproj" />
<ProjectReference Include="..\..\..\..\modules\TenantManagement\Lsw.Abp.TenantManagement.Blazor.Server.AntDesignUI\Lsw.Abp.TenantManagement.Blazor.Server.AntDesignUI.csproj" />
<ProjectReference Include="..\..\..\..\modules\FeatureManagement\Lsw.Abp.FeatureManagement.Blazor.Server.AntDesignUI\Lsw.Abp.FeatureManagement.Blazor.Server.AntDesignUI.csproj" />
<ProjectReference Include="..\..\..\..\modules\AntDesignThemeManagement\Lsw.Abp.AntDesignThemeManagement.Blazor.Server\Lsw.Abp.AntDesignThemeManagement.Blazor.Server.csproj" />
</ItemGroup>
<ItemGroup>

6
samples/WebAppBlazorServer/src/BookStore.Blazor/BookStoreBlazorModule.cs

@ -17,7 +17,7 @@ using BookStore.Blazor.Menus;
using BookStore.MongoDB;
using BookStore.Localization;
using BookStore.MultiTenancy;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi;
using Volo.Abp;
using Volo.Abp.Account.Web;
using Volo.Abp.AspNetCore.Components.Web;
@ -35,6 +35,8 @@ using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling;
using Volo.Abp.Identity;
using Volo.Abp.Autofac;
using Lsw.Abp.IdentityManagement.Blazor.Server.AntDesignUI;
using Lsw.Abp.AntDesignThemeManagement.Blazor.Server;
using Lsw.Abp.AntDesignThemeManagement;
using Lsw.Abp.TenantManagement.Blazor.Server.AntDesignUI;
using Lsw.Abp.SettingManagement.Blazor.Server.AntDesignUI;
using Lsw.Abp.FeatureManagement.Blazor.Server.AntDesignUI;
@ -65,6 +67,7 @@ namespace BookStore.Blazor;
typeof(AbpAspNetCoreMvcUiLeptonXLiteThemeModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(AbpFeatureManagementBlazorServerAntDesignModule),
typeof(AbpAntDesignThemeManagementBlazorServerModule),
typeof(AbpSettingManagementBlazorServerAntDesignModule),
typeof(AbpMapperlyModule)
)]
@ -264,6 +267,7 @@ public class BookStoreBlazorModule : AbpModule
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly);
options.ConventionalControllers.Create(typeof(AbpAntDesignThemeManagementApplicationModule).Assembly);
});
}

3743
samples/WebAppBlazorServer/src/BookStore.Blazor/package-lock.json

File diff suppressed because it is too large

4
samples/WebAppBlazorServer/src/BookStore.Blazor/package.json

@ -3,7 +3,7 @@
"name": "my-app",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.2.0",
"@abp/aspnetcore.components.server.leptonxlitetheme": "~4.2.0"
"@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~5.3.0",
"@abp/aspnetcore.components.server.leptonxlitetheme": "~5.3.0"
}
}

612
samples/WebAppBlazorServer/src/BookStore.Blazor/yarn.lock

@ -2,320 +2,324 @@
# yarn lockfile v1
"@abp/aspnetcore.components.server.leptonxlitetheme@~4.2.0":
version "4.2.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.components.server.leptonxlitetheme/-/aspnetcore.components.server.leptonxlitetheme-4.2.1.tgz#3fb1c687940052cc20e93a282ce8fbc61c0844e7"
integrity sha512-2DgQMU6MPAJ7WmcJUaoouk4eAXP8XhJftdcPh+BjB9rCu5FDQnWHqhT6hQOz1DR+KQ3vD3R8jbyZis1sB8InSw==
dependencies:
"@abp/aspnetcore.components.server.theming" "~9.2.1"
"@abp/aspnetcore.components.server.theming@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.components.server.theming/-/aspnetcore.components.server.theming-9.2.1.tgz#9e9e01f6356b4a5616fb706460b0cde53204075a"
integrity sha512-fxOJwzG7YiMYLxYHKLPL3Cv0pynfivOCLqhG+v60Hz4VTUIDqJDy4EJ2EN+LcEAkpYGglzGNmbGh5je+2anzCA==
dependencies:
"@abp/bootstrap" "~9.2.1"
"@abp/font-awesome" "~9.2.1"
"@abp/aspnetcore.mvc.ui.theme.leptonxlite@~4.2.0":
version "4.2.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.leptonxlite/-/aspnetcore.mvc.ui.theme.leptonxlite-4.2.1.tgz#3e3cc78b0d1d56113d459d61e01125bffada0c21"
integrity sha512-unZMV9HY13Kq00FZROVlo9po+foivENEoM7jUmZWlxOQjxBwa3/VJaxwQIXd9DZOqdpJpi5zUv/pSb6DqiZkfg==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.1"
"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.1.tgz#35f6de6f106c80592ce70d36b6e8b20c64862803"
integrity sha512-kZz1tgUguGHxwG1MRkbkeXn9sIjbCOHJcBU+w+XuWwCqigM2yaE+KgnASDcjCrjQiPu6i73hf9OwtxXY1UbGMQ==
dependencies:
"@abp/aspnetcore.mvc.ui" "~9.2.1"
"@abp/bootstrap" "~9.2.1"
"@abp/bootstrap-datepicker" "~9.2.1"
"@abp/bootstrap-daterangepicker" "~9.2.1"
"@abp/datatables.net-bs5" "~9.2.1"
"@abp/font-awesome" "~9.2.1"
"@abp/jquery-form" "~9.2.1"
"@abp/jquery-validation-unobtrusive" "~9.2.1"
"@abp/lodash" "~9.2.1"
"@abp/luxon" "~9.2.1"
"@abp/malihu-custom-scrollbar-plugin" "~9.2.1"
"@abp/moment" "~9.2.1"
"@abp/select2" "~9.2.1"
"@abp/sweetalert2" "~9.2.1"
"@abp/timeago" "~9.2.1"
"@abp/aspnetcore.mvc.ui@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.1.tgz#8b30f830d85f7e1f4a386b0ef8d0444e2550bc42"
integrity sha512-0C41JpevGynbyHGeKkqLUSVNK64QETsKVyVWY4fSZkChGHlD09Fn3qIlHJInpBqJ9qNYs5VQ7RRP02PSum9mAg==
dependencies:
ansi-colors "^4.1.3"
"@abp/bootstrap-datepicker@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.1.tgz#373c8715d175ca23a8871bacdb5f017b070254aa"
integrity sha512-uaCpz5EDSZYDacjnYoqTiktTDFGnGJPEHYh5eG4BORlQta53Hvak7m2CkRVjdOaXtuPLi6EbWPSh2bHIfhKRyQ==
dependencies:
bootstrap-datepicker "^1.10.0"
"@abp/bootstrap-daterangepicker@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.1.tgz#b49e17a4753b09d49bfad6774a7f185e7e5bf71c"
integrity sha512-kd6LEACfx7CBIQOAiE/RHFp/WnthE2iz/eivl3fwuz1VgAO0CBIQ7hYoX91GaAIQgt+OAcgGbOl2G6E284EM9Q==
dependencies:
bootstrap-daterangepicker "^3.1.0"
"@abp/bootstrap@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.1.tgz#ddf624e95f1dab4a8fce8d20b6dccd2b3d3f1679"
integrity sha512-NghAVP7M/Y2y9GYDu7IWo8oW7EyJEO+1NnPqCudpjWX4C6B27d7ghJ7I0MfrHoRq9/hBJZ07AKf3KMAZQD99ng==
dependencies:
"@abp/core" "~9.2.1"
bootstrap "^5.3.3"
"@abp/core@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.1.tgz#f7c635f1fe88fc3fbbc4accaa6aee2dc3b5631a7"
integrity sha512-onCzS2w+U+wBv5FRDCVE176AiyZDMm1D5GaqiEnpuAwsBncFpFyZedC95dtPmykagJbpOvHVSPOLyZ2jzGjcYg==
dependencies:
"@abp/utils" "~9.2.1"
"@abp/datatables.net-bs5@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.1.tgz#ff69059e96d5341166fa8d08390e9bb352010e5d"
integrity sha512-NEkf8xWTIYFDs9lAAPs0hOL2UD+pnVwyix/9IAtip3BIkyPFpLCniNWbu1WhuNJpfmLHrWPSqIrouR80gGL7PQ==
dependencies:
"@abp/datatables.net" "~9.2.1"
datatables.net-bs5 "^2.1.8"
"@abp/datatables.net@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.1.tgz#0a5ab74ca44cd785efb487f0447e8acdea9d7aa1"
integrity sha512-A9TSPRNUV0eeCPnpGV9Htu9ZylUf3e03smYcbEROQHe+htwhcEV5dz8SLAI90baPi2g7VnyPav/3efaqo+ETdg==
dependencies:
"@abp/jquery" "~9.2.1"
datatables.net "^2.1.8"
"@abp/font-awesome@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.1.tgz#a387f1cf457bdb6e3cd30bd9f4c455a41f8ca0b1"
integrity sha512-RVo3422BItdAAmafSCH/mT1Ux8q6yUz7nswGep4beP1k1VfmFExj1mgVphIpAlH3DWyzfnwUOq7lLWf/Ul2dOA==
dependencies:
"@abp/core" "~9.2.1"
"@fortawesome/fontawesome-free" "^6.6.0"
"@abp/jquery-form@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.1.tgz#727b391c36e8ff46b62cb01be14715a05fe74b4f"
integrity sha512-n6EpUNNRzilOzP5rYTWr9K2mPQbvBQAuxPiwUZpfwf+QpJrs+NppJMaC06HFbHcSkDDy/utd+P1/sqWaJjL/tw==
dependencies:
"@abp/jquery" "~9.2.1"
jquery-form "^4.3.0"
"@abp/jquery-validation-unobtrusive@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.1.tgz#98215811818e618d96a1dcac6419962fd39c6fef"
integrity sha512-7no3KxRW3agw4EAM5iTvQjE4+m9JrjuMAV20gAU0uVPB2+sHlluEAks0IU9wz76T+Ac7osferUZz33LgdDvIaw==
dependencies:
"@abp/jquery-validation" "~9.2.1"
jquery-validation-unobtrusive "^4.0.0"
"@abp/jquery-validation@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.1.tgz#559c581523e4e098f2bf67627dfe6c7ef0e1c3c1"
integrity sha512-AEGm3agbwr1f5kmXvpBeiDmsS22P88zVr8NJDICGsgBxZofKndXsDFciNZGu6lXF5qXp8AwGRi//QPaCeQsP8g==
dependencies:
"@abp/jquery" "~9.2.1"
jquery-validation "^1.21.0"
"@abp/jquery@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.1.tgz#bbcc9eab9cef528a8163f5062665ffcf2b87c2f0"
integrity sha512-gdDIKMNEpeUdzUu5C/g6j568ytJ7ifaDxBr1NYf2kJ34p7y6rrBmyY+sL+xR3ZlcGgyPGXyFhTLRD7qTjXlkPg==
dependencies:
"@abp/core" "~9.2.1"
jquery "~3.7.1"
"@abp/lodash@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.1.tgz#a80ab7a908a0332b721277b1193209187fab57d8"
integrity sha512-I2+XYqwMi3+FXCv4xp5hBoJmOszg2WR1gnGc+Qd0zwb2VAbG4MvKVFgM/GUAFD8EKlquGyPf3f+4l5FkaPFkrQ==
dependencies:
"@abp/core" "~9.2.1"
lodash "^4.17.21"
"@abp/luxon@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.1.tgz#7e3d197425813cfc6932cd3f9f09f97ecd2f4fc7"
integrity sha512-2tyOZRmq9jQN0Uhg8WaHfEzL0Xeew04sbA8O9bqw28psRbXaWXEVdElRMBNt50sZkFPhHFoxxFN7PR8obs0Qug==
dependencies:
"@abp/core" "~9.2.1"
luxon "^3.5.0"
"@abp/malihu-custom-scrollbar-plugin@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.1.tgz#b0fa249885d442ba84657c7705df73851cb56db1"
integrity sha512-fzgQZsbN0xLMxEWh7znKAI4j0CPb8ciT/3x+QguGZDJf7OFw0YnEWctfEYJnnGG28HpHs1mh64gjqoeceHy0HQ==
dependencies:
"@abp/core" "~9.2.1"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/moment@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.1.tgz#9982c65d63171962091b08fc4e0d1ea98cc1f0eb"
integrity sha512-V4KH1WmahP0BoaQGLEY4a0AQyfk1cLeNMk3qCPtuqIUbOFwimJY3oQgpelilEwjI3oD/upMzGphjLGrfQLRM2A==
dependencies:
moment "^2.30.1"
"@abp/select2@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.1.tgz#5c3c6a4b0018b533491d6a46540069782559c57a"
integrity sha512-p743cnoohNLKX11ptnBcN5z9+ZyC11M9mwRR6SWbW5f1Eqvbkq03bf2mDFUfukCNis4RefeURZunPlsBOmRn/A==
"@abp/aspnetcore.components.server.leptonxlitetheme@~5.3.0":
"integrity" "sha512-rSkFUgDJiZQ/cKs20AVwyb1YS9KtUwP+OiG4Mr+zIst+GMsLOfK7ZBMd6qlGFN+0dQWVt89EfYckOJimsNE9xg=="
"resolved" "https://registry.npmjs.org/@abp/aspnetcore.components.server.leptonxlitetheme/-/aspnetcore.components.server.leptonxlitetheme-5.3.0.tgz"
"version" "5.3.0"
dependencies:
"@abp/aspnetcore.components.server.theming" "~10.3.0"
"@abp/aspnetcore.components.server.theming@~10.3.0":
"integrity" "sha512-s9MtBQHL5GQAHrZCRczgd0HOWM1++ImeEytT6/znaQRf4iEsR91+MxZdsfuuW4apBJwNO2QqCGefKTmzpxUBzg=="
"resolved" "https://registry.npmjs.org/@abp/aspnetcore.components.server.theming/-/aspnetcore.components.server.theming-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/bootstrap" "~10.3.0"
"@abp/font-awesome" "~10.3.0"
"@abp/aspnetcore.mvc.ui.theme.leptonxlite@~5.3.0":
"integrity" "sha512-gB+Vczz5ZY7wOUjGWgJdcFbhbFRG4nOH/5HMpXWtBxuigapjoofubrgDqVVsOzVtremDRy/uUZomYlEdWiTpQg=="
"resolved" "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui.theme.leptonxlite/-/aspnetcore.mvc.ui.theme.leptonxlite-5.3.0.tgz"
"version" "5.3.0"
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~10.3.0"
"@abp/aspnetcore.mvc.ui.theme.shared@~10.3.0":
"integrity" "sha512-X5xmMSxnIzNJPexvKR9y6jyn0v5n2wscN1SECG/bMI1YdKugMlkfkSuyUmLn+RX9/YdcK0jOsdMhfuzs5mgAOA=="
"resolved" "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/aspnetcore.mvc.ui" "~10.3.0"
"@abp/bootstrap" "~10.3.0"
"@abp/bootstrap-datepicker" "~10.3.0"
"@abp/bootstrap-daterangepicker" "~10.3.0"
"@abp/datatables.net-bs5" "~10.3.0"
"@abp/font-awesome" "~10.3.0"
"@abp/jquery-validation-unobtrusive" "~10.3.0"
"@abp/lodash" "~10.3.0"
"@abp/luxon" "~10.3.0"
"@abp/malihu-custom-scrollbar-plugin" "~10.3.0"
"@abp/moment" "~10.3.0"
"@abp/select2" "~10.3.0"
"@abp/sweetalert2" "~10.3.0"
"@abp/timeago" "~10.3.0"
"@abp/aspnetcore.mvc.ui@~10.3.0":
"integrity" "sha512-kp0XdwrlNz+NeLdxSJ6xdUaB5PM7xdbiLsIyTUcwa7AUKBtcVU6yq6qttbk9VyO0KqDgLywSuEL+9PkFhthuPg=="
"resolved" "https://registry.npmjs.org/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"ansi-colors" "^4.1.3"
"@abp/bootstrap-datepicker@~10.3.0":
"integrity" "sha512-7mRuRRIE4R0yw1cZuoIskgrqZPUa5/SJzse0K6u+/QDqvyLjjOsyE51WuqAXxlVfKpLp/fBvXZwnCDeCRU9iZQ=="
"resolved" "https://registry.npmjs.org/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"bootstrap-datepicker" "^1.10.1"
"@abp/bootstrap-daterangepicker@~10.3.0":
"integrity" "sha512-ejLu3sWhfNDlsXeUXAQudZvPv0xM4McxIK65vuVEZiKIwFSnrLYil8jBi12EJJmAw5yYA/KC0EdyG82E+AWpmA=="
"resolved" "https://registry.npmjs.org/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/moment" "~10.3.0"
"bootstrap-daterangepicker" "^3.1.0"
"@abp/bootstrap@~10.3.0":
"integrity" "sha512-JnVOeJUyR78oo+QURvaNqa9xGZaVux0PRIpFpd4Qsqiiz9FvJrbCuSoBkkZoj/0eH23WoZ3bJxy0K9LDE19qvg=="
"resolved" "https://registry.npmjs.org/@abp/bootstrap/-/bootstrap-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/core" "~10.3.0"
"@abp/popper.js" "~10.3.0"
"bootstrap" "^5.3.8"
"@abp/core@~10.3.0":
"integrity" "sha512-DpL4qrsyCUolypUwxKVDDK8bPVhNbYKx6l2ytUjoOu73CwgPoCSGkvHWrmKIsEsmTfOC9J7+GDErh8jWR/5pVA=="
"resolved" "https://registry.npmjs.org/@abp/core/-/core-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/utils" "~10.3.0"
"@abp/datatables.net-bs5@~10.3.0":
"integrity" "sha512-I8rEU98kEhsNZjVdpPvOcG6F4xr1CgIRb0bTf5bfd8ufzxEUKB+xF9bguJIB5kYwjme8QbMlcJ0V/c+N4iewtQ=="
"resolved" "https://registry.npmjs.org/@abp/datatables.net-bs5/-/datatables.net-bs5-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/datatables.net" "~10.3.0"
"datatables.net-bs5" "^2.3.4"
"@abp/datatables.net@~10.3.0":
"integrity" "sha512-imM25WmO1V0hqeG5iPeLvYMID2HX7SG9drz47qilr74MhpY2i2J7HlsvZDonNkjpxzhK4DHpGeQd6mE2QzG7Hw=="
"resolved" "https://registry.npmjs.org/@abp/datatables.net/-/datatables.net-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/jquery" "~10.3.0"
"datatables.net" "^2.3.4"
"@abp/font-awesome@~10.3.0":
"integrity" "sha512-RUOVHxDyT81hp01DhUuSshKvLM+NiTt9VP+O4/rSj+SOaSJAm3wX7eziCKrDi6H41FwhoZL75CifLhcZVyVO4A=="
"resolved" "https://registry.npmjs.org/@abp/font-awesome/-/font-awesome-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/core" "~10.3.0"
"@fortawesome/fontawesome-free" "^7.0.1"
"@abp/jquery-validation-unobtrusive@~10.3.0":
"integrity" "sha512-j/9fA7tAs1/t3P2U1kKUiDlHAImmseul6KzvV77sNpnms7g4+x6Fgsa+sMzicSRGOLz7lK5RHdBFyvfKxt7/nA=="
"resolved" "https://registry.npmjs.org/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/jquery-validation" "~10.3.0"
"jquery-validation-unobtrusive" "^4.0.0"
"@abp/jquery-validation@~10.3.0":
"integrity" "sha512-Wo95ZJLS1ScKm7dm3zFlEFUKqXrqo3m9+82DX5mFJUVCHHuBPrhxvDjxNJ18z4gpoOUu08uqxX7LFbphtkRM3g=="
"resolved" "https://registry.npmjs.org/@abp/jquery-validation/-/jquery-validation-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/jquery" "~10.3.0"
"jquery-validation" "^1.21.0"
"@abp/jquery@~10.3.0":
"integrity" "sha512-TndX/8bJx5vGAAwIykx2CJUZIFFDkwpD+cUjE45WO2dSrY2M5vNfWiuw95OcLGngO8RaT/gTkFGzPuZqKn9ggg=="
"resolved" "https://registry.npmjs.org/@abp/jquery/-/jquery-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/core" "~10.3.0"
"jquery" "~3.7.1"
"@abp/lodash@~10.3.0":
"integrity" "sha512-7JDU9UlbD+9odhFQjolvyJZ6EQKG5kiL2Pt9T1RMVchNh47iEuZwfi8c+CIxa3YxA3n6lAsZ+8Pmxq4yOku+RQ=="
"resolved" "https://registry.npmjs.org/@abp/lodash/-/lodash-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/core" "~10.3.0"
"lodash" "^4.17.21"
"@abp/luxon@~10.3.0":
"integrity" "sha512-IIi2+odQzuFK4qV1KJ2HtlTewSPby2F9CJFNNtNRMzX/P30dQkAGWpNV5/FZzJwFIihR+zSei5wlu11WpPugsw=="
"resolved" "https://registry.npmjs.org/@abp/luxon/-/luxon-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/core" "~9.2.1"
select2 "^4.0.13"
"@abp/core" "~10.3.0"
"luxon" "^3.7.2"
"@abp/sweetalert2@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.1.tgz#3db7e33855614460d2fdc5e3f8b65530902fcd9a"
integrity sha512-fJYLVxc5pAJoSLIcQYf5xRkPVnVQi/5+xwTgOePy3QeygOrAMpGS7vy+MIq7Mn+tBoEFlQ/Jn+NoB04AIYYPFw==
"@abp/malihu-custom-scrollbar-plugin@~10.3.0":
"integrity" "sha512-hJjwEExP3hKE1MNDG+pcvoHRFUihh3t/0wCPNaoePFd8+QnJuyQ9U0VA+vdtykTxm8uFNE2uaCgyHffoHmzeZA=="
"resolved" "https://registry.npmjs.org/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/core" "~9.2.1"
sweetalert2 "^11.14.1"
"@abp/core" "~10.3.0"
"malihu-custom-scrollbar-plugin" "^3.1.5"
"@abp/timeago@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.1.tgz#6904e2d7bda57b436e3385c5fd1899b9cd806dd8"
integrity sha512-fmsPuBouWR/BvhXN53yJpg1Se06uIL7ox8XOgx1MHCe+1vxbXnFCtM2VujfowWtOSTJOzbL1DHcDpFE7JlkOag==
"@abp/moment@~10.3.0":
"integrity" "sha512-8DKw2jgC/28nLrB/CR9BiyUSt0pUmWF+bEgAsduln6VrSCHn0aRLqgs+wi/9Ol+1bl7pO2wbJOYg1qbnkDhrAQ=="
"resolved" "https://registry.npmjs.org/@abp/moment/-/moment-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"@abp/jquery" "~9.2.1"
timeago "^1.6.7"
"moment" "^2.30.1"
"@abp/utils@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.1.tgz#803fd48927ae332309f8a7005806c6aa6e499750"
integrity sha512-+j0SNB/K2j2xTTijy/qCL3ds2c/7OW4nrJ8Ccq17WtEqP+jk2TtJi0EnLqhNTDih0A++XV+pcftUC+cQ0h1cUw==
"@abp/popper.js@~10.3.0":
"integrity" "sha512-Yfafs50t7DKnShxAl9WPpihZxG5cLAt99rJmIyXBYUQIpkHkxDyUIA5b4gCoVCqKgjFDOxG7i6L+Ovd/2N8k7g=="
"resolved" "https://registry.npmjs.org/@abp/popper.js/-/popper.js-10.3.0.tgz"
"version" "10.3.0"
dependencies:
just-compare "^2.3.0"
"@fortawesome/fontawesome-free@^6.6.0":
version "6.7.2"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz#8249de9b7e22fcb3ceb5e66090c30a1d5492b81a"
integrity sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==
"@abp/core" "~10.3.0"
"@popperjs/core" "^2.11.8"
ansi-colors@^4.1.3:
version "4.1.3"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==
bootstrap-datepicker@^1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/bootstrap-datepicker/-/bootstrap-datepicker-1.10.0.tgz#61612bbe8bf0a69a5bce32bbcdda93ebb6ccf24a"
integrity sha512-lWxtSYddAQOpbAO8UhYhHLcK6425eWoSjb5JDvZU3ePHEPF6A3eUr51WKaFy4PccU19JRxUG6wEU3KdhtKfvpg==
dependencies:
jquery ">=3.4.0 <4.0.0"
bootstrap-daterangepicker@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/bootstrap-daterangepicker/-/bootstrap-daterangepicker-3.1.0.tgz#632e6fb2de4b6360c5c0a9d5f6adb9aace051fe8"
integrity sha512-oaQZx6ZBDo/dZNyXGVi2rx5GmFXThyQLAxdtIqjtLlYVaQUfQALl5JZMJJZzyDIX7blfy4ppZPAJ10g8Ma4d/g==
"@abp/select2@~10.3.0":
"integrity" "sha512-6sEIYIakVI1DM3eOqOaxwdG8vkyVFBWvVZhoChPZkgIIQ0EH2JLerHv0pePJEl6mQSxOUrikPA8++B2y+sBnQA=="
"resolved" "https://registry.npmjs.org/@abp/select2/-/select2-10.3.0.tgz"
"version" "10.3.0"
dependencies:
jquery ">=1.10"
moment "^2.9.0"
bootstrap@^5.3.3:
version "5.3.7"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.7.tgz#8640065036124d961d885d80b5945745e1154d90"
integrity sha512-7KgiD8UHjfcPBHEpDNg+zGz8L3LqR3GVwqZiBRFX04a1BCArZOz1r2kjly2HQ0WokqTO0v1nF+QAt8dsW4lKlw==
"@abp/core" "~10.3.0"
"select2" "^4.0.13"
datatables.net-bs5@^2.1.8:
version "2.3.2"
resolved "https://registry.yarnpkg.com/datatables.net-bs5/-/datatables.net-bs5-2.3.2.tgz#cffb8007a9f752a997bc70c0dbe9f545edfd18eb"
integrity sha512-1rh0ZTLoiziIQ4oAtgr+IOYVgJfAIceDnbDe535u8kv191pBAdTrKF6ovQO98Xy9mDXLdLNB7QCrLiV/sgPoQw==
"@abp/sweetalert2@~10.3.0":
"integrity" "sha512-bY5MXEiKja+vk71ujSn8rpzRC45Ge8zvcca1k1vBJs+oKyRCii//JBxa3H0lagZo5r/QwIqv5ihdyLE1xsuLSg=="
"resolved" "https://registry.npmjs.org/@abp/sweetalert2/-/sweetalert2-10.3.0.tgz"
"version" "10.3.0"
dependencies:
datatables.net "2.3.2"
jquery ">=1.7"
"@abp/core" "~10.3.0"
"sweetalert2" "^11.23.0"
datatables.net@2.3.2, datatables.net@^2.1.8:
version "2.3.2"
resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-2.3.2.tgz#6821f6288e6ad3cb6879c33e0e7e11d4091d330b"
integrity sha512-31TzwIQM0+pr2ZOEOEH6dsHd/WSAl5GDDGPezOHPI3mM2NK4lcDyOoG8xXeWmSbVfbi852LNK5C84fpp4Q+qxg==
dependencies:
jquery ">=1.7"
jquery-form@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/jquery-form/-/jquery-form-4.3.0.tgz#7d3961c314a1f2d15298f4af1d3943f54f4149c6"
integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ==
"@abp/timeago@~10.3.0":
"integrity" "sha512-Rgcex+jvM9Z9/E0I5Q3wlC2bY5550/+6xRX407k5ho4gxCccYo3c0Gkpiy5pJRFhTwtBgcNzYxArh6NCez+tDg=="
"resolved" "https://registry.npmjs.org/@abp/timeago/-/timeago-10.3.0.tgz"
"version" "10.3.0"
dependencies:
jquery ">=1.7.2"
jquery-mousewheel@>=3.0.6:
version "3.2.2"
resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.2.2.tgz#48c833f6260ee0c46d438a999e7d0060ec9eed0b"
integrity sha512-JP71xTAg08ZY3hcs9ZbYUZ5i+dkSsz4yRl/zpWkAmtzc+kMs5EfPkpkINSidiLYMaR0MTo3DfFGF9WIezMsFQQ==
dependencies:
jquery ">=1.2.6"
jquery-validation-unobtrusive@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz#dfcf25a558496a2c883db6021d10f5398d15f99d"
integrity sha512-1ervYFFv6LX/rp7ktuLnMakHNG0piNRDyROI8Ir3hL1vPIwylAehB1AY3BPrYJnzW3WmwWryZq+Bz4sazZK9iQ==
dependencies:
jquery "^3.6.0"
jquery-validation ">=1.19"
jquery-validation@>=1.19, jquery-validation@^1.21.0:
version "1.21.0"
resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.21.0.tgz#78fc05ab76020912a246af3661b3f54a438bca93"
integrity sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w==
jquery@>=1.10, jquery@>=1.2.6, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2, "jquery@>=3.4.0 <4.0.0", jquery@^3.6.0, jquery@~3.7.1:
version "3.7.1"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de"
integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==
just-compare@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/just-compare/-/just-compare-2.3.0.tgz#a2adcc1d1940536263275f5a1ef1298bcacfeda7"
integrity sha512-6shoR7HDT+fzfL3gBahx1jZG3hWLrhPAf+l7nCwahDdT9XDtosB9kIF0ZrzUp5QY8dJWfQVr5rnsPqsbvflDzg==
lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
luxon@^3.5.0:
version "3.6.1"
resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.6.1.tgz#d283ffc4c0076cb0db7885ec6da1c49ba97e47b0"
integrity sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==
malihu-custom-scrollbar-plugin@^3.1.5:
version "3.1.5"
resolved "https://registry.yarnpkg.com/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.5.tgz#310cecc5e59415a1c29e9dfb5d2b6e01d66a29ef"
integrity sha512-lwW3LgI+CNDMPnP4ED2la6oYxWMkCXlnhex+s2wuOLhFDFGnGmQuTQVdRK9bvDLpxs10sGlfErVufJy9ztfgJQ==
dependencies:
jquery-mousewheel ">=3.0.6"
moment@^2.30.1, moment@^2.9.0:
version "2.30.1"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae"
integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==
select2@^4.0.13:
version "4.0.13"
resolved "https://registry.yarnpkg.com/select2/-/select2-4.0.13.tgz#0dbe377df3f96167c4c1626033e924372d8ef44d"
integrity sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw==
sweetalert2@^11.14.1:
version "11.22.2"
resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-11.22.2.tgz#d4d82a2edd4e97024306fe37f1bc64fa576e9bc9"
integrity sha512-GFQGzw8ZXF23PO79WMAYXLl4zYmLiaKqYJwcp5eBF07wiI5BYPbZtKi2pcvVmfUQK+FqL1risJAMxugcPbGIyg==
timeago@^1.6.7:
version "1.6.7"
resolved "https://registry.yarnpkg.com/timeago/-/timeago-1.6.7.tgz#afd467c29a911e697fc22a81888c7c3022783cb5"
integrity sha512-FikcjN98+ij0siKH4VO4dZ358PR3oDDq4Vdl1+sN9gWz1/+JXGr3uZbUShYH/hL7bMhcTpPbplJU5Tej4b4jbQ==
dependencies:
jquery ">=1.5.0 <4.0"
"@abp/jquery" "~10.3.0"
"timeago" "^1.6.7"
"@abp/utils@~10.3.0":
"integrity" "sha512-iNehxiqWJQl2wwE9EbsQANPv/ITMh0yUcPATUlG/McoLWdpPcqobx75NxXcHDqW8ZarecqSktjJDZPvaUaD+jA=="
"resolved" "https://registry.npmjs.org/@abp/utils/-/utils-10.3.0.tgz"
"version" "10.3.0"
dependencies:
"just-compare" "^2.3.0"
"@fortawesome/fontawesome-free@^7.0.1":
"integrity" "sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg=="
"resolved" "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz"
"version" "7.2.0"
"@popperjs/core@^2.11.8":
"integrity" "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="
"resolved" "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz"
"version" "2.11.8"
"ansi-colors@^4.1.3":
"integrity" "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="
"resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz"
"version" "4.1.3"
"bootstrap-datepicker@^1.10.1":
"integrity" "sha512-GIe+fsLp9Hi30oW7L2v2Q9/a4+aojrIA2p4ZagtLuKw2lpfQgjJjM0L6vl/lYQydGXWUbpoKbEC/O5tzWIkEKQ=="
"resolved" "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.10.1.tgz"
"version" "1.10.1"
dependencies:
"jquery" ">=3.4.0 <4.0.0"
"bootstrap-daterangepicker@^3.1.0":
"integrity" "sha512-oaQZx6ZBDo/dZNyXGVi2rx5GmFXThyQLAxdtIqjtLlYVaQUfQALl5JZMJJZzyDIX7blfy4ppZPAJ10g8Ma4d/g=="
"resolved" "https://registry.npmjs.org/bootstrap-daterangepicker/-/bootstrap-daterangepicker-3.1.0.tgz"
"version" "3.1.0"
dependencies:
"jquery" ">=1.10"
"moment" "^2.9.0"
"bootstrap@^5.3.8":
"integrity" "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg=="
"resolved" "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz"
"version" "5.3.8"
"datatables.net-bs5@^2.3.4":
"integrity" "sha512-TbFH99QSWm93Kn3teHLFKeyOqYbaiddlHvRFdXUwAvh/fjTMhACWmHG+I43ss8d23OEFHV0WIbN4lpPusZm5zw=="
"resolved" "https://registry.npmjs.org/datatables.net-bs5/-/datatables.net-bs5-2.3.8.tgz"
"version" "2.3.8"
dependencies:
"datatables.net" "2.3.8"
"jquery" ">=1.7"
"datatables.net@^2.3.4":
"integrity" "sha512-uhViowhlDlheAuo5a8TrkQqADsjrtGeOyvrigvr4t0+K3MyAWqClORXWAYIcN9VLX6iIX0C8O9gwJNd01hITRg=="
"resolved" "https://registry.npmjs.org/datatables.net/-/datatables.net-2.3.8.tgz"
"version" "2.3.8"
dependencies:
"jquery" ">=1.7"
"datatables.net@2.3.8":
"integrity" "sha512-uhViowhlDlheAuo5a8TrkQqADsjrtGeOyvrigvr4t0+K3MyAWqClORXWAYIcN9VLX6iIX0C8O9gwJNd01hITRg=="
"resolved" "https://registry.npmjs.org/datatables.net/-/datatables.net-2.3.8.tgz"
"version" "2.3.8"
dependencies:
"jquery" ">=1.7"
"jquery-mousewheel@>=3.0.6":
"integrity" "sha1-BvAzXxbjU6aV5yBr9QUDy1I6buU="
"resolved" "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz"
"version" "3.1.13"
"jquery-validation-unobtrusive@^4.0.0":
"integrity" "sha512-1ervYFFv6LX/rp7ktuLnMakHNG0piNRDyROI8Ir3hL1vPIwylAehB1AY3BPrYJnzW3WmwWryZq+Bz4sazZK9iQ=="
"resolved" "https://registry.npmjs.org/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz"
"version" "4.0.0"
dependencies:
"jquery" "^3.6.0"
"jquery-validation" ">=1.19"
"jquery-validation@^1.21.0", "jquery-validation@>=1.19":
"integrity" "sha512-ePLXLWK7Rh5eR652YsuIu7YPeGlCXrsJUteVw5iZopiU17yaMd3FaDggs6yyNMl56p8TYVeDRmKGK3fPZrMeQw=="
"resolved" "https://registry.npmjs.org/jquery-validation/-/jquery-validation-1.22.1.tgz"
"version" "1.22.1"
"jquery@^1.7 || ^2.0 || ^3.1 || ^4.0", "jquery@^3.6.0", "jquery@>=1.10", "jquery@>=1.5.0 <4.0", "jquery@>=1.7", "jquery@>=3.4.0 <4.0.0", "jquery@~3.7.1":
"integrity" "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
"resolved" "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz"
"version" "3.7.1"
"just-compare@^2.3.0":
"integrity" "sha512-6shoR7HDT+fzfL3gBahx1jZG3hWLrhPAf+l7nCwahDdT9XDtosB9kIF0ZrzUp5QY8dJWfQVr5rnsPqsbvflDzg=="
"resolved" "https://registry.npmjs.org/just-compare/-/just-compare-2.3.0.tgz"
"version" "2.3.0"
"lodash@^4.17.21":
"integrity" "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="
"resolved" "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz"
"version" "4.18.1"
"luxon@^3.7.2":
"integrity" "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="
"resolved" "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz"
"version" "3.7.2"
"malihu-custom-scrollbar-plugin@^3.1.5":
"integrity" "sha1-MQzsxeWUFaHCnp37XStuAdZqKe8="
"resolved" "https://registry.npmjs.org/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.5.tgz"
"version" "3.1.5"
dependencies:
"jquery-mousewheel" ">=3.0.6"
"moment@^2.30.1", "moment@^2.9.0":
"integrity" "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="
"resolved" "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz"
"version" "2.30.1"
"select2@^4.0.13":
"integrity" "sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw=="
"resolved" "https://registry.npmjs.org/select2/-/select2-4.0.13.tgz"
"version" "4.0.13"
"sweetalert2@^11.23.0":
"integrity" "sha512-SLgukW4wicewpW5VOukSXY5Z6DL/z7HCOK2ODSjmQPiSphCN8gJAmh9npoceXOtBRNoDN0xIz+zHYthtfiHmjg=="
"resolved" "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.26.24.tgz"
"version" "11.26.24"
"timeago@^1.6.7":
"integrity" "sha512-FikcjN98+ij0siKH4VO4dZ358PR3oDDq4Vdl1+sN9gWz1/+JXGr3uZbUShYH/hL7bMhcTpPbplJU5Tej4b4jbQ=="
"resolved" "https://registry.npmjs.org/timeago/-/timeago-1.6.7.tgz"
"version" "1.6.7"
dependencies:
"jquery" ">=1.5.0 <4.0"

21
samples/WebAppBlazorServer/src/BookStore.MongoDB/MongoDb/MongoDbBookStoreDbSchemaMigrator.cs

@ -2,6 +2,7 @@
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using MongoDB.Driver;
using BookStore.Data;
@ -26,6 +27,7 @@ public class MongoDbBookStoreDbSchemaMigrator : IBookStoreDbSchemaMigrator, ITra
{
var dbContexts = _serviceProvider.GetServices<IAbpMongoDbContext>();
var connectionStringResolver = _serviceProvider.GetRequiredService<IConnectionStringResolver>();
var configuration = _serviceProvider.GetRequiredService<IConfiguration>();
if (_serviceProvider.GetRequiredService<ICurrentTenant>().IsAvailable)
{
@ -34,9 +36,22 @@ public class MongoDbBookStoreDbSchemaMigrator : IBookStoreDbSchemaMigrator, ITra
foreach (var dbContext in dbContexts)
{
var connectionString =
await connectionStringResolver.ResolveAsync(
ConnectionStringNameAttribute.GetConnStringName(dbContext.GetType()));
var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(dbContext.GetType());
var connectionString = await connectionStringResolver.ResolveAsync(connectionStringName);
if (connectionString.IsNullOrWhiteSpace())
{
connectionString = await connectionStringResolver.ResolveAsync();
}
if (connectionString.IsNullOrWhiteSpace())
{
connectionString = configuration.GetConnectionString("Default");
}
if (connectionString.IsNullOrWhiteSpace())
{
throw new InvalidOperationException(
$"Could not find a MongoDB connection string for '{connectionStringName}' or 'Default'.");
}
var mongoUrl = new MongoUrl(connectionString);
var databaseName = mongoUrl.DatabaseName;
var client = new MongoClient(mongoUrl);

75
samples/WebAppBlazorWebAssembly/README.md

@ -1,59 +1,64 @@
# BookStore
# BookStore Blazor WebAssembly Sample
## About this solution
This sample demonstrates the AntDesign theme in an ABP Blazor WebAssembly application.
This is a layered startup solution based on [Domain Driven Design (DDD)](https://abp.io/docs/latest/framework/architecture/domain-driven-design) practises. All the fundamental ABP modules are already installed. Check the [Application Startup Template](https://abp.io/docs/latest/solution-templates/layered-web-application) documentation for more info.
## Prerequisites
### Pre-requirements
- .NET SDK 10.0+
- Node.js 18 or newer
- MongoDB
- ABP CLI (`dotnet tool install -g Volo.Abp.Cli` if needed)
* [.net10.0+ SDK](https://dotnet.microsoft.com/download/dotnet)
* [Node v18 or 20](https://nodejs.org/en)
## Run
### Configurations
Install front-end libraries:
The solution comes with a default configuration that works out of the box. However, you may consider to change the following configuration before running your solution:
* Check the `ConnectionStrings` in `appsettings.json` files under the `BookStore.HttpApi.Host` and `BookStore.DbMigrator` projects and change it if you need.
### Before running the application
* Run `abp install-libs` command on your solution folder to install client-side package dependencies. This step is automatically done when you create a new solution, if you didn't especially disabled it. However, you should run it yourself if you have first cloned this solution from your source control, or added a new client-side package dependency to your solution.
* Run `BookStore.DbMigrator` to create the initial database. This step is also automatically done when you create a new solution, if you didn't especially disabled it. This should be done in the first run. It is also needed if a new database migration is added to the solution later.
```bash
abp install-libs
```
#### Generating a Signing Certificate
Apply database migrations and seed data:
In the production environment, you need to use a production signing certificate. ABP Framework sets up signing and encryption certificates in your application and expects an `openiddict.pfx` file in your application.
```bash
dotnet run --project .\src\BookStore.DbMigrator\
```
To generate a signing certificate, you can use the following command:
Start the HTTP API host:
```bash
dotnet dev-certs https -v -ep openiddict.pfx -p 2dae3a4f-9e73-4cb7-b7b9-7ec95c44e1a3
dotnet run --project .\src\BookStore.HttpApi.Host\
```
> `2dae3a4f-9e73-4cb7-b7b9-7ec95c44e1a3` is the password of the certificate, you can change it to any password you want.
It is recommended to use **two** RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing.
Start the Blazor WebAssembly host in another terminal:
For more information, please refer to: [OpenIddict Certificate Configuration](https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html#registering-a-certificate-recommended-for-production-ready-scenarios)
```bash
dotnet run --project .\src\BookStore.Blazor\
```
> Also, see the [Configuring OpenIddict](https://abp.io/docs/latest/Deployment/Configuring-OpenIddict#production-environment) documentation for more information.
Open `https://localhost:44376`.
### Solution structure
## Default Login
This is a layered monolith application that consists of the following applications:
- Username: `admin`
- Password: `1q2w3E*`
* `BookStore.DbMigrator`: A console application which applies the migrations and also seeds the initial data. It is useful on development as well as on production environment.
* `BookStore.HttpApi.Host`: ASP.NET Core API application that is used to expose the APIs to the clients.
* `BookStore.Blazor`: ASP.NET Core Blazor Server application that is the essential web application of the solution.
## What To Verify
- The application uses the refactored AntDesign Pro-style layout.
- The sidebar is responsive and can collapse on smaller screens.
- Authenticated users can open the floating theme settings panel.
- Theme settings apply immediately through the host application service.
## Deploying the application
## Theme Settings Management
Deploying an ABP application follows the same process as deploying any .NET or ASP.NET Core application. However, there are important considerations to keep in mind. For detailed guidance, refer to ABP's [deployment documentation](https://abp.io/docs/latest/Deployment/Index).
This sample is configured with `AntDesignThemeManagement`.
### Additional resources
Go to `Administration -> Settings -> Theme settings management` to control which sections appear in the user-facing panel:
You can see the following resources to learn more about your solution and the ABP Framework:
- `Enable theme settings`
- `Page style setting`
- `Navigation mode`
- `Regional settings`
- `Other settings`
* [Web Application Development Tutorial](https://abp.io/docs/latest/tutorials/book-store/part-1)
* [Application Startup Template](https://abp.io/docs/latest/startup-templates/application/index)
If all child options are disabled, `Enable theme settings` is automatically disabled.

1
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/BookStore.Blazor.Client.csproj

@ -22,6 +22,7 @@
<ItemGroup>
<ProjectReference Include="..\..\..\..\modules\AntDesignTheme\Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme\Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.csproj" />
<ProjectReference Include="..\..\..\..\modules\AntDesignThemeManagement\Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly\Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly.csproj" />
</ItemGroup>
<ItemGroup>

2
samples/WebAppBlazorWebAssembly/src/BookStore.Blazor.Client/BookStoreBlazorClientModule.cs

@ -9,6 +9,7 @@ using Volo.Abp.Localization;
using BookStore.Localization;
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Routing;
using Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme;
using Lsw.Abp.AntDesignThemeManagement.Blazor.WebAssembly;
using Lsw.Abp.FeatureManagement.Blazor.WebAssembly.AntDesignUI;
using Lsw.Abp.IdentityManagement.Blazor.WebAssembly.AntDesignUI;
using Lsw.Abp.SettingManagement.Blazor.WebAssembly.AntDesignUI;
@ -28,6 +29,7 @@ namespace BookStore.Blazor.Client;
typeof(AbpFeatureManagementBlazorWebAssemblyAntDesignModule),
typeof(AbpTenantManagementBlazorWebAssemblyAntDesignModule),
typeof(AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule),
typeof(AbpAntDesignThemeManagementBlazorWebAssemblyModule),
typeof(AbpMapperlyModule),
typeof(BookStoreHttpApiClientModule)
)]

2
samples/WebAppBlazorWebAssembly/src/BookStore.DbMigrator/appsettings.json

@ -1,6 +1,6 @@
{
"ConnectionStrings": {
"Default": "mongodb://localhost:27017/BookStore"
"Default": "mongodb://localhost:27017/BookStore_WebAssembly"
},
"OpenIddict": {
"Applications": {

5
samples/WebAppBlazorWebAssembly/src/BookStore.HttpApi.Host/BookStore.HttpApi.Host.abppkg

@ -1,3 +1,4 @@
{
"role": "host.http-api"
}
"role": "host.http-api",
"projectId": "7c286d0e-2950-4f31-a8bf-5c462e6459bb"
}

1
samples/WebAppBlazorWebAssembly/src/BookStore.HttpApi.Host/BookStore.HttpApi.Host.csproj

@ -36,6 +36,7 @@
<ProjectReference Include="..\BookStore.Application\BookStore.Application.csproj" />
<ProjectReference Include="..\BookStore.HttpApi\BookStore.HttpApi.csproj" />
<ProjectReference Include="..\BookStore.MongoDB\BookStore.MongoDB.csproj" />
<ProjectReference Include="..\..\..\..\modules\AntDesignThemeManagement\Lsw.Abp.AntDesignThemeManagement.Application\Lsw.Abp.AntDesignThemeManagement.Application.csproj" />
</ItemGroup>
<ItemGroup>

5
samples/WebAppBlazorWebAssembly/src/BookStore.HttpApi.Host/BookStoreHttpApiHostModule.cs

@ -15,7 +15,7 @@ using OpenIddict.Validation.AspNetCore;
using OpenIddict.Server.AspNetCore;
using BookStore.MongoDB;
using BookStore.MultiTenancy;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi;
using Volo.Abp;
using Volo.Abp.Studio;
using Volo.Abp.Account;
@ -38,6 +38,7 @@ using Volo.Abp.OpenIddict;
using Volo.Abp.Swashbuckle;
using Volo.Abp.Studio.Client.AspNetCore;
using Volo.Abp.Security.Claims;
using Lsw.Abp.AntDesignThemeManagement;
namespace BookStore;
@ -48,6 +49,7 @@ namespace BookStore;
typeof(AbpAutofacModule),
typeof(AbpAspNetCoreMultiTenancyModule),
typeof(BookStoreApplicationModule),
typeof(AbpAntDesignThemeManagementApplicationModule),
typeof(BookStoreMongoDbModule),
typeof(AbpAccountWebOpenIddictModule),
typeof(AbpSwashbuckleModule),
@ -180,6 +182,7 @@ public class BookStoreHttpApiHostModule : AbpModule
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ConventionalControllers.Create(typeof(BookStoreApplicationModule).Assembly);
options.ConventionalControllers.Create(typeof(AbpAntDesignThemeManagementApplicationModule).Assembly);
});
}

2
samples/WebAppBlazorWebAssembly/src/BookStore.HttpApi.Host/appsettings.json

@ -7,7 +7,7 @@
"HealthCheckUrl": "/health-status"
},
"ConnectionStrings": {
"Default": "mongodb://localhost:27017/BookStore"
"Default": "mongodb://localhost:27017/BookStore_WebAssembly"
},
"AuthServer": {
"Authority": "https://localhost:44318",

2
samples/WebAppBlazorWebAssembly/src/BookStore.HttpApi.Host/package.json

@ -3,6 +3,6 @@
"name": "my-app",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~4.2.0"
"@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~5.3.0"
}
}

335
samples/WebAppBlazorWebAssembly/src/BookStore.HttpApi.Host/yarn.lock

@ -2,202 +2,208 @@
# yarn lockfile v1
"@abp/aspnetcore.mvc.ui.theme.leptonxlite@~4.2.0":
version "4.2.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.leptonxlite/-/aspnetcore.mvc.ui.theme.leptonxlite-4.2.1.tgz#3e3cc78b0d1d56113d459d61e01125bffada0c21"
integrity sha512-unZMV9HY13Kq00FZROVlo9po+foivENEoM7jUmZWlxOQjxBwa3/VJaxwQIXd9DZOqdpJpi5zUv/pSb6DqiZkfg==
"@abp/aspnetcore.mvc.ui.theme.leptonxlite@~5.3.0":
version "5.3.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.leptonxlite/-/aspnetcore.mvc.ui.theme.leptonxlite-5.3.0.tgz#8d7834ddd21f35f4429688617767ae584dffb076"
integrity sha512-gB+Vczz5ZY7wOUjGWgJdcFbhbFRG4nOH/5HMpXWtBxuigapjoofubrgDqVVsOzVtremDRy/uUZomYlEdWiTpQg==
dependencies:
"@abp/aspnetcore.mvc.ui.theme.shared" "~9.2.1"
"@abp/aspnetcore.mvc.ui.theme.shared" "~10.3.0"
"@abp/aspnetcore.mvc.ui.theme.shared@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-9.2.1.tgz#35f6de6f106c80592ce70d36b6e8b20c64862803"
integrity sha512-kZz1tgUguGHxwG1MRkbkeXn9sIjbCOHJcBU+w+XuWwCqigM2yaE+KgnASDcjCrjQiPu6i73hf9OwtxXY1UbGMQ==
"@abp/aspnetcore.mvc.ui.theme.shared@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.3.0.tgz#bcf72b5dd1dea285c3fa7cb1b6ce27c29b985ff7"
integrity sha512-X5xmMSxnIzNJPexvKR9y6jyn0v5n2wscN1SECG/bMI1YdKugMlkfkSuyUmLn+RX9/YdcK0jOsdMhfuzs5mgAOA==
dependencies:
"@abp/aspnetcore.mvc.ui" "~9.2.1"
"@abp/bootstrap" "~9.2.1"
"@abp/bootstrap-datepicker" "~9.2.1"
"@abp/bootstrap-daterangepicker" "~9.2.1"
"@abp/datatables.net-bs5" "~9.2.1"
"@abp/font-awesome" "~9.2.1"
"@abp/jquery-form" "~9.2.1"
"@abp/jquery-validation-unobtrusive" "~9.2.1"
"@abp/lodash" "~9.2.1"
"@abp/luxon" "~9.2.1"
"@abp/malihu-custom-scrollbar-plugin" "~9.2.1"
"@abp/moment" "~9.2.1"
"@abp/select2" "~9.2.1"
"@abp/sweetalert2" "~9.2.1"
"@abp/timeago" "~9.2.1"
"@abp/aspnetcore.mvc.ui@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-9.2.1.tgz#8b30f830d85f7e1f4a386b0ef8d0444e2550bc42"
integrity sha512-0C41JpevGynbyHGeKkqLUSVNK64QETsKVyVWY4fSZkChGHlD09Fn3qIlHJInpBqJ9qNYs5VQ7RRP02PSum9mAg==
"@abp/aspnetcore.mvc.ui" "~10.3.0"
"@abp/bootstrap" "~10.3.0"
"@abp/bootstrap-datepicker" "~10.3.0"
"@abp/bootstrap-daterangepicker" "~10.3.0"
"@abp/datatables.net-bs5" "~10.3.0"
"@abp/font-awesome" "~10.3.0"
"@abp/jquery-validation-unobtrusive" "~10.3.0"
"@abp/lodash" "~10.3.0"
"@abp/luxon" "~10.3.0"
"@abp/malihu-custom-scrollbar-plugin" "~10.3.0"
"@abp/moment" "~10.3.0"
"@abp/select2" "~10.3.0"
"@abp/sweetalert2" "~10.3.0"
"@abp/timeago" "~10.3.0"
"@abp/aspnetcore.mvc.ui@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.3.0.tgz#0d125efd172b6772c516eae82cfe35f144da73fc"
integrity sha512-kp0XdwrlNz+NeLdxSJ6xdUaB5PM7xdbiLsIyTUcwa7AUKBtcVU6yq6qttbk9VyO0KqDgLywSuEL+9PkFhthuPg==
dependencies:
ansi-colors "^4.1.3"
"@abp/bootstrap-datepicker@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-9.2.1.tgz#373c8715d175ca23a8871bacdb5f017b070254aa"
integrity sha512-uaCpz5EDSZYDacjnYoqTiktTDFGnGJPEHYh5eG4BORlQta53Hvak7m2CkRVjdOaXtuPLi6EbWPSh2bHIfhKRyQ==
"@abp/bootstrap-datepicker@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.3.0.tgz#032aaf0e474f971b9f90ca7fb83ff7ca4d7be933"
integrity sha512-7mRuRRIE4R0yw1cZuoIskgrqZPUa5/SJzse0K6u+/QDqvyLjjOsyE51WuqAXxlVfKpLp/fBvXZwnCDeCRU9iZQ==
dependencies:
bootstrap-datepicker "^1.10.0"
bootstrap-datepicker "^1.10.1"
"@abp/bootstrap-daterangepicker@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-9.2.1.tgz#b49e17a4753b09d49bfad6774a7f185e7e5bf71c"
integrity sha512-kd6LEACfx7CBIQOAiE/RHFp/WnthE2iz/eivl3fwuz1VgAO0CBIQ7hYoX91GaAIQgt+OAcgGbOl2G6E284EM9Q==
"@abp/bootstrap-daterangepicker@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.3.0.tgz#b2a9171595ee311c32f57460013870cde67c6b7f"
integrity sha512-ejLu3sWhfNDlsXeUXAQudZvPv0xM4McxIK65vuVEZiKIwFSnrLYil8jBi12EJJmAw5yYA/KC0EdyG82E+AWpmA==
dependencies:
"@abp/moment" "~10.3.0"
bootstrap-daterangepicker "^3.1.0"
"@abp/bootstrap@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-9.2.1.tgz#ddf624e95f1dab4a8fce8d20b6dccd2b3d3f1679"
integrity sha512-NghAVP7M/Y2y9GYDu7IWo8oW7EyJEO+1NnPqCudpjWX4C6B27d7ghJ7I0MfrHoRq9/hBJZ07AKf3KMAZQD99ng==
"@abp/bootstrap@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.3.0.tgz#23535c90613271b02fdad3eae1556b67844729e6"
integrity sha512-JnVOeJUyR78oo+QURvaNqa9xGZaVux0PRIpFpd4Qsqiiz9FvJrbCuSoBkkZoj/0eH23WoZ3bJxy0K9LDE19qvg==
dependencies:
"@abp/core" "~9.2.1"
bootstrap "^5.3.3"
"@abp/core@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-9.2.1.tgz#f7c635f1fe88fc3fbbc4accaa6aee2dc3b5631a7"
integrity sha512-onCzS2w+U+wBv5FRDCVE176AiyZDMm1D5GaqiEnpuAwsBncFpFyZedC95dtPmykagJbpOvHVSPOLyZ2jzGjcYg==
dependencies:
"@abp/utils" "~9.2.1"
"@abp/datatables.net-bs5@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-9.2.1.tgz#ff69059e96d5341166fa8d08390e9bb352010e5d"
integrity sha512-NEkf8xWTIYFDs9lAAPs0hOL2UD+pnVwyix/9IAtip3BIkyPFpLCniNWbu1WhuNJpfmLHrWPSqIrouR80gGL7PQ==
"@abp/core" "~10.3.0"
"@abp/popper.js" "~10.3.0"
bootstrap "^5.3.8"
"@abp/core@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.3.0.tgz#9960f8179d1fdc42250d0bbba60e379590c8199c"
integrity sha512-DpL4qrsyCUolypUwxKVDDK8bPVhNbYKx6l2ytUjoOu73CwgPoCSGkvHWrmKIsEsmTfOC9J7+GDErh8jWR/5pVA==
dependencies:
"@abp/datatables.net" "~9.2.1"
datatables.net-bs5 "^2.1.8"
"@abp/utils" "~10.3.0"
"@abp/datatables.net@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-9.2.1.tgz#0a5ab74ca44cd785efb487f0447e8acdea9d7aa1"
integrity sha512-A9TSPRNUV0eeCPnpGV9Htu9ZylUf3e03smYcbEROQHe+htwhcEV5dz8SLAI90baPi2g7VnyPav/3efaqo+ETdg==
"@abp/datatables.net-bs5@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.3.0.tgz#d8711c52f7c03df51d14d1a5f0e6b00f6d9551fc"
integrity sha512-I8rEU98kEhsNZjVdpPvOcG6F4xr1CgIRb0bTf5bfd8ufzxEUKB+xF9bguJIB5kYwjme8QbMlcJ0V/c+N4iewtQ==
dependencies:
"@abp/jquery" "~9.2.1"
datatables.net "^2.1.8"
"@abp/datatables.net" "~10.3.0"
datatables.net-bs5 "^2.3.4"
"@abp/font-awesome@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-9.2.1.tgz#a387f1cf457bdb6e3cd30bd9f4c455a41f8ca0b1"
integrity sha512-RVo3422BItdAAmafSCH/mT1Ux8q6yUz7nswGep4beP1k1VfmFExj1mgVphIpAlH3DWyzfnwUOq7lLWf/Ul2dOA==
"@abp/datatables.net@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.3.0.tgz#f98319d8e226da5aced4d1d94d3ababb11327074"
integrity sha512-imM25WmO1V0hqeG5iPeLvYMID2HX7SG9drz47qilr74MhpY2i2J7HlsvZDonNkjpxzhK4DHpGeQd6mE2QzG7Hw==
dependencies:
"@abp/core" "~9.2.1"
"@fortawesome/fontawesome-free" "^6.6.0"
"@abp/jquery" "~10.3.0"
datatables.net "^2.3.4"
"@abp/jquery-form@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-9.2.1.tgz#727b391c36e8ff46b62cb01be14715a05fe74b4f"
integrity sha512-n6EpUNNRzilOzP5rYTWr9K2mPQbvBQAuxPiwUZpfwf+QpJrs+NppJMaC06HFbHcSkDDy/utd+P1/sqWaJjL/tw==
"@abp/font-awesome@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.3.0.tgz#43602605f5633132cc6fe21b6ce5ab19b86bdf27"
integrity sha512-RUOVHxDyT81hp01DhUuSshKvLM+NiTt9VP+O4/rSj+SOaSJAm3wX7eziCKrDi6H41FwhoZL75CifLhcZVyVO4A==
dependencies:
"@abp/jquery" "~9.2.1"
jquery-form "^4.3.0"
"@abp/core" "~10.3.0"
"@fortawesome/fontawesome-free" "^7.0.1"
"@abp/jquery-validation-unobtrusive@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-9.2.1.tgz#98215811818e618d96a1dcac6419962fd39c6fef"
integrity sha512-7no3KxRW3agw4EAM5iTvQjE4+m9JrjuMAV20gAU0uVPB2+sHlluEAks0IU9wz76T+Ac7osferUZz33LgdDvIaw==
"@abp/jquery-validation-unobtrusive@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.3.0.tgz#5bc14ed642d48f9eae54761ad39bd9f51beeb005"
integrity sha512-j/9fA7tAs1/t3P2U1kKUiDlHAImmseul6KzvV77sNpnms7g4+x6Fgsa+sMzicSRGOLz7lK5RHdBFyvfKxt7/nA==
dependencies:
"@abp/jquery-validation" "~9.2.1"
"@abp/jquery-validation" "~10.3.0"
jquery-validation-unobtrusive "^4.0.0"
"@abp/jquery-validation@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-9.2.1.tgz#559c581523e4e098f2bf67627dfe6c7ef0e1c3c1"
integrity sha512-AEGm3agbwr1f5kmXvpBeiDmsS22P88zVr8NJDICGsgBxZofKndXsDFciNZGu6lXF5qXp8AwGRi//QPaCeQsP8g==
"@abp/jquery-validation@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.3.0.tgz#e669a54d28f6c0b863a284322e527a5c65cb7dbf"
integrity sha512-Wo95ZJLS1ScKm7dm3zFlEFUKqXrqo3m9+82DX5mFJUVCHHuBPrhxvDjxNJ18z4gpoOUu08uqxX7LFbphtkRM3g==
dependencies:
"@abp/jquery" "~9.2.1"
"@abp/jquery" "~10.3.0"
jquery-validation "^1.21.0"
"@abp/jquery@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-9.2.1.tgz#bbcc9eab9cef528a8163f5062665ffcf2b87c2f0"
integrity sha512-gdDIKMNEpeUdzUu5C/g6j568ytJ7ifaDxBr1NYf2kJ34p7y6rrBmyY+sL+xR3ZlcGgyPGXyFhTLRD7qTjXlkPg==
"@abp/jquery@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.3.0.tgz#3b60bcdfe8f9a33be79db1bea2500837fe09c67d"
integrity sha512-TndX/8bJx5vGAAwIykx2CJUZIFFDkwpD+cUjE45WO2dSrY2M5vNfWiuw95OcLGngO8RaT/gTkFGzPuZqKn9ggg==
dependencies:
"@abp/core" "~9.2.1"
"@abp/core" "~10.3.0"
jquery "~3.7.1"
"@abp/lodash@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-9.2.1.tgz#a80ab7a908a0332b721277b1193209187fab57d8"
integrity sha512-I2+XYqwMi3+FXCv4xp5hBoJmOszg2WR1gnGc+Qd0zwb2VAbG4MvKVFgM/GUAFD8EKlquGyPf3f+4l5FkaPFkrQ==
"@abp/lodash@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.3.0.tgz#bd091fc811d85d2f535802631af6165ac1c8a198"
integrity sha512-7JDU9UlbD+9odhFQjolvyJZ6EQKG5kiL2Pt9T1RMVchNh47iEuZwfi8c+CIxa3YxA3n6lAsZ+8Pmxq4yOku+RQ==
dependencies:
"@abp/core" "~9.2.1"
"@abp/core" "~10.3.0"
lodash "^4.17.21"
"@abp/luxon@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-9.2.1.tgz#7e3d197425813cfc6932cd3f9f09f97ecd2f4fc7"
integrity sha512-2tyOZRmq9jQN0Uhg8WaHfEzL0Xeew04sbA8O9bqw28psRbXaWXEVdElRMBNt50sZkFPhHFoxxFN7PR8obs0Qug==
"@abp/luxon@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.3.0.tgz#acbd92289456a546607ed4506dc36f71e6da53c9"
integrity sha512-IIi2+odQzuFK4qV1KJ2HtlTewSPby2F9CJFNNtNRMzX/P30dQkAGWpNV5/FZzJwFIihR+zSei5wlu11WpPugsw==
dependencies:
"@abp/core" "~9.2.1"
luxon "^3.5.0"
"@abp/core" "~10.3.0"
luxon "^3.7.2"
"@abp/malihu-custom-scrollbar-plugin@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-9.2.1.tgz#b0fa249885d442ba84657c7705df73851cb56db1"
integrity sha512-fzgQZsbN0xLMxEWh7znKAI4j0CPb8ciT/3x+QguGZDJf7OFw0YnEWctfEYJnnGG28HpHs1mh64gjqoeceHy0HQ==
"@abp/malihu-custom-scrollbar-plugin@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.3.0.tgz#209931d02a994ef448371d6203e9ec74c72b61e6"
integrity sha512-hJjwEExP3hKE1MNDG+pcvoHRFUihh3t/0wCPNaoePFd8+QnJuyQ9U0VA+vdtykTxm8uFNE2uaCgyHffoHmzeZA==
dependencies:
"@abp/core" "~9.2.1"
"@abp/core" "~10.3.0"
malihu-custom-scrollbar-plugin "^3.1.5"
"@abp/moment@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-9.2.1.tgz#9982c65d63171962091b08fc4e0d1ea98cc1f0eb"
integrity sha512-V4KH1WmahP0BoaQGLEY4a0AQyfk1cLeNMk3qCPtuqIUbOFwimJY3oQgpelilEwjI3oD/upMzGphjLGrfQLRM2A==
"@abp/moment@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.3.0.tgz#5a5c4ece14d1bc4dd33134f85d1d085733d3c975"
integrity sha512-8DKw2jgC/28nLrB/CR9BiyUSt0pUmWF+bEgAsduln6VrSCHn0aRLqgs+wi/9Ol+1bl7pO2wbJOYg1qbnkDhrAQ==
dependencies:
moment "^2.30.1"
"@abp/select2@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-9.2.1.tgz#5c3c6a4b0018b533491d6a46540069782559c57a"
integrity sha512-p743cnoohNLKX11ptnBcN5z9+ZyC11M9mwRR6SWbW5f1Eqvbkq03bf2mDFUfukCNis4RefeURZunPlsBOmRn/A==
"@abp/popper.js@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-10.3.0.tgz#cb2415e45a905854980f4e864c00c8fe1156a6f9"
integrity sha512-Yfafs50t7DKnShxAl9WPpihZxG5cLAt99rJmIyXBYUQIpkHkxDyUIA5b4gCoVCqKgjFDOxG7i6L+Ovd/2N8k7g==
dependencies:
"@abp/core" "~10.3.0"
"@popperjs/core" "^2.11.8"
"@abp/select2@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.3.0.tgz#199777173ca3e43a5448f8b51b30c3aafe4a3333"
integrity sha512-6sEIYIakVI1DM3eOqOaxwdG8vkyVFBWvVZhoChPZkgIIQ0EH2JLerHv0pePJEl6mQSxOUrikPA8++B2y+sBnQA==
dependencies:
"@abp/core" "~9.2.1"
"@abp/core" "~10.3.0"
select2 "^4.0.13"
"@abp/sweetalert2@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-9.2.1.tgz#3db7e33855614460d2fdc5e3f8b65530902fcd9a"
integrity sha512-fJYLVxc5pAJoSLIcQYf5xRkPVnVQi/5+xwTgOePy3QeygOrAMpGS7vy+MIq7Mn+tBoEFlQ/Jn+NoB04AIYYPFw==
"@abp/sweetalert2@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.3.0.tgz#515e0477574b54bc6650b9f5ee193bfc648c715a"
integrity sha512-bY5MXEiKja+vk71ujSn8rpzRC45Ge8zvcca1k1vBJs+oKyRCii//JBxa3H0lagZo5r/QwIqv5ihdyLE1xsuLSg==
dependencies:
"@abp/core" "~9.2.1"
sweetalert2 "^11.14.1"
"@abp/core" "~10.3.0"
sweetalert2 "^11.23.0"
"@abp/timeago@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-9.2.1.tgz#6904e2d7bda57b436e3385c5fd1899b9cd806dd8"
integrity sha512-fmsPuBouWR/BvhXN53yJpg1Se06uIL7ox8XOgx1MHCe+1vxbXnFCtM2VujfowWtOSTJOzbL1DHcDpFE7JlkOag==
"@abp/timeago@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.3.0.tgz#3214a6d000c79504c9fa7cb4e004a967fe46459b"
integrity sha512-Rgcex+jvM9Z9/E0I5Q3wlC2bY5550/+6xRX407k5ho4gxCccYo3c0Gkpiy5pJRFhTwtBgcNzYxArh6NCez+tDg==
dependencies:
"@abp/jquery" "~9.2.1"
"@abp/jquery" "~10.3.0"
timeago "^1.6.7"
"@abp/utils@~9.2.1":
version "9.2.1"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-9.2.1.tgz#803fd48927ae332309f8a7005806c6aa6e499750"
integrity sha512-+j0SNB/K2j2xTTijy/qCL3ds2c/7OW4nrJ8Ccq17WtEqP+jk2TtJi0EnLqhNTDih0A++XV+pcftUC+cQ0h1cUw==
"@abp/utils@~10.3.0":
version "10.3.0"
resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.3.0.tgz#d88c0d639d69d6210c3070892aac61d5e945c124"
integrity sha512-iNehxiqWJQl2wwE9EbsQANPv/ITMh0yUcPATUlG/McoLWdpPcqobx75NxXcHDqW8ZarecqSktjJDZPvaUaD+jA==
dependencies:
just-compare "^2.3.0"
"@fortawesome/fontawesome-free@^6.6.0":
version "6.7.2"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz#8249de9b7e22fcb3ceb5e66090c30a1d5492b81a"
integrity sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==
"@fortawesome/fontawesome-free@^7.0.1":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz#188c1053ce422ad1f934d7df242a973fcb89636d"
integrity sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg==
"@popperjs/core@^2.11.8":
version "2.11.8"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
ansi-colors@^4.1.3:
version "4.1.3"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==
bootstrap-datepicker@^1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/bootstrap-datepicker/-/bootstrap-datepicker-1.10.0.tgz#61612bbe8bf0a69a5bce32bbcdda93ebb6ccf24a"
integrity sha512-lWxtSYddAQOpbAO8UhYhHLcK6425eWoSjb5JDvZU3ePHEPF6A3eUr51WKaFy4PccU19JRxUG6wEU3KdhtKfvpg==
bootstrap-datepicker@^1.10.1:
version "1.10.1"
resolved "https://registry.yarnpkg.com/bootstrap-datepicker/-/bootstrap-datepicker-1.10.1.tgz#0a8bec42957ea1ce1272b91bcf2b53696629fb86"
integrity sha512-GIe+fsLp9Hi30oW7L2v2Q9/a4+aojrIA2p4ZagtLuKw2lpfQgjJjM0L6vl/lYQydGXWUbpoKbEC/O5tzWIkEKQ==
dependencies:
jquery ">=3.4.0 <4.0.0"
@ -209,33 +215,26 @@ bootstrap-daterangepicker@^3.1.0:
jquery ">=1.10"
moment "^2.9.0"
bootstrap@^5.3.3:
version "5.3.7"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.7.tgz#8640065036124d961d885d80b5945745e1154d90"
integrity sha512-7KgiD8UHjfcPBHEpDNg+zGz8L3LqR3GVwqZiBRFX04a1BCArZOz1r2kjly2HQ0WokqTO0v1nF+QAt8dsW4lKlw==
bootstrap@^5.3.8:
version "5.3.8"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.8.tgz#6401a10057a22752d21f4e19055508980656aeed"
integrity sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==
datatables.net-bs5@^2.1.8:
version "2.3.2"
resolved "https://registry.yarnpkg.com/datatables.net-bs5/-/datatables.net-bs5-2.3.2.tgz#cffb8007a9f752a997bc70c0dbe9f545edfd18eb"
integrity sha512-1rh0ZTLoiziIQ4oAtgr+IOYVgJfAIceDnbDe535u8kv191pBAdTrKF6ovQO98Xy9mDXLdLNB7QCrLiV/sgPoQw==
datatables.net-bs5@^2.3.4:
version "2.3.8"
resolved "https://registry.yarnpkg.com/datatables.net-bs5/-/datatables.net-bs5-2.3.8.tgz#7266636ff488429988ca664bc8cb0b7c5e48c563"
integrity sha512-TbFH99QSWm93Kn3teHLFKeyOqYbaiddlHvRFdXUwAvh/fjTMhACWmHG+I43ss8d23OEFHV0WIbN4lpPusZm5zw==
dependencies:
datatables.net "2.3.2"
datatables.net "2.3.8"
jquery ">=1.7"
datatables.net@2.3.2, datatables.net@^2.1.8:
version "2.3.2"
resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-2.3.2.tgz#6821f6288e6ad3cb6879c33e0e7e11d4091d330b"
integrity sha512-31TzwIQM0+pr2ZOEOEH6dsHd/WSAl5GDDGPezOHPI3mM2NK4lcDyOoG8xXeWmSbVfbi852LNK5C84fpp4Q+qxg==
datatables.net@2.3.8, datatables.net@^2.3.4:
version "2.3.8"
resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-2.3.8.tgz#55a8dbe3bd2196951c498ab79bf44602a2bf3229"
integrity sha512-uhViowhlDlheAuo5a8TrkQqADsjrtGeOyvrigvr4t0+K3MyAWqClORXWAYIcN9VLX6iIX0C8O9gwJNd01hITRg==
dependencies:
jquery ">=1.7"
jquery-form@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/jquery-form/-/jquery-form-4.3.0.tgz#7d3961c314a1f2d15298f4af1d3943f54f4149c6"
integrity sha512-q3uaVCEWdLOYUCI6dpNdwf/7cJFOsUgdpq6r0taxtGQ5NJSkOzofyWm4jpOuJ5YxdmL1FI5QR+q+HB63HHLGnQ==
dependencies:
jquery ">=1.7.2"
jquery-mousewheel@>=3.0.6:
version "3.2.2"
resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.2.2.tgz#48c833f6260ee0c46d438a999e7d0060ec9eed0b"
@ -256,7 +255,7 @@ jquery-validation@>=1.19, jquery-validation@^1.21.0:
resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.21.0.tgz#78fc05ab76020912a246af3661b3f54a438bca93"
integrity sha512-xNot0rlUIgu7duMcQ5qb6MGkGL/Z1PQaRJQoZAURW9+a/2PGOUxY36o/WyNeP2T9R6jvWB8Z9lUVvvQWI/Zs5w==
jquery@>=1.10, jquery@>=1.2.6, "jquery@>=1.5.0 <4.0", jquery@>=1.7, jquery@>=1.7.2, "jquery@>=3.4.0 <4.0.0", jquery@^3.6.0, jquery@~3.7.1:
jquery@>=1.10, jquery@>=1.2.6, "jquery@>=1.5.0 <4.0", jquery@>=1.7, "jquery@>=3.4.0 <4.0.0", jquery@^3.6.0, jquery@~3.7.1:
version "3.7.1"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de"
integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==
@ -271,10 +270,10 @@ lodash@^4.17.21:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
luxon@^3.5.0:
version "3.6.1"
resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.6.1.tgz#d283ffc4c0076cb0db7885ec6da1c49ba97e47b0"
integrity sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==
luxon@^3.7.2:
version "3.7.2"
resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.7.2.tgz#d697e48f478553cca187a0f8436aff468e3ba0ba"
integrity sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==
malihu-custom-scrollbar-plugin@^3.1.5:
version "3.1.5"
@ -293,10 +292,10 @@ select2@^4.0.13:
resolved "https://registry.yarnpkg.com/select2/-/select2-4.0.13.tgz#0dbe377df3f96167c4c1626033e924372d8ef44d"
integrity sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw==
sweetalert2@^11.14.1:
version "11.22.2"
resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-11.22.2.tgz#d4d82a2edd4e97024306fe37f1bc64fa576e9bc9"
integrity sha512-GFQGzw8ZXF23PO79WMAYXLl4zYmLiaKqYJwcp5eBF07wiI5BYPbZtKi2pcvVmfUQK+FqL1risJAMxugcPbGIyg==
sweetalert2@^11.23.0:
version "11.26.24"
resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-11.26.24.tgz#25e5ba2b3e6725cec71acddd31832cefe61c8263"
integrity sha512-SLgukW4wicewpW5VOukSXY5Z6DL/z7HCOK2ODSjmQPiSphCN8gJAmh9npoceXOtBRNoDN0xIz+zHYthtfiHmjg==
timeago@^1.6.7:
version "1.6.7"

21
samples/WebAppBlazorWebAssembly/src/BookStore.MongoDB/MongoDb/MongoDbBookStoreDbSchemaMigrator.cs

@ -2,6 +2,7 @@
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using MongoDB.Driver;
using BookStore.Data;
@ -26,6 +27,7 @@ public class MongoDbBookStoreDbSchemaMigrator : IBookStoreDbSchemaMigrator, ITra
{
var dbContexts = _serviceProvider.GetServices<IAbpMongoDbContext>();
var connectionStringResolver = _serviceProvider.GetRequiredService<IConnectionStringResolver>();
var configuration = _serviceProvider.GetRequiredService<IConfiguration>();
if (_serviceProvider.GetRequiredService<ICurrentTenant>().IsAvailable)
{
@ -34,9 +36,22 @@ public class MongoDbBookStoreDbSchemaMigrator : IBookStoreDbSchemaMigrator, ITra
foreach (var dbContext in dbContexts)
{
var connectionString =
await connectionStringResolver.ResolveAsync(
ConnectionStringNameAttribute.GetConnStringName(dbContext.GetType()));
var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(dbContext.GetType());
var connectionString = await connectionStringResolver.ResolveAsync(connectionStringName);
if (connectionString.IsNullOrWhiteSpace())
{
connectionString = await connectionStringResolver.ResolveAsync();
}
if (connectionString.IsNullOrWhiteSpace())
{
connectionString = configuration.GetConnectionString("Default");
}
if (connectionString.IsNullOrWhiteSpace())
{
throw new InvalidOperationException(
$"Could not find a MongoDB connection string for '{connectionStringName}' or 'Default'.");
}
var mongoUrl = new MongoUrl(connectionString);
var databaseName = mongoUrl.DatabaseName;
var client = new MongoClient(mongoUrl);

2
src/Lsw.Abp.AntDesignUI/AbpCrudPageBase.cs

@ -306,7 +306,7 @@ public abstract class AbpCrudPageBase<
protected virtual async Task OnDataGridReadAsync(QueryModel<TListViewModel> e)
{
CurrentSorting = e.SortModel
.Select(c => c.FieldName + (c.Sort == "descend" ? " DESC" : ""))
.Select(c => c.FieldName + (c.SortDirection == SortDirection.Descending ? " DESC" : ""))
.JoinAsString(",");
CurrentPage = e.PageIndex;

Loading…
Cancel
Save