Browse Source

Support Blazor web app

pull/35/head
liangshiwei 2 years ago
parent
commit
71d4fba323
  1. 28
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorServerComponentBundleManager.cs
  2. 56
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/AbpScripts.razor
  3. 56
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/AbpStyles.razor
  4. 11
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/IComponentBundleManager.cs
  5. 10
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Themes/AntDesignTheme/RedirectToLogin.razor
  6. 11
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule.cs
  7. 8
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/AuthenticationOptions.cs
  8. 19
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Bundling/WebAssemblyComponentBundleManager.cs
  9. 3
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/LoginDisplay.razor
  10. 6
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/LoginDisplay.razor.cs
  11. 27
      modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/WebAssemblyRedirectToLogin.razor

28
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme/Bundling/BlazorServerComponentBundleManager.cs

@ -0,0 +1,28 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Bundling;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
using Volo.Abp.DependencyInjection;
namespace Lsw.Abp.AspnetCore.Components.Server.AntDesignTheme.Bundling;
public class BlazorServerComponentBundleManager : IComponentBundleManager, ITransientDependency
{
protected IBundleManager BundleManager { get; }
public BlazorServerComponentBundleManager(IBundleManager bundleManager)
{
BundleManager = bundleManager;
}
public virtual async Task<IReadOnlyList<string>> GetStyleBundleFilesAsync(string bundleName)
{
return (await BundleManager.GetStyleBundleFilesAsync(bundleName)).Select(f => f.FileName).ToList();
}
public virtual async Task<IReadOnlyList<string>> GetScriptBundleFilesAsync(string bundleName)
{
return (await BundleManager.GetScriptBundleFilesAsync(bundleName)).Select(f => f.FileName).ToList();
}
}

56
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/AbpScripts.razor

@ -0,0 +1,56 @@
@using Volo.Abp
@implements IDisposable
@inject IComponentBundleManager BundleManager
@inject PersistentComponentState PersistentComponentState
@if (ScriptFiles != null)
{
foreach (var file in ScriptFiles)
{
<script src="@file"></script>
}
}
@code {
[Parameter]
public List<string>? WebAssemblyScriptFiles { get; set; }
[Parameter]
public string? BundleName { get; set; }
private List<string>? ScriptFiles { get; set; }
private PersistingComponentStateSubscription persistingSubscription;
protected override async Task OnInitializedAsync()
{
if (BundleName == null)
{
throw new AbpException("The BundleName parameter of the AbpScripts component can not be null!");
}
persistingSubscription = PersistentComponentState.RegisterOnPersisting(PersistScriptFiles);
if (PersistentComponentState.TryTakeFromJson<List<string>>(nameof(ScriptFiles), out var restoredStyleFiles))
{
ScriptFiles = restoredStyleFiles;
}
else
{
ScriptFiles = (await BundleManager.GetScriptBundleFilesAsync(BundleName!)).ToList();
}
if (WebAssemblyScriptFiles != null)
{
ScriptFiles?.AddRange(WebAssemblyScriptFiles);
}
}
private Task PersistScriptFiles()
{
PersistentComponentState.PersistAsJson(nameof(ScriptFiles), ScriptFiles);
return Task.CompletedTask;
}
public void Dispose() => persistingSubscription.Dispose();
}

56
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/AbpStyles.razor

@ -0,0 +1,56 @@
@using Volo.Abp
@implements IDisposable
@inject IComponentBundleManager BundleManager
@inject PersistentComponentState PersistentComponentState
@if (StyleFiles != null)
{
foreach (var file in StyleFiles)
{
<link rel="stylesheet" href="@file" />
}
}
@code {
[Parameter]
public List<string>? WebAssemblyStyleFiles { get; set; }
[Parameter]
public string? BundleName { get; set; }
private List<string>? StyleFiles { get; set; }
private PersistingComponentStateSubscription persistingSubscription;
protected override async Task OnInitializedAsync()
{
if (BundleName == null)
{
throw new AbpException("The BundleName parameter of the AbpStyles component can not be null!");
}
persistingSubscription = PersistentComponentState.RegisterOnPersisting(PersistStyleFiles);
if (PersistentComponentState.TryTakeFromJson<List<string>>(nameof(StyleFiles), out var restoredStyleFiles))
{
StyleFiles = restoredStyleFiles;
}
else
{
StyleFiles = (await BundleManager.GetStyleBundleFilesAsync(BundleName!)).ToList();
}
if (OperatingSystem.IsBrowser() && WebAssemblyStyleFiles != null)
{
StyleFiles?.AddRange(WebAssemblyStyleFiles);
}
}
private Task PersistStyleFiles()
{
PersistentComponentState.PersistAsJson(nameof(StyleFiles), StyleFiles);
return Task.CompletedTask;
}
public void Dispose() => persistingSubscription.Dispose();
}

11
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme/Bundling/IComponentBundleManager.cs

@ -0,0 +1,11 @@
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Bundling;
public interface IComponentBundleManager
{
Task<IReadOnlyList<string>> GetStyleBundleFilesAsync(string bundleName);
Task<IReadOnlyList<string>> GetScriptBundleFilesAsync(string bundleName);
}

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

@ -1,16 +1,8 @@
@inject NavigationManager Navigation
@inject IJSRuntime JSRuntime
@code {
protected override void OnInitialized()
{
if (JSRuntime is IJSInProcessRuntime)
{
Navigation.NavigateTo($"authentication/login?returnUrl={Uri.EscapeDataString(Navigation.Uri)}");
}
else
{
Navigation.NavigateTo($"account/login?returnUrl={Uri.EscapeDataString(Navigation.Uri)}", true);
}
Navigation.NavigateTo($"account/login?returnUrl={Uri.EscapeDataString(Navigation.Uri)}", true);
}
}

11
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule.cs

@ -1,6 +1,8 @@
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme;
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Routing;
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Toolbars;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Components.Web;
using Volo.Abp.AspNetCore.Components.WebAssembly;
using Volo.Abp.Http.Client.IdentityModel.WebAssembly;
using Volo.Abp.Modularity;
@ -25,5 +27,14 @@ public class AbpAspNetCoreComponentsWebAssemblyAntDesignThemeModule : AbpModule
{
options.Contributors.Add(new AntDesignThemeToolbarContributor());
});
if (context.Services.ExecutePreConfiguredActions<AbpAspNetCoreComponentsWebOptions>().IsBlazorWebApp)
{
Configure<AuthenticationOptions>(options =>
{
options.LoginUrl = "Account/Login";
options.LogoutUrl = "Account/Logout";
});
}
}
}

8
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/AuthenticationOptions.cs

@ -0,0 +1,8 @@
namespace Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme;
public class AuthenticationOptions
{
public string LoginUrl { get; set; } = "authentication/login";
public string LogoutUrl { get; set; } = "authentication/logout";
}

19
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Bundling/WebAssemblyComponentBundleManager.cs

@ -0,0 +1,19 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Bundling;
using Volo.Abp.DependencyInjection;
namespace Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme.Bundling;
public class WebAssemblyComponentBundleManager : IComponentBundleManager, ITransientDependency
{
public virtual Task<IReadOnlyList<string>> GetStyleBundleFilesAsync(string bundleName)
{
return Task.FromResult<IReadOnlyList<string>>(new List<string>());
}
public virtual Task<IReadOnlyList<string>> GetScriptBundleFilesAsync(string bundleName)
{
return Task.FromResult<IReadOnlyList<string>>(new List<string>());
}
}

3
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/LoginDisplay.razor

@ -1,6 +1,7 @@
@using global::Localization.Resources.AbpUi
@using Microsoft.Extensions.Localization
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.Extensions.Options
@using Microsoft.JSInterop
@inherits Volo.Abp.AspNetCore.Components.AbpComponentBase
@inject IJSRuntime JsRuntime
@ -41,6 +42,6 @@
</Dropdown>
</Authorized>
<NotAuthorized>
<a class="nav-link" href="authentication/login">@UiLocalizer["Login"]</a>
<a class="nav-link" href="@AuthenticationOptions.Value.LoginUrl">@UiLocalizer["Login"]</a>
</NotAuthorized>
</AuthorizeView>

6
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/LoginDisplay.razor.cs

@ -3,6 +3,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
using Microsoft.Extensions.Options;
using Microsoft.JSInterop;
using Volo.Abp.AspNetCore.Components.Web.Security;
using Volo.Abp.UI.Navigation;
@ -16,6 +17,9 @@ public partial class LoginDisplay : IDisposable
[Inject]
protected ApplicationConfigurationChangedService ApplicationConfigurationChangedService { get; set; }
[Inject]
protected IOptions<AuthenticationOptions> AuthenticationOptions { get; set; }
protected ApplicationMenu Menu { get; set; }
@ -59,6 +63,6 @@ public partial class LoginDisplay : IDisposable
private void BeginSignOut()
{
Navigation.NavigateToLogout("authentication/logout");
Navigation.NavigateToLogout(AuthenticationOptions.Value.LogoutUrl);
}
}

27
modules/AntDesignTheme/Lsw.Abp.AspnetCore.Components.WebAssembly.AntDesignTheme/Themes/AntDesignTheme/WebAssemblyRedirectToLogin.razor

@ -0,0 +1,27 @@
@inject NavigationManager Navigation
@using Lsw.Abp.AspnetCore.Components.Web.AntDesignTheme.Themes.AntDesignTheme
@using Microsoft.Extensions.Options
@inject IOptions<AuthenticationOptions> AuthenticationOptions
@inject IOptions<AbpAspNetCoreComponentsWebOptions> AbpAspNetCoreComponentsWebOptions
@using Volo.Abp.DependencyInjection
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using Volo.Abp.AspNetCore.Components.Web
@inherits RedirectToLogin
@attribute [ExposeServices(typeof(RedirectToLogin))]
@attribute [Dependency(ReplaceServices = true)]
@code {
protected override void OnInitialized()
{
if (AbpAspNetCoreComponentsWebOptions.Value.IsBlazorWebApp)
{
Navigation.NavigateTo(AuthenticationOptions.Value.LogoutUrl, forceLoad: true);
}
else
{
Navigation.NavigateToLogin(AuthenticationOptions.Value.LoginUrl);
}
}
}
Loading…
Cancel
Save