diff options
Diffstat (limited to 'templates')
41 files changed, 1527 insertions, 84 deletions
diff --git a/templates/generic_page.html b/templates/generic_page.html new file mode 100644 index 00000000..e834aad0 --- /dev/null +++ b/templates/generic_page.html @@ -0,0 +1,71 @@ +<!doctype html> +<html> +<head> + {% block head %} + <link rel="stylesheet" media="screen" href="{{ config.url_stylesheet }}"> + {% if config.url_favicon %}<link rel="shortcut icon" href="{{ config.url_favicon }}">{% endif %} + <title>{{ board.url }} - {{ board.name }}</title> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=yes"> + {% if config.meta_keywords %}<meta name="keywords" content="{{ config.meta_keywords }}">{% endif %} + {% if config.default_stylesheet.1 != '' %}<link rel="stylesheet" type="text/css" id="stylesheet" href="{{ config.uri_stylesheets }}{{ config.default_stylesheet.1 }}">{% endif %} + {% if not nojavascript %} + <script type="text/javascript" src="{{ config.url_javascript }}"></script> + {% if not config.additional_javascript_compile %} + {% for javascript in config.additional_javascript %}<script type="text/javascript" src="{{ config.additional_javascript_url }}{{ javascript }}"></script>{% endfor %} + {% endif %} + {% endif %} + {% if config.recaptcha %}<style type="text/css">{% raw %} + .recaptcha_image_cell { + background: none !important; + } + table.recaptchatable { + border: none !important; + } + #recaptcha_logo, #recaptcha_tagline { + display: none; + float: right; + } + .recaptchatable a { + display: block; + } + {% endraw %}</style>{% endif %} + {% endblock %} +</head> +<body> + {{ boardlist.top }} + {% if pm %}<div class="top_notice">You have <a href="?/PM/{{ pm.id }}">an unread PM</a>{% if pm.waiting > 0 %}, plus {{ pm.waiting }} more waiting{% endif %}.</div><hr />{% endif %} + {% if config.url_banner %}<img class="banner" src="{{ config.url_banner }}" {% if config.banner_width or config.banner_height %}style="{% if config.banner_width %}width:{{ config.banner_width }}px{% endif %};{% if config.banner_width %}height:{{ config.banner_height }}px{% endif %}" {% endif %}alt="" />{% endif %} + <header> + <h1>{{ board.url }} - {{ board.name }}</h1> + <div class="subtitle"> + {% if board.title %} + {{ board.title|e }} + {% endif %} + {% if mod %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %} + </div> + </header> + + {% include 'post_form.html' %} + + {% if config.blotter %}<hr /><div class="blotter">{{ config.blotter }}</div>{% endif %} + <hr /> + <form name="postcontrols" action="{{ config.post_url }}" method="post"> + <input type="hidden" name="board" value="{{ board.uri }}" /> + {% if mod %}<input type="hidden" name="mod" value="1" />{% endif %} + {{ body }} + {% include 'report_delete.html' %} + </form> + <div class="pages">{{ btn.prev }} {% for page in pages %} + [<a {% if page.selected %}class="selected"{% endif %}{% if not page.selected %}href="{{ page.link }}"{% endif %}>{{ page.num }}</a>]{% if loop.last %} {% endif %} + {% endfor %} {{ btn.next }}</div> + {{ boardlist.bottom }} + <footer> + <p class="unimportant" style="margin-top:20px;text-align:center;">Powered by <a href="http://tinyboard.org/">Tinyboard</a> {{ config.version }} | <a href="http://tinyboard.org/">Tinyboard</a> Copyright © 2010-2012 Tinyboard Development Group</p> + {% for footer in config.footer %}<p class="unimportant" style="text-align:center;">{{ footer }}</p>{% endfor %} + </footer> + <script type="text/javascript">{% raw %} + ready(); + {% endraw %}</script> +</body> +</html> diff --git a/templates/index.html b/templates/index.html index e0fa6fe0..a28724a1 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,11 +1,11 @@ <!doctype html>
<html>
<head>
+ <meta charset="utf-8">
<link rel="stylesheet" media="screen" href="{{ config.url_stylesheet }}">
{% if config.url_favicon %}<link rel="shortcut icon" href="{{ config.url_favicon }}">{% endif %}
<title>{{ board.url }} - {{ board.name }}</title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=yes">
+ <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes">
{% if config.meta_keywords %}<meta name="keywords" content="{{ config.meta_keywords }}">{% endif %}
{% if config.default_stylesheet.1 != '' %}<link rel="stylesheet" type="text/css" id="stylesheet" href="{{ config.uri_stylesheets }}{{ config.default_stylesheet.1 }}">{% endif %}
{% if not nojavascript %}
@@ -35,10 +35,10 @@ {% if pm %}<div class="top_notice">You have <a href="?/PM/{{ pm.id }}">an unread PM</a>{% if pm.waiting > 0 %}, plus {{ pm.waiting }} more waiting{% endif %}.</div><hr />{% endif %}
{% if config.url_banner %}<img class="banner" src="{{ config.url_banner }}" {% if config.banner_width or config.banner_height %}style="{% if config.banner_width %}width:{{ config.banner_width }}px{% endif %};{% if config.banner_width %}height:{{ config.banner_height }}px{% endif %}" {% endif %}alt="" />{% endif %}
<header>
- <h1>{{ board.url }} - {{ board.name }}</h1>
+ <h1>{{ board.url }} - {{ board.title|e }}</h1>
<div class="subtitle">
- {% if board.title %}
- {{ board.title }}
+ {% if board.subtitle %}
+ {{ board.subtitle|e }}
{% endif %}
{% if mod %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %}
</div>
diff --git a/templates/mod/ban_form.html b/templates/mod/ban_form.html new file mode 100644 index 00000000..5d5f2b81 --- /dev/null +++ b/templates/mod/ban_form.html @@ -0,0 +1,91 @@ +{% if post and board %} + {% set action = '?/' ~ board ~ '/ban/' ~ post %} +{% else %} + {% set action = '?/ban' %} +{% endif %} + +<form action="{{ action }}" method="post"> + {% if redirect %} + <input type="hidden" name="redirect" value="{{ redirect|e }}"> + {% endif %} + {% if post and board %} + <input type="hidden" name="delete" value="{% if delete %}1{% else %}0{% endif %}"> + {% endif %} + + <table> + + <tr> + <th> + <label for="ip">{% trans 'IP' %} <span class="unimportant">{% trans '(or subnet)' %}</span></label> + </th> + <td> + {% if not hide_ip %} + <input type="text" name="ip" id="ip" size="30" maxlength="40" value="{{ ip }}"> + {% else %} + <em>{% trans 'hidden' %}</em> + {% endif %} + </td> + </tr> + <tr> + <th> + <label for="reason">{% trans 'Reason' %}</label> + </th> + <td> + <textarea name="reason" id="reason" rows="5" cols="30">{{ reason|e }}</textarea> + </td> + </tr> + {% if post and board and not delete %} + <tr> + <th> + <label for="reason">{% trans 'Message' %}</label> + </th> + <td> + <input type="checkbox" id="public_message" name="public_message"> + <input type="text" name="message" id="message" size="35" maxlength="200" value="{{ config.mod.default_ban_message|e }}"> + <span class="unimportant">({% trans 'public; attached to post' %})</span> + <script type="text/javascript"> + document.getElementById('message').disabled = true; + document.getElementById('public_message').onchange = function() { + document.getElementById('message').disabled = !this.checked; + } + </script> + </td> + </tr> + {% endif %} + <tr> + <th> + <label for="length">{% trans 'Length' %}</label> + </th> + <td> + <input type="text" name="length" id="length" size="20" maxlength="40"> + <span class="unimportant">(eg. "2d1h30m" or "2 days")</span></td> + </tr> + <tr> + <th>{% trans 'Board' %}</th> + <td> + <ul style="list-style:none;padding:2px 5px"> + <li> + <input type="radio" name="board" value="*" id="ban-allboards" checked> + <label style="display:inline" for="ban-allboards"> + <em>{% trans 'all boards' %}</em> + </label> + </li> + + {% for board in boards %} + <li> + <input type="radio" name="board" value="{{ board.uri }}" id="ban-board-{{ board.uri }}"> + <label style="display:inline" for="ban-board-{{ board.uri }}"> + {{ config.board_abbreviation|sprintf(board.uri) }} - {{ board.title|e }} + </label> + </li> + {% endfor %} + </ul> + </td> + </tr> + <tr> + <td></td> + <td><input name="new_ban" type="submit" value="{% trans 'New Ban' %}"></td> + </tr> + </table> +</form> + diff --git a/templates/mod/ban_list.html b/templates/mod/ban_list.html new file mode 100644 index 00000000..2edb9cdf --- /dev/null +++ b/templates/mod/ban_list.html @@ -0,0 +1,95 @@ +{% if bans|count == 0 %} + <p style="text-align:center" class="unimportant">({% trans 'There are no active bans.' %})</p> +{% else %} + <form action="" method="post"> + <table class="mod" style="width:100%"> + <tr> + <th>{% trans 'IP address/mask' %}</th> + <th>{% trans 'Reason' %}</th> + <th>{% trans 'Board' %}</th> + <th>{% trans 'Set' %}</th> + <th>{% trans 'Duration' %}</th> + <th>{% trans 'Expires' %}</th> + <th>{% trans 'Staff' %}</th> + </tr> + {% for ban in bans %} + <tr{% if ban.expires != 0 and ban.expires < time() %} style="text-decoration:line-through"{% endif %}> + <td style="white-space: nowrap"> + <input type="checkbox" name="ban_{{ ban.id }}"> + {% if ban.real_ip %} + <a href="?/IP/{{ ban.ip }}">{{ ban.ip }}</a> + {% else %} + {{ ban.ip|e }} + {% endif %} + </td> + <td> + {% if ban.reason %} + {{ ban.reason }} + {% else %} + - + {% endif %} + </td> + <td style="white-space: nowrap"> + {% if ban.board %} + {{ config.board_abbreviation|sprintf(ban.board) }} + {% else %} + <em>{% trans 'all boards' %}</em> + {% endif %} + </td> + <td style="white-space: nowrap"> + <span title="{{ ban.set|date(config.post_date) }}"> + {{ ban.set|ago }} ago + </span> + </td> + <td style="white-space: nowrap"> + {% if ban.expires == 0 %} + - + {% else %} + {{ (ban.expires - ban.set + time()) | until }} + {% endif %} + </td> + <td style="white-space: nowrap"> + {% if ban.expires == 0 %} + <em>{% trans 'never' %}</em> + {% else %} + {{ ban.expires|date(config.post_date) }} + {% if ban.expires > time() %} + <small>(in {{ ban.expires|until }})</small> + {% endif %} + {% endif %} + </td> + <td> + {% if ban.username %} + {% if mod|hasPermission(config.mod.view_banstaff) %} + <a href="?/new_PM/{{ ban.username|e }}">{{ ban.username|e }}</a> + {% else %} + {% if mod|hasPermission(config.mod.view_banquestionmark) %} + <em>?</em> + {% else %} + + {% endif %} + {% endif %} + {% elseif ban.mod == -1 %} + <em>system</em> + {% else %} + <em>{% trans 'deleted?' %}</em> + {% endif %} + </td> + </tr> + {% endfor %} + </table> + + <p style="text-align:center"> + <input type="submit" name="unban" value="{% trans 'Unban selected' %}"> + </p> + </form> +{% endif %} + +{% if count > bans|count %} + <p class="unimportant" style="text-align:center;word-wrap:break-word"> + {% for i in range(0, (count - 1) / config.mod.modlog_page) %} + <a href="?/bans/{{ i + 1 }}">[{{ i + 1 }}]</a> + {% endfor %} + </p> +{% endif %} + diff --git a/templates/mod/board.html b/templates/mod/board.html new file mode 100644 index 00000000..0775e421 --- /dev/null +++ b/templates/mod/board.html @@ -0,0 +1,44 @@ +{% if new %} + {% set action = '?/new-board' %} +{% else %} + {% set action = '?/edit/' ~ board.uri %} +{% endif %} + +<form action="{{ action }}" method="post"> + <table> + <tr> + <th>{% trans 'URI' %}</th> + <td> + {% if not new %} + {{ config.board_abbreviation|sprintf(board.uri) }} + {% else %} + /<input size="10" maxlength="255" type="text" name="uri" autocomplete="off">/ + {% endif %} + </td> + </tr> + <tr> + <th>{% trans 'Title' %}</th> + <td> + <input size="25" type="text" name="title" value="{{ board.title|e }}" autocomplete="off"> + </td> + </tr> + <tr> + <th>{% trans 'Subtitle' %}</th> + <td> + <input size="25" type="text" name="subtitle" value="{{ board.subtitle|e }}" autocomplete="off"> + </td> + </tr> + </table> + + <ul style="padding:0;text-align:center;list-style:none"> + {% if new %} + <li><input type="submit" value="{% trans 'Create board' %}"></li> + {% else %} + <li><input type="submit" value="{% trans 'Save changes' %}"></li> + {% if mod|hasPermission(config.mod.deleteboard) %} + <li><input name="delete" onclick="return confirm('Are you sure you want to permanently delete this board?');" type="submit" value="{% trans 'Delete board' %}"></li> + {% endif %} + {% endif %} + </ul> +</form> + diff --git a/templates/mod/config-editor.html b/templates/mod/config-editor.html new file mode 100644 index 00000000..ec7213bb --- /dev/null +++ b/templates/mod/config-editor.html @@ -0,0 +1,56 @@ +<form method="post" action=""> + <table class="mod config-editor"> + <tr> + <th class="minimal">Name</th> + <th>Value</th> + <th class="minimal">Type</th> + <th>Description</th> + </tr> + {% for var in conf if var.type != 'array' %} + {% if var.name|count == 1 %} + {% set name = 'cf_' ~ var.name %} + {% else %} + {% set name = 'cf_' ~ var.name|join('/') %} + {% endif %} + + <tr> + <th class="minimal"> + {% if var.name|count == 1 %} + {{ var.name }} + {% else %} + {{ var.name|join(' → ') }} + {% endif %} + </th> + + <td> + {% if var.type == 'string' %} + <input name="{{ name }}" type="text" value="{{ var.value|e }}"> + {% elseif var.type == 'integer' %} + <input name="{{ name }}" type="number" value="{{ var.value|e }}"> + {% elseif var.type == 'boolean' %} + <input name="{{ name }}" type="checkbox" {% if var.value %}checked{% endif %}> + {% else %} + ? + {% endif %} + + {% if var.type == 'integer' or var.type == 'boolean' %} + <small>Default: <code>{{ var.default }}</code></small> + {% endif %} + </td> + + <td class="minimal"> + {{ var.type|e }} + </td> + + <td> + {{ var.comment|join('<br>') }} + </td> + </tr> + {% endfor %} + </table> + + <ul style="padding:0;text-align:center;list-style:none"> + <li><input name="save" type="submit" value="{% trans 'Save changes' %}"></li> + </ul> +</form> + diff --git a/templates/mod/confirm.html b/templates/mod/confirm.html new file mode 100644 index 00000000..6dc4d66a --- /dev/null +++ b/templates/mod/confirm.html @@ -0,0 +1,7 @@ +<p style="text-align:center;font-size:1.1em"> + {% trans 'Are you sure you want to do that?' %} <a href="?/{{ request }}">{% trans 'Click to proceed to' %} ?/{{ request }}</a>. +</p> +<p class="unimportant" style="text-align:center"> + {% trans 'You are seeing this message because we were unable to serve a confirmation dialog, probably due to Javascript being disabled.' %} +</p> + diff --git a/templates/mod/dashboard.html b/templates/mod/dashboard.html new file mode 100644 index 00000000..30742dc1 --- /dev/null +++ b/templates/mod/dashboard.html @@ -0,0 +1,139 @@ +<fieldset> + <legend>{% trans 'Boards' %}</legend> + + <ul> + {% for board in boards %} + <li> + <a href="?/{{ config.board_path|sprintf(board.uri) }}{{ config.file_index }}">{{ config.board_abbreviation|sprintf(board.uri) }}</a> + - + {{ board.title|e }} + {% if board.subtitle %} + <small>— {{ board.subtitle|e }}</small> + {% endif %} + {% if mod|hasPermission(config.mod.manageboards) %} + <a href="?/edit/{{ board.uri }}"><small>[{% trans 'edit' %}]</small></a> + {% endif %} + </li> + {% endfor %} + + {% if mod|hasPermission(config.mod.newboard) %} + <li style="margin-top:15px"><a href="?/new-board"><strong>{% trans 'Create new board' %}</strong></a></li> + {% endif %} + </ul> +</fieldset> + +<fieldset> + <legend>{% trans 'Messages' %}</legend> + <ul> + {% if mod|hasPermission(config.mod.noticeboard) %} + {% if noticeboard|count > 0 %} + <li> + {% trans 'Noticeboard' %}: + <ul> + {% for post in noticeboard %} + <li> + <a href="?/noticeboard#{{ post.id }}"> + {% if post.subject %} + {{ post.subject|e }} + {% else %} + <em>{% trans 'no subject' %}</em> + {% endif %} + </a> + <small class="unimportant"> + — by + {% if post.username %} + {{ post.username|e }} + {% else %} + <em>deleted?</em> + {% endif %} + at + {{ post.time|date(config.post_date) }} + </small> + </li> + {% endfor %} + </ul> + </li> + {% endif %} + <li><a href="?/noticeboard">{% trans 'View all entries' %}</a></li> + {% endif %} + <li><a href="?/news">{% trans 'News' %}</a></li> + <li> + <a href="?/inbox"> + {% trans 'PM inbox' %} + {% if unread_pms > 0 %}<strong>{%endif %}({{ unread_pms }} unread){% if unread_pms > 0 %}</strong>{%endif %} + </a> + </li> + </ul> +</fieldset> + +<fieldset> + <legend>{% trans 'Administration' %}</legend> + + <ul> + {% if mod|hasPermission(config.mod.reports) %} + <li> + {% if reports > 0 %}<strong>{% endif %} + <a href="?/reports">{% trans 'Report queue' %} ({{ reports }})</a> + {% if reports > 0 %}</strong>{% endif %} + </li> + {% endif %} + {% if mod|hasPermission(config.mod.view_banlist) %} + <li><a href="?/bans">{% trans 'Ban list' %}</a></li> + {% endif %} + {% if mod|hasPermission(config.mod.manageusers) %} + <li><a href="?/users">{% trans 'Manage users' %}</a></li> + {% elseif mod|hasPermission(config.mod.change_password) %} + <li><a href="?/users/{{ mod.id }}">{% trans 'Change password' %}</a></li> + {% endif %} + {% if mod|hasPermission(config.mod.themes) %} + <li><a href="?/themes">{% trans 'Manage themes' %}</a></li> + {% endif %} + {% if mod|hasPermission(config.mod.modlog) %} + <li><a href="?/log">{% trans 'Moderation log' %}</a></li> + {% endif %} + {% if mod|hasPermission(config.mod.rebuild) %} + <li><a href="?/rebuild">{% trans 'Rebuild' %}</a></li> + {% endif %} + {% if mod|hasPermission(config.mod.show_config) %} + <li><a href="?/config">{% trans 'Configuration' %}</a></li> + {% endif %} + + </ul> +</fieldset> + +<fieldset> + <legend>{% trans 'Search' %}</legend> + + {# TODO #} +</fieldset> + +{% if config.debug %} + <fieldset> + <legend>{% trans 'Debug' %}</legend> + <ul> + <li><a href="?/debug/antispam">{% trans 'Anti-spam' %}</a></li> + </ul> + </fieldset> +{% endif %} + +{% if newer_release %} + <fieldset> + <legend>Update</legend> + <ul> + <li> + A newer version of Tinyboard + (<strong>v{{ newer_release.massive }}.{{ newer_release.major }}.{{ newer_release.minor }}</strong>) is available! + See <a href="http://tinyboard.org">http://tinyboard.org/</a> for upgrade instructions. + </li> + </ul> + </fieldset> +{% endif %} + +<fieldset> + <legend>{% trans 'User account' %}</legend> + + <ul> + <li><a href="?/logout">{% trans 'Logout' %}</a></li> + </ul> +</fieldset> + diff --git a/templates/mod/debug/antispam.html b/templates/mod/debug/antispam.html new file mode 100644 index 00000000..a846bc17 --- /dev/null +++ b/templates/mod/debug/antispam.html @@ -0,0 +1,65 @@ +<p style="text-align:center"> + Most used (in active): +</p> +<table class="modlog" style="width:700px;margin:auto"> + <tr> + <th>Board</th> + <th>Thread</th> + <th>Hash (SHA1)</th> + <th>Created</th> + <th>Expires</th> + <th>Passed</th> + </tr> + {% for hash in top %} + <tr> + <td>{{ config.board_abbreviation|sprintf(hash.board) }}</td> + <td> + {% if hash.thread %} + {{ hash.thread }} + {% else %} + - + {% endif %}</td> + <td> + <small><code>{{ hash.hash }}</code></small> + </td> + <td> + <span title="{{ hash.created|date(config.post_date) }}">{{ hash.created|ago }} ago</span> + </td> + <td> + {% if hash.expires %} + <span title="{{ hash.expires|date(config.post_date) }}"> + {{ hash.expires|until }} + </span> + {% else %} + - + {% endif %} + </td> + <td>{{ hash.passed }}</td> + </tr> + {% endfor %} +</table> +<p style="text-align:center"> + Total: <strong>{{ total }}</strong> (<strong>{{ expiring }}</strong> set to expire) +</p> + +<form method="post" action="?/debug/antispam"> + <table class="modlog" style="width:1%;white-space:nowrap;margin:auto"> + <tr> + <th>Board</th> + <th>Thread</th> + <th></th> + </tr> + <tr> + <td> + <input type="text" name="board" style="width:90px" value="{{ board }}"> + </td> + <td> + <input type="text" name="thread" style="width:90px" value="{{ thread }}"> + </td> + <td> + <input type="submit" name="filter" value="Filter"> + <input type="submit" name="purge" value="Purge"> + </td> + </tr> + </table> +</form> diff --git a/templates/mod/inbox.html b/templates/mod/inbox.html new file mode 100644 index 00000000..97afe446 --- /dev/null +++ b/templates/mod/inbox.html @@ -0,0 +1,36 @@ +{% if messages|count == 0 %} + <p style="text-align:center" class="unimportant">({% trans 'No private messages for you.' %})</p> +{% else %} + <table class="modlog"> + <tr> + <th>{% trans 'ID' %}</th> + <th>{% trans 'From' %}</th> + <th>{% trans 'Date' %}</th> + <th>{% trans 'Message snippet' %}</th> + </tr> + {% for message in messages %} + <tr{% if message.unread %} style="font-weight:bold"{% endif %}> + <td class="minimal"> + <a href="?/PM/{{ message.id }}"> + {{ message.id }} + </a> + </td> + <td class="minimal"> + {% if message.username %} + <a href="?/new_PM/{{ message.username|e }}">{{ message.username|e }}</a> + {% else %} + <em>{% trans 'deleted?' %}</em> + {% endif %} + </td> + <td class="minimal"> + {{ message.time|date(config.post_date) }} + </td> + <td> + <a href="?/PM/{{ message.id }}"> + {{ message.snippet }} + </a> + </td> + </tr> + {% endfor %} + </table> +{% endif %} diff --git a/templates/mod/log.html b/templates/mod/log.html new file mode 100644 index 00000000..dca1b2d0 --- /dev/null +++ b/templates/mod/log.html @@ -0,0 +1,47 @@ +<table class="modlog"> + <tr> + <th>{% trans 'Staff' %}</th> + <th>{% trans 'IP address' %}</th> + <th>{% trans 'Time' %}</th> + <th>{% trans 'Board' %}</th> + <th>{% trans 'Action' %}</th> + </tr> + {% for log in logs %} + <tr> + <td class="minimal"> + {% if log.username %} + <a href="?/new_PM/{{ log.username|e }}">{{ log.username|e }}</a> + {% elseif log.mod == -1 %} + <em>system</em> + {% else %} + <em>{% trans 'deleted?' %}</em> + {% endif %} + </td> + <td class="minimal"> + <a href="?/IP/{{ log.ip }}">{{ log.ip }}</a> + </td> + <td class="minimal"> + <span title="{{ log.time|date(config.post_date) }}">{{ log.time|ago }}</span> + </td> + <td class="minimal"> + {% if log.board %} + <a href="?/{{ config.board_path|sprintf(log.board) }}{{ config.file_index }}">{{ config.board_abbreviation|sprintf(log.board) }}</a> + {% else %} + - + {% endif %} + </td> + <td> + {{ log.text }} + </td> + </tr> + {% endfor %} +</table> + +{% if count > logs|count %} + <p class="unimportant" style="text-align:center;word-wrap:break-word"> + {% for i in range(0, (count - 1) / config.mod.modlog_page) %} + <a href="?/log/{{ i + 1 }}">[{{ i + 1 }}]</a> + {% endfor %} + </p> +{% endif %} + diff --git a/templates/login.html b/templates/mod/login.html index 709bad86..43a28d56 100644 --- a/templates/login.html +++ b/templates/mod/login.html @@ -1,18 +1,17 @@ {% if error %}<h2 style="text-align:center">{{ error }}</h2>{% endif %}
<form action="" method="post">
-{% if redirect %}<input type="hidden" name="redirect" value="{{ redirect }}" />{% endif %}
<table style="margin-top:25px;">
<tr>
<th>
- {% trans %}Username{% endtrans %}
+ {% trans 'Username' %}
</th>
<td>
- <input type="text" name="username" size="20" maxlength="30" value="{{ username }}">
+ <input type="text" name="username" size="20" maxlength="30" value="{{ username|e }}">
</td>
</tr>
<tr>
<th>
- {% trans %}Password{% endtrans %}
+ {% trans 'Password' %}
</th>
<td>
<input type="password" name="password" size="20" maxlength="30" value="">
diff --git a/templates/mod/move.html b/templates/mod/move.html new file mode 100644 index 00000000..802903b2 --- /dev/null +++ b/templates/mod/move.html @@ -0,0 +1,41 @@ +<form action="?/{{ board }}/move/{{ post }}" method="post"> + <table> + <tr> + <th> + {% trans 'Thread ID' %} + </th> + <td> + >>>{{ config.board_abbreviation|sprintf(board) }}{{ post }} + </td> + </tr> + <tr> + <th> + {% trans 'Leave shadow thread' %} + </th> + <td> + <input type="checkbox" name="shadow" checked> + <span class="unimportant">({% trans 'locks thread; replies to it with a link.' %})</span> + </td> + </tr> + <tr> + <th>{% trans 'Target board' %}</th> + <td> + <ul style="list-style:none;padding:0"> + {% for targetboard in boards if targetboard.uri != board %} + <li> + <input type="radio" name="board" value="{{ targetboard.uri }}" id="ban-board-{{ targetboard.uri }}"> + <label style="display:inline" for="ban-board-{{ targetboard.uri }}"> + {{ config.board_abbreviation|sprintf(targetboard.uri) }} - {{ targetboard.title|e }} + </label> + </li> + {% endfor %} + </ul> + </td> + </tr> + </table> + + <ul style="padding:0;text-align:center;list-style:none"> + <li><input type="submit" value="{% trans 'Move thread' %}"></li> + </ul> +</form> + diff --git a/templates/mod/new_pm.html b/templates/mod/new_pm.html new file mode 100644 index 00000000..3fd78ac6 --- /dev/null +++ b/templates/mod/new_pm.html @@ -0,0 +1,18 @@ +<form action="?/new_PM/{{ username|e }}" method="post"> + <table> + <tr> + <th>To</th> + {% if mod|hasPermission(config.mod.editusers) %} + <td><a href="?/users/{{ id }}">{{ username|e }}</a></td> + {% else %} + <td>{{ username|e }}</td> + {% endif %} + </tr> + <tr> + <th>Message</th> + <td><textarea name="message" rows="10" cols="40">{{ message }}</textarea></td> + </tr> + </table> + + <p style="text-align:center"><input type="submit" value="{% trans 'Send message' %}"></p> +</form> diff --git a/templates/mod/news.html b/templates/mod/news.html new file mode 100644 index 00000000..b6c35798 --- /dev/null +++ b/templates/mod/news.html @@ -0,0 +1,70 @@ +{% if mod|hasPermission(config.mod.news) %} + <fieldset> + <legend>{% trans 'New post' %}</legend> + <form style="margin:0" action="" method="post"> + <table> + <tr> + <th> + {% if mod|hasPermission(config.mod.news_custom) %} + <label for="name">{% trans 'Name' %}</label> + {% else %} + {% trans 'Name' %} + {% endif %} + </th> + <td> + {% if mod|hasPermission(config.mod.news_custom) %} + <input type="text" size="55" name="name" id="name" value="{{ mod.username|e }}"> + {% else %} + {{ mod.username|e }} + {% endif %} + </td> + </tr> + <tr> + <th><label for="subject">{% trans 'Subject' %}</label></th> + <td><input type="text" size="55" name="subject" id="subject"></td> + </tr> + <tr> + <th><label for="body">{% trans 'Body' %}</label></th> + <td><textarea name="body" id="body" style="width:100%;height:100px"></textarea></td> + </tr> + </table> + <p style="text-align:center"> + <input type="submit" value="{% trans 'Post news entry' %}"> + </p> + </form> + </fieldset> +{% endif %} + +{% for post in news %} + <div class="ban"> + {% if mod|hasPermission(config.mod.news_delete) %} + <span style="float:right;padding:2px"> + <a class="unimportant" href="?/news/delete/{{ post.id }}">[{% trans 'delete' %}]</a> + </span> + {% endif %} + <h2 id="{{ post.id }}"> + <small class="unimportant"> + <a href="#{{ post.id }}">#</a> + </small> + {% if post.subject %} + {{ post.subject|e }} + {% else %} + <em>{% trans 'no subject' %}</em> + {% endif %} + <small class="unimportant"> + — {% trans 'by' %} {{ post.name }} {% trans 'at' %} {{ notice.time|date(config.post_date) }} + </small> + </h2> + <p> + {{ post.body }} + </p> + </div> +{% endfor %} + +{% if count > news|count %} + <p class="unimportant" style="text-align:center;word-wrap:break-word"> + {% for i in range(0, (count - 1) / config.mod.news_page) %} + <a href="?/news/{{ i + 1 }}">[{{ i + 1 }}]</a> + {% endfor %} + </p> +{% endif %} diff --git a/templates/mod/noticeboard.html b/templates/mod/noticeboard.html new file mode 100644 index 00000000..463b8430 --- /dev/null +++ b/templates/mod/noticeboard.html @@ -0,0 +1,65 @@ +{% if mod|hasPermission(config.mod.noticeboard_post) %} + <fieldset> + <legend>{% trans 'New post' %}</legend> + <form style="margin:0" action="" method="post"> + <table> + <tr> + <th>{% trans 'Name' %}</th> + <td>{{ mod.username|e }}</td> + </tr> + <tr> + <th><label for="subject">{% trans 'Subject' %}</label></th> + <td><input type="text" size="55" name="subject" id="subject" /></td> + </tr> + <tr> + <th>{% trans 'Body' %}</th> + <td><textarea name="body" style="width:100%;height:100px"></textarea></td> + </tr> + </table> + <p style="text-align:center"> + <input type="submit" value="{% trans 'Post to noticeboard' %}" /> + </p> + </form> + </fieldset> +{% endif %} + +{% for post in noticeboard %} + <div class="ban"> + {% if mod|hasPermission(config.mod.noticeboard_delete) %} + <span style="float:right;padding:2px"> + <a class="unimportant" href="?/noticeboard/delete/{{ post.id }}">[{% trans 'delete' %}]</a> + </span> + {% endif %} + <h2 id="{{ post.id }}"> + <small class="unimportant"> + <a href="#{{ post.id }}">#</a> + </small> + {% if post.subject %} + {{ post.subject|e }} + {% else %} + <em>{% trans 'no subject' %}</em> + {% endif %} + <small class="unimportant"> + — {% trans 'by' %} + {% if post.username %} + {{ post.username|e }} + {% else %} + <em>{% trans 'deleted?' %}</em> + {% endif %} + {% trans 'at' %} + {{ post.time|date(config.post_date) }} + </small> + </h2> + <p> + {{ post.body }} + </p> + </div> +{% endfor %} + +{% if count > noticeboard|count %} + <p class="unimportant" style="text-align:center;word-wrap:break-word"> + {% for i in range(0, (count - 1) / config.mod.noticeboard_page) %} + <a href="?/noticeboard/{{ i + 1 }}">[{{ i + 1 }}]</a> + {% endfor %} + </p> +{% endif %} diff --git a/templates/mod/pm.html b/templates/mod/pm.html new file mode 100644 index 00000000..c62cae58 --- /dev/null +++ b/templates/mod/pm.html @@ -0,0 +1,44 @@ +<form action="" method="post"> + <table> + <tr> + <th>{% trans 'From' %}</th> + {% if username %} + <td><a href="?/new_PM/{{ username|e }}">{{ username|e }}</a></td> + {% else %} + <td><em>{% trans 'deleted?' %}</em></td> + {% endif %} + </tr> + {% if to != mod.id %} + <tr> + <th>To</th> + {% if to_username %} + <td><a href="?/new_PM/{{ to_username|e }}">{{ to_username|e }}</a></td> + {% else %} + <td><em>{% trans 'deleted?' %}</em></td> + {% endif %} + </tr> + {% endif %} + <tr> + <th>{% trans 'Date' %}</th> + <td>{{ time|date(config.post_date) }} <small>({{ time|ago }} ago)</small></td> + + </tr> + <tr> + <th>{% trans 'Message' %}</th> + <td>{{ message }}</td> + </tr> + </table> + + <ul style="list-style:none;text-align:center;padding:0"> + <li style="padding:5px 0"> + <input type="submit" name="delete" value="{% trans 'Delete forever' %}"> + </li> + {% if mod|hasPermission(config.mod.create_pm) %} + <li style="padding:5px 0"> + <a href="?/PM/{{ id }}/reply"> + {% trans 'Reply with quote' %} + </a> + </li> + {% endif %} + </ul> +</form> diff --git a/templates/mod/rebuild.html b/templates/mod/rebuild.html new file mode 100644 index 00000000..7c6b28ba --- /dev/null +++ b/templates/mod/rebuild.html @@ -0,0 +1,71 @@ +<form style="width:300px;margin:auto" action="?/rebuild" method="post"> + <ul id="rebuild"> + <li style="margin-bottom:8px"> + <input type="checkbox" name="rebuild_all" id="rebuild_all" onchange="toggleall(this.checked)"> + <label for="rebuild_all"><strong>{% trans 'Toggle all' %}</strong></label> + <script> + function toggleall(val) { + /* TODO: something more suitable for all browsers? */ + var elements = document.getElementById('rebuild').querySelectorAll('input'); + for (i in elements) { + elements[i].checked = val; + } + } + </script> + </li> + <li> + <input type="checkbox" name="rebuild_cache" id="rebuild_cache" checked> + <label for="rebuild_cache">{% trans 'Flush cache' %}</label> + </li> + <li> + <input type="checkbox" name="rebuild_javascript" id="rebuild_javascript" checked> + <label for="rebuild_javascript">{% trans 'Rebuild Javascript' %}</label> + </li> + <li> + <input type="checkbox" name="rebuild_index" id="rebuild_index" checked> + <label for="rebuild_index">{% trans 'Rebuild index pages' %}</label> + </li> + <li> + <input type="checkbox" name="rebuild_thread" id="rebuild_thread" checked> + <label for="rebuild_thread">{% trans 'Rebuild thread pages' %}</label> + </li> + <li> + <input type="checkbox" name="rebuild_themes" id="rebuild_themes" checked> + <label for="rebuild_themes">{% trans 'Rebuild themes' %}</label> + </li> + <li> + <input type="checkbox" name="rebuild_posts" id="rebuild_posts"> + <label for="rebuild_posts">{% trans 'Rebuild replies' %}</label> + </li> + </ul> + + <hr> + + <ul id="boards"> + <li style="margin-bottom:8px"> + <input type="checkbox" name="boards_all" id="boards_all" onchange="toggleallboards(this.checked)" checked> + <label for="boards_all"><strong>{% trans 'All boards' %}</strong></label> + <script> + function toggleallboards(val) { + /* TODO: something more suitable for all browsers? */ + var elements = document.getElementById('boards').querySelectorAll('input'); + for (i in elements) { + elements[i].checked = val; + } + } + </script> + </li> + {% for board in boards %} + <li> + <input type="checkbox" name="board_{{ board.uri }}" id="board-{{ board.uri }}" checked> + <label for="board-{{ board.uri }}"> + {{ config.board_abbreviation|sprintf(board.uri) }} - {{ board.title|e }} + </label> + </li> + {% endfor %} + </ul> + + <p style="text-align:center"> + <input type="submit" value="{% trans 'Rebuild' %}" name="rebuild"> + </p> +</form> diff --git a/templates/mod/rebuilt.html b/templates/mod/rebuilt.html new file mode 100644 index 00000000..57d16fff --- /dev/null +++ b/templates/mod/rebuilt.html @@ -0,0 +1,12 @@ +<div class="ban"> + <h2>{% trans 'Rebuilt' %}</h2> + <ul> + {% for log in logs %} + <li>{{ log }}</li> + {% endfor %} + </ul> + <p> + <a href="?/rebuild">{% trans 'Go back and rebuild again' %}</a>. + </p> +</div> + diff --git a/templates/mod/report.html b/templates/mod/report.html new file mode 100644 index 00000000..9c8463ed --- /dev/null +++ b/templates/mod/report.html @@ -0,0 +1,26 @@ +<div class="report"> + <hr> + {% trans 'Board' %}: <a href="?/{{ report.board }}/{{ config.file_index }}">{{ config.board_abbreviation|sprintf(report.board) }}</a> + <br> + {% trans 'Reason' %}: {{ report.reason }} + <br> + {% trans 'Report date' %}: {{ report.time|date(config.post_date) }} + <br> + {% if mod|hasPermission(config.mod.show_ip, report.board) %} + {% trans 'Reported by' %}: <a href="?/IP/{{ report.ip }}">{{ report.ip }}</a> + <br> + {% endif %} + {% if mod|hasPermission(config.mod.report_dismiss, report.board) or mod|hasPermission(config.mod.report_dismiss_ip, report.board) %} + <hr> + {% if mod|hasPermission(config.mod.report_dismiss, report.board) %} + <a title="{% trans 'Discard abuse report' %}" href="?/reports/{{ report.id }}/dismiss">Dismiss</a> + {% endif %} + {% if mod|hasPermission(config.mod.report_dismiss_ip, report.board) %} + {% if mod|hasPermission(config.mod.report_dismiss, report.board) %} + | + {% endif %} + <a title="{% trans 'Discard all abuse reports by this IP address' %}" href="?/reports/{{ report.id }}/dismissall">Dismiss+</a> + {% endif %} + {% endif %} +</div> + diff --git a/templates/mod/reports.html b/templates/mod/reports.html new file mode 100644 index 00000000..26bceacc --- /dev/null +++ b/templates/mod/reports.html @@ -0,0 +1,6 @@ +{% if reports %} + {{ reports }} +{% else %} + <p style="text-align:center" class="unimportant">({% trans 'There are no reports.' %})</p> +{% endif %} + diff --git a/templates/mod/theme_config.html b/templates/mod/theme_config.html new file mode 100644 index 00000000..2dbb8397 --- /dev/null +++ b/templates/mod/theme_config.html @@ -0,0 +1,27 @@ +<form action="" method="post"> + {% if not config %} + <p style="text-align:center" class="unimportant">(No configuration required.)</p> + {% else %} + <table> + {% for conf in theme.config %} + <tr> + <th>{{ conf.title }}</th> + <td> + <input type="text" name="{{ conf.name }}" + {% if settings[conf.name] %}value="{{ settings[conf.name] }}"{% else %}{% if conf.default %}value="{{ conf.default }}"{% endif %}{% endif %} + {% if conf.size %} + size="{{ conf.size }}" + {% endif %} + /> + {% if conf.comment %} + <span class="unimportant">{{ conf.comment }}</span> + {% endif %} + </td> + </tr> + {% endfor %} + </table> + {% endif %} + <p style="text-align:center"> + <input name="install" type="submit" value="{% trans 'Install theme' %}" /> + </p> +</form> diff --git a/templates/mod/theme_installed.html b/templates/mod/theme_installed.html new file mode 100644 index 00000000..e6beec10 --- /dev/null +++ b/templates/mod/theme_installed.html @@ -0,0 +1,9 @@ +{% if message %} + <div style="border:1px dashed maroon;padding:20px;margin:auto;max-width:800px">{{ message }}</div> +{% endif %} + +{% if result %} + <p style="text-align:center">{% trans 'Successfully installed and built theme.' %}</p> +{% endif %} + +<p style="text-align:center"><a href="?/themes">{% trans 'Go back to themes' %}</a>.</p> diff --git a/templates/mod/theme_rebuilt.html b/templates/mod/theme_rebuilt.html new file mode 100644 index 00000000..b366e7a6 --- /dev/null +++ b/templates/mod/theme_rebuilt.html @@ -0,0 +1,2 @@ +<p style="text-align:center">{{ 'Successfully rebuilt the <strong>%s</strong> theme.'|trans|sprintf(theme_name) }}</p> +<p style="text-align:center"><a href="?/themes">{% trans 'Go back to themes' %}</a>.</p> diff --git a/templates/mod/themes.html b/templates/mod/themes.html new file mode 100644 index 00000000..b596826d --- /dev/null +++ b/templates/mod/themes.html @@ -0,0 +1,40 @@ +{% if themes|count == 0 %} + <p style="text-align:center" class="unimportant">({% trans 'There are no themes available.' %})</p> +{% else %} + <table class="modlog"> + {% for theme_name, theme in themes %} + <tr> + <th class="minimal">{% trans 'Name' %}</th> + <td>{{ theme.name }}</td> + </tr> + <tr> + <th class="minimal">{% trans 'Version' %}</th> + <td>{{ theme.version }}</td> + </tr> + <tr> + <th class="minimal">{% trans 'Description' %}</th> + <td>{{ theme.description }}</td> + </tr> + <tr> + <th class="minimal">{% trans 'Thumbnail' %}</th> + <td> + <img style="float:none;margin:4px{% if theme_name in themes_in_use %};border:2px solid red;padding:4px{% endif %}" src="{{ config.dir.themes_uri }}/{{ theme_name }}/thumb.png" /> + </td> + </tr> + <tr> + <th class="minimal">{% trans 'Actions' %}</th> + <td><ul style="padding:0 20px"> + <li><a title=" {% trans 'Use theme' %}" href="?/themes/{{ theme_name }}"> + {% if theme_name in themes_in_use %}{% trans 'Reconfigure' %}{% else %}{% trans 'Install' %}{% endif %} + </a></li> + {% if theme_name in themes_in_use %} + <li><a href="?/themes/{{ theme_name }}/rebuild">{% trans 'Rebuild' %}</a></li> + <li><a href="?/themes/{{ theme_name }}/uninstall" onclick="return confirm('Are you sure you want to uninstall this theme?');">{% trans 'Uninstall' %}</a></li> + {% endif %} + </ul></td> + </tr> + <tr style="height:40px"><td colspan="2"><hr/></td></tr> + </tr> + {% endfor %} + </table> +{% endif %} diff --git a/templates/mod/user.html b/templates/mod/user.html new file mode 100644 index 00000000..3c4b89cf --- /dev/null +++ b/templates/mod/user.html @@ -0,0 +1,125 @@ +{% if new %} + {% set action = '?/users/new' %} +{% else %} + {% set action = '?/users/' ~ user.id %} +{% endif %} + +<form action="{{ action }}" method="post"> + <table> + <tr> + <th>{% trans 'Username' %}</th> + <td> + {% if new or mod|hasPermission(config.mod.editusers) %} + <input size="20" maxlength="30" type="text" name="username" value="{{ user.username|e }}" autocomplete="off"> + {% else %} + {{ user.username|e }} + {% endif %} + </td> + </tr> + <tr> + <th>{% trans 'Password' %}{% if not new %} <small style="font-weight:normal">({% trans 'new; optional' %})</small>{% endif %}</th> + <td> + {% if new or (mod|hasPermission(config.mod.editusers) or (mod|hasPermission(config.mod.change_password) and user.id == mod.id)) %} + <input size="20" maxlength="30" type="password" name="password" value="" autocomplete="off"> + {% else %} + - + {% endif %} + </td> + </tr> + {% if new %} + <tr> + <th>{% trans 'Class' %}</th> + <td> + <ul style="padding:5px 8px;list-style:none"> + <li> + <input type="radio" name="type" id="janitor" value="{{ constant('JANITOR') }}"> + <label for="janitor">{% trans 'Janitor' %}</label> + </li> + <li> + <input type="radio" name="type" id="mod" value="{{ constant('MOD') }}" checked> + <label for="mod">{% trans 'Mod' %}</label> + </li> + <li> + <input type="radio" name="type" id="admin" value="{{ constant('Admin') }}"> + <label for="admin">{% trans 'Admin' %}</label> + </li> + </ul> + </td> + </tr> + {% endif %} + <tr> + <th>{% trans 'Boards' %}</th> + <td> + <ul style="padding:0 5px;list-style:none"> + <li> + <input type="checkbox" id="allboards" name="allboards" + {% if '*' in user.boards %} checked{% endif %} + {% if not mod|hasPermission(config.mod.editusers) %} + disabled + {% endif %} + > + <label for="allboards">"*" - {% trans 'All boards' %}</label> + </li> + {% for board in boards %} + <li> + <input type="checkbox" id="board_{{ board.uri }}" name="board_{{ board.uri }}" + {% if board.uri in user.boards %} checked{% endif %} + {% if not mod|hasPermission(config.mod.editusers) %} + disabled + {% endif %} + > + <label for="board_{{ board.uri }}"> + {{ config.board_abbreviation|sprintf(board.uri) }} + - + {{ board.title|e }} + </label> + </li> + {% endfor %} + </ul> + </td> + </tr> + </table> + + <ul style="padding:0;text-align:center;list-style:none"> + {% if new %} + <li><input type="submit" value="{% trans 'Create user' %}"></li> + {% else %} + <li><input type="submit" value="{% trans 'Save changes' %}"></li> + {% if mod|hasPermission(config.mod.deleteusers) %} + <li><input name="delete" onclick="return confirm('Are you sure you want to permanently delete this user?');" type="submit" value="{% trans 'Delete user' %}"></li> + {% endif %} + {% endif %} + </ul> +</form> + +{% if logs|count > 0 %} + <table class="modlog" style="width:600px"> + <tr> + <th>{% trans 'IP address' %}</th> + <th>{% trans 'Time' %}</th> + <th>{% trans 'Board' %}</th> + <th>{% trans 'Action' %}</th> + </tr> + {% for log in logs %} + <tr> + <td class="minimal"> + <a href="?/IP/{{ log.ip }}">{{ log.ip }}</a> + </td> + <td class="minimal"> + <span title="{{ log.time|date(config.post_date) }}">{{ log.time|ago }}</span> + </td> + <td class="minimal"> + {% if log.board %} + <a href="?/{{ config.board_path|sprintf(log.board) }}{{ config.file_index }}">{{ config.board_abbreviation|sprintf(log.board) }}</a> + {% else %} + - + {% endif %} + </td> + <td> + {{ log.text }} + </td> + </tr> + {% endfor %} + </table> +{% endif %} + diff --git a/templates/mod/users.html b/templates/mod/users.html new file mode 100644 index 00000000..6ea6248f --- /dev/null +++ b/templates/mod/users.html @@ -0,0 +1,71 @@ +<table class="modlog" style="width:auto"> + <tr> + <th>{% trans 'ID' %}</th> + <th>{% trans 'Username' %}</th> + <th>{% trans 'Type' %}</th> + <th>{% trans 'Boards' %}</th> + {% if mod|hasPermission(config.mod.modlog) %} + <th>{% trans 'Last action' %}</th> + {% endif %} + <th>…</th> + </tr> + + {% for user in users %} + <tr> + <td><small>{{ user.id }}</small></td> + <td>{{ user.username|e }}</td> + <td> + {% if user.type == constant('JANITOR') %}{% trans 'Janitor' %} + {% elseif user.type == constant('MOD') %}{% trans 'Mod' %} + {% elseif user.type == constant('ADMIN') %}{% trans 'Admin' %} + {% endif %} + </td> + <td> + {% if user.boards == '' %} + <em>{% trans 'none' %}</em> + {% elseif user.boards == '*' %} + <em>{% trans 'all boards' %}</em> + {% else %} + {# This is really messy, but IMO it beats doing it in PHP. #} + {% set boards = user.boards|split(',') %} + {% set _boards = [] %} + {% for board in boards %} + {% set _boards = _boards|push(board == '*' ? '*' : config.board_abbreviation|sprintf(board)) %} + {% endfor %} + {% set _boards = _boards|sort %} + {{ _boards|join(', ') }} + {% endif %} + </td> + {% if mod|hasPermission(config.mod.modlog) %} + <td> + {% if user.last %} + <span title="{{ user.action|e }}">{{ user.last|ago }}</span> + {% else %} + <em>{% trans 'never' %}</em> + {% endif %} + </td> + {% endif %} + <td> + {% if mod|hasPermission(config.mod.promoteusers) and user.type < constant('ADMIN') %} + <a style="float:left;text-decoration:none" href="?/users/{{ user.id }}/promote" title="{% trans 'Promote' %}">▲</a> + {% endif %} + {% if mod|hasPermission(config.mod.promoteusers) and user.type > constant('JANITOR') %} + <a style="float:left;text-decoration:none" href="?/users/{{ user.id }}/demote" title="{% trans 'Demote' %}">▼</a> + {% endif %} + {% if mod|hasPermission(config.mod.editusers) or (mod|hasPermission(config.mod.change_password) and mod.id == user.id) %} + <a class="unimportant" style="margin-left:5px;float:right" href="?/users/{{ user.id }}">[{% trans 'edit' %}]</a> + {% endif %} + {% if mod|hasPermission(config.mod.create_pm) %} + <a class="unimportant" style="margin-left:5px;float:right" href="?/new_PM/{{ user.username|e }}">[{% trans 'PM' %}]</a> + {% endif %} + </td> + </tr> + {% endfor %} +</table> + +{% if mod|hasPermission(config.mod.createusers) %} + <p style="text-align:center"> + <a href="?/users/new">Create a new user</a> + </p> +{% endif %} + diff --git a/templates/mod/view_ip.html b/templates/mod/view_ip.html new file mode 100644 index 00000000..c49880ae --- /dev/null +++ b/templates/mod/view_ip.html @@ -0,0 +1,163 @@ +{% for board_posts in posts %} + <fieldset> + <legend> + <a href="?/{{ config.board_path|sprintf(board_posts.board.uri) }}{{ config.file_index }}"> + {{ config.board_abbreviation|sprintf(board_posts.board.uri) }} + - + {{ board_posts.board.title|e }} + </a> + </legend> + {{ board_posts.posts|join('<hr>') }} + </fieldset> +{% endfor %} + +{% if mod|hasPermission(config.mod.view_notes) %} + <fieldset id="notes"> + <legend> + {% set notes_on_record = 'note' ~ (notes|count != 1 ? 's' : '') ~ ' on record' %} + <legend>{{ notes|count }} {% trans notes_on_record %}</legend> + </legend> + + {% if notes|count > 0 %} + <table class="modlog"> + <tr> + <th>{% trans 'Staff' %}</th> + <th>{% trans 'Note' %}</th> + <th>{% trans 'Date' %}</th> + {% if mod|hasPermission(config.mod.remove_notes) %} + <th>{% trans 'Actions' %}</th> + {% endif %} + </tr> + {% for note in notes %} + <tr> + <td class="minimal"> + {% if note.username %} + <a href="?/new_PM/{{ note.username|e }}">{{ note.username|e }}</a> + {% else %} + <em>{% trans 'deleted?' %}</em> + {% endif %} + </td> + <td> + {{ note.body }} + </td> + <td class="minimal"> + {{ note.time|date(config.post_date) }} + </td> + {% if mod|hasPermission(config.mod.remove_notes) %} + <td class="minimal"> + <a href="?/IP/{{ ip }}/remove_note/{{ note.id }}"> + <small>[{% trans 'remove' %}]</small> + </a> + </td> + {% endif %} + </tr> + {% endfor %} + </table> + {% endif %} + + {% if mod|hasPermission(config.mod.create_notes) %} + <form action="" method="post" style="margin:0"> + <table> + <tr> + <th>{% trans 'Staff' %}</th> + <td>{{ mod.username|e }}</td> + </tr> + <tr> + <th> + <label for="note">{% trans 'Note' %}</label> + </th> + <td> + <textarea id="note" name="note" rows="5" cols="30"></textarea> + </td> + </tr> + <tr> + <td></td> + <td><input type="submit" value="{% trans 'New note' %}"></td> + </tr> + </table> + </form> + {% endif %} + </fieldset> +{% endif %} + +{% if bans|count > 0 and mod|hasPermission(config.mod.view_ban) %} + <fieldset id="bans"> + {% set bans_on_record = 'ban' ~ (bans|count != 1 ? 's' : '') ~ ' on record' %} + <legend>{{ bans|count }} {% trans bans_on_record %}</legend> + + {% for ban in bans %} + <form action="" method="post" style="text-align:center"> + <table style="width:400px;margin-bottom:10px;border-bottom:1px solid #ddd;padding:5px"> + <tr> + <th>{% trans 'Status' %}</th> + <td> + {% if config.mod.view_banexpired and ban.expires != 0 and ban.expires < time() %} + {% trans 'Expired' %} + {% else %} + {% trans 'Active' %} + {% endif %} + </td> + </tr> + <tr> + <th>{% trans 'IP' %}</th> + <td>{{ ban.ip }}</td> + </tr> + <tr> + <th>{% trans 'Reason' %}</th> + <td> + {% if ban.reason %} + {{ ban.reason }} + {% else %} + <em>{% trans 'no reason' %}</em> + {% endif %} + </td> + </tr> + <tr> + <th>{% trans 'Board' %}</th> + <td> + {% if ban.board %} + {{ config.board_abbreviation|sprintf(ban.board) }} + {% else %} + <em>{% trans 'all boards' %}</em> + {% endif %} + </td> + </tr> + <tr> + <th>{% trans 'Set' %}</th> + <td>{{ ban.set|date(config.post_date) }}</td> + </tr> + <tr> + <th>{% trans 'Expires' %}</th> + <td> + {% if ban.expires %} + {{ ban.expires|date(config.post_date) }} + {% else %} + <em>{% trans 'never' %}</em> + {% endif %} + </td> + </tr> + <tr> + <th>{% trans 'Staff' %}</th> + <td> + {% if ban.username %} + {{ ban.username|e }} + {% else %} + <em>{% trans 'deleted?' %}</em> + {% endif %} + </td> + </tr> + </table> + <input type="hidden" name="ban_id" value="{{ ban.id }}"> + <input type="submit" name="unban" value="{% trans 'Remove ban' %}"> + </form> + {% endfor %} + </fieldset> +{% endif %} + +{% if mod|hasPermission(config.mod.ban) %} + <fieldset> + <legend>{% trans 'New ban' %}</legend> + {% set redirect = '?/IP/' ~ ip ~ '#bans' %} + {% include 'mod/ban_form.html' %} + </fieldset> +{% endif %} diff --git a/templates/page.html b/templates/page.html index 0b15d815..0f59e6b1 100644 --- a/templates/page.html +++ b/templates/page.html @@ -1,11 +1,11 @@ <!doctype html>
<html>
<head>
+ <meta charset="utf-8">
<link rel="stylesheet" media="screen" href="{{ config.url_stylesheet }}">
{% if config.url_favicon %}<link rel="shortcut icon" href="{{ config.url_favicon }}">{% endif %}
<title>{{ title }}</title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=yes">
+ <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes">
{% if config.default_stylesheet.1 != '' %}<link rel="stylesheet" type="text/css" id="stylesheet" href="{{ config.uri_stylesheets }}{{ config.default_stylesheet.1 }}">{% endif %}
{% if not nojavascript %}<script type="text/javascript" src="{{ config.url_javascript }}"></script>{% endif %}
</head>
@@ -17,7 +17,7 @@ {% if subtitle %}
{{ subtitle }}
{% endif %}
- {% if mod %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %}
+ {% if mod and not hide_dashboard_link %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %}
</div>
</header>
{{ body }}
diff --git a/templates/themes/basic/info.php b/templates/themes/basic/info.php index b782a6d4..0b8ba98b 100644 --- a/templates/themes/basic/info.php +++ b/templates/themes/basic/info.php @@ -44,9 +44,9 @@ $theme['build_function'] = 'basic_build'; $theme['install_callback'] = 'build_install'; - if(!function_exists('build_install')) { + if (!function_exists('build_install')) { function build_install($settings) { - if(!is_numeric($settings['no_recent']) || $settings['no_recent'] < 0) + if (!is_numeric($settings['no_recent']) || $settings['no_recent'] < 0) return Array(false, '<strong>' . utf8tohtml($settings['no_recent']) . '</strong> is not a non-negative integer.'); } } diff --git a/templates/themes/basic/theme.php b/templates/themes/basic/theme.php index a07dc7ec..806a331a 100644 --- a/templates/themes/basic/theme.php +++ b/templates/themes/basic/theme.php @@ -15,7 +15,7 @@ public static function build($action, $settings) { global $config; - if($action == 'all' || $action == 'news') + if ($action == 'all' || $action == 'news') file_write($config['dir']['home'] . $settings['file'], Basic::homepage($settings)); } diff --git a/templates/themes/categories/info.php b/templates/themes/categories/info.php index 5ae3d296..62d8f6bb 100644 --- a/templates/themes/categories/info.php +++ b/templates/themes/categories/info.php @@ -54,11 +54,11 @@ Requires $config[\'categories\'].'; $theme['build_function'] = 'categories_build'; $theme['install_callback'] = 'categories_install'; - if(!function_exists('categories_install')) { + if (!function_exists('categories_install')) { function categories_install($settings) { global $config; - if(!isset($config['categories'])) { + if (!isset($config['categories'])) { return Array(false, '<h2>Prerequisites not met!</h2>' . 'This theme requires $config[\'boards\'] and $config[\'categories\'] to be set.'); } diff --git a/templates/themes/categories/sidebar.html b/templates/themes/categories/sidebar.html index a4bc28ae..856930ab 100644 --- a/templates/themes/categories/sidebar.html +++ b/templates/themes/categories/sidebar.html @@ -31,7 +31,7 @@ </legend> {% for board in boards %} <li> - <a href="{{ board.uri }}">{{ board.title }}</a> + <a href="{{ board.uri }}">{{ board.title|e }}</a> </li> {% endfor %} </fieldset> diff --git a/templates/themes/categories/theme.php b/templates/themes/categories/theme.php index 648034e7..11fcbbaf 100644 --- a/templates/themes/categories/theme.php +++ b/templates/themes/categories/theme.php @@ -15,13 +15,13 @@ public static function build($action, $settings) { global $config; - if($action == 'all') + if ($action == 'all') file_write($config['dir']['home'] . $settings['file_main'], Categories::homepage($settings)); - if($action == 'all' || $action == 'boards') + if ($action == 'all' || $action == 'boards') file_write($config['dir']['home'] . $settings['file_sidebar'], Categories::sidebar($settings)); - if($action == 'all' || $action == 'news') + if ($action == 'all' || $action == 'news') file_write($config['dir']['home'] . $settings['file_news'], Categories::news($settings)); } @@ -52,10 +52,10 @@ $categories = $config['categories']; - foreach($categories as &$boards) { - foreach($boards as &$board) { + foreach ($categories as &$boards) { + foreach ($boards as &$board) { $title = boardTitle($board); - if(!$title) + if (!$title) $title = $board; // board doesn't exist, but for some reason you want to display it anyway $board = Array('title' => $title, 'uri' => sprintf($config['board_path'], $board)); } diff --git a/templates/themes/frameset/sidebar.html b/templates/themes/frameset/sidebar.html index 457ecec8..40e2d719 100644 --- a/templates/themes/frameset/sidebar.html +++ b/templates/themes/frameset/sidebar.html @@ -30,7 +30,7 @@ {% for board in boards %} <li> <a href="{{ config.board_path|sprintf(board.uri) }}"> - {{ board.title }} + {{ board.title|e }} </a> </li> {% endfor %} diff --git a/templates/themes/frameset/theme.php b/templates/themes/frameset/theme.php index f3e1b139..015eebaf 100644 --- a/templates/themes/frameset/theme.php +++ b/templates/themes/frameset/theme.php @@ -15,13 +15,13 @@ public static function build($action, $settings) { global $config; - if($action == 'all') + if ($action == 'all') file_write($config['dir']['home'] . $settings['file_main'], Frameset::homepage($settings)); - if($action == 'all' || $action == 'boards') + if ($action == 'all' || $action == 'boards') file_write($config['dir']['home'] . $settings['file_sidebar'], Frameset::sidebar($settings)); - if($action == 'all' || $action == 'news') + if ($action == 'all' || $action == 'news') file_write($config['dir']['home'] . $settings['file_news'], Frameset::news($settings)); } diff --git a/templates/themes/recent/info.php b/templates/themes/recent/info.php index 83d7477a..d4cf1029 100644 --- a/templates/themes/recent/info.php +++ b/templates/themes/recent/info.php @@ -60,11 +60,11 @@ $theme['build_function'] = 'recentposts_build'; $theme['install_callback'] = 'recentposts_install'; - if(!function_exists('recentposts_install')) { + if (!function_exists('recentposts_install')) { function recentposts_install($settings) { - if(!is_numeric($settings['limit_images']) || $settings['limit_images'] < 0) + if (!is_numeric($settings['limit_images']) || $settings['limit_images'] < 0) return Array(false, '<strong>' . utf8tohtml($settings['limit_images']) . '</strong> is not a non-negative integer.'); - if(!is_numeric($settings['limit_posts']) || $settings['limit_posts'] < 0) + if (!is_numeric($settings['limit_posts']) || $settings['limit_posts'] < 0) return Array(false, '<strong>' . utf8tohtml($settings['limit_posts']) . '</strong> is not a non-negative integer.'); } } diff --git a/templates/themes/recent/theme.php b/templates/themes/recent/theme.php index 13a5546f..986fac6a 100644 --- a/templates/themes/recent/theme.php +++ b/templates/themes/recent/theme.php @@ -17,13 +17,13 @@ public function build($action, $settings) { global $config, $_theme; - if($action == 'all') { + if ($action == 'all') { copy('templates/themes/recent/recent.css', $config['dir']['home'] . $settings['css']); } $this->excluded = explode(' ', $settings['exclude']); - if($action == 'all' || $action == 'post') + if ($action == 'all' || $action == 'post') file_write($config['dir']['home'] . $settings['html'], $this->homepage($settings)); } @@ -38,15 +38,15 @@ $boards = listBoards(); $query = ''; - foreach($boards as &$_board) { - if(in_array($_board['uri'], $this->excluded)) + foreach ($boards as &$_board) { + if (in_array($_board['uri'], $this->excluded)) continue; $query .= sprintf("SELECT *, '%s' AS `board` FROM `posts_%s` WHERE `file` IS NOT NULL AND `file` != 'deleted' AND `thumb` != 'spoiler' UNION ALL ", $_board['uri'], $_board['uri']); } $query = preg_replace('/UNION ALL $/', 'ORDER BY `time` DESC LIMIT ' . (int)$settings['limit_images'], $query); $query = query($query) or error(db_error()); - while($post = $query->fetch()) { + while ($post = $query->fetch()) { openBoard($post['board']); // board settings won't be available in the template file, so generate links now @@ -58,15 +58,15 @@ $query = ''; - foreach($boards as &$_board) { - if(in_array($_board['uri'], $this->excluded)) + foreach ($boards as &$_board) { + if (in_array($_board['uri'], $this->excluded)) continue; $query .= sprintf("SELECT *, '%s' AS `board` FROM `posts_%s` UNION ALL ", $_board['uri'], $_board['uri']); } $query = preg_replace('/UNION ALL $/', 'ORDER BY `time` DESC LIMIT ' . (int)$settings['limit_posts'], $query); $query = query($query) or error(db_error()); - while($post = $query->fetch()) { + while ($post = $query->fetch()) { openBoard($post['board']); $post['link'] = $config['root'] . $board['dir'] . $config['dir']['res'] . sprintf($config['file_page'], ($post['thread'] ? $post['thread'] : $post['id'])) . '#' . $post['id']; @@ -78,8 +78,8 @@ // Total posts $query = 'SELECT SUM(`top`) AS `count` FROM ('; - foreach($boards as &$_board) { - if(in_array($_board['uri'], $this->excluded)) + foreach ($boards as &$_board) { + if (in_array($_board['uri'], $this->excluded)) continue; $query .= sprintf("SELECT MAX(`id`) AS `top` FROM `posts_%s` UNION ALL ", $_board['uri']); } @@ -90,8 +90,8 @@ // Unique IPs $query = 'SELECT COUNT(DISTINCT(`ip`)) AS `count` FROM ('; - foreach($boards as &$_board) { - if(in_array($_board['uri'], $this->excluded)) + foreach ($boards as &$_board) { + if (in_array($_board['uri'], $this->excluded)) continue; $query .= sprintf("SELECT `ip` FROM `posts_%s` UNION ALL ", $_board['uri']); } @@ -102,8 +102,8 @@ // Active content $query = 'SELECT SUM(`filesize`) AS `count` FROM ('; - foreach($boards as &$_board) { - if(in_array($_board['uri'], $this->excluded)) + foreach ($boards as &$_board) { + if (in_array($_board['uri'], $this->excluded)) continue; $query .= sprintf("SELECT `filesize` FROM `posts_%s` UNION ALL ", $_board['uri']); } diff --git a/templates/themes/rrdtool/info.php b/templates/themes/rrdtool/info.php index 73658a22..46a20587 100644 --- a/templates/themes/rrdtool/info.php +++ b/templates/themes/rrdtool/info.php @@ -28,7 +28,7 @@ $__boards = listBoards(); $__default_boards = Array(); - foreach($__boards as $__board) + foreach ($__boards as $__board) $__default_boards[] = $__board['uri']; $theme['config'][] = Array( @@ -83,31 +83,31 @@ ); $theme['install_callback'] = 'rrdtool_install'; - if(!function_exists('rrdtool_install')) { + if (!function_exists('rrdtool_install')) { function rrdtool_install($settings) { global $config; - if(!is_numeric($settings['interval']) || $settings['interval'] < 1 || $settings['interval'] > 86400) + if (!is_numeric($settings['interval']) || $settings['interval'] < 1 || $settings['interval'] > 86400) return Array(false, 'Invalid interval: <strong>' . $settings['interval'] . '</strong>. Must be an integer greater than 1 and less than 86400.'); - if(!is_numeric($settings['width']) || $settings['width'] < 1) + if (!is_numeric($settings['width']) || $settings['width'] < 1) return Array(false, 'Invalid width: <strong>' . $settings['width'] . '</strong>!'); - if(!is_numeric($settings['height']) || $settings['height'] < 1) + if (!is_numeric($settings['height']) || $settings['height'] < 1) return Array(false, 'Invalid height: <strong>' . $settings['height'] . '</strong>!'); - if(!in_array($settings['rate'], Array('second', 'minute', 'day', 'hour', 'week', 'month', 'year'))) + if (!in_array($settings['rate'], Array('second', 'minute', 'day', 'hour', 'week', 'month', 'year'))) return Array(false, 'Invalid rate: <strong>' . $settings['rate'] . '</strong>!'); $job = '*/' . $settings['interval'] . ' * * * * php -q ' . str_replace('\\', '/', dirname(__FILE__)) . '/cron.php' . PHP_EOL; - if(function_exists('system')) { + if (function_exists('system')) { $crontab = tempnam($config['tmp'], 'tinyboard-rrdtool'); file_write($crontab, $job); @system('crontab ' . escapeshellarg($crontab), $ret); unlink($crontab); - if($ret === 0) + if ($ret === 0) return ''; // it seems to install okay? } diff --git a/templates/themes/rrdtool/theme.php b/templates/themes/rrdtool/theme.php index 20a00e76..eed2ac9a 100644 --- a/templates/themes/rrdtool/theme.php +++ b/templates/themes/rrdtool/theme.php @@ -17,7 +17,7 @@ public function build($action, $settings) { global $config, $_theme, $argv; - if(!$settings) { + if (!$settings) { error('This theme is not currently installed.'); } @@ -26,18 +26,18 @@ // exclude boards from the "combined" graph $this->combined_exclude = Array(); - if($action == 'cron') { - if(!file_exists($settings['path'])) + if ($action == 'cron') { + if (!file_exists($settings['path'])) mkdir($settings['path']); - if(!file_exists($settings['images'])) + if (!file_exists($settings['images'])) mkdir($settings['images']); - foreach($this->boards as &$board) { + foreach ($this->boards as &$board) { $file = $settings['path'] . '/' . $board . '.rrd'; - if(!file_exists($file)) { + if (!file_exists($file)) { // Create graph - if(!rrd_create($file, Array( + if (!rrd_create($file, Array( '-s 60', 'DS:posts:COUNTER:86400:0:10000', @@ -59,22 +59,22 @@ } // debug just the graphing (not updating) with the --debug switch - if(!isset($argv[1]) || $argv[1] != '--debug') { + if (!isset($argv[1]) || $argv[1] != '--debug') { // Update graph $query = query(sprintf("SELECT MAX(`id`) AS `count` FROM `posts_%s`", $board)); $count = $query->fetch(); $count = $count['count']; - if(!rrd_update($file, Array( + if (!rrd_update($file, Array( '-t', 'posts', 'N:' . $count))) error('RRDtool failed: ' . htmlentities(rrd_error())); } - foreach($this->spans as &$span) { + foreach ($this->spans as &$span) { // Graph graph - if(!rrd_graph($settings['images'] . '/' . $board . '-' . $span . '.png', Array( + if (!rrd_graph($settings['images'] . '/' . $board . '-' . $span . '.png', Array( '-s -1' . $span, '-t Posts on ' . sprintf($config['board_abbreviation'], $board) .' this ' . $span, '--lazy', @@ -105,7 +105,7 @@ } // combined graph - foreach($this->spans as &$span) { + foreach ($this->spans as &$span) { $options = Array( '-s -1' . $span, '-t Posts this ' . $span, @@ -129,8 +129,8 @@ $c = 1; $cc = 0; $red = 2; - foreach($this->boards as &$board) { - if(in_array($board, $this->combined_exclude)) + foreach ($this->boards as &$board) { + if (in_array($board, $this->combined_exclude)) continue; $color = str_pad(dechex($red*85), 2, '0', STR_PAD_LEFT) . str_pad(dechex($green*85), 2, '0', STR_PAD_LEFT) . @@ -147,31 +147,35 @@ sprintf($config['board_abbreviation'], $board); // Randomize colors using this horrible undocumented algorithm I threw together while debugging - if($c == 0) + if ($c == 0) $red++; - elseif($c == 1) + elseif ($c == 1) $green++; - elseif($c == 2) + elseif ($c == 2) $blue++; - elseif($c == 3) + elseif ($c == 3) $green--; - elseif($c == 4) + elseif ($c == 4) $red--; $cc++; - if($cc > 2) { + if ($cc > 2) { $c++; $cc = 0; } - if($c>4) $c = 0; + if ($c > 4) + $c = 0; - if($red>3) $red = 0; - if($green>3) $green = 0; - if($blue>3) $blue = 0; + if ($red > 3) + $red = 0; + if ($green > 3) + $green = 0; + if ($blue > 3) + $blue = 0; } $options[] = 'HRULE:0#000000'; - if(!rrd_graph($settings['images'] . '/combined-' . $span . '.png', $options)) + if (!rrd_graph($settings['images'] . '/combined-' . $span . '.png', $options)) error('RRDtool failed: ' . htmlentities(rrd_error())); } } diff --git a/templates/thread.html b/templates/thread.html index ac6bc609..e7c65f9b 100644 --- a/templates/thread.html +++ b/templates/thread.html @@ -1,11 +1,11 @@ <!doctype html>
<html>
<head>
+ <meta charset="utf-8">
<link rel="stylesheet" media="screen" href="{{ config.url_stylesheet }}">
{% if config.url_favicon %}<link rel="shortcut icon" href="{{ config.url_favicon }}">{% endif %}
<title>{{ board.url }} - {{ board.name }}</title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=yes">
+ <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes">
{% if config.meta_keywords %}<meta name="keywords" content="{{ config.meta_keywords }}">{% endif %}
{% if config.default_stylesheet.1 != '' %}<link rel="stylesheet" type="text/css" id="stylesheet" href="{{ config.uri_stylesheets }}{{ config.default_stylesheet.1 }}">{% endif %}
{% if not nojavascript %}
@@ -29,17 +29,16 @@ display: block;
}
{% endraw %}</style>{% endif %}
-
</head>
<body>
{{ boardlist.top }}
{% if pm %}<div class="top_notice">You have <a href="?/PM/{{ pm.id }}">an unread PM</a>{% if pm.waiting > 0 %}, plus {{ pm.waiting }} more waiting{% endif %}.</div><hr />{% endif %}
{% if config.url_banner %}<img class="banner" src="{{ config.url_banner }}" {% if config.banner_width or config.banner_height %}style="{% if config.banner_width %}width:{{ config.banner_width }}px{% endif %};{% if config.banner_width %}height:{{ config.banner_height }}px{% endif %}" {% endif %}alt="" />{% endif %}
<header>
- <h1>{{ board.url }} - {{ board.name }}</h1>
+ <h1>{{ board.url }} - {{ board.title|e }}</h1>
<div class="subtitle">
- {% if board.title %}
- {{ board.title }}
+ {% if board.subtitle %}
+ {{ board.subtitle|e }}
{% endif %}
{% if mod %}<p><a href="?/">{% trans %}Return to dashboard{% endtrans %}</a></p>{% endif %}
</div>
|
