hi
The toolbar will render as HTML link. So, there is no action hook design.
But you can add some JavaScript to listen to the event if a toolbar link is clicked.
But how do I do this, as if just removing the NuGet package then I get multiple errors in the code. Do I have to manually go through code and remove it?
csproj
files.cs
files .So are you saying that ABP Studio will eventually be improved so I can create project in first place without these modules included?
Yes, Studio will introduce more features day by day.
hi
I have sent the angular source code to your email.
hi
I'm more suggesting a new ABP feature by adding to the existing setting management for Session management
This does not conform to the current design of the saas module.
You can override IdentitySettingGroupViewComponent
component to customize it.
hi
The images are 404. we will fix this problem.
Can you share the details by email?
sorry for that.
liming.ma@volosoft.com
hi
I will ask our angular team. : )
hi
https://abp.io/support/questions/240/How-to-customize-the-MVC-login-page https://abp.io/community/articles/how-to-customize-the-login-page-for-mvc-razor-page-applications-9a40f3cd
You can download the account module source code. And override the login page.
If you have openiddict, the login page base class is OpenIddictSupportedLoginModel
[ExposeServices(typeof(LoginModel))]
public class OpenIddictSupportedLoginModel: LoginModel
https://abp.io/support/questions/632/How-can-I-download-the-source-code-of-the-framework-Angular-packages-theme-and-pro-modules
https://abp.io/support/questions/160/How-to-customize-an-ABP-project
hi
You can add a service to store the current user id
and connection id
.
Maintain the dictionary in OnConnectedAsync/OnDisconnectedAsync
, then get connection id by user id(GetConnectionIdsByKey)
public class QaUiConnectionStore : ISingletonDependency
{
private readonly Dictionary<string, HashSet<string>> _connections = new();
public void AddConnection(string key, string connectionId)
{
lock (_connections)
{
if (!_connections.ContainsKey(key))
{
_connections.Add(key, new HashSet<string>());
}
lock (_connections[key])
{
_connections[key].Add(connectionId);
}
}
}
public IEnumerable<string> GetConnectionIdsByKey(string key)
{
if (_connections.TryGetValue(key, out var connection))
{
return connection;
}
return Enumerable.Empty<string>();
}
public void RemoveConnection(string key, string connectionId)
{
lock (_connections)
{
if (!_connections.TryGetValue(key, out var connection))
{
return;
}
lock (connection)
{
connection.Remove(connectionId);
if (connection.Count == 0)
{
_connections.Remove(key);
}
}
}
}
}
public class QaUiNotificationHub : AbpHub<IQaUiNotificationClient>
{
private readonly QaUiConnectionStore _qaUiConnectionStore;
public QaUiNotificationHub(QaUiConnectionStore qaUiConnectionStore)
{
_qaUiConnectionStore = qaUiConnectionStore;
}
public override Task OnConnectedAsync()
{
if (IsUserAuthenticated())
{
var key = CurrentUser.Id.ToString();
_qaUiConnectionStore.AddConnection(key, connectionId: Context.ConnectionId);
}
return base.OnConnectedAsync();
}
public override Task OnDisconnectedAsync(Exception? exception)
{
if (IsUserAuthenticated())
{
var key = CurrentUser.Id.ToString();
_qaUiConnectionStore.RemoveConnection(key, connectionId: Context.ConnectionId);
}
return base.OnDisconnectedAsync(exception);
}
private bool IsUserAuthenticated()
{
return CurrentUser.IsAuthenticated && CurrentUser.Id.HasValue;
}
}