fixed minor bug issue in admin panel page and allow for multiple email addresses to generate token for

This commit is contained in:
DESKTOP-T0O5CDB\DESK-555BD
2024-10-05 17:28:39 -06:00
parent e1bbc232e1
commit 8c5f1c3a01
4 changed files with 89 additions and 40 deletions

View File

@@ -22,15 +22,46 @@ namespace CarCareTracker.Controllers
{ {
var viewModel = new AdminViewModel var viewModel = new AdminViewModel
{ {
Users = _loginLogic.GetAllUsers(), Users = _loginLogic.GetAllUsers().OrderBy(x=>x.Id).ToList(),
Tokens = _loginLogic.GetAllTokens() Tokens = _loginLogic.GetAllTokens()
}; };
return View(viewModel); return View(viewModel);
} }
public IActionResult GetTokenPartialView()
{
var viewModel = _loginLogic.GetAllTokens();
return PartialView("_Tokens", viewModel);
}
public IActionResult GetUserPartialView()
{
var viewModel = _loginLogic.GetAllUsers().OrderBy(x => x.Id).ToList();
return PartialView("_Users", viewModel);
}
public IActionResult GenerateNewToken(string emailAddress, bool autoNotify) public IActionResult GenerateNewToken(string emailAddress, bool autoNotify)
{ {
var result = _loginLogic.GenerateUserToken(emailAddress, autoNotify); if (emailAddress.Contains(","))
return Json(result); {
string[] emailAddresses = emailAddress.Split(',');
foreach(string emailAdd in emailAddresses)
{
var trimmedEmail = emailAdd.Trim();
if (!string.IsNullOrWhiteSpace(trimmedEmail))
{
var result = _loginLogic.GenerateUserToken(emailAdd.Trim(), autoNotify);
if (!result.Success)
{
//if fail, return prematurely
return Json(result);
}
}
}
var successResponse = new OperationResponse { Success = true, Message = "Token Generated!" };
return Json(successResponse);
} else
{
var result = _loginLogic.GenerateUserToken(emailAddress, autoNotify);
return Json(result);
}
} }
[HttpPost] [HttpPost]
public IActionResult DeleteToken(int tokenId) public IActionResult DeleteToken(int tokenId)

View File

