Frontend half of the rename: - New /admin/partner-units page (admin-partner-units.tsx + .ts) with full CRUD + member management. Mirrors /admin/team's aesthetic and uses the same modal pattern. Card on /admin flips from "Geplant" to "Verfügbar" with ICON_BUILDING and a /admin/partner-units link. - Sidebar gains a "Partner Units" admin nav item between Team and Audit. - Onboarding form replaces the free-text Dezernat input with a select populated from /api/partner-units; submits partner_unit_id which the backend uses to insert a membership row in the user-create tx. - Settings: dezernat tab removed entirely (TabName drops to 3). The read-only "Meine Partner Units" view now lives as a card on the profile tab. Free-text dezernat input removed from the profile form. ~250 lines of admin-CRUD removed; replaced by ~70 lines of read-only partner-units summary. - /admin/team: Dezernat column dropped from the table and the inline edit row; "Onboard existing account" modal no longer asks for one. Column count drops from 10 to 9. - /team directory: groups by structured partner_unit_members only; drops the free-text fallback grouping and the "Ohne Dezernat" loose bucket. Single "Ohne Partner Unit" orphan group catches users in no unit. - i18n: ~30 dezernat.* + onboarding.dezernat + admin.team.col.dezernat + admin.card.departments + team.* keys removed; ~30 partner_unit.* keys added in DE+EN. "Partner Unit" / "Partner Units" used as a loanword in DE. - /api/departments?include=members → /api/partner-units?include=members in team.ts (the only frontend-side fetch URL referencing the old endpoints). go build / vet / test clean. cd frontend && bun run build clean.
82 lines
3.3 KiB
TypeScript
82 lines
3.3 KiB
TypeScript
import { h } from "./jsx";
|
|
import { Sidebar } from "./components/Sidebar";
|
|
import { BottomNav } from "./components/BottomNav";
|
|
import { Footer } from "./components/Footer";
|
|
import { PWAHead } from "./components/PWAHead";
|
|
|
|
export function renderTeam(): string {
|
|
return "<!DOCTYPE html>" + (
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
|
<meta name="theme-color" content="#BFF355" />
|
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
|
|
<PWAHead />
|
|
<title data-i18n="team.title">Team — Paliad</title>
|
|
<link rel="stylesheet" href="/assets/global.css" />
|
|
</head>
|
|
<body className="has-sidebar">
|
|
<Sidebar currentPath="/team" />
|
|
<BottomNav currentPath="/team" />
|
|
|
|
<main>
|
|
<section className="tool-page">
|
|
<div className="container">
|
|
<div className="tool-header">
|
|
<div>
|
|
<h1 data-i18n="team.heading">Team</h1>
|
|
<p className="tool-subtitle" data-i18n="team.subtitle">
|
|
Alle Paliad-Kolleg:innen, gruppiert nach Standort oder Partner Unit.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="team-controls">
|
|
<div className="glossar-search-wrap">
|
|
<svg className="glossar-search-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
<circle cx="11" cy="11" r="8" />
|
|
<line x1="21" y1="21" x2="16.65" y2="16.65" />
|
|
</svg>
|
|
<input
|
|
type="text"
|
|
id="team-search"
|
|
className="glossar-search"
|
|
placeholder="Suchen / Search..."
|
|
data-i18n-placeholder="team.search.placeholder"
|
|
autocomplete="off"
|
|
/>
|
|
<span className="glossar-count" id="team-count" />
|
|
</div>
|
|
|
|
<div className="team-toggle" role="tablist" aria-label="Gruppierung">
|
|
<button className="filter-pill active" data-group="office" type="button" data-i18n="team.group.office">
|
|
Nach Standort
|
|
</button>
|
|
<button className="filter-pill" data-group="department" type="button" data-i18n="team.group.department">
|
|
Nach Partner Unit
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="team-filter-row" id="team-office-filters">
|
|
<button className="filter-pill active" data-office="all" type="button" data-i18n="team.filter.all">Alle</button>
|
|
</div>
|
|
|
|
<div className="team-list" id="team-list" />
|
|
|
|
<div className="glossar-empty" id="team-empty" style="display:none">
|
|
<p data-i18n="team.empty">Keine Treffer.</p>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
|
|
<Footer />
|
|
<script src="/assets/team.js"></script>
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|