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

@ -7,6 +7,7 @@ import { Edit, Eye, Plus, Trash2 } from "lucide-react";
import ConfirmDialog from "@/components/common/ConfirmDialog";
import DataTable, { type DataTableColumn } from "@/components/common/DataTable";
import SearchInput from "@/components/common/SearchInput";
import { useToast } from "@/components/common/ToastProvider";
import { Button, buttonVariants } from "@/components/ui/button";
import CustomerFormDialog from "@/components/customers/CustomerFormDialog";
import CustomerStatusBadge from "@/components/customers/CustomerStatusBadge";
@ -48,6 +49,7 @@ function getSortableValue(customer: Customer, key: string) {
}
export default function CustomersPage() {
const { showToast } = useToast();
const [customers, setCustomers] = useState<Customer[]>([]);
const [currentUser, setCurrentUser] = useState<CurrentUser | null>(null);
const [loading, setLoading] = useState(true);
@ -183,13 +185,17 @@ export default function CustomersPage() {
if (selectedCustomer) {
const response = await api.put<Customer>(`/customers/${selectedCustomer.id}`, payload);
setCustomers((current) => current.map((customer) => customer.id === selectedCustomer.id ? response.data : customer));
showToast({ type: "success", title: "Kunde aktualisiert", description: response.data.company_name });
} else {
const response = await api.post<Customer>("/customers", payload);
setCustomers((current) => [response.data, ...current]);
showToast({ type: "success", title: "Kunde erstellt", description: response.data.company_name });
}
setFormOpen(false);
} catch (err) {
setFormError(getErrorMessage(err));
const message = getErrorMessage(err);
setFormError(message);
showToast({ type: "error", title: "Kunde konnte nicht gespeichert werden", description: message });
} finally {
setPending(false);
}
@ -204,9 +210,12 @@ export default function CustomersPage() {
try {
await api.delete(`/customers/${deleteCustomer.id}`);
setCustomers((current) => current.filter((customer) => customer.id !== deleteCustomer.id));
showToast({ type: "success", title: "Kunde gelöscht", description: deleteCustomer.company_name });
setDeleteCustomer(null);
} catch (err) {
setDeleteError(getErrorMessage(err));
const message = getErrorMessage(err);
setDeleteError(message);
showToast({ type: "error", title: "Kunde konnte nicht gelöscht werden", description: message });
} finally {
setPending(false);
}