Use source labels in viewer requests

This commit is contained in:
DonVoo 2026-07-06 00:14:13 +02:00
parent c771db0d94
commit cebb6e6ab2

View file

@ -18,7 +18,7 @@ import (
// Lesebereich. Optional Weiterleiten einzelner Mails per SMTP (09-smtp.go).
func viewerHandler(w http.ResponseWriter, r *http.Request) {
account := r.URL.Query().Get("account")
account := resolveViewerAccount(r.URL.Query().Get("account"), r.URL.Query().Get("source"))
folder := r.URL.Query().Get("folder")
q := strings.TrimSpace(r.URL.Query().Get("q"))
if account != "" && folder != "" {
@ -33,7 +33,7 @@ func viewerHandler(w http.ResponseWriter, r *http.Request) {
}
func messageHandler(w http.ResponseWriter, r *http.Request) {
account := r.URL.Query().Get("account")
account := resolveViewerAccount(r.URL.Query().Get("account"), r.URL.Query().Get("source"))
folder := r.URL.Query().Get("folder")
targetAccount := r.URL.Query().Get("target_account")
index, err := strconv.Atoi(r.URL.Query().Get("index"))
@ -65,7 +65,7 @@ func messageHandler(w http.ResponseWriter, r *http.Request) {
}
func targetMessageHandler(w http.ResponseWriter, r *http.Request) {
account := r.URL.Query().Get("account")
account := resolveViewerAccount(r.URL.Query().Get("account"), r.URL.Query().Get("source"))
folder := r.URL.Query().Get("folder")
targetAccount := r.URL.Query().Get("target_account")
index, err := strconv.Atoi(r.URL.Query().Get("index"))
@ -112,11 +112,12 @@ func renderViewerTree(w http.ResponseWriter) {
continue
}
found = true
fmt.Fprintf(w, `<div class="tree-node account">%s</div>`, html.EscapeString(sourceAccountLabel(account)))
source := sourceAccountLabel(account)
fmt.Fprintf(w, `<div class="tree-node account">%s</div>`, html.EscapeString(source))
for _, path := range mboxes {
folder := strings.TrimSuffix(filepath.Base(path), ".mbox")
fmt.Fprintf(w, `<a class="tree-node" href="#" hx-get="/view?account=%s&amp;folder=%s" hx-target="#list" hx-swap="innerHTML">%s</a>`,
urlEsc(account), urlEsc(folder), html.EscapeString(folder))
fmt.Fprintf(w, `<a class="tree-node" href="#" hx-get="/view?source=%s&amp;folder=%s" hx-target="#list" hx-swap="innerHTML">%s</a>`,
urlEsc(source), urlEsc(folder), html.EscapeString(folder))
}
}
if !found {
@ -142,11 +143,11 @@ func renderMessageList(w http.ResponseWriter, account, folder, q string) {
}
fmt.Fprintf(w, `<div class="pane-head">%s / %s (%d)</div>`, html.EscapeString(sourceAccountLabel(account)), html.EscapeString(folder), len(filtered))
fmt.Fprintf(w, `<form class="searchbar" hx-get="/view" hx-target="#list" hx-swap="innerHTML">
<input type="hidden" name="account" value="%s">
<input type="hidden" name="source" value="%s">
<input type="hidden" name="folder" value="%s">
<input class="input search-input" type="search" name="q" value="%s" placeholder="Suchen">
<button class="btn secondary search-btn" type="submit">Suchen</button>
</form>`, html.EscapeString(account), html.EscapeString(folder), html.EscapeString(q))
</form>`, html.EscapeString(sourceAccountLabel(account)), html.EscapeString(folder), html.EscapeString(q))
for _, entry := range filtered {
subject := entry.Subject
if subject == "" {
@ -156,8 +157,8 @@ func renderMessageList(w http.ResponseWriter, account, folder, q string) {
if from == "" {
from = "(ohne Absender)"
}
fmt.Fprintf(w, `<a class="msg-row" href="#" hx-get="/view/message?account=%s&amp;folder=%s&amp;index=%d" hx-include="#target-account-select" hx-target="#read" hx-swap="innerHTML"><span class="msg-from">%s</span><span class="msg-subject">%s</span><span class="msg-date">%s</span></a>`,
urlEsc(account), urlEsc(folder), entry.Index,
fmt.Fprintf(w, `<a class="msg-row" href="#" hx-get="/view/message?source=%s&amp;folder=%s&amp;index=%d" hx-include="#target-account-select" hx-target="#read" hx-swap="innerHTML"><span class="msg-from">%s</span><span class="msg-subject">%s</span><span class="msg-date">%s</span></a>`,
urlEsc(sourceAccountLabel(account)), urlEsc(folder), entry.Index,
html.EscapeString(from), html.EscapeString(subject), html.EscapeString(entry.Date))
}
if len(entries) == 0 {
@ -336,11 +337,11 @@ func renderTargetAccountSelect(account, folder, selected string, index int) stri
fmt.Fprintf(&b, ` hx-get="/view/target" hx-target="#read-target" hx-swap="innerHTML" hx-trigger="change from:#target-account-select"`)
}
fmt.Fprintf(&b, `>
<input type="hidden" name="account" value="%s">
<input type="hidden" name="source" value="%s">
<input type="hidden" name="folder" value="%s">
<input type="hidden" name="index" value="%d">
<select id="target-account-select" name="target_account" class="target-select">
<option value="">Automatisch</option>`, html.EscapeString(account), html.EscapeString(folder), index)
<option value="">Automatisch</option>`, html.EscapeString(sourceAccountLabel(account)), html.EscapeString(folder), index)
for _, opt := range options {
attr := ""
if opt.Value == selected {
@ -393,6 +394,22 @@ func sourceAccountLabel(mboxDir string) string {
return mboxDir
}
func resolveViewerAccount(account, source string) string {
if strings.TrimSpace(account) != "" {
return account
}
source = strings.TrimSpace(source)
if source == "" {
return ""
}
for dir, label := range accountLabels() {
if strings.EqualFold(label.SourceLabel, source) {
return dir
}
}
return source
}
func accountLabels() map[string]viewerAccount {
out := map[string]viewerAccount{}
if DB == nil {