* Changed views to have them in the same layout

* Added Authorization
This commit is contained in:
2025-02-28 13:33:01 +01:00
parent aedb5810c2
commit b8fbb789ad
35 changed files with 1605 additions and 1306 deletions

View File

@@ -1,30 +1,77 @@
@page "/Admin/Scheduler"
@attribute [Authorize]
@using System.Security.Claims
@using Microsoft.AspNetCore.Authorization
@using OrdersManagementDataModel.Dtos
@using Syncfusion.Blazor.Grids
@using Action = Syncfusion.Blazor.Grids.Action
@inject HangfireService HangfireService
@using Syncfusion.Blazor.Cards
<h3>Zarządzanie Zadaniami</h3>
<br />
<SfGrid DataSource="@Tasks" AllowPaging="true" ShowColumnMenu="true" Toolbar="@(new List<string> { "Add", "Edit", "Delete", "Cancel", "Update" })">
<GridColumns>
<GridColumn Field=@nameof(TaskSchedulerDto.RowPointer.ToString) IsPrimaryKey="true" HeaderText="Id"></GridColumn>
<GridColumn Field=@nameof(TaskSchedulerDto.Name) HeaderText="Nazwa"></GridColumn>
<GridColumn Field=@nameof(TaskSchedulerDto.Path) HeaderText="Ścieżka"></GridColumn>
<GridColumn Field=@nameof(TaskSchedulerDto.CronOptions) HeaderText="CRON"></GridColumn>
<GridColumn Field=@nameof(TaskSchedulerDto.LastExecution) HeaderText="Ostatnie Uruchomienie"></GridColumn>
<GridColumn Field=@nameof(TaskSchedulerDto.NextExecution) HeaderText="Następne Uruchomienie"></GridColumn>
</GridColumns>
<GridEditSettings AllowDeleting="true" ShowDeleteConfirmDialog="true" AllowAdding="true" NewRowPosition="NewRowPosition.Bottom" AllowEditing="true"></GridEditSettings>
<GridEvents OnActionBegin="OnActionBegin" TValue="TaskSchedulerDto" OnActionComplete="OnActionComplete"></GridEvents>
</SfGrid>
@inject HangfireService HangfireService
@inject NavigationManager NavigationManager
@inject CustomAuthenticationStateProvider CustomAuthenticationStateProvider
<div class="h-100 d-flex justify-content-center align-items-start">
<SfCard CssClass="shadow" style="width: 100%; max-width: 1200px;">
<CardHeader>
<h3 class="text-primary">Zarządzanie Zadaniami</h3>
</CardHeader>
<CardContent>
<SfGrid DataSource="@Tasks"
AllowPaging="true"
ShowColumnMenu="true"
Toolbar="@(new List<string> { "Add", "Edit", "Delete", "Cancel", "Update" })">
<GridColumns>
<GridColumn Field=@nameof(TaskSchedulerDto.RowPointer) AllowEditing="false" IsPrimaryKey="true" HeaderText="Id"
Width="100"></GridColumn>
<GridColumn Field=@nameof(TaskSchedulerDto.Name) HeaderText="Nazwa" Width="150"></GridColumn>
<GridColumn Field=@nameof(TaskSchedulerDto.Path) HeaderText="Ścieżka" Width="200"></GridColumn>
<GridColumn Field=@nameof(TaskSchedulerDto.CronOptions) HeaderText="CRON" Width="120"></GridColumn>
<GridColumn Field=@nameof(TaskSchedulerDto.LastExecution) AllowEditing="false" HeaderText="Ostatnie Uruchomienie"
Width="150"></GridColumn>
<GridColumn Field=@nameof(TaskSchedulerDto.NextExecution) AllowEditing="false" HeaderText="Następne Uruchomienie"
Width="150"></GridColumn>
</GridColumns>
<GridEditSettings AllowDeleting="true"
ShowDeleteConfirmDialog="true"
AllowAdding="true"
NewRowPosition="NewRowPosition.Bottom"
AllowEditing="true">
</GridEditSettings>
<GridEvents OnActionBegin="OnActionBegin"
OnActionComplete="OnActionComplete"
TValue="TaskSchedulerDto">
</GridEvents>
<GridPageSettings PageSize="10"></GridPageSettings>
</SfGrid>
</CardContent>
<CardFooter>
<small class="text-muted">FA Krosno Manager © @(DateTime.Now.Year)</small>
</CardFooter>
</SfCard>
</div>
@code {
private List<TaskSchedulerDto> Tasks { get; set; } = new();
protected override async Task OnInitializedAsync()
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await LoadTasks();
if (firstRender)
{
ClaimsPrincipal currentUser = CustomAuthenticationStateProvider.GetCurrentUser();
if (currentUser.Identity?.IsAuthenticated == false || currentUser.Identity?.Name != "pkus")
{
NavigationManager.NavigateTo("/Unauthorized");
}
else
{
await LoadTasks();
StateHasChanged();
}
}
}
public async Task OnActionBegin(ActionEventArgs<TaskSchedulerDto> args)
@@ -65,4 +112,5 @@
break;
}
}
}

