feat(estimates): add EstimatesPage hub with templates tab, estimate detail drawer, and template editor

- EstimatesPage: tabbed hub with Estimates and Templates tabs, KPI strip, search + filter
- EstimateDetailModal: right-side drawer showing scope of work, computed line items, and financial summary from template + roof area
- TemplateEditorModal: create/edit/duplicate templates with segmented mode toggle
- Owner-only template management (create, edit, duplicate, delete); Admin/FA read-only view
- Duplicate mode: toggle between 'Save as new copy' (default, editable name) and 'Replace original'
- MASTER_TEMPLATES and MOCK_ESTIMATES moved into mockStore with full CRUD helpers
- TemplateSelectionModal now reads from mockStore instead of local stub
- Sidebar nav updated to point to /estimates hub for all roles
- Routes added: /emp/fa/estimates, /admin/estimates, /owner/estimates
This commit is contained in:
Satyam-Rastogi
2026-04-01 16:13:36 +05:30
parent 9be8ec911f
commit 8f9cb9dd48
7 changed files with 1690 additions and 5 deletions
+22
View File
@@ -32,6 +32,7 @@ import SubContractorDashboard from './pages/subcontractor/SubContractorDashboard
import CreateLeadPage from './pages/CreateLeadPage';
import LeadsListPage from './pages/LeadsListPage';
import LynkDispatchPage from './pages/LynkDispatchPage';
import EstimatesPage from './pages/EstimatesPage';
// ... (existing imports)
const ProtectedRoute = ({ children, allowedRoles }) => {
@@ -101,6 +102,14 @@ function App() {
</ProtectedRoute>
}
/>
<Route
path="/emp/fa/estimates"
element={
<ProtectedRoute allowedRoles={['FIELD_AGENT', 'ADMIN', 'OWNER']}>
<EstimatesPage />
</ProtectedRoute>
}
/>
<Route
path="/emp/fa/estimate"
element={
@@ -166,6 +175,11 @@ function App() {
<ProCanvas />
</ProtectedRoute>
} />
<Route path="/owner/estimates" element={
<ProtectedRoute allowedRoles={['OWNER']}>
<EstimatesPage />
</ProtectedRoute>
} />
<Route path="/owner/estimate" element={
<ProtectedRoute allowedRoles={['OWNER']}>
<EstimateBuilder />
@@ -230,6 +244,14 @@ function App() {
</ProtectedRoute>
}
/>
<Route
path="/admin/estimates"
element={
<ProtectedRoute allowedRoles={['ADMIN', 'OWNER']}>
<EstimatesPage />
</ProtectedRoute>
}
/>
<Route
path="/admin/estimate"
element={