From cb412f5b1d8e6bab962449e5ae240fbcf04fe74d Mon Sep 17 00:00:00 2001 From: treamz Date: Sat, 21 Mar 2026 23:54:29 +0300 Subject: [PATCH] Admin: password change field for users - Virtual password field in AdminJS user edit form - Auto-hashes with bcrypt on save (edit + new actions) - Leave empty to keep current password - Description hint in UI --- lib/admin.js | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/admin.js b/lib/admin.js index 16133a4..0949368 100644 --- a/lib/admin.js +++ b/lib/admin.js @@ -101,12 +101,39 @@ async function setupAdmin(app) { options: { navigation: { name: 'Пользователи', icon: 'User' }, listProperties: ['id', 'email', 'display_name', 'role', 'is_blocked', 'last_login'], - editProperties: ['email', 'display_name', 'role', 'is_blocked'], + editProperties: ['email', 'display_name', 'role', 'is_blocked', 'password'], showProperties: ['id', 'email', 'display_name', 'role', 'is_blocked', 'created_at', 'last_login'], properties: { password_hash: { isVisible: false }, + password: { + type: 'password', + isVisible: { list: false, show: false, edit: true, filter: false }, + description: 'Оставьте пустым чтобы не менять', + }, role: { availableValues: [{ value: 'user', label: 'User' }, { value: 'admin', label: 'Admin' }] }, }, + actions: { + edit: { + before: async (request) => { + if (request.payload && request.payload.password && request.payload.password.trim()) { + const bcrypt = require('bcrypt'); + request.payload.password_hash = await bcrypt.hash(request.payload.password, 10); + } + delete request.payload.password; + return request; + }, + }, + new: { + before: async (request) => { + if (request.payload && request.payload.password && request.payload.password.trim()) { + const bcrypt = require('bcrypt'); + request.payload.password_hash = await bcrypt.hash(request.payload.password, 10); + } + delete request.payload.password; + return request; + }, + }, + }, }, }, {