recall: allow recalling messages from any folder

Recall fails when called outside of the "postpone" folder (usually
"Drafts"). This makes sense for postponed messages. However, sometimes
the user would like to re-edit and re-send an old, possibly sent,
message, which would serve as a basis for the new one.

This patch allows recall to work outside the postpone folder, thus
allowing for re-edition of any message.

In the original recall function, if the recalled message is found in the
"postpone" folder, once the message has been recalled, re-edited and
sent, the original draft is deleted. With this patch, when the message
is not in the "postpone" folder, the original message is not deleted.

Signed-off-by: inwit <inwit@sindominio.net>
This commit is contained in:
inwit 2021-12-13 11:28:01 +01:00 committed by Robin Jarry
parent bc087d9b30
commit bc593ac7cd
2 changed files with 27 additions and 7 deletions

View File

@ -12,6 +12,7 @@ import (
"git.sr.ht/~rjarry/aerc/models"
"git.sr.ht/~rjarry/aerc/widgets"
"git.sr.ht/~rjarry/aerc/worker/types"
"git.sr.ht/~sircmpwn/getopt"
)
type Recall struct{}
@ -29,8 +30,21 @@ func (Recall) Complete(aerc *widgets.Aerc, args []string) []string {
}
func (Recall) Execute(aerc *widgets.Aerc, args []string) error {
if len(args) != 1 {
return errors.New("Usage: recall")
force := false
opts, optind, err := getopt.Getopts(args, "f")
if err != nil {
return err
}
for _, opt := range opts {
switch opt.Option {
case 'f':
force = true
}
}
if len(args) != optind {
return errors.New("Usage: recall [-f]")
}
widget := aerc.SelectedTab().(widgets.ProvidesMessage)
@ -38,7 +52,7 @@ func (Recall) Execute(aerc *widgets.Aerc, args []string) error {
if acct == nil {
return errors.New("No account selected")
}
if acct.SelectedDirectory() != acct.AccountConfig().Postpone {
if acct.SelectedDirectory() != acct.AccountConfig().Postpone && !force {
return errors.New("Can only recall from the postpone directory: " +
acct.AccountConfig().Postpone)
}
@ -81,6 +95,10 @@ func (Recall) Execute(aerc *widgets.Aerc, args []string) error {
worker := composer.Worker()
uids := []uint32{msgInfo.Uid}
if acct.SelectedDirectory() != acct.AccountConfig().Postpone {
return
}
worker.PostAction(&types.DeleteMessages{
Uids: uids,
}, func(msg types.WorkerMessage) {
@ -90,8 +108,6 @@ func (Recall) Execute(aerc *widgets.Aerc, args []string) error {
composer.Close()
}
})
return
})
}

View File

@ -118,9 +118,13 @@ message list, the message in the message viewer, etc).
*delete*
Deletes the selected message.
*recall*
*recall* [-f]
Opens the selected message for re-editing. Messages can only be
recalled from the postpone directory.
recalled from the postpone directory. The original message is deleted.
*-f*: Open the message for re-editing even if it is not in the postpone
directory. The original message will be deleted only if it is in the
postpone directory.
*forward* [-A] [address...]
Opens the composer to forward the selected message to another recipient.