Implemented new user editing including permission groups
This commit is contained in:
34
Moonlight/App/Models/Forms/UserEditDataModel.cs
Normal file
34
Moonlight/App/Models/Forms/UserEditDataModel.cs
Normal 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; }
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -15,24 +18,25 @@
|
|||||||
@attribute [PermissionRequired(nameof(Permissions.AdminUserEdit))]
|
@attribute [PermissionRequired(nameof(Permissions.AdminUserEdit))]
|
||||||
|
|
||||||
<LazyLoader Load="Load">
|
<LazyLoader Load="Load">
|
||||||
@if (User == null)
|
@if (User == null)
|
||||||
{
|
{
|
||||||
<div class="alert alert-danger">
|
<div class="alert alert-danger">
|
||||||
<TL>No user with this id found</TL>
|
<TL>No user with this id found</TL>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header border-0 py-0">
|
<div class="card-header border-0 py-0">
|
||||||
<h3 class="card-title align-items-start flex-column">
|
<h3 class="card-title align-items-start flex-column">
|
||||||
<span class="card-label fw-bold fs-3">
|
<span class="card-label fw-bold fs-3">
|
||||||
<TL>Manage user </TL> <span class="text-primary">@(User.Email)</span>
|
<TL>Manage user </TL> <span class="text-primary">@(User.Email)</span>
|
||||||
</span>
|
</span>
|
||||||
</h3>
|
</h3>
|
||||||
</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" />
|
|
||||||
</LazyLoader>
|
<PermissionEditor @ref="PermissionEditor" OnSave="SavePermissions"/>
|
||||||
|
</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"));
|
||||||
@@ -197,9 +223,9 @@
|
|||||||
{
|
{
|
||||||
await UserService.ChangePassword(User!, NewPassword, true);
|
await UserService.ChangePassword(User!, NewPassword, true);
|
||||||
NewPassword = "";
|
NewPassword = "";
|
||||||
|
|
||||||
await SessionServerService.ReloadUserSessions(User!);
|
await SessionServerService.ReloadUserSessions(User!);
|
||||||
|
|
||||||
await ToastService.Success(SmartTranslateService.Translate("Successfully updated password"));
|
await ToastService.Success(SmartTranslateService.Translate("Successfully updated password"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,7 +239,7 @@
|
|||||||
{
|
{
|
||||||
User!.Permissions = data;
|
User!.Permissions = data;
|
||||||
UserRepository.Update(User);
|
UserRepository.Update(User);
|
||||||
|
|
||||||
await SessionServerService.ReloadUserSessions(User);
|
await SessionServerService.ReloadUserSessions(User);
|
||||||
|
|
||||||
await ToastService.Success(SmartTranslateService.Translate("Successfully updated user"));
|
await ToastService.Success(SmartTranslateService.Translate("Successfully updated user"));
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user