543ad8a018
Added a better paginator for view topic. The last post on the topic list and forum pages now link to the last page of a topic for quicker navigation. The Account Manager now utilises dyntmpl in more areas. More tooltips. Tweaked the colour for the validated emails in the Email Manager so it looks nicer on dark themes. Moved some inline styles from the Email Manager into the stylesheets and removed obsolete ones. Added the mixed BenchmarkTopicGuestAdminRouteParallelWithRouter benchmark. The bad route benchmark should no longer abort when erroring, something which doesn't make sense as it's always expected to error. Reduce a bit more boilerplate with renderTemplate() Added the *CTemplateSet.addText method and used it to optimise the generated templates a tiny bit more. The forums route now has guest and member variants generated for it. Turned the experimental template optimisation back on for more data. Added the routes.AccountLogins route. Added the account_logins phrase. Added the account_menu_logins phrase. Added the account_logins_head phrase. Added the account_logins_success phrase. Added the account_logins_failure phrase. You need to run the patcher / updater for this commit.
158 lines
11 KiB
HTML
158 lines
11 KiB
HTML
{{template "header.html" . }}
|
|
|
|
{{if gt .Page 1}}<link rel="prev" href="/topic/{{.Topic.ID}}?page={{subtract .Page 1}}" />
|
|
<div id="prevFloat" class="prev_button"><a class="prev_link" aria-label="{{lang "paginator_prev_page_aria"}}" rel="prev" href="/topic/{{.Topic.ID}}?page={{subtract .Page 1}}">{{lang "paginator_less_than"}}</a></div>{{end}}
|
|
|
|
{{if ne .LastPage .Page}}<link rel="prerender next" href="/topic/{{.Topic.ID}}?page={{add .Page 1}}" />
|
|
<div id="nextFloat" class="next_button"><a class="next_link" aria-label="{{lang "paginator_next_page_aria"}}" rel="next" href="/topic/{{.Topic.ID}}?page={{add .Page 1}}">{{lang "paginator_greater_than"}}</a></div>{{end}}
|
|
|
|
<main>
|
|
|
|
<div {{scope "topic_title_block"}} class="rowblock rowhead topic_block" aria-label="{{lang "topic.opening_post_aria"}}">
|
|
<form action='/topic/edit/submit/{{.Topic.ID}}?session={{.CurrentUser.Session}}' method="post">
|
|
<div class="rowitem topic_item{{if .Topic.Sticky}} topic_sticky_head{{else if .Topic.IsClosed}} topic_closed_head{{end}}">
|
|
<h1 class='topic_name hide_on_edit' title='{{.Topic.Title}}'>{{.Topic.Title}}</h1>
|
|
<span class="topic_name_forum_sep hide_on_edit"> / </span>
|
|
<a href="{{.Forum.Link}}" class="topic_forum hide_on_edit">{{.Forum.Name}}</a>
|
|
{{/** TODO: Does this need to be guarded by a permission? It's only visible in edit mode anyway, which can't be triggered, if they don't have the permission **/}}
|
|
{{if .CurrentUser.Loggedin}}
|
|
{{if not .Topic.IsClosed or .CurrentUser.Perms.CloseTopic}}
|
|
{{if .CurrentUser.Perms.EditTopic}}
|
|
<input class='show_on_edit topic_name_input' name="topic_name" value='{{.Topic.Title}}' type="text" aria-label="{{lang "topic.title_input_aria"}}" />
|
|
<button name="topic-button" class="formbutton show_on_edit submit_edit">{{lang "topic.update_button"}}</button>
|
|
{{end}}
|
|
{{end}}
|
|
{{end}}
|
|
<span class="topic_view_count hide_on_edit">{{.Topic.ViewCount}}</span>
|
|
{{/** TODO: Inline this CSS **/}}
|
|
{{if .Topic.IsClosed}}<span class='username hide_on_micro topic_status_e topic_status_closed hide_on_edit' title='{{lang "status.closed_tooltip"}}' aria-label='{{lang "topic.status_closed_aria"}}' style="font-weight:normal;float: right;position:relative;top:-5px;">🔒︎</span>{{end}}
|
|
</div>
|
|
</form>
|
|
</div>
|
|
|
|
<div class="rowblock post_container">
|
|
{{if .Poll.ID}}
|
|
<form id="poll_{{.Poll.ID}}_form" action="/poll/vote/{{.Poll.ID}}?session={{.CurrentUser.Session}}" method="post"></form>
|
|
<article class="rowitem passive deletable_block editable_parent post_item poll_item top_post hide_on_edit">
|
|
{{/** TODO: De-dupe userinfo with a common template **/}}
|
|
<div class="userinfo" aria-label="{{lang "topic.userinfo_aria"}}">
|
|
<div class="avatar_item" style="background-image: url({{.Topic.Avatar}}), url(/static/white-dot.jpg);background-position: 0px -10px;"> </div>
|
|
<div class="user_meta">
|
|
<a href="{{.Topic.UserLink}}" class="the_name" rel="author">{{.Topic.CreatedByName}}</a>
|
|
{{if .Topic.Tag}}<div class="tag_block"><div class="tag_pre"></div><div class="post_tag">{{.Topic.Tag}}</div><div class="tag_post"></div></div>{{else}}<div class="tag_block"><div class="tag_pre"></div><div class="post_tag post_level">{{level .Topic.Level}}</div><div class="tag_post"></div></div>{{end}}
|
|
</div>
|
|
</div>
|
|
<div id="poll_voter_{{.Poll.ID}}" class="content_container poll_voter">
|
|
<div class="topic_content user_content">
|
|
{{range .Poll.QuickOptions}}
|
|
<div class="poll_option">
|
|
<input form="poll_{{$.Poll.ID}}_form" id="poll_option_{{.ID}}" name="poll_option_input" type="checkbox" value="{{.ID}}" />
|
|
<label class="poll_option_label" for="poll_option_{{.ID}}">
|
|
<div class="sel"></div>
|
|
</label>
|
|
<span id="poll_option_text_{{.ID}}" class="poll_option_text">{{.Value}}</span>
|
|
</div>
|
|
{{end}}
|
|
<div class="poll_buttons">
|
|
<button form="poll_{{.Poll.ID}}_form" class="poll_vote_button">{{lang "topic.poll_vote"}}</button>
|
|
<button class="poll_results_button" data-poll-id="{{.Poll.ID}}">{{lang "topic.poll_results"}}</button>
|
|
<a href="#"><button class="poll_cancel_button">{{lang "topic.poll_cancel"}}</button></a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="poll_results_{{.Poll.ID}}" class="content_container poll_results auto_hide">
|
|
<div class="topic_content user_content"></div>
|
|
</div>
|
|
</article>
|
|
{{end}}
|
|
<article {{scope "opening_post"}} itemscope itemtype="http://schema.org/CreativeWork" class="rowitem passive deletable_block editable_parent post_item top_post" aria-label="{{lang "topic.opening_post_aria"}}">
|
|
<div class="userinfo" aria-label="{{lang "topic.userinfo_aria"}}">
|
|
<div class="avatar_item" style="background-image: url({{.Topic.Avatar}}), url(/static/white-dot.jpg);background-position: 0px -10px;"> </div>
|
|
<div class="user_meta">
|
|
<a href="{{.Topic.UserLink}}" class="the_name" rel="author">{{.Topic.CreatedByName}}</a>
|
|
{{if .Topic.Tag}}<div class="tag_block"><div class="tag_pre"></div><div class="post_tag">{{.Topic.Tag}}</div><div class="tag_post"></div></div>{{else}}<div class="tag_block"><div class="tag_pre"></div><div class="post_tag post_level">{{level .Topic.Level}}</div><div class="tag_post"></div></div>{{end}}
|
|
</div>
|
|
</div>
|
|
<div class="content_container">
|
|
<div class="hide_on_edit topic_content user_content" itemprop="text">{{.Topic.ContentHTML}}</div>
|
|
{{if .CurrentUser.Loggedin}}{{if .CurrentUser.Perms.EditTopic}}<textarea name="topic_content" class="show_on_edit topic_content_input">{{.Topic.Content}}</textarea>{{end}}{{end}}
|
|
<div class="controls button_container{{if .Topic.LikeCount}} has_likes{{end}}">
|
|
<div class="action_button_left">
|
|
{{if .CurrentUser.Loggedin}}
|
|
{{if .CurrentUser.Perms.LikeItem}}<a href="/topic/like/submit/{{.Topic.ID}}?session={{.CurrentUser.Session}}" class="action_button like_item {{if .Topic.Liked}}remove_like{{else}}add_like{{end}}" aria-label="{{lang "topic.like_aria"}}" data-action="like"></a>{{end}}
|
|
{{if not .Topic.IsClosed or .CurrentUser.Perms.CloseTopic}}
|
|
{{if .CurrentUser.Perms.EditTopic}}<a href="/topic/edit/{{.Topic.ID}}" class="action_button open_edit" aria-label="{{lang "topic.edit_aria"}}" data-action="edit"></a>{{end}}
|
|
{{end}}
|
|
{{if .CurrentUser.Perms.DeleteTopic}}<a href="/topic/delete/submit/{{.Topic.ID}}?session={{.CurrentUser.Session}}" class="action_button delete_item" aria-label="{{lang "topic.delete_aria"}}" data-action="delete"></a>{{end}}
|
|
{{if .CurrentUser.Perms.CloseTopic}}
|
|
{{if .Topic.IsClosed}}<a href='/topic/unlock/submit/{{.Topic.ID}}?session={{.CurrentUser.Session}}' class="action_button unlock_item" data-action="unlock" aria-label="{{lang "topic.unlock_aria"}}"></a>{{else}}<a href='/topic/lock/submit/{{.Topic.ID}}?session={{.CurrentUser.Session}}' class="action_button lock_item" data-action="lock" aria-label="{{lang "topic.lock_aria"}}"></a>{{end}}{{end}}
|
|
{{if .CurrentUser.Perms.PinTopic}}
|
|
{{if .Topic.Sticky}}<a href='/topic/unstick/submit/{{.Topic.ID}}?session={{.CurrentUser.Session}}' class="action_button unpin_item" data-action="unpin" aria-label="{{lang "topic.unpin_aria"}}"></a>{{else}}<a href='/topic/stick/submit/{{.Topic.ID}}?session={{.CurrentUser.Session}}' class="action_button pin_item" data-action="pin" aria-label="{{lang "topic.pin_aria"}}"></a>{{end}}{{end}}
|
|
{{if .CurrentUser.Perms.ViewIPs}}<a href="/users/ips/?ip={{.Topic.IPAddress}}" title="{{lang "topic.ip_full_tooltip"}}" class="action_button ip_item_button hide_on_big" aria-label="{{lang "topic.ip_full_aria"}}" data-action="ip"></a>{{end}}
|
|
<a href="/report/submit/{{.Topic.ID}}?session={{.CurrentUser.Session}}&type=topic" class="action_button report_item" aria-label="{{lang "topic.report_aria"}}" data-action="report"></a>
|
|
<a href="#" class="action_button button_menu"></a>
|
|
{{end}}
|
|
</div>
|
|
<div class="action_button_right">
|
|
<a class="action_button like_count hide_on_micro" aria-label="{{lang "topic.like_count_aria"}}">{{.Topic.LikeCount}}</a>
|
|
<a class="action_button created_at hide_on_mobile" title="{{abstime .Topic.CreatedAt}}">{{.Topic.RelativeCreatedAt}}</a>
|
|
{{if .CurrentUser.Perms.ViewIPs}}<a href="/users/ips/?ip={{.Topic.IPAddress}}" title="{{lang "topic.ip_full_tooltip"}}" class="action_button ip_item hide_on_mobile" aria-hidden="true">{{.Topic.IPAddress}}</a>{{end}}
|
|
</div>
|
|
</div>
|
|
</div><div style="clear:both;"></div>
|
|
</article>
|
|
{{template "topic_alt_posts.html" . }}
|
|
</div>
|
|
{{if gt .LastPage 1}}
|
|
{{template "paginator.html" . }}
|
|
{{end}}
|
|
|
|
{{if .CurrentUser.Loggedin}}
|
|
{{if .CurrentUser.Perms.CreateReply}}
|
|
{{if not .Topic.IsClosed or .CurrentUser.Perms.CloseTopic}}
|
|
<div class="rowblock topic_reply_container">
|
|
<div class="userinfo" aria-label="{{lang "topic.your_information"}}">
|
|
<div class="avatar_item" style="background-image: url({{.CurrentUser.Avatar}}), url(/static/white-dot.jpg);background-position: 0px -10px;"> </div>
|
|
<div class="user_meta">
|
|
<a href="{{.CurrentUser.Link}}" class="the_name" rel="author">{{.CurrentUser.Name}}</a>
|
|
{{if .CurrentUser.Tag}}<div class="tag_block"><div class="tag_pre"></div><div class="post_tag">{{.CurrentUser.Tag}}</div><div class="tag_post"></div></div>{{else}}<div class="tag_block"><div class="tag_pre"></div><div class="post_tag post_level">{{level .CurrentUser.Level}}</div><div class="tag_post"></div></div>{{end}}
|
|
</div>
|
|
</div>
|
|
<div class="rowblock topic_reply_form quick_create_form" aria-label="{{lang "topic.reply_aria"}}">
|
|
<form id="quick_post_form" enctype="multipart/form-data" action="/reply/create/?session={{.CurrentUser.Session}}" method="post"></form>
|
|
<input form="quick_post_form" name="tid" value='{{.Topic.ID}}' type="hidden" />
|
|
<input form="quick_post_form" id="has_poll_input" name="has_poll" value="0" type="hidden" />
|
|
<div class="formrow real_first_child">
|
|
<div class="formitem">
|
|
<textarea id="input_content" form="quick_post_form" name="reply-content" placeholder="{{lang "topic.reply_content_alt"}}" required></textarea>
|
|
</div>
|
|
</div>
|
|
<div class="formrow poll_content_row auto_hide">
|
|
<div class="formitem">
|
|
<div class="pollinput" data-pollinput="0">
|
|
<input type="checkbox" disabled />
|
|
<label class="pollinputlabel"></label>
|
|
<input form="quick_post_form" name="pollinputitem[0]" class="pollinputinput" type="text" placeholder="{{lang "topic.reply_add_poll_option"}}" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="formrow quick_button_row">
|
|
<div class="formitem">
|
|
<button form="quick_post_form" name="reply-button" class="formbutton">{{lang "topic.reply_button"}}</button>
|
|
<button form="quick_post_form" class="formbutton" id="add_poll_button">{{lang "topic.reply_add_poll_button"}}</button>
|
|
{{if .CurrentUser.Perms.UploadFiles}}
|
|
<input name="upload_files" form="quick_post_form" id="upload_files" multiple type="file" style="display: none;" />
|
|
<label for="upload_files" class="formbutton add_file_button">{{lang "topic.reply_add_file_button"}}</label>
|
|
<div id="upload_file_dock"></div>{{end}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
{{end}}
|
|
{{end}}
|
|
|
|
</main>
|
|
|
|
{{template "footer.html" . }}
|