From 8dae0986599b93200f0dd4380a95b2a25ed0dfa2 Mon Sep 17 00:00:00 2001 From: DonVoo Date: Mon, 6 Jul 2026 14:45:08 +0200 Subject: [PATCH] Add source and target pane selectors --- backend/08-viewer.go | 50 +++++++++++++++++++++++++++++++++----- frontend-js/dist/style.css | 16 ++++++++++++ 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/backend/08-viewer.go b/backend/08-viewer.go index d064e69..3c7d4cc 100644 --- a/backend/08-viewer.go +++ b/backend/08-viewer.go @@ -210,8 +210,9 @@ func renderReadPane(w io.Writer, title, account, folder, targetAccount string, i if subject == "" { subject = "(ohne Betreff)" } - fmt.Fprintf(w, `
%s

%s

Von: %s
Datum: %s
%s
`, - html.EscapeString(title), urlEsc(sourceDisplayLabel(account)), urlEsc(folder), index, urlEsc(targetAccount), html.EscapeString(subject), html.EscapeString(from), html.EscapeString(date), html.EscapeString(body)) + fmt.Fprint(w, renderSourcePaneHead(account, folder, targetAccount, index)) + fmt.Fprintf(w, `

%s

Von: %s
Datum: %s
%s
`, + html.EscapeString(subject), html.EscapeString(from), html.EscapeString(date), html.EscapeString(body)) } func renderTargetPane(account, folder, targetAccount string, index int, raw []byte, note string) string { @@ -258,7 +259,7 @@ func renderTargetMatch(b *strings.Builder, match forwardedMatch) { } func renderInitialTargetPane() string { - return `
Quelle
Nachricht waehlen.
` + return `
Nachricht waehlen.
` } func renderReadContent(w io.Writer, subject, from, date, body string) { @@ -434,7 +435,8 @@ func messageIDHeader(raw []byte) string { func renderTargetAccountSelect(account, folder, selected string, index int) string { options := targetAccountOptions() var b strings.Builder - fmt.Fprintf(&b, `
Target
= 0 { fmt.Fprintf(&b, ` hx-get="/view/target" hx-target="#read" hx-swap="innerHTML" hx-trigger="change from:#target-account-select"`) } @@ -451,8 +453,7 @@ func renderTargetAccountSelect(account, folder, selected string, index int) stri } fmt.Fprintf(&b, ``, html.EscapeString(opt.Value), attr, html.EscapeString(opt.Label)) } - fmt.Fprintf(&b, `
`, - urlEsc(sourceDisplayLabel(account)), urlEsc(folder), index, urlEsc(selected)) + b.WriteString(``) if account != "" && folder != "" && index >= 0 { fmt.Fprintf(&b, `
Mail hier ablegen fuer manuellen Umzug
`, html.EscapeString(sourceDisplayLabel(account)), html.EscapeString(folder), index) @@ -460,6 +461,26 @@ func renderTargetAccountSelect(account, folder, selected string, index int) stri return b.String() } +func renderSourcePaneHead(account, folder, targetAccount string, index int) string { + var b strings.Builder + fmt.Fprintf(&b, `
+ + + +
`) + return b.String() +} + func appendManualTargetCopy(account, folder, targetAccount string, raw []byte) (string, error) { id := messageIDHeader(raw) if id == "" { @@ -659,6 +680,23 @@ func targetAccountOptions() []targetAccountOption { return out } +func sourceAccountOptions() []targetAccountOption { + accounts := viewerAccounts() + out := make([]targetAccountOption, 0, len(accounts)) + for _, a := range accounts { + value := a.DisplayLabel + if value == "" { + value = a.Name + } + label := a.SourceLabel + if label == "" { + label = value + } + out = append(out, targetAccountOption{Value: value, Label: label}) + } + return out +} + func targetMboxDirs(targetUser string) map[string]bool { out := map[string]bool{} if targetUser == "" || DB == nil { diff --git a/frontend-js/dist/style.css b/frontend-js/dist/style.css index ef75f72..828dab6 100644 --- a/frontend-js/dist/style.css +++ b/frontend-js/dist/style.css @@ -88,6 +88,22 @@ body.resizing { cursor: col-resize; user-select: none; } align-items: center; gap: 10px; } +.mode-head { + display: grid; + grid-template-columns: auto minmax(0, 1fr); + align-items: center; + gap: 10px; +} +.mode-switch { + display: flex; + align-items: center; + gap: 4px; + min-width: 0; +} +.mode-switch .btn.active { + background: var(--ol-blue); + color: #fff; +} .target-select-form { margin: 0; min-width: 0; } .target-select { width: 100%;