fixes #2441 add password fields for generic users in user creation

Introduces password and password confirmation fields when creating a user with 'generic' status. The password fields are shown or hidden based on the selected user status, and validation is added to ensure passwords are entered and match. Also adds a button to generate random passwords for new generic users.
This commit is contained in:
Linty
2025-11-14 17:45:06 +01:00
parent 146c694c6f
commit c6e4a3f0a5
2 changed files with 92 additions and 12 deletions

View File

@@ -175,6 +175,11 @@ $( document ).ready(function() {
$('#edit_user_conf_password').val(password);
hide_error_edit_user();
});
$('.AddUserGenPassword span').on('click', function() {
const password = gen_password();
$('#add_user_pass').val(password);
$('#add_user_confpass').val(password);
});
$('.AddUserSubmit').click(add_user);
$('.AddUserCancel').click(add_user_close);
$(".CloseAddUser").click(add_user_close);
@@ -806,9 +811,19 @@ function add_user_open() {
$('#AddUserSuccessContainer').hide();
$('#AddUserFieldContainer').show();
$('#AddUser :input').val('');
$('#add_user_password').hide();
fill_new_user();
$("#AddUser").fadeIn();
$(".AddUserLabelUsername input").first().focus();
$('#AddUser .user-property-status .user-property-select').off('change').on('change', function() {
const status = $(this).val();
$('#add_user_pass ,#add_user_confpass').val('');
if ('generic' === status) {
$('#add_user_password').show();
return;
}
$('#add_user_password').hide();
});
}
/*------------------
@@ -1660,6 +1675,8 @@ function fill_user_edit(user_to_edit) {
fill_user_edit_update(user_to_edit, pop_in);
fill_user_edit_permissions(user_to_edit, pop_in);
fill_who_is_the_king(user_to_edit, pop_in);
// show/hide password button depending on permissions
// plugins get function
if (Object.keys(plugins_get_functions).length > 0) {
@@ -2144,20 +2161,27 @@ function add_user() {
ajax_data.level = $(".AddUserInputContainer .user-property-level select").val();
ajax_data.enabled_high = $(".AddUserInputContainer .user-list-checkbox[name=\"hd_enabled\"]").attr('data-selected') == '1' ? true : false;
ajax_data.group_id = groups_selected;
ajax_data.auto_password = true;
// for debug
// console.log(ajax_data);
const data = {
username: ajax_data.username,
email: ajax_data.email,
pwg_token,
}
if ('generic' === ajax_data.status) {
data.password = $('#add_user_pass').val();
data.password_confirm = $('#add_user_confpass').val();
} else {
data.auto_password = true;
}
$.ajax({
url: "ws.php?format=json&method=pwg.users.add",
type:"POST",
data: {
username: ajax_data.username,
auto_password: true,
email: ajax_data.email,
pwg_token
},
data: data,
beforeSend: function() {
$("#AddUser .AddUserErrors").css("visibility", "hidden");
if ($(".AddUserLabelUsername .user-property-input").val() == "") {
@@ -2165,6 +2189,26 @@ function add_user() {
$("#AddUser .AddUserErrors").css("visibility", "visible");
return false;
}
if ('generic' === ajax_data.status) {
const pass = $('#add_user_pass').val();
const confPass = $('#add_user_confpass').val();
if ('' == pass) {
$("#AddUser .AddUserErrors").html(missingPassword);
$("#AddUser .AddUserErrors").css("visibility", "visible");
return false;
}
if ('' == confPass) {
$("#AddUser .AddUserErrors").html(missingConfPassword);
$("#AddUser .AddUserErrors").css("visibility", "visible");
return false;
}
if (pass !== confPass) {
$("#AddUser .AddUserErrors").html(noMatchPassword);
$("#AddUser .AddUserErrors").css("visibility", "visible");
return false;
}
}
},
success: (raw_data) => {
let data = jQuery.parseJSON(raw_data);
@@ -2202,7 +2246,12 @@ function add_infos_to_new_user(user_id, ajax_data) {
// add_user_close();
$('#AddUserUpdated').removeClass('icon-red icon-cancel').addClass('icon-green border-green icon-ok');
$('#AddUserUpdatedText').html(user_added_str.replace("%s", ajax_data.username));
send_new_user_password(new_user_id, ajax_data.email);
const status = ['webmaster', 'admin', 'normal'];
if (status.includes(ajax_data.status)) {
send_new_user_password(new_user_id, ajax_data.email);
} else {
add_user_close();
}
$("#AddUser .user-property-input").val("");
$("#AddUserSuccess .edit-now").off("click").on("click", () => {
last_user_id = new_user_id;

View File

@@ -25,6 +25,8 @@ const cancel_msg = '{'No, I have changed my mind'|@translate|@escape}';
const str_and_others_tags = '{'and %s others'|@translate|escape:javascript}';
const missingConfirm = "{'You need to confirm deletion'|translate|escape:javascript}";
const missingUsername = "{'Please, enter a login'|translate|escape:javascript}";
const missingPassword = "{'Password is missing. Please enter the password.'|translate|escape:javascript}";
const missingConfPassword = "{'Password confirmation is missing. Please confirm the chosen password.'|translate|escape:javascript}";
const fieldNotEmpty = "{'Name field must not be empty'|@translate|escape:javascript}"
const noMatchPassword = "{'The passwords do not match'|@translate|escape:javascript}";
const missingField = "{'Please complete all fields'|@translate|escape:javascript}";
@@ -1184,12 +1186,30 @@ $(document).ready(function() {
<option value="admin">{'user_status_admin'|@translate}</option>
<option value="normal">{'user_status_normal'|@translate}</option>
<option value="generic">{'user_status_generic'|@translate}</option>
<option value="guest">{'user_status_guest'|@translate} ({'Deactivated'|@translate})</option>
</select>
</div>
</div>
</div>
<div id="add_user_password" style="display: none;">
<div class="AddUserGenPassword">
<label for="add_user_pass" class="user-property-label AddUserLabelPassword">{'Password'|@translate}</label>
<span class="icon-dice-solid"> {'Generate random password'|@translate}</span>
</div>
<div class="user-property-input-icon" style="margin-bottom: 5px;">
<input id="add_user_pass" class="user-property-input user-property-input-password" value=""
placeholder="{'Password'|@translate}" type="password" />
<span class="icon-eye icon-show-password"></span>
</div>
<label for="add_user_confpass" class="user-property-label AddUserLabelPasswordConf">{'Confirm Password'|@translate}</label>
<div class="user-property-input-icon" style="margin-bottom: 5px;">
<input id="add_user_confpass" class="user-property-input user-property-input-password-conf" value=""
placeholder="{'Confirm Password'|@translate}" type="password" />
<span class="icon-eye icon-show-password"></span>
</div>
</div>
<div class="AddUserInputContainer">
<div class="user-property-level">
<p class="user-property-label">{'Privacy level'|@translate}</p>
@@ -2196,19 +2216,26 @@ $(document).ready(function() {
font-weight: bold;
}
.EditUserGenPassword {
.EditUserGenPassword,
.AddUserGenPassword {
margin-top: 15px;
font-size: 1.1em;
cursor:pointer;
}
.EditUserGenPassword:hover, .EditUserGenPassword:active {
.EditUserGenPassword:hover, .EditUserGenPassword:active,
.AddUserGenPassword span:hover {
color:#ffa646;
}
.EditUserGenPassword span {
.EditUserGenPassword span,
.AddUserGenPassword span {
margin-right:10px;
}
.AddUserGenPassword span {
font-size: 12px;
}
.EditUserErrors {
opacity: 0;
padding: 7px 0;
@@ -2608,6 +2635,10 @@ $(document).ready(function() {
display:none;
}
.hide-user-property-password {
display: none !important;
}
.AddUserPopInContainer{
display:flex;
position:absolute;