Polish five pane transfer defaults

This commit is contained in:
DonVoo 2026-07-13 09:06:07 +02:00
parent 4f0493b5c2
commit c7f6750d6c
2 changed files with 53 additions and 12 deletions

View file

@ -859,6 +859,8 @@ func transferModeBySlug(slug string) transferMode {
func renderTransferPage(w http.ResponseWriter, r *http.Request, mode transferMode, accounts []Account, archives []string) { func renderTransferPage(w http.ResponseWriter, r *http.Request, mode transferMode, accounts []Account, archives []string) {
user := CurrentUser(r) user := CurrentUser(r)
leftSelected := defaultTransferValue(mode.LeftKind, accounts, archives)
rightSelected := defaultTransferValue(mode.RightKind, accounts, archives)
w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Header().Set("Content-Type", "text/html; charset=utf-8")
fmt.Fprintf(w, `<!doctype html><html lang="de"><head><meta 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"> <meta name="viewport" content="width=device-width,initial-scale=1">
@ -889,16 +891,17 @@ func renderTransferPage(w http.ResponseWriter, r *http.Request, mode transferMod
<main class="transfer-workbench"> <main class="transfer-workbench">
<aside class="pane pane-tree" id="left-folders">%s</aside> <aside class="pane pane-tree" id="left-folders">%s</aside>
<section class="pane pane-list" id="left-list">%s</section> <section class="pane pane-list" id="left-list">%s</section>
<section class="pane pane-read" id="transfer-preview"><div class="pane-head mode-head"><span class="mode-label">Vorschau</span></div><div class="read-body"><div class="ef-empty">Nachricht links oder rechts waehlen.</div></div></section> <section class="pane pane-read" id="transfer-preview">%s</section>
<section class="pane pane-list" id="right-list">%s</section> <section class="pane pane-list" id="right-list">%s</section>
<aside class="pane pane-tree" id="right-folders">%s</aside> <aside class="pane pane-tree" id="right-folders">%s</aside>
</main> </main>
<footer class="statusbar"><span id="mig-status" hx-get="/migrate/status" hx-trigger="load,every 3s" hx-swap="innerHTML">bereit</span></footer></body></html>`, <footer class="statusbar"><span id="mig-status" hx-get="/migrate/status" hx-trigger="load,every 3s" hx-swap="innerHTML">bereit</span></footer></body></html>`,
html.EscapeString(mode.Title), renderRibbonEmailBoxMenu(""), renderRibbonTransferMenu(mode.Slug), renderRibbonActions(false, user), transferMenuItems(mode.Slug), html.EscapeString(mode.Title), renderRibbonEmailBoxMenu(""), renderRibbonTransferMenu(mode.Slug), renderRibbonActions(false, user), transferMenuItems(mode.Slug),
renderTransferFolderPane("left", mode.LeftKind, accounts, archives, ""), renderTransferFolderPane("left", mode.LeftKind, accounts, archives, leftSelected),
renderInitialTransferList("left", mode.LeftKind, accounts, archives, ""), renderInitialTransferList("left", mode.LeftKind, accounts, archives, leftSelected),
renderInitialTransferList("right", mode.RightKind, accounts, archives, ""), renderInitialTransferPreview(mode.LeftKind, leftSelected, mode.RightKind, rightSelected),
renderTransferFolderPane("right", mode.RightKind, accounts, archives, "")) renderInitialTransferList("right", mode.RightKind, accounts, archives, rightSelected),
renderTransferFolderPane("right", mode.RightKind, accounts, archives, rightSelected))
} }
func transferSideHandler(w http.ResponseWriter, r *http.Request) { func transferSideHandler(w http.ResponseWriter, r *http.Request) {
@ -918,7 +921,7 @@ func transferSideHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Header().Set("Content-Type", "text/html; charset=utf-8")
fmt.Fprint(w, renderTransferFolderPane(side, kind, accounts, archives, value)) fmt.Fprint(w, renderTransferFolderPane(side, kind, accounts, archives, value))
fmt.Fprintf(w, `<div id="%s-list" hx-swap-oob="innerHTML">%s</div>`, side, renderInitialTransferList(side, kind, accounts, archives, value)) fmt.Fprintf(w, `<div id="%s-list" hx-swap-oob="innerHTML">%s</div>`, side, renderInitialTransferList(side, kind, accounts, archives, value))
fmt.Fprint(w, `<div id="transfer-preview" hx-swap-oob="innerHTML"><div class="pane-head mode-head"><span class="mode-label">Vorschau</span></div><div class="read-body"><div class="ef-empty">Nachricht links oder rechts waehlen.</div></div></div>`) fmt.Fprintf(w, `<div id="transfer-preview" hx-swap-oob="innerHTML">%s</div>`, renderInitialTransferPreview(kind, value, "", ""))
} }
func transferMessagesHandler(w http.ResponseWriter, r *http.Request) { func transferMessagesHandler(w http.ResponseWriter, r *http.Request) {
@ -951,6 +954,14 @@ func transferSide(value string) string {
return "left" return "left"
} }
func defaultTransferValue(kind string, accounts []Account, archives []string) string {
options := transferEntityOptions(kind, accounts, archives)
if len(options) == 0 {
return ""
}
return options[0].Value
}
func renderTransferFolderPane(side, kind string, accounts []Account, archives []string, selected string) string { func renderTransferFolderPane(side, kind string, accounts []Account, archives []string, selected string) string {
options := transferEntityOptions(kind, accounts, archives) options := transferEntityOptions(kind, accounts, archives)
if selected == "" && len(options) > 0 { if selected == "" && len(options) > 0 {
@ -1093,11 +1104,33 @@ func renderInitialTransferList(side, kind string, accounts []Account, archives [
} }
folder, err := firstTransferFolder(kind, selected) folder, err := firstTransferFolder(kind, selected)
if err != nil { if err != nil {
return fmt.Sprintf(`<div class="pane-head">Nachrichten</div><div class="ef-empty">%s</div>`, html.EscapeString(err.Error())) return fmt.Sprintf(`<div class="pane-head">Nachrichten</div><div class="ef-empty">%s</div>`, html.EscapeString(transferEmptyReason(kind, err)))
} }
return renderTransferMessageList(side, kind, selected, folder) return renderTransferMessageList(side, kind, selected, folder)
} }
func renderInitialTransferPreview(leftKind, leftValue, rightKind, rightValue string) string {
if leftValue != "" {
if folder, err := firstTransferFolder(leftKind, leftValue); err == nil {
return renderTransferPreview(leftKind, leftValue, folder, 0)
}
}
if rightValue != "" {
if folder, err := firstTransferFolder(rightKind, rightValue); err == nil {
return renderTransferPreview(rightKind, rightValue, folder, 0)
}
}
return `<div class="pane-head mode-head"><span class="mode-label">Vorschau</span></div><div class="read-body"><div class="ef-empty">Nachricht links oder rechts waehlen.</div></div>`
}
func transferEmptyReason(kind string, err error) string {
msg := err.Error()
if kind == "archive" && strings.Contains(msg, "Keine Ordner") {
return "Diese Archiv-MBox ist noch leer."
}
return msg
}
func firstTransferFolder(kind, value string) (string, error) { func firstTransferFolder(kind, value string) (string, error) {
switch kind { switch kind {
case "archive": case "archive":
@ -1151,8 +1184,12 @@ func renderTransferMessageList(side, kind, value, folder string) string {
if from == "" { if from == "" {
from = "(ohne Absender)" from = "(ohne Absender)"
} }
fmt.Fprintf(&b, `<a class="msg-row" href="#" hx-get="/transfer/message?side=%s&amp;kind=%s&amp;value=%s&amp;folder=%s&amp;index=%d" hx-target="#transfer-preview" hx-swap="innerHTML"><span class="msg-from">%s</span><span class="msg-subject">%s</span><span class="msg-date">%s</span></a>`, active := ""
side, html.EscapeString(kind), urlEsc(value), urlEsc(folder), entry.Index, html.EscapeString(from), html.EscapeString(subject), html.EscapeString(entry.Date)) if entry.Index == 0 {
active = " active"
}
fmt.Fprintf(&b, `<a class="msg-row%s" href="#" hx-get="/transfer/message?side=%s&amp;kind=%s&amp;value=%s&amp;folder=%s&amp;index=%d" hx-target="#transfer-preview" hx-swap="innerHTML"><span class="msg-from">%s</span><span class="msg-subject">%s</span><span class="msg-date">%s</span></a>`,
active, side, html.EscapeString(kind), urlEsc(value), urlEsc(folder), entry.Index, html.EscapeString(from), html.EscapeString(subject), html.EscapeString(entry.Date))
} }
if len(entries) == 0 { if len(entries) == 0 {
b.WriteString(`<div class="ef-empty">Keine Nachrichten.</div>`) b.WriteString(`<div class="ef-empty">Keine Nachrichten.</div>`)
@ -1199,8 +1236,12 @@ func renderTransferRawMessages(b *strings.Builder, side, kind, value, folder str
} }
date = decodeHeader(msg.Header.Get("Date")) date = decodeHeader(msg.Header.Get("Date"))
} }
fmt.Fprintf(b, `<a class="msg-row" href="#" hx-get="/transfer/message?side=%s&amp;kind=%s&amp;value=%s&amp;folder=%s&amp;index=%d" hx-target="#transfer-preview" hx-swap="innerHTML"><span class="msg-from">%s</span><span class="msg-subject">%s</span><span class="msg-date">%s</span></a>`, active := ""
side, html.EscapeString(kind), urlEsc(value), urlEsc(folder), i, html.EscapeString(from), html.EscapeString(subject), html.EscapeString(date)) if i == 0 {
active = " active"
}
fmt.Fprintf(b, `<a class="msg-row%s" href="#" hx-get="/transfer/message?side=%s&amp;kind=%s&amp;value=%s&amp;folder=%s&amp;index=%d" hx-target="#transfer-preview" hx-swap="innerHTML"><span class="msg-from">%s</span><span class="msg-subject">%s</span><span class="msg-date">%s</span></a>`,
active, side, html.EscapeString(kind), urlEsc(value), urlEsc(folder), i, html.EscapeString(from), html.EscapeString(subject), html.EscapeString(date))
} }
if len(messages) == 0 { if len(messages) == 0 {
b.WriteString(`<div class="ef-empty">Keine Nachrichten.</div>`) b.WriteString(`<div class="ef-empty">Keine Nachrichten.</div>`)

View file

@ -492,7 +492,7 @@ a.tree-node { display: block; color: inherit; text-decoration: none; }
.transfer-workbench { .transfer-workbench {
flex: 1 1 auto; flex: 1 1 auto;
display: grid; display: grid;
grid-template-columns: 250px minmax(260px, 1fr) minmax(360px, 1.2fr) minmax(260px, 1fr) 250px; grid-template-columns: 310px minmax(300px, 1fr) minmax(420px, 1.15fr) minmax(300px, 1fr) 310px;
min-height: 0; min-height: 0;
} }
.transfer-workbench .pane:last-child { .transfer-workbench .pane:last-child {