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" && ( - )} @@ -169,7 +169,7 @@ export default function InvoiceDetailPage() {