Yes, you can remove unnecessary files and repackage using webpack
Hi,
Are you talking about ABP Suite?
Tenant management does not appear in the admin user, although we have authorization in the angular management tab
The tenant management is under the Saas menu, you can change the menu order if you want.
When we add a tenant from the SaaS section, it assigns a record to the SaasTenants table, but we cannot enter the administration panel with this customer. When we manually add a record to the AbpTenants table, we can log in with the relevant customer user. But we also had an authorization problem.
Sorry, I'm a little confused, There should be only one SaasTenants
database table here, not AbpTenants
especially as the MVC LeptonX implementation doesn't have this issue and can switch its .css between light.css, dark.css, dim.css as required when the theme styles are selected, without any javascript being used to dynamically perform this task?
Because MVC UI refreshes the page every time, it doesn't need it.
In any case, can we please have an update on if this bug is any closer to being fixed?
This is the design and we will not change it at this time, we may consider implementing the Skeleton Loading States: https://styleguide.handy.com/native/skeleton-loading-states
Hi,
You can download the leptonx theme source code to re-pack the Leptonx.bundle.min.js
Hi,
When you log in successfully, it will set accesstoken and refreshtoken.
public class LoginService : ILoginService, ITransientDependency
{
private readonly OidcClient _oidcClient;
private readonly IStorage _storage;
private readonly MauiCachedApplicationConfigurationClient _applicationConfigurationClient;
public LoginService(OidcClient oidcClient, IStorage storage, MauiCachedApplicationConfigurationClient applicationConfigurationClient)
{
_oidcClient = oidcClient;
_storage = storage;
_applicationConfigurationClient = applicationConfigurationClient;
}
public async Task<LoginResult> LoginAsync()
{
var loginResult = await _oidcClient.LoginAsync(new LoginRequest());
if (!loginResult.IsError)
{
await SetTokenCacheAsync(loginResult.AccessToken, loginResult.RefreshToken);
await _applicationConfigurationClient.InitializeAsync();
WeakReferenceMessenger.Default.Send(new LoginMessage());
}
return loginResult;
}
public async Task<LogoutResult> LogoutAsync()
{
var logoutResult = await _oidcClient.LogoutAsync();
if (!logoutResult.IsError)
{
await ClearTokenCacheAsync();
await _applicationConfigurationClient.InitializeAsync();
WeakReferenceMessenger.Default.Send(new LogoutMessage());
}
return logoutResult;
}
public async Task<string> GetAccessTokenAsync()
{
var token = await _storage.GetAsync(MyProjectNameConsts.OidcConsts.AccessTokenKeyName);
if (!token.IsNullOrEmpty())
{
var jwtToken = new JwtSecurityTokenHandler().ReadJwtToken(token);
if (jwtToken.ValidTo <= DateTime.UtcNow)
{
var newToken = await TryRefreshTokenAsync();
if (!newToken.IsNullOrEmpty())
{
return newToken;
}
await ClearTokenCacheAsync();
WeakReferenceMessenger.Default.Send(new LogoutMessage());
}
}
return token;
}
public async Task<string> TryRefreshTokenAsync()
{
var refreshToken = await _storage.GetAsync(MyProjectNameConsts.OidcConsts.RefreshTokenKeyName);
if (!refreshToken.IsNullOrEmpty())
{
var refreshResult = await _oidcClient.RefreshTokenAsync(refreshToken);
await SetTokenCacheAsync(refreshResult.AccessToken, refreshResult.RefreshToken);
return refreshResult.AccessToken;
}
return string.Empty;
}
private async Task SetTokenCacheAsync(string accessToken, string refreshToken)
{
await _storage.SetAsync(MyProjectNameConsts.OidcConsts.AccessTokenKeyName, accessToken);
await _storage.SetAsync(MyProjectNameConsts.OidcConsts.RefreshTokenKeyName, refreshToken);
}
private async Task ClearTokenCacheAsync()
{
await _storage.RemoveAsync(MyProjectNameConsts.OidcConsts.AccessTokenKeyName);
await _storage.RemoveAsync(MyProjectNameConsts.OidcConsts.RefreshTokenKeyName);
}
}
Sure, Can you share how you solved this problem, it might help others
sure