All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 3m46s
Phase 10.2 Văn phòng số — Internal Directory (1 endpoint reuse Users + EmployeeProfiles + Departments, FE card grid avatar/dept/email/phone/Ext). BE Task 1+2 (em main solo): - Application/Office/DirectoryFeatures.cs — GetDirectoryQuery + DirectoryItemDto 12 field LEFT JOIN Users.IsActive + Departments + EmployeeProfiles - Api/Controllers/DirectoryController.cs — GET /api/directory?search=&departmentId= class-level [Authorize] (mọi authenticated NV tra cứu danh bạ nội bộ) - MenuKeys.cs +Off+OffDanhBa const + All[] update - DbInitializer.SeedMenuTreeAsync Off Order=29 + OffDanhBa Order=1 dưới Off FE Task 3 (Implementer Case 2 Pattern 16-bis 4-place mirror cross-app — 5×): - types/directory.ts SHA256 7349d9f64e78 × 2 app IDENTICAL - pages/office/InternalDirectoryPage.tsx SHA256 2aa7e0eed2c8 × 2 app IDENTICAL Card grid responsive 1/2/3/4 col + filter dept dropdown + search input Avatar 14×14 initials gradient PALETTE 6 màu (Pattern 14 Tailwind JIT) EmployeeCode badge + Department emerald badge + email mailto + phone tel Internal phone Ext: amber badge + empty/loading state Vietnamese 100% - App.tsx route /directory × 2 app - lib/menuKeys.ts Off+OffDanhBa const × 2 app - components/Layout.tsx resolvePath staticMap Off_DanhBa:/directory × 2 app (gotcha #50 — 5 places mirror crossapp DON'T MISS) Verify: - dotnet build PASS (2 warn DocxRenderer existing, 0 error) - dotnet test 120/120 PASS (58 Domain + 62 Infra baseline preserve) - npm build × 2 app PASS 0 TS err (fe-admin 1436KB / fe-user 1350KB) Implementer MEMORY Pattern 16-bis reinforced 5× cumulative (S29 Plan CA HF1 + S29 Plan B Chunk D + S33 Plan B G-H1 Task 5 + S34 Plan G-O1 Task 3). Endpoint smoke pending CICD post-deploy Stage 4 (Run #XXX expected ~3m30s). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
98 lines
5.4 KiB
TypeScript
98 lines
5.4 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 { DashboardPage } from '@/pages/DashboardPage'
|
|
import { SuppliersPage } from '@/pages/master/SuppliersPage'
|
|
import { ProjectsPage } from '@/pages/master/ProjectsPage'
|
|
import { DepartmentsPage } from '@/pages/master/DepartmentsPage'
|
|
import { CatalogsPage } from '@/pages/master/CatalogsPage'
|
|
import { PermissionsPage } from '@/pages/system/PermissionsPage'
|
|
import { MenuVisibilityPage } from '@/pages/system/MenuVisibilityPage'
|
|
import { RolesPage } from '@/pages/system/RolesPage'
|
|
import { WorkflowsPage } from '@/pages/system/WorkflowsPage'
|
|
import { PeWorkflowsPage } from '@/pages/system/PeWorkflowsPage'
|
|
import { ApprovalWorkflowsV2Page } from '@/pages/system/ApprovalWorkflowsV2Page'
|
|
import { FormsPage } from '@/pages/forms/FormsPage'
|
|
import { ContractsListPage } from '@/pages/contracts/ContractsListPage'
|
|
import { ContractDetailPage } from '@/pages/contracts/ContractDetailPage'
|
|
import { ContractCreatePage } from '@/pages/contracts/ContractCreatePage'
|
|
import { ReportsPage } from '@/pages/ReportsPage'
|
|
import { UsersPage } from '@/pages/system/UsersPage'
|
|
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'
|
|
import { EmployeesListPage } from '@/pages/hrm/EmployeesListPage'
|
|
import { EmployeeCreatePage } from '@/pages/hrm/EmployeeCreatePage'
|
|
import { InternalDirectoryPage } from '@/pages/office/InternalDirectoryPage'
|
|
|
|
function App() {
|
|
return (
|
|
<BrowserRouter>
|
|
<AuthProvider>
|
|
<Routes>
|
|
<Route path="/login" element={<LoginPage />} />
|
|
<Route
|
|
element={
|
|
<ProtectedRoute>
|
|
<Layout />
|
|
</ProtectedRoute>
|
|
}
|
|
>
|
|
<Route path="/dashboard" element={<DashboardPage />} />
|
|
<Route path="/master/suppliers" element={<SuppliersPage />} />
|
|
<Route path="/master/projects" element={<ProjectsPage />} />
|
|
<Route path="/master/departments" element={<DepartmentsPage />} />
|
|
<Route path="/master/catalogs" element={<Navigate to="/master/catalogs/units" replace />} />
|
|
<Route path="/master/catalogs/:kind" element={<CatalogsPage />} />
|
|
<Route path="/system/users" element={<UsersPage />} />
|
|
<Route path="/system/roles" element={<RolesPage />} />
|
|
<Route path="/system/permissions" element={<PermissionsPage />} />
|
|
<Route path="/system/menu-visibility" element={<MenuVisibilityPage />} />
|
|
<Route path="/system/workflows" element={<WorkflowsPage />} />
|
|
<Route path="/system/workflows/:typeCode" element={<WorkflowsPage />} />
|
|
<Route path="/system/pe-workflows" element={<PeWorkflowsPage />} />
|
|
<Route path="/system/pe-workflows/:typeCode" element={<PeWorkflowsPage />} />
|
|
{/* Quy trình duyệt MỚI (Mig 22 — UAT) */}
|
|
<Route path="/system/approval-workflows-v2" element={<ApprovalWorkflowsV2Page />} />
|
|
<Route path="/system/approval-workflows-v2/:typeCode" element={<ApprovalWorkflowsV2Page />} />
|
|
<Route path="/forms" element={<FormsPage />} />
|
|
<Route path="/contracts" element={<ContractsListPage />} />
|
|
<Route path="/contracts/new" element={<ContractCreatePage />} />
|
|
<Route path="/contracts/:id" element={<ContractDetailPage />} />
|
|
<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 />} />
|
|
{/* Hồ sơ Nhân sự (Phase 10.1 G-H1 — Mig 34) */}
|
|
<Route path="/employees" element={<EmployeesListPage />} />
|
|
<Route path="/employees/new" element={<EmployeeCreatePage />} />
|
|
{/* Văn phòng số — Danh bạ nội bộ (Phase 10.2 G-O1) */}
|
|
<Route path="/directory" element={<InternalDirectoryPage />} />
|
|
<Route path="/reports" element={<ReportsPage />} />
|
|
<Route path="/" element={<Navigate to="/dashboard" replace />} />
|
|
<Route
|
|
path="*"
|
|
element={
|
|
<div className="p-8 text-slate-500">
|
|
Trang này chưa được build — sẽ có ở Phase tiếp theo.
|
|
</div>
|
|
}
|
|
/>
|
|
</Route>
|
|
</Routes>
|
|
<Toaster richColors position="top-right" />
|
|
</AuthProvider>
|
|
</BrowserRouter>
|
|
)
|
|
}
|
|
|
|
export default App
|