Compare commits

...

2 Commits

Author SHA1 Message Date
Hargata Softworks
3f5e3a4b97
Merge pull request #1153 from hargata/Hargata/565
allow users to leave households
2025-11-14 09:59:58 -07:00
DESKTOP-T0O5CDB\DESK-555BD
ab967f1f52 allow users to leave households 2025-11-14 09:46:33 -07:00
6 changed files with 119 additions and 31 deletions

View File

@ -297,7 +297,17 @@ namespace CarCareTracker.Controllers
{ {
households = households.OrderBy(x => x.UserName).ToList(); households = households.OrderBy(x => x.UserName).ToList();
} }
return PartialView("_UserHouseholdModal", households); var userhouseholds = _userLogic.GetHouseholdForChildUserId(GetUserID());
if (userhouseholds.Any())
{
userhouseholds = userhouseholds.OrderBy(x => x.UserName).ToList();
}
var viewModel = new UserHouseholdUserViewModel()
{
Households = households,
UserHouseholds = userhouseholds
};
return PartialView("_UserHouseholdModal", viewModel);
} }
[HttpPost] [HttpPost]
public IActionResult RemoveUserFromHousehold(int userId) public IActionResult RemoveUserFromHousehold(int userId)
@ -306,6 +316,12 @@ namespace CarCareTracker.Controllers
return Json(result); return Json(result);
} }
[HttpPost] [HttpPost]
public IActionResult LeaveHousehold(int userId)
{
var result = _userLogic.DeleteUserFromHousehold(userId, GetUserID());
return Json(result);
}
[HttpPost]
public IActionResult ModifyUserHouseholdPermissions(int userId, List<HouseholdPermission> permissions) public IActionResult ModifyUserHouseholdPermissions(int userId, List<HouseholdPermission> permissions)
{ {
var result = _userLogic.UpdateUserHousehold(GetUserID(), userId, permissions); var result = _userLogic.UpdateUserHousehold(GetUserID(), userId, permissions);

View File

@ -16,6 +16,7 @@ namespace CarCareTracker.Logic
bool DeleteAllAccessToVehicle(int vehicleId); bool DeleteAllAccessToVehicle(int vehicleId);
bool DeleteAllAccessToUser(int userId); bool DeleteAllAccessToUser(int userId);
List<UserHouseholdViewModel> GetHouseholdForParentUserId(int parentUserId); List<UserHouseholdViewModel> GetHouseholdForParentUserId(int parentUserId);
List<UserHouseholdViewModel> GetHouseholdForChildUserId(int childUserId);
OperationResponse AddUserToHousehold(int parentUserId, string childUsername); OperationResponse AddUserToHousehold(int parentUserId, string childUsername);
bool UpdateUserHousehold(int parentUserId, int childUserId, List<HouseholdPermission> permissions); bool UpdateUserHousehold(int parentUserId, int childUserId, List<HouseholdPermission> permissions);
bool DeleteUserFromHousehold(int parentUserId, int childUserId); bool DeleteUserFromHousehold(int parentUserId, int childUserId);
@ -194,7 +195,7 @@ namespace CarCareTracker.Logic
{ {
var result = _userHouseholdData.GetUserHouseholdByParentUserId(parentUserId); var result = _userHouseholdData.GetUserHouseholdByParentUserId(parentUserId);
var convertedResult = new List<UserHouseholdViewModel>(); var convertedResult = new List<UserHouseholdViewModel>();
//convert useraccess to usercollaborator //convert userhousehold to viewmodel
foreach (UserHousehold userHouseholdAccess in result) foreach (UserHousehold userHouseholdAccess in result)
{ {
var userCollaborator = new UserHouseholdViewModel var userCollaborator = new UserHouseholdViewModel
@ -206,6 +207,22 @@ namespace CarCareTracker.Logic
} }
return convertedResult; return convertedResult;
} }
public List<UserHouseholdViewModel> GetHouseholdForChildUserId(int childUserId)
{
var result = _userHouseholdData.GetUserHouseholdByChildUserId(childUserId);
var convertedResult = new List<UserHouseholdViewModel>();
//convert userhousehold to viewmodel
foreach (UserHousehold userHouseholdAccess in result)
{
var userCollaborator = new UserHouseholdViewModel
{
UserName = _userData.GetUserRecordById(userHouseholdAccess.Id.ParentUserId).UserName,
UserHousehold = userHouseholdAccess
};
convertedResult.Add(userCollaborator);
}
return convertedResult;
}
public OperationResponse AddUserToHousehold(int parentUserId, string childUsername) public OperationResponse AddUserToHousehold(int parentUserId, string childUsername)
{ {
//attempting to add to root user //attempting to add to root user

View File

@ -0,0 +1,14 @@
namespace CarCareTracker.Models
{
public class UserHouseholdUserViewModel
{
/// <summary>
/// users that belongs in this user's household
/// </summary>
public List<UserHouseholdViewModel> Households { get; set; }
/// <summary>
/// households that this user belongs to
/// </summary>
public List<UserHouseholdViewModel> UserHouseholds { get; set; }
}
}

View File

@ -1,7 +1,7 @@
@using CarCareTracker.Helper @using CarCareTracker.Helper
@inject IConfigHelper config @inject IConfigHelper config
@inject ITranslationHelper translator @inject ITranslationHelper translator
@model List<UserHouseholdViewModel> @model UserHouseholdUserViewModel
@{ @{
var userConfig = config.GetUserConfig(User); var userConfig = config.GetUserConfig(User);
var userLanguage = userConfig.UserLanguage; var userLanguage = userConfig.UserLanguage;
@ -18,31 +18,62 @@
</div> </div>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<table class="table table-hover"> @if (Model.Households.Any())
<thead class="sticky-top"> {
<tr class="d-flex"> <div style="max-height:30vh; overflow-y:auto;">
<th scope="col" class="col-6">@translator.Translate(userLanguage, "Username")</th> <span class="lead">@translator.Translate(userLanguage, "These users are in your household")</span>
<th scope="col" class="col-4">@translator.Translate(userLanguage, "Role")</th> <table class="table table-hover">
<th scope="col" class="col-2">@translator.Translate(userLanguage, "Remove")</th> <thead class="sticky-top">
</tr> <tr class="d-flex">
</thead> <th scope="col" class="col-6">@translator.Translate(userLanguage, "Username")</th>
<tbody id="tokenTable"> <th scope="col" class="col-4">@translator.Translate(userLanguage, "Role")</th>
@foreach(UserHouseholdViewModel viewModel in Model) <th scope="col" class="col-2">@translator.Translate(userLanguage, "Remove")</th>
{ </tr>
<tr class="d-flex"> </thead>
<td class="col-6">@viewModel.UserName</td> <tbody id="tokenTable">
<td class="col-4"> @foreach (UserHouseholdViewModel viewModel in Model.Households)
<select class="form-select" onchange="modifyUserHousehold(@viewModel.UserHousehold.Id.ChildUserId, this)"> {
<!option @(!viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Edit) && !viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Delete) ? "selected" : "") value="viewer">@translator.Translate(userLanguage, "Viewer")</!option> <tr class="d-flex">
<!option @(viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Edit) && !viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Delete) ? "selected" : "") value="editor">@translator.Translate(userLanguage, "Editor")</!option> <td class="col-6">@viewModel.UserName</td>
<!option @(viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Edit) && viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Delete) ? "selected" : "") value="manager">@translator.Translate(userLanguage, "Manager")</!option> <td class="col-4">
</select> <select class="form-select" onchange="modifyUserHousehold(@viewModel.UserHousehold.Id.ChildUserId, this)">
</td> <!option @(!viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Edit) && !viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Delete) ? "selected" : "") value="viewer">@translator.Translate(userLanguage, "Viewer")</!option>
<td class="col-2"> <!option @(viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Edit) && !viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Delete) ? "selected" : "") value="editor">@translator.Translate(userLanguage, "Editor")</!option>
<button type="button" class="btn btn-danger" onclick="removeUserFromHousehold(@viewModel.UserHousehold.Id.ChildUserId, this)"><i class="bi bi-trash"></i></button> <!option @(viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Edit) && viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Delete) ? "selected" : "") value="manager">@translator.Translate(userLanguage, "Manager")</!option>
</td> </select>
</tr> </td>
} <td class="col-2">
</tbody> <button type="button" class="btn btn-danger" onclick="removeUserFromHousehold(@viewModel.UserHousehold.Id.ChildUserId, this)"><i class="bi bi-trash"></i></button>
</table> </td>
</tr>
}
</tbody>
</table>
</div>
}
@if (Model.UserHouseholds.Any())
{
<div style="max-height:30vh; overflow-y:auto;">
<span class="lead">@translator.Translate(userLanguage, "You are a member of these households")</span>
<table class="table table-hover">
<thead class="sticky-top">
<tr class="d-flex">
<th scope="col" class="col-10">@translator.Translate(userLanguage, "Username")</th>
<th scope="col" class="col-2">@translator.Translate(userLanguage, "Leave")</th>
</tr>
</thead>
<tbody id="tokenTable">
@foreach (UserHouseholdViewModel viewModel in Model.UserHouseholds)
{
<tr class="d-flex">
<td class="col-10">@viewModel.UserName</td>
<td class="col-2">
<button type="button" class="btn btn-outline-danger" onclick="leaveHousehold(@viewModel.UserHousehold.Id.ParentUserId, this)"><i class="bi bi-person-walking"></i></button>
</td>
</tr>
}
</tbody>
</table>
</div>
}
</div> </div>

File diff suppressed because one or more lines are too long

View File

@ -601,6 +601,16 @@ function removeUserFromHousehold(userId) {
} }
}) })
} }
function leaveHousehold(userId) {
$.post('/Home/LeaveHousehold', { userId: userId }, function (data) {
if (data) {
successToast('Household Exited');
showHouseholdModal();
} else {
errorToast(genericErrorMessage())
}
});
}
function modifyUserHousehold(userId, e) { function modifyUserHousehold(userId, e) {
let selectedRole = $(e).val(); let selectedRole = $(e).val();
let permissions = []; let permissions = [];