Implemented new user editing including permission groups

This commit is contained in:
Marcel Baumgartner
2023-07-18 01:57:48 +02:00
parent d3b55d155b
commit 356ba94592
3 changed files with 99 additions and 41 deletions

View File

@@ -0,0 +1,34 @@
using System.ComponentModel.DataAnnotations;
using Moonlight.App.Database.Entities;
using Moonlight.App.Models.Misc;
namespace Moonlight.App.Models.Forms;
public class UserEditDataModel
{
[Required]
public string FirstName { get; set; } = "";
[Required]
public string LastName { get; set; } = "";
[Required]
public string Email { get; set; } = "";
[Required]
public string Address { get; set; } = "";
[Required]
public string City { get; set; } = "";
[Required]
public string State { get; set; } = "";
[Required]
public string Country { get; set; } = "";
public bool Admin { get; set; }
public bool TotpEnabled { get; set; }
public ulong DiscordId { get; set; }
public PermissionGroup? PermissionGroup { get; set; }
}

View File

@@ -1,12 +1,15 @@
@page "/admin/users/edit/{Id:int}"
@using Moonlight.App.Repositories
@using Moonlight.App.Database.Entities
@using Moonlight.App.Models.Forms
@using Moonlight.App.Models.Misc
@using Moonlight.App.Services
@using Moonlight.App.Services.Interop
@using Moonlight.App.Services.Sessions
@using Mappy.Net
@inject Repository<User> UserRepository
@inject Repository<PermissionGroup> PermissionGroupRepository
@inject UserService UserService
@inject SessionServerService SessionServerService
@inject ToastService ToastService
@@ -15,24 +18,25 @@
@attribute [PermissionRequired(nameof(Permissions.AdminUserEdit))]
<LazyLoader Load="Load">
@if (User == null)
{
<div class="alert alert-danger">
<TL>No user with this id found</TL>
</div>
}
else
{
<div class="card">
<div class="card-header border-0 py-0">
<h3 class="card-title align-items-start flex-column">
<span class="card-label fw-bold fs-3">
<TL>Manage user </TL> <span class="text-primary">@(User.Email)</span>
</span>
</h3>
</div>
@if (User == null)
{
<div class="alert alert-danger">
<TL>No user with this id found</TL>
</div>
}
else
{
<div class="card">
<div class="card-header border-0 py-0">
<h3 class="card-title align-items-start flex-column">
<span class="card-label fw-bold fs-3">
<TL>Manage user </TL> <span class="text-primary">@(User.Email)</span>
</span>
</h3>
</div>
</div>
<SmartForm Model="Model" OnValidSubmit="Update">
<div class="mt-5 row">
<div class="col-xl-6 mb-5 mb-xl-10">
<div class="card card-body p-10">
@@ -40,19 +44,19 @@
<label class="form-label">
<TL>First name</TL>
</label>
<input @bind="User.FirstName" type="text" class="form-control">
<InputText @bind-Value="Model.FirstName" class="form-control"/>
</div>
<div class="mb-10">
<label class="form-label">
<TL>Last name</TL>
</label>
<input @bind="User.LastName" type="text" class="form-control">
<InputText @bind-Value="Model.LastName" class="form-control"/>
</div>
<div class="mb-10">
<label class="form-label">
<TL>Email</TL>
</label>
<input @bind="User.Email" type="email" class="form-control">
<InputText @bind-Value="Model.Email" type="email" class="form-control"/>
</div>
</div>
<div class="mt-5 card card-body p-10">
@@ -87,6 +91,16 @@
</WButton>
</div>
</div>
<div class="mt-5 card card-body p-10">
<div class="input-group">
<SmartDropdown T="PermissionGroup"
@bind-Value="Model.PermissionGroup"
Items="PermissionGroups"
DisplayFunc="@(x => x.Name)"
SearchProp="@(x => x.Name)">
</SmartDropdown>
</div>
</div>
<div class="mt-5 card card-body p-10">
<div class="d-flex justify-content-end">
<a href="/admin/users" class="btn btn-danger me-3">
@@ -96,11 +110,9 @@
CssClasses="btn-primary me-3"
OnClick="EditPermissions">
</WButton>
<WButton Text="@(SmartTranslateService.Translate("Update"))"
WorkingText="@(SmartTranslateService.Translate("Updating"))"
CssClasses="btn-success"
OnClick="Update">
</WButton>
<button type="submit" class="btn btn-success">
<TL>Update</TL>
</button>
</div>
</div>
</div>
@@ -110,34 +122,34 @@
<label class="form-label">
<TL>Address</TL>
</label>
<input @bind="User.Address" type="text" class="form-control">
<InputText @bind-Value="Model.Address" class="form-control"/>
</div>
<div class="mb-10">
<label class="form-label">
<TL>City</TL>
</label>
<input @bind="User.City" type="text" class="form-control">
<InputText @bind-Value="Model.City" class="form-control"/>
</div>
<div class="mb-10">
<label class="form-label">
<TL>State</TL>
</label>
<input @bind="User.State" type="text" class="form-control">
<InputText @bind-Value="Model.State" class="form-control"/>
</div>
<div class="mb-10">
<label class="form-label">
<TL>Country</TL>
</label>
<input @bind="User.Country" type="text" class="form-control">
<InputText @bind-Value="Model.Country" class="form-control"/>
</div>
<div class="mb-10">
<input @bind="User.TotpEnabled" type="checkbox" class="form-check-input">
<input @bind="Model.TotpEnabled" type="checkbox" class="form-check-input">
<label class="form-label">
<TL>Totp</TL>
</label>
</div>
<div class="mb-10">
<input @bind="User.Admin" type="checkbox" class="form-check-input">
<input @bind="Model.Admin" type="checkbox" class="form-check-input">
<label class="form-label">
<TL>Admin</TL>
</label>
@@ -148,15 +160,17 @@
<label class="form-label">
<TL>Discord id</TL>
</label>
<input @bind="User.DiscordId" type="number" class="form-control">
<input @bind="Model.DiscordId" type="number" class="form-control">
</div>
</div>
</div>
</div>
}
<PermissionEditor @ref="PermissionEditor" OnSave="SavePermissions" />
</LazyLoader>
</SmartForm>
}
<PermissionEditor @ref="PermissionEditor" OnSave="SavePermissions"/>
</LazyLoader>
@code
{
@@ -164,14 +178,25 @@
public int Id { get; set; }
private User? User;
private UserEditDataModel Model { get; set; } = new();
private string NewPassword = "";
private PermissionGroup[] PermissionGroups;
private PermissionEditor PermissionEditor;
private Task Load(LazyLoader arg)
{
User = UserRepository.Get().FirstOrDefault(x => x.Id == Id);
if (User != null)
{
Model = Mapper.Map<UserEditDataModel>(User);
PermissionGroups = PermissionGroupRepository
.Get()
.ToArray();
}
return Task.CompletedTask;
}
@@ -188,6 +213,7 @@
private async Task Update()
{
User = Mapper.Map(User, Model);
UserRepository.Update(User!);
await ToastService.Success(SmartTranslateService.Translate("Successfully updated user"));
@@ -197,9 +223,9 @@
{
await UserService.ChangePassword(User!, NewPassword, true);
NewPassword = "";
await SessionServerService.ReloadUserSessions(User!);
await ToastService.Success(SmartTranslateService.Translate("Successfully updated password"));
}
@@ -213,7 +239,7 @@
{
User!.Permissions = data;
UserRepository.Update(User);
await SessionServerService.ReloadUserSessions(User);
await ToastService.Success(SmartTranslateService.Translate("Successfully updated user"));

View File

@@ -101,9 +101,7 @@
<div class="flex-lg-row-fluid ms-lg-15">
<div class="card mb-3">
<div class="card-header border-0">
<span class="card-title">
<TL>Services</TL>
</span>
<span class="card-title"></span>
<div class="card-toolbar">
<a href="/admin/users/edit/@(User.Id)" class="btn btn-primary">
<TL>Edit</TL>