Adding delete to users grid, filtering out logged in user from users grid
This commit is contained in:
+60
-11
@@ -21,15 +21,18 @@ const tdStyle = {
|
|||||||
|
|
||||||
const Dashboard = () => {
|
const Dashboard = () => {
|
||||||
const [role, setRole] = useState("");
|
const [role, setRole] = useState("");
|
||||||
|
const [currentUser, setCurrentUser] = useState("");
|
||||||
const [users, setUsers] = useState([]);
|
const [users, setUsers] = useState([]);
|
||||||
const [newRoles, setNewRoles] = useState({});
|
const [newRoles, setNewRoles] = useState({});
|
||||||
const [selectedUsers, setSelectedUsers] = useState([]);
|
const [selectedUsers, setSelectedUsers] = useState([]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const currentRole = localStorage.getItem("role");
|
const storedRole = localStorage.getItem("role");
|
||||||
setRole(currentRole);
|
const storedUsername = localStorage.getItem("username");
|
||||||
|
setRole(storedRole);
|
||||||
|
setCurrentUser(storedUsername);
|
||||||
|
|
||||||
if (currentRole === "SUPER") {
|
if (storedRole === "SUPER") {
|
||||||
fetchUsers();
|
fetchUsers();
|
||||||
}
|
}
|
||||||
}, []);
|
}, []);
|
||||||
@@ -79,6 +82,27 @@ const Dashboard = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const deleteUser = async (username) => {
|
||||||
|
if (!window.confirm(`Are you sure you want to delete ${username}?`)) return;
|
||||||
|
|
||||||
|
const token = localStorage.getItem("token");
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch(`${config.apiBaseUrl}/api/User?username=${encodeURIComponent(username)}`, {
|
||||||
|
method: "DELETE",
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${token}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!res.ok) throw new Error("Failed to delete user");
|
||||||
|
|
||||||
|
fetchUsers();
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Error deleting user:", err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const toggleUserSelection = (username) => {
|
const toggleUserSelection = (username) => {
|
||||||
setSelectedUsers((prev) =>
|
setSelectedUsers((prev) =>
|
||||||
prev.includes(username)
|
prev.includes(username)
|
||||||
@@ -112,16 +136,15 @@ const Dashboard = () => {
|
|||||||
<th style={thStyle}></th>
|
<th style={thStyle}></th>
|
||||||
<th style={thStyle}>Username</th>
|
<th style={thStyle}>Username</th>
|
||||||
<th style={thStyle}>Role</th>
|
<th style={thStyle}>Role</th>
|
||||||
{selectedUsers.length > 0 && (
|
{selectedUsers.length > 0 && <th style={thStyle}>Action</th>}
|
||||||
<th style={thStyle}>Action</th>
|
|
||||||
)}
|
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{users.map((user) => {
|
{users
|
||||||
|
.filter((user) => user.username !== currentUser)
|
||||||
|
.map((user) => {
|
||||||
const isSelected = selectedUsers.includes(user.username);
|
const isSelected = selectedUsers.includes(user.username);
|
||||||
const currentNewRole =
|
const currentNewRole = newRoles[user.username] ?? user.role;
|
||||||
newRoles[user.username] ?? user.role;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<tr key={user.username}>
|
<tr key={user.username}>
|
||||||
@@ -138,7 +161,10 @@ const Dashboard = () => {
|
|||||||
<select
|
<select
|
||||||
value={currentNewRole}
|
value={currentNewRole}
|
||||||
onChange={(e) =>
|
onChange={(e) =>
|
||||||
handleRoleChange(user.username, e.target.value)
|
handleRoleChange(
|
||||||
|
user.username,
|
||||||
|
e.target.value
|
||||||
|
)
|
||||||
}
|
}
|
||||||
style={{
|
style={{
|
||||||
padding: "0.3rem",
|
padding: "0.3rem",
|
||||||
@@ -157,8 +183,17 @@ const Dashboard = () => {
|
|||||||
{selectedUsers.length > 0 && (
|
{selectedUsers.length > 0 && (
|
||||||
<td style={tdStyle}>
|
<td style={tdStyle}>
|
||||||
{isSelected && (
|
{isSelected && (
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: "flex",
|
||||||
|
gap: "0.5rem",
|
||||||
|
justifyContent: "center",
|
||||||
|
}}
|
||||||
|
>
|
||||||
<button
|
<button
|
||||||
onClick={() => updateUserRole(user.username)}
|
onClick={() =>
|
||||||
|
updateUserRole(user.username)
|
||||||
|
}
|
||||||
style={{
|
style={{
|
||||||
padding: "0.4rem 0.8rem",
|
padding: "0.4rem 0.8rem",
|
||||||
backgroundColor: "#444",
|
backgroundColor: "#444",
|
||||||
@@ -170,6 +205,20 @@ const Dashboard = () => {
|
|||||||
>
|
>
|
||||||
Update
|
Update
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
onClick={() => deleteUser(user.username)}
|
||||||
|
style={{
|
||||||
|
padding: "0.4rem 0.8rem",
|
||||||
|
backgroundColor: "#aa3333",
|
||||||
|
color: "#fff",
|
||||||
|
border: "none",
|
||||||
|
borderRadius: "4px",
|
||||||
|
cursor: "pointer",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Delete
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
)}
|
)}
|
||||||
</td>
|
</td>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ const Login = () => {
|
|||||||
|
|
||||||
localStorage.setItem("token", data.accessToken);
|
localStorage.setItem("token", data.accessToken);
|
||||||
localStorage.setItem("role", data.role);
|
localStorage.setItem("role", data.role);
|
||||||
|
localStorage.setItem("username", data.username);
|
||||||
|
|
||||||
navigate("/dashboard");
|
navigate("/dashboard");
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ const Register = () => {
|
|||||||
|
|
||||||
localStorage.setItem("token", loginData.accessToken);
|
localStorage.setItem("token", loginData.accessToken);
|
||||||
localStorage.setItem("role", loginData.role);
|
localStorage.setItem("role", loginData.role);
|
||||||
|
localStorage.setItem("username", data.username);
|
||||||
|
|
||||||
navigate("/dashboard");
|
navigate("/dashboard");
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
Reference in New Issue
Block a user