XLSX (ExcelJS replaces bare SheetJS): - Full cell-level styling: bold fonts, gray fills, thin/medium borders, cell alignment, wrap-text — all matching the sample PO layout - Correct merge map across all sections: header block (A1:I4), PO meta row (A5:B5, C5:G5), PI/Quotation row (A6:B6, C6:F6, G6:H6), Vessel/Budget/Requested row (A7:B7, D7:E7, H7:I7), Requisition row (A8:B8, D8:E8, H8:I8), Place of Delivery spanning 2 rows (A9:B10, C9:I10), Invoice Details spanning 2 rows (A11:B12, C11:I11, C12:I12), Vendor block (A13:B13, D13:I13, A14:B14, C14:I14), line item Description column (B:C per row), totals labels and values (F:G and H:I), instructions header (A:I), T&C text (B:I per row), dual signature blocks - Description column spans B:C in header and every item row - Minimum 7 body rows reserved; alternating row fills - Totals section: gray fill, right-aligned, grand total darker gray - Instructions header with distinct fill; numbered T&C with B:I merge - Paired signature blocks (submitter left, vendor right) with borders - Column widths and row heights tuned to the sample dimensions - Page setup: A4 portrait, fit-to-width PDF (HTML print page): - Typography matches sample: Arial 8.5pt body, 13pt bold company name, 11pt underlined PURCHASE ORDER heading - All meta tables use gray (f2f2f2) label cells with borders - Place of Delivery and Invoice Details use rowspan for correct layout - Line items table: dark gray (d8d8d8) header, 1px borders, alternating row fills, minimum 7 blank rows reserved - Totals table (55% width, right-aligned) with gray rows and darker grand total - Instructions: distinct header fill, clean numbered layout - Signature blocks: flex-spaced bordered boxes with submitter/vendor - Print CSS: A4 page size, no-print class for the print button Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
80 lines
2.5 KiB
JSON
80 lines
2.5 KiB
JSON
{
|
|
"name": "pelagia-portal",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"scripts": {
|
|
"dev": "next dev --turbopack",
|
|
"build": "next build",
|
|
"start": "next start",
|
|
"lint": "next lint",
|
|
"type-check": "tsc --noEmit",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
"test:integration:watch": "vitest --config vitest.integration.config.ts",
|
|
"test:all": "vitest run && vitest run --config vitest.integration.config.ts",
|
|
"test:e2e": "playwright test",
|
|
"test:e2e:ui": "playwright test --ui",
|
|
"db:generate": "prisma generate",
|
|
"db:push": "prisma db push",
|
|
"db:migrate": "prisma migrate dev",
|
|
"db:migrate:deploy": "prisma migrate deploy",
|
|
"db:seed": "tsx prisma/seed.ts",
|
|
"db:studio": "prisma studio",
|
|
"db:reset": "prisma migrate reset",
|
|
"email:preview": "email dev --dir emails --port 3001"
|
|
},
|
|
"dependencies": {
|
|
"@auth/prisma-adapter": "^2.7.0",
|
|
"@aws-sdk/client-s3": "^3.705.0",
|
|
"@aws-sdk/s3-request-presigner": "^3.705.0",
|
|
"@prisma/client": "^5.22.0",
|
|
"@radix-ui/react-avatar": "^1.1.2",
|
|
"@radix-ui/react-dialog": "^1.1.4",
|
|
"@radix-ui/react-dropdown-menu": "^2.1.4",
|
|
"@radix-ui/react-label": "^2.1.1",
|
|
"@radix-ui/react-select": "^2.1.4",
|
|
"@radix-ui/react-separator": "^1.1.1",
|
|
"@radix-ui/react-slot": "^1.1.1",
|
|
"@radix-ui/react-toast": "^1.2.4",
|
|
"@react-email/components": "^0.0.27",
|
|
"@react-email/render": "^1.0.1",
|
|
"bcryptjs": "^2.4.3",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"date-fns": "^4.1.0",
|
|
"exceljs": "^4.4.0",
|
|
"lucide-react": "^0.468.0",
|
|
"next": "^15.1.0",
|
|
"next-auth": "^5.0.0-beta.25",
|
|
"react": "^19.0.0",
|
|
"react-dom": "^19.0.0",
|
|
"recharts": "^2.13.3",
|
|
"resend": "^4.0.0",
|
|
"tailwind-merge": "^2.5.4",
|
|
"xlsx": "^0.18.5",
|
|
"zod": "^3.23.8"
|
|
},
|
|
"devDependencies": {
|
|
"@playwright/test": "^1.49.0",
|
|
"@tailwindcss/postcss": "^4.0.0",
|
|
"@testing-library/jest-dom": "^6.6.3",
|
|
"@testing-library/react": "^16.1.0",
|
|
"@testing-library/user-event": "^14.5.2",
|
|
"@types/bcryptjs": "^2.4.6",
|
|
"@types/jsdom": "^28.0.1",
|
|
"@types/node": "^22.10.1",
|
|
"@types/react": "^19.0.1",
|
|
"@types/react-dom": "^19.0.1",
|
|
"@vitejs/plugin-react": "^4.3.4",
|
|
"eslint": "^9.16.0",
|
|
"eslint-config-next": "^15.1.0",
|
|
"jsdom": "^29.1.1",
|
|
"prisma": "^5.22.0",
|
|
"react-email": "^3.0.2",
|
|
"tailwindcss": "^4.0.0",
|
|
"tsx": "^4.19.2",
|
|
"typescript": "^5.7.2",
|
|
"vitest": "^2.1.8"
|
|
}
|
|
}
|