diff --git a/frontend/src/admin.tsx b/frontend/src/admin.tsx index 6669932..85b0b65 100644 --- a/frontend/src/admin.tsx +++ b/frontend/src/admin.tsx @@ -23,7 +23,7 @@ const PLANNED: PlannedCard[] = [ icon: ICON_BUILDING, i18nTitle: "admin.card.departments.title", i18nDesc: "admin.card.departments.desc", - fallbackTitle: "Departments / Dezernate", + fallbackTitle: "Dezernate", fallbackDesc: "Dezernate anlegen und Mitglieder verwalten.", }, { diff --git a/frontend/src/appointments.tsx b/frontend/src/appointments.tsx index 6ecfbdb..fdb51cc 100644 --- a/frontend/src/appointments.tsx +++ b/frontend/src/appointments.tsx @@ -72,9 +72,9 @@ export function renderAppointments(): string { - + diff --git a/frontend/src/client/i18n.ts b/frontend/src/client/i18n.ts index 6eb8895..39e29fb 100644 --- a/frontend/src/client/i18n.ts +++ b/frontend/src/client/i18n.ts @@ -526,14 +526,14 @@ const translations: Record> = { "fristen.summary.upcoming": "Sp\u00e4ter", "fristen.summary.completed": "Erledigt", "fristen.filter.status": "Status", - "fristen.filter.akte": "Akte", + "fristen.filter.akte": "Projekt", "fristen.filter.all": "Alle (offen & erledigt)", "fristen.filter.pending": "Alle offenen", "fristen.filter.overdue": "\u00dcberf\u00e4llig", "fristen.filter.thisweek": "Diese Woche", "fristen.filter.upcoming": "Sp\u00e4ter", "fristen.filter.completed": "Erledigt", - "fristen.filter.akte.all": "Alle Akten", + "fristen.filter.akte.all": "Alle Projekte", "fristen.col.due": "F\u00e4llig", "fristen.col.title": "Titel", "fristen.col.akte": "Akte", @@ -743,7 +743,7 @@ const translations: Record> = { "onboarding.office.placeholder": "Bitte ausw\u00e4hlen", "onboarding.job_title": "Berufsbezeichnung", "onboarding.job_title.placeholder": "z.B. Associate, Partner, PA", - "onboarding.dezernat": "Dezernat / Partner", + "onboarding.dezernat": "Dezernat oder Partner", "onboarding.dezernat.placeholder": "z.B. Dr. M\u00fcller, Team Schmidt", "onboarding.optional": "(optional)", "onboarding.submit": "Profil anlegen", @@ -866,7 +866,7 @@ const translations: Record> = { "projekte.submit": "Projekt anlegen", "projekte.neu.title": "Neues Projekt \u2014 Paliad", "projekte.neu.heading": "Neues Projekt anlegen", - "projekte.neu.subtitle": "Mandant, Streitsache, Patent, Verfahren oder generisches Projekt \u2014 hierarchisch einordnen. Sichtbarkeit folgt dem Team (Sie werden als \u201eLead\u201c automatisch hinzugef\u00fcgt).", + "projekte.neu.subtitle": "Mandant, Streitsache, Patent, Verfahren oder generisches Projekt \u2014 hierarchisch einordnen. Sichtbarkeit folgt dem Team (Sie werden als \u201eLeitung\u201c automatisch hinzugef\u00fcgt).", "projekte.field.type": "Typ", "projekte.field.parent": "\u00dcbergeordnetes Projekt", "projekte.field.parent.placeholder": "Titel eingeben, um ein \u00dcberprojekt zu suchen...", @@ -955,7 +955,7 @@ const translations: Record> = { "projekte.type.patent": "Patent", "projekte.type.case": "Verfahren", "projekte.type.project": "Projekt", - "projekte.team.role.lead": "Lead", + "projekte.team.role.lead": "Leitung", "projekte.team.role.associate": "Associate", "projekte.team.role.pa": "PA", "projekte.team.role.of_counsel": "Of Counsel", @@ -983,7 +983,7 @@ const translations: Record> = { "einstellungen.profil.office": "B\u00fcro", "einstellungen.profil.job_title": "Berufsbezeichnung", "einstellungen.profil.job_title.placeholder": "z.B. Associate, Partner, PA", - "einstellungen.profil.dezernat": "Dezernat / Partner", + "einstellungen.profil.dezernat": "Dezernat oder Partner", "einstellungen.profil.dezernat.placeholder": "z.B. Dr. M\u00fcller, Team Schmidt", "einstellungen.profil.lang": "Sprache", "einstellungen.profil.lang.de": "Deutsch", @@ -1029,8 +1029,8 @@ const translations: Record> = { "termine.summary.later": "Sp\u00e4ter", "termine.filter.type": "Typ", "termine.filter.type.all": "Alle Typen", - "termine.filter.akte": "Akte", - "termine.filter.akte.all": "Alle Akten & pers\u00f6nlich", + "termine.filter.akte": "Projekt", + "termine.filter.akte.all": "Alle Projekte & pers\u00f6nlich", "termine.filter.akte.personal": "Nur pers\u00f6nliche", "termine.filter.from": "Von", "termine.filter.to": "Bis", @@ -1196,7 +1196,7 @@ const translations: Record> = { "admin.coming_soon": "Kommt bald", "admin.card.team.title": "Team-Verwaltung", "admin.card.team.desc": "Benutzer:innen anlegen, bearbeiten, löschen.", - "admin.card.departments.title": "Departments / Dezernate", + "admin.card.departments.title": "Dezernate", "admin.card.departments.desc": "Dezernate anlegen und Mitglieder verwalten.", "admin.card.audit.title": "Audit-Log", "admin.card.audit.desc": "Wer hat wann was geändert? Nachvollziehbarkeit für sicherheitsrelevante Aktionen.", @@ -1241,8 +1241,8 @@ const translations: Record> = { "admin.team.direct_add.job_title": "Berufsbezeichnung", "admin.team.direct_add.dezernat": "Dezernat (optional)", "admin.team.permission.standard": "Standard", - "admin.team.permission.global_admin": "Global Admin", - "admin.team.permission.last_admin": "Der letzte Global Admin kann nicht degradiert werden.", + "admin.team.permission.global_admin": "Globaler Admin", + "admin.team.permission.last_admin": "Der letzte globale Admin kann nicht degradiert werden.", "admin.team.direct_add.cancel": "Abbrechen", "admin.team.direct_add.submit": "Anlegen", @@ -2435,7 +2435,7 @@ const translations: Record> = { "admin.coming_soon": "Coming soon", "admin.card.team.title": "Team Management", "admin.card.team.desc": "Create, edit and delete user accounts.", - "admin.card.departments.title": "Departments / Dezernate", + "admin.card.departments.title": "Dezernate", "admin.card.departments.desc": "Create departments and manage their members.", "admin.card.audit.title": "Audit Log", "admin.card.audit.desc": "Who changed what, and when. Traceability for security-relevant actions.", diff --git a/frontend/src/client/project-form.ts b/frontend/src/client/project-form.ts index 2320aff..1da46e5 100644 --- a/frontend/src/client/project-form.ts +++ b/frontend/src/client/project-form.ts @@ -110,10 +110,10 @@ export function initParentPicker() { }); } -// wireTypeChange wires the change handler and runs // the visibility pass once with the current value. export function wireTypeChange() { - const typeSel = $("projekt-type") as HTMLSelectElement; + const typeSel = $("project-type") as HTMLSelectElement; showFieldsForType(typeSel.value); typeSel.addEventListener("change", () => showFieldsForType(typeSel.value)); } @@ -131,7 +131,7 @@ export function readPayload( msg: HTMLElement, opts: { omitEmpty: boolean; mode: "create" | "edit" }, ): Record | null { - const type = ($("projekt-type") as HTMLSelectElement).value; + const type = ($("project-type") as HTMLSelectElement).value; const title = ($("project-title") as HTMLInputElement).value.trim(); if (!title) { msg.textContent = t("projekte.error.title_required") || "Title required"; @@ -198,7 +198,7 @@ export function prefillForm(p: Record) { const getTA = (id: string) => $(id) as HTMLTextAreaElement; const type = String(p.type ?? "project"); - getSel("projekt-type").value = type; + getSel("project-type").value = type; showFieldsForType(type); get("project-title").value = String(p.title ?? ""); diff --git a/frontend/src/client/projects-detail.ts b/frontend/src/client/projects-detail.ts index c4279ad..a87ff71 100644 --- a/frontend/src/client/projects-detail.ts +++ b/frontend/src/client/projects-detail.ts @@ -774,7 +774,7 @@ function openEditModal() { // Type changes are allowed (t-paliad-056). Wire the warning that lists // which fields will be NULL'd server-side when the user picks a new // type. - const typeSel = document.getElementById("projekt-type") as HTMLSelectElement | null; + const typeSel = document.getElementById("project-type") as HTMLSelectElement | null; if (typeSel) { typeSel.disabled = false; typeSel.onchange = () => { @@ -817,7 +817,7 @@ const TYPE_SPECIFIC_FIELDS: Record = { function renderTypeChangeWarning() { const wrap = document.getElementById("project-edit-type-warning") as HTMLDivElement | null; const fieldsSpan = document.getElementById("project-edit-type-warning-fields") as HTMLSpanElement | null; - const typeSel = document.getElementById("projekt-type") as HTMLSelectElement | null; + const typeSel = document.getElementById("project-type") as HTMLSelectElement | null; if (!wrap || !fieldsSpan || !typeSel || !project) return; const newType = typeSel.value; @@ -1238,9 +1238,10 @@ function renderTeam() { !m.inherited && canRemoveTeamMember(m) ? `` : ""; + const officeLabel = m.user_office ? t("office." + m.user_office) || m.user_office : ""; return ` ${esc(m.user_display_name || m.user_email)} - · ${esc(m.user_email)}${m.user_office ? " · " + esc(m.user_office) : ""} + · ${esc(m.user_email)}${officeLabel ? " · " + esc(officeLabel) : ""} ${esc(roleLabel)} ${source} ${removeBtn} diff --git a/frontend/src/client/projects-new.ts b/frontend/src/client/projects-new.ts index ec8e372..273df32 100644 --- a/frontend/src/client/projects-new.ts +++ b/frontend/src/client/projects-new.ts @@ -60,7 +60,7 @@ async function applyParentFromQueryString() { ($("projekt-parent-id") as HTMLInputElement).value = p.id; ($("projekt-parent-input") as HTMLInputElement).value = p.title; // Default to 'case' under a non-root parent; user can override. - const typeSel = $("projekt-type") as HTMLSelectElement; + const typeSel = $("project-type") as HTMLSelectElement; if (typeSel.value === "client") { typeSel.value = "case"; showFieldsForType(typeSel.value); diff --git a/frontend/src/client/projects.ts b/frontend/src/client/projects.ts index d862f6f..3d87e7a 100644 --- a/frontend/src/client/projects.ts +++ b/frontend/src/client/projects.ts @@ -176,9 +176,9 @@ function initSearch() { } function initFilters() { - const typeSel = document.getElementById("projekt-type") as HTMLSelectElement; - const status = document.getElementById("akten-status") as HTMLSelectElement; - const view = document.getElementById("projekt-view") as HTMLSelectElement; + const typeSel = document.getElementById("project-type") as HTMLSelectElement; + const status = document.getElementById("project-status") as HTMLSelectElement; + const view = document.getElementById("project-view") as HTMLSelectElement; typeSel.addEventListener("change", () => { typeFilter = typeSel.value; render(); diff --git a/frontend/src/components/ProjectFormFields.tsx b/frontend/src/components/ProjectFormFields.tsx index 48cd175..ecfc990 100644 --- a/frontend/src/components/ProjectFormFields.tsx +++ b/frontend/src/components/ProjectFormFields.tsx @@ -13,8 +13,8 @@ export function ProjectFormFields(): string { return (
- - diff --git a/frontend/src/deadlines.tsx b/frontend/src/deadlines.tsx index 654678c..3e97767 100644 --- a/frontend/src/deadlines.tsx +++ b/frontend/src/deadlines.tsx @@ -78,9 +78,9 @@ export function renderDeadlines(): string { - +
diff --git a/frontend/src/projects.tsx b/frontend/src/projects.tsx index 26058ff..01f6776 100644 --- a/frontend/src/projects.tsx +++ b/frontend/src/projects.tsx @@ -58,8 +58,8 @@ export function renderProjects(): string {
- - @@ -68,16 +68,16 @@ export function renderProjects(): string { - - - - diff --git a/frontend/src/settings.tsx b/frontend/src/settings.tsx index 914648a..ae0ea5a 100644 --- a/frontend/src/settings.tsx +++ b/frontend/src/settings.tsx @@ -102,7 +102,7 @@ export function renderSettings(): string {