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();
}
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]
public IActionResult RemoveUserFromHousehold(int userId)
@ -306,6 +316,12 @@ namespace CarCareTracker.Controllers
return Json(result);
}
[HttpPost]
public IActionResult LeaveHousehold(int userId)
{
var result = _userLogic.DeleteUserFromHousehold(userId, GetUserID());
return Json(result);
}
[HttpPost]
public IActionResult ModifyUserHouseholdPermissions(int userId, List<HouseholdPermission> permissions)
{
var result = _userLogic.UpdateUserHousehold(GetUserID(), userId, permissions);

View File

@ -16,6 +16,7 @@ namespace CarCareTracker.Logic
bool DeleteAllAccessToVehicle(int vehicleId);
bool DeleteAllAccessToUser(int userId);
List<UserHouseholdViewModel> GetHouseholdForParentUserId(int parentUserId);
List<UserHouseholdViewModel> GetHouseholdForChildUserId(int childUserId);
OperationResponse AddUserToHousehold(int parentUserId, string childUsername);
bool UpdateUserHousehold(int parentUserId, int childUserId, List<HouseholdPermission> permissions);
bool DeleteUserFromHousehold(int parentUserId, int childUserId);
@ -194,7 +195,7 @@ namespace CarCareTracker.Logic
{
var result = _userHouseholdData.GetUserHouseholdByParentUserId(parentUserId);
var convertedResult = new List<UserHouseholdViewModel>();
//convert useraccess to usercollaborator
//convert userhousehold to viewmodel
foreach (UserHousehold userHouseholdAccess in result)
{
var userCollaborator = new UserHouseholdViewModel
@ -206,6 +207,22 @@ namespace CarCareTracker.Logic
}
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)
{
//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
@inject IConfigHelper config
@inject ITranslationHelper translator
@model List<UserHouseholdViewModel>
@model UserHouseholdUserViewModel
@{
var userConfig = config.GetUserConfig(User);
var userLanguage = userConfig.UserLanguage;
@ -18,31 +18,62 @@
</div>
</div>
<div class="modal-body">
<table class="table table-hover">
<thead class="sticky-top">
<tr class="d-flex">
<th scope="col" class="col-6">@translator.Translate(userLanguage, "Username")</th>
<th scope="col" class="col-4">@translator.Translate(userLanguage, "Role")</th>
<th scope="col" class="col-2">@translator.Translate(userLanguage, "Remove")</th>
</tr>
</thead>
<tbody id="tokenTable">
@foreach(UserHouseholdViewModel viewModel in Model)
{
<tr class="d-flex">
<td class="col-6">@viewModel.UserName</td>
<td class="col-4">
<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>
<!option @(viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Edit) && !viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Delete) ? "selected" : "") value="editor">@translator.Translate(userLanguage, "Editor")</!option>
<!option @(viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Edit) && viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Delete) ? "selected" : "") value="manager">@translator.Translate(userLanguage, "Manager")</!option>
</select>
</td>
<td class="col-2">
<button type="button" class="btn btn-danger" onclick="removeUserFromHousehold(@viewModel.UserHousehold.Id.ChildUserId, this)"><i class="bi bi-trash"></i></button>
</td>
</tr>
}
</tbody>
</table>
@if (Model.Households.Any())
{
<div style="max-height:30vh; overflow-y:auto;">
<span class="lead">@translator.Translate(userLanguage, "These users are in your household")</span>
<table class="table table-hover">
<thead class="sticky-top">
<tr class="d-flex">
<th scope="col" class="col-6">@translator.Translate(userLanguage, "Username")</th>
<th scope="col" class="col-4">@translator.Translate(userLanguage, "Role")</th>
<th scope="col" class="col-2">@translator.Translate(userLanguage, "Remove")</th>
</tr>
</thead>
<tbody id="tokenTable">
@foreach (UserHouseholdViewModel viewModel in Model.Households)
{
<tr class="d-flex">
<td class="col-6">@viewModel.UserName</td>
<td class="col-4">
<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>
<!option @(viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Edit) && !viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Delete) ? "selected" : "") value="editor">@translator.Translate(userLanguage, "Editor")</!option>
<!option @(viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Edit) && viewModel.UserHousehold.Permissions.Contains(HouseholdPermission.Delete) ? "selected" : "") value="manager">@translator.Translate(userLanguage, "Manager")</!option>
</select>
</td>
<td class="col-2">
<button type="button" class="btn btn-danger" onclick="removeUserFromHousehold(@viewModel.UserHousehold.Id.ChildUserId, this)"><i class="bi bi-trash"></i></button>
</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>

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) {
let selectedRole = $(e).val();
let permissions = [];