From e589d6667f357181ef8caa8acf280e4e9f774556 Mon Sep 17 00:00:00 2001 From: RKWojs Date: Mon, 29 Sep 2025 19:41:49 +0200 Subject: [PATCH] feat: Add initial identifier field to user management and update related functions --- src/app/admin/users/[id]/edit/page.js | 22 +++++++++++++++++++++- src/app/admin/users/page.js | 3 +++ src/lib/userManagement.js | 15 ++++++++++----- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/app/admin/users/[id]/edit/page.js b/src/app/admin/users/[id]/edit/page.js index 1841782..f1f1e0d 100644 --- a/src/app/admin/users/[id]/edit/page.js +++ b/src/app/admin/users/[id]/edit/page.js @@ -18,6 +18,7 @@ export default function EditUserPage() { username: "", role: "user", is_active: true, + initial: "", password: "" }); const [loading, setLoading] = useState(true); @@ -65,6 +66,7 @@ export default function EditUserPage() { username: userData.username, role: userData.role, is_active: userData.is_active, + initial: userData.initial || "", password: "" // Never populate password field }); } catch (err) { @@ -86,7 +88,8 @@ export default function EditUserPage() { name: formData.name, username: formData.username, role: formData.role, - is_active: formData.is_active + is_active: formData.is_active, + initial: formData.initial.trim() || null }; // Only include password if it's provided @@ -253,6 +256,23 @@ export default function EditUserPage() { +
+ + setFormData({ ...formData, initial: e.target.value })} + placeholder="1-2 letter identifier" + maxLength={2} + className="w-full md:w-1/2" + /> +

+ Optional 1-2 letter identifier for the user +

+
+

{user.name}

{user.username}

+ {user.initial && ( +

Initial: {user.initial}

+ )}
diff --git a/src/lib/userManagement.js b/src/lib/userManagement.js index 04404a2..96ee1d3 100644 --- a/src/lib/userManagement.js +++ b/src/lib/userManagement.js @@ -19,7 +19,7 @@ export async function createUser({ name, username, password, role = 'user', is_a return db.prepare(` SELECT id, name, username, role, created_at, updated_at, last_login, - is_active, failed_login_attempts, locked_until + is_active, failed_login_attempts, locked_until, initial FROM users WHERE id = ? `).get(userId) } @@ -28,7 +28,7 @@ export async function createUser({ name, username, password, role = 'user', is_a export function getUserById(id) { return db.prepare(` SELECT id, name, username, password_hash, role, created_at, updated_at, last_login, - is_active, failed_login_attempts, locked_until + is_active, failed_login_attempts, locked_until, initial FROM users WHERE id = ? `).get(id) } @@ -36,7 +36,7 @@ export function getUserById(id) { // Get user by username export function getUserByUsername(username) { return db.prepare(` - SELECT id, name, username, role, created_at, last_login, is_active + SELECT id, name, username, role, created_at, last_login, is_active, initial FROM users WHERE username = ? `).get(username) } @@ -45,7 +45,7 @@ export function getUserByUsername(username) { export function getAllUsers() { return db.prepare(` SELECT id, name, username, password_hash, role, created_at, updated_at, last_login, is_active, - failed_login_attempts, locked_until + failed_login_attempts, locked_until, initial FROM users ORDER BY created_at DESC `).all() @@ -172,6 +172,11 @@ export async function updateUser(userId, updates) { updateValues.push(updates.is_active ? 1 : 0); } + if (updates.initial !== undefined) { + updateFields.push("initial = ?"); + updateValues.push(updates.initial); + } + if (updates.password !== undefined) { const passwordHash = await bcrypt.hash(updates.password, 12); updateFields.push("password_hash = ?"); @@ -199,7 +204,7 @@ export async function updateUser(userId, updates) { if (result.changes > 0) { return db.prepare(` SELECT id, name, username, role, created_at, updated_at, last_login, - is_active, failed_login_attempts, locked_until + is_active, failed_login_attempts, locked_until, initial FROM users WHERE id = ? `).get(userId); }