Chunk 2/3 — mirror y hệt Chunk 1 sang fe-user (rule §3.9 duplicate có chủ đích giữa 2 app — copy + sync tay khi breaking). Files (cùng diff Chunk 1, content identical): + fe-user/src/components/pe/PeListPanel.tsx + fe-user/src/components/pe/PeHeaderForm.tsx + fe-user/src/pages/pe/PurchaseEvaluationWorkspacePage.tsx ~ fe-user/src/components/pe/PeDetailTabs.tsx — add mode prop + Section 5 hint ~ fe-user/src/components/Layout.tsx — resolver Pe_*_Create map workspace ~ fe-user/src/App.tsx — route /purchase-evaluations/workspace Verify: npm run build (fe-user) pass. dotnet test 83 không bị ảnh hưởng (đã verify Chunk 1). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
61 lines
2.7 KiB
TypeScript
61 lines
2.7 KiB
TypeScript
import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom'
|
|
import { Toaster } from 'sonner'
|
|
import { AuthProvider } from '@/contexts/AuthContext'
|
|
import { ProtectedRoute } from '@/components/ProtectedRoute'
|
|
import { Layout } from '@/components/Layout'
|
|
import { LoginPage } from '@/pages/LoginPage'
|
|
import { UserDashboardPage } from '@/pages/UserDashboardPage'
|
|
import { InboxPage } from '@/pages/InboxPage'
|
|
import { ContractCreatePage } from '@/pages/contracts/ContractCreatePage'
|
|
import { ContractDetailPage } from '@/pages/contracts/ContractDetailPage'
|
|
import { MyContractsPage } from '@/pages/contracts/MyContractsPage'
|
|
import { PurchaseEvaluationsListPage, PurchaseEvaluationDetailPage } from '@/pages/pe/PurchaseEvaluationsListPage'
|
|
import { PurchaseEvaluationCreatePage } from '@/pages/pe/PurchaseEvaluationCreatePage'
|
|
import { PurchaseEvaluationWorkspacePage } from '@/pages/pe/PurchaseEvaluationWorkspacePage'
|
|
import { BudgetsListPage, BudgetDetailPage } from '@/pages/budgets/BudgetsListPage'
|
|
import { BudgetCreatePage } from '@/pages/budgets/BudgetCreatePage'
|
|
|
|
function App() {
|
|
return (
|
|
<BrowserRouter>
|
|
<AuthProvider>
|
|
<Routes>
|
|
<Route path="/login" element={<LoginPage />} />
|
|
<Route
|
|
element={
|
|
<ProtectedRoute>
|
|
<Layout />
|
|
</ProtectedRoute>
|
|
}
|
|
>
|
|
<Route path="/dashboard" element={<UserDashboardPage />} />
|
|
<Route path="/inbox" element={<InboxPage />} />
|
|
<Route path="/contracts/new" element={<ContractCreatePage />} />
|
|
<Route path="/contracts/:id" element={<ContractDetailPage />} />
|
|
<Route path="/my-contracts" element={<MyContractsPage />} />
|
|
<Route path="/purchase-evaluations" element={<PurchaseEvaluationsListPage />} />
|
|
<Route path="/purchase-evaluations/workspace" element={<PurchaseEvaluationWorkspacePage />} />
|
|
<Route path="/purchase-evaluations/new" element={<PurchaseEvaluationCreatePage />} />
|
|
<Route path="/purchase-evaluations/:id" element={<PurchaseEvaluationDetailPage />} />
|
|
<Route path="/budgets" element={<BudgetsListPage />} />
|
|
<Route path="/budgets/new" element={<BudgetCreatePage />} />
|
|
<Route path="/budgets/:id" element={<BudgetDetailPage />} />
|
|
<Route path="/" element={<Navigate to="/dashboard" replace />} />
|
|
<Route
|
|
path="*"
|
|
element={
|
|
<div className="p-8 text-slate-500">
|
|
Trang này chưa được build.
|
|
</div>
|
|
}
|
|
/>
|
|
</Route>
|
|
</Routes>
|
|
<Toaster richColors position="top-right" />
|
|
</AuthProvider>
|
|
</BrowserRouter>
|
|
)
|
|
}
|
|
|
|
export default App
|