aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2020-10-23 16:07:59 -0400
committerDrew DeVault <sir@cmpwn.com>2020-10-23 16:08:40 -0400
commit490420726952bb3834e6a1cdda7a26c90ba9a7cb (patch)
tree75ab8141411e9275eae29c4c858d7ca799f18416
parent09d19169dae66c3ddfa3644090475b5cfd553684 (diff)
downloadalps-490420726952bb3834e6a1cdda7a26c90ba9a7cb.tar.gz
alps-490420726952bb3834e6a1cdda7a26c90ba9a7cb.zip
Replace parts tree with attachment list
-rw-r--r--go.mod1
-rw-r--r--go.sum2
-rw-r--r--plugins/base/imap.go28
-rw-r--r--themes/alps/assets/style.css11
-rw-r--r--themes/alps/message.html52
5 files changed, 60 insertions, 34 deletions
diff --git a/go.mod b/go.mod
index ea2b169..d784a48 100644
--- a/go.mod
+++ b/go.mod
@@ -6,6 +6,7 @@ require (
git.sr.ht/~sircmpwn/dowork v0.0.0-20201013174036-53a05612a082
github.com/aymerick/douceur v0.2.0
github.com/chris-ramon/douceur v0.2.0
+ github.com/dustin/go-humanize v1.0.0
github.com/emersion/go-ical v0.0.0-20200225233454-26ef720b8bf1
github.com/emersion/go-imap v1.0.4
github.com/emersion/go-imap-metadata v0.0.0-20200128185110-9d939d2a0915
diff --git a/go.sum b/go.sum
index 3d180d4..12880bc 100644
--- a/go.sum
+++ b/go.sum
@@ -22,6 +22,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/emersion/go-ical v0.0.0-20200224201310-cd514449c39e h1:YGM1sI7edZOt8KAfX9Miq/X99d2QXdgjkJ7vN4HjxAA=
github.com/emersion/go-ical v0.0.0-20200224201310-cd514449c39e/go.mod h1:4xVTBPcT43a1pp3vdaa+FuRdX5XhKCZPpWv7m0z9ByM=
github.com/emersion/go-ical v0.0.0-20200225233454-26ef720b8bf1 h1:v0W797seT60q3pzrphQUKh22Nt8uS7rgZyD6lqYgM0E=
diff --git a/plugins/base/imap.go b/plugins/base/imap.go
index 07b69c7..f8065b0 100644
--- a/plugins/base/imap.go
+++ b/plugins/base/imap.go
@@ -10,11 +10,12 @@ import (
"strings"
"time"
+ "github.com/dustin/go-humanize"
"github.com/emersion/go-imap"
- imapspecialuse "github.com/emersion/go-imap-specialuse"
- imapclient "github.com/emersion/go-imap/client"
"github.com/emersion/go-message"
"github.com/emersion/go-message/textproto"
+ imapclient "github.com/emersion/go-imap/client"
+ imapspecialuse "github.com/emersion/go-imap-specialuse"
)
type MailboxInfo struct {
@@ -177,6 +178,7 @@ func newIMAPPartNode(msg *IMAPMessage, path []int, part *imap.BodyStructure) *IM
MIMEType: strings.ToLower(part.MIMEType + "/" + part.MIMESubType),
Filename: filename,
Message: msg,
+ Size: part.Size,
}
}
@@ -301,6 +303,7 @@ type IMAPPartNode struct {
Filename string
Children []IMAPPartNode
Message *IMAPMessage
+ Size uint32
}
func (node IMAPPartNode) PathString() string {
@@ -308,10 +311,13 @@ func (node IMAPPartNode) PathString() string {
for i, partNum := range node.Path {
l[i] = strconv.Itoa(partNum)
}
-
return strings.Join(l, ".")
}
+func (node IMAPPartNode) SizeString() string {
+ return humanize.IBytes(uint64(node.Size))
+}
+
func (node IMAPPartNode) URL(raw bool) *url.URL {
u := node.Message.URL()
if raw {
@@ -348,6 +354,7 @@ func imapPartTree(msg *IMAPMessage, bs *imap.BodyStructure, path []int) *IMAPPar
Filename: filename,
Children: make([]IMAPPartNode, len(bs.Parts)),
Message: msg,
+ Size: bs.Size,
}
for i, part := range bs.Parts {
@@ -396,7 +403,12 @@ func listMessages(conn *imapclient.Client, mbox *MailboxStatus, page, messagesPe
var seqSet imap.SeqSet
seqSet.AddRange(uint32(from), uint32(to))
- fetch := []imap.FetchItem{imap.FetchFlags, imap.FetchEnvelope, imap.FetchUid, imap.FetchBodyStructure}
+ fetch := []imap.FetchItem{
+ imap.FetchFlags,
+ imap.FetchEnvelope,
+ imap.FetchUid,
+ imap.FetchBodyStructure,
+ }
ch := make(chan *imap.Message, 10)
done := make(chan error, 1)
@@ -452,7 +464,12 @@ func searchMessages(conn *imapclient.Client, mboxName, query string, page, messa
var seqSet imap.SeqSet
seqSet.AddNum(nums...)
- fetch := []imap.FetchItem{imap.FetchEnvelope, imap.FetchFlags, imap.FetchUid, imap.FetchBodyStructure}
+ fetch := []imap.FetchItem{
+ imap.FetchEnvelope,
+ imap.FetchFlags,
+ imap.FetchUid,
+ imap.FetchBodyStructure,
+ }
ch := make(chan *imap.Message, 10)
done := make(chan error, 1)
@@ -506,6 +523,7 @@ func getMessagePart(conn *imapclient.Client, mboxName string, uid uint32, partPa
imap.FetchUid,
imap.FetchBodyStructure,
imap.FetchFlags,
+ imap.FetchRFC822Size,
partHeaderSection.FetchItem(),
partBodySection.FetchItem(),
}
diff --git a/themes/alps/assets/style.css b/themes/alps/assets/style.css
index 91435e0..77aaf3c 100644
--- a/themes/alps/assets/style.css
+++ b/themes/alps/assets/style.css
@@ -261,14 +261,21 @@ main.message .message-header {
}
main.message .message-header .parts {
+ width: 30%;
margin-left: 0.3rem;
- padding: 0.3rem 1rem;
+ padding: 0.3rem 0.5rem;
background: white;
border-top: 1px solid #f2f2f2;
}
main.message .message-header .parts ul {
- margin-left: 1rem;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+main.message .message-header .parts li {
+ margin-left: 0;
}
main.contact dl {
diff --git a/themes/alps/message.html b/themes/alps/message.html
index 74e2d0b..28287ab 100644
--- a/themes/alps/message.html
+++ b/themes/alps/message.html
@@ -2,32 +2,6 @@
{{template "nav.html" .}}
{{template "util.html" .}}
-{{define "message-part-tree"}}
- {{/* nested templates can't access the parent's context */}}
- {{$ = index . 0}}
- {{with index . 1}}
- <a
- class="nav-link"
- {{if .IsText}}
- href="?part={{.PathString}}"
- {{else}}
- href="{{$.Message.URL}}raw?part={{.PathString}}"
- {{end}}
- >
- {{if eq $.Part.PathString .PathString}}<strong>{{end}}
- {{.String}}
- {{if eq $.Part.PathString .PathString}}</strong>{{end}}
- </a>
- {{if gt (len .Children) 0}}
- <ul class="nav flex-column">
- {{range .Children}}
- <li class="nav-item">{{template "message-part-tree" (tuple $ .)}}</li>
- {{end}}
- </ul>
- {{end}}
- {{end}}
-{{end}}
-
<div class="page-wrap">
{{ $current := .Mailbox }}
{{ template "aside" . }}
@@ -162,9 +136,32 @@
</tr>
{{end}}
</table>
+ {{ $attachments := .Message.Attachments }}
+ {{ if $attachments }}
<section class="parts">
- {{template "message-part-tree" (tuple $ .Message.PartTree)}}
+ <h3>Attachments</h3>
+ <ul>
+ {{ range .Message.Attachments }}
+ <li>
+ <a
+ class="nav-link"
+ {{if .IsText}}
+ href="?part={{.PathString}}"
+ {{else}}
+ href="{{$.Message.URL}}/raw?part={{.PathString}}"
+ {{end}}
+ >
+ {{- if .Filename -}}
+ {{.Filename}}
+ {{- else -}}
+ (no filename)
+ {{- end -}}
+ </a> ({{.MIMEType}}, {{.SizeString}})
+ </li>
+ {{ end }}
+ </ul>
</section>
+ {{ end }}
</div>
{{define "addr-list"}}
@@ -197,6 +194,7 @@
{{ end }}
<a href="{{.Message.URL}}/raw?plain=1">Raw email</a>
</div>
+
{{if .View}}
{{.View}}
{{else}}