fixed minor bug issue in admin panel page and allow for multiple email addresses to generate token for
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
12
Views/Admin/_Tokens.cshtml
Normal file
12
Views/Admin/_Tokens.cshtml
Normal 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
11
Views/Admin/_Users.cshtml
Normal 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>
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user