Files
AnnasRechnungsManager/app/root.tsx
T
hwinkel b22e5baa5c
Build and Push Docker Image / build (push) Successful in 1m23s
feat: add client-side validation utilities and debugging tools
- 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.
2026-05-03 08:46:58 +02:00

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 />
</>
);
}