View File

@@ -1,170 +0,0 @@
@page "/login"
@rendermode InteractiveServer
@attribute [AllowAnonymous]
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization
@using OrdersManagement.Models
@using Syncfusion.Blazor.Inputs
@using Syncfusion.Blazor.Buttons
@using Syncfusion.Blazor.Cards
@inject UserService UserService
@inject NavigationManager NavigationManager
@inject AuthenticationStateProvider AuthenticationStateProvider
<div class="h-100 d-flex flex-column">
<h5>Logowanie</h5>
@if (!string.IsNullOrEmpty(TempPassword))
{
<div class="alert alert-info">
Twoje tymczasowe hasło to: <strong>@TempPassword</strong>. Użyj go do pierwszego logowania.
</div>
}
<SfCard>
<CardHeader Title="Zaloguj się"/>
<CardContent>
<EditForm Model="@LoginModel" FormName="LoginForm" OnValidSubmit="@HandleLogin">
<DataAnnotationsValidator/>
<ValidationSummary/>
<div class="form-group">
<label for="login">Login</label>
<SfTextBox ID="login" @bind-Value="LoginModel.Login" Placeholder="Wprowadź login"
CssClass="e-outline"/>
<ValidationMessage For="@(() => LoginModel.Login)"/>
</div>
<div class="form-group">
<label for="password">Hasło</label>
<SfTextBox ID="password" Type="InputType.Password" @bind-Value="LoginModel.Password"
Placeholder="Wprowadź hasło" CssClass="e-outline"/>
<ValidationMessage For="@(() => LoginModel.Password)"/>
</div>
<div class="form-group mt-3">
<SfButton CssClass="e-primary" IsPrimary="true" Type="submit">Zaloguj</SfButton>
</div>
@if (!string.IsNullOrEmpty(ErrorMessage))
{
<div class="alert alert-danger mt-3">@ErrorMessage</div>
}
</EditForm>
@if (ShowChangePassword)
{
<hr/>
<h5>Zmień hasło</h5>
<EditForm Model="@ChangePasswordModel" FormName="ChangePasswordForm"
OnValidSubmit="@HandleChangePassword">
<DataAnnotationsValidator/>
<ValidationSummary/>
<div class="form-group">
<label for="newPassword">Nowe hasło</label>
<SfTextBox ID="newPassword" Type="InputType.Password"
@bind-Value="ChangePasswordModel.NewPassword" Placeholder="Wprowadź nowe hasło"
CssClass="e-outline"/>
<ValidationMessage For="@(() => ChangePasswordModel.NewPassword)"/>
</div>
<div class="form-group">
<label for="confirmPassword">Potwierdź hasło</label>
<SfTextBox ID="confirmPassword" Type="InputType.Password"
@bind-Value="ChangePasswordModel.ConfirmPassword" Placeholder="Potwierdź nowe hasło"
CssClass="e-outline"/>
<ValidationMessage For="@(() => ChangePasswordModel.ConfirmPassword)"/>
</div>
<div class="form-group mt-3">
<SfButton CssClass="e-success" Type="submit">Zmień hasło</SfButton>
</div>
</EditForm>
}
</CardContent>
</SfCard>
</div>
@code {
private LoginModel LoginModel { get; set; } = new();
private ChangePasswordModel ChangePasswordModel { get; set; } = new();
private bool ShowChangePassword { get; set; }
private string TempPassword { get; set; }
private string ErrorMessage { get; set; }
protected override void OnInitialized()
{
TempPassword = NavigationManager.Uri.Split('?').Length > 1 ? Uri.UnescapeDataString(NavigationManager.Uri.Split('=')[1]) : null;
}
private async Task HandleLogin()
{
try
{
Console.WriteLine($"Próba logowania dla: {LoginModel.Login}");
var user = await UserService.AuthenticateUserAsync(LoginModel.Login, LoginModel.Password);
if (user != null)
{
Console.WriteLine($"Użytkownik {user.Login} znaleziony.");
if (user.IsTemporaryPassword)
{
ShowChangePassword = true;
StateHasChanged();
}
else
{
NavigationManager.NavigateTo("/ScheduleOrders");
}
}
else
{
ErrorMessage = "Nieprawidłowy login lub hasło";
Console.WriteLine(ErrorMessage);
StateHasChanged();
}
}
catch (Exception ex)
{
ErrorMessage = $"Błąd logowania: {ex.Message}";
Console.WriteLine(ErrorMessage);
StateHasChanged();
}
}
private async Task HandleChangePassword()
{
try
{
if (ChangePasswordModel.NewPassword == ChangePasswordModel.ConfirmPassword)
{
var user = await UserService.GetUserByUsernameAsync(LoginModel.Login);
if (user != null)
{
user.PasswordHash = BCrypt.Net.BCrypt.HashPassword(ChangePasswordModel.NewPassword);
user.IsTemporaryPassword = false;
await UserService.UpdateUserAsync(user);
ShowChangePassword = false;
LoginModel = new LoginModel();
StateHasChanged();
NavigationManager.NavigateTo("/login");
}
}
else
{
ErrorMessage = "Hasła nie są zgodne";
StateHasChanged();
}
}
catch (Exception ex)
{
ErrorMessage = $"Błąd zmiany hasła: {ex.Message}";
StateHasChanged();
}
}
}

