Fixed missing required fields and other issues in users view

This commit is contained in:
2025-11-24 13:03:55 +01:00
parent 3f6ecbe617
commit 8641e11ad3
2 changed files with 16 additions and 11 deletions

View File

@@ -76,7 +76,6 @@ public class UsersController : Controller
UserDescription? description = requestModel.Description; UserDescription? description = requestModel.Description;
jpegPhoto ??= ImageHelper.GetDefaultUserImageAsBase64(); jpegPhoto ??= ImageHelper.GetDefaultUserImageAsBase64();
string uid = UsersHelper.CreateUsername(requestModel.Cn ?? "", requestModel.Sn ?? ""); string uid = UsersHelper.CreateUsername(requestModel.Cn ?? "", requestModel.Sn ?? "");
title ??= "";
description ??= new() {Address = new(), BirthDate = "", Workplace = "", Groups = []}; description ??= new() {Address = new(), BirthDate = "", Workplace = "", Groups = []};
if (!userPassword.StartsWith('{')) if (!userPassword.StartsWith('{'))
{ {
@@ -88,12 +87,13 @@ public class UsersController : Controller
new LdapAttribute("objectClass", "inetOrgPerson"), new LdapAttribute("objectClass", "inetOrgPerson"),
new LdapAttribute("cn", requestModel.Cn), new LdapAttribute("cn", requestModel.Cn),
new LdapAttribute("sn", requestModel.Sn), new LdapAttribute("sn", requestModel.Sn),
new LdapAttribute("title", title),
new LdapAttribute("uid", uid), new LdapAttribute("uid", uid),
new LdapAttribute("jpegPhoto", jpegPhoto), new LdapAttribute("jpegPhoto", jpegPhoto),
new LdapAttribute("description", JsonSerializer.Serialize(description)), new LdapAttribute("description", JsonSerializer.Serialize(description)),
new LdapAttribute("userPassword", userPassword), new LdapAttribute("userPassword", userPassword),
]; ];
if (title is not null && title.Length > 0) attributeSet.Add(new LdapAttribute("title", title));
await _ldap.CreateUser(uid, attributeSet); await _ldap.CreateUser(uid, attributeSet);
return new(){Success = true, Uid = uid}; return new(){Success = true, Uid = uid};
} }
@@ -122,7 +122,7 @@ public class UsersController : Controller
await _ldap.UpdateUser(uid, "uid", requestModel.NewUid); await _ldap.UpdateUser(uid, "uid", requestModel.NewUid);
uid = requestModel.NewUid; uid = requestModel.NewUid;
} }
if (requestModel.Title is not null) if (requestModel.Title is not null && requestModel.Title.Length > 0)
{ {
await _ldap.UpdateUser(uid, "title", requestModel.Title); await _ldap.UpdateUser(uid, "title", requestModel.Title);
} }

View File

