Auto-load selected source mailbox messages
This commit is contained in:
parent
2f337ee200
commit
561450662c
1 changed files with 65 additions and 13 deletions
|
|
@ -6,6 +6,7 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"html"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/mail"
|
||||
"net/url"
|
||||
|
|
@ -306,8 +307,10 @@ func emailBoxHandler(w http.ResponseWriter, r *http.Request) {
|
|||
switch kind {
|
||||
case "source":
|
||||
if r.Header.Get("HX-Request") == "true" {
|
||||
selected := selectedSourceAccount(accounts, r.URL.Query().Get("source"))
|
||||
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||
fmt.Fprint(w, renderEmailBoxSourcePane(accounts, r.URL.Query().Get("source")))
|
||||
fmt.Fprint(w, renderEmailBoxSourcePane(accounts, selected.Name))
|
||||
fmt.Fprintf(w, `<div id="list" hx-swap-oob="innerHTML">%s</div>`, renderInitialSourceMailboxList(selected))
|
||||
return
|
||||
}
|
||||
renderSourceEmailBoxPage(w, r, accounts, r.URL.Query().Get("source"))
|
||||
|
|
@ -847,6 +850,7 @@ func renderTransferPage(w http.ResponseWriter, r *http.Request, mode transferMod
|
|||
|
||||
func renderSourceEmailBoxPage(w http.ResponseWriter, r *http.Request, accounts []Account, selected string) {
|
||||
user := CurrentUser(r)
|
||||
selectedAccount := selectedSourceAccount(accounts, selected)
|
||||
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||
fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
|
|
@ -879,12 +883,12 @@ func renderSourceEmailBoxPage(w http.ResponseWriter, r *http.Request, accounts [
|
|||
<div class="three-pane email-box-view">
|
||||
<aside class="pane pane-tree" id="source-tree">%s</aside>
|
||||
<div class="pane-resizer" data-resize-index="0"></div>
|
||||
<section class="pane pane-list"><div class="pane-head">Nachrichten</div><div class="ef-empty">Quell-Postfach waehlen.</div></section>
|
||||
<section class="pane pane-list" id="list">%s</section>
|
||||
<div class="pane-resizer" data-resize-index="1"></div>
|
||||
<section class="pane pane-read"><div class="ef-empty">Nachricht waehlen.</div></section>
|
||||
</div>
|
||||
<footer class="statusbar"><span id="mig-status" hx-get="/migrate/status" hx-trigger="load,every 3s" hx-swap="innerHTML">bereit</span></footer></body></html>`,
|
||||
renderRibbonEmailBoxMenu("source"), renderRibbonTransferMenu(""), renderRibbonActions(false, user), renderEmailBoxSourcePane(accounts, selected))
|
||||
renderRibbonEmailBoxMenu("source"), renderRibbonTransferMenu(""), renderRibbonActions(false, user), renderEmailBoxSourcePane(accounts, selectedAccount.Name), renderInitialSourceMailboxList(selectedAccount))
|
||||
}
|
||||
|
||||
func renderTargetEmailBoxPage(w http.ResponseWriter, r *http.Request, accounts []Account) {
|
||||
|
|
@ -936,15 +940,7 @@ func renderEmailBoxSourcePane(accounts []Account, selected string) string {
|
|||
b.WriteString(`<div class="pane-head archive-head"><span>Quell-Postfach</span></div><div class="ef-empty">Keine Quell-Postfaecher eingetragen.</div>`)
|
||||
return b.String()
|
||||
}
|
||||
selectedAccount := sourceAccounts[0]
|
||||
if selected != "" {
|
||||
for _, a := range sourceAccounts {
|
||||
if a.Name == selected {
|
||||
selectedAccount = a
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
selectedAccount := selectedSourceAccount(accounts, selected)
|
||||
b.WriteString(`<div class="pane-head archive-head"><span>Quell-Postfach</span><form class="archive-select-form" hx-get="/boxes/source" hx-target="#source-tree" hx-swap="innerHTML" hx-trigger="change from:#source-mailbox-select"><select id="source-mailbox-select" class="archive-select" name="source">`)
|
||||
for _, a := range sourceAccounts {
|
||||
label := fmt.Sprintf("%s (%s)", a.SrcUser, strings.ToUpper(accountProto(a)))
|
||||
|
|
@ -959,6 +955,21 @@ func renderEmailBoxSourcePane(accounts []Account, selected string) string {
|
|||
return b.String()
|
||||
}
|
||||
|
||||
func selectedSourceAccount(accounts []Account, selected string) Account {
|
||||
sourceAccounts := accountsBySource(accounts)
|
||||
if len(sourceAccounts) == 0 {
|
||||
return Account{}
|
||||
}
|
||||
if selected != "" {
|
||||
for _, a := range sourceAccounts {
|
||||
if a.Name == selected {
|
||||
return a
|
||||
}
|
||||
}
|
||||
}
|
||||
return sourceAccounts[0]
|
||||
}
|
||||
|
||||
func renderSourceFolders(b *strings.Builder, account Account) {
|
||||
fmt.Fprintf(b, `<div class="tree-node account">%s</div>`, html.EscapeString(account.SrcUser))
|
||||
if accountProto(account) == "pop3" {
|
||||
|
|
@ -1003,7 +1014,48 @@ func fetchSourceFolderMessages(account Account, folder string) ([]RawMessage, er
|
|||
return src.Fetch(folder)
|
||||
}
|
||||
|
||||
func renderSourceMailboxMessageList(w http.ResponseWriter, account Account, folder string, messages []RawMessage) {
|
||||
func renderInitialSourceMailboxList(account Account) string {
|
||||
if account.Name == "" {
|
||||
return `<div class="pane-head">Nachrichten</div><div class="ef-empty">Quell-Postfach waehlen.</div>`
|
||||
}
|
||||
folder, err := firstSourceFolder(account)
|
||||
if err != nil {
|
||||
return fmt.Sprintf(`<div class="pane-head">Nachrichten</div><div class="ef-empty">%s</div>`, html.EscapeString(err.Error()))
|
||||
}
|
||||
messages, err := fetchSourceFolderMessages(account, folder)
|
||||
if err != nil {
|
||||
return fmt.Sprintf(`<div class="pane-head">Nachrichten</div><div class="ef-empty">%s</div>`, html.EscapeString(err.Error()))
|
||||
}
|
||||
var b strings.Builder
|
||||
renderSourceMailboxMessageList(&b, account, folder, messages)
|
||||
return b.String()
|
||||
}
|
||||
|
||||
func firstSourceFolder(account Account) (string, error) {
|
||||
if accountProto(account) == "pop3" {
|
||||
return "INBOX", nil
|
||||
}
|
||||
src, err := OpenIMAPSource(account)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer src.Close()
|
||||
folders, err := src.Folders()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
for _, folder := range folders {
|
||||
if strings.EqualFold(folder.Name, "INBOX") {
|
||||
return folder.Name, nil
|
||||
}
|
||||
}
|
||||
if len(folders) == 0 {
|
||||
return "", fmt.Errorf("Keine Ordner in diesem Quell-Postfach.")
|
||||
}
|
||||
return folders[0].Name, nil
|
||||
}
|
||||
|
||||
func renderSourceMailboxMessageList(w io.Writer, account Account, folder string, messages []RawMessage) {
|
||||
fmt.Fprintf(w, `<div class="pane-head">%s / %s (%d)</div>`, html.EscapeString(account.SrcUser), html.EscapeString(folder), len(messages))
|
||||
for i, raw := range messages {
|
||||
subject := "(ohne Betreff)"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue