feat(platform): add audit logs and activity feed

This commit is contained in:
Schubert Ferenc 2026-07-03 00:04:44 +02:00
parent 92cb8d1286
commit c816e9869d
34 changed files with 1592 additions and 43 deletions

View file

@ -5,6 +5,7 @@ import { Plus } from "lucide-react";
import ConfirmDialog from "@/components/common/ConfirmDialog";
import SearchInput from "@/components/common/SearchInput";
import { useToast } from "@/components/common/ToastProvider";
import { Button } from "@/components/ui/button";
import UserFormDialog from "@/components/users/UserFormDialog";
import UserTable from "@/components/users/UserTable";
@ -32,6 +33,7 @@ function getSortableValue(user: User, key: string) {
}
export default function UsersPage() {
const { showToast } = useToast();
const [users, setUsers] = useState<User[]>([]);
const [roles, setRoles] = useState<Role[]>([]);
const [currentUser, setCurrentUser] = useState<CurrentUser | null>(null);
@ -159,14 +161,18 @@ export default function UsersPage() {
setUsers((current) => current.map((user) => (
user.id === selectedUser.id ? response.data : user
)));
showToast({ type: "success", title: "Benutzer aktualisiert", description: response.data.username });
} else {
const response = await api.post<User>("/users", payload);
setUsers((current) => [response.data, ...current]);
showToast({ type: "success", title: "Benutzer erstellt", description: response.data.username });
}
setFormOpen(false);
} catch (err) {
setFormError(getErrorMessage(err));
const message = getErrorMessage(err);
setFormError(message);
showToast({ type: "error", title: "Benutzer konnte nicht gespeichert werden", description: message });
} finally {
setPending(false);
}
@ -183,9 +189,12 @@ export default function UsersPage() {
try {
await api.delete(`/users/${deleteUser.id}`);
setUsers((current) => current.filter((user) => user.id !== deleteUser.id));
showToast({ type: "success", title: "Benutzer gelöscht", description: deleteUser.username });
setDeleteUser(null);
} catch (err) {
setDeleteError(getErrorMessage(err));
const message = getErrorMessage(err);
setDeleteError(message);
showToast({ type: "error", title: "Benutzer konnte nicht gelöscht werden", description: message });
} finally {
setPending(false);
}