MEGAINFRA-WEBAPP/package.json

87 lines
2.6 KiB
JSON
Raw Permalink Normal View History

{
"name": "mega-infrastructure-dashboard",
"version": "1.0.0",
"private": true,
"scripts": {
"dev": "next dev -H 0.0.0.0 -p 6004 --webpack",
"build": "npm run icons && npm run og-image && next build --webpack",
"icons": "node scripts/build-icons.mjs",
"og-image": "node scripts/build-og-image.mjs",
"start": "next start -H 0.0.0.0 -p 3000",
"lint": "eslint .",
"typecheck": "tsc --noEmit",
2026-08-19 00:21:36 +00:00
"test": "vitest",
"test:run": "vitest run",
"mcp": "tsx --env-file=.env.local src/mcp/server.ts",
"postinstall": "node scripts/patch-next-dev-blocker.cjs"
},
"dependencies": {
"@anthropic-ai/sdk": "^0.122.0",
"@ducanh2912/next-pwa": "^10.2.9",
"@modelcontextprotocol/sdk": "^1.30.0",
"@n8n/workflow-sdk": "^0.29.3",
"@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-slot": "^1.1.1",
"@radix-ui/react-tabs": "^1.1.2",
"@radix-ui/react-tooltip": "^1.1.6",
"@tanstack/react-table": "^8.20.6",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"date-fns": "^4.1.0",
"exceljs": "^4.4.0",
"jsqr": "^1.4.0",
feat(plant): fleet map page with GPS-denormalised vehicles, clustering, and tile switcher Adds /dashboard/plant/map: a Leaflet view of every vehicle scanned from the MEGA Clock kiosk, plotted at its last known position. Schema - vehicles.last_latitude / last_longitude / last_scanned_at / last_location_accuracy_m denormalised off fuel_logs so the map page renders every vehicle in a single query. Same best-effort pattern as attention_dismissed_at; updated by /api/clock/vehicle-scan after every successful scan. PB init defaults new number cols to 0 (not null) — filter uses 'last_latitude > 0 || last_latitude < 0' to mean 'real fix'. - Indexed via idx_vehicles_last_scanned. Map UI - Custom SVG markers per unit_type: car silhouette for fuel, tractor silhouette for plant, 24x24, drop-shadowed. - Clustering via react-leaflet-cluster over Leaflet.markercluster. Cluster icons colour-ramp with size (green->sky->amber->rose) and scale 32->54px. - Three-button base-layer switcher: Street (OSM), Dark (ESRI Dark Gray Canvas — CartoDB watermarks tiles without a key), Satellite (ESRI World Imagery). Last choice persists in localStorage. - Site pins: small purple map-marker divIcon, click flies the map to zoom level 15. - Empty-state is a floating chip on the map rather than a full-page card so the map is always visible. APIs - /api/clock/vehicle-scan: stores the GPS fix on the fuel_logs row AND denormalises onto the vehicle when present; missing-coord scan leaves last_* untouched. Sidebar: new Map entry under Plant group.
2026-09-22 19:39:25 +00:00
"leaflet": "^1.9.4",
"leaflet.markercluster": "^1.5.3",
"lucide-react": "^0.469.0",
"next": "^16",
"openai": "^7.8.0",
"papaparse": "^5.4.1",
"pdf-lib": "^1.17.1",
"pdfmake": "^0.2.23",
"pocketbase": "^0.27.3",
"qrcode": "^1.5.4",
"react": "^19.0.0",
"react-dom": "^19.0.0",
feat(plant): fleet map page with GPS-denormalised vehicles, clustering, and tile switcher Adds /dashboard/plant/map: a Leaflet view of every vehicle scanned from the MEGA Clock kiosk, plotted at its last known position. Schema - vehicles.last_latitude / last_longitude / last_scanned_at / last_location_accuracy_m denormalised off fuel_logs so the map page renders every vehicle in a single query. Same best-effort pattern as attention_dismissed_at; updated by /api/clock/vehicle-scan after every successful scan. PB init defaults new number cols to 0 (not null) — filter uses 'last_latitude > 0 || last_latitude < 0' to mean 'real fix'. - Indexed via idx_vehicles_last_scanned. Map UI - Custom SVG markers per unit_type: car silhouette for fuel, tractor silhouette for plant, 24x24, drop-shadowed. - Clustering via react-leaflet-cluster over Leaflet.markercluster. Cluster icons colour-ramp with size (green->sky->amber->rose) and scale 32->54px. - Three-button base-layer switcher: Street (OSM), Dark (ESRI Dark Gray Canvas — CartoDB watermarks tiles without a key), Satellite (ESRI World Imagery). Last choice persists in localStorage. - Site pins: small purple map-marker divIcon, click flies the map to zoom level 15. - Empty-state is a floating chip on the map rather than a full-page card so the map is always visible. APIs - /api/clock/vehicle-scan: stores the GPS fix on the fuel_logs row AND denormalises onto the vehicle when present; missing-coord scan leaves last_* untouched. Sidebar: new Map entry under Plant group.
2026-09-22 19:39:25 +00:00
"react-leaflet": "^5.0.0",
"react-leaflet-cluster": "^4.1.3",
"react-markdown": "^10.1.0",
"recharts": "^2.15.0",
"remark-gfm": "^4.0.1",
"remark-parse": "^11.0.0",
"sharp": "^0.35.4",
feat(fuel): drop-in xlsx/csv import for pump sheets The Aug 2026 pump sheet from The Hills (and any future sheet from the same source) uses different column names and a different date format than the legacy CSV the import route was built for. Adapts the route so the same endpoint accepts either Excel (.xlsx) or CSV, maps the new column names onto the existing FUEL_LOGS schema, and persists their 'Latest Consumption' column verbatim. What's new • SheetJS (xlsx) replaces PapaParse for parsing. Single code path handles both .xlsx and .csv uploads. • Resolves columns case-insensitively against an alias table so legacy CSVs (vehicle_description, odo_reading) still work alongside the new shape (Date Logged, Vehicle QR, Km's/ Hours, Litres Pumped, Current Site, Latest Consumption). • Date parser: DD/MM/YYYY first (with leading-space tolerance), falls back to YYYY-MM-DD, then to Excel serial numbers. • Vehicle match: QR code first (clean identifier in the source data), falls back to description text for legacy CSV. • Site match: by sites.name (one round-trip, cached for the import). project_code is derived from the resolved site; falls back to the vehicle's project_code. • Latest Consumption persisted as a new FUEL_LOGS field (latest_consumption, number, optional). Empty source cells stay empty rather than getting coerced to 0. PocketBase change • scripts/migrations/2026-08-24-fuel-logs-latest-consumption.py adds the new field. Idempotent; follows the pattern of the 2026-08-19 migration. Run it with PB_ADMIN_EMAIL + PB_ADMIN_PASSWORD before importing the new sheets, or the import will fail with 'latest_consumption is not a field'. UI • Import button now accepts .xlsx and CSV; SAMPLE_HEADERS + SAMPLE_OPTIONAL show the new column expectations and the DD/MM/YYYY date format hint. • fuel-view.tsx shows a 'Consumption (src)' column on the row table so operators can eyeball what their fuel team sent against the app's recomputed variance. Out of scope (intentionally untouched) • vehicles, sites, data_import_batches and every other collection — no schema changes there. • PO / timesheets / delivery-notes imports. • fuel/page.tsx business logic (variance calc, vehicle summaries). Verified • Dry-run against 'The Hills Diesel 1-24 August.xlsx': 134/134 rows parse cleanly, 0 errors. 12/134 rows correctly carry an empty Latest Consumption (matches the source). • vitest: 20/20 fuel-import-parse + 35/35 PO-schema tests pass. • tsc --noEmit clean. • One pre-existing failure in src/app/api/purchase-orders/process-batch/route.test.ts unrelated to fuel; confirmed failing on main before this change.
2026-08-24 20:03:08 +00:00
"tailwind-merge": "^2.6.0",
"three": "0.160.0",
"unified": "^11.0.5",
"unpdf": "1.8.1",
"xlsx": "^0.18.5",
"zod": "^3.25.76",
"zod-to-json-schema": "^3.25.2"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.0.0",
"@testing-library/jest-dom": "^7.0.1",
"@testing-library/react": "^16.3.3",
"@testing-library/user-event": "^14.6.8",
feat(plant): fleet map page with GPS-denormalised vehicles, clustering, and tile switcher Adds /dashboard/plant/map: a Leaflet view of every vehicle scanned from the MEGA Clock kiosk, plotted at its last known position. Schema - vehicles.last_latitude / last_longitude / last_scanned_at / last_location_accuracy_m denormalised off fuel_logs so the map page renders every vehicle in a single query. Same best-effort pattern as attention_dismissed_at; updated by /api/clock/vehicle-scan after every successful scan. PB init defaults new number cols to 0 (not null) — filter uses 'last_latitude > 0 || last_latitude < 0' to mean 'real fix'. - Indexed via idx_vehicles_last_scanned. Map UI - Custom SVG markers per unit_type: car silhouette for fuel, tractor silhouette for plant, 24x24, drop-shadowed. - Clustering via react-leaflet-cluster over Leaflet.markercluster. Cluster icons colour-ramp with size (green->sky->amber->rose) and scale 32->54px. - Three-button base-layer switcher: Street (OSM), Dark (ESRI Dark Gray Canvas — CartoDB watermarks tiles without a key), Satellite (ESRI World Imagery). Last choice persists in localStorage. - Site pins: small purple map-marker divIcon, click flies the map to zoom level 15. - Empty-state is a floating chip on the map rather than a full-page card so the map is always visible. APIs - /api/clock/vehicle-scan: stores the GPS fix on the fuel_logs row AND denormalises onto the vehicle when present; missing-coord scan leaves last_* untouched. Sidebar: new Map entry under Plant group.
2026-09-22 19:39:25 +00:00
"@types/leaflet": "^1.9.22",
"@types/node": "^22.10.5",
"@types/papaparse": "^5.3.15",
"@types/pdfkit": "^0.17.6",
"@types/pdfmake": "^0.3.3",
"@types/qrcode": "^1.5.6",
"@types/react": "^19.0.2",
"@types/react-dom": "^19.0.2",
"@types/three": "0.160.0",
"eslint": "^9.17.0",
"eslint-config-next": "^16",
"jsdom": "^30.1.3",
"postcss": "^8.4.49",
"tailwindcss": "^4.0.0",
"tsx": "^4.23.12",
2026-08-19 00:21:36 +00:00
"typescript": "^5.7.2",
"vitest": "^2.1.9"
}
}