diff --git a/Dockerfile b/Dockerfile
index 8f5a2e5..aeeba2f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -14,7 +14,9 @@ RUN npx prisma generate
COPY . .
RUN npm run build
# Compile recovery scripts to plain JS for use inside the container
-RUN npx tsc --module commonjs --target es2020 --moduleResolution node --esModuleInterop true --outDir scripts-dist scripts/setup-admin.ts scripts/reset-password.ts
+RUN npx tsc --module commonjs --target es2020 --moduleResolution node --esModuleInterop true --outDir scripts-dist scripts/setup-admin.ts scripts/reset-password.ts && \
+ mv scripts-dist/setup-admin.js scripts-dist/setup-admin.cjs && \
+ mv scripts-dist/reset-password.js scripts-dist/reset-password.cjs
# ---- Production Stage ----
FROM node:alpine AS runner
diff --git a/app/root.tsx b/app/root.tsx
index 44c7222..3b626e4 100644
--- a/app/root.tsx
+++ b/app/root.tsx
@@ -1,6 +1,27 @@
-import { Links, Meta, Outlet, Scripts, ScrollRestoration } from "react-router";
+import { Links, Meta, Outlet, Scripts, ScrollRestoration, isRouteErrorResponse, useRouteError } from "react-router";
import "./app.css";
+export function ErrorBoundary() {
+ const error = useRouteError();
+ const message = isRouteErrorResponse(error)
+ ? `${error.status} ${error.statusText}`
+ : error instanceof Error
+ ? error.message
+ : String(error);
+ const stack = error instanceof Error ? error.stack : undefined;
+ return (
+
+
+
+ Fehler
+ {message}
+ {stack && {stack}}
+
+
+
+ );
+}
+
export function Layout({ children }: { children: React.ReactNode }) {
return (
diff --git a/app/routes/companies.$id.invoices.$invoiceId.tsx b/app/routes/companies.$id.invoices.$invoiceId.tsx
index 797772c..c058660 100644
--- a/app/routes/companies.$id.invoices.$invoiceId.tsx
+++ b/app/routes/companies.$id.invoices.$invoiceId.tsx
@@ -16,7 +16,7 @@ import { Button } from "@/components/ui/button";
import { InvoiceStatusBadge } from "@/components/invoice/invoice-status-badge";
import { formatCurrency, formatDate } from "@/lib/tax";
import { ChevronLeft, Download, CheckCircle, Send, Trash2, RotateCcw } from "lucide-react";
-import { InvoiceStatus } from "@prisma/client";
+import type { InvoiceStatus } from "@prisma/client";
export async function loader({
request,
@@ -161,7 +161,7 @@ export default function InvoiceDetailPage() {
)}
{invoice.status === "DRAFT" && (
-