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}" @page "/admin/users/edit/{Id:int}"
@using Moonlight.App.Repositories @using Moonlight.App.Repositories
@using Moonlight.App.Database.Entities @using Moonlight.App.Database.Entities
@using Moonlight.App.Models.Forms
@using Moonlight.App.Models.Misc @using Moonlight.App.Models.Misc
@using Moonlight.App.Services @using Moonlight.App.Services
@using Moonlight.App.Services.Interop @using Moonlight.App.Services.Interop
@using Moonlight.App.Services.Sessions @using Moonlight.App.Services.Sessions
@using Mappy.Net
@inject Repository<User> UserRepository @inject Repository<User> UserRepository
@inject Repository<PermissionGroup> PermissionGroupRepository
@inject UserService UserService @inject UserService UserService
@inject SessionServerService SessionServerService @inject SessionServerService SessionServerService
@inject ToastService ToastService @inject ToastService ToastService
@@ -33,6 +36,7 @@
</div> </div>
</div> </div>
<SmartForm Model="Model" OnValidSubmit="Update">
<div class="mt-5 row"> <div class="mt-5 row">
<div class="col-xl-6 mb-5 mb-xl-10"> <div class="col-xl-6 mb-5 mb-xl-10">
<div class="card card-body p-10"> <div class="card card-body p-10">
@@ -40,19 +44,19 @@
<label class="form-label"> <label class="form-label">
<TL>First name</TL> <TL>First name</TL>
</label> </label>
<input @bind="User.FirstName" type="text" class="form-control"> <InputText @bind-Value="Model.FirstName" class="form-control"/>
</div> </div>
<div class="mb-10"> <div class="mb-10">
<label class="form-label"> <label class="form-label">
<TL>Last name</TL> <TL>Last name</TL>
</label> </label>
<input @bind="User.LastName" type="text" class="form-control"> <InputText @bind-Value="Model.LastName" class="form-control"/>
</div> </div>
<div class="mb-10"> <div class="mb-10">
<label class="form-label"> <label class="form-label">
<TL>Email</TL> <TL>Email</TL>
</label> </label>
<input @bind="User.Email" type="email" class="form-control"> <InputText @bind-Value="Model.Email" type="email" class="form-control"/>
</div> </div>
</div> </div>
<div class="mt-5 card card-body p-10"> <div class="mt-5 card card-body p-10">
@@ -87,6 +91,16 @@
</WButton> </WButton>
</div> </div>
</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="mt-5 card card-body p-10">
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<a href="/admin/users" class="btn btn-danger me-3"> <a href="/admin/users" class="btn btn-danger me-3">
@@ -96,11 +110,9 @@
CssClasses="btn-primary me-3" CssClasses="btn-primary me-3"
OnClick="EditPermissions"> OnClick="EditPermissions">
</WButton> </WButton>
<WButton Text="@(SmartTranslateService.Translate("Update"))" <button type="submit" class="btn btn-success">
WorkingText="@(SmartTranslateService.Translate("Updating"))" <TL>Update</TL>
CssClasses="btn-success" </button>
OnClick="Update">
</WButton>
</div> </div>
</div> </div>
</div> </div>
@@ -110,34 +122,34 @@
<label class="form-label"> <label class="form-label">
<TL>Address</TL> <TL>Address</TL>
</label> </label>
<input @bind="User.Address" type="text" class="form-control"> <InputText @bind-Value="Model.Address" class="form-control"/>
</div> </div>
<div class="mb-10"> <div class="mb-10">
<label class="form-label"> <label class="form-label">
<TL>City</TL> <TL>City</TL>
</label> </label>
<input @bind="User.City" type="text" class="form-control"> <InputText @bind-Value="Model.City" class="form-control"/>
</div> </div>
<div class="mb-10"> <div class="mb-10">
<label class="form-label"> <label class="form-label">
<TL>State</TL> <TL>State</TL>
</label> </label>
<input @bind="User.State" type="text" class="form-control"> <InputText @bind-Value="Model.State" class="form-control"/>
</div> </div>
<div class="mb-10"> <div class="mb-10">
<label class="form-label"> <label class="form-label">
<TL>Country</TL> <TL>Country</TL>
</label> </label>
<input @bind="User.Country" type="text" class="form-control"> <InputText @bind-Value="Model.Country" class="form-control"/>
</div> </div>
<div class="mb-10"> <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"> <label class="form-label">
<TL>Totp</TL> <TL>Totp</TL>
</label> </label>
</div> </div>
<div class="mb-10"> <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"> <label class="form-label">
<TL>Admin</TL> <TL>Admin</TL>
</label> </label>
@@ -148,15 +160,17 @@
<label class="form-label"> <label class="form-label">
<TL>Discord id</TL> <TL>Discord id</TL>
</label> </label>
<input @bind="User.DiscordId" type="number" class="form-control">
<input @bind="Model.DiscordId" type="number" class="form-control">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</SmartForm>
} }
<PermissionEditor @ref="PermissionEditor" OnSave="SavePermissions" /> <PermissionEditor @ref="PermissionEditor" OnSave="SavePermissions"/>
</LazyLoader> </LazyLoader>
@code @code
{ {
@@ -164,14 +178,25 @@
public int Id { get; set; } public int Id { get; set; }
private User? User; private User? User;
private UserEditDataModel Model { get; set; } = new();
private string NewPassword = ""; private string NewPassword = "";
private PermissionGroup[] PermissionGroups;
private PermissionEditor PermissionEditor; private PermissionEditor PermissionEditor;
private Task Load(LazyLoader arg) private Task Load(LazyLoader arg)
{ {
User = UserRepository.Get().FirstOrDefault(x => x.Id == Id); User = UserRepository.Get().FirstOrDefault(x => x.Id == Id);
if (User != null)
{
Model = Mapper.Map<UserEditDataModel>(User);
PermissionGroups = PermissionGroupRepository
.Get()
.ToArray();
}
return Task.CompletedTask; return Task.CompletedTask;
} }
@@ -188,6 +213,7 @@
private async Task Update() private async Task Update()
{ {
User = Mapper.Map(User, Model);
UserRepository.Update(User!); UserRepository.Update(User!);
await ToastService.Success(SmartTranslateService.Translate("Successfully updated 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="flex-lg-row-fluid ms-lg-15">
<div class="card mb-3"> <div class="card mb-3">
<div class="card-header border-0"> <div class="card-header border-0">
<span class="card-title"> <span class="card-title"></span>
<TL>Services</TL>
</span>
<div class="card-toolbar"> <div class="card-toolbar">
<a href="/admin/users/edit/@(User.Id)" class="btn btn-primary"> <a href="/admin/users/edit/@(User.Id)" class="btn btn-primary">
<TL>Edit</TL> <TL>Edit</TL>