@@ -197,7 +197,7 @@
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label" for="updateAddressStreetNr">@T["Street Nr."]</label> <label class="form-label" for="updateAddressStreetNr">@T["Street Nr."]</label>
<input type="text" id="updateAddressStreetNr" name="Description.Address.StreetNr" class="form-control" /> <input type="number" id="updateAddressStreetNr" name="Description.Address.StreetNr" class="form-control" />
</div> </div>
<hr class="my-3"> <hr class="my-3">
<h4 class="fw-bold">@T["Workplace & account"]</h4> <h4 class="fw-bold">@T["Workplace & account"]</h4>
@@ -213,7 +213,7 @@
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label" for="updatePassword">@T["New Password"]</label> <label class="form-label" for="updatePassword">@T["New Password"]</label>
<input type="password" id="updatePassword" name="UserPassword" class="form-control" /> <input type="password" id="updatePassword" name="UserPassword" class="form-control" pattern="(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}" title="@T["Password must be at least 8 characters long and include upper, lower, number, and special character"]" />
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label" for="updatePhotoFile">@T["Photo"]</label> <label class="form-label" for="updatePhotoFile">@T["Photo"]</label>
@@ -278,6 +278,9 @@
var dataFromEntries = Object.fromEntries(new FormData(updateForm).entries()); var dataFromEntries = Object.fromEntries(new FormData(updateForm).entries());
var data = unflatten(dataFromEntries); var data = unflatten(dataFromEntries);
data.Description.Groups = Array.from(updateForm.querySelector('#updateGroups').selectedOptions).map(option => option.value); data.Description.Groups = Array.from(updateForm.querySelector('#updateGroups').selectedOptions).map(option => option.value);
if (data.Description.Address.StreetNr == "") {
delete(data.Description.Address.StreetNr);
}
try { try {
const response = await fetch('/Users/Update', { const response = await fetch('/Users/Update', {
method: 'POST', method: 'POST',
@@ -435,11 +438,11 @@
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label" for="createName">@T["Name"]</label> <label class="form-label" for="createName">@T["Name"]</label>
<input type="text" name="Cn" id="createName" class="form-control" /> <input type="text" name="Cn" id="createName" required class="form-control" />
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label" for="createSurname">@T["Surname"]</label> <label class="form-label" for="createSurname">@T["Surname"]</label>
<input type="text" name="Sn" id="createSurname" class="form-control" /> <input type="text" name="Sn" id="createSurname" required class="form-control" />
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label" for="createBirthDate">@T["Birth Date"]</label> <label class="form-label" for="createBirthDate">@T["Birth Date"]</label>
@@ -455,7 +458,7 @@
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label" for="createStreetNr">@T["Street Nr."]</label> <label class="form-label" for="createStreetNr">@T["Street Nr."]</label>
<input type="text" id="createStreetNr" name="Description.Address.StreetNr" class="form-control" /> <input type="number" id="createStreetNr" name="Description.Address.StreetNr" class="form-control" />
</div> </div>
<hr class="my-3"> <hr class="my-3">
<h4 class="fw-bold">@T["Workplace & account"]</h4> <h4 class="fw-bold">@T["Workplace & account"]</h4>
@@ -471,7 +474,7 @@
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label" for="createPassword">@T["Password"]</label> <label class="form-label" for="createPassword">@T["Password"]</label>
<input type="password" id="createPassword" name="UserPassword" class="form-control" /> <input type="password" id="createPassword" name="UserPassword" class="form-control" pattern="(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}" title="@T["Password must be at least 8 characters long and include upper, lower, number, and special character"]" required />
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label" for="createPhotoFile">@T["Photo"]</label> <label class="form-label" for="createPhotoFile">@T["Photo"]</label>
@@ -539,7 +542,9 @@
const dataFromEntries = Object.fromEntries(new FormData(createForm).entries()); const dataFromEntries = Object.fromEntries(new FormData(createForm).entries());
const data = unflatten(dataFromEntries); const data = unflatten(dataFromEntries);
data.Description.Groups = Array.from(createGroupsSelect.selectedOptions).map(o => o.value); data.Description.Groups = Array.from(createGroupsSelect.selectedOptions).map(o => o.value);
if (data.Description.Address.StreetNr == "") {
delete(data.Description.Address.StreetNr);
}
try { try {
const response = await fetch('/Users/Create', { const response = await fetch('/Users/Create', {
method: 'POST', method: 'POST',
@@ -572,7 +577,7 @@
data-user-birthdate="${data.Description.BirthDate}" data-user-birthdate="${data.Description.BirthDate}"
data-user-address-city="${data.Description.Address.City}" data-user-address-city="${data.Description.Address.City}"
data-user-address-street="${data.Description.Address.Street}" data-user-address-street="${data.Description.Address.Street}"
data-user-address-streetnr="${data.Description.Address.StreetNr}" data-user-address-streetnr="${data.Description.Address.StreetNr || ""}"
data-user-workplace="${data.Description?.Workplace || ''}" data-user-workplace="${data.Description?.Workplace || ''}"
data-user-groups='${JSON.stringify(data.Description?.Groups || [])}' data-user-groups='${JSON.stringify(data.Description?.Groups || [])}'
data-bs-toggle="modal" data-bs-toggle="modal"