diff --git a/src/Controllers/UsersController.cs b/src/Controllers/UsersController.cs index 630c41b..bdc7782 100644 --- a/src/Controllers/UsersController.cs +++ b/src/Controllers/UsersController.cs @@ -63,6 +63,10 @@ public class UsersController : Controller [HttpPost("Create")] public async Task Create([FromBody] UsersCreateRequestModel requestModel) { + if (requestModel is null) + { + return new() { Success = false, Exception = "The request model is null" }; + } try { string? jpegPhoto = requestModel.JpegPhoto; diff --git a/src/Resources/Views.Home.Users.de.resx b/src/Resources/Views.Home.Users.de.resx index a779788..828b8ed 100644 --- a/src/Resources/Views.Home.Users.de.resx +++ b/src/Resources/Views.Home.Users.de.resx @@ -127,4 +127,7 @@ Löschen bestätigen + + Passwörter müssen mindestens 8 Zeichen lang sein und Groß- und Kleinbuchstaben, sowie mindestens eine Zahl und mindestens ein Sonderzeichen enthalten + diff --git a/src/Views/Home/Users.cshtml b/src/Views/Home/Users.cshtml index ca68980..b4c5345 100644 --- a/src/Views/Home/Users.cshtml +++ b/src/Views/Home/Users.cshtml @@ -112,10 +112,8 @@ deleteModal.addEventListener('show.bs.modal', event => { currentButton = event.relatedTarget; // Button that triggered the modal const userId = currentButton.getAttribute('data-user-id'); - const userName = currentButton.getAttribute('data-user-name'); deleteModal.querySelector('#userId').textContent = userId; - deleteModal.querySelector('#userName').textContent = userName; }); @@ -123,7 +121,6 @@ const deleteForm = document.getElementById('deleteForm'); deleteForm.addEventListener('submit', async e => { e.preventDefault(); - console.log(deleteForm); const userId = deleteModal.querySelector('#userId').textContent; const url = `/Users/Delete?uid=${userId}`; @@ -298,6 +295,12 @@ updateForm.addEventListener('submit', async e => { e.preventDefault(); + + const password = updateForm.querySelector('input[name="UserPassword"]').value; + if (password.length > 0 && !validatePassword(password)) { + showToast('@T["Password must be at least 8 characters long and include upper, lower, number, and special character"]', 'danger'); + return; + } var dataFromEntries = Object.fromEntries(new FormData(updateForm).entries()); var data = unflatten(dataFromEntries); data.Description.Groups = Array.from(updateForm.querySelector('#updateGroups').selectedOptions).map(option => option.value); @@ -543,6 +546,13 @@ // Submit create form createForm.addEventListener('submit', async e => { e.preventDefault(); + + const password = createForm.querySelector('input[name="UserPassword"]').value; + if (password == null || !validatePassword(password)) { + showToast('@T["Password must be at least 8 characters long and include upper, lower, number, and special character"]', 'danger'); + return; + } + const dataFromEntries = Object.fromEntries(new FormData(createForm).entries()); const data = unflatten(dataFromEntries); data.Description.Groups = Array.from(createGroupsSelect.selectedOptions).map(o => o.value); @@ -564,7 +574,7 @@ const newRow = document.createElement('tr'); newRow.innerHTML = ` Photo - ${result.NewUid || ''} + ${result.Uid || ''} ${data.Title || ''} ${data.Cn || ''} ${data.Sn || ''} @@ -576,22 +586,29 @@ data-user-title="${data.Title || ''}" data-user-name="${data.Cn || ''}" data-user-surname="${data.Sn || ''}" + data-user-birthdate="${data.BirthDate}" + data-user-address-city="${data.Description.Address.City}" + data-user-address-street="${data.Description.Address.Street}" + data-user-address-streetnr="${data.Description.Address.StreetNr}" data-user-workplace="${data.Description?.Workplace || ''}" data-user-groups='${JSON.stringify(data.Description?.Groups || [])}' data-bs-toggle="modal" data-bs-target="#updateModal"> - Update + @T["Update"] `; + newRow.setAttribute("data-asset-id", result.Uid); + newRow.classList.toggle("user-row"); + registerRowDetailviewClick(newRow); tbody.appendChild(newRow); } else { showToast(`${result.Exception || '@T["Create failed"]'}`, 'danger'); @@ -689,52 +706,53 @@