@@ -35,7 +35,7 @@
<button onclick="generateNewToken()" class="btn btn-primary btn-md mt-1 mb-1"> <button onclick="generateNewToken()" class="btn btn-primary btn-md mt-1 mb-1">
<i class="bi bi-pencil-square me-2"></i>@translator.Translate(userLanguage, "Generate User Token") <i class="bi bi-pencil-square me-2"></i>@translator.Translate(userLanguage, "Generate User Token")
</button> </button>
<button class="btn btn-outline-primary btn-md mt-1 mb-1" @(emailServerIsSetup ? "" : "disabled") onclick="toggleAutoNotify()"> <button class="btn btn-outline-primary btn-md mt-1 mb-1" @(emailServerIsSetup ? "" : "disabled") onclick="toggleAutoNotify(event)">
<div class="form-check"> <div class="form-check">
<input class="form-check-input" type="checkbox" role="switch" id="enableAutoNotify" @(emailServerIsSetup ? "checked" : "disabled")> <input class="form-check-input" type="checkbox" role="switch" id="enableAutoNotify" @(emailServerIsSetup ? "checked" : "disabled")>
<label class="form-check-label" for="enableAutoNotify">@translator.Translate(userLanguage, "Notify")</label> <label class="form-check-label" for="enableAutoNotify">@translator.Translate(userLanguage, "Notify")</label>
@@ -53,22 +53,17 @@
<th scope="col" class="col-2">@translator.Translate(userLanguage, "Delete")</th> <th scope="col" class="col-2">@translator.Translate(userLanguage, "Delete")</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody id="tokenTable">
@foreach (Token token in Model.Tokens) @await Html.PartialAsync("_Tokens", Model.Tokens)
{
<tr class="d-flex">
<td class="col-4" style="cursor:pointer;" onclick="copyToClipboard(this)">@token.Body</td>
<td class="col-6 text-truncate">@token.EmailAddress</td>
<td class="col-2">
<button type="button" class="btn btn-danger" onclick="deleteToken(@token.Id, this)"><i class="bi bi-trash"></i></button>
</td>
</tr>
}
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="col-12 col-md-7"> <div class="col-12 col-md-7">
<span class="lead">@translator.Translate(userLanguage, "Users")</span> <div class="row">
<div class="col-12 d-flex align-items-center">
<span class="lead">@translator.Translate(userLanguage, "Users")</span>
</div>
</div>
<hr /> <hr />
<table class="table table-hover"> <table class="table table-hover">
<thead class="sticky-top"> <thead class="sticky-top">
@@ -79,45 +74,45 @@
<th scope="col" class="col-2">@translator.Translate(userLanguage, "Delete")</th> <th scope="col" class="col-2">@translator.Translate(userLanguage, "Delete")</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody id="userTable">
@foreach (UserData userData in Model.Users) @await Html.PartialAsync("_Users", Model.Users)
{
<tr class="d-flex" style="cursor:pointer;">
<td class="col-4 d-flex align-items-center">@userData.UserName</td>
<td class="col-4 d-flex align-items-center">@userData.EmailAddress</td>
<td class="col-2 d-flex align-items-center"><input class="form-check-input" type="checkbox" value="" onchange="updateUserAdmin(@userData.Id, this)" @(userData.IsAdmin ? "checked" : "") /></td>
<td class="col-2 d-flex align-items-center"><button type="button" class="btn btn-danger" onclick="deleteUser(@userData.Id, this)"><i class="bi bi-trash"></i></button></td>
</tr>
}
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>
</div> </div>
<script> <script>
function updateUserAdmin(userId, sender){ function reloadTokenTable() {
$.get('/Admin/GetTokenPartialView', function (data) {
$("#tokenTable").html(data);
});
}
function reloadUserTable() {
$.get('/Admin/GetUserPartialView', function (data) {
$("#userTable").html(data);
});
}
function updateUserAdmin(userId, sender) {
var isChecked = $(sender).is(":checked"); var isChecked = $(sender).is(":checked");
$.post('/Admin/UpdateUserAdminStatus', { userId: userId, isAdmin: isChecked }, function (data) { $.post('/Admin/UpdateUserAdminStatus', { userId: userId, isAdmin: isChecked }, function (data) {
if (data){ if (data) {
reloadPage(); reloadUserTable();
} else { } else {
errorToast(genericErrorMessage()); errorToast(genericErrorMessage());
} }
}); });
} }
function reloadPage() { function toggleAutoNotify(e) {
window.location.reload();
}
function toggleAutoNotify() {
if (!$("#enableAutoNotify").attr("disabled")) { if (!$("#enableAutoNotify").attr("disabled")) {
var currentCheckStatus = $("#enableAutoNotify").attr("checked"); if ($(e.target).hasClass('btn')) {
$("#enableAutoNotify").attr("checked", !currentCheckStatus); $("#enableAutoNotify").trigger('click');
}
} }
} }
function deleteToken(tokenId) { function deleteToken(tokenId) {
$.post(`/Admin/DeleteToken?tokenId=${tokenId}`, function (data) { $.post(`/Admin/DeleteToken?tokenId=${tokenId}`, function (data) {
if (data) { if (data) {
reloadPage(); reloadTokenTable();
} else { } else {
errorToast(genericErrorMessage()); errorToast(genericErrorMessage());
} }
@@ -126,7 +121,7 @@
function deleteUser(userId) { function deleteUser(userId) {
$.post(`/Admin/DeleteUser?userId=${userId}`, function (data) { $.post(`/Admin/DeleteUser?userId=${userId}`, function (data) {
if (data) { if (data) {
reloadPage(); reloadUserTable();
} else { } else {
errorToast(genericErrorMessage()); errorToast(genericErrorMessage());
} }
@@ -136,8 +131,8 @@
Swal.fire({ Swal.fire({
title: 'Generate Token', title: 'Generate Token',
html: ` html: `
<input type="text" id="inputEmail" class="swal2-input" placeholder="Email Address" onkeydown="handleSwalEnter(event)"> <input type="text" id="inputEmail" class="swal2-input" placeholder="Email Address" onkeydown="handleSwalEnter(event)">
`, `,
confirmButtonText: 'Generate', confirmButtonText: 'Generate',
focusConfirm: false, focusConfirm: false,
preConfirm: () => { preConfirm: () => {
@@ -152,7 +147,7 @@
var autoNotify = $("#enableAutoNotify").is(":checked"); var autoNotify = $("#enableAutoNotify").is(":checked");
$.get('/Admin/GenerateNewToken', { emailAddress: result.value.emailAddress, autoNotify: autoNotify }, function (data) { $.get('/Admin/GenerateNewToken', { emailAddress: result.value.emailAddress, autoNotify: autoNotify }, function (data) {
if (data.success) { if (data.success) {
reloadPage(); reloadTokenTable();
} else { } else {
errorToast(data.message) errorToast(data.message)
} }

View File

@@ -0,0 +1,12 @@
@using CarCareTracker.Helper
@model List<Token>
@foreach (Token token in Model)
{
<tr class="d-flex">
<td class="col-4" style="cursor:pointer;" onclick="copyToClipboard(this)">@token.Body</td>
<td class="col-6 text-truncate">@StaticHelper.TruncateStrings(token.EmailAddress)</td>
<td class="col-2">
<button type="button" class="btn btn-danger" onclick="deleteToken(@token.Id, this)"><i class="bi bi-trash"></i></button>
</td>
</tr>
}

11
Views/Admin/_Users.cshtml Normal file
View File

@@ -0,0 +1,11 @@
@using CarCareTracker.Helper
@model List<UserData>
@foreach (UserData userData in Model)
{
<tr class="d-flex" style="cursor:pointer;">
<td class="col-4 d-flex align-items-center">@StaticHelper.TruncateStrings(userData.UserName)</td>
<td class="col-4 d-flex align-items-center">@StaticHelper.TruncateStrings(userData.EmailAddress)</td>
<td class="col-2 d-flex align-items-center"><input class="form-check-input" type="checkbox" value="" onchange="updateUserAdmin(@userData.Id, this)" @(userData.IsAdmin ? "checked" : "") /></td>
<td class="col-2 d-flex align-items-center"><button type="button" class="btn btn-danger" onclick="deleteUser(@userData.Id, this)"><i class="bi bi-trash"></i></button></td>
</tr>
}