This commit adds a full unauthenticated PWA for in-store retail order taking: - Dedicated `/new-order` route with complete order form, customer/company picker - Public `/api/counter/*` endpoints for search, order creation, and photo uploads - Photo capture and gallery selection with 10-photo per order limit - Offline caching via dedicated service worker and app manifest - Shortcut redirect at `/counter` for quick installation - Comprehensive setup and usage documentation in `docs/counter-pwa.md` - Minor cleanup to root layout metadata and service worker registration - Small layout fix for collection pool row text truncation Orders submitted via the PWA appear immediately in the main CRM's New tab, and the app is designed for trusted office kiosk phones without requiring user login.
36 lines
2.1 KiB
TypeScript
36 lines
2.1 KiB
TypeScript
import type { NextConfig } from "next";
|
|
|
|
const nextConfig: NextConfig = {
|
|
output: "standalone",
|
|
// Server-only deps we don't want webpack to touch. Both pdf-parse and
|
|
// its transitive pdfjs-dist use ES2022 features + top-level `__esModule`
|
|
// marker that webpack's RSC runtime chokes on
|
|
// ("Object.defineProperty called on non-object"). Marking them external
|
|
// means Node resolves them at runtime from node_modules instead of going
|
|
// through webpack's loader — so pdfjs-dist's init runs in a clean CJS
|
|
// context, the way its author expects.
|
|
serverExternalPackages: ["pdf-parse", "pdfjs-dist", "@napi-rs/canvas"],
|
|
// Dev server blocks cross-origin HMR requests by default in Next 16. The
|
|
// app is normally loaded on `localhost`, but we also load it on
|
|
// `127.0.0.1` (and on the LAN IP for phone testing). Listing both keeps
|
|
// the HMR client from hanging on the first load.
|
|
allowedDevOrigins: ["127.0.0.1", "localhost", "192.168.1.42", "192.168.1.122", "192.168.1.128", "coolify.mywire.org", "*"],
|
|
// The agent (and any external tools) sometimes reach for the PocketBase
|
|
// collection name verbatim — `order_items`, `stock_items`, `quote_items`
|
|
// — and get a 404 because the route folders use hyphens (`order-items`).
|
|
// Redirect the underscore variants to the hyphenated route so the agent
|
|
// stops confusing the PB collection name with the URL path.
|
|
async redirects() {
|
|
return [
|
|
{ source: "/api/v1/order_items", destination: "/api/v1/order-items", permanent: true },
|
|
{ source: "/api/v1/stock_items", destination: "/api/v1/stock-items", permanent: true },
|
|
{ source: "/api/v1/quote_items", destination: "/api/v1/quote-items", permanent: true },
|
|
{ source: "/api/v1/stock_purchases", destination: "/api/v1/stock-purchases", permanent: true },
|
|
{ source: "/api/v1/stock_quick_draft", destination: "/api/v1/stock-quick-draft", permanent: true },
|
|
// Counter PWA shortcut — keeps the install URL short.
|
|
{ source: "/counter", destination: "/new-order", permanent: true },
|
|
];
|
|
},
|
|
};
|
|
|
|
export default nextConfig;
|