From 872a06d7139875008712592e5830237ec6f07c96 Mon Sep 17 00:00:00 2001 From: Hammer Date: Wed, 28 Jan 2026 18:46:02 +0000 Subject: [PATCH] Add role selector to invite form and user management --- dist/index.html | 4 ++-- src/lib/api.ts | 2 +- src/pages/Admin.tsx | 57 +++++++++++++++++++++++++++++++++++++-------- 3 files changed, 50 insertions(+), 13 deletions(-) diff --git a/dist/index.html b/dist/index.html index ff7d211..1b7f52f 100644 --- a/dist/index.html +++ b/dist/index.html @@ -6,8 +6,8 @@ Todo App - - + +
diff --git a/src/lib/api.ts b/src/lib/api.ts index 9540172..95e218a 100644 --- a/src/lib/api.ts +++ b/src/lib/api.ts @@ -250,7 +250,7 @@ class ApiClient { await this.fetch(`/admin/users/${id}`, { method: 'DELETE' }); } - async createInvite(data: { email: string; name: string }): Promise { + async createInvite(data: { email: string; name: string; role?: 'admin' | 'user' }): Promise { return this.fetch('/admin/invites', { method: 'POST', body: JSON.stringify(data), diff --git a/src/pages/Admin.tsx b/src/pages/Admin.tsx index 5ce86c8..96a0c98 100644 --- a/src/pages/Admin.tsx +++ b/src/pages/Admin.tsx @@ -16,6 +16,7 @@ export function AdminPage() { const [showInviteForm, setShowInviteForm] = useState(false); const [inviteEmail, setInviteEmail] = useState(''); const [inviteName, setInviteName] = useState(''); + const [inviteRole, setInviteRole] = useState<'admin' | 'user'>('user'); const [inviteError, setInviteError] = useState(''); const [inviteUrl, setInviteUrl] = useState(''); const [copied, setCopied] = useState(false); @@ -45,7 +46,7 @@ export function AdminPage() { setInviteError(''); try { - const result = await api.createInvite({ email: inviteEmail, name: inviteName }); + const result = await api.createInvite({ email: inviteEmail, name: inviteName, role: inviteRole }); setInviteUrl(result.setupUrl); setInvites([result, ...invites]); // Keep form open to show the URL @@ -60,6 +61,15 @@ export function AdminPage() { setTimeout(() => setCopied(false), 2000); }; + const handleChangeRole = async (userId: string, role: 'admin' | 'user' | 'service') => { + try { + await api.updateUserRole(userId, role); + setUsers(users.map(u => u.id === userId ? { ...u, role } : u)); + } catch (error) { + console.error('Failed to update role:', error); + } + }; + const handleDeleteUser = async (userId: string) => { if (!confirm('Are you sure you want to delete this user?')) return; @@ -84,6 +94,7 @@ export function AdminPage() { setShowInviteForm(false); setInviteEmail(''); setInviteName(''); + setInviteRole('user'); setInviteError(''); setInviteUrl(''); }; @@ -149,14 +160,29 @@ export function AdminPage() { {user.name} {user.email} - - {user.role} - + {user.id === currentUser?.id || user.role === 'service' ? ( + + {user.role} + + ) : ( + + )} {new Date(user.createdAt).toLocaleDateString()} @@ -221,7 +247,7 @@ export function AdminPage() { {inviteError && (

{inviteError}

)} -
+
+
+ + +