View File

@@ -1,87 +0,0 @@
@page "/register"
@using OrdersManagement.Models
@using OrdersManagementDataModel.Dtos
@using Syncfusion.Blazor.Inputs
@using Syncfusion.Blazor.Buttons
@using Syncfusion.Blazor.Cards
@inject UserService UserService
@inject NavigationManager NavigationManager
<div class="h-100 d-flex flex-column">
<h5>Rejestracja</h5>
<br/>
<SfCard>
<CardHeader Title="Zarejestruj się"/>
<CardContent>
<EditForm Model="@RegisterModel" OnValidSubmit="HandleRegister">
<DataAnnotationsValidator/>
<ValidationSummary/>
<div class="form-group">
<label for="login">Login</label>
<SfTextBox ID="login" @bind-Value="RegisterModel.Login" Placeholder="Wprowadź login"
CssClass="e-outline"/>
<ValidationMessage For="@(() => RegisterModel.Login)"/>
</div>
<div class="form-group">
<label for="email">Email</label>
<SfTextBox ID="email" @bind-Value="RegisterModel.Email" Placeholder="Wprowadź email"
CssClass="e-outline"/>
<ValidationMessage For="@(() => RegisterModel.Email)"/>
</div>
<div class="form-group">
<label for="firstName">Imię</label>
<SfTextBox ID="firstName" @bind-Value="RegisterModel.FirstName" Placeholder="Wprowadź imię"
CssClass="e-outline"/>
<ValidationMessage For="@(() => RegisterModel.FirstName)"/>
</div>
<div class="form-group">
<label for="lastName">Nazwisko</label>
<SfTextBox ID="lastName" @bind-Value="RegisterModel.LastName" Placeholder="Wprowadź nazwisko"
CssClass="e-outline"/>
<ValidationMessage For="@(() => RegisterModel.LastName)"/>
</div>
<div class="form-group mt-3">
<SfButton CssClass="e-primary" IsPrimary="true" Type="submit">Zarejestruj</SfButton>
</div>
</EditForm>
</CardContent>
</SfCard>
</div>
@code {
private RegisterModel RegisterModel { get; set; } = new();
private async Task HandleRegister()
{
var temporaryPassword = Guid.NewGuid().ToString().Substring(0, 8);
var passwordHash = BCrypt.Net.BCrypt.HashPassword(temporaryPassword);
var user = new UserDto
{
Login = RegisterModel.Login,
PasswordHash = passwordHash,
IsTemporaryPassword = true,
IsActive = true,
ActiveFrom = DateTime.Now,
Email = RegisterModel.Email,
FirstName = RegisterModel.FirstName,
LastName = RegisterModel.LastName,
CreatedDate = DateTime.Now,
RowPointer = Guid.NewGuid()
};
var result = await UserService.AddUserAsync(user);
if (result.IsSuccessStatusCode)
{
NavigationManager.NavigateTo($"/login?tempPassword={Uri.EscapeDataString(temporaryPassword)}");
}
}
}

