feat: employee management — add/delete users from Members page

- Backend: POST /api/auth/users (create user), DELETE /api/auth/users/:id (delete user, unassign tasks)
- Frontend API: apiCreateUser, apiDeleteUser
- MembersPage: working Add Employee modal (name/email/password/role/dept), delete button with confirmation
- Only CEO/CTO/Manager roles see management controls
- CSS: btn-danger, btn-danger-sm styles
This commit is contained in:
tusuii
2026-02-16 12:48:20 +05:30
parent 22f048989a
commit 0fa2302b26
5 changed files with 206 additions and 16 deletions

View File

@@ -1,5 +1,5 @@
import { useState, useEffect } from 'react';
import { apiFetchTasks, apiFetchUsers, apiCreateTask, apiUpdateTask, apiAddActivity, apiAddDependency, apiToggleDependency, apiRemoveDependency } from './api';
import { apiFetchTasks, apiFetchUsers, apiCreateTask, apiUpdateTask, apiAddActivity, apiAddDependency, apiToggleDependency, apiRemoveDependency, apiCreateUser, apiDeleteUser } from './api';
import type { Task, User, Status } from './data';
import { STATUS_LABELS } from './data';
import { LoginPage } from './Login';
@@ -186,6 +186,18 @@ export default function App() {
} catch (err) { console.error('Failed to remove dependency:', err); }
};
const handleAddUser = async (data: { name: string; email: string; password: string; role: string; dept: string }) => {
const newUser = await apiCreateUser(data);
setUsers(prev => [...prev, newUser]);
};
const handleDeleteUser = async (id: string) => {
await apiDeleteUser(id);
setUsers(prev => prev.filter(u => u.id !== id));
// Unassign tasks locally too
setTasks(prev => prev.map(t => t.assignee === id ? { ...t, assignee: '' } : t).map(t => t.reporter === id ? { ...t, reporter: '' } : t));
};
const displayPage = VIEW_PAGES.includes(activePage) ? activeView : activePage;
const filteredMyTasks = tasks.filter(t => t.assignee === currentUser.id);
@@ -229,7 +241,7 @@ export default function App() {
)}
{displayPage === 'teamtasks' && <TeamTasksPage tasks={tasks} currentUser={currentUser} users={users} />}
{displayPage === 'reports' && <ReportsPage tasks={tasks} users={users} />}
{displayPage === 'members' && <MembersPage tasks={tasks} users={users} />}
{displayPage === 'members' && <MembersPage tasks={tasks} users={users} currentUser={currentUser} onAddUser={handleAddUser} onDeleteUser={handleDeleteUser} />}
</div>
</div>