feat(teams): add tab routing to people page

This commit is contained in:
2026-06-26 00:13:37 +02:00
parent d3114326bb
commit a0dcf85f5c
2 changed files with 50 additions and 1 deletions
+46 -1
View File
@@ -13,21 +13,36 @@ import {
type PersonDepartmentCopy,
type PersonFallbackCopy,
} from "./_components/person.copy"
import TeamsTab from "./_components/teams.tab"
import {
formatUserRole,
type UserFallbackCopy,
type UserRoleCopy,
} from "./_components/user.copy"
const VALID_TABS = ["people", "teams"] as const
type Tab = (typeof VALID_TABS)[number]
function resolveTab(raw: string | undefined): Tab {
if (raw && VALID_TABS.includes(raw as Tab)) {
return raw as Tab
}
return "people"
}
export default async function PeoplePage(props: {
searchParams?: Promise<{
page?: string
search?: string
tab?: string
}>
}) {
const searchParams = await props.searchParams
const currentPage = searchParams?.page ? parseInt(searchParams.page, 10) : 1
const search = searchParams?.search || ""
const activeTab = resolveTab(searchParams?.tab)
const { data: people, totalPages } = await PersonService.findAllPaginated({
page: currentPage,
pageSize: 10,
@@ -35,6 +50,7 @@ export default async function PeoplePage(props: {
})
const { dictionary } = await getI18n()
const copy = dictionary.inventory.people
const teamCopy = dictionary.inventory.teams
const userCopy = dictionary.admin.users
const userStatusCopy = userCopy.status
const userRoleLabels = userCopy.roles as UserRoleCopy
@@ -42,7 +58,7 @@ export default async function PeoplePage(props: {
const departmentCopy = copy.departments as PersonDepartmentCopy
const personFallbackCopy = copy.fallback as PersonFallbackCopy
return (
const peopleList = (
<div className="flex flex-col gap-4">
<PageHeader
title={copy.list.title}
@@ -160,4 +176,33 @@ export default async function PeoplePage(props: {
)}
</div>
)
return (
<div className="flex flex-col gap-4">
<nav aria-label="People sections">
<ul className="flex gap-4 border-b">
<li>
<Link
href="/people?tab=people"
aria-current={activeTab === "people" ? "page" : undefined}
className={`inline-block px-4 py-2 ${activeTab === "people" ? "border-b-2 border-primary font-semibold" : ""}`}
>
{copy.list.title}
</Link>
</li>
<li>
<Link
href="/people?tab=teams"
aria-current={activeTab === "teams" ? "page" : undefined}
className={`inline-block px-4 py-2 ${activeTab === "teams" ? "border-b-2 border-primary font-semibold" : ""}`}
>
{teamCopy.list.title}
</Link>
</li>
</ul>
</nav>
{activeTab === "teams" && <TeamsTab />}
{activeTab === "people" && peopleList}
</div>
)
}
@@ -44,6 +44,10 @@ vi.mock("@/components/common/pagination", () => ({
createElement("nav", { "aria-label": "Pagination" }, totalPages),
}))
vi.mock("@/app/(dashboard)/people/_components/teams.tab", () => ({
default: () => null,
}))
describe("person pages", () => {
beforeEach(() => {
vi.clearAllMocks()