From 1221d50d6246f512d6e687ac9562c162e74a0e33 Mon Sep 17 00:00:00 2001 From: Mladen Macanovic Date: Mon, 28 Dec 2020 11:54:42 +0100 Subject: [PATCH 1/8] Update to latest Blazorise 0.9.3-preview4 --- .../src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj | 6 +++--- .../MyCompanyName.MyProjectName.Blazor.csproj | 4 ++-- .../MyCompanyName.MyProjectName.Blazor.Host.csproj | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj b/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj index 1dce47face..de793e078f 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj +++ b/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj @@ -12,9 +12,9 @@ - - - + + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj index 9bc6fb7092..8ac2e020e5 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj index 444e49801f..6bd1d01269 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj @@ -8,8 +8,8 @@ - - + + From 348d1cbda8222f4c3fe3ddaec217979fa728bb77 Mon Sep 17 00:00:00 2001 From: Mladen Macanovic Date: Mon, 28 Dec 2020 11:56:43 +0100 Subject: [PATCH 2/8] Created UiPageProgress component and service --- .../Themes/Basic/MainLayout.razor | 1 + .../Progression/IUiPageProgressService.cs | 10 ++++ .../Progression/NullUiPageProgressService.cs | 14 +++++ .../Progression/UiPageProgressEventArgs.cs | 17 ++++++ .../Progression/UiPageProgressOptions.cs | 13 +++++ .../Progression/UiPageProgressType.cs | 11 ++++ .../BlazoriseUiPageProgressService.cs | 32 ++++++++++ .../Components/UiPageProgress.razor | 1 + .../Components/UiPageProgress.razor.cs | 58 +++++++++++++++++++ 9 files changed, 157 insertions(+) create mode 100644 framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/IUiPageProgressService.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/NullUiPageProgressService.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/UiPageProgressEventArgs.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/UiPageProgressOptions.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/UiPageProgressType.cs create mode 100644 framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs create mode 100644 framework/src/Volo.Abp.BlazoriseUI/Components/UiPageProgress.razor create mode 100644 framework/src/Volo.Abp.BlazoriseUI/Components/UiPageProgress.razor.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/MainLayout.razor b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/MainLayout.razor index e85e899123..5993d17e0d 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/MainLayout.razor +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/MainLayout.razor @@ -21,4 +21,5 @@ + diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/IUiPageProgressService.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/IUiPageProgressService.cs new file mode 100644 index 0000000000..c3855e9c7f --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/IUiPageProgressService.cs @@ -0,0 +1,10 @@ +using System; +using System.Threading.Tasks; + +namespace Volo.Abp.AspNetCore.Components.Progression +{ + public interface IUiPageProgressService + { + Task Go(int? percentage, Action options = null); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/NullUiPageProgressService.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/NullUiPageProgressService.cs new file mode 100644 index 0000000000..887599ce99 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/NullUiPageProgressService.cs @@ -0,0 +1,14 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Components.Progression +{ + public class NullUiPageProgressService : IUiPageProgressService, ITransientDependency + { + public Task Go(int? percentage, Action options = null) + { + return Task.CompletedTask; + } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/UiPageProgressEventArgs.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/UiPageProgressEventArgs.cs new file mode 100644 index 0000000000..74af5cb971 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/UiPageProgressEventArgs.cs @@ -0,0 +1,17 @@ +using System; + +namespace Volo.Abp.AspNetCore.Components.Progression +{ + public class UiPageProgressEventArgs : EventArgs + { + public UiPageProgressEventArgs(int? percentage, UiPageProgressOptions options) + { + Percentage = percentage; + Options = options; + } + + public int? Percentage { get; } + + public UiPageProgressOptions Options { get; } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/UiPageProgressOptions.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/UiPageProgressOptions.cs new file mode 100644 index 0000000000..0ce243552d --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/UiPageProgressOptions.cs @@ -0,0 +1,13 @@ +namespace Volo.Abp.AspNetCore.Components.Progression +{ + /// + /// Options to override page progress appearance. + /// + public class UiPageProgressOptions + { + /// + /// Type or color, of the page progress. + /// + public UiPageProgressType Type { get; set; } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/UiPageProgressType.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/UiPageProgressType.cs new file mode 100644 index 0000000000..db1d00932d --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/UiPageProgressType.cs @@ -0,0 +1,11 @@ +namespace Volo.Abp.AspNetCore.Components.Progression +{ + public enum UiPageProgressType + { + Default, + Info, + Success, + Warning, + Error, + } +} diff --git a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs new file mode 100644 index 0000000000..bb33e42342 --- /dev/null +++ b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs @@ -0,0 +1,32 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.AspNetCore.Components.Progression; +using Volo.Abp.AspNetCore.Components.WebAssembly; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BlazoriseUI +{ + [Dependency(ReplaceServices = true)] + public class BlazoriseUiPageProgressService : IUiPageProgressService, IScopedDependency + { + /// + /// An event raised after the notification is received. + /// + public event EventHandler ProgressChanged; + + public Task Go(int? percentage, Action options = null) + { + var uiPageProgressOptions = CreateDefaultOptions(); + options?.Invoke(uiPageProgressOptions); + + ProgressChanged?.Invoke(this, new UiPageProgressEventArgs(percentage, uiPageProgressOptions)); + + return Task.CompletedTask; + } + + protected virtual UiPageProgressOptions CreateDefaultOptions() + { + return new UiPageProgressOptions(); + } + } +} diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/UiPageProgress.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/UiPageProgress.razor new file mode 100644 index 0000000000..91799182dd --- /dev/null +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/UiPageProgress.razor @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/UiPageProgress.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/UiPageProgress.razor.cs new file mode 100644 index 0000000000..bfb95a1536 --- /dev/null +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/UiPageProgress.razor.cs @@ -0,0 +1,58 @@ +using System; +using Blazorise; +using Microsoft.AspNetCore.Components; +using Volo.Abp.AspNetCore.Components.Progression; + +namespace Volo.Abp.BlazoriseUI.Components +{ + public partial class UiPageProgress : ComponentBase, IDisposable + { + protected PageProgress PageProgressRef { get; set; } + + protected int? Percentage { get; set; } + + protected bool Visible { get; set; } + + protected Color Color { get; set; } + + [Inject] protected BlazoriseUiPageProgressService UiPageProgressService { get; set; } + + protected override void OnInitialized() + { + base.OnInitialized(); + + UiPageProgressService.ProgressChanged += OnProgressChanged; + } + + private async void OnProgressChanged(object sender, UiPageProgressEventArgs e) + { + Percentage = e.Percentage; + Visible = e.Percentage == null || (e.Percentage >= 0 && e.Percentage <= 100); + Color = GetColor(e.Options.Type); + + await PageProgressRef.SetValueAsync(e.Percentage); + + await InvokeAsync(StateHasChanged); + } + + public virtual void Dispose() + { + if (UiPageProgressService != null) + { + UiPageProgressService.ProgressChanged -= OnProgressChanged; + } + } + + protected virtual Color GetColor(UiPageProgressType pageProgressType) + { + return pageProgressType switch + { + UiPageProgressType.Info => Color.Info, + UiPageProgressType.Success => Color.Success, + UiPageProgressType.Warning => Color.Warning, + UiPageProgressType.Error => Color.Danger, + _ => Color.None, + }; + } + } +} From 3f04c995fb7ee02dee6b6aa38dc93a90a92b420c Mon Sep 17 00:00:00 2001 From: Mladen Macanovic Date: Mon, 28 Dec 2020 12:02:24 +0100 Subject: [PATCH 3/8] Implement IUiPageProgressService into IUiPageProgressService --- .../Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs | 68 ++++++++++++++----- 1 file changed, 51 insertions(+), 17 deletions(-) diff --git a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs index 612034af19..4f4d923fd7 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs @@ -13,6 +13,7 @@ using Microsoft.Extensions.Localization; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.AspNetCore.Components; +using Volo.Abp.AspNetCore.Components.Progression; using Volo.Abp.AspNetCore.Components.WebAssembly; using Volo.Abp.Authorization; using Volo.Abp.BlazoriseUI.Components; @@ -172,6 +173,7 @@ namespace Volo.Abp.BlazoriseUI { [Inject] protected TAppService AppService { get; set; } [Inject] protected IStringLocalizer UiLocalizer { get; set; } + [Inject] protected IUiPageProgressService PageProgressService { get; set; } protected virtual int PageSize { get; } = LimitedResultRequestDto.DefaultMaxResultCount; @@ -356,20 +358,46 @@ namespace Volo.Abp.BlazoriseUI return Task.CompletedTask; } + protected virtual async Task RunProcess(Func process) + { + try + { + // null means the progress will loop itself + await PageProgressService?.Go(null, options => + { + options.Type = UiPageProgressType.Info; + }); + + await process.Invoke(); + } + catch (Exception) + { + throw; + } + finally + { + // -1 is not valid value so the progress will hide + await PageProgressService?.Go(-1); + } + } + protected virtual async Task CreateEntityAsync() { if (CreateValidationsRef?.ValidateAll() ?? true) { - await OnCreatingEntityAsync(); + await RunProcess(async () => + { + await OnCreatingEntityAsync(); - await CheckCreatePolicyAsync(); - var createInput = MapToCreateInput(NewEntity); - await AppService.CreateAsync(createInput); - await GetEntitiesAsync(); + await CheckCreatePolicyAsync(); + var createInput = MapToCreateInput(NewEntity); + await AppService.CreateAsync(createInput); + await GetEntitiesAsync(); - await OnCreatedEntityAsync(); + await OnCreatedEntityAsync(); - CreateModal.Hide(); + CreateModal.Hide(); + }); } } @@ -387,16 +415,19 @@ namespace Volo.Abp.BlazoriseUI { if (EditValidationsRef?.ValidateAll() ?? true) { - await OnUpdatingEntityAsync(); + await RunProcess(async () => + { + await OnUpdatingEntityAsync(); - await CheckUpdatePolicyAsync(); - var updateInput = MapToUpdateInput(EditingEntity); - await AppService.UpdateAsync(EditingEntityId, updateInput); - await GetEntitiesAsync(); + await CheckUpdatePolicyAsync(); + var updateInput = MapToUpdateInput(EditingEntity); + await AppService.UpdateAsync(EditingEntityId, updateInput); + await GetEntitiesAsync(); - await OnUpdatedEntityAsync(); + await OnUpdatedEntityAsync(); - EditModal.Hide(); + EditModal.Hide(); + }); } } @@ -412,10 +443,13 @@ namespace Volo.Abp.BlazoriseUI protected virtual async Task DeleteEntityAsync(TListViewModel entity) { - await CheckDeletePolicyAsync(); + await RunProcess(async () => + { + await CheckDeletePolicyAsync(); - await AppService.DeleteAsync(entity.Id); - await GetEntitiesAsync(); + await AppService.DeleteAsync(entity.Id); + await GetEntitiesAsync(); + }); } protected virtual string GetDeleteConfirmationMessage(TListViewModel entity) From 7ac1877b73e4b2f0d8552182b61b65cd8667a10b Mon Sep 17 00:00:00 2001 From: Mladen Macanovic Date: Wed, 30 Dec 2020 12:28:46 +0100 Subject: [PATCH 4/8] IUiPageProgressService moved to AbpBlazorClientHttpMessageHandler --- .../AbpBlazorClientHttpMessageHandler.cs | 29 ++++++++++++++++--- .../Progression/IUiPageProgressService.cs | 11 +++++++ .../Progression/NullUiPageProgressService.cs | 4 ++- .../Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs | 21 +------------- .../BlazoriseUiPageProgressService.cs | 5 +++- .../Components/UiPageProgress.razor.cs | 2 +- 6 files changed, 45 insertions(+), 27 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs index 84f9743a1e..310e9cc8a8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Components; using Microsoft.Extensions.Configuration; using Microsoft.JSInterop; +using Volo.Abp.AspNetCore.Components.Progression; using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.Components.WebAssembly @@ -18,6 +19,8 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly private readonly NavigationManager _navigationManager; + private readonly IUiPageProgressService _uiPageProgressService; + private const string AntiForgeryCookieName = "XSRF-TOKEN"; private const string AntiForgeryHeaderName = "RequestVerificationToken"; @@ -25,19 +28,37 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly public AbpBlazorClientHttpMessageHandler( IJSRuntime jsRuntime, ICookieService cookieService, - NavigationManager navigationManager) + NavigationManager navigationManager, + IUiPageProgressService uiPageProgressService) { _jsRuntime = jsRuntime; _cookieService = cookieService; _navigationManager = navigationManager; + _uiPageProgressService = uiPageProgressService; } protected async override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { - await SetLanguageAsync(request, cancellationToken); - await SetAntiForgeryTokenAsync(request); + try + { + await _uiPageProgressService.Go(null, options => + { + options.Type = UiPageProgressType.Info; + }); - return await base.SendAsync(request, cancellationToken); + await SetLanguageAsync(request, cancellationToken); + await SetAntiForgeryTokenAsync(request); + + return await base.SendAsync(request, cancellationToken); + } + catch (Exception) + { + throw; + } + finally + { + await _uiPageProgressService.Go(-1); + } } private async Task SetLanguageAsync(HttpRequestMessage request, CancellationToken cancellationToken) diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/IUiPageProgressService.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/IUiPageProgressService.cs index c3855e9c7f..fa9781e2d9 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/IUiPageProgressService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/IUiPageProgressService.cs @@ -5,6 +5,17 @@ namespace Volo.Abp.AspNetCore.Components.Progression { public interface IUiPageProgressService { + /// + /// An event raised after the notification is received. + /// + public event EventHandler ProgressChanged; + + /// + /// Sets the progress percentage. + /// + /// Value of the progress from 0 to 100, or null for indeterminate progress. + /// Additional options. + /// Awaitable task. Task Go(int? percentage, Action options = null); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/NullUiPageProgressService.cs b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/NullUiPageProgressService.cs index 887599ce99..5c375e2b40 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/NullUiPageProgressService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo/Abp/AspNetCore/Components/Progression/NullUiPageProgressService.cs @@ -4,8 +4,10 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.Components.Progression { - public class NullUiPageProgressService : IUiPageProgressService, ITransientDependency + public class NullUiPageProgressService : IUiPageProgressService, ISingletonDependency { + public event EventHandler ProgressChanged; + public Task Go(int? percentage, Action options = null) { return Task.CompletedTask; diff --git a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs index 4f4d923fd7..2ec9e8a090 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs @@ -173,7 +173,6 @@ namespace Volo.Abp.BlazoriseUI { [Inject] protected TAppService AppService { get; set; } [Inject] protected IStringLocalizer UiLocalizer { get; set; } - [Inject] protected IUiPageProgressService PageProgressService { get; set; } protected virtual int PageSize { get; } = LimitedResultRequestDto.DefaultMaxResultCount; @@ -360,25 +359,7 @@ namespace Volo.Abp.BlazoriseUI protected virtual async Task RunProcess(Func process) { - try - { - // null means the progress will loop itself - await PageProgressService?.Go(null, options => - { - options.Type = UiPageProgressType.Info; - }); - - await process.Invoke(); - } - catch (Exception) - { - throw; - } - finally - { - // -1 is not valid value so the progress will hide - await PageProgressService?.Go(-1); - } + await process.Invoke(); } protected virtual async Task CreateEntityAsync() diff --git a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs index bb33e42342..92e611df58 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs @@ -7,7 +7,10 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.BlazoriseUI { [Dependency(ReplaceServices = true)] - public class BlazoriseUiPageProgressService : IUiPageProgressService, IScopedDependency + public class BlazoriseUiPageProgressService : IUiPageProgressService, + // WARNING: this is made Singleton because there was an issue with ABP internal DI. + // TODO: make it Scoped once the issue is solved. + ISingletonDependency { /// /// An event raised after the notification is received. diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/UiPageProgress.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/UiPageProgress.razor.cs index bfb95a1536..8a0a8e28d2 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/UiPageProgress.razor.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/UiPageProgress.razor.cs @@ -15,7 +15,7 @@ namespace Volo.Abp.BlazoriseUI.Components protected Color Color { get; set; } - [Inject] protected BlazoriseUiPageProgressService UiPageProgressService { get; set; } + [Inject] protected IUiPageProgressService UiPageProgressService { get; set; } protected override void OnInitialized() { From 106a398d0a05ec2bdfe544d5758d55cce399e4cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 1 Jan 2021 17:36:57 +0300 Subject: [PATCH 5/8] Introduce IClientScopeServiceProviderAccessor to access the main scope for the current client. --- .../AbpWebAssemblyHostBuilderExtensions.cs | 13 +++++--- .../AbpBlazorClientHttpMessageHandler.cs | 8 ++--- ...emblyClientScopeServiceProviderAccessor.cs | 12 +++++++ ...ntextClientScopeServiceProviderAccessor.cs | 33 +++++++++++++++++++ .../BlazoriseUiPageProgressService.cs | 5 +-- .../IClientScopeServiceProviderAccessor.cs | 9 +++++ 6 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/DependencyInjection/WebAssemblyClientScopeServiceProviderAccessor.cs create mode 100644 framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextClientScopeServiceProviderAccessor.cs create mode 100644 framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IClientScopeServiceProviderAccessor.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs index 7cba7ce9b3..9e1752ffda 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/AspNetCore/Components/WebAssembly/Hosting/AbpWebAssemblyHostBuilderExtensions.cs @@ -1,6 +1,5 @@ using System; using System.Globalization; -using System.Reflection; using System.Runtime.CompilerServices; using System.Threading.Tasks; using JetBrains.Annotations; @@ -8,7 +7,9 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Volo.Abp; using Volo.Abp.AspNetCore.Components.WebAssembly; +using Volo.Abp.AspNetCore.Components.WebAssembly.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Client; +using Volo.Abp.DependencyInjection; using Volo.Abp.Modularity; namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting @@ -39,13 +40,17 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting return application; } - public async static Task InitializeAsync( + public static async Task InitializeAsync( [NotNull] this IAbpApplicationWithExternalServiceProvider application, [NotNull] IServiceProvider serviceProvider) { Check.NotNull(application, nameof(application)); Check.NotNull(serviceProvider, nameof(serviceProvider)); + var serviceProviderAccessor = (WebAssemblyClientScopeServiceProviderAccessor) + serviceProvider.GetRequiredService(); + serviceProviderAccessor.ServiceProvider = serviceProvider; + application.Initialize(serviceProvider); using (var scope = serviceProvider.CreateScope()) @@ -55,7 +60,7 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting } } - private async static Task InitializeModulesAsync(IServiceProvider serviceProvider) + private static async Task InitializeModulesAsync(IServiceProvider serviceProvider) { foreach (var service in serviceProvider.GetServices()) { @@ -63,7 +68,7 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting } } - private async static Task SetCurrentLanguageAsync(IServiceScope scope) + private static async Task SetCurrentLanguageAsync(IServiceScope scope) { var configurationClient = scope.ServiceProvider.GetRequiredService(); var utilsService = scope.ServiceProvider.GetRequiredService(); diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs index 310e9cc8a8..fcdf065943 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs @@ -4,7 +4,7 @@ using System.Net.Http.Headers; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Components; -using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.JSInterop; using Volo.Abp.AspNetCore.Components.Progression; using Volo.Abp.DependencyInjection; @@ -29,15 +29,15 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly IJSRuntime jsRuntime, ICookieService cookieService, NavigationManager navigationManager, - IUiPageProgressService uiPageProgressService) + IClientScopeServiceProviderAccessor clientScopeServiceProviderAccessor) { _jsRuntime = jsRuntime; _cookieService = cookieService; _navigationManager = navigationManager; - _uiPageProgressService = uiPageProgressService; + _uiPageProgressService = clientScopeServiceProviderAccessor.ServiceProvider.GetRequiredService(); } - protected async override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { try { diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/DependencyInjection/WebAssemblyClientScopeServiceProviderAccessor.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/DependencyInjection/WebAssemblyClientScopeServiceProviderAccessor.cs new file mode 100644 index 0000000000..74b16ec951 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/DependencyInjection/WebAssemblyClientScopeServiceProviderAccessor.cs @@ -0,0 +1,12 @@ +using System; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Components.WebAssembly.DependencyInjection +{ + public class WebAssemblyClientScopeServiceProviderAccessor : + IClientScopeServiceProviderAccessor, + ISingletonDependency + { + public IServiceProvider ServiceProvider { get; set; } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextClientScopeServiceProviderAccessor.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextClientScopeServiceProviderAccessor.cs new file mode 100644 index 0000000000..943c11ebc3 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/DependencyInjection/HttpContextClientScopeServiceProviderAccessor.cs @@ -0,0 +1,33 @@ +using System; +using Microsoft.AspNetCore.Http; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.DependencyInjection +{ + public class HttpContextClientScopeServiceProviderAccessor : + IClientScopeServiceProviderAccessor, + ISingletonDependency + { + public IServiceProvider ServiceProvider + { + get + { + var httpContext = _httpContextAccessor.HttpContext; + if (httpContext == null) + { + throw new AbpException("HttpContextClientScopeServiceProviderAccessor should only be used in a web request scope!"); + } + + return httpContext.RequestServices; + } + } + + private readonly IHttpContextAccessor _httpContextAccessor; + + public HttpContextClientScopeServiceProviderAccessor( + IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + } +} diff --git a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs index 92e611df58..5285669c00 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiPageProgressService.cs @@ -1,16 +1,13 @@ using System; using System.Threading.Tasks; using Volo.Abp.AspNetCore.Components.Progression; -using Volo.Abp.AspNetCore.Components.WebAssembly; using Volo.Abp.DependencyInjection; namespace Volo.Abp.BlazoriseUI { [Dependency(ReplaceServices = true)] public class BlazoriseUiPageProgressService : IUiPageProgressService, - // WARNING: this is made Singleton because there was an issue with ABP internal DI. - // TODO: make it Scoped once the issue is solved. - ISingletonDependency + IScopedDependency { /// /// An event raised after the notification is received. diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IClientScopeServiceProviderAccessor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IClientScopeServiceProviderAccessor.cs new file mode 100644 index 0000000000..7c1d1ed08d --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IClientScopeServiceProviderAccessor.cs @@ -0,0 +1,9 @@ +using System; + +namespace Volo.Abp.DependencyInjection +{ + public interface IClientScopeServiceProviderAccessor + { + IServiceProvider ServiceProvider { get; } + } +} From 3aa4efaa0a72b20263b505fa4f07f48b0b078438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 1 Jan 2021 17:44:48 +0300 Subject: [PATCH 6/8] Remove unnecessary code. --- .../WebAssembly/AbpBlazorClientHttpMessageHandler.cs | 4 ---- framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs | 4 ---- 2 files changed, 8 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs index fcdf065943..7b40ca5286 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs @@ -51,10 +51,6 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly return await base.SendAsync(request, cancellationToken); } - catch (Exception) - { - throw; - } finally { await _uiPageProgressService.Go(-1); diff --git a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs index 2ec9e8a090..10c421fb6e 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs @@ -8,16 +8,12 @@ using JetBrains.Annotations; using Localization.Resources.AbpUi; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Components; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.AspNetCore.Components; -using Volo.Abp.AspNetCore.Components.Progression; -using Volo.Abp.AspNetCore.Components.WebAssembly; using Volo.Abp.Authorization; using Volo.Abp.BlazoriseUI.Components; -using Volo.Abp.ObjectMapping; namespace Volo.Abp.BlazoriseUI { From 82700d6351121949eb7bc02c0e6c10e392e12e01 Mon Sep 17 00:00:00 2001 From: Mladen Macanovic Date: Mon, 4 Jan 2021 10:21:37 +0100 Subject: [PATCH 7/8] Remove RunProcess method --- .../Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs | 48 +++++++------------ 1 file changed, 17 insertions(+), 31 deletions(-) diff --git a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs index e2c714219a..4a4d4df722 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs @@ -353,28 +353,20 @@ namespace Volo.Abp.BlazoriseUI return Task.CompletedTask; } - protected virtual async Task RunProcess(Func process) - { - await process.Invoke(); - } - protected virtual async Task CreateEntityAsync() { if (CreateValidationsRef?.ValidateAll() ?? true) { - await RunProcess(async () => - { - await OnCreatingEntityAsync(); + await OnCreatingEntityAsync(); - await CheckCreatePolicyAsync(); - var createInput = MapToCreateInput(NewEntity); - await AppService.CreateAsync(createInput); - await GetEntitiesAsync(); + await CheckCreatePolicyAsync(); + var createInput = MapToCreateInput(NewEntity); + await AppService.CreateAsync(createInput); + await GetEntitiesAsync(); - await OnCreatedEntityAsync(); + await OnCreatedEntityAsync(); - CreateModal.Hide(); - }); + CreateModal.Hide(); } } @@ -392,19 +384,16 @@ namespace Volo.Abp.BlazoriseUI { if (EditValidationsRef?.ValidateAll() ?? true) { - await RunProcess(async () => - { - await OnUpdatingEntityAsync(); + await OnUpdatingEntityAsync(); - await CheckUpdatePolicyAsync(); - var updateInput = MapToUpdateInput(EditingEntity); - await AppService.UpdateAsync(EditingEntityId, updateInput); - await GetEntitiesAsync(); + await CheckUpdatePolicyAsync(); + var updateInput = MapToUpdateInput(EditingEntity); + await AppService.UpdateAsync(EditingEntityId, updateInput); + await GetEntitiesAsync(); - await OnUpdatedEntityAsync(); + await OnUpdatedEntityAsync(); - EditModal.Hide(); - }); + EditModal.Hide(); } } @@ -420,13 +409,10 @@ namespace Volo.Abp.BlazoriseUI protected virtual async Task DeleteEntityAsync(TListViewModel entity) { - await RunProcess(async () => - { - await CheckDeletePolicyAsync(); + await CheckDeletePolicyAsync(); - await AppService.DeleteAsync(entity.Id); - await GetEntitiesAsync(); - }); + await AppService.DeleteAsync(entity.Id); + await GetEntitiesAsync(); } protected virtual string GetDeleteConfirmationMessage(TListViewModel entity) From 6753332c2f095faed87df4d1abe3035a892b30a8 Mon Sep 17 00:00:00 2001 From: Mladen Macanovic Date: Mon, 4 Jan 2021 11:16:19 +0100 Subject: [PATCH 8/8] Page progress page documentation and example --- docs/en/UI/Blazor/Page-Progress.md | 61 +++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/docs/en/UI/Blazor/Page-Progress.md b/docs/en/UI/Blazor/Page-Progress.md index 149c35293e..14daa41d3c 100644 --- a/docs/en/UI/Blazor/Page-Progress.md +++ b/docs/en/UI/Blazor/Page-Progress.md @@ -1,3 +1,62 @@ # Blazor UI: Page Progress -TODO \ No newline at end of file +Page progress is the newest component introduced with Blazorise and ABP Framework. It is used to show scoped page progress on top of the page and to indicate to the user that currently a long running process is in the work. By default you don't need to do anything to show the progress indicator, as all the work is done automatically by the ABP Framework internals. This means that all calls to the ABP backend(through Rest API) will activate page progress and show the loading indicator. + +This doesn't mean that you don't have the control over it. On the contrary. If you also want to show progress for your own processes, it is really easy to do. All you have to do is to use `IUiPageProgressService`. + +To use `IUiPageProgressService` you need to inject it into your own Blazor component or page. You have two options of injection. + +1. Parameter injection +2. Constructor injection + +Whichever you chose the end result is the same. In this guide we're going to use parameter injection. So let us begin. + +## Example + +First, inject the `IUiPageProgressService` + +```cs +@inject IUiPageProgressService pageProgressService +``` + +Next, all you have to do is invoke the `Go` method in `IUiPageProgressService`. It's that simple. + +```cs +Task OnClick() +{ + return pageProgressService.Go(null); +} +``` + +The previous example will show the progress with a default settings. If, for example you want to change the progress color you can override it by setting the options through the `Go` method. + +```cs +Task OnClick() +{ + return pageProgressService.Go(null, options => + { + options.Type = UiPageProgressType.Warning; + }); +} +``` + +## Breakdown + +The first parameter of the `Go` needs a little explanation. In the previous example we have set it to `null` which means, once called it will show an _indeterminate_ indicator and will cycle the loading animation indefinitely, until we hide the progress. You also have the option of defining the actual percentage of the progress and the code is the same, just instead of sending it the `null` you will send it a number between `0` and `100`. + +```cs +pageProgressService.Go(25) +``` + +### Valid values + +1. `null` - show _indeterminate_ indicator +2. `>= 0` and `<= 100` - show the regular _percentage_ progress + +## Hiding progress + +To hide the progress just set the actual values to something other then the _Valid value_. + +```cs +pageProgressService.Go(-1) +``` \ No newline at end of file