View File

@@ -1,171 +0,0 @@
@page "/admin/UsersManager"
@using OrdersManagementDataModel.Dtos
@using Syncfusion.Blazor.Grids
@using Action = Syncfusion.Blazor.Grids.Action
@using UserService = OrdersManagement.Services.UserService
@inject UserService UserService
@inject RoleService RoleService
@inject FunctionService FunctionService
<div class="h-100 d-flex flex-column">
<h5>Użytkownicy</h5>
<SfGrid DataSource="@UserList" AllowPaging="true" ShowColumnMenu="true"
Toolbar="@(new List<string> { "Add", "Edit", "Delete", "Cancel", "Update" })">
<GridColumns>
<GridColumn Field="@nameof(UserDto.Id)" IsPrimaryKey="true" HeaderText="ID" Width="70"></GridColumn>
<GridColumn Field="@nameof(UserDto.Login)" HeaderText="Login" Width="100"></GridColumn>
<GridColumn Field="@nameof(UserDto.Email)" HeaderText="Email" Width="150"></GridColumn>
<GridColumn Field="@nameof(UserDto.FirstName)" HeaderText="Imię" Width="100"></GridColumn>
<GridColumn Field="@nameof(UserDto.LastName)" HeaderText="Nazwisko" Width="100"></GridColumn>
<GridColumn Field="@nameof(UserDto.IsActive)" HeaderText="Aktywny" Width="80"></GridColumn>
<GridColumn Field="@nameof(UserDto.CreatedDate)" HeaderText="Utworzono" Format="d" Width="120"></GridColumn>
</GridColumns>
<GridEditSettings AllowDeleting="true" ShowDeleteConfirmDialog="true" AllowAdding="true" NewRowPosition="NewRowPosition.Bottom" AllowEditing="true"></GridEditSettings>
<GridEvents OnActionBegin="UserActionBegin" OnActionComplete="UserActionComplete" TValue="UserDto"></GridEvents>
</SfGrid>§
<br/>
<h5>Role</h5>
<SfGrid DataSource="@Roles" AllowPaging="true" ShowColumnMenu="true"
Toolbar="@(new List<string> { "Add", "Edit", "Delete", "Cancel", "Update" })">
<GridColumns>
<GridColumn Field="@nameof(RoleDto.Id)" IsPrimaryKey="true" HeaderText="ID" Width="70"></GridColumn>
<GridColumn Field="@nameof(RoleDto.Name)" HeaderText="Nazwa" Width="150"></GridColumn>
</GridColumns>
<GridEditSettings AllowDeleting="true" ShowDeleteConfirmDialog="true" AllowAdding="true" AllowEditing="true"
Mode="EditMode.Normal"></GridEditSettings>
<GridEvents OnActionBegin="RoleActionBegin" OnActionComplete="RoleActionComplete" TValue="RoleDto"></GridEvents>
</SfGrid>
<br/>
<h5>Funkcje</h5>
<SfGrid DataSource="@Functions" AllowPaging="true" ShowColumnMenu="true"
Toolbar="@(new List<string> { "Add", "Edit", "Delete", "Cancel", "Update" })">
<GridColumns>
<GridColumn Field="@nameof(FunctionDto.Id)" IsPrimaryKey="true" HeaderText="ID" Width="70"></GridColumn>
<GridColumn Field="@nameof(FunctionDto.RoleId)" HeaderText="ID Roli" Width="70"></GridColumn>
<GridColumn Field="@nameof(FunctionDto.Name)" HeaderText="Nazwa Funkcji" Width="200"></GridColumn>
</GridColumns>
<GridEditSettings AllowDeleting="true" ShowDeleteConfirmDialog="true" AllowAdding="true" AllowEditing="true"
Mode="EditMode.Normal"></GridEditSettings>
<GridEvents OnActionBegin="FunctionActionBegin" OnActionComplete="FunctionActionComplete"
TValue="FunctionDto"></GridEvents>
</SfGrid>
</div>
@code {
private List<UserDto> UserList { get; set; } = new();
private List<RoleDto> Roles { get; set; } = new();
private List<FunctionDto> Functions { get; set; } = new();
protected override async Task OnInitializedAsync()
{
await LoadUsers();
await LoadRoles();
await LoadFunctions();
}
private async Task LoadUsers()
{
UserList = (await UserService.GetUsersAsync() ?? Array.Empty<UserDto>()).ToList();
}
private async Task LoadRoles()
{
Roles = (await RoleService.GetRolesAsync() ?? Array.Empty<RoleDto>()).ToList();
}
private async Task LoadFunctions()
{
Functions = (await FunctionService.GetFunctionsAsync() ?? Array.Empty<FunctionDto>()).ToList();
}
private async Task UserActionBegin(ActionEventArgs<UserDto> args)
{
if (args.RequestType.Equals(Action.Delete))
{
await UserService.DeleteUserAsync(args.Data.RowPointer);
}
else if (args.RequestType.Equals(Action.Add))
{
args.Data.RowPointer = Guid.NewGuid();
}
}
private async Task UserActionComplete(ActionEventArgs<UserDto> args)
{
switch (args.RequestType)
{
case Action.Delete:
await LoadUsers();
break;
case Action.Add:
await UserService.AddUserAsync(args.Data);
await LoadUsers();
break;
case Action.Save:
await UserService.UpdateUserAsync(args.Data);
await LoadUsers();
break;
}
}
private async Task RoleActionBegin(ActionEventArgs<RoleDto> args)
{
if (args.RequestType.Equals(Action.Delete))
{
await RoleService.DeleteRoleAsync(args.Data.RowPointer);
}
else if (args.RequestType.Equals(Action.Add))
{
args.Data.RowPointer = Guid.NewGuid();
}
}
private async Task RoleActionComplete(ActionEventArgs<RoleDto> args)
{
switch (args.RequestType)
{
case Action.Delete:
await LoadRoles();
break;
case Action.Add:
await RoleService.AddRoleAsync(args.Data);
await LoadRoles();
break;
case Action.Save:
await RoleService.UpdateRoleAsync(args.Data);
await LoadRoles();
break;
}
}
private async Task FunctionActionBegin(ActionEventArgs<FunctionDto> args)
{
if (args.RequestType.Equals(Action.Delete))
{
await FunctionService.DeleteFunctionAsync(args.Data.RowPointer);
}
else if (args.RequestType.Equals(Action.Add))
{
args.Data.RowPointer = Guid.NewGuid();
}
}
private async Task FunctionActionComplete(ActionEventArgs<FunctionDto> args)
{
switch (args.RequestType)
{
case Action.Delete:
await LoadFunctions();
break;
case Action.Add:
await FunctionService.AddFunctionAsync(args.Data);
await LoadFunctions();
break;
case Action.Save:
await FunctionService.UpdateFunctionAsync(args.Data);
await LoadFunctions();
break;
}
}
}

