1cf95af41e
This causes the mailbox to automatically reload the page every 60 seconds, without JavaScript. This also updates the base template data to include the full URL, and replaces the earlier "Path" field with a pre-split array of path components, which is more immediately useful to most templates given the limitations of string munging with text/template primitives.
183 lines
5.6 KiB
HTML
183 lines
5.6 KiB
HTML
{{template "head.html" .Global}}
|
|
{{template "nav.html" .Global}}
|
|
|
|
<div class="container-fluid">
|
|
<div class="row">
|
|
<div class="col-md-12 header-tabbed">
|
|
<h2 style="margin-bottom: 1rem;" class="d-block">
|
|
{{if .Message.Envelope.Subject}}
|
|
{{.Message.Envelope.Subject}}
|
|
{{else}}
|
|
(No subject)
|
|
{{end}}
|
|
</h2>
|
|
<div class="container message-tabs">
|
|
<ul class="nav nav-tabs">
|
|
<li class="nav-item">
|
|
<a class="nav-link active" href="#">View message</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a
|
|
class="nav-link"
|
|
href="{{.Message.URL}}/reply?part={{.Part.PathString}}"
|
|
>Reply</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a
|
|
class="nav-link"
|
|
href="{{.Message.URL}}/forward?part={{.Part.PathString}}"
|
|
>Forward</a>
|
|
</li>
|
|
<li class="mr-auto d-none d-sm-flex"></li>
|
|
<li class="nav-item">
|
|
<a
|
|
class="nav-link"
|
|
href="/mailbox/{{.Mailbox.Name | pathescape}}?page={{.MailboxPage}}"
|
|
>
|
|
<span class="icon icon-caret-left">
|
|
{{template "caret-left.html"}}
|
|
</span>
|
|
Back
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{{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="{{$.Message.URL}}?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="container message-container">
|
|
<div class="row">
|
|
<div class="col-md-9 body-column">
|
|
{{define "addr-list"}}
|
|
{{range $i, $addr := .}}
|
|
{{- if $i}},{{end}}
|
|
{{.PersonalName}}
|
|
<<a href="/compose?to={{.Address}}">{{.Address}}</a>>
|
|
{{- end}}
|
|
{{end}}
|
|
|
|
<ul>
|
|
<li>
|
|
<strong>Date</strong>: {{.Message.Envelope.Date | formatdate}}
|
|
</li>
|
|
<li>
|
|
<strong>From</strong>: {{template "addr-list" .Message.Envelope.From}}
|
|
</li>
|
|
<li>
|
|
<strong>To</strong>: {{template "addr-list" .Message.Envelope.To}}
|
|
</li>
|
|
{{if .Message.Envelope.Cc}}
|
|
<li>
|
|
<strong>Cc</strong>: {{template "addr-list" .Message.Envelope.Cc}}
|
|
</li>
|
|
{{end}}
|
|
{{if .Message.Envelope.Bcc}}
|
|
<li>
|
|
<strong>Bcc</strong>: {{template "addr-list" .Message.Envelope.Bcc}}
|
|
</li>
|
|
{{end}}
|
|
</ul>
|
|
|
|
{{if and .Extra.HasRemoteResources (not .Extra.RemoteResourcesAllowed)}}
|
|
<p class="alert alert-info">
|
|
This message contains remote content.
|
|
<a href="?part={{.Part.PathString}}&allow-remote-resources=1" class="alert-link">Load</a>
|
|
</p>
|
|
{{end}}
|
|
|
|
{{if .View}}
|
|
{{.View}}
|
|
{{else}}
|
|
<p>Can't preview this message part.</p>
|
|
<a href="{{.Message.URL}}/raw?part={{.Part.PathString}}">Download</a>
|
|
{{end}}
|
|
</div>
|
|
<div class="col-md-3 parts-column">
|
|
{{template "message-part-tree" (tuple $ .Message.PartTree)}}
|
|
|
|
<details>
|
|
<summary>Move to another mailbox</summary>
|
|
<form method="post" action="/message/{{.Mailbox.Name | pathescape}}/move">
|
|
<input type="hidden" name="uids" value="{{.Message.Uid}}">
|
|
<div class="form-group">
|
|
<select class="form-control" name="to" id="move-to">
|
|
{{range .Mailboxes}}
|
|
<option {{if eq .Name $.Mailbox.Name}}selected{{end}}>{{.Name}}</option>
|
|
{{end}}
|
|
</select>
|
|
</div>
|
|
<div class="pull-right">
|
|
<button class="btn btn-primary">Move</button>
|
|
</div>
|
|
</form>
|
|
</details>
|
|
|
|
<details>
|
|
<summary>Delete</summary>
|
|
<form method="post" action="/message/{{.Mailbox.Name | pathescape}}/delete">
|
|
<input type="hidden" name="uids" value="{{.Message.Uid}}">
|
|
<p>Are you sure?</p>
|
|
<div class="pull-right">
|
|
<button class="btn btn-danger">Delete</button>
|
|
</div>
|
|
</form>
|
|
</details>
|
|
|
|
{{if .Flags}}
|
|
<details>
|
|
<summary>Edit flags</summary>
|
|
<form method="post" action="/message/{{.Mailbox.Name | pathescape}}/flag">
|
|
<input type="hidden" name="uids" value="{{.Message.Uid}}">
|
|
<div class="form-group">
|
|
{{range $name, $has := .Flags}}
|
|
{{if ismutableflag $name}}
|
|
<input type="checkbox" name="flags" id="flag-{{$name}}"
|
|
value="{{$name}}" {{if $has}}checked{{end}}>
|
|
<label for="flag-{{$name}}">{{$name | formatflag}}</label>
|
|
<br>
|
|
{{else}}
|
|
{{if $has}}
|
|
<input type="hidden" name="flags" value="{{$name}}">
|
|
{{end}}
|
|
{{end}}
|
|
{{end}}
|
|
</div>
|
|
<div class="pull-right">
|
|
<button class="btn btn-primary">Save</button>
|
|
</div>
|
|
</form>
|
|
</details>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{{template "foot.html"}}
|
|
|