status.tmpl 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. {{with .Data}}
  2. {{if .Muted}}<details><summary> muted post </summary>{{end}}
  3. <div id="status-{{.ID}}" class="status-container-container">
  4. {{if .Reblog}}
  5. <details>
  6. <summary>
  7. <div class="retweet-info">
  8. <a class="img-link" href="/user/{{.Account.ID}}">
  9. <img class="status-profile-img" src="{{.Account.Avatar}}" title="@{{.Account.Acct}}" alt="avatar" height="24" />
  10. </a>
  11. <bdi class="status-dname">{{EmojiFilter (HTML .Account.DisplayName) .Account.Emojis | Raw}}</bdi>
  12. <a href="/user/{{.Account.ID}}">
  13. <span class="status-uname">@{{.Account.Acct}}</span>
  14. </a>
  15. retweeteed
  16. </div>
  17. </summary>
  18. {{template "status" (WithContext .Reblog $.Ctx)}}
  19. </details>
  20. {{else}}
  21. {{block "status" (WithContext . $.Ctx)}}
  22. {{with $s := .Data}}
  23. <div class="status-container status-{{.ID}}" data-id="{{.ID}}">
  24. <div class="status-profile-img-container">
  25. <a class="img-link" href="/user/{{.Account.ID}}">
  26. <img class="status-profile-img" src="{{.Account.Avatar}}" title="@{{.Account.Acct}}" alt="avatar" height="48" />
  27. </a>
  28. </div>
  29. <div class="status">
  30. <div class="status-name">
  31. <bdi class="status-dname"> {{EmojiFilter (HTML .Account.DisplayName) .Account.Emojis | Raw}} {{if .Account.Bot}}🤖{{end}}</bdi>
  32. <a href="/user/{{.Account.ID}}">
  33. <span class="status-uname">@{{.Account.Acct}}</span>
  34. </a>
  35. <div class="more-container">
  36. <div class="remote-link">
  37. {{if .IDNumbers}}#{{index .IDNumbers .ID}}{{end}} {{.Visibility}} <code title="Status ID">{{.ID}}</code>
  38. </div>
  39. <div class="more-content">
  40. <a class="more-link" href="{{.URL}}" target="_blank">
  41. source
  42. </a>
  43. <a class="more-link" href="/quickreply/{{.ID}}#status-{{.ID}}">
  44. quickreply
  45. </a>
  46. {{if .Muted}}
  47. <form action="/unmuteconv/{{.ID}}" method="post" target="_self">
  48. <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
  49. <input type="hidden" name="referrer" value="{{$.Ctx.Referrer}}">
  50. <input type="submit" value="unmute" class="btn-link more-link">
  51. </form>
  52. {{else}}
  53. <form action="/muteconv/{{.ID}}" method="post" target="_self">
  54. <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
  55. <input type="hidden" name="referrer" value="{{$.Ctx.Referrer}}">
  56. <input type="submit" value="mute" class="btn-link more-link">
  57. </form>
  58. {{end}}
  59. {{if .Bookmarked}}
  60. <form action="/unbookmark/{{.ID}}" method="post" target="_self">
  61. <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
  62. <input type="hidden" name="referrer" value="{{$.Ctx.Referrer}}">
  63. <input type="hidden" name="retweeted_by_id" value="{{.RetweetedByID}}">
  64. <input type="submit" value="unbookmark" class="btn-link more-link">
  65. </form>
  66. {{else}}
  67. <form action="/bookmark/{{.ID}}" method="post" target="_self">
  68. <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
  69. <input type="hidden" name="referrer" value="{{$.Ctx.Referrer}}">
  70. <input type="hidden" name="retweeted_by_id" value="{{.RetweetedByID}}">
  71. <input type="submit" value="bookmark" class="btn-link more-link">
  72. </form>
  73. {{end}}
  74. {{if eq $.Ctx.UserID .Account.ID}}
  75. {{$pin := "pin"}} {{if .Pinned}} {{$pin = "unpin"}} {{end}}
  76. <form action="/{{$pin}}/{{.ID}}" method="post" target="_self">
  77. <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
  78. <input type="hidden" name="referrer" value="{{$.Ctx.Referrer}}">
  79. <input type="submit" value="{{$pin}}" class="btn-link more-link">
  80. </form>
  81. <form action="/delete/{{.ID}}" method="post" target="_self">
  82. <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
  83. <input type="hidden" name="referrer" value="{{$.Ctx.Referrer}}">
  84. <input type="submit" value="delete" class="btn-link more-link">
  85. </form>
  86. {{end}}
  87. </div>
  88. </div>
  89. </div>
  90. <div class="status-reply-container">
  91. {{if .InReplyToID}}
  92. <a class="status-reply-to-link" href="{{if not .ShowReplies}}/thread/{{.InReplyToID}}{{end}}#status-{{.InReplyToID}}">
  93. in reply to {{if .IDNumbers}}#{{index .IDNumbers .InReplyToID}}{{end}} {{if .Pleroma.InReplyToAccountAcct}}@{{.Pleroma.InReplyToAccountAcct}}{{else if not .IDNumbers}}{{.InReplyToID}}{{end}}
  94. </a>
  95. {{if index .IDReplies .ID}} <span class="status-reply-info-divider"> - </span> {{end}}
  96. {{end}}
  97. {{if .ShowReplies}}
  98. {{if index .IDReplies .ID}} <span class="status-reply-text"> replies: </span> {{end}}
  99. {{range index .IDReplies .ID}}
  100. <a class="status-reply-link" href="#status-{{.ID}}">#{{.Number}}</a>
  101. {{end}}
  102. {{end}}
  103. </div>
  104. {{if (or .Content .SpoilerText)}}
  105. <div class="status-content">
  106. {{if .Sensitive}}[NSFW]<br/>{{end}}
  107. {{- if .SpoilerText}}{{EmojiFilter (HTML .SpoilerText) .Emojis | Raw}}<br/>{{end -}}
  108. {{if .Sensitive}}<details>{{end}}
  109. {{- StatusContentFilter .Content .Emojis .Mentions | Raw -}}
  110. {{if .Pleroma.Quote}}
  111. <details>
  112. <summary>quoted post</summary>
  113. {{template "status" (WithContext .Pleroma.Quote $.Ctx)}}
  114. </details>
  115. {{end}}
  116. {{if .Sensitive}}</details>{{end}}
  117. </div>
  118. {{end}}
  119. {{$st_id := .ID}}
  120. {{if .Pleroma.Reactions}}
  121. <div class="pleroma-reactions">
  122. {{range .Pleroma.Reactions}}
  123. {{$react := "react"}} {{if .Me}} {{$react = "unreact"}} {{end}}
  124. <form id="emoj" action="/{{$react}}-with/{{$st_id}}?emoji={{.Name}}" method="post" target="_self">
  125. <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
  126. <input type="hidden" name="referrer" value="{{$.Ctx.Referrer}}">
  127. {{if .Url}}
  128. <input id="place-{{$react}}" type="image" src="{{.Url}}" title="{{.Name}}{{.Count}}*" {{if eq $react "unreact"}}height=36 width=36 {{else}} height=32 width=32 {{end}} class="pleroma-emoji">
  129. {{else}}
  130. <input id="place-{{$react}}" type="submit" value="{{.Name}}{{.Count}}{{if eq $react "unreact"}}*{{end}}" class="pleroma-emoji">
  131. {{end}}
  132. </form>
  133. {{end}}
  134. </div>
  135. {{end}}
  136. {{if .MediaAttachments}}
  137. {{if .Sensitive}}<details><summary>NSFW attachments</summary>{{end}}
  138. <div class="status-media-container">
  139. {{range .MediaAttachments}}
  140. {{if eq .Type "image"}}
  141. {{if $.Ctx.HideAttachments}}
  142. <a href="{{.URL}}" target="_blank">
  143. [image{{if $s.Sensitive}}/nsfw{{end}}{{if .Description}}: {{.Description}}{{end}}]
  144. </a>
  145. {{else}}
  146. <a class="img-link" href="{{.URL}}" target="_blank" title="{{.Description}}">
  147. <img class="status-image" src="{{.PreviewURL}}" alt="status-image" height="240" loading="lazy" />
  148. {{if (and $.Ctx.MaskNSFW $s.Sensitive)}}
  149. <div class="status-nsfw-overlay"></div>
  150. {{end}}
  151. </a>
  152. {{end}}
  153. {{else if eq .Type "audio"}}
  154. {{if $.Ctx.HideAttachments}}
  155. <a href="{{.URL}}" target="_blank">
  156. [audio{{if $s.Sensitive}}/nsfw{{end}}{{if .Description}}: {{.Description}}{{end}}]
  157. </a>
  158. {{else}}
  159. <audio class="status-audio" controls title="{{.Description}}">
  160. <source src="{{.URL}}">
  161. <a href="{{.URL}}" target="_blank"> [audio] </a>
  162. </audio>
  163. {{end}}
  164. {{else if eq .Type "video"}}
  165. {{if $.Ctx.HideAttachments}}
  166. <a href="{{.URL}}" target="_blank">
  167. [video{{if $s.Sensitive}}/nsfw{{end}}{{if .Description}}: {{.Description}}{{end}}]
  168. </a>
  169. {{else}}
  170. <div class="status-video-container" title="{{.Description}}">
  171. <video class="status-video" controls height="240">
  172. <source src="{{.URL}}">
  173. <a href="{{.URL}}" target="_blank"> [video] </a>
  174. </video>
  175. {{if (and $.Ctx.MaskNSFW $s.Sensitive)}}
  176. <div class="status-nsfw-overlay"></div>
  177. {{end}}
  178. </div>
  179. {{end}}
  180. {{else}}
  181. <a href="{{.URL}}" target="_blank">
  182. [attachment{{if $s.Sensitive}}/nsfw{{end}}{{if .Description}}: {{.Description}}{{end}}]
  183. </a>
  184. {{end}}
  185. {{end}}
  186. </div>
  187. {{if .Sensitive}}</details>{{end}}
  188. {{end}}
  189. {{if .Poll}}
  190. <form class="poll-form" action="/vote/{{.Poll.ID}}" method="POST" target="_self">
  191. <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
  192. <input type="hidden" name="referrer" value="{{$.Ctx.Referrer}}">
  193. <input type="hidden" name="status_id" value="{{$s.ID}}">
  194. {{range $i, $o := .Poll.Options}}
  195. <div class="poll-option">
  196. {{if (or $s.Poll.Expired $s.Poll.Voted)}}
  197. <div> {{EmojiFilter (HTML $o.Title) $s.Emojis | Raw}} - {{$o.VotesCount}} votes </div>
  198. {{else}}
  199. <input type="{{if $s.Poll.Multiple}}checkbox{{else}}radio{{end}}" name="choices"
  200. id="poll-{{$s.ID}}-{{$i}}" value="{{$i}}">
  201. <label for="poll-{{$s.ID}}-{{$i}}">
  202. {{EmojiFilter (HTML $o.Title) $s.Emojis | Raw}}
  203. </label>
  204. {{end}}
  205. </div>
  206. {{end}}
  207. {{if not (or .Poll.Expired .Poll.Voted)}}
  208. <button type="submit"> Vote </button>
  209. {{end}}
  210. <div class="poll-info">
  211. <span>{{.Poll.VotesCount}} votes</span>
  212. {{if .Poll.Expired}}
  213. <span> - poll expired </span>
  214. {{else if .Poll.ExpiresAt}}
  215. <span>
  216. - poll ends in
  217. <time datetime="{{FormatTimeRFC3339 .Poll.ExpiresAt}}" title="{{FormatTimeRFC822 .Poll.ExpiresAt}}">
  218. {{TimeUntil .Poll.ExpiresAt}}
  219. </time>
  220. </span>
  221. {{end}}
  222. </div>
  223. </form>
  224. {{end}}
  225. <div class="status-action-container">
  226. {{if eq (printf "%.7s" .URL) "/search"}}
  227. <div class="status-action">
  228. <a href="{{.URL}}" target="_blank">Federate!</a>
  229. </div>
  230. {{else}}
  231. <div class="status-action">
  232. <a href="/thread/{{.ID}}?reply=true#status-{{.ID}}">
  233. reply
  234. </a>
  235. <a class="status-reply-count" href="/thread/{{.ID}}#status-{{.ID}}" {{if $.Ctx.ThreadInNewTab}}target="_blank"{{end}}>
  236. {{if and (not $.Ctx.AntiDopamineMode) .RepliesCount}}
  237. ({{DisplayInteractionCount .RepliesCount}})
  238. {{end}}
  239. </a>
  240. </div>
  241. {{end}}
  242. <div class="status-action">
  243. {{$rt := "retweet"}} {{if .Reblogged}} {{$rt = "unretweet"}} {{end}}
  244. <form class="status-retweet" data-action="{{$rt}}" action="/{{$rt}}/{{.ID}}" method="post" target="_self">
  245. <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
  246. <input type="hidden" name="referrer" value="{{$.Ctx.Referrer}}">
  247. <input type="hidden" name="retweeted_by_id" value="{{.RetweetedByID}}">
  248. <div class="more-container">
  249. <input type="submit" value="{{$rt}}" class="btn-link"
  250. {{if or (eq .Visibility "private") (eq .Visibility "direct")}}title="this status cannot be retweeted" disabled{{end}}>
  251. <div class="more-content">
  252. {{if or (eq .Visibility "private") (eq .Visibility "direct")}}
  253. Locked
  254. {{else}}
  255. <input type="radio" id="retweet_visibility-{{.ID}}" name="retweet_visibility" value="public" checked>
  256. <label for="retweet_visibility">public</label>
  257. <input type="radio" id="retweet_visibility-{{.ID}}" name="retweet_visibility" value="unlisted">
  258. <label for="retweet_visibility">unlisted</label>
  259. <input type="radio" id="retweet_visibility-{{.ID}}" name="retweet_visibility" value="private">
  260. <label for="retweet_visibility">private</label>
  261. {{end}}
  262. </div>
  263. </div>
  264. <a class="status-retweet-count" href="/retweetedby/{{.ID}}" title="click to see the the list">
  265. {{if and (not $.Ctx.AntiDopamineMode) .ReblogsCount}}
  266. ({{DisplayInteractionCount .ReblogsCount}})
  267. {{end}}
  268. </a>
  269. </form>
  270. </div>
  271. <div class="status-action">
  272. {{$like := "like"}} {{if .Favourited}} {{$like = "unlike"}} {{end}}
  273. <form class="status-like" data-action="{{$like}}" action="/{{$like}}/{{.ID}}" method="post" target="_self">
  274. <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
  275. <input type="hidden" name="referrer" value="{{$.Ctx.Referrer}}">
  276. <input type="hidden" name="retweeted_by_id" value="{{.RetweetedByID}}">
  277. <input type="submit" value="{{$like}}" class="btn-link">
  278. <a class="status-like-count" href="/likedby/{{.ID}}" title="click to see the the list">
  279. {{if and (not $.Ctx.AntiDopamineMode) .FavouritesCount}}
  280. ({{DisplayInteractionCount .FavouritesCount}})
  281. {{end}}
  282. </a>
  283. </form>
  284. </div>
  285. <div class="status-action">
  286. <a href="/reactionspage/{{.ID}}">
  287. reactions
  288. </a>
  289. </div>
  290. <div class="status-action status-action-last">
  291. <a class="status-time" href="{{if not .ShowReplies}}/thread/{{.ID}}{{end}}#status-{{.ID}}"
  292. {{if $.Ctx.ThreadInNewTab}}target="_blank"{{end}}>
  293. <time datetime="{{FormatTimeRFC3339 .CreatedAt.Time}}" title="{{FormatTimeRFC822 .CreatedAt.Time}}">
  294. {{TimeSince .CreatedAt.Time}}
  295. </time>
  296. </a>
  297. {{if .EditedAt}} <time datetime="{{FormatTimeRFC3339 .EditedAt.Time}}" title="{{FormatTimeRFC822 .EditedAt.Time}}">| {{TimeSince .EditedAt.Time}} Edited</time>{{end}}
  298. </div>
  299. </div>
  300. </div>
  301. </div>
  302. {{end}}
  303. {{end}}
  304. {{end}}
  305. </div>
  306. {{if .Muted}}</details>{{end}}
  307. {{end}}