feat(platform): add audit logs and activity feed
This commit is contained in:
parent
92cb8d1286
commit
c816e9869d
34 changed files with 1592 additions and 43 deletions
|
|
@ -7,6 +7,7 @@ import { ArrowLeft, Edit, Plus, Trash2 } from "lucide-react";
|
|||
|
||||
import ConfirmDialog from "@/components/common/ConfirmDialog";
|
||||
import DetailSection from "@/components/common/DetailSection";
|
||||
import { useToast } from "@/components/common/ToastProvider";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import CustomerContactFormDialog from "@/components/customers/CustomerContactFormDialog";
|
||||
import CustomerFormDialog from "@/components/customers/CustomerFormDialog";
|
||||
|
|
@ -32,6 +33,7 @@ function formatDateTime(value: string) {
|
|||
}
|
||||
|
||||
export default function CustomerDetailPage() {
|
||||
const { showToast } = useToast();
|
||||
const params = useParams<{ id: string }>();
|
||||
const router = useRouter();
|
||||
const [customer, setCustomer] = useState<Customer | null>(null);
|
||||
|
|
@ -79,8 +81,11 @@ export default function CustomerDetailPage() {
|
|||
const response = await api.put<Customer>(`/customers/${customer.id}`, payload);
|
||||
setCustomer(response.data);
|
||||
setFormOpen(false);
|
||||
showToast({ type: "success", title: "Kunde aktualisiert", description: response.data.company_name });
|
||||
} 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);
|
||||
}
|
||||
|
|
@ -101,14 +106,18 @@ export default function CustomerDetailPage() {
|
|||
try {
|
||||
if (selectedContact) {
|
||||
await api.put<CustomerContact>(`/customers/${customer.id}/contacts/${selectedContact.id}`, payload);
|
||||
showToast({ type: "success", title: "Ansprechpartner aktualisiert" });
|
||||
} else {
|
||||
await api.post<CustomerContact>(`/customers/${customer.id}/contacts`, payload);
|
||||
showToast({ type: "success", title: "Ansprechpartner erstellt" });
|
||||
}
|
||||
const response = await api.get<Customer>(`/customers/${customer.id}`);
|
||||
setCustomer(response.data);
|
||||
setContactOpen(false);
|
||||
} catch (err) {
|
||||
setContactError(getErrorMessage(err));
|
||||
const message = getErrorMessage(err);
|
||||
setContactError(message);
|
||||
showToast({ type: "error", title: "Ansprechpartner konnte nicht gespeichert werden", description: message });
|
||||
} finally {
|
||||
setPending(false);
|
||||
}
|
||||
|
|
@ -124,9 +133,12 @@ export default function CustomerDetailPage() {
|
|||
await api.delete(`/customers/${customer.id}/contacts/${deleteContact.id}`);
|
||||
const response = await api.get<Customer>(`/customers/${customer.id}`);
|
||||
setCustomer(response.data);
|
||||
showToast({ type: "success", title: "Ansprechpartner gelöscht", description: `${deleteContact.first_name} ${deleteContact.last_name}` });
|
||||
setDeleteContact(null);
|
||||
} catch (err) {
|
||||
setDeleteError(getErrorMessage(err));
|
||||
const message = getErrorMessage(err);
|
||||
setDeleteError(message);
|
||||
showToast({ type: "error", title: "Ansprechpartner konnte nicht gelöscht werden", description: message });
|
||||
} finally {
|
||||
setPending(false);
|
||||
}
|
||||
|
|
@ -139,10 +151,14 @@ export default function CustomerDetailPage() {
|
|||
setPending(true);
|
||||
setDeleteError("");
|
||||
try {
|
||||
const deletedCustomerName = customer.company_name;
|
||||
await api.delete(`/customers/${customer.id}`);
|
||||
showToast({ type: "success", title: "Kunde gelöscht", description: deletedCustomerName });
|
||||
router.push("/customers");
|
||||
} 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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue