From c7fb0c8561ba81b6519aa81a263c6c6c7ab55a7d Mon Sep 17 00:00:00 2001 From: admtracksteel Date: Thu, 12 Mar 2026 19:36:34 +0000 Subject: [PATCH] Upload source code --- index.html | 21 + package.json | 73 ++ src/client/App.css | 42 + src/client/App.tsx | 122 ++ src/client/assets/grade.jpg | Bin 0 -> 101840 bytes src/client/assets/react.svg | 1 + src/client/components/ActiveUsers.tsx | 40 + src/client/components/AdhesionGradeSelect.tsx | 197 +++ .../components/ArchivedNotificationsModal.tsx | 131 ++ src/client/components/Button.tsx | 39 + src/client/components/Card.tsx | 37 + src/client/components/ColorBubble.tsx | 36 + src/client/components/ConfirmModal.tsx | 66 + src/client/components/Input.tsx | 28 + src/client/components/Layout.tsx | 418 +++++++ src/client/components/MobileList.tsx | 117 ++ src/client/components/Modal.tsx | 30 + src/client/components/NotificationBell.tsx | 199 +++ src/client/components/PhotoUpload.tsx | 112 ++ src/client/components/ProtectedRoute.tsx | 48 + src/client/components/Select.tsx | 36 + src/client/components/SendMessageModal.tsx | 154 +++ src/client/components/TeamPresence.tsx | 210 ++++ src/client/components/TechnicalManual.tsx | 617 ++++++++++ src/client/components/Toast.tsx | 65 + src/client/components/UnreadMessagesModal.tsx | 208 ++++ src/client/components/admin/BackupRestore.tsx | 322 +++++ .../components/admin/GeometrySettings.tsx | 205 ++++ .../forms/PaintingInspectionForm.tsx | 225 ++++ .../components/forms/SurfaceTreatmentForm.tsx | 157 +++ .../components/modals/CloneSchemeModal.tsx | 93 ++ .../modals/CreateControlRecordModal.tsx | 463 +++++++ .../modals/CreateInspectionModal.tsx | 444 +++++++ .../modals/CreatePaintingSchemeModal.tsx | 374 ++++++ .../components/modals/CreatePartModal.tsx | 167 +++ .../components/modals/CreateProjectModal.tsx | 215 ++++ .../components/modals/DiluentListModal.tsx | 175 +++ .../modals/DiluentRegistrationModal.tsx | 150 +++ .../components/modals/ImportSchemeModal.tsx | 183 +++ .../components/modals/StockHistoryModal.tsx | 377 ++++++ src/client/components/modals/StockModal.tsx | 268 +++++ .../components/modals/StockOutModal.tsx | 165 +++ .../components/reports/AnalyticalReport.tsx | 186 +++ .../reports/GeneralProjectReport.tsx | 174 +++ .../reports/StockInventoryReport.tsx | 270 +++++ src/client/context/AuthContext.tsx | 151 +++ src/client/context/AuthContextType.ts | 17 + src/client/context/SystemSettingsContext.tsx | 56 + src/client/context/ToastContext.tsx | 22 + src/client/context/useAuth.ts | 10 + src/client/contexts/NotificationContext.tsx | 103 ++ .../contexts/NotificationContextState.ts | 16 + src/client/hooks/useNotifications.ts | 10 + src/client/hooks/usePresence.ts | 58 + src/client/hooks/useToast.ts | 2 + src/client/hooks/useUnreadMessages.ts | 45 + src/client/index.css | 219 ++++ src/client/main.tsx | 47 + src/client/pages/AdminDashboard.tsx | 612 ++++++++++ src/client/pages/AnalysisDashboard.tsx | 157 +++ src/client/pages/CalculatorDashboard.tsx | 496 ++++++++ src/client/pages/DataSheetLibrary.tsx | 694 +++++++++++ src/client/pages/DeveloperDashboard.tsx | 551 +++++++++ src/client/pages/GuestDashboard.tsx | 198 +++ src/client/pages/InspectionsList.tsx | 344 ++++++ src/client/pages/InstrumentList.tsx | 377 ++++++ src/client/pages/Login.tsx | 37 + src/client/pages/OrganizationSelector.tsx | 184 +++ src/client/pages/PartsList.tsx | 184 +++ src/client/pages/ProjectDetails.tsx | 896 ++++++++++++++ src/client/pages/ProjectList.tsx | 584 +++++++++ src/client/pages/SchemesList.tsx | 210 ++++ src/client/pages/StockDashboard.tsx | 442 +++++++ src/client/pages/YieldStudyDashboard.tsx | 1066 +++++++++++++++++ src/client/services/analysisService.ts | 25 + src/client/services/api.ts | 79 ++ src/client/services/dataSheetService.ts | 37 + src/client/services/geometryTypeService.ts | 22 + src/client/services/stockService.ts | 88 ++ src/client/services/systemSettingsService.ts | 75 ++ src/client/services/yieldStudyService.ts | 9 + src/client/styles/reports.css | 402 +++++++ src/client/types.ts | 226 ++++ src/client/types/Instrument.ts | 19 + src/client/utils/toastHandler.ts | 12 + src/server/app.ts | 67 ++ src/server/config/database.ts | 46 + src/server/controllers/analysisController.ts | 153 +++ .../applicationRecordController.ts | 72 ++ src/server/controllers/dataSheetController.ts | 285 +++++ .../controllers/geometryTypeController.ts | 160 +++ .../controllers/inspectionController.ts | 117 ++ .../controllers/instrumentController.ts | 106 ++ src/server/controllers/messageController.ts | 244 ++++ .../controllers/notificationController.ts | 97 ++ .../controllers/paintingSchemeController.ts | 73 ++ src/server/controllers/partController.ts | 70 ++ src/server/controllers/projectController.ts | 107 ++ src/server/controllers/stockController.ts | 502 ++++++++ .../controllers/systemSettingsController.ts | 179 +++ src/server/controllers/userController.ts | 319 +++++ .../controllers/yieldStudyController.ts | 57 + src/server/index.ts | 41 + src/server/middleware/roleMiddleware.ts | 174 +++ src/server/middleware/uploadMiddleware.ts | 34 + src/server/models/ApplicationRecord.ts | 47 + src/server/models/GeometryType.ts | 22 + src/server/models/Inspection.ts | 73 ++ src/server/models/Instrument.ts | 40 + src/server/models/Message.ts | 63 + src/server/models/Notification.ts | 32 + src/server/models/Organization.ts | 17 + src/server/models/OrganizationMember.ts | 52 + src/server/models/PaintingScheme.ts | 54 + src/server/models/Part.ts | 29 + src/server/models/Project.ts | 29 + src/server/models/StockAuditLog.ts | 31 + src/server/models/StockItem.ts | 43 + src/server/models/StockMovement.ts | 34 + src/server/models/StoredFile.ts | 19 + src/server/models/SystemSettings.ts | 19 + src/server/models/TechnicalDataSheet.ts | 59 + src/server/models/User.ts | 53 + src/server/models/YieldStudy.ts | 53 + src/server/routes/analysisRoutes.ts | 8 + src/server/routes/applicationRecordRoutes.ts | 15 + src/server/routes/backupRoutes.ts | 117 ++ src/server/routes/dataSheetRoutes.ts | 44 + src/server/routes/geometryTypeRoutes.ts | 16 + src/server/routes/inspectionRoutes.ts | 56 + src/server/routes/instrumentRoutes.ts | 12 + src/server/routes/messageRoutes.ts | 16 + src/server/routes/notificationRoutes.ts | 13 + src/server/routes/paintingSchemeRoutes.ts | 16 + src/server/routes/partRoutes.ts | 16 + src/server/routes/projectRoutes.ts | 18 + src/server/routes/stockRoutes.ts | 40 + src/server/routes/systemSettingsRoutes.ts | 30 + src/server/routes/uploadsRoutes.ts | 27 + src/server/routes/userRoutes.ts | 23 + src/server/routes/yieldStudyRoutes.ts | 15 + src/server/scripts/migrate.ts | 121 ++ src/server/scripts/setAdmin.ts | 48 + src/server/services/FileStorageService.ts | 85 ++ .../services/applicationRecordService.ts | 72 ++ src/server/services/backupService.ts | 162 +++ src/server/services/dataSheetService.ts | 174 +++ src/server/services/inspectionService.ts | 81 ++ src/server/services/notificationService.ts | 397 ++++++ src/server/services/paintingSchemeService.ts | 72 ++ src/server/services/partService.ts | 60 + src/server/services/pdfExtractionService.ts | 209 ++++ src/server/services/projectService.ts | 221 ++++ src/server/services/yieldStudyService.ts | 56 + src/server/types/express.d.ts | 10 + src/server/types/models.ts | 125 ++ tsconfig.json | 7 + vite.config.ts | 57 + 158 files changed, 22553 insertions(+) create mode 100644 index.html create mode 100644 package.json create mode 100644 src/client/App.css create mode 100644 src/client/App.tsx create mode 100644 src/client/assets/grade.jpg create mode 100644 src/client/assets/react.svg create mode 100644 src/client/components/ActiveUsers.tsx create mode 100644 src/client/components/AdhesionGradeSelect.tsx create mode 100644 src/client/components/ArchivedNotificationsModal.tsx create mode 100644 src/client/components/Button.tsx create mode 100644 src/client/components/Card.tsx create mode 100644 src/client/components/ColorBubble.tsx create mode 100644 src/client/components/ConfirmModal.tsx create mode 100644 src/client/components/Input.tsx create mode 100644 src/client/components/Layout.tsx create mode 100644 src/client/components/MobileList.tsx create mode 100644 src/client/components/Modal.tsx create mode 100644 src/client/components/NotificationBell.tsx create mode 100644 src/client/components/PhotoUpload.tsx create mode 100644 src/client/components/ProtectedRoute.tsx create mode 100644 src/client/components/Select.tsx create mode 100644 src/client/components/SendMessageModal.tsx create mode 100644 src/client/components/TeamPresence.tsx create mode 100644 src/client/components/TechnicalManual.tsx create mode 100644 src/client/components/Toast.tsx create mode 100644 src/client/components/UnreadMessagesModal.tsx create mode 100644 src/client/components/admin/BackupRestore.tsx create mode 100644 src/client/components/admin/GeometrySettings.tsx create mode 100644 src/client/components/forms/PaintingInspectionForm.tsx create mode 100644 src/client/components/forms/SurfaceTreatmentForm.tsx create mode 100644 src/client/components/modals/CloneSchemeModal.tsx create mode 100644 src/client/components/modals/CreateControlRecordModal.tsx create mode 100644 src/client/components/modals/CreateInspectionModal.tsx create mode 100644 src/client/components/modals/CreatePaintingSchemeModal.tsx create mode 100644 src/client/components/modals/CreatePartModal.tsx create mode 100644 src/client/components/modals/CreateProjectModal.tsx create mode 100644 src/client/components/modals/DiluentListModal.tsx create mode 100644 src/client/components/modals/DiluentRegistrationModal.tsx create mode 100644 src/client/components/modals/ImportSchemeModal.tsx create mode 100644 src/client/components/modals/StockHistoryModal.tsx create mode 100644 src/client/components/modals/StockModal.tsx create mode 100644 src/client/components/modals/StockOutModal.tsx create mode 100644 src/client/components/reports/AnalyticalReport.tsx create mode 100644 src/client/components/reports/GeneralProjectReport.tsx create mode 100644 src/client/components/reports/StockInventoryReport.tsx create mode 100644 src/client/context/AuthContext.tsx create mode 100644 src/client/context/AuthContextType.ts create mode 100644 src/client/context/SystemSettingsContext.tsx create mode 100644 src/client/context/ToastContext.tsx create mode 100644 src/client/context/useAuth.ts create mode 100644 src/client/contexts/NotificationContext.tsx create mode 100644 src/client/contexts/NotificationContextState.ts create mode 100644 src/client/hooks/useNotifications.ts create mode 100644 src/client/hooks/usePresence.ts create mode 100644 src/client/hooks/useToast.ts create mode 100644 src/client/hooks/useUnreadMessages.ts create mode 100644 src/client/index.css create mode 100644 src/client/main.tsx create mode 100644 src/client/pages/AdminDashboard.tsx create mode 100644 src/client/pages/AnalysisDashboard.tsx create mode 100644 src/client/pages/CalculatorDashboard.tsx create mode 100644 src/client/pages/DataSheetLibrary.tsx create mode 100644 src/client/pages/DeveloperDashboard.tsx create mode 100644 src/client/pages/GuestDashboard.tsx create mode 100644 src/client/pages/InspectionsList.tsx create mode 100644 src/client/pages/InstrumentList.tsx create mode 100644 src/client/pages/Login.tsx create mode 100644 src/client/pages/OrganizationSelector.tsx create mode 100644 src/client/pages/PartsList.tsx create mode 100644 src/client/pages/ProjectDetails.tsx create mode 100644 src/client/pages/ProjectList.tsx create mode 100644 src/client/pages/SchemesList.tsx create mode 100644 src/client/pages/StockDashboard.tsx create mode 100644 src/client/pages/YieldStudyDashboard.tsx create mode 100644 src/client/services/analysisService.ts create mode 100644 src/client/services/api.ts create mode 100644 src/client/services/dataSheetService.ts create mode 100644 src/client/services/geometryTypeService.ts create mode 100644 src/client/services/stockService.ts create mode 100644 src/client/services/systemSettingsService.ts create mode 100644 src/client/services/yieldStudyService.ts create mode 100644 src/client/styles/reports.css create mode 100644 src/client/types.ts create mode 100644 src/client/types/Instrument.ts create mode 100644 src/client/utils/toastHandler.ts create mode 100644 src/server/app.ts create mode 100644 src/server/config/database.ts create mode 100644 src/server/controllers/analysisController.ts create mode 100644 src/server/controllers/applicationRecordController.ts create mode 100644 src/server/controllers/dataSheetController.ts create mode 100644 src/server/controllers/geometryTypeController.ts create mode 100644 src/server/controllers/inspectionController.ts create mode 100644 src/server/controllers/instrumentController.ts create mode 100644 src/server/controllers/messageController.ts create mode 100644 src/server/controllers/notificationController.ts create mode 100644 src/server/controllers/paintingSchemeController.ts create mode 100644 src/server/controllers/partController.ts create mode 100644 src/server/controllers/projectController.ts create mode 100644 src/server/controllers/stockController.ts create mode 100644 src/server/controllers/systemSettingsController.ts create mode 100644 src/server/controllers/userController.ts create mode 100644 src/server/controllers/yieldStudyController.ts create mode 100644 src/server/index.ts create mode 100644 src/server/middleware/roleMiddleware.ts create mode 100644 src/server/middleware/uploadMiddleware.ts create mode 100644 src/server/models/ApplicationRecord.ts create mode 100644 src/server/models/GeometryType.ts create mode 100644 src/server/models/Inspection.ts create mode 100644 src/server/models/Instrument.ts create mode 100644 src/server/models/Message.ts create mode 100644 src/server/models/Notification.ts create mode 100644 src/server/models/Organization.ts create mode 100644 src/server/models/OrganizationMember.ts create mode 100644 src/server/models/PaintingScheme.ts create mode 100644 src/server/models/Part.ts create mode 100644 src/server/models/Project.ts create mode 100644 src/server/models/StockAuditLog.ts create mode 100644 src/server/models/StockItem.ts create mode 100644 src/server/models/StockMovement.ts create mode 100644 src/server/models/StoredFile.ts create mode 100644 src/server/models/SystemSettings.ts create mode 100644 src/server/models/TechnicalDataSheet.ts create mode 100644 src/server/models/User.ts create mode 100644 src/server/models/YieldStudy.ts create mode 100644 src/server/routes/analysisRoutes.ts create mode 100644 src/server/routes/applicationRecordRoutes.ts create mode 100644 src/server/routes/backupRoutes.ts create mode 100644 src/server/routes/dataSheetRoutes.ts create mode 100644 src/server/routes/geometryTypeRoutes.ts create mode 100644 src/server/routes/inspectionRoutes.ts create mode 100644 src/server/routes/instrumentRoutes.ts create mode 100644 src/server/routes/messageRoutes.ts create mode 100644 src/server/routes/notificationRoutes.ts create mode 100644 src/server/routes/paintingSchemeRoutes.ts create mode 100644 src/server/routes/partRoutes.ts create mode 100644 src/server/routes/projectRoutes.ts create mode 100644 src/server/routes/stockRoutes.ts create mode 100644 src/server/routes/systemSettingsRoutes.ts create mode 100644 src/server/routes/uploadsRoutes.ts create mode 100644 src/server/routes/userRoutes.ts create mode 100644 src/server/routes/yieldStudyRoutes.ts create mode 100644 src/server/scripts/migrate.ts create mode 100644 src/server/scripts/setAdmin.ts create mode 100644 src/server/services/FileStorageService.ts create mode 100644 src/server/services/applicationRecordService.ts create mode 100644 src/server/services/backupService.ts create mode 100644 src/server/services/dataSheetService.ts create mode 100644 src/server/services/inspectionService.ts create mode 100644 src/server/services/notificationService.ts create mode 100644 src/server/services/paintingSchemeService.ts create mode 100644 src/server/services/partService.ts create mode 100644 src/server/services/pdfExtractionService.ts create mode 100644 src/server/services/projectService.ts create mode 100644 src/server/services/yieldStudyService.ts create mode 100644 src/server/types/express.d.ts create mode 100644 src/server/types/models.ts create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/index.html b/index.html new file mode 100644 index 0000000..fd7c215 --- /dev/null +++ b/index.html @@ -0,0 +1,21 @@ + + + + + + + + + + + + + SteelPaint + + + +
+ + + + \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..61f5004 --- /dev/null +++ b/package.json @@ -0,0 +1,73 @@ +{ + "name": "gpi-app", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "concurrently \"vite\" \"tsx watch src/server/index.ts\"", + "build:client": "vite build", + "build:server": "tsc -p tsconfig.server.json", + "build": "npm run build:client && npm run build:server", + "lint": "eslint .", + "preview": "vite preview", + "start": "node dist/server/index.js" + }, + "dependencies": { + "@clerk/clerk-react": "^5.59.6", + "@clerk/localizations": "^3.35.3", + "@tailwindcss/postcss": "^4.1.18", + "@types/mongoose": "^5.11.96", + "@types/uuid": "^10.0.0", + "@vercel/speed-insights": "^1.3.1", + "axios": "^1.13.2", + "clsx": "^2.1.1", + "cors": "^2.8.5", + "date-fns": "^4.1.0", + "dequal": "^2.0.3", + "dotenv": "^17.2.3", + "enhanced-resolve": "^5.18.4", + "express": "^5.2.1", + "lucide-react": "^0.562.0", + "mongodb": "^7.0.0", + "mongoose": "^9.1.5", + "multer": "^2.0.2", + "pdf-parse": "^1.1.1", + "prop-types": "^15.8.1", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-is": "^19.2.3", + "react-router-dom": "^7.12.0", + "recharts": "^3.7.0", + "search-web": "^1.0.3", + "serverless-http": "^4.0.0", + "tailwind-merge": "^3.4.0", + "tesseract.js": "^7.0.0", + "uuid": "^13.0.0" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.6", + "@types/multer": "^2.0.0", + "@types/node": "^24.10.1", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@vercel/node": "^5.5.28", + "@vitejs/plugin-react": "^5.1.1", + "autoprefixer": "^10.4.23", + "concurrently": "^9.1.2", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "nodemon": "^3.1.11", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18", + "ts-node": "^10.9.2", + "tsx": "^4.21.0", + "typescript": "~5.9.3", + "typescript-eslint": "^8.46.4", + "vite": "^7.2.4", + "vite-plugin-pwa": "^1.2.0" + } +} diff --git a/src/client/App.css b/src/client/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/src/client/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/src/client/App.tsx b/src/client/App.tsx new file mode 100644 index 0000000..eceb3a3 --- /dev/null +++ b/src/client/App.tsx @@ -0,0 +1,122 @@ +import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom'; +import { SignedIn, SignedOut, useOrganization } from '@clerk/clerk-react'; +import { AuthProvider } from './context/AuthContext'; +import { useAuth } from './context/useAuth'; +import { SystemSettingsProvider } from './context/SystemSettingsContext'; +import { NotificationProvider } from './contexts/NotificationContext'; +import { Layout } from './components/Layout'; +import { ProtectedRoute } from './components/ProtectedRoute'; +import { ToastProvider } from './components/Toast'; +import { ProjectList } from './pages/ProjectList'; +import { ProjectDetails } from './pages/ProjectDetails'; +import { SchemesList } from './pages/SchemesList'; +import { InspectionsList } from './pages/InspectionsList'; +import { DataSheetLibrary } from './pages/DataSheetLibrary'; +import { YieldStudyDashboard } from './pages/YieldStudyDashboard'; +import { AdminDashboard } from './pages/AdminDashboard'; +import { DeveloperDashboard } from './pages/DeveloperDashboard'; +import { CalculatorDashboard } from './pages/CalculatorDashboard'; +import { StockDashboard } from './pages/StockDashboard'; +import { GuestDashboard } from './pages/GuestDashboard'; +import { Login } from './pages/Login'; +import { OrganizationSelector } from './pages/OrganizationSelector'; +import InstrumentList from './pages/InstrumentList'; + +const DeveloperRoute: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const { isDeveloper, isLoading } = useAuth(); + + if (isLoading) return null; + if (!isDeveloper()) return ; + + return <>{children}; +}; + +const AppContent: React.FC = () => { + const { organization } = useOrganization(); + + console.log('AppContent rendered'); + console.log('Current organization:', organization); + + // If user is signed in but has no organization, show org selector + if (!organization) { + console.log('No organization - showing OrganizationSelector'); + return ; + } + + console.log('Organization exists - showing main app'); + return ( + + + + + + + } /> + } /> + } /> + } /> + } /> + } /> + + + + } /> + + + + } /> + + + + } /> + } /> + + + + } + /> + + + + } + /> + + + + } + /> + + + + + + + ); +}; + +function App() { + return ( + + + + + + + + + ); +} + +export default App; diff --git a/src/client/assets/grade.jpg b/src/client/assets/grade.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8e50c9e264be1fae7240e3cbce12fc01a1d71d8e GIT binary patch literal 101840 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 x!T=wN{^@|KC>=qR-K)Z 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 literal 0 HcmV?d00001 diff --git a/src/client/assets/react.svg b/src/client/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/src/client/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/client/components/ActiveUsers.tsx b/src/client/components/ActiveUsers.tsx new file mode 100644 index 0000000..77790a3 --- /dev/null +++ b/src/client/components/ActiveUsers.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import { usePresence } from '../hooks/usePresence'; + +export const ActiveUsers: React.FC = () => { + const { activeUsers } = usePresence(); + + // Filter out current user from display if desired, or keep them to show connectivity. + // The backend `getActiveUsers` optionally excludes self, but let's handle display logic here. + // Backend logic: _id: { $ne: currentUserId } + // So activeUsers only contains OTHER users. + + if (activeUsers.length === 0) return null; + + return ( +
+
+ {activeUsers.map((u) => ( +
+
+ {u.name.charAt(0)} +
+ + + {/* Tooltip */} +
+ {u.name} +
+
+ ))} +
+ {activeUsers.length > 3 && ( + +{activeUsers.length} + )} +
+ ); +}; diff --git a/src/client/components/AdhesionGradeSelect.tsx b/src/client/components/AdhesionGradeSelect.tsx new file mode 100644 index 0000000..c9a27fc --- /dev/null +++ b/src/client/components/AdhesionGradeSelect.tsx @@ -0,0 +1,197 @@ +import React, { useState } from 'react'; +import { HelpCircle, X } from 'lucide-react'; +import gradeImage from '../assets/grade.jpg'; + +interface AdhesionGrade { + value: string; + label: string; + areaRemoved: string; + status: 'approved' | 'warning' | 'rejected' | 'critical'; + statusLabel: string; + description: string; + spriteY: number; +} + +const adhesionGrades: AdhesionGrade[] = [ + { + value: '5B', + label: '5B / 5Y', + areaRemoved: '0%', + status: 'approved', + statusLabel: 'Aprovado', + description: 'As bordas dos cortes estão completamente lisas; nenhum quadradinho da grade se soltou. A grade parece intacta, apenas riscos finos.', + spriteY: 14 + }, + { + value: '4B', + label: '4B / 4Y', + areaRemoved: '< 5%', + status: 'approved', + statusLabel: 'Geralmente Aprovado', + description: 'Pequenas lascas de tinta se soltaram nas interseções dos cortes. A área afetada é inferior a 5% da área total da grade.', + spriteY: 29 + }, + { + value: '3B', + label: '3B / 3Y', + areaRemoved: '5 - 15%', + status: 'warning', + statusLabel: 'Limite Aceitável', + description: 'Pequenas lascas se soltaram ao longo das bordas e nas interseções. As linhas de corte parecem irregulares e alguns cantinhos dos quadrados sumiram.', + spriteY: 44 + }, + { + value: '2B', + label: '2B / 2Y', + areaRemoved: '15 - 35%', + status: 'rejected', + statusLabel: 'Geralmente Reprovado', + description: 'A tinta descascou ao longo das bordas e em partes dos quadrados. É visível que a tinta está falhando; faixas inteiras ao lado dos cortes podem ter saído.', + spriteY: 59 + }, + { + value: '1B', + label: '1B / 1Y', + areaRemoved: '35 - 65%', + status: 'rejected', + statusLabel: 'Reprovado', + description: 'A tinta descascou em fitas largas ou quadrados inteiros se soltaram. A grade está muito danificada, com grandes buracos.', + spriteY: 74 + }, + { + value: '0B', + label: '0B / 0Y', + areaRemoved: '> 65%', + status: 'critical', + statusLabel: 'Reprovado Crítico', + description: 'A descamação e remoção é pior que o grau 1B (mais de 65% da área). A maior parte da tinta na área do teste foi arrancada pela fita.', + spriteY: 89 + } +]; + +interface AdhesionGradeSelectProps { + name: string; + label?: string; + value: string; + onChange: (e: React.ChangeEvent) => void; +} + +export const AdhesionGradeSelect: React.FC = ({ name, label, value, onChange }) => { + const [showGuide, setShowGuide] = useState(false); + + const getStatusColor = (status: AdhesionGrade['status']) => { + switch (status) { + case 'approved': return 'text-green-400 bg-green-500/20 border-green-500/30'; + case 'warning': return 'text-amber-400 bg-amber-500/20 border-amber-500/30'; + case 'rejected': return 'text-red-400 bg-red-500/20 border-red-500/30'; + case 'critical': return 'text-red-500 bg-red-600/30 border-red-600/40'; + default: return 'text-gray-400 bg-gray-500/20 border-gray-500/30'; + } + }; + + return ( +
+ {/* Label with help button */} +
+ {label && } + +
+ + + + {/* Guide Modal */} + {showGuide && ( + <> + {/* Backdrop */} +
setShowGuide(false)} + /> + + {/* Modal */} +
+
+ {/* Header */} +
+
+

Guia de Classificação ASTM D3359

+

Método B - Teste de Aderência de Corte em Grade

+
+ +
+ + {/* Content */} +
+ {/* Grade Image */} +
+ Guia Visual ASTM D3359 +
+ + {/* Grade Cards */} +
+ {adhesionGrades.map((grade) => ( +
+
+ {grade.value} + + {grade.areaRemoved} + +
+

{grade.statusLabel}

+

+ {grade.description} +

+
+ ))} +
+ + {/* Info Note */} +
+

+ Nota: A escala ASTM funciona como uma "nota escolar": + 5B é a nota máxima (perfeito) e + 0B é a nota mínima (reprovado). +

+
+
+
+
+ + )} +
+ ); +}; diff --git a/src/client/components/ArchivedNotificationsModal.tsx b/src/client/components/ArchivedNotificationsModal.tsx new file mode 100644 index 0000000..e230689 --- /dev/null +++ b/src/client/components/ArchivedNotificationsModal.tsx @@ -0,0 +1,131 @@ +import React, { useState, useEffect } from 'react'; +import { X, Archive, Trash2, RefreshCcw } from 'lucide-react'; +import api from '../services/api'; +import type { INotification } from '../types'; + +interface ArchivedNotificationsModalProps { + isOpen: boolean; + onClose: () => void; +} + +export const ArchivedNotificationsModal: React.FC = ({ + isOpen, + onClose, +}) => { + const [notifications, setNotifications] = useState([]); + const [isLoading, setIsLoading] = useState(false); + + const fetchArchived = async () => { + setIsLoading(true); + try { + const response = await api.get('/notifications?includeArchived=true'); + // Filtrar apenas as arquivadas (no frontend por segurança, embora o backend já devesse ajudar) + // Na verdade, passamos includeArchived=true, o backend retornará unread + archived. + // Vamos filtrar para mostrar apenas o "Log" (arquivadas). + setNotifications(response.data.filter(n => n.isArchived || n.archivedBy?.length > 0)); + } catch (error) { + console.error('Error fetching archived notifications:', error); + } finally { + setIsLoading(false); + } + }; + + useEffect(() => { + if (isOpen) { + fetchArchived(); + } + }, [isOpen]); + + const deleteForever = async (id: string) => { + if (!window.confirm('Excluir permanentemente este registro do log?')) return; + try { + await api.delete(`/notifications/${id}`); + setNotifications(prev => prev.filter(n => n._id !== id)); + } catch (error) { + console.error('Error deleting archived notification:', error); + } + }; + + if (!isOpen) return null; + + return ( +
+
+ {/* Header */} +
+
+
+ +
+
+

Log de Mensagens (Arquivadas)

+

+ Histórico de notificações sistema +

+
+
+ +
+ + {/* Body */} +
+ {isLoading ? ( +
+ +

Carregando histórico...

+
+ ) : notifications.length === 0 ? ( +
+ +

Nenhuma mensagem arquivada

+

+ Mensagens arquivadas aparecerão aqui para consulta. +

+
+ ) : ( +
+ {notifications.map((msg) => ( +
+
+
+ {msg.title} + + {new Date(msg.createdAt).toLocaleString('pt-BR')} + +
+ +
+

{msg.message}

+
+ ))} +
+ )} +
+ + {/* Footer */} +
+ +
+
+
+ ); +}; diff --git a/src/client/components/Button.tsx b/src/client/components/Button.tsx new file mode 100644 index 0000000..70082d5 --- /dev/null +++ b/src/client/components/Button.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import { twMerge } from 'tailwind-merge'; + +interface ButtonProps extends React.ButtonHTMLAttributes { + variant?: 'primary' | 'secondary' | 'success' | 'danger' | 'ghost'; + size?: 'sm' | 'md' | 'lg'; +} + +export const Button: React.FC = ({ + className, + variant = 'primary', + size = 'md', + children, + ...props +}) => { + const baseStyles = 'inline-flex items-center justify-center rounded-xl font-bold transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none active:scale-95 tracking-wide'; + const variants = { + primary: 'bg-primary text-background-dark shadow-lg shadow-primary/20 hover:shadow-glow-primary hover:bg-primary/90 focus:ring-primary font-black', + secondary: 'bg-surface-highlight/50 backdrop-blur-sm text-text-main border border-white/10 hover:bg-surface-hover hover:border-text-muted/30 focus:ring-accent', + success: 'bg-accent-green text-background-dark shadow-lg shadow-accent-green/20 hover:shadow-[0_0_20px_rgba(11,218,77,0.4)] hover:bg-accent-green/90 focus:ring-accent-green font-black', + danger: 'bg-error text-white shadow-lg shadow-error/20 hover:shadow-glow-error hover:bg-error/90 focus:ring-error font-bold', + ghost: 'bg-transparent hover:bg-white/5 text-text-muted hover:text-white' + }; + + const sizes = { + sm: 'h-9 px-4 text-xs', + md: 'h-11 px-6 py-2.5 text-sm', + lg: 'h-14 px-8 text-base shadow-xl' + }; + + return ( + + ); +}; diff --git a/src/client/components/Card.tsx b/src/client/components/Card.tsx new file mode 100644 index 0000000..66f7bbc --- /dev/null +++ b/src/client/components/Card.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { twMerge } from 'tailwind-merge'; + +interface CardProps { + children: React.ReactNode; + className?: string; + title?: string; + description?: string; + actions?: React.ReactNode; + onClick?: () => void; +} + +export const Card: React.FC = ({ children, className, title, description, actions, onClick }) => { + return ( +
+ {(title || actions) && ( +
+
+ {title &&

{title}

} + {description &&

{description}

} +
+ {actions &&
{actions}
} +
+ )} +
{children}
+
+ ); +}; + diff --git a/src/client/components/ColorBubble.tsx b/src/client/components/ColorBubble.tsx new file mode 100644 index 0000000..d41ac47 --- /dev/null +++ b/src/client/components/ColorBubble.tsx @@ -0,0 +1,36 @@ +import React, { useEffect, useRef } from 'react'; +import { clsx } from 'clsx'; + +interface ColorBubbleProps { + colorHex?: string; + className?: string; + title?: string; +} + +export const ColorBubble: React.FC = ({ colorHex, className, title }) => { + const bubbleRef = useRef(null); + + useEffect(() => { + if (bubbleRef.current) { + if (colorHex) { + bubbleRef.current.style.setProperty('--bg-color', colorHex); + } else { + bubbleRef.current.style.removeProperty('--bg-color'); + } + } + }, [colorHex]); + + return ( +
+ ); +}; diff --git a/src/client/components/ConfirmModal.tsx b/src/client/components/ConfirmModal.tsx new file mode 100644 index 0000000..300dcc7 --- /dev/null +++ b/src/client/components/ConfirmModal.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import { Modal } from './Modal'; +import { Button } from './Button'; +import { AlertTriangle, HelpCircle } from 'lucide-react'; + +interface ConfirmModalProps { + isOpen: boolean; + onClose: () => void; + onConfirm: () => void; + title: string; + description: string; + confirmText?: string; + cancelText?: string; + type?: 'danger' | 'warning' | 'info'; +} + +export const ConfirmModal: React.FC = ({ + isOpen, + onClose, + onConfirm, + title, + description, + confirmText = 'Confirmar', + cancelText = 'Cancelar', + type = 'info' +}) => { + const getIcon = () => { + switch (type) { + case 'danger': return ; + case 'warning': return ; + default: return ; + } + }; + + return ( + +
+
+
+ {getIcon()} +
+
+

+ {description} +

+
+
+ +
+ + +
+
+
+ ); +}; diff --git a/src/client/components/Input.tsx b/src/client/components/Input.tsx new file mode 100644 index 0000000..523ae5b --- /dev/null +++ b/src/client/components/Input.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { twMerge } from 'tailwind-merge'; + +interface InputProps extends React.InputHTMLAttributes { + label?: string; + error?: string; +} + +export const Input = React.forwardRef(({ className, label, error, ...props }, ref) => { + return ( +
+ {label && } + + {error && {error}} +
+ ); +}); diff --git a/src/client/components/Layout.tsx b/src/client/components/Layout.tsx new file mode 100644 index 0000000..1d6c29b --- /dev/null +++ b/src/client/components/Layout.tsx @@ -0,0 +1,418 @@ +import React, { useState } from 'react'; +import NotificationBell from './NotificationBell'; +import { TeamPresence } from './TeamPresence'; +import { Link, useLocation, useNavigate } from 'react-router-dom'; +import { Menu, X, FolderOpen, Layers, ClipboardCheck, LogOut, TrendingUp, Sun, Moon, HelpCircle, Shield, Wrench, Terminal, LayoutDashboard, Package, Thermometer } from 'lucide-react'; +import { clsx } from 'clsx'; +import { useClerk, UserButton, useUser, OrganizationSwitcher, useOrganization } from '@clerk/clerk-react'; +import { TechnicalManual } from './TechnicalManual'; +import { useAuth } from '../context/useAuth'; +// import { useSystemSettings } from '../context/SystemSettingsContext'; +import { setApiOrgData } from '../services/api'; + +interface LayoutProps { + children: React.ReactNode; +} + +export const Layout: React.FC = ({ children }) => { + const [isSidebarOpen, setIsSidebarOpen] = useState(false); + const [isManualOpen, setIsManualOpen] = useState(false); + const [isDarkMode, setIsDarkMode] = useState(() => { + const saved = localStorage.getItem('theme'); + return saved === 'dark' || (!saved && window.matchMedia('(prefers-color-scheme: dark)').matches); + }); + const location = useLocation(); + const { signOut } = useClerk(); + const { user } = useUser(); + const { organization } = useOrganization(); + const { isAdmin, isUser, isDeveloper, appUser } = useAuth(); + // const { settings } = useSystemSettings(); + + // Sync Organization ID with API client + React.useEffect(() => { + if (organization?.id) { + + setApiOrgData(organization.id, organization.name); + } else { + setApiOrgData(null); + } + }, [organization]); + + // Helper to get role display name + const getRoleDisplay = () => { + switch (appUser?.role) { + case 'admin': return { label: 'Admin', color: 'text-amber-500' }; + case 'user': return { label: 'Usuário', color: 'text-green-500' }; + case 'guest': return { label: 'Convidado', color: 'text-blue-400' }; + default: return { label: 'Carregando...', color: 'text-text-muted' }; + } + }; + const roleInfo = getRoleDisplay(); + + React.useEffect(() => { + if (isDarkMode) { + document.documentElement.classList.add('dark'); + localStorage.setItem('theme', 'dark'); + } else { + document.documentElement.classList.remove('dark'); + localStorage.setItem('theme', 'light'); + } + }, [isDarkMode]); + + const toggleTheme = () => setIsDarkMode(!isDarkMode); + const navigate = useNavigate(); + + // Guest Redirection Logic + React.useEffect(() => { + if (appUser?.role === 'guest' && (location.pathname === '/' || location.pathname === '/projects')) { + navigate('/guest-dashboard'); + } + }, [appUser, location.pathname, navigate]); + + interface NavItem { + icon: React.ElementType; + label: string; + path: string; + adminOnly?: boolean; + } + + const navItems: NavItem[] = [ + { icon: LayoutDashboard, label: 'Painel Principal', path: '/guest-dashboard' }, + { icon: FolderOpen, label: 'Obras & Projetos', path: '/' }, + { icon: Layers, label: 'Esquemas', path: '/schemes' }, + { icon: ClipboardCheck, label: 'Inspeções', path: '/inspections' }, + { icon: FolderOpen, label: 'Biblioteca', path: '/library', adminOnly: true }, + { icon: Thermometer, label: 'Instrumentos', path: '/instruments' }, + { icon: TrendingUp, label: 'Estudo Rend.', path: '/yield-study', adminOnly: true }, + { icon: Package, label: 'Estoque', path: '/stock' }, + { icon: Wrench, label: 'Calculadora', path: '/calculators' }, + ]; + + const isActive = (path: string) => { + if (path === '/' && location.pathname === '/') return true; + if (path !== '/' && location.pathname.startsWith(path)) return true; + return false; + }; + + return ( +
+ {/* Sidebar Desktop - Fixed */} + + + {/* Mobile Header */} +
+
+ Logo + SteelPaint +
+ +
+ + {/* Mobile Sidebar Overlay */} + {isSidebarOpen && ( +
setIsSidebarOpen(false)} + /> + )} + + {/* Mobile Sidebar Drawer */} +
+
+
+ Logo + SteelPaint +
+ +
+ +
+ +
+
+ + {/* Main Content Area */} +
+
+ {children} +
+
+ + {/* Floating Help Button */} + + + {/* Technical Manual Modal */} + setIsManualOpen(false)} /> +
+ ); +}; + diff --git a/src/client/components/MobileList.tsx b/src/client/components/MobileList.tsx new file mode 100644 index 0000000..b47e571 --- /dev/null +++ b/src/client/components/MobileList.tsx @@ -0,0 +1,117 @@ +import React from 'react'; +import { Card } from './Card'; + +interface Column { + header: string; + accessor: keyof T | ((item: T) => React.ReactNode); + className?: string; // For adding widths or hiding on smaller screens +} + +interface MobileListProps { + data: T[]; + columns: Column[]; + keyExtractor: (item: T) => string; + onItemClick?: (item: T) => void; + titleAccessor?: keyof T | ((item: T) => React.ReactNode); + subtitleAccessor?: keyof T | ((item: T) => React.ReactNode); + actionRender?: (item: T) => React.ReactNode; +} + +export const MobileList = ({ + data, + columns, + keyExtractor, + onItemClick, + titleAccessor, + subtitleAccessor, + actionRender +}: MobileListProps) => { + + const renderCell = (item: T, col: Column) => { + if (typeof col.accessor === 'function') { + return col.accessor(item); + } + return item[col.accessor] as React.ReactNode; + }; + + const getTitle = (item: T) => { + if (!titleAccessor) return undefined; + if (typeof titleAccessor === 'function') return titleAccessor(item) as string; + return item[titleAccessor] as string; + }; + + const getSubtitle = (item: T) => { + if (!subtitleAccessor) return undefined; + if (typeof subtitleAccessor === 'function') return subtitleAccessor(item) as string; + return item[subtitleAccessor] as string; + }; + + return ( + <> + {/* Mobile View: Cards */} +
+ {data.map((item, index) => ( + onItemClick?.(item)} + title={getTitle(item)} + description={getSubtitle(item)} + actions={actionRender?.(item)} + className="active:bg-surface-hover" + > +
+ {columns.map((col, colIndex) => { + // Skip if it's the title or subtitle to avoid duplication (optional logic) + return ( +
+ {col.header}: + {renderCell(item, col)} +
+ ); + })} +
+
+ ))} +
+ + {/* Desktop View: Table */} +
+ + + + {columns.map((col, idx) => ( + + ))} + {actionRender && } + + + + {data.map((item, index) => ( + onItemClick?.(item)} + className="hover:bg-primary/[0.02] transition-colors cursor-pointer group" + > + {columns.map((col, idx) => ( + + ))} + {actionRender && ( + + )} + + ))} + +
+ {col.header} + Ações
+ {renderCell(item, col)} + + {actionRender(item)} +
+
+ + ); +}; diff --git a/src/client/components/Modal.tsx b/src/client/components/Modal.tsx new file mode 100644 index 0000000..d7648e5 --- /dev/null +++ b/src/client/components/Modal.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import { X } from 'lucide-react'; + +interface ModalProps { + isOpen: boolean; + onClose: () => void; + title: string; + children: React.ReactNode; + maxWidth?: string; +} + +export const Modal: React.FC = ({ isOpen, onClose, title, children, maxWidth = 'max-w-2xl' }) => { + if (!isOpen) return null; + + return ( +
+
+
+

{title}

+ +
+
+ {children} +
+
+
+ ); +}; diff --git a/src/client/components/NotificationBell.tsx b/src/client/components/NotificationBell.tsx new file mode 100644 index 0000000..67df66b --- /dev/null +++ b/src/client/components/NotificationBell.tsx @@ -0,0 +1,199 @@ +import React, { useState, useRef, useEffect } from 'react'; +import { useNotifications } from '../hooks/useNotifications'; +import { Bell, Check, Info, AlertTriangle, AlertCircle, CheckCircle, Trash2, Archive } from 'lucide-react'; +import type { NotificationType, INotification } from '../types'; +import { ArchivedNotificationsModal } from './ArchivedNotificationsModal'; + +const NotificationBell: React.FC = () => { + const { + unreadCount, + notifications, + markAsRead, + markAllAsRead, + clearAll, + archiveNotification, + deleteNotification + } = useNotifications(); + const [isOpen, setIsOpen] = useState(false); + const [isArchiveModalOpen, setIsArchiveModalOpen] = useState(false); + const [confirmActionId, setConfirmActionId] = useState(null); + const popoverRef = useRef(null); + + // Close popover when clicking outside + useEffect(() => { + function handleClickOutside(event: MouseEvent) { + if (popoverRef.current && !popoverRef.current.contains(event.target as Node)) { + setIsOpen(false); + } + } + document.addEventListener("mousedown", handleClickOutside); + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + }, [popoverRef]); + + const getIcon = (type: NotificationType) => { + switch (type) { + case 'info': return ; + case 'warning': return ; + case 'error': return ; + case 'success': return ; + default: return ; + } + }; + + const formatDate = (dateString: string) => { + const date = new Date(dateString); + return date.toLocaleDateString() + ' ' + date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); + }; + + return ( +
+ + + {isOpen && ( +
+
+

Notificações

+
+ {unreadCount > 0 && ( + + )} + {notifications.length > 0 && ( + + )} + +
+
+ +
+ {notifications.length === 0 ? ( +
+ Nenhuma notificação. +
+ ) : ( +
    + {notifications.map((notification: INotification) => ( +
  • +
    + {getIcon(notification.type)} +
    +
    +
    + + {notification.title} + + + {formatDate(notification.createdAt)} + +
    +
    + {!notification.isRead ? ( + + ) :
    } + + +
    + + {/* Prompt de Arquivar/Excluir */} + {confirmActionId === notification._id && ( +
    +

    O que deseja fazer com esta mensagem?

    +
    + + +
    + +
    + )} +
    +
  • + ))} +
+ )} +
+
+ )} + + setIsArchiveModalOpen(false)} + /> +
+ ); +}; + +export default NotificationBell; diff --git a/src/client/components/PhotoUpload.tsx b/src/client/components/PhotoUpload.tsx new file mode 100644 index 0000000..5ebcd23 --- /dev/null +++ b/src/client/components/PhotoUpload.tsx @@ -0,0 +1,112 @@ +import React, { useRef, useState } from 'react'; +import { Camera, X } from 'lucide-react'; +import api from '../services/api'; + +interface PhotoUploadProps { + photos: string[]; + onPhotosChange: (url: string) => void; + onRemovePhoto: (index: number) => void; +} + +export const PhotoUpload: React.FC = ({ photos, onPhotosChange, onRemovePhoto }) => { + const fileInputRef = useRef(null); + const [uploading, setUploading] = useState(false); + + const handleFileChange = async (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file) return; + + // Validation: Max 500KB + if (file.size > 500 * 1024) { + alert('A foto deve ter no máximo 500KB.'); + if (fileInputRef.current) fileInputRef.current.value = ''; + return; + } + + // Validation: JPG only + if (file.type !== 'image/jpeg' && file.type !== 'image/jpg') { + alert('Apenas fotos no formato JPG são permitidas.'); + if (fileInputRef.current) fileInputRef.current.value = ''; + return; + } + + setUploading(true); + const formData = new FormData(); + formData.append('photo', file); + + try { + const response = await api.post('/inspections/upload', formData, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); + onPhotosChange(response.data.url); + } catch (error) { + console.error('Error uploading photo:', error); + alert('Erro ao enviar foto. Verifique se o tamanho é menor que 500KB.'); + } finally { + setUploading(false); + if (fileInputRef.current) { + fileInputRef.current.value = ''; + } + } + }; + + return ( +
+ Fotos da Inspeção + +
+ {photos.map((photo, index) => ( +
+ {`Evidência +
+ +
+
+ ))} + + +
+ + +
+ ); +}; diff --git a/src/client/components/ProtectedRoute.tsx b/src/client/components/ProtectedRoute.tsx new file mode 100644 index 0000000..302ec86 --- /dev/null +++ b/src/client/components/ProtectedRoute.tsx @@ -0,0 +1,48 @@ +import React from 'react'; +import { Navigate } from 'react-router-dom'; +import { useAuth } from '../context/useAuth'; +import type { UserRole } from '../types'; +import { RefreshCw } from 'lucide-react'; + +interface ProtectedRouteProps { + children: React.ReactNode; + allowedRoles?: UserRole[]; + requireEdit?: boolean; + redirectTo?: string; +} + +/** + * ProtectedRoute component that restricts access based on user role + * @param allowedRoles - Array of roles that can access the route + * @param requireEdit - If true, only users who can edit (not guests) can access + * @param redirectTo - Where to redirect if access is denied (default: '/') + */ +export const ProtectedRoute: React.FC = ({ + children, + allowedRoles, + requireEdit = false, + redirectTo = '/', +}) => { + const { appUser, isLoading, canEdit } = useAuth(); + + // Show loading state + if (isLoading) { + return ( +
+ +
+ ); + } + + // Check role-based access + if (allowedRoles && appUser && !allowedRoles.includes(appUser.role)) { + return ; + } + + // Check edit permission + if (requireEdit && !canEdit()) { + return ; + } + + return <>{children}; +}; diff --git a/src/client/components/Select.tsx b/src/client/components/Select.tsx new file mode 100644 index 0000000..01a23c3 --- /dev/null +++ b/src/client/components/Select.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { twMerge } from 'tailwind-merge'; + +interface SelectProps extends React.SelectHTMLAttributes { + label?: string; + error?: string; + options: { label: string; value: string | number }[]; +} + +export const Select = React.forwardRef(({ className, label, error, options, ...props }, ref) => { + return ( +
+ {label && } + + {error && {error}} +
+ ); +}); diff --git a/src/client/components/SendMessageModal.tsx b/src/client/components/SendMessageModal.tsx new file mode 100644 index 0000000..2917881 --- /dev/null +++ b/src/client/components/SendMessageModal.tsx @@ -0,0 +1,154 @@ +import React, { useState } from 'react'; +import { X, Send, Trash2 } from 'lucide-react'; +import api from '../services/api'; + +interface SendMessageModalProps { + isOpen: boolean; + onClose: () => void; + recipientId: string; + recipientName: string; + existingMessage?: { + id: string; + message: string; + }; + onMessageSent: () => void; +} + +export const SendMessageModal: React.FC = ({ + isOpen, + onClose, + recipientId, + recipientName, + existingMessage, + onMessageSent, +}) => { + const [message, setMessage] = useState(existingMessage?.message || ''); + const [isSending, setIsSending] = useState(false); + + if (!isOpen) return null; + + const handleSend = async () => { + if (!message.trim()) { + alert('Digite uma mensagem primeiro'); + return; + } + + setIsSending(true); + try { + await api.post('/messages', { + toUserId: recipientId, + message: message.trim(), + }); + alert('Mensagem enviada com sucesso!'); + onMessageSent(); + onClose(); + } catch (error) { + console.error('Error sending message:', error); + alert('Erro ao enviar mensagem'); + } finally { + setIsSending(false); + } + }; + + const handleDelete = async () => { + if (!existingMessage?.id) return; + + if (!confirm('Deseja realmente deletar esta mensagem?')) return; + + setIsSending(true); + try { + await api.delete(`/messages/${existingMessage.id}`); + alert('Mensagem deletada com sucesso!'); + onMessageSent(); + onClose(); + } catch (error) { + console.error('Error deleting message:', error); + alert('Erro ao deletar mensagem'); + } finally { + setIsSending(false); + } + }; + + return ( +
+
+ {/* Header */} +
+
+

+ {existingMessage ? 'Editar Mensagem' : 'Enviar Mensagem'} +

+

+ Para: {recipientName} +

+
+ +
+ + {/* Body */} +
+
+ +