* Changed views to have them in the same layout
* Added Authorization
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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)}");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
298
OrdersManagement/Components/Pages/Admin/UsersManager.razor
Normal file
298
OrdersManagement/Components/Pages/Admin/UsersManager.razor
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user