diff --git a/frontend/src/client/i18n.ts b/frontend/src/client/i18n.ts index 7998b7a..fdc5d5b 100644 --- a/frontend/src/client/i18n.ts +++ b/frontend/src/client/i18n.ts @@ -1095,7 +1095,7 @@ const translations: Record> = { "projects.detail.save": "Speichern", "projects.detail.tab.verlauf": "Verlauf", "projects.detail.tab.team": "Team", - "projects.detail.tab.kinder": "Untergeordnet", + "projects.detail.tab.kinder": "Projektbaum", "projects.detail.tab.parteien": "Parteien", "projects.detail.tab.fristen": "Fristen", "projects.detail.tab.termine": "Termine", @@ -3166,7 +3166,7 @@ const translations: Record> = { "projects.detail.save": "Save", "projects.detail.tab.verlauf": "Activity", "projects.detail.tab.team": "Team", - "projects.detail.tab.kinder": "Sub-projects", + "projects.detail.tab.kinder": "Project Tree", "projects.detail.tab.parteien": "Parties", "projects.detail.tab.fristen": "Deadlines", "projects.detail.tab.termine": "Appointments", diff --git a/frontend/src/client/projects-detail.ts b/frontend/src/client/projects-detail.ts index 1874ddf..2b0de82 100644 --- a/frontend/src/client/projects-detail.ts +++ b/frontend/src/client/projects-detail.ts @@ -206,6 +206,8 @@ let deadlines: Deadline[] = []; let appointments: Appointment[] = []; let ancestors: ProjectMini[] = []; let children: ProjectMini[] = []; +type TreeNode = ProjectMini & { children?: TreeNode[] }; +let projectTree: TreeNode[] = []; let teamMembers: ProjectTeamMember[] = []; // t-paliad-139 — additional Team-tab sections. let descendantStaffed: ProjectTeamMember[] = []; @@ -1534,38 +1536,63 @@ function renderBreadcrumb() { el.innerHTML = crumbs.join(BREADCRUMB_CHEVRON); } -// ----- Children ----------------------------------------------------------- +// ----- Project Tree (Projektbaum) ----------------------------------------- +// Renders the full visible project hierarchy with the current node highlighted. +// One round-trip to /api/projects/tree gets every project the user can see; +// the renderer walks the tree and produces a nested