View File

@@ -0,0 +1,298 @@
@page "/admin/UsersManager"
@attribute [Authorize]
@using System.Security.Claims
@using Microsoft.AspNetCore.Authorization
@using OrdersManagementDataModel.Dtos
@using Syncfusion.Blazor.Grids
@using Action = Syncfusion.Blazor.Grids.Action
@using UserService = OrdersManagement.Services.UserService
@using Syncfusion.Blazor.Cards
@using Syncfusion.Blazor.Popups
@using Syncfusion.Blazor.Buttons
@inject UserService UserService
@inject RoleService RoleService
@inject FunctionService FunctionService
@inject NavigationManager NavigationManager
@inject CustomAuthenticationStateProvider CustomAuthenticationStateProvider
<div class="h-100 d-flex justify-content-center align-items-start">
<SfCard CssClass="shadow" style="width: 100%; max-width: 1200px;">
<CardHeader>
<h3 class="text-primary">Zarządzanie Użytkownikami i Rolami</h3>
</CardHeader>
<CardContent>
<h5 class="text-primary mb-3">Użytkownicy</h5>
<SfGrid DataSource="@UserList"
AllowPaging="true"
ShowColumnMenu="true"
Toolbar="@(new List<string> { "Add", "Edit", "Delete", "Cancel", "Update" })">
<GridColumns>
<GridColumn Field="@nameof(UserDto.RowPointer)" AllowEditing="false" IsPrimaryKey="true" HeaderText="ID" Width="70"></GridColumn>
<GridColumn Field="@nameof(UserDto.Login)" HeaderText="Login" Width="100"></GridColumn>
<GridColumn Field="@nameof(UserDto.Email)" HeaderText="Email" Width="150"></GridColumn>
<GridColumn Field="@nameof(UserDto.FirstName)" HeaderText="Imię" Width="100"></GridColumn>
<GridColumn Field="@nameof(UserDto.LastName)" HeaderText="Nazwisko" Width="100"></GridColumn>
<GridColumn Field="@nameof(UserDto.IsActive)" HeaderText="Aktywny" Width="80"></GridColumn>
<GridColumn Field="@nameof(UserDto.CreatedDate)" AllowEditing="false" HeaderText="Utworzono" Format="d" Width="120"></GridColumn>
<GridColumn HeaderText="" Width="100">
<Template>
@{
var user = (context as UserDto);
<SfButton CssClass="e-small e-primary" @onclick="() => ResetPassword(user)">Zresetuj haslo</SfButton>
}
</Template>
</GridColumn>
</GridColumns>
<GridEditSettings AllowDeleting="true"
ShowDeleteConfirmDialog="true"
AllowAdding="true"
NewRowPosition="NewRowPosition.Bottom"
AllowEditing="true">
</GridEditSettings>
<GridEvents OnActionBegin="UserActionBegin"
OnActionComplete="UserActionComplete"
TValue="UserDto">
</GridEvents>
<GridPageSettings PageSize="10"></GridPageSettings>
</SfGrid>
<h5 class="text-primary mb-3 mt-4">Role</h5>
<SfGrid DataSource="@Roles"
AllowPaging="true"
ShowColumnMenu="true"
Toolbar="@(new List<string> { "Add", "Edit", "Delete", "Cancel", "Update" })">
<GridColumns>
<GridColumn Field="@nameof(RoleDto.Id)" IsPrimaryKey="true" HeaderText="ID" Width="70"></GridColumn>
<GridColumn Field="@nameof(RoleDto.Name)" HeaderText="Nazwa" Width="150"></GridColumn>
</GridColumns>
<GridEditSettings AllowDeleting="true"
ShowDeleteConfirmDialog="true"
AllowAdding="true"
AllowEditing="true"
Mode="EditMode.Normal">
</GridEditSettings>
<GridEvents OnActionBegin="RoleActionBegin"
OnActionComplete="RoleActionComplete"
TValue="RoleDto">
</GridEvents>
<GridPageSettings PageSize="10"></GridPageSettings>
</SfGrid>
<h5 class="text-primary mb-3 mt-4">Funkcje</h5>
<SfGrid DataSource="@Functions"
AllowPaging="true"
ShowColumnMenu="true"
Toolbar="@(new List<string> { "Add", "Edit", "Delete", "Cancel", "Update" })">
<GridColumns>
<GridColumn Field="@nameof(FunctionDto.Id)" IsPrimaryKey="true" HeaderText="ID" Width="70"></GridColumn>
<GridColumn Field="@nameof(FunctionDto.RoleId)" HeaderText="ID Roli" Width="70"></GridColumn>
<GridColumn Field="@nameof(FunctionDto.Name)" HeaderText="Nazwa Funkcji" Width="200"></GridColumn>
</GridColumns>
<GridEditSettings AllowDeleting="true"
ShowDeleteConfirmDialog="true"
AllowAdding="true"
AllowEditing="true"
Mode="EditMode.Normal">
</GridEditSettings>
<GridEvents OnActionBegin="FunctionActionBegin"
OnActionComplete="FunctionActionComplete"
TValue="FunctionDto">
</GridEvents>
<GridPageSettings PageSize="10"></GridPageSettings>
</SfGrid>
<SfDialog Width="500px" Title="Dodano użytkownika!" IsModal="true" @bind-Visible="Visibility" AllowPrerender="true">
<DialogTemplates>
<Content>
<p>Użytkownik <strong>@Login</strong> został dodany pomyślnie!</p>
<p>Hasło tymczasowe: <strong>@TempPassword</strong></p>
</Content>
</DialogTemplates>
<DialogButtons>
<DialogButton Content="OK" IsPrimary="true" OnClick="@HideModal"/>
</DialogButtons>
</SfDialog>
</CardContent>
<CardFooter>
<small class="text-muted">FA Krosno Manager © @(DateTime.Now.Year)</small>
</CardFooter>
</SfCard>
</div>
@code {
private List<UserDto> UserList { get; set; } = new();
private List<RoleDto> Roles { get; set; } = new();
private List<FunctionDto> Functions { get; set; } = new();
private bool Visibility { get; set; }
private string Login { get; set; } = string.Empty;
private string TempPassword { get; set; } = string.Empty;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
Visibility = false;
ClaimsPrincipal currentUser = CustomAuthenticationStateProvider.GetCurrentUser();
if (currentUser.Identity?.IsAuthenticated == false || currentUser.Identity?.Name != "pkus")
{
NavigationManager.NavigateTo("/Unauthorized");
}
else
{
await LoadUsers();
await LoadRoles();
//await LoadFunctions();
StateHasChanged();
}
}
}
private async Task LoadUsers()
{
UserList = (await UserService.GetUsersAsync() ?? Array.Empty<UserDto>()).ToList();
}
private async Task LoadRoles()
{
Roles = (await RoleService.GetRolesAsync() ?? Array.Empty<RoleDto>()).ToList();
}
private async Task LoadFunctions()
{
Functions = (await FunctionService.GetFunctionsAsync() ?? Array.Empty<FunctionDto>()).ToList();
}
public async Task ResetPassword(UserDto? user)
{
if(user == null) return;
TempPassword = Guid.NewGuid().ToString().Substring(0, 8);
Login = user.Login;
string passwordHash = BCrypt.Net.BCrypt.HashPassword(TempPassword);
user.PasswordHash = passwordHash;
user.IsTemporaryPassword = true;
await UserService.UpdateUserAsync(user);
await LoadUsers();
Visibility = true;
}
private async Task UserActionBegin(ActionEventArgs<UserDto> args)
{
switch (args.RequestType)
{
case Action.Delete:
await UserService.DeleteUserAsync(args.Data.RowPointer);
break;
case Action.Add:
args.Data.RowPointer = Guid.NewGuid();
args.Data.CreatedDate = DateTime.Now;
args.Data.IsActive = true;
break;
}
}
private async Task UserActionComplete(ActionEventArgs<UserDto> args)
{
switch (args.RequestType)
{
case Action.Delete:
await LoadUsers();
break;
case Action.Save when args.Data.Id == 0:
UserDto? user = args.Data;
TempPassword = Guid.NewGuid().ToString().Substring(0, 8);
Login = user.Login;
string? passwordHash = BCrypt.Net.BCrypt.HashPassword(TempPassword);
user.PasswordHash = passwordHash;
user.IsTemporaryPassword = true;
user.ActiveFrom = DateTime.Now;
user.CreatedDate = DateTime.Now;
await UserService.AddUserAsync(user);
await LoadUsers();
Visibility = true;
break;
case Action.Save when args.Data.Id != 0:
await UserService.UpdateUserAsync(args.Data);
await LoadUsers();
break;
}
}
private async Task RoleActionBegin(ActionEventArgs<RoleDto> args)
{
if (args.RequestType.Equals(Action.Delete))
{
await RoleService.DeleteRoleAsync(args.Data.RowPointer);
}
else if (args.RequestType.Equals(Action.Add))
{
args.Data.RowPointer = Guid.NewGuid();
}
}
private async Task RoleActionComplete(ActionEventArgs<RoleDto> args)
{
switch (args.RequestType)
{
case Action.Delete:
await LoadRoles();
break;
case Action.Save when args.Data.Id == 0:
await RoleService.AddRoleAsync(args.Data);
await LoadUsers();
break;
case Action.Save when args.Data.Id != 0:
await RoleService.UpdateRoleAsync(args.Data);
await LoadRoles();
break;
}
}
private async Task FunctionActionBegin(ActionEventArgs<FunctionDto> args)
{
if (args.RequestType.Equals(Action.Delete))
{
await FunctionService.DeleteFunctionAsync(args.Data.RowPointer);
}
else if (args.RequestType.Equals(Action.Add))
{
args.Data.RowPointer = Guid.NewGuid();
}
}
private async Task FunctionActionComplete(ActionEventArgs<FunctionDto> args)
{
switch (args.RequestType)
{
case Action.Delete:
await LoadFunctions();
break;
case Action.Save when args.Data.Id == 0:
await FunctionService.AddFunctionAsync(args.Data);
await LoadFunctions();
break;
case Action.Save when args.Data.Id != 0:
await FunctionService.UpdateFunctionAsync(args.Data);
await LoadFunctions();
break;
}
}
private void HideModal()
{
Visibility = false;
}
}