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:
+99
-7
@@ -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 >
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user