From 1321cea241e0fa3f3ac7da38b7364b46e0858f11 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Fri, 13 Nov 2020 11:55:56 -0500 Subject: [PATCH] Redirect to edit draft after saving message --- plugins/base/imap.go | 25 ++++++++++++++++++------- plugins/base/routes.go | 14 ++++++++------ themes/alps/assets/compose.js | 10 +++++++--- themes/alps/compose.html | 2 +- 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/plugins/base/imap.go b/plugins/base/imap.go index c7718e9..f15105c 100644 --- a/plugins/base/imap.go +++ b/plugins/base/imap.go @@ -9,6 +9,7 @@ import ( "strconv" "strings" "time" + nettextproto "net/textproto" "github.com/dustin/go-humanize" "github.com/emersion/go-imap" @@ -570,20 +571,20 @@ func markMessageAnswered(conn *imapclient.Client, mboxName string, uid uint32) e return conn.UidStore(seqSet, item, flags, nil) } -func appendMessage(c *imapclient.Client, msg *OutgoingMessage, mboxType mailboxType) (saved bool, err error) { +func appendMessage(c *imapclient.Client, msg *OutgoingMessage, mboxType mailboxType) (*MailboxInfo, uint32, error) { mbox, err := getMailboxByType(c, mboxType) if err != nil { - return false, err + return nil, 0, err } if mbox == nil { - return false, nil + return nil, 0, fmt.Errorf("Unable to resolve mailbox") } // IMAP needs to know in advance the final size of the message, so // there's no way around storing it in a buffer here. var buf bytes.Buffer if err := msg.WriteTo(&buf); err != nil { - return false, err + return nil, 0, err } flags := []string{imap.SeenFlag} @@ -591,10 +592,20 @@ func appendMessage(c *imapclient.Client, msg *OutgoingMessage, mboxType mailboxT flags = append(flags, imap.DraftFlag) } if err := c.Append(mbox.Name, flags, time.Now(), &buf); err != nil { - return false, err + return nil, 0, err + } + criteria := &imap.SearchCriteria{ + Header: make(nettextproto.MIMEHeader), + } + criteria.Header.Add("Message-Id", msg.MessageID) + if uids, err := c.UidSearch(criteria); err != nil { + return nil, 0, err + } else { + if len(uids) != 1 { + panic(fmt.Errorf("Duplicate message ID")) + } + return mbox, uids[0], nil } - - return true, nil } func deleteMessage(c *imapclient.Client, mboxName string, uid uint32) error { diff --git a/plugins/base/routes.go b/plugins/base/routes.go index 6ffdcf6..1f3b8b4 100644 --- a/plugins/base/routes.go +++ b/plugins/base/routes.go @@ -507,7 +507,7 @@ func submitCompose(ctx *alps.Context, msg *OutgoingMessage, options *composeOpti } err = ctx.Session.DoIMAP(func(c *imapclient.Client) error { - if _, err := appendMessage(c, msg, mailboxSent); err != nil { + if _, _, err := appendMessage(c, msg, mailboxSent); err != nil { return err } if draft := options.Draft; draft != nil { @@ -620,14 +620,15 @@ func handleCompose(ctx *alps.Context, msg *OutgoingMessage, options *composeOpti } if saveAsDraft { + var ( + drafts *MailboxInfo + uid uint32 + ) err = ctx.Session.DoIMAP(func(c *imapclient.Client) error { - copied, err := appendMessage(c, msg, mailboxDrafts) + drafts, uid, err = appendMessage(c, msg, mailboxDrafts) if err != nil { return err } - if !copied { - return fmt.Errorf("no Draft mailbox found") - } if draft := options.Draft; draft != nil { if err := deleteMessage(c, draft.Mailbox, draft.Uid); err != nil { return err @@ -638,7 +639,8 @@ func handleCompose(ctx *alps.Context, msg *OutgoingMessage, options *composeOpti if err != nil { return fmt.Errorf("failed to save message to Draft mailbox: %v", err) } - return ctx.Redirect(http.StatusFound, "/mailbox/INBOX") + return ctx.Redirect(http.StatusFound, fmt.Sprintf( + "/message/%s/%d/edit?part=1", drafts.Name, uid)) } else { return submitCompose(ctx, msg, options) } diff --git a/themes/alps/assets/compose.js b/themes/alps/assets/compose.js index e6f057f..a980d77 100644 --- a/themes/alps/assets/compose.js +++ b/themes/alps/assets/compose.js @@ -1,3 +1,6 @@ +const sendButton = document.getElementById("send-button"), + saveButton = document.getElementById("save-button"); + const composeForm = document.getElementById("compose-form"); const sendProgress = document.getElementById("send-progress"); composeForm.addEventListener("submit", ev => { @@ -6,6 +9,10 @@ composeForm.addEventListener("submit", ev => { sendProgress.style.display = 'flex'; }); +saveButton.addEventListener("click", ev => { + sendProgress.querySelector(".info").innerText = "Saving draft..."; +}); + let attachments = []; const headers = document.querySelector(".create-update .headers"); @@ -41,9 +48,6 @@ function dragNOP(e) { e.preventDefault(); } -const sendButton = document.getElementById("send-button"), - saveButton = document.getElementById("save-button"); - const attachmentUUIDsNode = document.getElementById("attachment-uuids"); function updateState() { let complete = true; diff --git a/themes/alps/compose.html b/themes/alps/compose.html index 5f9d3ea..82ee283 100644 --- a/themes/alps/compose.html +++ b/themes/alps/compose.html @@ -70,7 +70,7 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --> - Sending message... + Sending message...