A webmail client. Forked from https://git.sr.ht/~migadu/alps
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 

211 рядки
7.7 KiB

  1. {{template "head.html" .}}
  2. {{template "nav.html" .}}
  3. {{define "message-part-tree"}}
  4. {{/* nested templates can't access the parent's context */}}
  5. {{$ = index . 0}}
  6. {{with index . 1}}
  7. <a
  8. class="nav-link"
  9. {{if .IsText}}
  10. href="{{$.Message.URL}}?part={{.PathString}}"
  11. {{else}}
  12. href="{{$.Message.URL}}/raw?part={{.PathString}}"
  13. {{end}}
  14. >
  15. {{if eq $.Part.PathString .PathString}}<strong>{{end}}
  16. {{.String}}
  17. {{if eq $.Part.PathString .PathString}}</strong>{{end}}
  18. </a>
  19. {{if gt (len .Children) 0}}
  20. <ul class="nav flex-column">
  21. {{range .Children}}
  22. <li class="nav-item">{{template "message-part-tree" (tuple $ .)}}</li>
  23. {{end}}
  24. </ul>
  25. {{end}}
  26. {{end}}
  27. {{end}}
  28. <div class="page-wrap">
  29. {{$current := .Mailbox}}
  30. <aside>
  31. <!-- the logo image, dimensions 200x32 may be present or not -->
  32. <a href="/compose" class="new">Compose&nbsp;Mail</a>
  33. {{range .Mailboxes}}
  34. <a href="{{.URL}}"
  35. {{ if eq $current.Name .Name }}class="active"{{ end }}>
  36. {{ if eq .Name "INBOX" }}
  37. Inbox
  38. {{else}}
  39. {{.Name}}
  40. {{end}}
  41. {{ $unseen := 0 }}
  42. {{ if eq .Name "INBOX" }}
  43. {{ $unseen = $.Inbox.Unseen }}
  44. {{ end }}
  45. {{ if eq .Name $.Mailbox.Name }}
  46. {{ $unseen = $.Mailbox.Unseen }}
  47. {{ end }}
  48. {{ if $unseen }}({{ $unseen }}){{ end }}
  49. </a>
  50. {{end}}
  51. </aside>
  52. <div class="container">
  53. <main class="message">
  54. <section class="actions">
  55. <div class="actions-wrap">
  56. <div class="actions-message">
  57. {{$back := printf "%v?page=%v" .Mailbox.URL .MailboxPage}}
  58. <a href="{{$back}}" class="button-link">« Back</a>
  59. {{ if and (ne .Mailbox.Name "Archive") (ne .Mailbox.Name "Drafts") (ne .Mailbox.Name "Sent") }}
  60. <form class="action-group" method="post" action="/message/{{.Mailbox.Name | pathescape}}/move">
  61. <input type="hidden" name="uids" value="{{.Message.Uid}}">
  62. <input type="hidden" name="to" value="Archive">
  63. <input type="hidden" name="next" value="{{$back}}">
  64. <button>Archive</button>
  65. </form>
  66. {{ end }}
  67. {{ if and (ne .Mailbox.Name "INBOX") (ne .Mailbox.Name "Sent") (ne .Mailbox.Name "Drafts") }}
  68. <form class="action-group" method="post" action="/message/{{.Mailbox.Name | pathescape}}/move">
  69. <input type="hidden" name="uids" value="{{.Message.Uid}}">
  70. <input type="hidden" name="to" value="INBOX">
  71. <button>
  72. {{ if (eq .Mailbox.Name "Junk") }}
  73. Not Spam
  74. {{ else }}
  75. Move to Inbox
  76. {{ end }}
  77. </button>
  78. </form>
  79. {{ end }}
  80. {{ if or (eq .Mailbox.Name "INBOX") (eq .Mailbox.Name "Trash") }}
  81. <form class="action-group" method="post" action="/message/{{.Mailbox.Name | pathescape}}/move">
  82. <input type="hidden" name="uids" value="{{.Message.Uid}}">
  83. <input type="hidden" name="next" value="{{$back}}">
  84. <input type="hidden" name="to" value="Junk">
  85. <button>Report Spam</button>
  86. </form>
  87. {{ end }}
  88. {{ if or (eq .Mailbox.Name "Trash") (eq .Mailbox.Name "Junk") }}
  89. <form class="action-group" method="post" action="/message/{{.Mailbox.Name | pathescape}}/delete">
  90. <input type="hidden" name="uids" value="{{.Message.Uid}}">
  91. <input type="hidden" name="next" value="{{$back}}">
  92. <button>Delete Permanently</button>
  93. </form>
  94. {{ else }}
  95. <form class="action-group" method="post" action="/message/{{.Mailbox.Name | pathescape}}/move">
  96. <input type="hidden" name="uids" value="{{.Message.Uid}}">
  97. <input type="hidden" name="next" value="{{$back}}">
  98. <input type="hidden" name="to" value="Trash">
  99. <button>Delete</button>
  100. </form>
  101. {{ end }}
  102. <form class="action-group" method="post" action="/message/{{.Mailbox.Name | pathescape}}/flag">
  103. <input type="hidden" name="uids" value="{{.Message.Uid}}">
  104. <input type="hidden" name="action" value="remove">
  105. <input type="hidden" name="flags" value="\Seen">
  106. <input type="hidden" name="next" value="{{$back}}">
  107. <button>Mark&nbsp;Unread</button>
  108. </form>
  109. <form class="action-group" method="post" action="/message/{{.Mailbox.Name | pathescape}}/move">
  110. <input type="hidden" name="uids" value="{{.Message.Uid}}">
  111. <select class="action-group" name="to">
  112. {{range .Mailboxes}}
  113. <option value="{{.Name}}" {{if eq .Name $.Mailbox.Name}}selected>Move to...{{else}}>{{.Name}}{{ end }}</option>
  114. {{end}}
  115. </select>
  116. <button class="action-group" type="submit">Move</button>
  117. </form>
  118. <span class="followups">
  119. {{if .Message.HasFlag "\\Draft"}}
  120. <a class="action-group button-link" href="{{.Message.URL}}/edit{{if .Message.TextPart}}?part={{.Message.TextPart.PathString}}{{end}}">Edit draft</a>
  121. {{else}}
  122. <a class="action-group button-link" href="{{.Message.URL}}/reply{{if .Message.TextPart}}?part={{.Message.TextPart.PathString}}{{end}}">Reply</a>
  123. <a class="action-group button-link" href="{{.Message.URL}}/forward{{if .Message.TextPart}}?part={{.Message.TextPart.PathString}}{{end}}">Forward</a>
  124. {{end}}
  125. </span>
  126. </div>
  127. </div>
  128. </section>
  129. <div class="message-header">
  130. <table>
  131. <tr>
  132. <th colspan="2">
  133. <h1>
  134. {{if .Message.Envelope.Subject}}
  135. {{.Message.Envelope.Subject}}
  136. {{else}}
  137. (No subject)
  138. {{end}}
  139. </h1>
  140. </th>
  141. </tr>
  142. <tr>
  143. <th>From:</th>
  144. <td>{{template "addr-list" .Message.Envelope.From}}</td>
  145. </tr>
  146. <tr>
  147. <th>Date:</th>
  148. <td>{{.Message.Envelope.Date | formatdate}}</td>
  149. </tr>
  150. <tr>
  151. <th>To:</th><td>{{template "addr-list" .Message.Envelope.To}}</td>
  152. </tr>
  153. {{if .Message.Envelope.Cc}}
  154. <tr>
  155. <th>Cc:</th><td>{{template "addr-list" .Message.Envelope.Cc}}</td>
  156. </tr>
  157. {{end}}
  158. {{if .Message.Envelope.Bcc}}
  159. <tr>
  160. <th>Bcc:</th>
  161. <td>{{template "addr-list" .Message.Envelope.Bcc}}</td>
  162. </tr>
  163. {{ end }}
  164. {{if and .Extra.HasRemoteResources (not .Extra.RemoteResourcesAllowed)}}
  165. <tr class="remote-content">
  166. <td colspan="2">
  167. This message contains remote content, such as external images.
  168. <a href="?part={{.Part.PathString}}&allow-remote-resources=1">
  169. Load remote content »
  170. </a>
  171. </td>
  172. </tr>
  173. {{end}}
  174. </table>
  175. <section class="parts">
  176. {{template "message-part-tree" (tuple $ .Message.PartTree)}}
  177. </section>
  178. </div>
  179. {{define "addr-list"}}
  180. {{range $i, $addr := .}}
  181. {{if $i}},{{end}}
  182. <strong>{{.PersonalName}}</strong>
  183. &lt;<a href="/compose?to={{.Address}}">{{.Address}}</a>&gt;
  184. {{end}}
  185. {{end}}
  186. {{if .View}}
  187. {{.View}}
  188. {{else}}
  189. <p>Can't preview this message part.</p>
  190. <a href="{{.Message.Uid}}/raw?part={{.Part.PathString}}">Download</a>
  191. {{end}}
  192. </main>
  193. </div>
  194. </div>
  195. {{template "foot.html"}}