feat: Multi-role platform expansion, mobile nav redesign, and UI polish

- Add Owner, Contractor, Vendor, Subcontractor dashboards and role-based routing
- Owner now has superuser access to all Admin pages (dashboard, schedule, leaderboard)
- Redesign landing page mobile menu as slide-in sidebar (replaces broken Framer Motion overlay)
- Add body scroll lock to app sidebar for mobile consistency
- Fix Team Schedule to match Admin Dashboard design language (ambient glows, gradient header, SpotlightCard, zinc palette)
- Fix login page tab overflow — use abbreviated labels and grid layout for 6 role tabs
- Fix Recharts ResponsiveContainer warnings — replace height="100%" with fixed pixel heights
- Fix lightbox image viewer — unified nav bar, touch swipe support, no more overlapping text
- Add AI Assistant page, People/Vendor/Document management for Owner role
- Expand mock data store with contractor, vendor, and subcontractor data
This commit is contained in:
Satyam
2026-02-17 01:19:41 +05:30
parent 35cbdeb33c
commit 2eaac6b84a
44 changed files with 6857 additions and 662 deletions
+99 -7
View File
@@ -13,8 +13,20 @@ import ErrorBoundary from './components/ErrorBoundary';
import SmoothScroll from './components/SmoothScroll';
import { Toaster } from 'sonner';
import NotFound from './pages/NotFound';
import OwnerSnapshot from './pages/owner/OwnerSnapshot';
import PeopleDirectory from './pages/owner/PeopleDirectory';
import VendorDirectory from './pages/owner/VendorDirectory';
import DocumentManagement from './pages/owner/DocumentManagement';
import PlaceholderDashboard from './pages/PlaceholderDashboard';
import ProjectList from './pages/contractor/ProjectList';
import AiAssistantPage from './pages/AiAssistantPage';
// New Dashboards
import VendorDashboard from './pages/vendor/VendorDashboard';
import VendorOrders from './pages/vendor/VendorOrders';
import ContractorDashboard from './pages/contractor/ContractorDashboard';
import SubContractorDashboard from './pages/subcontractor/SubContractorDashboard';
// Protected Route Component
// ... (existing imports)
const ProtectedRoute = ({ children, allowedRoles }) => {
const { user, isAuthenticated } = useAuth();
const location = useLocation();
@@ -42,6 +54,14 @@ function App() {
{/* Public Routes */}
<Route path="/" element={<Landing />} />
<Route path="/login" element={<Login />} />
<Route
path="/chat-assistant"
element={
<ProtectedRoute allowedRoles={['OWNER', 'ADMIN', 'FIELD_AGENT', 'CONTRACTOR', 'SUBCONTRACTOR', 'CUSTOMER']}>
<AiAssistantPage />
</ProtectedRoute>
}
/>
{/* Protected Field Agent Routes */}
<Route path="/portal/profile" element={
@@ -53,7 +73,7 @@ function App() {
<Route
path="/emp/fa/dashboard"
element={
<ProtectedRoute allowedRoles={['FIELD_AGENT', 'ADMIN']}>
<ProtectedRoute allowedRoles={['FIELD_AGENT', 'ADMIN', 'OWNER']}>
<Dashboard />
</ProtectedRoute>
}
@@ -61,17 +81,53 @@ function App() {
<Route
path="/emp/fa/maps"
element={
<ProtectedRoute allowedRoles={['FIELD_AGENT', 'ADMIN']}>
<ProtectedRoute allowedRoles={['FIELD_AGENT', 'ADMIN', 'OWNER']}>
<Maps />
</ProtectedRoute>
}
/>
{/* Owner Routes */}
<Route path="/owner/snapshot" element={
<ProtectedRoute allowedRoles={['OWNER']}>
<OwnerSnapshot />
</ProtectedRoute>
} />
<Route path="/owner/people" element={
<ProtectedRoute allowedRoles={['OWNER']}>
<PeopleDirectory />
</ProtectedRoute>
} />
<Route path="/owner/vendors" element={
<ProtectedRoute allowedRoles={['OWNER']}>
<VendorDirectory />
</ProtectedRoute>
} />
<Route path="/owner/documents" element={
<ProtectedRoute allowedRoles={['OWNER']}>
<DocumentManagement />
</ProtectedRoute>
} />
<Route path="/owner/maps" element={
<ProtectedRoute allowedRoles={['OWNER']}>
<div className="h-full w-full bg-zinc-900 flex items-center justify-center text-white">
<span className="text-xl">Detailed Market Intelligence Map (Coming Soon)</span>
</div>
</ProtectedRoute>
} />
{/* Protected Admin Routes */}
{/* Protected Admin Routes — Owner has full admin access */}
<Route
path="/admin/dashboard"
element={
<ProtectedRoute allowedRoles={['ADMIN', 'OWNER']}>
<Dashboard />
</ProtectedRoute>
}
/>
<Route
path="/admin/schedule"
element={
<ProtectedRoute allowedRoles={['ADMIN']}>
<ProtectedRoute allowedRoles={['ADMIN', 'OWNER']}>
<AdminSchedule />
</ProtectedRoute>
}
@@ -80,18 +136,54 @@ function App() {
<Route
path="/admin/leaderboard"
element={
<ProtectedRoute allowedRoles={['ADMIN']}>
<ProtectedRoute allowedRoles={['ADMIN', 'OWNER']}>
<LeaderboardPage />
</ProtectedRoute>
}
/>
{/* Contractor Routes */}
<Route path="/contractor/dashboard" element={
<ProtectedRoute allowedRoles={['CONTRACTOR']}>
<ContractorDashboard />
</ProtectedRoute>
} />
<Route path="/contractor/projects" element={
<ProtectedRoute allowedRoles={['CONTRACTOR']}>
<ProjectList />
</ProtectedRoute>
} />
{/* Vendor Routes */}
<Route path="/vendor/dashboard" element={
<ProtectedRoute allowedRoles={['VENDOR']}>
<VendorDashboard />
</ProtectedRoute>
} />
<Route path="/vendor/orders" element={
<ProtectedRoute allowedRoles={['VENDOR']}>
<VendorOrders />
</ProtectedRoute>
} />
{/* Subcontractor Routes */}
<Route path="/subcontractor/dashboard" element={
<ProtectedRoute allowedRoles={['SUBCONTRACTOR']}>
<SubContractorDashboard />
</ProtectedRoute>
} />
<Route path="/subcontractor/projects" element={
<ProtectedRoute allowedRoles={['SUBCONTRACTOR']}>
<ProjectList />
</ProtectedRoute>
} />
</Route>
{/* Catch all */}
<Route path="*" element={<NotFound />} />
</Routes>
</SmoothScroll>
</ErrorBoundary>
</ErrorBoundary >
);
}