b22e5baa5c
Build and Push Docker Image / build (push) Successful in 1m23s
- Implemented client-side validation functions for tax ID, VAT ID, IBAN, BIC, and website URL. - Added debug logging functionality to assist in development. - Created a comprehensive validation function for company form data. feat: initialize database with Prisma migrations - Added a server-side script to run Prisma migrations and check database health. - Ensured safe initialization of the database to prevent concurrent migrations. feat: comprehensive server-side error logging - Developed an error logging system that captures detailed error context, including request details and stack traces. - Implemented logging functions for different error types (route, action, database, API, startup). fix: validate user ID existence in audit logs - Updated the logging function to validate that the user ID exists in the database before logging actions. fix: update schemas for optional fields and validation - Modified schemas to allow for nullable fields and refined validation logic for tax ID, VAT ID, IBAN, and BIC. feat: enhance error boundary for better debugging - Improved error boundary to log detailed error information in development mode. - Added a debug panel to the main application layout for real-time error tracking. feat: implement company deletion functionality in admin routes - Added a new API route for deleting companies with appropriate logging. - Integrated delete confirmation in the admin interface for better user experience. fix: handle API errors gracefully - Wrapped API actions in try-catch blocks to log errors and return appropriate responses. feat: generate and save invoice PDFs - Implemented functionality to generate and save invoice PDFs upon status updates. - Added a new column in the database for storing the URL of the generated PDF. chore: update Docker image reference - Changed the Docker image reference to point to the new Git repository. chore: update package dependencies - Added @radix-ui/react-tooltip for enhanced UI components. - Updated package-lock.json to reflect new dependencies.
95 lines
3.1 KiB
TypeScript
95 lines
3.1 KiB
TypeScript
import { Links, Meta, Outlet, Scripts, ScrollRestoration, isRouteErrorResponse, useRouteError } from "react-router";
|
|
import "./app.css";
|
|
import { DebugPanel } from "./components/debug-panel";
|
|
|
|
export function ErrorBoundary() {
|
|
const error = useRouteError();
|
|
|
|
// Get error details
|
|
const isResponse = isRouteErrorResponse(error);
|
|
const status = isResponse ? error.status : 500;
|
|
const statusText = isResponse ? error.statusText : "Internal Server Error";
|
|
const message = isResponse
|
|
? `${error.status} ${error.statusText}`
|
|
: error instanceof Error
|
|
? error.message
|
|
: String(error);
|
|
const stack = error instanceof Error ? error.stack : undefined;
|
|
|
|
// Log error details for debugging
|
|
if (typeof console !== "undefined") {
|
|
console.error("\n" + "=".repeat(80));
|
|
console.error("[ERROR_BOUNDARY]", new Date().toISOString());
|
|
console.error(`Status: ${status} ${statusText}`);
|
|
console.error(`Message: ${message}`);
|
|
if (stack) console.error("Stack:\n" + stack);
|
|
if (error && typeof error === "object") {
|
|
console.error("Full Error Object:", error);
|
|
}
|
|
console.error("=".repeat(80) + "\n");
|
|
}
|
|
|
|
return (
|
|
<html lang="de">
|
|
<head>
|
|
<meta charSet="utf-8" />
|
|
<Meta />
|
|
<Links />
|
|
</head>
|
|
<body style={{ fontFamily: "monospace", padding: "2rem", background: "#fff1f2", color: "#9f1239" }}>
|
|
<h1 style={{ fontSize: "1.5rem", fontWeight: 700, marginBottom: "1rem" }}>
|
|
{status} Fehler
|
|
</h1>
|
|
<p style={{ marginBottom: "1rem", fontSize: "0.9rem" }}>
|
|
{statusText}
|
|
</p>
|
|
<pre style={{ whiteSpace: "pre-wrap", wordBreak: "break-word", background: "#ffe4e6", padding: "1rem", borderRadius: "0.5rem" }}>
|
|
{message}
|
|
</pre>
|
|
{import.meta.env.DEV && stack && (
|
|
<details style={{ marginTop: "1rem" }}>
|
|
<summary style={{ cursor: "pointer", fontWeight: 600, color: "#64748b" }}>
|
|
Stack Trace (Dev Only)
|
|
</summary>
|
|
<pre style={{ marginTop: "0.5rem", fontSize: "0.75rem", color: "#64748b", whiteSpace: "pre-wrap", background: "#f1f5f9", padding: "1rem", borderRadius: "0.5rem" }}>
|
|
{stack}
|
|
</pre>
|
|
</details>
|
|
)}
|
|
<Scripts />
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|
|
|
|
export function Layout({ children }: { children: React.ReactNode }) {
|
|
return (
|
|
<html lang="de">
|
|
<head>
|
|
<meta charSet="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>Annas Rechnungsmanager</title>
|
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
|
|
<link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap" rel="stylesheet" />
|
|
<Meta />
|
|
<Links />
|
|
</head>
|
|
<body>
|
|
{children}
|
|
<ScrollRestoration />
|
|
<Scripts />
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|
|
|
|
export default function App() {
|
|
return (
|
|
<>
|
|
<Outlet />
|
|
<DebugPanel />
|
|
</>
|
|
);
|
|
}
|