From 0bb49019b6e4f766527e55ccb76859226a70a11e Mon Sep 17 00:00:00 2001 From: DonVoo Date: Mon, 13 Jul 2026 02:04:50 +0200 Subject: [PATCH] Show current user in top bar --- backend/00-router.go | 81 +++++++++++++++++++++----------------- backend/03-auth.go | 6 +-- backend/08-viewer.go | 2 +- frontend-js/dist/style.css | 8 ++++ 4 files changed, 56 insertions(+), 41 deletions(-) diff --git a/backend/00-router.go b/backend/00-router.go index d561b28..928d37b 100644 --- a/backend/00-router.go +++ b/backend/00-router.go @@ -59,8 +59,8 @@ func renderStartPage(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, ` Mail-Graveyard - - + +
@@ -94,21 +94,22 @@ func renderStartPage(w http.ResponseWriter, r *http.Request) {
bereit
-`, renderRibbonEmailBoxMenu("home"), renderRibbonTransferMenu(""), renderRibbonActions(false), html.EscapeString(userDisplayLabel(user))) +`, renderRibbonEmailBoxMenu("home"), renderRibbonTransferMenu(""), renderRibbonActions(false, user), html.EscapeString(userDisplayLabel(user))) } // renderShell ist das Grundgeruest im Outlook-2013-Look: // // [ Ribbon: Email-Box | Mail-Transfer | Einstellungen | Mail-Graveyard ] // [ Archiv-mbox | Nachrichtenliste | Quelle/Target ] -func renderShell(w http.ResponseWriter, active, readingPane string) { +func renderShell(w http.ResponseWriter, r *http.Request, active, readingPane string) { + user := CurrentUser(r) w.Header().Set("Content-Type", "text/html; charset=utf-8") fmt.Fprintf(w, ` Mail-Graveyard - + - +
@@ -147,7 +148,7 @@ func renderShell(w http.ResponseWriter, active, readingPane string) {
bereit
-`, renderRibbonEmailBoxMenu("archive"), renderRibbonTransferMenu(""), renderRibbonActions(false), renderInitialReadPane(readingPane)) +`, renderRibbonEmailBoxMenu("archive"), renderRibbonTransferMenu(""), renderRibbonActions(false, user), renderInitialReadPane(readingPane)) } func accountsHandler(w http.ResponseWriter, r *http.Request) { @@ -168,7 +169,7 @@ func accountsHandler(w http.ResponseWriter, r *http.Request) { return } } - renderAccountsPage(w, accounts, edit, r.URL.Query().Get("msg"), r.URL.Query().Get("err")) + renderAccountsPage(w, r, accounts, edit, r.URL.Query().Get("msg"), r.URL.Query().Get("err")) } func accountSaveHandler(w http.ResponseWriter, r *http.Request) { @@ -252,7 +253,7 @@ func archivesHandler(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) return } - renderArchivesPage(w, archiveMailboxes(accounts), accounts, r.URL.Query().Get("msg"), r.URL.Query().Get("err")) + renderArchivesPage(w, r, archiveMailboxes(accounts), accounts, r.URL.Query().Get("msg"), r.URL.Query().Get("err")) } func transferHandler(w http.ResponseWriter, r *http.Request) { @@ -269,7 +270,7 @@ func transferHandler(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) return } - renderTransferPage(w, transferModeBySlug(mode), accounts, archiveMailboxes(accounts)) + renderTransferPage(w, r, transferModeBySlug(mode), accounts, archiveMailboxes(accounts)) } func emailBoxHandler(w http.ResponseWriter, r *http.Request) { @@ -281,9 +282,9 @@ func emailBoxHandler(w http.ResponseWriter, r *http.Request) { kind := strings.TrimPrefix(r.URL.Path, "/boxes/") switch kind { case "source": - renderSourceEmailBoxPage(w, accounts) + renderSourceEmailBoxPage(w, r, accounts) case "target": - renderTargetEmailBoxPage(w, accounts) + renderTargetEmailBoxPage(w, r, accounts) default: http.Redirect(w, r, "/view", http.StatusSeeOther) } @@ -541,7 +542,8 @@ func userToggleActiveHandler(w http.ResponseWriter, r *http.Request) { redirectUsers(w, r, username, "Benutzer aktiviert.") } -func renderAccountsPage(w http.ResponseWriter, accounts []Account, edit Account, msg, errMsg string) { +func renderAccountsPage(w http.ResponseWriter, r *http.Request, accounts []Account, edit Account, msg, errMsg string) { + user := CurrentUser(r) if edit.Name == "" { edit = Account{SrcPort: 993, SrcSecurity: "tls", SrcProto: "imap", DstPort: 993, DstSecurity: "tls", Active: true} } @@ -550,9 +552,9 @@ func renderAccountsPage(w http.ResponseWriter, accounts []Account, edit Account, fmt.Fprintf(w, ` Konten-Verwaltung - Mail-Graveyard - + - +
@@ -575,7 +577,7 @@ func renderAccountsPage(w http.ResponseWriter, accounts []Account, edit Account, Logout -
`, renderRibbonEmailBoxMenu(""), renderRibbonTransferMenu(""), renderRibbonActions(false)) +
`, renderRibbonEmailBoxMenu(""), renderRibbonTransferMenu(""), renderRibbonActions(false, user)) if msg != "" { fmt.Fprintf(w, `
%s
`, html.EscapeString(msg)) } @@ -589,14 +591,15 @@ func renderAccountsPage(w http.ResponseWriter, accounts []Account, edit Account, fmt.Fprint(w, `
bereit
`) } -func renderArchivesPage(w http.ResponseWriter, archives []string, accounts []Account, msg, errMsg string) { +func renderArchivesPage(w http.ResponseWriter, r *http.Request, archives []string, accounts []Account, msg, errMsg string) { + user := CurrentUser(r) w.Header().Set("Content-Type", "text/html; charset=utf-8") fmt.Fprintf(w, ` Archiv-mbox Verwaltung - Mail-Graveyard - + - +
@@ -619,7 +622,7 @@ func renderArchivesPage(w http.ResponseWriter, archives []string, accounts []Acc Logout -
`, renderRibbonEmailBoxMenu(""), renderRibbonTransferMenu(""), renderRibbonActions(false)) +
`, renderRibbonEmailBoxMenu(""), renderRibbonTransferMenu(""), renderRibbonActions(false, user)) if msg != "" { fmt.Fprintf(w, `
%s
`, html.EscapeString(msg)) } @@ -641,9 +644,9 @@ func renderUsersPage(w http.ResponseWriter, r *http.Request, users []AppUser, ed fmt.Fprintf(w, ` Benutzerverwaltung - Mail-Graveyard - + - +
@@ -666,7 +669,7 @@ func renderUsersPage(w http.ResponseWriter, r *http.Request, users []AppUser, ed Logout -
`, renderRibbonEmailBoxMenu(""), renderRibbonTransferMenu(""), renderRibbonActions(true)) +
`, renderRibbonEmailBoxMenu(""), renderRibbonTransferMenu(""), renderRibbonActions(true, CurrentUser(r))) if msg != "" { fmt.Fprintf(w, `
%s
`, html.EscapeString(msg)) } @@ -705,14 +708,15 @@ func transferModeBySlug(slug string) transferMode { return modes[0] } -func renderTransferPage(w http.ResponseWriter, mode transferMode, accounts []Account, archives []string) { +func renderTransferPage(w http.ResponseWriter, r *http.Request, mode transferMode, accounts []Account, archives []string) { + user := CurrentUser(r) w.Header().Set("Content-Type", "text/html; charset=utf-8") fmt.Fprintf(w, ` %s - Mail-Graveyard - + - +
@@ -740,19 +744,20 @@ func renderTransferPage(w http.ResponseWriter, mode transferMode, accounts []Acc
bereit
`, - html.EscapeString(mode.Title), renderRibbonEmailBoxMenu(""), renderRibbonTransferMenu(mode.Slug), renderRibbonActions(false), transferMenuItems(mode.Slug), + html.EscapeString(mode.Title), renderRibbonEmailBoxMenu(""), renderRibbonTransferMenu(mode.Slug), renderRibbonActions(false, user), transferMenuItems(mode.Slug), html.EscapeString(mode.LeftTitle), renderTransferPicker(mode.LeftKind, accounts, archives), html.EscapeString(mode.RightTitle), renderTransferPicker(mode.RightKind, accounts, archives)) } -func renderSourceEmailBoxPage(w http.ResponseWriter, accounts []Account) { +func renderSourceEmailBoxPage(w http.ResponseWriter, r *http.Request, accounts []Account) { + user := CurrentUser(r) w.Header().Set("Content-Type", "text/html; charset=utf-8") fmt.Fprintf(w, ` Quell-Postfach - Mail-Graveyard - + - +
@@ -783,17 +788,18 @@ func renderSourceEmailBoxPage(w http.ResponseWriter, accounts []Account) {
Nachricht waehlen.
bereit
`, - renderRibbonEmailBoxMenu("source"), renderRibbonTransferMenu(""), renderRibbonActions(false), renderEmailBoxSourcePane(accounts)) + renderRibbonEmailBoxMenu("source"), renderRibbonTransferMenu(""), renderRibbonActions(false, user), renderEmailBoxSourcePane(accounts)) } -func renderTargetEmailBoxPage(w http.ResponseWriter, accounts []Account) { +func renderTargetEmailBoxPage(w http.ResponseWriter, r *http.Request, accounts []Account) { + user := CurrentUser(r) w.Header().Set("Content-Type", "text/html; charset=utf-8") fmt.Fprintf(w, ` Ziel-Postfach - Mail-Graveyard - + - +
@@ -824,7 +830,7 @@ func renderTargetEmailBoxPage(w http.ResponseWriter, accounts []Account) {
bereit
`, - renderRibbonEmailBoxMenu("target"), renderRibbonTransferMenu(""), renderRibbonActions(false), renderEmailBoxTargetPane(accounts)) + renderRibbonEmailBoxMenu("target"), renderRibbonTransferMenu(""), renderRibbonActions(false, user), renderEmailBoxTargetPane(accounts)) } func renderEmailBoxSourcePane(accounts []Account) string { @@ -947,12 +953,13 @@ func renderRibbonEmailBoxMenu(active string) string { return b.String() } -func renderRibbonActions(settingsActive bool) string { +func renderRibbonActions(settingsActive bool, user AppUser) string { settingsClass := "ribbon-icon" if settingsActive { settingsClass += " active" } - return fmt.Sprintf(`
`, settingsClass) + return fmt.Sprintf(`
%s`, + html.EscapeString(user.Username), html.EscapeString(userDisplayName(user)), settingsClass) } func renderRibbonTransferMenu(active string) string { diff --git a/backend/03-auth.go b/backend/03-auth.go index aab4a42..659bb2d 100644 --- a/backend/03-auth.go +++ b/backend/03-auth.go @@ -239,7 +239,7 @@ func renderLoginPage(w http.ResponseWriter, errMsg string) { fmt.Fprintf(w, ` Login - Mail-Graveyard - +
@@ -259,7 +259,7 @@ func renderForgotPasswordPage(w http.ResponseWriter, msg string) { fmt.Fprintf(w, ` Passwort vergessen - Mail-Graveyard - +
@@ -278,7 +278,7 @@ func renderResetPasswordPage(w http.ResponseWriter, token, errMsg string) { fmt.Fprintf(w, ` Passwort setzen - Mail-Graveyard - +
diff --git a/backend/08-viewer.go b/backend/08-viewer.go index 4b3494a..0a237ad 100644 --- a/backend/08-viewer.go +++ b/backend/08-viewer.go @@ -31,7 +31,7 @@ func viewerHandler(w http.ResponseWriter, r *http.Request) { renderViewerTree(w, account) return } - renderShell(w, "", `
Backup-Postfach links waehlen.
`) + renderShell(w, r, "", `
Backup-Postfach links waehlen.
`) } func messageHandler(w http.ResponseWriter, r *http.Request) { diff --git a/frontend-js/dist/style.css b/frontend-js/dist/style.css index d8b70fd..dc0a07b 100644 --- a/frontend-js/dist/style.css +++ b/frontend-js/dist/style.css @@ -70,6 +70,14 @@ body.ol2013 { z-index: 20; } .ribbon-spacer { margin-left: auto; } +.ribbon-user { + color: #fff; + max-width: 220px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-weight: 600; +} .ribbon-icon { width: 32px; height: 32px;