diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln
index c64adcbb0f..56670b8dca 100644
--- a/framework/Volo.Abp.sln
+++ b/framework/Volo.Abp.sln
@@ -319,33 +319,33 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.Aliyun
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.Aliyun.Tests", "test\Volo.Abp.BlobStoring.Aliyun.Tests\Volo.Abp.BlobStoring.Aliyun.Tests.csproj", "{8E49687A-E69F-49F2-8DB0-428D0883A937}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Aws", "src\Volo.Abp.BlobStoring.Aws\Volo.Abp.BlobStoring.Aws.csproj", "{50968CDE-1029-4051-B2E5-B69D0ECF2A18}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.Aws", "src\Volo.Abp.BlobStoring.Aws\Volo.Abp.BlobStoring.Aws.csproj", "{50968CDE-1029-4051-B2E5-B69D0ECF2A18}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Aws.Tests", "test\Volo.Abp.BlobStoring.Aws.Tests\Volo.Abp.BlobStoring.Aws.Tests.csproj", "{2CD3B26A-CA81-4279-8D5D-6A594517BB3F}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.Aws.Tests", "test\Volo.Abp.BlobStoring.Aws.Tests\Volo.Abp.BlobStoring.Aws.Tests.csproj", "{2CD3B26A-CA81-4279-8D5D-6A594517BB3F}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Kafka", "src\Volo.Abp.Kafka\Volo.Abp.Kafka.csproj", "{2A864049-9CD5-4493-8CDB-C408474D43D4}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Kafka", "src\Volo.Abp.Kafka\Volo.Abp.Kafka.csproj", "{2A864049-9CD5-4493-8CDB-C408474D43D4}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.EventBus.Kafka", "src\Volo.Abp.EventBus.Kafka\Volo.Abp.EventBus.Kafka.csproj", "{C1D891B0-AE83-42CB-987D-425A2787DE78}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.EventBus.Kafka", "src\Volo.Abp.EventBus.Kafka\Volo.Abp.EventBus.Kafka.csproj", "{C1D891B0-AE83-42CB-987D-425A2787DE78}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.GlobalFeatures", "src\Volo.Abp.GlobalFeatures\Volo.Abp.GlobalFeatures.csproj", "{04F44063-C952-403A-815F-EFB778BDA125}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.GlobalFeatures", "src\Volo.Abp.GlobalFeatures\Volo.Abp.GlobalFeatures.csproj", "{04F44063-C952-403A-815F-EFB778BDA125}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.GlobalFeatures.Tests", "test\Volo.Abp.GlobalFeatures.Tests\Volo.Abp.GlobalFeatures.Tests.csproj", "{231F1581-AA21-44C3-BF27-51EB3AD5355C}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.GlobalFeatures.Tests", "test\Volo.Abp.GlobalFeatures.Tests\Volo.Abp.GlobalFeatures.Tests.csproj", "{231F1581-AA21-44C3-BF27-51EB3AD5355C}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Http.Client.IdentityModel.WebAssembly", "src\Volo.Abp.Http.Client.IdentityModel.WebAssembly\Volo.Abp.Http.Client.IdentityModel.WebAssembly.csproj", "{3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Http.Client.IdentityModel.WebAssembly", "src\Volo.Abp.Http.Client.IdentityModel.WebAssembly\Volo.Abp.Http.Client.IdentityModel.WebAssembly.csproj", "{3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Mvc.Client.Common", "src\Volo.Abp.AspNetCore.Mvc.Client.Common\Volo.Abp.AspNetCore.Mvc.Client.Common.csproj", "{8A22D962-016E-474A-8BB7-F831F0ABF3AC}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.Mvc.Client.Common", "src\Volo.Abp.AspNetCore.Mvc.Client.Common\Volo.Abp.AspNetCore.Mvc.Client.Common.csproj", "{8A22D962-016E-474A-8BB7-F831F0ABF3AC}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Components.WebAssembly", "src\Volo.Abp.AspNetCore.Components.WebAssembly\Volo.Abp.AspNetCore.Components.WebAssembly.csproj", "{E1A62D10-F2FB-4040-BD60-11A3934058DF}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.Components.WebAssembly", "src\Volo.Abp.AspNetCore.Components.WebAssembly\Volo.Abp.AspNetCore.Components.WebAssembly.csproj", "{E1A62D10-F2FB-4040-BD60-11A3934058DF}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlazoriseUI", "src\Volo.Abp.BlazoriseUI\Volo.Abp.BlazoriseUI.csproj", "{4EBDDB1B-D6C5-4FAE-B5A7-2171B18CDFA5}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlazoriseUI", "src\Volo.Abp.BlazoriseUI\Volo.Abp.BlazoriseUI.csproj", "{4EBDDB1B-D6C5-4FAE-B5A7-2171B18CDFA5}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme", "src\Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme\Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.csproj", "{ABC27C10-C0FF-44CB-B4FF-A09C0B79F695}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme", "src\Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme\Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.csproj", "{ABC27C10-C0FF-44CB-B4FF-A09C0B79F695}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Components.WebAssembly.Theming", "src\Volo.Abp.AspNetCore.Components.WebAssembly.Theming\Volo.Abp.AspNetCore.Components.WebAssembly.Theming.csproj", "{29CA7471-4E3E-4E75-8B33-001DDF682F01}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.Components.WebAssembly.Theming", "src\Volo.Abp.AspNetCore.Components.WebAssembly.Theming\Volo.Abp.AspNetCore.Components.WebAssembly.Theming.csproj", "{29CA7471-4E3E-4E75-8B33-001DDF682F01}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Autofac.WebAssembly", "src\Volo.Abp.Autofac.WebAssembly\Volo.Abp.Autofac.WebAssembly.csproj", "{37F89B0B-1C6B-426F-A5EE-676D1956D9E9}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Autofac.WebAssembly", "src\Volo.Abp.Autofac.WebAssembly\Volo.Abp.Autofac.WebAssembly.csproj", "{37F89B0B-1C6B-426F-A5EE-676D1956D9E9}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Authentication.OpenIdConnect", "src\Volo.Abp.AspNetCore.Authentication.OpenIdConnect\Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj", "{DEFE3DB2-EA4F-4F90-87FC-B25D64427BC5}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.Authentication.OpenIdConnect", "src\Volo.Abp.AspNetCore.Authentication.OpenIdConnect\Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj", "{DEFE3DB2-EA4F-4F90-87FC-B25D64427BC5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.ExceptionHandling", "src\Volo.Abp.ExceptionHandling\Volo.Abp.ExceptionHandling.csproj", "{B9D1ADCB-D552-4626-A1F1-78FF72C1E822}"
EndProject
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 8e64b32022..6954057142 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
@@ -11,12 +11,14 @@
@Body
+
+
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/_Imports.razor b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/_Imports.razor
index f1ebc76453..7d695e9344 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/_Imports.razor
+++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/_Imports.razor
@@ -8,3 +8,5 @@
@using Volo.Abp.AspNetCore.Components.WebAssembly
@using Blazorise
@using Blazorise.DataGrid
+@using Volo.Abp.BlazoriseUI;
+@using Volo.Abp.BlazoriseUI.Components;
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/IUiMessageService.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/IUiMessageService.cs
index 2c834ddc87..ff86c1c867 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/IUiMessageService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/IUiMessageService.cs
@@ -4,14 +4,14 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly
{
public interface IUiMessageService
{
- Task InfoAsync(string message, string title = null);
-
- Task SuccessAsync(string message, string title = null);
-
- Task WarnAsync(string message, string title = null);
-
- Task ErrorAsync(string message, string title = null);
-
- Task ConfirmAsync(string message, string title = null);
+ Task InfoAsync(string message, string title = null, UiMessageOptions options = null);
+
+ Task SuccessAsync(string message, string title = null, UiMessageOptions options = null);
+
+ Task WarnAsync(string message, string title = null, UiMessageOptions options = null);
+
+ Task ErrorAsync(string message, string title = null, UiMessageOptions options = null);
+
+ Task ConfirmAsync(string message, string title = null, UiMessageOptions options = null);
}
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/NullUiMessageService.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/NullUiMessageService.cs
new file mode 100644
index 0000000000..0c7df5780d
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/NullUiMessageService.cs
@@ -0,0 +1,33 @@
+using System.Threading.Tasks;
+using Volo.Abp.DependencyInjection;
+
+namespace Volo.Abp.AspNetCore.Components.WebAssembly
+{
+ public class NullUiMessageService : IUiMessageService, ITransientDependency
+ {
+ public Task InfoAsync(string message, string title = null, UiMessageOptions options = null)
+ {
+ return Task.CompletedTask;
+ }
+
+ public Task SuccessAsync(string message, string title = null, UiMessageOptions options = null)
+ {
+ return Task.CompletedTask;
+ }
+
+ public Task WarnAsync(string message, string title = null, UiMessageOptions options = null)
+ {
+ return Task.CompletedTask;
+ }
+
+ public Task ErrorAsync(string message, string title = null, UiMessageOptions options = null)
+ {
+ return Task.CompletedTask;
+ }
+
+ public Task ConfirmAsync(string message, string title = null, UiMessageOptions options = null)
+ {
+ return Task.FromResult(true);
+ }
+ }
+}
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/UiMessageEventArgs.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/UiMessageEventArgs.cs
new file mode 100644
index 0000000000..4431d3c819
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/UiMessageEventArgs.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Threading.Tasks;
+
+namespace Volo.Abp.AspNetCore.Components.WebAssembly
+{
+ public class UiMessageEventArgs : EventArgs
+ {
+ public UiMessageEventArgs(UiMessageType messageType, string message, string title, UiMessageOptions options)
+ {
+ MessageType = messageType;
+ Message = message;
+ Title = title;
+ Options = options;
+ }
+
+ public UiMessageEventArgs(UiMessageType messageType, string message, string title, UiMessageOptions options, TaskCompletionSource callback)
+ {
+ MessageType = messageType;
+ Message = message;
+ Title = title;
+ Options = options;
+ Callback = callback;
+ }
+
+ public UiMessageType MessageType { get; set; }
+
+ public string Message { get; }
+
+ public string Title { get; }
+
+ public UiMessageOptions Options { get; }
+
+ public TaskCompletionSource Callback { get; }
+ }
+}
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/UiMessageOptions.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/UiMessageOptions.cs
new file mode 100644
index 0000000000..85b26bc4b6
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/UiMessageOptions.cs
@@ -0,0 +1,48 @@
+namespace Volo.Abp.AspNetCore.Components.WebAssembly
+{
+ ///
+ /// Options to override message dialog appearance.
+ ///
+ public class UiMessageOptions
+ {
+ ///
+ /// If true, the message dialog will show the large icon for the current message type.
+ ///
+ public bool ShowMessageIcon { get; set; } = true;
+
+ ///
+ /// Overrides the build-in message icon.
+ ///
+ public object MessageIcon { get; set; }
+
+ ///
+ /// Custom text for the Ok button.
+ ///
+ public string OkButtonText { get; set; }
+
+ ///
+ /// Custom icon for the Ok button.
+ ///
+ public object OkButtonIcon { get; set; }
+
+ ///
+ /// Custom text for the Confirmation button.
+ ///
+ public string ConfirmButtonText { get; set; }
+
+ ///
+ /// Custom icon for the Confirmation button.
+ ///
+ public object ConfirmButtonIcon { get; set; }
+
+ ///
+ /// Custom text for the Cancel button.
+ ///
+ public string CancelButtonText { get; set; }
+
+ ///
+ /// Custom icon for the Cancel button.
+ ///
+ public object CancelButtonIcon { get; set; }
+ }
+}
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/UiMessageService.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/UiMessageService.cs
index 16fe041de4..dfdc09f55d 100644
--- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/UiMessageService.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/UiMessageService.cs
@@ -14,27 +14,27 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly
JsRuntime = jsRuntime;
}
- public async Task InfoAsync(string message, string title = null)
+ public async Task InfoAsync(string message, string title = null, UiMessageOptions options = null)
{
await JsRuntime.InvokeVoidAsync("alert", message);
}
- public async Task SuccessAsync(string message, string title = null)
+ public async Task SuccessAsync(string message, string title = null, UiMessageOptions options = null)
{
await JsRuntime.InvokeVoidAsync("alert", message);
}
- public async Task WarnAsync(string message, string title = null)
+ public async Task WarnAsync(string message, string title = null, UiMessageOptions options = null)
{
await JsRuntime.InvokeVoidAsync("alert", message);
}
-
- public async Task ErrorAsync(string message, string title = null)
+
+ public async Task ErrorAsync(string message, string title = null, UiMessageOptions options = null)
{
await JsRuntime.InvokeVoidAsync("alert", message);
}
-
- public async Task ConfirmAsync(string message, string title = null)
+
+ public async Task ConfirmAsync(string message, string title = null, UiMessageOptions options = null)
{
return await JsRuntime.InvokeAsync("confirm", message);
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/UiMessageType.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/UiMessageType.cs
new file mode 100644
index 0000000000..5e3a77a3c5
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/UiMessageType.cs
@@ -0,0 +1,14 @@
+namespace Volo.Abp.AspNetCore.Components.WebAssembly
+{
+ ///
+ /// Defines the possible ui message types with predefined actions.
+ ///
+ public enum UiMessageType
+ {
+ Info,
+ Success,
+ Warning,
+ Error,
+ Confirmation,
+ }
+}
diff --git a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs
index 7289ebe954..8723209c53 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs
+++ b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs
@@ -225,7 +225,7 @@ namespace Volo.Abp.BlazoriseUI
{
if (reference == null)
{
- reference = (TRef) ScopedServices.GetRequiredService(serviceType);
+ reference = (TRef)ScopedServices.GetRequiredService(serviceType);
}
return reference;
@@ -266,7 +266,7 @@ namespace Volo.Abp.BlazoriseUI
var input = await CreateGetListInputAsync();
var result = await AppService.GetListAsync(input);
Entities = MapToListViewModel(result.Items);
- TotalCount = (int?) result.TotalCount;
+ TotalCount = (int?)result.TotalCount;
}
private IReadOnlyList MapToListViewModel(IReadOnlyList dtos)
diff --git a/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiMessageService.cs b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiMessageService.cs
new file mode 100644
index 0000000000..70643069be
--- /dev/null
+++ b/framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiMessageService.cs
@@ -0,0 +1,52 @@
+using System.Threading.Tasks;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Abstractions;
+using Volo.Abp.AspNetCore.Components.WebAssembly;
+using Volo.Abp.DependencyInjection;
+
+namespace Volo.Abp.BlazoriseUI
+{
+ [Dependency(ReplaceServices = true)]
+ public class BlazoriseUiMessageService : IUiMessageService, IScopedDependency
+ {
+ private readonly UiMessageNotifierService uiMessageNotifierService;
+
+ public ILogger Logger { get; set; }
+
+ public BlazoriseUiMessageService(UiMessageNotifierService uiMessageNotifierService)
+ {
+ this.uiMessageNotifierService = uiMessageNotifierService;
+
+ Logger = NullLogger.Instance;
+ }
+
+ public Task InfoAsync(string message, string title = null, UiMessageOptions options = null)
+ {
+ return uiMessageNotifierService.NotifyMessageReceivedAsync(UiMessageType.Info, message, title, options);
+ }
+
+ public Task SuccessAsync(string message, string title = null, UiMessageOptions options = null)
+ {
+ return uiMessageNotifierService.NotifyMessageReceivedAsync(UiMessageType.Success, message, title, options);
+ }
+
+ public Task WarnAsync(string message, string title = null, UiMessageOptions options = null)
+ {
+ return uiMessageNotifierService.NotifyMessageReceivedAsync(UiMessageType.Warning, message, title, options);
+ }
+
+ public Task ErrorAsync(string message, string title = null, UiMessageOptions options = null)
+ {
+ return uiMessageNotifierService.NotifyMessageReceivedAsync(UiMessageType.Error, message, title, options);
+ }
+
+ public async Task ConfirmAsync(string message, string title = null, UiMessageOptions options = null)
+ {
+ var callback = new TaskCompletionSource();
+
+ await uiMessageNotifierService.NotifyMessageReceivedAsync(UiMessageType.Confirmation, message, title, options, callback);
+
+ return await callback.Task;
+ }
+ }
+}
diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor
new file mode 100644
index 0000000000..6caf37c0b9
--- /dev/null
+++ b/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor
@@ -0,0 +1,48 @@
+
+
+
+
+
+ @Title
+
+
+
+ @if ( ShowMessageIcon )
+ {
+
+
+
+ }
+ @Message
+
+
+ @if ( IsConfirmation )
+ {
+
+
+ }
+ else
+ {
+
+ }
+
+
+
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor.cs
new file mode 100644
index 0000000000..7dada11bd3
--- /dev/null
+++ b/framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor.cs
@@ -0,0 +1,137 @@
+using System;
+using System.Text;
+using System.Threading.Tasks;
+using Blazorise;
+using Microsoft.AspNetCore.Components;
+using Volo.Abp.AspNetCore.Components.WebAssembly;
+
+namespace Volo.Abp.BlazoriseUI.Components
+{
+ public partial class UiMessageAlert : ComponentBase, IDisposable
+ {
+ protected override void OnInitialized()
+ {
+ UiMessageNotifierService.MessageReceived += OnMessageReceived;
+
+ base.OnInitialized();
+ }
+
+ private void OnMessageReceived(object sender, UiMessageEventArgs e)
+ {
+ MessageType = e.MessageType;
+ Message = e.Message;
+ Title = e.Title;
+ Options = e.Options;
+ Callback = e.Callback;
+
+ ModalRef.Show();
+ }
+
+ public void Dispose()
+ {
+ if (UiMessageNotifierService != null)
+ {
+ UiMessageNotifierService.MessageReceived -= OnMessageReceived;
+ }
+ }
+
+ protected Task OnOkClicked()
+ {
+ ModalRef.Hide();
+
+ return Okayed.InvokeAsync(null);
+ }
+
+ protected Task OnConfirmClicked()
+ {
+ ModalRef.Hide();
+
+ if (IsConfirmation && Callback != null)
+ {
+ Callback.SetResult(true);
+ }
+
+ return Confirmed.InvokeAsync(null);
+ }
+
+ protected Task OnCancelClicked()
+ {
+ ModalRef.Hide();
+
+ if (IsConfirmation && Callback != null)
+ {
+ Callback.SetResult(false);
+ }
+
+ return Canceled.InvokeAsync(null);
+ }
+
+ protected Modal ModalRef { get; set; }
+
+ protected virtual bool IsConfirmation
+ => MessageType == UiMessageType.Confirmation;
+
+ protected virtual bool ShowMessageIcon
+ => Options?.ShowMessageIcon ?? true;
+
+ protected virtual object MessageIcon => Options?.MessageIcon ?? MessageType switch
+ {
+ UiMessageType.Info => IconName.Info,
+ UiMessageType.Success => IconName.Check,
+ UiMessageType.Warning => IconName.Exclamation,
+ UiMessageType.Error => IconName.Times,
+ UiMessageType.Confirmation => IconName.QuestionCircle,
+ _ => null,
+ };
+
+ protected virtual string MessageIconColor => MessageType switch
+ {
+ // gets the color in the order of importance: Blazorise > Bootstrap > fallback color
+ UiMessageType.Info => "var(--b-theme-info, var(--info, #17a2b8))",
+ UiMessageType.Success => "var(--b-theme-success, var(--success, #28a745))",
+ UiMessageType.Warning => "var(--b-theme-warning, var(--warning, #ffc107))",
+ UiMessageType.Error => "var(--b-theme-danger, var(--danger, #dc3545))",
+ UiMessageType.Confirmation => "var(--b-theme-secondary, var(--secondary, #6c757d))",
+ _ => null,
+ };
+
+ protected virtual string MessageIconStyle
+ {
+ get
+ {
+ var sb = new StringBuilder();
+
+ sb.Append($"color:{MessageIconColor}");
+
+ return sb.ToString();
+ }
+ }
+
+ protected virtual string OkButtonText
+ => Options?.OkButtonText ?? "OK";
+
+ protected virtual string ConfirmButtonText
+ => Options?.ConfirmButtonText ?? "Confirm";
+
+ protected virtual string CancelButtonText
+ => Options?.CancelButtonText ?? "Cancel";
+
+ [Parameter] public UiMessageType MessageType { get; set; }
+
+ [Parameter] public string Title { get; set; }
+
+ [Parameter] public string Message { get; set; }
+
+ [Parameter] public TaskCompletionSource Callback { get; set; }
+
+ [Parameter] public UiMessageOptions Options { get; set; }
+
+ [Parameter] public EventCallback Okayed { get; set; } // TODO: ?
+
+ [Parameter] public EventCallback Confirmed { get; set; }
+
+ [Parameter] public EventCallback Canceled { get; set; }
+
+ [Inject] protected UiMessageNotifierService UiMessageNotifierService { get; set; }
+ }
+}
diff --git a/framework/src/Volo.Abp.BlazoriseUI/UiMessageNotifierService.cs b/framework/src/Volo.Abp.BlazoriseUI/UiMessageNotifierService.cs
new file mode 100644
index 0000000000..af49f993b5
--- /dev/null
+++ b/framework/src/Volo.Abp.BlazoriseUI/UiMessageNotifierService.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Threading.Tasks;
+using Volo.Abp.AspNetCore.Components.WebAssembly;
+using Volo.Abp.DependencyInjection;
+
+namespace Volo.Abp.BlazoriseUI
+{
+ [Dependency(ReplaceServices = true)]
+ public class UiMessageNotifierService : IScopedDependency
+ {
+ public event EventHandler MessageReceived;
+
+ public Task NotifyMessageReceivedAsync(UiMessageType messageType, string message, string title, UiMessageOptions options, TaskCompletionSource callback = null)
+ {
+ MessageReceived?.Invoke(this, new UiMessageEventArgs(messageType, message, title, options, callback));
+
+ return Task.CompletedTask;
+ }
+ }
+}
diff --git a/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj b/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj
index 12628b1440..091ee37717 100644
--- a/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj
+++ b/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj
@@ -1,4 +1,4 @@
-
+
diff --git a/framework/src/Volo.Abp.BlazoriseUI/_Imports.razor b/framework/src/Volo.Abp.BlazoriseUI/_Imports.razor
new file mode 100644
index 0000000000..37be71828c
--- /dev/null
+++ b/framework/src/Volo.Abp.BlazoriseUI/_Imports.razor
@@ -0,0 +1,2 @@
+@using Microsoft.AspNetCore.Components.Web
+@using Blazorise
\ No newline at end of file
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/Index.razor b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/Index.razor
index 114be0b5e1..0f0d1935df 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/Index.razor
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/Index.razor
@@ -1,7 +1,6 @@
@page "/"
@using Volo.Abp.Users
@using Volo.Abp.MultiTenancy
-@using System.Security.Claims
@using Microsoft.Extensions.Localization
@using MyCompanyName.MyProjectName.Localization
@inject ICurrentUser CurrentUser
@@ -14,16 +13,39 @@
Congratulations, MyProjectName is successfully running!
+
+
+ UI Message Tests
+
+
+
+
+
+
+
+
+
+
Welcome to the Application
@L["LongWelcomeMessage"]
- @if (!CurrentUser.IsAuthenticated)
+ @if ( !CurrentUser.IsAuthenticated )
{
@L["Login"]
- }
+ }
@@ -157,18 +179,4 @@
abpframework
-
-
-@code
-{
- private IEnumerable _claims;
-
- protected override async Task OnInitializedAsync()
- {
- var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
- if (authState.User.Identity.IsAuthenticated)
- {
- _claims = authState.User.Claims;
- }
- }
-}
+
\ No newline at end of file
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/Index.razor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/Index.razor.cs
new file mode 100644
index 0000000000..7ac6682659
--- /dev/null
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/Index.razor.cs
@@ -0,0 +1,66 @@
+using System;
+using System.Collections.Generic;
+using System.Security.Claims;
+using System.Threading.Tasks;
+using Blazorise;
+using Microsoft.AspNetCore.Components;
+using Volo.Abp.AspNetCore.Components.WebAssembly;
+
+namespace MyCompanyName.MyProjectName.Blazor.Pages
+{
+ public partial class Index
+ {
+ private IEnumerable _claims;
+
+ protected override async Task OnInitializedAsync()
+ {
+ var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
+ if ( authState.User.Identity.IsAuthenticated )
+ {
+ _claims = authState.User.Claims;
+ }
+ }
+
+ Task OnInfoTestClicked()
+ {
+ return UiMessageService.InfoAsync( "This is the Info message", "Info", new UiMessageOptions
+ {
+ OkButtonIcon = IconName.InfoCircle,
+ OkButtonText = "Hello info"
+ } );
+ }
+
+ Task OnSuccessTestClicked()
+ {
+ return UiMessageService.SuccessAsync( "This is the Success message", "Success" );
+ }
+
+ Task OnWarningTestClicked()
+ {
+ return UiMessageService.WarnAsync( "This is the Warning message", "Warning" );
+ }
+
+ Task OnErrorTestClicked()
+ {
+ return UiMessageService.ErrorAsync( "This is the Error message", "Error" );
+ }
+
+ Task OnConfirmTestClicked()
+ {
+ return UiMessageService.ConfirmAsync( "This is the Confirm message", "Confirm" )
+ .ContinueWith( result =>
+ {
+ if ( result.Result )
+ {
+ Console.WriteLine( "Confirmed" );
+ }
+ else
+ {
+ Console.WriteLine( "Cancelled" );
+ }
+ } );
+ }
+
+ [Inject] IUiMessageService UiMessageService { get; set; }
+ }
+}
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/_Imports.razor b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/_Imports.razor
index b1ade9c628..3fcce1e0d0 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/_Imports.razor
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/_Imports.razor
@@ -9,3 +9,5 @@
@using MyCompanyName.MyProjectName.Blazor
@using Blazorise
@using Blazorise.DataGrid
+@using Volo.Abp.BlazoriseUI;
+@using Volo.Abp.BlazoriseUI.Components;
\ No newline at end of file