+
+
+ {/* Filter bar sticky top */}
+
+
+
+
+
+ {/* Card grid */}
+ {list.isLoading ? (
+
+ {Array.from({ length: 8 }).map((_, i) => (
+
+ ))}
+
+ ) : total === 0 ? (
+
+ ) : (
+
+ {list.data!.map(item => (
+
+ ))}
+
+ )}
+
+ )
+}
+
+function DirectoryCard({ item }: { item: DirectoryItem }) {
+ return (
+
+ {/* Top row: avatar + name + code */}
+
+ {item.photoUrl ? (
+

+ ) : (
+
+ {initials(item.fullName)}
+
+ )}
+
+
+
+ {item.fullName}
+
+ {item.employeeCode && (
+
+ {item.employeeCode}
+
+ )}
+
+ {item.position && (
+
+ {item.position}
+
+ )}
+ {item.departmentName && (
+
+ {item.departmentName}
+
+ )}
+
+
+
+ {/* Contact rows */}
+
+
+ )
+}
diff --git a/fe-admin/src/types/directory.ts b/fe-admin/src/types/directory.ts
new file mode 100644
index 0000000..c7d32c8
--- /dev/null
+++ b/fe-admin/src/types/directory.ts
@@ -0,0 +1,22 @@
+// Danh bạ nội bộ (Internal Directory) — Phase 10.2 G-O1 (S34 2026-05-27).
+// Mirror BE DirectoryItemDto (Application/Office/DirectoryFeatures.cs).
+// File này MIRROR SHA256 identical với fe-admin/src/types/directory.ts.
+export type DirectoryItem = {
+ userId: string
+ fullName: string
+ position: string | null
+ photoUrl: string | null
+ departmentId: string | null
+ departmentName: string | null
+ employeeCode: string | null
+ email: string | null
+ phone: string | null
+ internalPhone: string | null
+ personalEmail: string | null
+ workLocation: string | null
+}
+
+export type DirectoryQuery = {
+ search?: string
+ departmentId?: string
+}
diff --git a/fe-user/src/App.tsx b/fe-user/src/App.tsx
index 3437871..81bc7d4 100644
--- a/fe-user/src/App.tsx
+++ b/fe-user/src/App.tsx
@@ -21,6 +21,7 @@ import { BudgetsListPage, BudgetDetailPage } from '@/pages/budgets/BudgetsListPa
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 (
@@ -56,6 +57,8 @@ function App() {
{/* Hồ sơ Nhân sự (Phase 10.1 G-H1 — Mig 34) */}