Compare commits

...

20 commits

Author SHA1 Message Date
Daniel James
a6176d5f7d
Merge bd77b30372 into 2fce8aeb3e 2025-05-30 08:40:45 -04:00
Marc Alexander
2fce8aeb3e
Merge pull request #6820 from marc1706/ticket/17514
[tticket/17514] Remove version 3 specifier from paths and content
2025-05-30 08:17:38 +02:00
Marc Alexander
14f055c25b
[ticket/17514] Remove some more mentions of phpBB3 / 3.3.x
PHPBB-17514
2025-05-27 19:40:08 +02:00
Marc Alexander
d547c989b7
[ticket/17514] Remove coding guidelines from phpBB repo
PHPBB-17514
2025-05-27 19:28:28 +02:00
Marc Alexander
788108daa9
[ticket/17514] Update prosilver composer.json
PHPBB-17514
2025-05-27 19:28:11 +02:00
Marc Alexander
105823b376
[ticket/17514] Remove outdated FAQ page from docs folder
PHPBB-17514
2025-05-22 21:03:40 +02:00
Marc Alexander
df30f07e6d
[ticket/17514] Remove auth api documentation from docs
PHPBB-17514
2025-05-21 21:37:44 +02:00
Marc Alexander
5d3f0cd482
[ticket/17514] Replace phpBB3 with phpBB in tests
PHPBB-17514
2025-05-20 20:59:40 +02:00
Marc Alexander
7fe8188b78
[ticket/17514] Adjust style info for phpBB instead of phpBB3
PHPBB-17514
2025-05-20 20:59:16 +02:00
Marc Alexander
24d4b26a82
[ticket/17514] Replace phpBB3 with phpBB in phpbb namespace
PHPBB-17514
2025-05-20 20:58:51 +02:00
Marc Alexander
ac233ce7ab
[ticket/17514] Replace phpBB3 with phpBB in language variables
PHPBB-17514
2025-05-20 20:58:24 +02:00
Marc Alexander
dbc4f16cfa
[ticket/17514] Replace phpBB3 with phpBB in installer
PHPBB-17514
2025-05-20 20:57:45 +02:00
Marc Alexander
705df48dff
[ticket/17514] Replace phpBB3 with phpBB in includes
PHPBB-17514
2025-05-20 20:56:51 +02:00
Marc Alexander
4ef2a543af
[ticket/17514] Replace phpBB3 paths in docs
PHPBB-17514
2025-05-20 20:56:23 +02:00
Marc Alexander
8427b43b32
[ticket/17514] Replace phpBB3 with phpBB in javascript
PHPBB-17514
2025-05-20 20:55:49 +02:00
Marc Alexander
e9e7aeb756
[ticket/17514] Replace phpbb3 with phpbb in git-tools
PHPBB-17514
2025-05-20 20:54:31 +02:00
Daniel James
bd77b30372 [ticket/17437] Add prosilver2 dir to repo
PHPBB-17437
2024-11-22 17:36:46 +00:00
Daniel James
dc260ea9c8 [ticket/17437] Undo changes and create prosilver2 style
PHPBB-17437
2024-11-22 17:35:01 +00:00
Daniel James
b263906387 [ticket/17437] Update style name in overall_header
PHPBB-17437
2024-11-22 17:16:41 +00:00
Daniel James
b4f3878845 [ticket/17437] Begin changes on the prosilver v2 redesign
PHPBB-17437
2024-11-22 10:41:17 +00:00
214 changed files with 19500 additions and 3268 deletions

View file

@ -1,6 +1,6 @@
#!/bin/sh
#
# A hook to check syntax of a phpBB3 commit message, per:
# A hook to check syntax of a phpBB commit message, per:
# * <https://area51.phpbb.com/docs/dev/master/development/git.html>
# * <http://area51.phpbb.com/phpBB/viewtopic.php?p=209919#p209919>
#

View file

@ -56,7 +56,7 @@ catch (RuntimeException $e)
function work($pull_id, $remote)
{
// Get some basic data
$pull = get_pull('phpbb', 'phpbb3', $pull_id);
$pull = get_pull('phpbb', 'phpbb', $pull_id);
if (!$pull_id)
{
@ -79,7 +79,7 @@ function work($pull_id, $remote)
run("git checkout develop-olympus");
run("git pull $remote develop-olympus");
add_remote($pull_user, 'phpbb3');
add_remote($pull_user, 'phpbb');
run("git fetch $pull_user");
run("git merge --no-ff $pull_user/$pull_branch");
run("phpBB/vendor/bin/phpunit");
@ -94,7 +94,7 @@ function work($pull_id, $remote)
run("git checkout develop");
run("git pull $remote develop");
add_remote($pull_user, 'phpbb3');
add_remote($pull_user, 'phpbb');
run("git fetch $pull_user");
run("git merge --no-ff $pull_user/$pull_branch");
run("phpBB/vendor/bin/phpunit");

View file

@ -1,7 +1,7 @@
/* global phpbb */
/**
* phpBB3 ACP functions
* phpBB ACP functions
*/
/**

View file

@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="keywords" content="" />
<meta name="description" content="phpBB 3.3.x Changelog" />
<meta name="description" content="phpBB Changelog" />
<title>phpBB &bull; Changelog</title>
<link href="assets/css/stylesheet.css" rel="stylesheet" type="text/css" media="screen" />
@ -21,7 +21,7 @@
<div id="doc-description">
<a href="../index.php" id="logo"><span class="site_logo"></span></a>
<h1>phpBB 3.3.x Changelog</h1>
<h1>phpBB Changelog</h1>
<p style="display: none;"><a href="#start_here">Skip</a></p>
</div>
@ -36,7 +36,7 @@
<!-- BEGIN DOCUMENT -->
<p class="paragraph main-description">
This is a non-exhaustive (but still near complete) changelog for phpBB 3.3.x including release candidate versions.
This is a non-exhaustive (but still near complete) changelog for phpBB including release candidate versions.
Our thanks to all those people who've contributed bug reports and code fixes.
</p>

View file

@ -1,328 +0,0 @@
<!DOCTYPE html>
<html dir="ltr" lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="keywords" content="" />
<meta name="description" content="phpBB 3.3.x frequently asked questions" />
<title>phpBB &bull; FAQ</title>
<link href="assets/css/stylesheet.css" rel="stylesheet" type="text/css" media="screen" />
</head>
<body id="phpbb" class="section-docs">
<div id="wrap">
<a id="top" name="top" accesskey="t"></a>
<div id="page-header">
<div class="headerbar">
<div class="inner">
<div id="doc-description">
<a href="../index.php" id="logo"><span class="site_logo"></span></a>
<h1>phpBB 3.3.x FAQ</h1>
<p>phpBB 3.3.x frequently asked questions</p>
<p style="display: none;"><a href="#start_here">Skip</a></p>
</div>
</div>
</div>
</div>
<a name="start_here"></a>
<div id="page-body">
<!-- BEGIN DOCUMENT -->
<p class="paragraph main-description">
This is a very basic Frequently Asked Questions (FAQ) page which attempts to answer some of the
more commonly asked questions. It is by no means exhaustive and should be used in combination with
the 'built-in' User FAQ within phpBB3, the community forums and our IRC channel
(see <a href="README.html">README</a> for details).
</p>
<h1>FAQ</h1>
<div class="paragraph menu">
<div class="inner">
<div class="content">
<!-- add entry about common UTF8 problems (for example wrong uploading, editing) -->
<ul>
<li><a href="#install">I am finding phpBB too difficult to install. Will you do it for me?</a></li>
<li><a href="#legal">I am having problems with the admin at a certain board, help!</a></li>
<li><a href="#legal">A board has ripped off my graphics/software/etc., stop them!</a></li>
<li><a href="#legal">A board is dealing in warez/porn/etc., you need to prevent them doing this!</a></li>
<li><a href="#legal">I want to sue you because i think you host an illegal board!</a></li>
<li><a href="#viewonline">According to viewonline a user is doing/reading something they should not be able to!</a></li>
<li><a href="#mail">I keep getting Mail sending errors when I (or my users) post/send PM's/etc.!</a></li>
<li><a href="#mail_language">My users are complaining that emails are not in their selected language!</a></li>
<li><a href="#avatars">I am unable to upload avatars from my computer, regardless of the settings.</a></li>
<li><a href="#gallery_avatars">I just cannot get gallery avatars to appear!</a></li>
<li><a href="#permissions">How do I use/set permissions?</a></li>
<li><a href="#login_issues">I (or my users) cannot stay logged in to the forum!</a></li>
<li><a href="#logout_issues">My users are complaining about being logged out too quickly!</a></li>
<li><a href="#not_answered">My question isn't answered here!</a></li>
<li><a href="#disclaimer">Copyright and disclaimer</a></li>
</ul>
</div>
</div>
</div>
<hr />
<a name="install"></a><h2>I am finding phpBB too difficult to install. Will you do it for me?</h2>
<div class="paragraph">
<div class="inner">
<div class="content">
<p>Simple answer, no we will not. We are not being difficult when we say this we are actually trying to help you. phpBB has a reputation for being easy to install, that reputation is we believe well deserved. It is a simple process of unarchiving a single file, uploading the resulting directory/files to their intended location and entering some data in a web based form. The sequence of events, what to type where, etc. is covered in detail in the accompanying <a href="INSTALL.html">INSTALL.html</a> documentation. If you cannot install phpBB the chances are you will be unable to administer or update it.</p>
<p>There are people, companies (unrelated to your hosting provider), etc. that will install your forum, either for free or for a payment. We do not recommend you make use of these offers. Unless the service is provided by your hosting company you will have to divulge passwords and other sensitive details. If you did not know how to use an ATM would you give a passer-by your bank card and PIN and ask them to show you what to do? No, probably not! The same applies to your hosting account details!</p>
<p>We think a better solution is for you to carefully read the enclosed documentation, read through our knowledge base at <a href="https://www.phpbb.com/">www.phpbb.com</a> and if necessary ask for help on any thing you get stuck on. However, the decision is yours but please note we may not offer support if we believe you have had the board installed by a third party. In such cases you should direct your questions to that company or person/s.</p>
</div>
<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
</div>
</div>
<hr />
<a name="legal"></a><h2>I am having problems with the admin at a certain board, help!<br />
A board has ripped off my graphics/software/etc., stop them!<br />
A board is dealing in warez/porn/etc., you need to prevent them doing this!<br />
I want to sue you because i think you host an illegal board!</h2>
<div class="paragraph">
<div class="inner">
<div class="content">
<p>We provide the software, we have absolutely nothing to do with any board that runs it (beyond phpbb.com of course!) and we also do not host any site. The GPL grants the user an unlimited right of use subject to their adherence of that license. Therefore we cannot prevent, dictate, control or otherwise limit the use of phpBB software. So please do not contact us for such matters.</p>
<p>If you have a problem with a given board please take it up with them, not us. We are not and cannot be held legally responsible for any third party use of this software (much like Microsoft et al cannot be held responsible for the use of Windows in illegal activities, etc.). Additionally we do <strong>not</strong> track the use of phpBB software in any way. So please do not ask us for details on a &quot;given&quot; board we will not be able to help you. If any law firms or lawyers out there send us writs, cease and desist orders, etc. for third party website use of this software we reserve the right to charge for time wasted dealing with such issues...</p>
</div>
<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
</div>
</div>
<hr />
<a name="viewonline"></a><h2>According to viewonline a user is doing/reading something they should not be able to!</h2>
<div class="paragraph">
<div class="inner">
<div class="content">
<p>No, they probably are not. phpBB uses sessions to keep track of users as they move between pages. The session information tells us who this user is. Therefore in order to determine what a user can do on a page we first need the session details. Once this data is available we can check whether the user is permitted to do whatever it is they are trying to do. This can result in it appearing as if a user is reading a topic in a forum they should not be able to access. Or perhaps viewing private messages when they are only guests, etc. In practice the user is not doing these things, they are viewing a &quot;You are not permitted to do this&quot; type message. The session data has simply been updated before we were able to determine what the user could or could not do.</p>
<p>Of course this only applies where permissions have been set correctly!</p>
</div>
<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
</div>
</div>
<hr />
<a name="mail"></a><h2>I keep getting Mail sending errors when I (or my users) post/send PM's/etc.!</h2>
<div class="paragraph">
<div class="inner">
<div class="content">
<p>This error will occur if phpBB cannot send mail. phpBB can send email two ways; using the PHP <code>mail()</code> function or directly via SMTP. Some hosting providers limit the <code>mail()</code> function to prevent its use in spamming, others may rename it or limit its functionality. If the <code>mail()</code> function got renamed, you are able to enter the correct name within the administration control panel. In either case you may need to make use of SMTP. This requires that you have access to such a facility, e.g. your hosting provider may provide one (perhaps requiring specific written authorisation), etc. Please see <a href="https://www.phpbb.com/">www.phpbb.com</a> for additional help on this matter.</p>
<p>If you do require SMTP services please do not ask (on our forums or elsewhere) for someone to provide you with one. Open relays are now things of the past thanks to the unthinking spammers out there. Therefore you are unlikely to find someone willing to offer you (free) services.</p>
</div>
<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
</div>
</div>
<hr />
<a name="mail_language"></a><h2>My users are complaining that emails are not in their selected language!</h2>
<div class="paragraph">
<div class="inner">
<div class="content">
<p>You must have deleted a language pack or the language pack is incomplete. phpBB will try to send emails in the users selected language. If it cannot find a suitable email template it will switch to the boards default language.</p>
<!-- additional entry about encoded emails -->
</div>
<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
</div>
</div>
<hr />
<a name="avatars"></a><h2>I am unable to upload avatars from my computer, regardless of the settings.</h2>
<div class="paragraph">
<div class="inner">
<div class="content">
<p>There are two possibilities here, the first is you have not created the directory you specified as the storage location for avatars, ie. as specified in the <code>Admin -&gt; General -&gt; Board Configuration -&gt; Avatar settings</code> section. If the directory does not exist uploadeable avatars are automatically disabled. You should create the required directory (ensuring it has global write access or other appropriate permissions to allow the webserver to write files to it).</p>
<p>The second possibility is that your provider has disabled file_upload support. You should contact your provider and ask them if this is the case. There is not a lot you can do, there are still three other avatar settings left to choose from including uploading via an URL which will work fine.</p>
</div>
<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
</div>
</div>
<hr />
<a name="gallery_avatars"></a><h2>I just cannot get gallery avatars to appear!</h2>
<div class="paragraph">
<div class="inner">
<div class="content">
<p>phpBB categorises gallery avatars and it does this by reading through folders contained in the location you specified as being the gallery path. For example, if you set the gallery path to <samp>images/avatars/gallery</samp> phpBB will expect to find a series of folders within that path, e.g. <samp>images/avatars/gallery/moviestars</samp>, <samp>images/avatars/gallery/cartoons</samp>, <samp>images/avatars/gallery/misc</samp>, etc. Placing images directly in <samp>images/avatars/gallery/</samp> will result in nothing being listed in your gallery.</p>
</div>
<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
</div>
</div>
<hr />
<a name="permissions"></a><h2>How do I use/set permissions?</h2>
<div class="paragraph">
<div class="inner">
<div class="content">
<p>Please read the paragraph about permissions in our extensive <a href="https://www.phpbb.com/support/docs/en/3.3/ug/">online documentation</a>.</p>
</div>
<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
</div>
</div>
<hr />
<a name="login_issues"></a><h2>I (or my users) cannot stay logged in to the forum!</h2>
<div class="paragraph">
<div class="inner">
<div class="content">
<p>If you (or your users) are, after attempting a login, being returned to the index (or other page) without appearing to be logged in the most likely problem is incorrect cookie settings. phpBB uses cookies to store a session id and a small amount of user data. For this data to be stored correctly the cookie domain, name, path and secure settings must be correct. You can check this in <code>Admin-&gt;General-&gt;Server Configuration-&gt;Cookie Settings</code>. Typically the cookie domain can be left blank and the cookie path set to <samp>/</samp> (a single forward slash). Do <strong>not</strong> set the cookie as being secure unless your board is running over a secure sockets layer connection, ie. https://</p>
<p>If you still have problems try setting the cookie domain to your full domain name, e.g. <samp>www.mysystem.tld</samp>, <samp>www.something.mydomain.tld</samp>. You <strong>must</strong> ensure the domain name contains at least two dots or browsers will be unlikely to recognise the cookie, e.g. <samp>.mydomain.com</samp>, <samp>mydomain.com</samp>. Do <strong>not</strong> add http:// or anything else to the domain name!</p>
</div>
<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
</div>
</div>
<hr />
<a name="logout_issues"></a><h2>My users are complaining about being logged out too quickly!</h2>
<div class="paragraph">
<div class="inner">
<div class="content">
<p>You can increase the default length of sessions (ie. how long before a users session is considered 'dead') in <code>Admin-&gt;General-&gt;Server Configuration-&gt;Load Settings</code>. Set it to whatever value your users feel comfortable with, remember that security issues may affect your decision (ie. having too long a session may allow non-users to abuse your board should a user forget to logout or otherwise leave a current session on a public workstation).</p>
</div>
<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
</div>
</div>
<hr />
<a name="not_answered"></a><h2>My question isn't answered here!</h2>
<div class="paragraph">
<div class="inner">
<div class="content">
<p>Please read our <a href="https://www.phpbb.com/support/docs/en/3.3/ug/">extensive user documentation</a> first, it may just explain what you want to know.</p>
<p>Feel free to search our community forum for the information you require. <strong>PLEASE DO NOT</strong> post your question without having first used search, chances are someone has already asked and answered your question. You can find our board here:</p>
<p><a href="https://www.phpbb.com">www.phpbb.com</a></p>
</div>
<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
</div>
</div>
<hr />
<a name="disclaimer"></a><h2>Copyright and disclaimer</h2>
<div class="paragraph">
<div class="inner">
<div class="content">
<p>phpBB is free software, released under the terms of the <a href="http://opensource.org/licenses/gpl-2.0.php">GNU General Public License, version 2 (GPL-2.0)</a>. Copyright © <a href="https://www.phpbb.com">phpBB Limited</a>. For full copyright and license information, please see the docs/CREDITS.txt file.</p>
</div>
<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
</div>
</div>
<!-- END DOCUMENT -->
<div id="page-footer">
<div class="version">&nbsp;</div>
</div>
</div></div>
<div>
<a id="bottom" accesskey="z"></a>
</div>
</body>
</html>

View file

@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="keywords" content="" />
<meta name="description" content="phpBB 3.3.x Installation, updating and conversion information" />
<meta name="description" content="phpBB Installation, updating and conversion information" />
<title>phpBB &bull; Install</title>
<link href="assets/css/stylesheet.css" rel="stylesheet" type="text/css" media="screen" />
@ -21,8 +21,8 @@
<div id="doc-description">
<a href="../index.php" id="logo"><span class="site_logo"></span></a>
<h1>phpBB 3.3.x Install</h1>
<p>phpBB 3.3.x Installation, updating and conversion information</p>
<h1>phpBB Install</h1>
<p>phpBB Installation, updating and conversion information</p>
<p style="display: none;"><a href="#start_here">Skip</a></p>
</div>
@ -109,7 +109,7 @@
<li>Change the permissions on config.php to be writable by all (666 or -rw-rw-rw- within your FTP Client)</li>
<li>Change the permissions on the following directories to be writable by all (777 or -rwxrwxrwx within your FTP Client):<br />
<code>store/</code>, <code>cache/</code>, <code>files/</code> and <code>images/avatars/upload/</code>.</li>
<li>Point your web browser to the location where you uploaded the phpBB files with the addition of <code>install/app.php</code> or simply <code>install/</code>, e.g. <code>http://www.example.com/phpBB3/install/app.php</code>, <code>http://www.example.com/forum/install/</code>.</li>
<li>Point your web browser to the location where you uploaded the phpBB files with the addition of <code>install/app.php</code> or simply <code>install/</code>, e.g. <code>http://www.example.com/phpBB/install/app.php</code>, <code>http://www.example.com/forum/install/</code>.</li>
<li>Click the <strong><em>INSTALL</em></strong> tab, follow the steps and fill out all the requested information.</li>
<li>Change the permissions on config.php to be writable only by yourself (644 or -rw-r--r-- within your FTP Client)</li>
<li>phpBB should now be available, please <strong>MAKE SURE</strong> you read at least <a href="#postinstall">Section 6</a> below for important, security related post-installation instructions, and also take note of <a href="#anti_spam">Section 7</a> regarding anti-spam measures.</li>
@ -191,7 +191,7 @@
<p>phpBB comes supplied with British English as its standard language. However, a number of separate packs for different languages are available. If you are not a native English speaker you may wish to install one or more of these packages before continuing. The installation process below will allow you to select a default language from those available (you can, of course, change this default at a later stage). For more details on language packs, where to obtain them and how to install them please see the <a href="README.html#i18n">README</a>.</p>
<p>Once all the files have been uploaded to your site, you should point your browser at this location with the addition of <code>/install/</code>. For example, if your domain name is <code>www.example.com</code> and you placed the phpBB files in the directory <code>/phpBB3</code> off your web root you would enter <code>http://www.example.com/phpBB3/install/</code> or (alternatively) <code>http://www.example.com/phpBB3/install/app.php</code> into your browser. When you have done this, you should see the <strong><em>phpBB Introduction</em></strong> screen appear.</p>
<p>Once all the files have been uploaded to your site, you should point your browser at this location with the addition of <code>/install/</code>. For example, if your domain name is <code>www.example.com</code> and you placed the phpBB files in the directory <code>/phpBB</code> off your web root you would enter <code>http://www.example.com/phpBB/install/</code> or (alternatively) <code>http://www.example.com/phpBB/install/app.php</code> into your browser. When you have done this, you should see the <strong><em>phpBB Introduction</em></strong> screen appear.</p>
<h4>Introduction:</h4>
@ -313,7 +313,7 @@
<li>Go to the <a href="https://www.phpbb.com/downloads/">downloads page</a> and download the latest update package listed there, matching your current version.</li>
<li>Upload the uncompressed archive contents to your phpBB installation - only the <code>install/</code> and <code>vendor/</code> folders are required. Upload these folders in their entirety, retaining the file structure.</li>
<li>After the install folder is present, phpBB will go offline automatically.</li>
<li>Point your browser to the install directory, for example <code>http://www.example.com/phpBB3/install/</code></li>
<li>Point your browser to the install directory, for example <code>http://www.example.com/phpBB/install/</code></li>
<li>Choose the "Update" Tab and follow the instructions</li>
</ul>
@ -407,7 +407,7 @@
<p>After verifying the settings in the ACP, you can delete the install directory to enable the board. The board will stay disabled until you do so.</p>
<p>Once you are pleased with your new installation, you may want to give it the name of your old installation, changing the directory name. With phpBB3 this is possible without any problems, but you may still want to check your cookie settings within the administration panel; in case your cookie path needs to be adjusted prior to renaming.</p>
<p>Once you are pleased with your new installation, you may want to give it the name of your old installation, changing the directory name. With phpBB this is possible without any problems, but you may still want to check your cookie settings within the administration panel; in case your cookie path needs to be adjusted prior to renaming.</p>
<a name="convprob"></a><h3>5.iv. Common conversion problems</h3>
@ -417,7 +417,7 @@
<p><strong>Password conversion</strong> Due to the utf-8 based handling of passwords in phpBB 3.x, it is not always possible to transfer all passwords. For passwords "lost in translation" the easiest workaround is to use the <em>I forgot my password</em> link on the login page.</p>
<p><strong>Path to your former board</strong> The convertor expects the relative path to your old board's files. So, for instance, if the old board is located at <code>http://www.yourdomain.com/forum</code> and the phpBB 3.x installation is located at <code>http://www.yourdomain.com/phpBB3</code>, then the correct value would be <code>../forum</code>. Note that the webserver user must be able to access the source installation's files.</p>
<p><strong>Path to your former board</strong> The convertor expects the relative path to your old board's files. So, for instance, if the old board is located at <code>http://www.yourdomain.com/forum</code> and the phpBB installation is located at <code>http://www.yourdomain.com/phpBB</code>, then the correct value would be <code>../forum</code>. Note that the webserver user must be able to access the source installation's files.</p>
<p><strong>Missing images</strong> If your default board language's language pack does not include all images, then some images might be missing in your installation. Always use a complete language pack as default language.</p>

View file

@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="keywords" content="" />
<meta name="description" content="phpBB 3.3.x Readme" />
<meta name="description" content="phpBB Readme" />
<title>phpBB &bull; Readme</title>
<link href="assets/css/stylesheet.css" rel="stylesheet" type="text/css" media="screen" />
@ -21,7 +21,7 @@
<div id="doc-description">
<a href="../index.php" id="logo"><span class="site_logo"></span></a>
<h1>phpBB 3.3.x Readme</h1>
<h1>phpBB Readme</h1>
<p style="display: none;"><a href="#start_here">Skip</a></p>
</div>
@ -146,7 +146,7 @@
<p>For more information about styles, please see: <a href="https://www.phpbb.com/styles/">https://www.phpbb.com/styles/</a></p>
<p><strong>Please note</strong> that 3rd party styles downloaded for versions of phpBB2 will <strong>not</strong> work in phpBB3. It is also important to ensure that the style is updated to match the current version of the phpBB software you are using.</p>
<p><strong>Please note</strong> that 3rd party styles downloaded for older versions of phpBB might <strong>not</strong> work in the latest phpBB. It is also important to ensure that the style is updated to match the current version of the phpBB software you are using.</p>
<p>Once you have downloaded a style, the usual next step is to unarchive (or upload the unarchived contents of) the package into your <code>styles/</code> directory. You then need to visit <code>Administration Control Panel -&gt; Customise tab -&gt; Style management -&gt; Install Styles</code> where you should see the new style available. Click &quot;Install style&quot; to install the style.</p>
@ -250,7 +250,7 @@
<p>The phpBB developers use a bug tracking system to store, list and manage all reported bugs, it can be found at the location listed below. Please <strong>DO NOT</strong> post bug reports to our forums. In addition please <strong>DO NOT</strong> use the bug tracker for support requests. Posting such a request will only see you directed to the support forums (while taking time away from working on real bugs).</p>
<p><a href="http://tracker.phpbb.com/browse/PHPBB3">http://tracker.phpbb.com/browse/PHPBB3</a></p>
<p><a href="http://tracker.phpbb.com/browse/PHPBB">http://tracker.phpbb.com/browse/PHPBB</a></p>
<p>While we very much appreciate receiving bug reports (the more reports the more stable phpBB will be) we ask you carry out a few steps before adding new entries:</p>

View file

@ -1,5 +1,5 @@
/*
The original "prosilver" theme for phpBB3
The original "prosilver" theme for phpBB
Created by subBlue design :: http://www.subBlue.com
*/

View file

@ -1,293 +0,0 @@
<!DOCTYPE html>
<html dir="ltr" lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="keywords" content="" />
<meta name="description" content="This is an explanation of how to use the phpBB auth/acl API" />
<title>phpBB3 &bull; Auth API</title>
<link href="assets/css/stylesheet.css" rel="stylesheet" type="text/css" media="screen" />
</head>
<body id="phpbb" class="section-docs">
<div id="wrap">
<a id="top" name="top" accesskey="t"></a>
<div id="page-header">
<div class="headerbar">
<div class="inner">
<div id="doc-description">
<a href="../index.php" id="logo"><span class="site_logo"></span></a>
<h1>Auth API</h1>
<p>This is an explanation of how to use the phpBB auth/acl API</p>
<p style="display: none;"><a href="#start_here">Skip</a></p>
</div>
</div>
</div>
</div>
<a name="start_here"></a>
<div id="page-body">
<!-- BEGIN DOCUMENT -->
<p class="paragraph main-description">This is an explanation of how to use the phpBB auth/acl API.</p>
<h1>Auth API</h1>
<div class="paragraph menu">
<div class="inner">
<div class="content">
<ol>
<li><a href="#intro">Introduction</a></li>
<li><a href="#methods">Methods</a>
<ol style="list-style-type: lower-roman;">
<li><a href="#acl">acl</a></li>
<li><a href="#acl_get">acl_get</a></li>
<li><a href="#acl_gets">acl_gets</a></li>
<li><a href="#acl_getf">acl_getf</a></li>
<li><a href="#acl_getf_global">acl_getf_global</a></li>
<li><a href="#acl_cache">acl_cache</a></li>
<li><a href="#acl_clear_prefetch">acl_clear_prefetch</a></li>
<li><a href="#acl_get_list">acl_get_list</a></li>
<li><a href="#misc">Miscellaneous</a></li>
</ol>
</li>
<li><a href="#admin_related">Admin related functions</a></li>
<li><a href="#disclaimer">Copyright and disclaimer</a></li>
</ol>
</div>
</div>
</div>
<hr />
<a name="intro"></a><h2>1. Introduction</h2>
<div class="paragraph">
<div class="inner">
<div class="content">
<h4>What is it?</h4>
<p>The <code>auth</code> class contains methods related to authorisation users to access various board functions, e.g. posting, viewing, replying, logging in (and out), etc. If you need to check whether a user can carry out a task or handle user login/logouts this class is required.</p>
<h4>Initialisation</h4>
<p>To use any methods contained with the <code>auth</code> class it first needs to be instantiated. This is best achieved early in the execution of the script in the following manner:</p>
<div class="codebox"><pre>
$auth = new phpbb\auth\auth();</pre>
</div>
<p>Once an instance of the class has been created you are free to call the various methods it contains. Please note that should you wish to use the <code>auth_admin</code> methods you will need to instantiate this separately but in the same way.</p>
</div>
<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
</div>
</div>
<hr />
<a name="methods"></a><h2>2. Methods</h2>
<div class="paragraph">
<div class="inner">
<div class="content">
<p>Following are the methods you are able to use.</p>
<a name="acl"></a><h3>2.i. acl</h3>
<p>The <code>acl</code> method is the initialisation routine for all the acl functions. If you intend calling any acl method you must first call this. The method takes as its one and only required parameter an associative array containing user information as stored in the database. This array must contain at least the following information; user_id, user_permissions and user_type. It is called in the following way:</p>
<div class="codebox"><pre>
$auth-&gt;acl(<code>userdata</code>);</pre>
</div>
<p>Where userdata is the array containing the aforementioned data.</p>
<a name="acl_get"></a><h3>2.ii. acl_get</h3>
<p>This method is the primary way of determining what a user can and cannot do for a given option globally or in a given forum. The method should be called in the following way:</p>
<div class="codebox"><pre>
$result = $auth-&gt;acl_get(<code>option</code>[, <code>forum</code>]);</pre>
</div>
<p>Where option is a string representing the required option, e.g. 'f_list', 'm_edit', 'a_adduser', etc. By adding a ! in front of the option, e.g. '!f_list' the result of this method will be negated. The optional forum term is the integer forum_id.</p>
<p>The method returns a positive integer when the user is allowed to carry out the option and a zero if denied or the other way around if the option is prefixed with an exclamation mark.</p>
<p>If you specify a forum and there is also a global setting for the specified option then this method will return a positive integer if one of them evaluates to a positive integer. An example would be the m_approve option which can be set per forum but also globally. If a user has the global option he will automatically have m_approve in every forum.</p>
<p>There are some special options or <em>flags</em> which are used as prefixes for other options, e.g. 'f_' or 'm_'. These flags will automatically be set to a positive integer if the user has one or more permissions with the given prefix. A local setting will result in the flag being set only locally (so it will require a forum id to retrieve). If a user has one or more global permissions with the prefix acl_get will return a positive integer regardless of the forum id.</p>
<a name="acl_gets"></a><h3>2.iii. acl_gets</h3>
<p>This method is funtionally similar to <code>acl_get</code> in that it returns information on whether a user can or cannot carry out a given task. The difference here is the ability to test several different options in one go. This may be useful for testing whether a user is a moderator or an admin in one call. Rather than having to call and check <code>acl_get</code> twice.</p>
<p>The method should be called thus:</p>
<div class="codebox"><pre>
$result = $auth-&gt;acl_gets(<code>option1</code>[, <code>option2</code>, ..., <code>optionN</code>, <code>forum</code>]);</pre>
</div>
<p>As with the <code>acl_get</code> method the options are strings representing the required permissions to check. The forum again is an integer representing a given forum_id.</p>
<p>The method will return a positive integer if <code>acl_get</code> for one of the options evaluates to a positive integer (combines permissions with OR).</p>
<a name="acl_getf"></a><h3>2.iv. acl_getf</h3>
<p>This method is used to find out in which forums a user is allowed to carry out an operation or to find out in which forums he is not allowed to carry out an operation. The method should be called in the following way:</p>
<div class="codebox"><pre>
$result = $auth-&gt;acl_getf(<code>option</code>[, <code>clean</code>]);</pre>
</div>
<p>Just like in the <code>acl_get</code> method the option is a string specifying the permission which has to be checked (negation using ! is allowed). The second parameter is a boolean. If it is set to false this method returns all forums with either zero or a positive integer. If it is set to true only those forums with a positive integer as the result will be returned.</p>
<p>The method returns an associative array of the form:</p>
<div class="codebox"><pre>
array(<em>forum_id1</em> =&gt; array(<em>option</em> =&gt; <em>integer</em>), <em>forum_id2</em> =&gt; ...)</pre>
</div>
<p>Where option is the option passed to the method and integer is either zero or a positive integer and the same <code>acl_get(option, forum_id)</code> would return.</p>
<a name="acl_getf_global"></a><h3>2.v. acl_getf_global</h3>
<p>This method is used to find out whether a user has a permission in at least one forum or globally. This method is similar to checking whether <code>acl_getf(option, true)</code> returned one or more forums but it's faster. It should be called in the following way:</p>
<div class="codebox"><pre>
$result = $auth-&gt;acl_getf_global(<code>option</code>)</pre>
</div>
<p>As with the previous methods option is a string specifying the permission which has to be checked.</p>
<p>This method returns either zero or a positive integer.</p>
<a name="acl_cache"></a><h3>2.vi. acl_cache</h3>
<p>This should be considered a private method and not be called externally. It handles the generation of the user_permissions data from the basic user and group authorisation data. When necessary this method is called automatically by <code>acl</code>.</p>
<a name="acl_clear_prefetch"></a><h3>2.vii. acl_clear_prefetch</h3>
<p>This method clears the user_permissions column in the users table for the given user. If the user ID passed is zero, the permissions cache is cleared for all users. This method should be called whenever permissions are set.</p>
<div class="codebox"><pre>
// clear stored permissions for user 2
$user_id = 2;
$auth->acl_clear_prefetch($user_id);
</pre></div>
<p>This method returns null.</p>
<a name="acl_get_list"></a><h3>2.viii. acl_get_list</h3>
<p>This method returns an an array describing which users have permissions in given fora. The resultant array contains an entry for permission that every user has in every forum when no arguments are passed.</p>
<div class="codebox"><pre>
$user_id = array(2, 53);
$permissions = array('f_list', 'f_read');
$forum_id = array(1, 2, 3);
$result = $auth-&gt;acl_get_list($user_id, $permissions, $forum_id);
</pre></div>
<p>The parameters may be of the following legal types:</p>
<ul>
<li><strong>$user_id</strong>: <code>false</code>, int, array(int, int, int, ...)</li>
<li><strong>$permissions</strong>: <code>false</code>, string, array(string, string, ...)</li>
<li><strong>$forum_id</strong>: <code>false</code>, int, array(int, int, int, ...)</li>
</ul>
<a name="misc"></a><h3>2.ix. Miscellaneous</h3>
<p>There are other methods defined in the auth class which serve mostly as private methods, but are available for use if needed. Each of them is used to pull data directly from the database tables. They are:</p>
<ul>
<li><pre>function acl_group_raw_data($group_id = false, $opts = false, $forum_id = false)</pre></li>
<li><pre>function acl_user_raw_data($user_id = false, $opts = false, $forum_id = false)</pre></li>
<li><pre>function acl_raw_data_single_user($user_id)</pre></li>
<li><pre>function acl_raw_data($user_id = false, $opts = false, $forum_id = false)</pre></li>
<li><pre>function acl_role_data($user_type, $role_type, $ug_id = false, $forum_id = false)</pre></li>
</ul>
<p>Of these, <code>acl_raw_data</code> is the most general, but the others will be faster if you need a smaller amount of data.</p>
</div>
<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
</div>
</div>
<hr />
<a name="admin_related"></a><h2>3. Admin related functions</h2>
<div class="paragraph">
<div class="inner">
<div class="content">
<p>A number of additional methods are available related to <code>auth</code>. These handle more basic functions such as adding user and group permissions, new options and clearing the user cache. These methods are contained within a separate class, <code>auth_admin</code>. This can be found in <code>includes/acp/auth.php</code>.</p>
<p>To use any methods this class contains it first needs to be instantiated separately from <code>auth</code>. This is achieved in the same way as <code>auth</code>:</p>
<div class="codebox"><pre>
$auth_admin = new auth_admin();</pre>
</div>
<p>This instance gives you access to both the methods of this specific class and that of <code>auth</code>.</p>
</div>
<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
</div>
</div>
<hr />
<a name="disclaimer"></a><h2>4. Copyright and disclaimer</h2>
<div class="paragraph">
<div class="inner">
<div class="content">
<p>phpBB is free software, released under the terms of the <a href="http://opensource.org/licenses/gpl-2.0.php">GNU General Public License, version 2 (GPL-2.0)</a>. Copyright © <a href="https://www.phpbb.com">phpBB Limited</a>. For full copyright and license information, please see the docs/CREDITS.txt file.</p>
</div>
<div class="back2top"><a href="#wrap" class="top">Back to Top</a></div>
</div>
</div>
<!-- END DOCUMENT -->
<div id="page-footer">
<div class="version">&nbsp;</div>
</div>
</div></div>
<div>
<a id="bottom" accesskey="z"></a>
</div>
</body>
</html>

File diff suppressed because it is too large Load diff

View file

@ -458,7 +458,7 @@ class acp_groups
* Validate the length of "Maximum number of allowed recipients per
* private message" setting. We use 16777215 as a maximum because it matches
* MySQL unsigned mediumint maximum value which is the lowest amongst DBMSes
* supported by phpBB3. Also validate the submitted colour value.
* supported by phpBB. Also validate the submitted colour value.
*/
$validation_checks = array(
'max_recipients' => array('num', false, 0, 16777215),

View file

@ -3194,7 +3194,7 @@ function msg_handler($errno, $msg_text, $errfile, $errline): bool
* and converts backslashes to forward slashes.
*
* @param string $errfile Absolute file path
* (e.g. /var/www/phpbb3/phpBB/includes/functions.php)
* (e.g. /var/www/phpbb/phpBB/includes/functions.php)
* Please note that if $errfile is outside of the phpBB root,
* the root path will not be found and can not be filtered.
* @return string Relative file path

View file

@ -103,7 +103,7 @@ $tables = array(
* In either of the latter cases 'table_name' indicates the name of the table in the database
*
* 'settings' is an array which maps the name of the config directive in the source forum
* to the config directive in phpBB3. It can either be a direct mapping or use a function.
* to the config directive in phpBB. It can either be a direct mapping or use a function.
* Please note that the contents of the old config value are passed to the function, therefore
* an in-built function requiring the variable passed by reference is not able to be used. Since
* empty() is such a function we created the function is_empty() to be used instead.
@ -332,7 +332,7 @@ if (!$get_info)
// if (defined("MOD_ATTACHMENT")) { import_attachment_files(); phpbb_copy_thumbnails(); }
// phpBB2 allowed some similar usernames to coexist which would have the same
// username_clean in phpBB3 which is not possible, so we'll give the admin a list
// username_clean in phpBB which is not possible, so we'll give the admin a list
// of user ids and usernames and let him deicde what he wants to do with them
'execute_first' => '
phpbb_create_userconv_table();

View file

@ -1176,7 +1176,7 @@ function phpbb_convert_group_type($group_type)
break;
}
// Never return GROUP_SPECIAL here, because only phpBB3's default groups are allowed to have this type set.
// Never return GROUP_SPECIAL here, because only phpBB's default groups are allowed to have this type set.
return GROUP_HIDDEN;
}
@ -1735,7 +1735,7 @@ function phpbb_disallowed_username($username)
/**
* Checks whether there are any usernames on the old board that would map to the same
* username_clean on phpBB3. Prints out a list if any exist and exits.
* username_clean on phpBB. Prints out a list if any exist and exits.
*/
function phpbb_create_userconv_table()
{

View file

@ -86,7 +86,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('chg_passforce', '0
INSERT INTO phpbb_config (config_name, config_value) VALUES ('confirm_refresh', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('contact_admin_form_enable', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('cookie_domain', '');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('cookie_name', 'phpbb3');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('cookie_name', 'phpbb');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('cookie_notice', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('cookie_path', '/');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('cookie_secure', '0');

View file

@ -458,7 +458,7 @@ $lang = array_merge($lang, array(
'RANKS_PATH' => 'Rank image storage path',
'RANKS_PATH_EXPLAIN' => 'Path under your phpBB root directory, e.g. <samp>images/ranks</samp>.',
'SCRIPT_PATH' => 'Script path',
'SCRIPT_PATH_EXPLAIN' => 'The path where phpBB is located relative to the domain name, e.g. <samp>/phpBB3</samp>.',
'SCRIPT_PATH_EXPLAIN' => 'The path where phpBB is located relative to the domain name, e.g. <samp>/phpBB</samp>.',
'SERVER_NAME' => 'Domain name',
'SERVER_NAME_EXPLAIN' => 'The domain name this board runs from (for example: <samp>example.com</samp>).',
'SERVER_PORT' => 'Server port',

View file

@ -77,7 +77,7 @@ $lang = array_merge($lang, array(
'ENABLE_TOPIC_ICONS' => 'Enable topic icons',
'FORUM_ADMIN' => 'Forum administration',
'FORUM_ADMIN_EXPLAIN' => 'In phpBB3 everything is forum based. A category is just a special type of forum. Each forum can have an unlimited number of sub-forums and you can determine whether each may be posted to or not (i.e. whether it acts like an old category). Here you can add, edit, delete, lock, unlock individual forums as well as set certain additional controls. If your posts and topics have got out of sync you can also resynchronise a forum. <strong>You need to copy or set appropriate permissions for newly created forums to have them displayed.</strong>',
'FORUM_ADMIN_EXPLAIN' => 'In phpBB everything is forum based. A category is just a special type of forum. Each forum can have an unlimited number of sub-forums and you can determine whether each may be posted to or not (i.e. whether it acts like an old category). Here you can add, edit, delete, lock, unlock individual forums as well as set certain additional controls. If your posts and topics have got out of sync you can also resynchronise a forum. <strong>You need to copy or set appropriate permissions for newly created forums to have them displayed.</strong>',
'FORUM_AUTO_PRUNE' => 'Enable auto-pruning',
'FORUM_AUTO_PRUNE_EXPLAIN' => 'Prunes the forum of topics, set the frequency/age parameters below.',
'FORUM_CREATED' => 'Forum created successfully.',

View file

@ -54,7 +54,7 @@ $lang = array_merge($lang, array(
<br />
<p>For further information on setting up and managing permissions on your phpBB3 board, please see the section on <a href="https://www.phpbb.com/support/docs/en/3.3/ug/quickstart/permissions/">Setting permissions of our Quick Start Guide</a>.</p>
<p>For further information on setting up and managing permissions on your phpBB board, please see the section on <a href="https://www.phpbb.com/support/docs/en/3.3/ug/quickstart/permissions/">Setting permissions of our Quick Start Guide</a>.</p>
',
'ACL_NEVER' => 'Never',

View file

@ -45,18 +45,18 @@ $lang = array_merge($lang, array(
// Introduction page
'INTRODUCTION_TITLE' => 'Introduction',
'INTRODUCTION_BODY' => 'Welcome to phpBB3!<br /><br />phpBB® is the most widely used open source bulletin board solution in the world. phpBB3 is the latest installment in a package line started in 2000. Like its predecessors, phpBB3 is feature-rich, user-friendly, and fully supported by the phpBB Team. phpBB3 greatly improves on what made phpBB2 popular, and adds commonly requested features that were not present in previous versions. We hope it exceeds your expectations.<br /><br />This installation system will guide you through installing phpBB3, updating to the latest version of phpBB3 from past releases, as well as converting to phpBB3 from a different discussion board system (including phpBB2). For more information, we encourage you to read <a href="%1$s">the installation guide</a>.<br /><br />To read the phpBB3 license or learn about obtaining support and our stance on it, please select the respective options from the side menu. To continue, please select the appropriate tab above.',
'INTRODUCTION_BODY' => 'Welcome to phpBB!<br /><br />phpBB® is the most widely used open source bulletin board solution in the world. phpBB is the latest installment in a package line started in 2000. Like its predecessors, phpBB is feature-rich, user-friendly, and fully supported by the phpBB Team. phpBB greatly improves on what made phpBB2 and phpBB3 popular, and adds commonly requested features that were not present in previous versions. We hope it exceeds your expectations.<br /><br />This installation system will guide you through installing phpBB, updating to the latest version of phpBB from past releases, as well as converting to phpBB from a different discussion board system (including phpBB2). For more information, we encourage you to read <a href="%1$s">the installation guide</a>.<br /><br />To read the phpBB license or learn about obtaining support and our stance on it, please select the respective options from the side menu. To continue, please select the appropriate tab above.',
// Support page
'SUPPORT_TITLE' => 'Support',
'SUPPORT_BODY' => 'Full support will be provided for the current stable release of phpBB3, free of charge. This includes:</p><ul><li>installation</li><li>configuration</li><li>technical questions</li><li>problems relating to potential bugs in the software</li><li>updating from Release Candidate (RC) versions to the latest stable version</li><li>converting from phpBB 2.0.x to phpBB3</li><li>converting from other discussion board software to phpBB3 (please see the <a href="https://www.phpbb.com/community/viewforum.php?f=486">Convertors Forum</a>)</li></ul><p>We encourage users still running beta versions of phpBB3 to replace their installation with a fresh copy of the latest version.</p><h2>Extensions / Styles</h2><p>For issues relating to Extensions, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=451">Extensions Forum</a>.<br />For issues relating to styles, templates and themes, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=471">Styles Forum</a>.<br /><br />If your question relates to a specific package, please post directly in the topic dedicated to the package.</p><h2>Obtaining Support</h2><p><a href="https://www.phpbb.com/support/">Support Section</a><br /><a href="https://www.phpbb.com/support/docs/en/3.3/ug/quickstart/">Quick Start Guide</a><br /><br />To ensure you stay up to date with the latest news and releases, follow us on <a href="https://www.twitter.com/phpbb/">Twitter</a> and <a href="https://www.facebook.com/phpbb/">Facebook</a><br /><br />',
'SUPPORT_BODY' => 'Full support will be provided for the current stable release of phpBB, free of charge. This includes:</p><ul><li>installation</li><li>configuration</li><li>technical questions</li><li>problems relating to potential bugs in the software</li><li>updating from Release Candidate (RC) versions to the latest stable version</li><li>converting from phpBB 2.0.x to phpBB</li><li>converting from other discussion board software to phpBB (please see the <a href="https://www.phpbb.com/community/viewforum.php?f=486">Convertors Forum</a>)</li></ul><p>We encourage users still running pre-release versions of phpBB to replace their installation with a fresh copy of the latest version.</p><h2>Extensions / Styles</h2><p>For issues relating to Extensions, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=451">Extensions Forum</a>.<br />For issues relating to styles, templates and themes, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=471">Styles Forum</a>.<br /><br />If your question relates to a specific package, please post directly in the topic dedicated to the package.</p><h2>Obtaining Support</h2><p><a href="https://www.phpbb.com/support/">Support Section</a><br /><a href="https://www.phpbb.com/support/docs/en/3.3/ug/quickstart/">Quick Start Guide</a><br /><br />To ensure you stay up to date with the latest news and releases, follow us on <a href="https://www.twitter.com/phpbb/">Twitter</a> and <a href="https://www.facebook.com/phpbb/">Facebook</a><br /><br />',
// License
'LICENSE_TITLE' => 'General Public License',
// Install page
'INSTALL_INTRO' => 'Welcome to Installation',
'INSTALL_INTRO_BODY' => 'With this option, it is possible to install phpBB3 onto your server.</p><p>In order to proceed, you will need your database settings. If you do not know your database settings, please contact your host and ask for them. You will not be able to continue without them. You need:</p>
'INSTALL_INTRO_BODY' => 'With this option, it is possible to install phpBB onto your server.</p><p>In order to proceed, you will need your database settings. If you do not know your database settings, please contact your host and ask for them. You will not be able to continue without them. You need:</p>
<ul>
<li>The Database Type - the database you will be using.</li>
@ -68,7 +68,7 @@ $lang = array_merge($lang, array(
<p><strong>Note:</strong> if you are installing using SQLite, you should enter the full path to your database file in the DSN field and leave the username and password fields blank. For security reasons, you should make sure that the database file is not stored in a location accessible from the web.</p>
<p>phpBB3 supports the following databases:</p>
<p>phpBB supports the following databases:</p>
<ul>
<li>MySQL 4.1.3 or above (MySQLi required)</li>
<li>PostgreSQL 8.3+</li>
@ -235,7 +235,7 @@ $lang = array_merge($lang, array(
'UPGRADE_INSTRUCTIONS' => 'A new feature release <strong>%1$s</strong> is available. Please read <a href="%2$s" title="%2$s"><strong>the release announcement</strong></a> to learn about what it has to offer, and how to upgrade.',
'SERVER_CONFIG' => 'Server configuration',
'SCRIPT_PATH' => 'Script path',
'SCRIPT_PATH_EXPLAIN' => 'The path where phpBB is located relative to the domain name, e.g. <samp>/phpBB3</samp>.',
'SCRIPT_PATH_EXPLAIN' => 'The path where phpBB is located relative to the domain name, e.g. <samp>/phpBB</samp>.',
));
// Default database schema entries...
@ -244,7 +244,7 @@ $lang = array_merge($lang, array(
'CONFIG_SITE_DESC' => 'A short text to describe your forum',
'CONFIG_SITENAME' => 'yourdomain.com',
'DEFAULT_INSTALL_POST' => '<t>This is an example post in your phpBB3 installation. Everything seems to be working. You may delete this post if you like and continue to set up your board. During the installation process your first category and your first forum are assigned an appropriate set of permissions for the predefined usergroups administrators, bots, global moderators, guests, registered users and registered COPPA users. If you also choose to delete your first category and your first forum, do not forget to assign permissions for all these usergroups for all new categories and forums you create. It is recommended to rename your first category and your first forum and copy permissions from these while creating new categories and forums. Have fun!</t>',
'DEFAULT_INSTALL_POST' => '<t>This is an example post in your phpBB installation. Everything seems to be working. You may delete this post if you like and continue to set up your board. During the installation process your first category and your first forum are assigned an appropriate set of permissions for the predefined usergroups administrators, bots, global moderators, guests, registered users and registered COPPA users. If you also choose to delete your first category and your first forum, do not forget to assign permissions for all these usergroups for all new categories and forums you create. It is recommended to rename your first category and your first forum and copy permissions from these while creating new categories and forums. Have fun!</t>',
'FORUMS_FIRST_CATEGORY' => 'Your first category',
'FORUMS_TEST_FORUM_DESC' => 'Description of your first forum.',
@ -281,7 +281,7 @@ $lang = array_merge($lang, array(
'SMILIES_VERY_HAPPY' => 'Very Happy',
'SMILIES_WINK' => 'Wink',
'TOPICS_TOPIC_TITLE' => 'Welcome to phpBB3',
'TOPICS_TOPIC_TITLE' => 'Welcome to phpBB',
));
// Common navigation items' translation
@ -365,7 +365,7 @@ $lang = array_merge($lang, array(
<h1>How to update your installation with the Full Package</h1>
<p>The recommended way of updating your installation is using the full package. If core phpBB files have been modified in your installation you may wish to use the advanced update package in order to not lose these changes. You are also able to update your installation using the other methods listed within the INSTALL.html document. The steps for updating phpBB3 using the full package are:</p>
<p>The recommended way of updating your installation is using the full package. If core phpBB files have been modified in your installation you may wish to use the advanced update package in order to not lose these changes. You are also able to update your installation using the other methods listed within the INSTALL.html document. The steps for updating phpBB using the full package are:</p>
<ol style="margin-left: 20px; font-size: 1.1em;">
<li><strong class="error">Backup all board files and the database.</strong></li>
@ -374,7 +374,7 @@ $lang = array_merge($lang, array(
<li>Remove (delete) the <code class="inline">config.php</code> file, and the <code class="inline">/images</code>, <code class="inline">/store</code> and <code class="inline">/files</code> folders <em>from the package</em> (not your site).</li>
<li>Go to the ACP, Board settings, and make sure prosilver is set as the default style. If not, set it to prosilver.</li>
<li>Delete the <code class="inline">/vendor</code> and <code class="inline">/cache</code> folders from the boards root folder on the host.</li>
<li>Via FTP or SSH upload the remaining files and folders (that is, the remaining CONTENTS of the phpBB3 folder) to the root folder of your board installation on the server, overwriting the existing files. (Note: take care not to delete any extensions in your <code class="inline">/ext</code> folder when uploading the new phpBB3 contents.)</li>
<li>Via FTP or SSH upload the remaining files and folders (that is, the remaining CONTENTS of the phpBB folder) to the root folder of your board installation on the server, overwriting the existing files. (Note: take care not to delete any extensions in your <code class="inline">/ext</code> folder when uploading the new phpBB contents.)</li>
<li><strong><a href="%1$s" title="%1$s">Now start the update process by pointing your browser to the install folder</a>.</strong></li>
<li>Follow the steps to update the database and let that run to completion.</li>
<li>Via FTP or SSH delete the <code class="inline">/install</code> folder from the root of your board installation.<br><br></li>
@ -388,7 +388,7 @@ $lang = array_merge($lang, array(
<h1>How to update your installation with the Advanced Update Package</h1>
<p>The advanced update package is only recommended for expert users in case core phpBB files have been modified in your installation. You are also able to update your installation using the methods listed within the INSTALL.html document. The steps for updating phpBB3 using the advanced update package are:</p>
<p>The advanced update package is only recommended for expert users in case core phpBB files have been modified in your installation. You are also able to update your installation using the methods listed within the INSTALL.html document. The steps for updating phpBB using the advanced update package are:</p>
<ol style="margin-left: 20px; font-size: 1.1em;">
<li>Go to the <a href="https://www.phpbb.com/downloads/" title="https://www.phpbb.com/downloads/">phpBB.com downloads page</a> and download the "Advanced Update Package" archive.</li>
@ -503,7 +503,7 @@ $lang = array_merge($lang, array(
'CONVERT_NOT_EXIST' => 'The specified convertor does not exist.',
'DEV_NO_TEST_FILE' => 'No value has been specified for the test_file variable in the convertor. If you are a user of this convertor, you should not be seeing this error, please report this message to the convertor author. If you are a convertor author, you must specify the name of a file which exists in the source board to allow the path to it to be verified.',
'COULD_NOT_FIND_PATH' => 'Could not find path to your former board. Please check your settings and try again.<br />» %s was specified as the source path.',
'CONFIG_PHPBB_EMPTY' => 'The phpBB3 config variable for “%s” is empty.',
'CONFIG_PHPBB_EMPTY' => 'The phpBB config variable for “%s” is empty.',
'MAKE_FOLDER_WRITABLE' => 'Please make sure that this folder exists and is writable by the webserver then try again:<br />»<strong>%s</strong>.',
'MAKE_FOLDERS_WRITABLE' => 'Please make sure that these folders exist and are writable by the webserver then try again:<br />»<strong>%s</strong>.',
@ -539,7 +539,7 @@ $lang = array_merge($lang, array(
'DEFAULT_PREFIX_IS' => 'The convertor was not able to find tables with the specified prefix. Please make sure you have entered the correct details for the board you are converting from. The default table prefix for %1$s is <strong>%2$s</strong>.',
'SPECIFY_OPTIONS' => 'Specify conversion options',
'FORUM_PATH' => 'Board path',
'FORUM_PATH_EXPLAIN' => 'This is the <strong>relative</strong> path on disk to your former board from the <strong>root of this phpBB3 installation</strong>.',
'FORUM_PATH_EXPLAIN' => 'This is the <strong>relative</strong> path on disk to your former board from the <strong>root of this phpBB installation</strong>.',
'REFRESH_PAGE' => 'Refresh page to continue conversion',
'REFRESH_PAGE_EXPLAIN' => 'If set to yes, the convertor will refresh the page to continue the conversion after having finished a step. If this is your first conversion for testing purposes and to determine any errors in advance, we suggest to set this to No.',

View file

@ -21,7 +21,7 @@ use phpbb\request\type_cast_helper;
use phpbb\user;
/**
* Apache authentication provider for phpBB3
* Apache authentication provider for phpBB
*/
class apache extends base
{

View file

@ -21,7 +21,7 @@ use phpbb\passwords\manager;
use phpbb\user;
/**
* Database authentication provider for phpBB3
* Database authentication provider for phpBB
* This is for authentication via the integrated user table
*/
class db extends base

View file

@ -20,7 +20,7 @@ use phpbb\language\language;
use phpbb\user;
/**
* Database authentication provider for phpBB3
* Database authentication provider for phpBB
* This is for authentication via the integrated user table
*/
class ldap extends base

View file

@ -31,7 +31,7 @@ use phpbb\request\request_interface;
use phpbb\user;
/**
* OAuth authentication provider for phpBB3
* OAuth authentication provider for phpBB
*/
class oauth extends base
{

View file

@ -23,11 +23,11 @@
"classmap": [""]
},
"require": {
"php": ">=5.4"
"php": "^8.1"
},
"extra": {
"branch-alias": {
"dev-master": "3.3.x-dev"
"dev-master": "4.0.x-dev"
}
}
}

View file

@ -37,7 +37,7 @@ class mssqlnative extends \phpbb\db\driver\mssql_base
// Test for driver support, to avoid suppressed fatal error
if (!function_exists('sqlsrv_connect'))
{
$this->connect_error = 'Native MS SQL Server driver for PHP is missing or needs to be updated. Version 1.1 or later is required to install phpBB3. You can download the driver from: http://www.microsoft.com/sqlserver/2005/en/us/PHP-Driver.aspx';
$this->connect_error = 'Native MS SQL Server driver for PHP is missing or needs to be updated. Version 1.1 or later is required to install phpBB. You can download the driver from: http://www.microsoft.com/sqlserver/2005/en/us/PHP-Driver.aspx';
return $this->sql_error('');
}

View file

@ -173,7 +173,7 @@ class add_config_settings extends database_task
}
// We set a (semi-)unique cookie name to bypass login issues related to the cookie name.
$cookie_name = 'phpbb3_';
$cookie_name = 'phpbb_';
$rand_str = md5(mt_rand());
$rand_str = str_replace('0', 'z', base_convert($rand_str, 16, 35));
$rand_str = substr($rand_str, 0, 5);

View file

@ -165,7 +165,7 @@ class create_config_file extends \phpbb\install\task_base
protected function get_config_data($debug = false, $debug_container = false, $environment = null)
{
$config_content = "<?php\n";
$config_content .= "// phpBB 3.3.x auto-generated configuration file\n// Do not change anything in this file!\n";
$config_content .= "// phpBB auto-generated configuration file\n// Do not change anything in this file!\n";
$dbms = $this->install_config->get('dbms');
$db_driver = $this->db_helper->get_available_dbms($dbms);

View file

@ -125,10 +125,10 @@ class session
$page .= '?' . $query_string;
}
// The script path from the webroot to the current directory (for example: /phpBB3/adm/) : always prefixed with / and ends in /
// The script path from the webroot to the current directory (for example: /phpBB/adm/) : always prefixed with / and ends in /
$script_path = $symfony_request->getBasePath();
// The script path from the webroot to the phpBB root (for example: /phpBB3/)
// The script path from the webroot to the phpBB root (for example: /phpBB/)
$script_dirs = explode('/', $script_path);
array_splice($script_dirs, -count($page_dirs));
$root_script_path = implode('/', $script_dirs) . (count($root_dirs) ? '/' . implode('/', $root_dirs) : '');

View file

@ -15,8 +15,9 @@
"support": {
"issues": "https://tracker.phpbb.com",
"forum": "https://www.phpbb.com/community/",
"wiki": "https://wiki.phpbb.com",
"irc": "irc://irc.freenode.org/phpbb"
"docs": "https://www.phpbb.com/support/docs/",
"irc": "irc://irc.libera.chat/phpbb",
"chat": "https://www.phpbb.com/support/chat/"
},
"extra": {
"display-name": "prosilver",

View file

@ -1,7 +1,7 @@
/* global phpbb */
/**
* phpBB3 forum functions
* phpBB forum functions
*/
/**

View file

@ -26,7 +26,7 @@
<!--
phpBB style name: prosilver
Based on style: prosilver (this is the default phpBB3 style)
Based on style: prosilver (this is the default phpBB style)
Original author: Tom Beddard ( http://www.subBlue.com/ )
Modified by:
-->

View file

@ -1,6 +1,6 @@
/* phpBB3 Style Sheet
/* phpBB Style Sheet
--------------------------------------------------------------
Style name: prosilver (the default phpBB 3.3.x style)
Style name: prosilver (the default phpBB style)
Based on style:
Original author: Tom Beddard ( http://www.subblue.com/ )
Modified by: phpBB Limited ( https://www.phpbb.com/ )

View file

@ -0,0 +1,25 @@
{
"name": "phpbb/phpbb-style-prosilver-2",
"description": "phpBB Forum Software default style",
"type": "phpbb-style",
"version": "4.0.0-a1-dev",
"homepage": "https://www.phpbb.com",
"license": "GPL-2.0",
"authors": [
{
"name": "phpBB Limited",
"email": "operations@phpbb.com",
"homepage": "https://www.phpbb.com/go/authors"
}
],
"support": {
"issues": "https://tracker.phpbb.com",
"forum": "https://www.phpbb.com/community/",
"irc": "irc://irc.freenode.org/phpbb"
},
"extra": {
"display-name": "prosilver2",
"phpbb-version": "4.0.0-a1-dev",
"parent-style": ""
}
}

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M4 15V9h8V4.16L19.84 12L12 19.84V15z"/></svg>

After

Width:  |  Height:  |  Size: 159 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M480 32c0-12.9-7.8-24.6-19.8-29.6s-25.7-2.2-34.9 6.9L381.7 53c-48 48-113.1 75-181 75H192 160 64c-35.3 0-64 28.7-64 64v96c0 35.3 28.7 64 64 64l0 128c0 17.7 14.3 32 32 32h64c17.7 0 32-14.3 32-32V352l8.7 0c67.9 0 133 27 181 75l43.6 43.6c9.2 9.2 22.9 11.9 34.9 6.9s19.8-16.6 19.8-29.6V300.4c18.6-8.8 32-32.5 32-60.4s-13.4-51.6-32-60.4V32zm-64 76.7V240 371.3C357.2 317.8 280.5 288 200.7 288H192V192h8.7c79.8 0 156.5-29.8 215.3-83.3z"/></svg>

After

Width:  |  Height:  |  Size: 659 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M9 22a1 1 0 0 1-1-1v-3H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-6.1l-3.7 3.71c-.2.19-.45.29-.7.29zm1-6v3.08L13.08 16H20V4H4v12zM6 7h12v2H6zm0 4h9v2H6z"/></svg>

After

Width:  |  Height:  |  Size: 299 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M16 15H9v-2h7zm3-4H9V9h10zm0-4H9V5h10zM3 5v16h16v2H3a2 2 0 0 1-2-2V5zm18-4a2 2 0 0 1 2 2v14c0 1.11-.89 2-2 2H7a2 2 0 0 1-2-2V3c0-1.11.89-2 2-2zM7 3v14h14V3z"/></svg>

After

Width:  |  Height:  |  Size: 279 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M5 3c-1.11 0-2 .89-2 2v14c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2V5c0-1.11-.89-2-2-2zm0 2h14v14H5zm2 2v2h10V7zm0 4v2h10v-2zm0 4v2h7v-2z"/></svg>

After

Width:  |  Height:  |  Size: 254 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M6 2a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6zm0 2h7v5h5v11H6zm2 8v2h8v-2zm0 4v2h5v-2z"/></svg>

After

Width:  |  Height:  |  Size: 224 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M17.66 11.2c-.23-.3-.51-.56-.77-.82c-.67-.6-1.43-1.03-2.07-1.66C13.33 7.26 13 4.85 13.95 3c-.95.23-1.78.75-2.49 1.32c-2.59 2.08-3.61 5.75-2.39 8.9c.04.1.08.2.08.33c0 .22-.15.42-.35.5c-.23.1-.47.04-.66-.12a.58.58 0 0 1-.14-.17c-1.13-1.43-1.31-3.48-.55-5.12C5.78 10 4.87 12.3 5 14.47c.06.5.12 1 .29 1.5c.14.6.41 1.2.71 1.73c1.08 1.73 2.95 2.97 4.96 3.22c2.14.27 4.43-.12 6.07-1.6c1.83-1.66 2.47-4.32 1.53-6.6l-.13-.26c-.21-.46-.77-1.26-.77-1.26m-3.16 6.3c-.28.24-.74.5-1.1.6c-1.12.4-2.24-.16-2.9-.82c1.19-.28 1.9-1.16 2.11-2.05c.17-.8-.15-1.46-.28-2.23c-.12-.74-.1-1.37.17-2.06c.19.38.39.76.63 1.06c.77 1 1.98 1.44 2.24 2.8c.04.14.06.28.06.43c.03.82-.33 1.72-.93 2.27"/></svg>

After

Width:  |  Height:  |  Size: 788 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.3c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64H348.7c2.2 20.4 3.3 41.8 3.3 64zm28.8-64H503.9c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64zm112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6c78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7c10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5c11.6 26 20.9 58.2 27 94.7zm-209 0H18.6C48.6 85.9 112.2 29.1 190.6 8.4C165.1 42.6 145.3 96.1 135.3 160zM8.1 192H131.2c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64zM194.7 446.6c-11.6-26-20.9-58.2-27-94.6H344.3c-6.1 36.4-15.5 68.6-27 94.6c-10.5 23.6-22.2 40.7-33.5 51.5C272.6 508.8 263.3 512 256 512s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5zM135.3 352c10 63.9 29.8 117.4 55.3 151.6C112.2 482.9 48.6 426.1 18.6 352H135.3zm358.1 0c-30 74.1-93.6 130.9-171.9 151.6c25.5-34.2 45.2-87.7 55.3-151.6H493.4z"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M13.5 4A1.5 1.5 0 0 0 12 5.5A1.5 1.5 0 0 0 13.5 7A1.5 1.5 0 0 0 15 5.5A1.5 1.5 0 0 0 13.5 4m-.36 4.77c-1.19.1-4.44 2.69-4.44 2.69c-.2.15-.14.14.02.42c.16.27.14.29.33.16c.2-.13.53-.34 1.08-.68c2.12-1.36.34 1.78-.57 7.07c-.36 2.62 2 1.27 2.61.87c.6-.39 2.21-1.5 2.37-1.61c.22-.15.06-.27-.11-.52c-.12-.17-.24-.05-.24-.05c-.65.43-1.84 1.33-2 .76c-.19-.57 1.03-4.48 1.7-7.17c.11-.64.41-2.04-.75-1.94"/></svg>

After

Width:  |  Height:  |  Size: 517 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.982 2.982 0 0 0 0-4.24a2.982 2.982 0 0 0-4.24 0l-3.53 3.53a2.982 2.982 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.982 2.982 0 0 0 0 4.24a2.982 2.982 0 0 0 4.24 0l3.53-3.53a2.982 2.982 0 0 0 0-4.24a.973.973 0 0 1 0-1.42"/></svg>

After

Width:  |  Height:  |  Size: 663 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M12 17a2 2 0 0 0 2-2a2 2 0 0 0-2-2a2 2 0 0 0-2 2a2 2 0 0 0 2 2m6-9a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V10a2 2 0 0 1 2-2h1V6a5 5 0 0 1 5-5a5 5 0 0 1 5 5v2zm-6-5a3 3 0 0 0-3 3v2h6V6a3 3 0 0 0-3-3"/></svg>

After

Width:  |  Height:  |  Size: 327 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.62L12 2L9.19 8.62L2 9.24l5.45 4.73L5.82 21z"/></svg>

After

Width:  |  Height:  |  Size: 211 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M32 32C32 14.3 46.3 0 64 0H320c17.7 0 32 14.3 32 32s-14.3 32-32 32H290.5l11.4 148.2c36.7 19.9 65.7 53.2 79.5 94.7l1 3c3.3 9.8 1.6 20.5-4.4 28.8s-15.7 13.3-26 13.3H32c-10.3 0-19.9-4.9-26-13.3s-7.7-19.1-4.4-28.8l1-3c13.8-41.5 42.8-74.8 79.5-94.7L93.5 64H64C46.3 64 32 49.7 32 32zM160 384h64v96c0 17.7-14.3 32-32 32s-32-14.3-32-32V384z"/></svg>

After

Width:  |  Height:  |  Size: 564 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 32 32"><path fill="currentColor" d="M9 7c-.621 0-1.227.066-1.813.188a9.238 9.238 0 0 0-.875.218A9.073 9.073 0 0 0 .72 12.5c-.114.27-.227.531-.313.813A8.848 8.848 0 0 0 0 16c0 .93.145 1.813.406 2.656c.004.008-.004.024 0 .032A9.073 9.073 0 0 0 5.5 24.28c.27.114.531.227.813.313A8.83 8.83 0 0 0 9 24.999h14c4.957 0 9-4.043 9-9s-4.043-9-9-9zm0 2c3.879 0 7 3.121 7 7s-3.121 7-7 7s-7-3.121-7-7c0-.242.008-.484.031-.719A6.985 6.985 0 0 1 9 9m5.625 0H23c3.879 0 7 3.121 7 7s-3.121 7-7 7h-8.375C16.675 21.348 18 18.828 18 16c0-2.828-1.324-5.348-3.375-7"/></svg>

After

Width:  |  Height:  |  Size: 630 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 32 32"><path fill="currentColor" d="M9 7c-4.96 0-9 4.035-9 9s4.04 9 9 9h14c4.957 0 9-4.043 9-9s-4.043-9-9-9zm14 2c3.879 0 7 3.121 7 7s-3.121 7-7 7s-7-3.121-7-7s3.121-7 7-7"/></svg>

After

Width:  |  Height:  |  Size: 258 B

View file

@ -0,0 +1,405 @@
/* global phpbb */
(function($) { // Avoid conflicts with other libraries
'use strict';
// This callback will mark all forum icons read
phpbb.addAjaxCallback('mark_forums_read', function(res) {
var readTitle = res.NO_UNREAD_POSTS;
var unreadTitle = res.UNREAD_POSTS;
var iconsArray = {
forum_unread: 'forum_read',
forum_unread_subforum: 'forum_read_subforum',
forum_unread_locked: 'forum_read_locked'
};
$('li.row').find('dl[class*="forum_unread"]').each(function() {
var $this = $(this);
$.each(iconsArray, function(unreadClass, readClass) {
if ($this.hasClass(unreadClass)) {
$this.removeClass(unreadClass).addClass(readClass);
}
});
$this.children('dt[title="' + unreadTitle + '"]').attr('title', readTitle);
});
// Mark subforums read
$('a.subforum[class*="unread"]').removeClass('unread').addClass('read').children('.icon.icon-red').removeClass('icon-red').addClass('icon-blue');
// Mark topics read if we are watching a category and showing active topics
if ($('#active_topics').length) {
phpbb.ajaxCallbacks.mark_topics_read.call(this, res, false);
}
// Update mark forums read links
$('[data-ajax="mark_forums_read"]').attr('href', res.U_MARK_FORUMS);
phpbb.closeDarkenWrapper(3000);
});
/**
* This callback will mark all topic icons read
*
* @param {bool} [update_topic_links=true] Whether "Mark topics read" links
* should be updated. Defaults to true.
*/
phpbb.addAjaxCallback('mark_topics_read', function(res, updateTopicLinks) {
var readTitle = res.NO_UNREAD_POSTS;
var unreadTitle = res.UNREAD_POSTS;
var iconsArray = {
global_unread: 'global_read',
announce_unread: 'announce_read',
sticky_unread: 'sticky_read',
topic_unread: 'topic_read'
};
var iconsState = ['', '_hot', '_hot_mine', '_locked', '_locked_mine', '_mine'];
var unreadClassSelectors;
var classMap = {};
var classNames = [];
if (typeof updateTopicLinks === 'undefined') {
updateTopicLinks = true;
}
$.each(iconsArray, function(unreadClass, readClass) {
$.each(iconsState, function(key, value) {
// Only topics can be hot
if ((value === '_hot' || value === '_hot_mine') && unreadClass !== 'topic_unread') {
return true;
}
classMap[unreadClass + value] = readClass + value;
classNames.push(unreadClass + value);
});
});
unreadClassSelectors = '.' + classNames.join(',.');
$('li.row').find(unreadClassSelectors).each(function() {
var $this = $(this);
$.each(classMap, function(unreadClass, readClass) {
if ($this.hasClass(unreadClass)) {
$this.removeClass(unreadClass).addClass(readClass);
}
});
$this.children('dt[title="' + unreadTitle + '"]').attr('title', readTitle);
});
// Remove link to first unread post
$('a.unread').has('.icon-red').remove();
// Update mark topics read links
if (updateTopicLinks) {
$('[data-ajax="mark_topics_read"]').attr('href', res.U_MARK_TOPICS);
}
phpbb.closeDarkenWrapper(3000);
});
// This callback will mark all notifications read
phpbb.addAjaxCallback('notification.mark_all_read', function(res) {
if (typeof res.success !== 'undefined') {
phpbb.markNotifications($('[data-notification-unread="true"]'), 0);
phpbb.toggleDropdown.call($('#notification-button'));
phpbb.closeDarkenWrapper(3000);
}
});
// This callback will mark a notification read
phpbb.addAjaxCallback('notification.mark_read', function(res) {
if (typeof res.success !== 'undefined') {
var unreadCount = Number($('#notification-button strong').html()) - 1;
phpbb.markNotifications($(this).parent('[data-notification-unread="true"]'), unreadCount);
}
});
/**
* Mark notification popup rows as read.
*
* @param {jQuery} $popup jQuery object(s) to mark read.
* @param {int} unreadCount The new unread notifications count.
*/
phpbb.markNotifications = function($popup, unreadCount) {
// Remove the unread status.
$popup.removeClass('bg2');
$popup.find('a.mark_read').remove();
// Update the notification link to the real URL.
$popup.each(function() {
var link = $(this).find('a');
link.attr('href', link.attr('data-real-url'));
});
// Update the unread count.
$('strong', '#notification-button').html(unreadCount);
// Remove the Mark all read link and hide notification count if there are no unread notifications.
if (!unreadCount) {
$('#mark_all_notifications').remove();
$('#notification-button > strong').addClass('hidden');
}
// Update page title
var $title = $('title');
var originalTitle = $title.text().replace(/(\((\d+)\))/, '');
$title.text((unreadCount ? '(' + unreadCount + ')' : '') + originalTitle);
};
// This callback finds the post from the delete link, and removes it.
phpbb.addAjaxCallback('post_delete', function() {
var $this = $(this),
postId;
if ($this.attr('data-refresh') === undefined) {
postId = $this[0].href.split('&p=')[1];
var post = $this.parents('#p' + postId).css('pointer-events', 'none');
if (post.hasClass('bg1') || post.hasClass('bg2')) {
var posts1 = post.nextAll('.bg1');
post.nextAll('.bg2').removeClass('bg2').addClass('bg1');
posts1.removeClass('bg1').addClass('bg2');
}
post.fadeOut(function() {
$(this).remove();
});
}
});
// This callback removes the approve / disapprove div or link.
phpbb.addAjaxCallback('post_visibility', function(res) {
var remove = (res.visible) ? $(this) : $(this).parents('.post');
$(remove).css('pointer-events', 'none').fadeOut(function() {
$(this).remove();
});
if (res.visible) {
// Remove the "Deleted by" message from the post on restoring.
remove.parents('.post').find('.post_deleted_msg').css('pointer-events', 'none').fadeOut(function() {
$(this).remove();
});
}
});
// This removes the parent row of the link or form that fired the callback.
phpbb.addAjaxCallback('row_delete', function() {
$(this).parents('tr').remove();
});
// This handles friend / foe additions removals.
phpbb.addAjaxCallback('zebra', function(res) {
var zebra;
if (res.success) {
zebra = $('.zebra');
zebra.first().html(res.MESSAGE_TEXT);
zebra.not(':first').html('&nbsp;').prev().html('&nbsp;');
}
});
/**
* This callback updates the poll results after voting.
*/
phpbb.addAjaxCallback('vote_poll', function(res) {
if (typeof res.success !== 'undefined') {
var poll = $(this).closest('.topic_poll');
var panel = poll.find('.panel');
var resultsVisible = poll.find('dl:first-child .resultbar').is(':visible');
var mostVotes = 0;
// Set min-height to prevent the page from jumping when the content changes
var updatePanelHeight = function (height) {
height = (typeof height === 'undefined') ? panel.find('.inner').outerHeight() : height;
panel.css('min-height', height);
};
updatePanelHeight();
// Remove the View results link
if (!resultsVisible) {
poll.find('.poll_view_results').hide(500);
}
if (!res.can_vote) {
poll.find('.polls, .poll_max_votes, .poll_vote, .poll_option_select').fadeOut(500, function () {
poll.find('.resultbar, .poll_option_percent, .poll_total_votes').show();
});
} else {
// If the user can still vote, simply slide down the results
poll.find('.resultbar, .poll_option_percent, .poll_total_votes').show(500);
}
// Get the votes count of the highest poll option
poll.find('[data-poll-option-id]').each(function() {
var option = $(this);
var optionId = option.attr('data-poll-option-id');
mostVotes = (res.vote_counts[optionId] >= mostVotes) ? res.vote_counts[optionId] : mostVotes;
});
// Update the total votes count
poll.find('.poll_total_vote_cnt').html(res.total_votes);
// Update each option
poll.find('[data-poll-option-id]').each(function() {
var $this = $(this);
var optionId = $this.attr('data-poll-option-id');
var voted = (typeof res.user_votes[optionId] !== 'undefined');
var mostVoted = (res.vote_counts[optionId] === mostVotes);
var percent = (!res.total_votes) ? 0 : Math.round((res.vote_counts[optionId] / res.total_votes) * 100);
var percentRel = (mostVotes === 0) ? 0 : Math.round((res.vote_counts[optionId] / mostVotes) * 100);
var altText;
altText = $this.attr('data-alt-text');
if (voted) {
$this.attr('title', $.trim(altText));
} else {
$this.attr('title', '');
};
$this.toggleClass('voted', voted);
$this.toggleClass('most-votes', mostVoted);
// Update the bars
var bar = $this.find('.resultbar div');
var barTimeLapse = (res.can_vote) ? 500 : 1500;
var newBarClass = (percent === 100) ? 'pollbar5' : 'pollbar' + (Math.floor(percent / 20) + 1);
setTimeout(function () {
bar.animate({ width: percentRel + '%' }, 500)
.removeClass('pollbar1 pollbar2 pollbar3 pollbar4 pollbar5')
.addClass(newBarClass)
.html(res.vote_counts[optionId]);
var percentText = percent ? percent + '%' : res.NO_VOTES;
$this.find('.poll_option_percent').html(percentText);
}, barTimeLapse);
});
if (!res.can_vote) {
poll.find('.polls').delay(400).fadeIn(500);
}
// Display "Your vote has been cast." message. Disappears after 5 seconds.
var confirmationDelay = (res.can_vote) ? 300 : 900;
poll.find('.vote-submitted').delay(confirmationDelay).slideDown(200, function() {
if (resultsVisible) {
updatePanelHeight();
}
$(this).delay(5000).fadeOut(500, function() {
resizePanel(300);
});
});
// Remove the gap resulting from removing options
setTimeout(function() {
resizePanel(500);
}, 1500);
var resizePanel = function (time) {
var panelHeight = panel.height();
var innerHeight = panel.find('.inner').outerHeight();
if (panelHeight !== innerHeight) {
panel.css({ minHeight: '', height: panelHeight })
.animate({ height: innerHeight }, time, function () {
panel.css({ minHeight: innerHeight, height: '' });
});
}
};
}
});
/**
* Show poll results when clicking View results link.
*/
$('.poll_view_results a').click(function(e) {
// Do not follow the link
e.preventDefault();
var $poll = $(this).parents('.topic_poll');
$poll.find('.resultbar, .poll_option_percent, .poll_total_votes').show(500);
$poll.find('.poll_view_results').hide(500);
});
$('[data-ajax]').each(function() {
var $this = $(this);
var ajax = $this.attr('data-ajax');
var filter = $this.attr('data-filter');
if (ajax !== 'false') {
var fn = (ajax !== 'true') ? ajax : null;
filter = (filter !== undefined) ? phpbb.getFunctionByName(filter) : null;
phpbb.ajaxify({
selector: this,
refresh: $this.attr('data-refresh') !== undefined,
filter: filter,
callback: fn
});
}
});
/**
* This simply appends #preview to the action of the
* QR action when you click the Full Editor & Preview button
*/
$('#qr_full_editor').click(function() {
$('#qr_postform').attr('action', function(i, val) {
return val + '#preview';
});
});
/**
* Make the display post links to use JS
*/
$('.display_post').click(function(e) {
// Do not follow the link
e.preventDefault();
var postId = $(this).attr('data-post-id');
$('#post_content' + postId).show();
$('#profile' + postId).show();
$('#post_hidden' + postId).hide();
});
/**
* Display hidden post on post review page
*/
$('.display_post_review').on('click', function(e) {
e.preventDefault();
let $displayPostLink = $(this);
$displayPostLink.closest('.post-ignore').removeClass('post-ignore');
$displayPostLink.hide();
});
/**
* Toggle the member search panel in memberlist.php.
*
* If user returns to search page after viewing results the search panel is automatically displayed.
* In any case the link will toggle the display status of the search panel and link text will be
* appropriately changed based on the status of the search panel.
*/
$('#member_search').click(function () {
var $memberlistSearch = $('#memberlist_search');
$memberlistSearch.slideToggle('fast');
phpbb.ajaxCallbacks.alt_text.call(this);
// Focus on the username textbox if it's available and displayed
if ($memberlistSearch.is(':visible')) {
$('#username').focus();
}
return false;
});
/**
* Automatically resize textarea
*/
$(function() {
var $textarea = $('textarea:not(#message-box textarea, .no-auto-resize)');
phpbb.resizeTextArea($textarea, { minHeight: 75, maxHeight: 250 });
phpbb.resizeTextArea($('textarea', '#message-box'));
});
})(jQuery); // Avoid conflicts with other libraries

View file

@ -0,0 +1,75 @@
<!-- EVENT attachment_file_before -->
<!-- BEGIN _file -->
<!-- IF _file.S_DENIED -->
<p>[{_file.DENIED_MESSAGE}]</p>
<!-- ELSE -->
<!-- EVENT attachment_file_prepend -->
<!-- IF _file.S_THUMBNAIL -->
<dl class="thumbnail">
<dt><a href="{_file.U_DOWNLOAD_LINK}"><img src="{_file.THUMB_IMAGE}" class="postimage" alt="{% if _file.COMMENT %}{{ _file.COMMENT|e('html') }}{% else %}{{ _file.DOWNLOAD_NAME }}{% endif %}" title="{_file.DOWNLOAD_NAME} ({_file.FILESIZE} {_file.SIZE_LANG}) {_file.L_DOWNLOAD_COUNT}" /></a></dt>
<!-- IF _file.COMMENT --><dd> {_file.COMMENT}</dd><!-- ENDIF -->
</dl>
<!-- ENDIF -->
<!-- IF _file.S_IMAGE -->
<dl class="file">
<dt class="attach-image"><img src="{_file.U_INLINE_LINK}" class="postimage" alt="{% if _file.COMMENT %}{{ _file.COMMENT|e('html') }}{% else %}{{ _file.DOWNLOAD_NAME }}{% endif %}" onclick="viewableArea(this);" /></dt>
<!-- IF _file.COMMENT --><dd><em>{_file.COMMENT}</em></dd><!-- ENDIF -->
<dd>{_file.DOWNLOAD_NAME} ({_file.FILESIZE} {_file.SIZE_LANG}) {_file.L_DOWNLOAD_COUNT}</dd>
</dl>
<!-- ENDIF -->
<!-- IF _file.S_FILE -->
<dl class="file">
<dt><!-- IF _file.UPLOAD_ICON -->{_file.UPLOAD_ICON} <!-- ENDIF --><a class="postlink" href="{_file.U_DOWNLOAD_LINK}">{_file.DOWNLOAD_NAME}</a></dt>
<!-- IF _file.COMMENT --><dd><em>{_file.COMMENT}</em></dd><!-- ENDIF -->
<dd>({_file.FILESIZE} {_file.SIZE_LANG}) {_file.L_DOWNLOAD_COUNT}</dd>
</dl>
<!-- ENDIF -->
{% if _file.S_AUDIO_FILE %}
<dl class="file">
<dt class="c-file-header">
<audio class="c-file-audio-controls" controls="controls" preload="metadata">
<source class="c-file-audio-source" src="{{ _file.U_DOWNLOAD_LINK }}" type="{{ _file.MIMETYPE }}">
</audio>
</dt>
{% if _file.COMMENT %}
<dd class="c-file-comment">{{ _file.COMMENT }}</dd>
{% endif %}
<dd class="c-file-actions">
{% if _file.UPLOAD_ICON %}
<span class="o-icon c-file-icon">{{ _file.UPLOAD_ICON }}</span>
{% endif %}
<a class="c-file-actions-link postlink" href="{{ _file.U_DOWNLOAD_LINK }}" download>{{ _file.DOWNLOAD_NAME }}</a>
<span class="c-file-actions-meta">({{ _file.FILESIZE }} {{ _file.SIZE_LANG }}) {{ _file.L_DOWNLOAD_COUNT }}</span>
</dd>
</dl>
{% endif %}
{% if _file.S_VIDEO_FILE %}
<dl class="file">
<dt class="c-file-header">
<video class="c-file-video-controls" controls="controls" preload="metadata">
<source class="c-file-video-source" src="{{ _file.U_DOWNLOAD_LINK }}" type="{{ _file.MIMETYPE }}">
</video>
</dt>
{% if _file.COMMENT %}
<dd class="c-file-comment">{{ _file.COMMENT }}</dd>
{% endif %}
<dd class="c-file-actions">
{% if _file.UPLOAD_ICON %}
<span class="o-icon c-file-icon">{{ _file.UPLOAD_ICON }}</span>
{% endif %}
<a class="c-file-actions-link postlink" href="{{ _file.U_DOWNLOAD_LINK }}" download>{{ _file.DOWNLOAD_NAME }}</a>
<span class="c-file-actions-meta">({{ _file.FILESIZE }} {{ _file.SIZE_LANG }}) {{ _file.L_DOWNLOAD_COUNT }}</span>
</dd>
</dl>
{% endif %}
<!-- EVENT attachment_file_append -->
<!-- ENDIF -->
<!-- END _file -->
<!-- EVENT attachment_file_after -->

View file

@ -0,0 +1,93 @@
<!-- BEGIN ulist_open --><ul style="list-style-type: {LIST_TYPE}"><!-- END ulist_open -->
<!-- BEGIN ulist_open_default --><ul><!-- END ulist_open_default -->
<!-- BEGIN ulist_close --></ul><!-- END ulist_close -->
<!-- BEGIN olist_open --><ol style="list-style-type: {LIST_TYPE}"><!-- END olist_open -->
<!-- BEGIN olist_close --></ol><!-- END olist_close -->
<!-- BEGIN listitem --><li><!-- END listitem -->
<!-- BEGIN listitem_close --></li><!-- END listitem_close -->
<!-- BEGIN quote_username_open --><blockquote><div><cite>{USERNAME} {L_WROTE}{L_COLON}</cite><!-- END quote_username_open -->
<!-- BEGIN quote_open --><blockquote class="uncited"><div><!-- END quote_open -->
<!-- BEGIN quote_close --></div></blockquote><!-- END quote_close -->
<!-- BEGIN quote_extended -->
<blockquote>
<xsl:if test="@post_url">
<xsl:attribute name="cite"><xsl:value-of select="@post_url"/></xsl:attribute>
</xsl:if>
<xsl:if test="not(@author)">
<xsl:attribute name="class">uncited</xsl:attribute>
</xsl:if>
<div>
<xsl:if test="@author">
<cite>
<xsl:choose>
<xsl:when test="@url">
<a href="{@url}" class="postlink"><xsl:value-of select="@author"/></a>
</xsl:when>
<xsl:when test="@profile_url">
<a href="{@profile_url}"><xsl:value-of select="@author"/></a>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@author"/>
</xsl:otherwise>
</xsl:choose>
<xsl:text> </xsl:text>
<xsl:value-of select="$L_WROTE"/>
<xsl:value-of select="$L_COLON"/>
<xsl:if test="@post_url">
<xsl:text> </xsl:text>
<a href="{@post_url}" aria-label="{L_VIEW_QUOTED_POST}" data-post-id="{@post_id}" onclick="if(document.getElementById(hash.substr(1)))href=hash"><i class="icon fa-arrow-circle-up fa-fw" aria-hidden="true"></i></a>
</xsl:if>
<xsl:if test="@msg_url">
<xsl:text> </xsl:text>
<a href="{@msg_url}" aria-label="{L_VIEW_QUOTED_POST}" data-msg-id="{@msg_id}"><i class="icon fa-arrow-circle-up fa-fw" aria-hidden="true"></i></a>
</xsl:if>
<xsl:if test="@date">
<span class="responsive-hide"><xsl:value-of select="@date"/></span>
</xsl:if>
</cite>
</xsl:if>
<xsl:apply-templates/>
</div>
</blockquote>
<!-- END quote_extended -->
<!-- BEGIN code_open --><div class="codebox"><p>{L_CODE}{L_COLON} <a href="#" onclick="selectCode(this); return false;">{L_SELECT_ALL_CODE}</a></p><pre><code><!-- END code_open -->
<!-- BEGIN code_close --></code></pre></div><!-- END code_close -->
<!-- BEGIN inline_attachment_open --><div class="inline-attachment"><!-- END inline_attachment_open -->
<!-- BEGIN inline_attachment_close --></div><!-- END inline_attachment_close -->
<!-- BEGIN b_open --><strong class="text-strong"><!-- END b_open -->
<!-- BEGIN b_close --></strong><!-- END b_close -->
<!-- BEGIN u_open --><span style="text-decoration: underline"><!-- END u_open -->
<!-- BEGIN u_close --></span><!-- END u_close -->
<!-- BEGIN i_open --><em class="text-italics"><!-- END i_open -->
<!-- BEGIN i_close --></em><!-- END i_close -->
<!-- BEGIN color --><span style="color: {COLOR}">{TEXT}</span><!-- END color -->
<!-- BEGIN size --><span style="font-size: {SIZE}%; line-height: 116%;">{TEXT}</span><!-- END size -->
<!-- BEGIN img --><img src="{URL}" class="postimage" alt="{L_IMAGE}" /><!-- END img -->
<!-- BEGIN url --><a href="{URL}" class="postlink">{DESCRIPTION}</a><!-- END url -->
<!-- BEGIN email -->
<a>
<xsl:attribute name="href">
<xsl:text>mailto:</xsl:text>
<xsl:value-of select="@email"/>
<xsl:if test="@subject or @body">
<xsl:text>?</xsl:text>
<xsl:if test="@subject">subject=<xsl:value-of select="@subject"/></xsl:if>
<xsl:if test="@body"><xsl:if test="@subject">&amp;</xsl:if>body=<xsl:value-of select="@body"/></xsl:if>
</xsl:if>
</xsl:attribute>
<xsl:apply-templates/>
</a>
<!-- END email -->

View file

@ -0,0 +1,24 @@
<!-- IF S_TYPE == 1 -->
<div class="panel captcha-panel">
<div class="inner">
<h3 class="captcha-title">{L_CONFIRMATION}</h3>
<p>{L_CONFIRM_EXPLAIN}</p>
<fieldset class="fields2">
<!-- ENDIF -->
<dl>
<dt><label for="confirm_code">{L_CONFIRM_CODE}{L_COLON}</label></dt>
<dd class="captcha captcha-image"><img src="{CONFIRM_IMAGE_LINK}" alt="{L_CONFIRM_CODE}" /></dd>
<dd><input type="text" name="confirm_code" id="confirm_code" size="8" maxlength="8" tabindex="{$CAPTCHA_TAB_INDEX}" class="inputbox narrow" title="{L_CONFIRM_CODE}" />
<!-- IF S_CONFIRM_REFRESH --><input type="submit" name="refresh_vc" id="refresh_vc" class="button1 button button-form-bold" value="{L_VC_REFRESH}" /><!-- ENDIF -->
<input type="hidden" name="confirm_id" id="confirm_id" value="{CONFIRM_ID}" /></dd>
<dd>{L_CONFIRM_CODE_EXPLAIN}</dd>
</dl>
<!-- IF S_TYPE == 1 -->
</fieldset>
</div>
</div>
<!-- ENDIF -->

View file

@ -0,0 +1,7 @@
<div class="panel captcha-panel">
<div class="inner">
<h3 class="captcha-title">{{ lang('CONFIRM_CODE') }}</h3>
<p class="error">{{ lang(CONFIRM_LANG, '<a href="' ~ CONTACT_LINK ~ '">', '</a>') }}</p>
</div>
</div>

View file

@ -0,0 +1,21 @@
<!-- IF S_TYPE == 1 -->
<div class="panel captcha-panel">
<div class="inner">
<h3 class="captcha-title">{L_CONFIRMATION}</h3>
<fieldset class="fields2">
<!-- ENDIF -->
<dl>
<dt><label>{QA_CONFIRM_QUESTION}{L_COLON}</label><br /><span>{L_CONFIRM_QUESTION_EXPLAIN}</span></dt>
<dd class="captcha">
<input type="text" tabindex="{$CAPTCHA_TAB_INDEX}" name="qa_answer" id="answer" size="45" class="inputbox autowidth" title="{L_ANSWER}" />
<input type="hidden" name="qa_confirm_id" id="qa_confirm_id" value="{QA_CONFIRM_ID}" />
</dd>
</dl>
<!-- IF S_TYPE == 1 -->
</fieldset>
</div>
</div>
<!-- ENDIF -->

View file

@ -0,0 +1,10 @@
<!-- IF S_RECAPTCHA_AVAILABLE -->
<noscript>
<div>{L_RECAPTCHA_NOSCRIPT}</div>
</noscript>
{% INCLUDEJS RECAPTCHA_SERVER ~ '.js?onload=phpbbRecaptchaOnLoad&hl=' ~ lang('RECAPTCHA_LANG') %}
{# The g-recaptcha class is used in JavaScript #}
<div class="g-recaptcha" data-sitekey="{RECAPTCHA_PUBKEY}" data-callback="phpbbRecaptchaOnSubmit" data-size="invisible" data-tabindex="<!-- IF $CAPTCHA_TAB_INDEX -->{$CAPTCHA_TAB_INDEX}<!-- ELSE -->10<!-- ENDIF -->"></div>
<!-- ELSE -->
{L_RECAPTCHA_NOT_AVAILABLE}
<!-- ENDIF -->

View file

@ -0,0 +1,13 @@
{% if S_RECAPTCHA_AVAILABLE %}
<noscript>
<div>{{ lang('RECAPTCHA_NOSCRIPT') }}</div>
</noscript>
<script src="{{ U_RECAPTCHA_SCRIPT }}" async defer></script>
{# The g-recaptcha class is used in JavaScript #}
<input class="g-recaptcha" type="hidden" name="recaptcha_action" value="{{ RECAPTCHA_ACTION }}" data-recaptcha-v3="{{ RECAPTCHA_KEY }}">
<input type="hidden" name="recaptcha_token" value="">
{% else %}
{{ lang('RECAPTCHA_NOT_AVAILABLE') }}
{% endif %}

View file

@ -0,0 +1,23 @@
{% if CONFIRM_TYPE_REGISTRATION %}
<div class="panel captcha-panel">
<div class="inner">
<h3 class="captcha-title">{{ lang('CONFIRMATION') }}</h3>
<fieldset class="fields2">
{% endif %}
{% if S_TURNSTILE_AVAILABLE %}
<noscript>
<div>{{ lang('CAPTCHA_TURNSTILE_NOSCRIPT') }}</div>
</noscript>
<script src="{{ U_TURNSTILE_SCRIPT }}" async defer></script>
{# The cf-turnstile class is used in JavaScript #}
<div class="cf-turnstile" data-language="{{ lang('TURNSTILE_LANG') }}" data-sitekey="{{ TURNSTILE_SITEKEY }}"{% if TURNSTILE_THEME %} data-theme="{{ TURNSTILE_THEME }}"{% endif %}></div>
{% else %}
{{ lang('CAPTCHA_TURNSTILE_NOT_AVAILABLE') }}
{% endif %}
{% if CONFIRM_TYPE_REGISTRATION %}
</fieldset>
</div>
</div>
{% endif %}

View file

@ -0,0 +1,35 @@
<!-- IF S_AJAX_REQUEST -->
<form action="{S_CONFIRM_ACTION}" method="post">
<h3>{MESSAGE_TITLE}</h3>
<p>{MESSAGE_TEXT}</p>
<fieldset class="submit-buttons">
<input type="button" name="confirm" value="{L_YES}" class="button1 button button-form-bold" />&nbsp;
<input type="button" name="cancel" value="{L_NO}" class="button1 button button-form-bold" />
</fieldset>
</form>
<!-- ELSE -->
<!-- INCLUDE overall_header.html -->
<form id="confirm" action="{S_CONFIRM_ACTION}" method="post">
<div class="panel">
<div class="inner">
<h2 class="message-title">{MESSAGE_TITLE}</h2>
<p>{MESSAGE_TEXT}</p>
<fieldset class="submit-buttons">
{S_HIDDEN_FIELDS}
<input type="submit" name="confirm" value="{L_YES}" class="button1 button button-form-bold" />&nbsp;
<input type="submit" name="cancel" value="{L_NO}" class="button1 button button-form-bold" />
</fieldset>
</div>
</div>
</form>
<!-- INCLUDE overall_footer.html -->
<!-- ENDIF -->

View file

@ -0,0 +1,72 @@
<!-- IF S_AJAX_REQUEST -->
<form action="{S_CONFIRM_ACTION}" method="post">
<p>{MESSAGE_TEXT}</p>
<!-- IF not S_SHADOW_TOPICS -->
<!-- IF not S_SOFTDELETED and S_ALLOWED_DELETE and S_ALLOWED_SOFTDELETE -->
<label>
<strong>{L_DELETE_PERMANENTLY}{L_COLON}</strong>
<input id="delete_permanent" name="delete_permanent" type="checkbox" value="1" {S_CHECKED_PERMANENT} />
<!-- IF S_TOPIC_MODE -->{DELETE_TOPIC_PERMANENTLY_EXPLAIN}<!-- ELSE -->{DELETE_POST_PERMANENTLY_EXPLAIN}<!-- ENDIF -->
</label>
<!-- ENDIF -->
<label for="delete_reason">
<strong>{L_DELETE_REASON}{L_COLON}</strong><br /><span>{L_DELETE_REASON_EXPLAIN}</span><br />
<input type="text" name="delete_reason" value="" class="inputbox autowidth" maxlength="120" size="45" />
</label>
<!-- ENDIF -->
<fieldset class="submit-buttons">
<input type="button" name="confirm" value="{L_YES}" class="button1 button button-form" />&nbsp;
<input type="button" name="cancel" value="{L_NO}" class="button1 button button-form-bold" />
</fieldset>
</form>
<!-- ELSE -->
<!-- INCLUDE overall_header.html -->
<form id="confirm" action="{S_CONFIRM_ACTION}" method="post">
<div class="panel">
<div class="inner">
<h2 class="message-title">{MESSAGE_TITLE}</h2>
<p>{MESSAGE_TEXT}</p>
<!-- IF not S_SHADOW_TOPICS -->
<fieldset class="fields1">
<!-- IF not S_SOFTDELETED and S_ALLOWED_DELETE and S_ALLOWED_SOFTDELETE -->
<dl>
<dt><label for="delete_permanent">{L_DELETE_PERMANENTLY}{L_COLON}</label></dt>
<dd>
<label for="delete_permanent">
<input id="delete_permanent" name="delete_permanent" type="checkbox" value="1" {S_CHECKED_PERMANENT} />
<!-- IF S_TOPIC_MODE -->{DELETE_TOPIC_PERMANENTLY_EXPLAIN}<!-- ELSE -->{DELETE_POST_PERMANENTLY_EXPLAIN}<!-- ENDIF -->
</label>
</dd>
</dl>
<!-- ENDIF -->
{% EVENT confirm_delete_body_delete_reason_before %}
<dl>
<dt><label for="delete_reason">{L_DELETE_REASON}{L_COLON}</label><br /><span>{L_DELETE_REASON_EXPLAIN}</span></dt>
<dd><input type="text" name="delete_reason" id="delete_reason" value="" class="inputbox autowidth" maxlength="120" size="45" /></dd>
</dl>
</fieldset>
<!-- ENDIF -->
<fieldset class="submit-buttons">
{S_HIDDEN_FIELDS}
<input type="submit" name="confirm" value="{L_YES}" class="button1 button button-form" />&nbsp;
<input type="submit" name="cancel" value="{L_NO}" class="button1 button button-form-bold" />
</fieldset>
</div>
</div>
</form>
<!-- INCLUDE overall_footer.html -->
<!-- ENDIF -->

View file

@ -0,0 +1,29 @@
<div class="dropdown-container dropdown-container-left dropdown-button-control sort-tools">
<span title="{L_SORT_OPTIONS}" class="button button-secondary dropdown-trigger dropdown-select">
{{ Icon('font', 'arrow-down-short-wide', '', true, 'fas c-button-icon') }}
<span class="caret">
{{ Icon('font', 'caret-down', '', true, 'fas c-button-icon') }}
</span>
</span>
<div class="dropdown hidden">
<div class="pointer"><div class="pointer-inner"></div></div>
<div class="dropdown-contents">
<fieldset class="display-options">
<!-- IF S_SORT_OPTIONS -->
<label>{L_SORT_BY}{L_COLON} <select name="sk" id="sk">{S_SORT_OPTIONS}</select></label>
<label>{L_SORT_DIRECTION}{L_COLON} <select name="sd" id="sd">{S_ORDER_SELECT}</select></label>
<hr class="dashed" />
<input type="submit" class="button1 button button-form-bold" name="sort" value="{L_SORT}" />
<!-- ELSE -->
<label>{L_DISPLAY}{L_COLON} {S_SELECT_SORT_DAYS}</label>
<!-- IF S_SELECT_SORT_KEY -->
<label>{L_SORT_BY}{L_COLON} {S_SELECT_SORT_KEY}</label>
<label>{L_SORT_DIRECTION}{L_COLON} {S_SELECT_SORT_DIR}</label>
<!-- ENDIF -->
<hr class="dashed" />
<input type="submit" class="button1 button button-form-bold" name="sort" value="{L_GO}" />
<!-- ENDIF -->
</fieldset>
</div>
</div>
</div>

View file

@ -0,0 +1,49 @@
<!-- IF .draftrow -->
<div class="panel">
<div class="inner">
<h3 class="draft-title">{L_LOAD_DRAFT}</h3>
<p>{L_LOAD_DRAFT_EXPLAIN}</p>
</div>
</div>
<div class="<!-- IF not S_PRIVMSGS -->forumbg<!-- ELSE -->panel<!-- ENDIF -->">
<div class="inner">
<ul class="topiclist two-long-columns">
<li class="header">
<dl>
<dt>{L_LOAD_DRAFT}</dt>
<dd class="info">{L_SAVE_DATE}</dd>
</dl>
</li>
</ul>
<ul class="topiclist two-long-columns<!-- IF not S_PRIVMSGS --> topics<!-- ELSE --> cplist<!-- ENDIF -->">
<!-- BEGIN draftrow -->
<li class="row<!-- IF draftrow.S_ROW_COUNT is even --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
<dl>
<dt>
<div class="list-inner">
<a href="{draftrow.U_INSERT}" title="{L_LOAD_DRAFT}" class="topictitle">{draftrow.DRAFT_SUBJECT}</a><br />
<!-- IF not S_PRIVMSGS --><!-- IF draftrow.S_LINK_TOPIC -->{L_TOPIC}{L_COLON} <a href="{draftrow.U_VIEW}">{draftrow.TITLE}</a>
<!-- ELSEIF draftrow.S_LINK_FORUM -->{L_FORUM}{L_COLON} <a href="{draftrow.U_VIEW}">{draftrow.TITLE}</a>
<!-- ELSE -->{L_NO_TOPIC_FORUM}<!-- ENDIF --><!-- ENDIF -->
<div class="responsive-show" style="display: none;">
{L_SAVE_DATE}{L_COLON} <strong>{draftrow.DATE}</strong>
</div>
</div>
</dt>
<dd class="info"><span>{draftrow.DATE}</span></dd>
</dl>
</li>
<!-- END draftrow -->
</ul>
</div>
</div>
<!-- ENDIF -->

View file

@ -0,0 +1,50 @@
<!-- INCLUDE overall_header.html -->
<h2 class="faq-title">{L_FAQ_TITLE}</h2>
<div class="panel bg1" id="faqlinks">
<div class="inner">
<div class="column1">
<!-- BEGIN faq_block -->
<!-- IF faq_block.SWITCH_COLUMN or (SWITCH_COLUMN_MANUALLY and faq_block.S_ROW_COUNT == 4) -->
</div>
<div class="column2">
<!-- ENDIF -->
<dl class="faq">
<dt><strong>{faq_block.BLOCK_TITLE}</strong></dt>
<!-- BEGIN faq_row -->
<dd><a href="#f{faq_block.S_ROW_COUNT}r{faq_block.faq_row.S_ROW_COUNT}">{faq_block.faq_row.FAQ_QUESTION}</a></dd>
<!-- END faq_row -->
</dl>
<!-- END faq_block -->
</div>
</div>
</div>
<!-- BEGIN faq_block -->
<div class="panel <!-- IF faq_block.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
<div class="inner">
<div class="content">
<h2 class="faq-title">{faq_block.BLOCK_TITLE}</h2>
<!-- BEGIN faq_row -->
<dl class="faq">
<dt id="f{faq_block.S_ROW_COUNT}r{faq_block.faq_row.S_ROW_COUNT}"><strong>{faq_block.faq_row.FAQ_QUESTION}</strong></dt>
<dd>{faq_block.faq_row.FAQ_ANSWER}</dd>
</dl>
<a href="#faqlinks" class="top">
{{ Icon('font', 'circle-chevron-up', lang('BACK_TO_TOP'), false) }}
</a>
<!-- IF not faq_block.faq_row.S_LAST_ROW --><hr class="dashed" /><!-- ENDIF -->
<!-- END faq_row -->
</div>
</div>
</div>
<!-- END faq_block -->
<!-- INCLUDE jumpbox.html -->
<!-- INCLUDE overall_footer.html -->

View file

@ -0,0 +1,752 @@
/* global phpbb */
/**
* phpBB3 forum functions
*/
/**
* Find a member
*/
function find_username(url) {
'use strict';
popup(url, 760, 570, '_usersearch');
return false;
}
/**
* Window popup
*/
function popup(url, width, height, name) {
'use strict';
if (!name) {
name = '_popup';
}
window.open(url.replace(/&amp;/g, '&'), name, 'height=' + height + ',resizable=yes,scrollbars=yes, width=' + width);
return false;
}
/**
* Jump to page
*/
function pageJump(item) {
'use strict';
var page = parseInt(item.val(), 10),
perPage = item.attr('data-per-page'),
baseUrl = item.attr('data-base-url'),
startName = item.attr('data-start-name');
if (page !== null && !isNaN(page) && page === Math.floor(page) && page > 0) {
if (baseUrl.indexOf('?') === -1) {
document.location.href = baseUrl + '?' + startName + '=' + ((page - 1) * perPage);
} else {
document.location.href = baseUrl.replace(/&amp;/g, '&') + '&' + startName + '=' + ((page - 1) * perPage);
}
}
}
/**
* Mark/unmark checklist
* id = ID of parent container, name = name prefix, state = state [true/false]
*/
function marklist(id, name, state) {
'use strict';
jQuery('#' + id + ' input[type=checkbox][name]').each(function() {
var $this = jQuery(this);
if ($this.attr('name').substr(0, name.length) === name && !$this.prop('disabled')) {
$this.prop('checked', state);
}
});
}
/**
* Resize viewable area for attached image or topic review panel (possibly others to come)
* e = element
*/
function viewableArea(e, itself) {
'use strict';
if (!e) {
return;
}
if (!itself) {
e = e.parentNode;
}
if (!e.vaHeight) {
// Store viewable area height before changing style to auto
e.vaHeight = e.offsetHeight;
e.vaMaxHeight = e.style.maxHeight;
e.style.height = 'auto';
e.style.maxHeight = 'none';
e.style.overflow = 'visible';
} else {
// Restore viewable area height to the default
e.style.height = e.vaHeight + 'px';
e.style.overflow = 'auto';
e.style.maxHeight = e.vaMaxHeight;
e.vaHeight = false;
}
}
/**
* Alternate display of subPanels
*/
jQuery(function($) {
'use strict';
$('.sub-panels').each(function() {
var $childNodes = $('a[data-subpanel]', this),
panels = $childNodes.map(function () {
return this.getAttribute('data-subpanel');
}),
showPanel = this.getAttribute('data-show-panel');
if (panels.length) {
activateSubPanel(showPanel, panels);
$childNodes.click(function () {
activateSubPanel(this.getAttribute('data-subpanel'), panels);
return false;
});
}
});
});
/**
* Activate specific subPanel
*/
function activateSubPanel(p, panels) {
'use strict';
var i, showPanel;
if (typeof p === 'string') {
showPanel = p;
}
$('input[name="show_panel"]').val(showPanel);
if (typeof panels === 'undefined') {
panels = jQuery('.sub-panels a[data-subpanel]').map(function() {
return this.getAttribute('data-subpanel');
});
}
for (i = 0; i < panels.length; i++) {
jQuery('#' + panels[i]).css('display', panels[i] === showPanel ? 'block' : 'none');
jQuery('#' + panels[i] + '-tab').toggleClass('activetab', panels[i] === showPanel);
}
}
function selectCode(a) {
'use strict';
// Get ID of code block
var e = a.parentNode.parentNode.getElementsByTagName('CODE')[0];
var s, r;
// Not IE and IE9+
if (window.getSelection) {
s = window.getSelection();
// Safari and Chrome
if (s.setBaseAndExtent) {
var l = (e.innerText.length > 1) ? e.innerText.length - 1 : 1;
try {
s.setBaseAndExtent(e, 0, e, l);
} catch (error) {
r = document.createRange();
r.selectNodeContents(e);
s.removeAllRanges();
s.addRange(r);
}
}
// Firefox and Opera
else {
// workaround for bug # 42885
if (window.opera && e.innerHTML.substring(e.innerHTML.length - 4) === '<BR>') {
e.innerHTML = e.innerHTML + '&nbsp;';
}
r = document.createRange();
r.selectNodeContents(e);
s.removeAllRanges();
s.addRange(r);
}
}
// Some older browsers
else if (document.getSelection) {
s = document.getSelection();
r = document.createRange();
r.selectNodeContents(e);
s.removeAllRanges();
s.addRange(r);
}
// IE
else if (document.selection) {
r = document.body.createTextRange();
r.moveToElementText(e);
r.select();
}
}
var inAutocomplete = false;
var lastKeyEntered = '';
/**
* Check event key
*/
function phpbbCheckKey(event) {
'use strict';
// Keycode is array down or up?
if (event.keyCode && (event.keyCode === 40 || event.keyCode === 38)) {
inAutocomplete = true;
}
// Make sure we are not within an "autocompletion" field
if (inAutocomplete) {
// If return pressed and key changed we reset the autocompletion
if (!lastKeyEntered || lastKeyEntered === event.which) {
inAutocomplete = false;
return true;
}
}
// Keycode is not return, then return. ;)
if (event.which !== 13) {
lastKeyEntered = event.which;
return true;
}
return false;
}
/**
* Apply onkeypress event for forcing default submit button on ENTER key press
*/
jQuery(function($) {
'use strict';
$('form input[type=text], form input[type=password]').on('keypress', function (e) {
var defaultButton = $(this).parents('form').find('input[type=submit].default-submit-action');
if (!defaultButton || defaultButton.length <= 0) {
return true;
}
if (phpbbCheckKey(e)) {
return true;
}
if ((e.which && e.which === 13) || (e.keyCode && e.keyCode === 13)) {
defaultButton.click();
return false;
}
return true;
});
});
/**
* Functions for user search popup
*/
function insertUser(formId, value) {
'use strict';
var $form = jQuery(formId),
formName = $form.attr('data-form-name'),
fieldName = $form.attr('data-field-name'),
item = opener.document.forms[formName][fieldName];
if (item.value.length && item.type === 'textarea') {
value = item.value + '\n' + value;
}
item.value = value;
}
function insert_marked_users(formId, users) {
'use strict';
$(users).filter(':checked').each(function() {
insertUser(formId, this.value);
});
window.close();
}
function insert_single_user(formId, user) {
'use strict';
insertUser(formId, user);
window.close();
}
/**
* Parse document block
*/
function parseDocument($container) {
'use strict';
var test = document.createElement('div'),
oldBrowser = (typeof test.style.borderRadius === 'undefined'),
$body = $('body');
/**
* Reset avatar dimensions when changing URL or EMAIL
*/
$container.find('input[data-reset-on-edit]').on('keyup', function() {
$(this.getAttribute('data-reset-on-edit')).val('');
});
/**
* Pagination
*/
$container.find('.pagination .page-jump-form :button').click(function() {
var $input = $(this).siblings('input.inputbox');
pageJump($input);
});
$container.find('.pagination .page-jump-form input.inputbox').on('keypress', function(event) {
if (event.which === 13 || event.keyCode === 13) {
event.preventDefault();
pageJump($(this));
}
});
$container.find('.pagination .dropdown-trigger').click(function() {
var $dropdownContainer = $(this).parent();
// Wait a little bit to make sure the dropdown has activated
setTimeout(function() {
if ($dropdownContainer.hasClass('dropdown-visible')) {
$dropdownContainer.find('input.inputbox').focus();
}
}, 100);
});
/**
* Resize navigation (breadcrumbs) block to keep all links on same line
*/
$container.find('.navlinks').each(function() {
var $this = $(this),
$left = $this.children().not('.rightside'),
$right = $this.children('.rightside');
if ($left.length !== 1 || !$right.length) {
return;
}
function resize() {
var width = 0,
diff = $left.outerWidth(true) - $left.width(),
minWidth = Math.max($this.width() / 3, 240),
maxWidth;
$right.each(function() {
var $this = $(this);
if ($this.is(':visible')) {
width += $this.outerWidth(true);
}
});
maxWidth = $this.width() - width - diff;
$left.css('max-width', Math.floor(Math.max(maxWidth, minWidth)) + 'px');
}
resize();
$(window).resize(resize);
});
/**
* Makes breadcrumbs responsive
*/
$container.find('.breadcrumbs:not([data-skip-responsive])').each(function() {
var $this = $(this),
$links = $this.find('.crumb'),
length = $links.length,
classes = ['wrapped-max', 'wrapped-wide', 'wrapped-medium', 'wrapped-small', 'wrapped-tiny'],
classesLength = classes.length,
maxHeight = 0,
lastWidth = false,
wrapped = false;
// Set tooltips
$this.find('a').each(function() {
var $link = $(this);
$link.attr('title', $link.text());
});
// Function that checks breadcrumbs
function check() {
var height = $this.height(),
width;
// Test max-width set in code for .navlinks above
width = parseInt($this.css('max-width'), 10);
if (!width) {
width = $body.width();
}
maxHeight = parseInt($this.css('line-height'), 10);
$links.each(function() {
if ($(this).height() > 0) {
maxHeight = Math.max(maxHeight, $(this).outerHeight(true));
}
});
if (height <= maxHeight) {
if (!wrapped || lastWidth === false || lastWidth >= width) {
return;
}
}
lastWidth = width;
if (wrapped) {
$this.removeClass('wrapped').find('.crumb.wrapped').removeClass('wrapped ' + classes.join(' '));
if ($this.height() <= maxHeight) {
return;
}
}
wrapped = true;
$this.addClass('wrapped');
if ($this.height() <= maxHeight) {
return;
}
for (var i = 0; i < classesLength; i++) {
for (var j = length - 1; j >= 0; j--) {
$links.eq(j).addClass('wrapped ' + classes[i]);
if ($this.height() <= maxHeight) {
return;
}
}
}
}
// Run function and set event
check();
$(window).resize(check);
});
/**
* Do not run functions below for old browsers
*/
if (oldBrowser) {
return;
}
/**
* Adjust topiclist lists with check boxes
*/
$container.find('ul.topiclist dd.mark').siblings('dt').children('.list-inner').addClass('with-mark');
/**
* Appends contents of all extra columns to first column in
* .topiclist lists for mobile devices. Copies contents as is.
*
* To add that functionality to .topiclist list simply add
* responsive-show-all to list of classes
*/
$container.find('.topiclist.responsive-show-all > li > dl').each(function() {
var $this = $(this),
$block = $this.find('dt .responsive-show:last-child'),
first = true;
// Create block that is visible only on mobile devices
if (!$block.length) {
$this.find('dt > .list-inner').append('<div class="responsive-show" style="display:none;" />');
$block = $this.find('dt .responsive-show:last-child');
} else {
first = ($.trim($block.text()).length === 0);
}
// Copy contents of each column
$this.find('dd').not('.mark').each(function() {
var column = $(this),
$children = column.children(),
html = column.html();
if ($children.length === 1 && $children.text() === column.text()) {
html = $children.html();
}
$block.append((first ? '' : '<br />') + html);
first = false;
});
});
/**
* Same as above, but prepends text from header to each
* column before contents of that column.
*
* To add that functionality to .topiclist list simply add
* responsive-show-columns to list of classes
*/
$container.find('.topiclist.responsive-show-columns').each(function() {
var $list = $(this),
headers = [],
headersLength = 0;
// Find all headers, get contents
$list.prev('.topiclist').find('li.header dd').not('.mark').each(function() {
headers.push($(this).text());
headersLength++;
});
if (!headersLength) {
return;
}
// Parse each row
$list.find('dl').each(function() {
var $this = $(this),
$block = $this.find('dt .responsive-show:last-child'),
first = true;
// Create block that is visible only on mobile devices
if (!$block.length) {
$this.find('dt > .list-inner').append('<div class="responsive-show" style="display:none;" />');
$block = $this.find('dt .responsive-show:last-child');
} else {
first = ($.trim($block.text()).length === 0);
}
// Copy contents of each column
$this.find('dd').not('.mark').each(function(i) {
var column = $(this),
children = column.children(),
html = column.html();
if (children.length === 1 && children.text() === column.text()) {
html = children.html();
}
// Prepend contents of matching header before contents of column
if (i < headersLength) {
html = headers[i] + ': <strong>' + html + '</strong>';
}
$block.append((first ? '' : '<br />') + html);
first = false;
});
});
});
/**
* Responsive tables
*/
$container.find('table.table1').not('.not-responsive').each(function() {
var $this = $(this),
$th = $this.find('thead > tr > th'),
headers = [],
totalHeaders = 0,
i, headersLength;
// Find each header
$th.each(function(column) {
var cell = $(this),
colspan = parseInt(cell.attr('colspan'), 10),
dfn = cell.attr('data-dfn'),
text = dfn ? dfn : cell.text();
colspan = isNaN(colspan) || colspan < 1 ? 1 : colspan;
for (i = 0; i < colspan; i++) {
headers.push(text);
}
totalHeaders++;
if (dfn && !column) {
$this.addClass('show-header');
}
});
headersLength = headers.length;
// Add header text to each cell as <dfn>
$this.addClass('responsive');
if (totalHeaders < 2) {
$this.addClass('show-header');
return;
}
$this.find('tbody > tr').each(function() {
var row = $(this),
cells = row.children('td'),
column = 0;
if (cells.length === 1) {
row.addClass('big-column');
return;
}
cells.each(function() {
var cell = $(this),
colspan = parseInt(cell.attr('colspan'), 10),
text = $.trim(cell.text());
if (headersLength <= column) {
return;
}
if ((text.length && text !== '-') || cell.children().length) {
cell.prepend('<dfn style="display: none;">' + headers[column] + '</dfn>');
} else {
cell.addClass('empty');
}
colspan = isNaN(colspan) || colspan < 1 ? 1 : colspan;
column += colspan;
});
});
});
/**
* Hide empty responsive tables
*/
$container.find('table.responsive > tbody').not('.responsive-skip-empty').each(function() {
var $items = $(this).children('tr');
if (!$items.length) {
$(this).parent('table:first').addClass('responsive-hide');
}
});
/**
* Responsive tabs
*/
$container.find('#tabs, #minitabs').not('[data-skip-responsive]').each(function() {
var $this = $(this),
$ul = $this.children(),
$tabs = $ul.children().not('[data-skip-responsive]'),
$links = $tabs.children('a'),
$item = $ul.append('<li class="tab responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link">&nbsp;</a><div class="dropdown tab-dropdown" style="display: none;"><div class="pointer"><div class="pointer-inner"></div></div><ul class="dropdown-contents" /></div></li>').find('li.responsive-tab'),
$menu = $item.find('.dropdown-contents'),
maxHeight = 0,
lastWidth = false,
responsive = false;
$links.each(function() {
var $this = $(this);
maxHeight = Math.max(maxHeight, Math.max($this.outerHeight(true), $this.parent().outerHeight(true)));
});
function check() {
var width = $body.width(),
height = $this.height();
if (!arguments.length && (!responsive || width <= lastWidth) && height <= maxHeight) {
return;
}
$tabs.show();
$item.hide();
lastWidth = width;
height = $this.height();
if (height <= maxHeight) {
if ($item.hasClass('dropdown-visible')) {
phpbb.toggleDropdown.call($item.find('a.responsive-tab-link').get(0));
}
return;
}
responsive = true;
$item.show();
$menu.html('');
var $availableTabs = $tabs.filter(':not(.activetab, .responsive-tab)'),
total = $availableTabs.length,
i, $tab;
for (i = total - 1; i >= 0; i--) {
$tab = $availableTabs.eq(i);
$menu.prepend($tab.clone(true).removeClass('tab'));
$tab.hide();
if ($this.height() <= maxHeight) {
$menu.find('a').click(function() {
check(true);
});
return;
}
}
$menu.find('a').click(function() {
check(true);
});
}
var $tabLink = $item.find('a.responsive-tab-link');
phpbb.registerDropdown($tabLink, $item.find('.dropdown'), {
visibleClass: 'activetab'
});
check(true);
$(window).resize(check);
});
/**
* Hide UCP/MCP navigation if there is only 1 item
*/
$container.find('#navigation').each(function() {
var $items = $(this).children('ol, ul').children('li');
if ($items.length === 1) {
$(this).addClass('responsive-hide');
}
});
/**
* Replace responsive text
*/
$container.find('[data-responsive-text]').each(function() {
var $this = $(this),
fullText = $this.text(),
responsiveText = $this.attr('data-responsive-text'),
responsive = false;
function check() {
if ($(window).width() > 700) {
if (!responsive) {
return;
}
$this.text(fullText);
responsive = false;
return;
}
if (responsive) {
return;
}
$this.text(responsiveText);
responsive = true;
}
check();
$(window).resize(check);
});
}
/**
* Run onload functions
*/
jQuery(function($) {
'use strict';
// Swap .nojs and .hasjs
$('#phpbb.nojs').toggleClass('nojs hasjs');
$('#phpbb').toggleClass('hastouch', phpbb.isTouch);
$('#phpbb.hastouch').removeClass('notouch');
// Focus forms
$('form[data-focus]:first').each(function() {
$('#' + this.getAttribute('data-focus')).focus();
});
parseDocument($('body'));
});

View file

@ -0,0 +1,153 @@
<!-- BEGIN forumrow -->
<!-- IF (forumrow.S_IS_CAT and not forumrow.S_FIRST_ROW) or forumrow.S_NO_CAT -->
</ul>
</div>
</div>
<!-- ENDIF -->
<!-- EVENT forumlist_body_category_header_before -->
<!-- IF forumrow.S_IS_CAT or forumrow.S_FIRST_ROW or forumrow.S_NO_CAT -->
<div class="forabg">
<div class="inner">
<ul class="topiclist">
<li class="header">
<!-- EVENT forumlist_body_category_header_row_prepend -->
<dl class="row-item">
<dt><div class="list-inner"><!-- IF forumrow.S_IS_CAT --><a href="{forumrow.U_VIEWFORUM}">{forumrow.FORUM_NAME}</a><!-- ELSE -->{L_FORUM}<!-- ENDIF --></div></dt>
<dd class="topics">{L_TOPICS}</dd>
<dd class="posts">{L_POSTS}</dd>
<dd class="lastpost"><span>{L_LAST_POST}</span></dd>
</dl>
<!-- EVENT forumlist_body_category_header_row_append -->
</li>
</ul>
<ul class="topiclist forums">
<!-- ENDIF -->
<!-- EVENT forumlist_body_category_header_after -->
<!-- IF not forumrow.S_IS_CAT -->
<!-- EVENT forumlist_body_forum_row_before -->
<li class="row">
<!-- EVENT forumlist_body_forum_row_prepend -->
<dl class="row-item">
<dt title="{% if forumrow.S_IS_LINK %}{{ lang('FORUM_LINK') }}{% else %}{{ forumrow.FORUM_FOLDER_IMG_ALT }}{% endif %}">
<a class="row-item-link{% if forumrow.S_UNREAD_FORUM %} unread{% else %} read{% endif %}" href="{forumrow.U_VIEWFORUM}">
{{ Icon('svg', {
'link-variant' : forumrow.S_IS_LINK,
'lock' : forumrow.S_LOCKED_FORUM,
'file-document-box-multiple-outline' : forumrow.S_SUBFORUMS,
'file-document-box-outline' : true,
}, '', true, 'c-forum-row-icon') }}
</a>
<div class="list-inner">
<!-- IF S_ENABLE_FEEDS and forumrow.S_FEED_ENABLED -->
<!--
<a class="feed-icon-forum" title="{L_FEED} - {forumrow.FORUM_NAME}" href="{U_FEED}?f={forumrow.FORUM_ID}">
{{ Icon('font', 'square-rss', '', true, 'fas c-feed-icon') }}<span class="sr-only">{L_FEED} - {forumrow.FORUM_NAME}</span>
</a>
-->
<!-- ENDIF -->
<!-- IF forumrow.FORUM_IMAGE -->
<!-- EVENT forumlist_body_forum_image_before -->
<span class="forum-image"><!-- EVENT forumlist_body_forum_image_prepend -->{forumrow.FORUM_IMAGE}<!-- EVENT forumlist_body_forum_image_append --></span>
<!-- EVENT forumlist_body_forum_image_after -->
<!-- ENDIF -->
<a href="{forumrow.U_VIEWFORUM}" class="forumtitle">{forumrow.FORUM_NAME}</a>
<!-- IF forumrow.FORUM_DESC --><span class="forum-desc">{forumrow.FORUM_DESC}</span><!-- ENDIF -->
<!-- IF forumrow.MODERATORS -->
<span class="forum-mods"><strong>{forumrow.L_MODERATOR_STR}{L_COLON}</strong> {forumrow.MODERATORS}</span>
<!-- ENDIF -->
<!-- IF .forumrow.subforum and forumrow.S_LIST_SUBFORUMS -->
<!-- EVENT forumlist_body_subforums_before -->
<span class="forum-subs">
<strong>{forumrow.L_SUBFORUM_STR}{L_COLON}</strong>
<!-- BEGIN subforum -->
<!-- EVENT forumlist_body_subforum_link_prepend -->
<a href="{forumrow.subforum.U_SUBFORUM}" class="subforum<!-- IF forumrow.subforum.S_UNREAD --> unread<!-- ELSE --> read<!-- ENDIF -->" title="{% if forumrow.subforum.IS_LINK %}{{ lang('FORUM_LINK') }}{% elseif forumrow.subforum.S_UNREAD %}{{ lang('UNREAD_POSTS') }}{% else %}{{ lang('NO_UNREAD_POSTS') }}{% endif %}">
{% if forumrow.subforum.IS_LINK %}
{{ Icon('font', 'arrow-up-right-from-square', forumrow.subforum.SUBFORUM_NAME, false, 'fas c-subforum-icon') }}
{% else %}
{{ Icon('font', 'file', forumrow.subforum.SUBFORUM_NAME, false, 'far c-subforum-icon') }}
{% endif %}
</a>{% if not forumrow.subforum.S_LAST_ROW %}{L_COMMA_SEPARATOR}{% endif %}
<!-- EVENT forumlist_body_subforum_link_append -->
<!-- END subforum -->
</span>
<!-- EVENT forumlist_body_subforums_after -->
<!-- ENDIF -->
<!-- IF not S_IS_BOT -->
<div class="responsive-show" style="display: none;">
<!-- IF forumrow.CLICKS -->
{L_REDIRECTS}{L_COLON} <strong>{forumrow.CLICKS}</strong>
<!-- ELSEIF not forumrow.S_IS_LINK and forumrow.TOPICS -->
{L_TOPICS}{L_COLON} <strong>{forumrow.TOPICS}</strong>
<!-- ENDIF -->
</div>
<!-- ENDIF -->
</div>
</dt>
<!-- IF forumrow.CLICKS -->
<dd class="redirect"><span>{L_REDIRECTS}{L_COLON} {forumrow.CLICKS}</span></dd>
<!-- ELSEIF not forumrow.S_IS_LINK -->
<dd class="topics">{forumrow.TOPICS} <dfn>{L_TOPICS}</dfn></dd>
<dd class="posts">{forumrow.POSTS} <dfn>{L_POSTS}</dfn></dd>
<dd class="lastpost">
<span>
<!-- IF forumrow.U_UNAPPROVED_TOPICS -->
<a href="{forumrow.U_UNAPPROVED_TOPICS}" title="{L_TOPICS_UNAPPROVED}">
{{ Icon('font', 'circle-question', lang('TOPICS_UNAPPROVED'), true, 'fas c-unapproved-icon') }}
</a>
<!-- ELSEIF forumrow.U_UNAPPROVED_POSTS -->
<a href="{forumrow.U_UNAPPROVED_POSTS}" title="{L_POSTS_UNAPPROVED_FORUM}">
{{ Icon('font', 'circle-question', lang('POSTS_UNAPPROVED_FORUM'), true, 'fas c-unapproved-icon') }}
</a>
<!-- ENDIF -->
<!-- IF forumrow.LAST_POST_TIME_RFC3339 -->
<dfn>{L_LAST_POST}</dfn>
<!-- IF forumrow.S_DISPLAY_SUBJECT -->
<!-- EVENT forumlist_body_last_post_title_prepend -->
<a href="{forumrow.U_LAST_POST}" title="{forumrow.LAST_POST_SUBJECT}" class="lastsubject">{forumrow.LAST_POST_SUBJECT_TRUNCATED}</a> <br />
<!-- ENDIF -->
{L_POST_BY_AUTHOR} <!-- EVENT forumlist_body_last_poster_username_prepend -->{forumrow.LAST_POSTER_FULL}<!-- EVENT forumlist_body_last_poster_username_append -->
<!-- IF not S_IS_BOT -->
<a href="{forumrow.U_LAST_POST}" title="{L_VIEW_LATEST_POST}">
{{ Icon('font', 'arrow-up-right-from-square', lang('VIEW_LATEST_POST'), true, 'fas c-last-post-icon') }}
</a>
<!-- ENDIF -->
<br /><time datetime="{forumrow.LAST_POST_TIME_RFC3339}">{forumrow.LAST_POST_TIME}</time>
<!-- ELSE -->
{% if forumrow.U_UNAPPROVED_TOPICS %}
{{ lang('TOPIC_UNAPPROVED_FORUM', forumrow.TOPICS) }}
{% else %}
{{ lang('NO_POSTS') }}
{% endif %}
<!-- ENDIF -->
</span>
</dd>
<!-- ELSE -->
<dd>&nbsp;</dd>
<!-- ENDIF -->
</dl>
<!-- EVENT forumlist_body_forum_row_append -->
</li>
<!-- EVENT forumlist_body_forum_row_after -->
<!-- ENDIF -->
<!-- IF forumrow.S_LAST_ROW -->
</ul>
</div>
</div>
<!-- EVENT forumlist_body_last_row_after -->
<!-- ENDIF -->
<!-- BEGINELSE -->
<div class="panel">
<div class="inner">
<strong>{L_NO_FORUMS}</strong>
</div>
</div>
<!-- END forumrow -->

View file

@ -0,0 +1,94 @@
<!-- INCLUDE overall_header.html -->
<p class="{S_CONTENT_FLOW_END} responsive-center time<!-- IF S_USER_LOGGED_IN --> rightside<!-- ENDIF -->"><!-- IF S_USER_LOGGED_IN -->{LAST_VISIT_DATE}<!-- ELSE -->{CURRENT_TIME}<!-- ENDIF --></p>
<!-- IF S_USER_LOGGED_IN --><p class="responsive-center time">{CURRENT_TIME}</p><!-- ENDIF -->
<!-- EVENT index_body_markforums_before -->
<!-- IF U_MARK_FORUMS -->
<div class="action-bar compact">
<a href="{U_MARK_FORUMS}" class="mark-read rightside" accesskey="m" data-ajax="mark_forums_read">{L_MARK_FORUMS_READ}</a>
</div>
<!-- ENDIF -->
<!-- EVENT index_body_markforums_after -->
<!-- INCLUDE forumlist_body.html -->
<!-- EVENT index_body_forumlist_body_after -->
<!-- IF not S_USER_LOGGED_IN and not S_IS_BOT -->
<form method="post" action="{S_LOGIN_ACTION}" class="headerspace">
<h3><a href="{U_LOGIN_LOGOUT}">{L_LOGIN_LOGOUT}</a><!-- IF S_REGISTER_ENABLED -->&nbsp; &bull; &nbsp;<a href="{U_REGISTER}">{L_REGISTER}</a><!-- ENDIF --></h3>
<fieldset class="quick-login">
<label for="username"><span>{L_USERNAME}{L_COLON}</span> <input type="text" tabindex="1" name="username" id="username" size="10" class="inputbox" title="{L_USERNAME}" autocomplete="username" /></label>
<label for="password"><span>{L_PASSWORD}{L_COLON}</span> <input type="password" tabindex="2" name="password" id="password" size="10" class="inputbox" title="{L_PASSWORD}" autocomplete="current-password" /></label>
<!-- IF U_SEND_PASSWORD -->
<a href="{U_SEND_PASSWORD}">{L_FORGOT_PASS}</a>
<!-- ENDIF -->
<!-- IF S_AUTOLOGIN_ENABLED -->
<span class="responsive-hide">|</span> <label for="autologin">{L_LOG_ME_IN} <input type="checkbox" tabindex="4" name="autologin" id="autologin" checked /></label>
<!-- ENDIF -->
<input type="submit" tabindex="5" name="login" value="{L_LOGIN}" class="button1 button button-form-bold" />
{S_LOGIN_REDIRECT}
{S_FORM_TOKEN_LOGIN}
</fieldset>
</form>
<!-- ENDIF -->
<!-- EVENT index_body_stat_blocks_before -->
<!-- IF S_DISPLAY_ONLINE_LIST -->
<div class="stat-block online-list">
<!-- IF U_VIEWONLINE --><h3><a href="{U_VIEWONLINE}">{L_WHO_IS_ONLINE}</a></h3><!-- ELSE --><h3>{L_WHO_IS_ONLINE}</h3><!-- ENDIF -->
<p>
<!-- EVENT index_body_block_online_prepend -->
{TOTAL_USERS_ONLINE} ({L_ONLINE_EXPLAIN})<br />{RECORD_USERS}<br />
<!-- IF U_VIEWONLINE -->
<br />{LOGGED_IN_USER_LIST}
{% if LEGEND|length > 0 %}
{% apply spaceless %}
<br>
<em>
{{ lang('LEGEND') ~ lang('COLON') }}
{% for group in LEGEND %}
{% if group.GROUP_URL %}
<a style="color:#{{ group.GROUP_COLOR }}" href="{{ group.GROUP_URL }}" alt="{{ group.GROUP_NAME }}">{{ group.GROUP_NAME }}</a>{% if not loop.last %}, {% endif %}
{% else %}
<span style="color:#{{ group.GROUP_COLOR }}">{{ group.GROUP_NAME }}</span>{% if not loop.last %}, {% endif %}
{% endif %}
{% endfor %}
</em>
{% endapply %}
{% endif %}
<!-- ENDIF -->
<!-- EVENT index_body_block_online_append -->
</p>
</div>
<!-- ENDIF -->
<!-- EVENT index_body_birthday_block_before -->
<!-- IF S_DISPLAY_BIRTHDAY_LIST -->
<div class="stat-block birthday-list">
<h3>{L_BIRTHDAYS}</h3>
<p>
<!-- EVENT index_body_block_birthday_prepend -->
<!-- IF .birthdays -->{L_CONGRATULATIONS}{L_COLON} <strong><!-- BEGIN birthdays -->{birthdays.USERNAME}<!-- IF birthdays.AGE !== '' --> ({birthdays.AGE})<!-- ENDIF --><!-- IF not birthdays.S_LAST_ROW -->, <!-- ENDIF --><!-- END birthdays --></strong><!-- ELSE -->{L_NO_BIRTHDAYS}<!-- ENDIF -->
<!-- EVENT index_body_block_birthday_append -->
</p>
</div>
<!-- ENDIF -->
<!-- IF NEWEST_USER -->
<div class="stat-block statistics">
<h3>{L_STATISTICS}</h3>
<p>
<!-- EVENT index_body_block_stats_prepend -->
{TOTAL_POSTS} &bull; {TOTAL_TOPICS} &bull; {TOTAL_USERS} &bull; {NEWEST_USER}
<!-- EVENT index_body_block_stats_append -->
</p>
</div>
<!-- ENDIF -->
<!-- EVENT index_body_stat_blocks_after -->
<!-- INCLUDE overall_footer.html -->

View file

@ -0,0 +1,50 @@
<div class="action-bar actions-jump">
<!-- IF S_VIEWTOPIC -->
<p class="jumpbox-return">
<a href="{U_VIEW_FORUM}" class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
{{ Icon('font', 'angle-' ~ S_CONTENT_FLOW_BEGIN, lang('RETURN_TO_FORUM'), false, 'fas c-return-arrow-icon') }}
</a>
</p>
<!-- ELSEIF S_VIEWFORUM -->
<p class="jumpbox-return">
<a href="{U_INDEX}" class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
{{ Icon('font', 'angle-' ~ S_CONTENT_FLOW_BEGIN, lang('RETURN_TO_INDEX'), false, 'fas c-return-arrow-icon') }}
</a>
</p>
<!-- ELSEIF SEARCH_TOPIC -->
<p class="jumpbox-return">
<a class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH_TOPIC}" accesskey="r">
{{ Icon('font', 'angle-' ~ S_CONTENT_FLOW_BEGIN, lang('RETURN_TO_TOPIC'), false, 'fas c-return-arrow-icon') }}
</a>
</p>
<!-- ELSEIF S_SEARCH_ACTION -->
<p class="jumpbox-return">
<a class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH}" title="{L_SEARCH_ADV}" accesskey="r">
{{ Icon('font', 'angle-' ~ S_CONTENT_FLOW_BEGIN, lang('GO_TO_SEARCH_ADV'), false, 'fas c-return-arrow-icon') }}
</a>
</p>
<!-- ENDIF -->
<!-- IF S_DISPLAY_JUMPBOX -->
<div class="jumpbox dropdown-container dropdown-container-right<!-- IF not S_IN_MCP --> dropdown-up<!-- ENDIF --> dropdown-{S_CONTENT_FLOW_BEGIN} dropdown-button-control" id="jumpbox">
<span title="<!-- IF S_IN_MCP and S_MERGE_SELECT -->{L_SELECT_TOPICS_FROM}<!-- ELSEIF S_IN_MCP -->{L_MODERATE_FORUM}<!-- ELSE -->{L_JUMP_TO}<!-- ENDIF -->" class="button button-secondary dropdown-trigger dropdown-select">
<span><!-- IF S_IN_MCP and S_MERGE_SELECT -->{L_SELECT_TOPICS_FROM}<!-- ELSEIF S_IN_MCP -->{L_MODERATE_FORUM}<!-- ELSE -->{L_JUMP_TO}<!-- ENDIF --></span>
<span class="caret">{{ Icon('font', 'caret-down', '', true) }}</span>
</span>
<div class="dropdown">
<div class="pointer"><div class="pointer-inner"></div></div>
<ul class="dropdown-contents">
<!-- BEGIN jumpbox_forums -->
<!-- IF jumpbox_forums.FORUM_ID neq -1 -->
<li><a href="{jumpbox_forums.LINK}" class="<!-- IF jumpbox_forums.level -->jumpbox-sub-link<!-- ELSEIF jumpbox_forums.S_IS_CAT -->jumpbox-cat-link<!-- ELSE -->jumpbox-forum-link<!-- ENDIF -->"><!-- BEGIN level --><span class="spacer"></span><!-- END level --> <span><!-- IF jumpbox_forums.level --><!-- IF S_CONTENT_DIRECTION eq 'rtl' -->&#8626;<!-- ELSE -->&#8627;<!-- ENDIF --> &nbsp;<!-- ENDIF --> {jumpbox_forums.FORUM_NAME}</span></a></li>
<!-- ENDIF -->
<!-- END jumpbox_forums -->
</ul>
</div>
</div>
<!-- ELSE -->
<br /><br />
<!-- ENDIF -->
</div>

View file

@ -0,0 +1,70 @@
<!-- INCLUDE overall_header.html -->
<form action="{S_LOGIN_ACTION}" method="post" id="login" data-focus="<!-- IF S_ADMIN_AUTH -->{PASSWORD_CREDENTIAL}<!-- ELSE -->{USERNAME_CREDENTIAL}<!-- ENDIF -->">
<div class="panel">
<div class="inner">
<div class="content">
<h2 class="login-title"><!-- IF LOGIN_EXPLAIN -->{LOGIN_EXPLAIN}<!-- ELSE -->{L_LOGIN}<!-- ENDIF --></h2>
<fieldset <!-- IF not S_CONFIRM_CODE -->class="fields1"<!-- ELSE -->class="fields2"<!-- ENDIF -->>
<!-- IF LOGIN_ERROR --><div class="error">{LOGIN_ERROR}</div><!-- ENDIF -->
<dl>
<dt><label for="{USERNAME_CREDENTIAL}">{L_USERNAME}{L_COLON}</label></dt>
<dd><input type="text" tabindex="1" name="{USERNAME_CREDENTIAL}" id="{USERNAME_CREDENTIAL}" size="25" value="{USERNAME}" class="inputbox autowidth" autocomplete="username" /></dd>
</dl>
<dl>
<dt><label for="{PASSWORD_CREDENTIAL}">{L_PASSWORD}{L_COLON}</label></dt>
<dd><input type="password" tabindex="2" id="{PASSWORD_CREDENTIAL}" name="{PASSWORD_CREDENTIAL}" size="25" class="inputbox autowidth" autocomplete="current-password" /></dd>
<!-- IF S_DISPLAY_FULL_LOGIN and (U_SEND_PASSWORD or U_RESEND_ACTIVATION) -->
<!-- IF U_SEND_PASSWORD --><dd><a href="{U_SEND_PASSWORD}">{L_FORGOT_PASS}</a></dd><!-- ENDIF -->
<!-- IF U_RESEND_ACTIVATION --><dd><a href="{U_RESEND_ACTIVATION}">{L_RESEND_ACTIVATION}</a></dd><!-- ENDIF -->
<!-- ENDIF -->
</dl>
<!-- IF CAPTCHA_TEMPLATE and S_CONFIRM_CODE -->
<!-- DEFINE $CAPTCHA_TAB_INDEX = 3 -->
<!-- INCLUDE {CAPTCHA_TEMPLATE} -->
<!-- ENDIF -->
<!-- IF S_DISPLAY_FULL_LOGIN -->
<dl>
<dt>&nbsp;</dt>
<!-- IF S_AUTOLOGIN_ENABLED --><dd><label for="autologin"><input type="checkbox" name="autologin" id="autologin" tabindex="4" checked /> {L_LOG_ME_IN}</label></dd><!-- ENDIF -->
<dd><label for="viewonline"><input type="checkbox" name="viewonline" id="viewonline" tabindex="5" /> {L_HIDE_ME}</label></dd>
</dl>
<!-- ENDIF -->
{S_LOGIN_REDIRECT}
{S_FORM_TOKEN_LOGIN}
<dl>
<dt>&nbsp;</dt>
<dd>{S_HIDDEN_FIELDS}<input type="submit" name="login" tabindex="6" value="{L_LOGIN}" class="button1 button button-form" /></dd>
</dl>
</fieldset>
</div>
<!-- IF not S_ADMIN_AUTH and PROVIDER_TEMPLATE_FILE -->
<!-- INCLUDE {PROVIDER_TEMPLATE_FILE} -->
<!-- ENDIF -->
</div>
</div>
<!-- IF not S_ADMIN_AUTH and S_REGISTER_ENABLED -->
<div class="panel">
<div class="inner">
<div class="content">
<h3>{L_REGISTER}</h3>
<p>{L_LOGIN_INFO}</p>
<p><strong><a href="{U_TERMS_USE}">{L_TERMS_USE}</a> | <a href="{U_PRIVACY}">{L_PRIVACY}</a></strong></p>
<hr class="dashed" />
<p><a href="{U_REGISTER}" class="button1 button button-form-bold">{L_REGISTER}</a></p>
</div>
</div>
</div>
<!-- ENDIF -->
</form>
<!-- INCLUDE overall_footer.html -->

View file

@ -0,0 +1,6 @@
<br>
<div class="content">
{% for oauth in oauth %}
<a href="{{ oauth.REDIRECT_URL }}" class="button1 button button-form-bold">{{ oauth.SERVICE_NAME }}</a>
{% endfor %}
</div>

View file

@ -0,0 +1,42 @@
<!-- INCLUDE overall_header.html -->
<!-- IF FORUM_NAME --><h2 class="forum-title"><a href="{U_VIEW_FORUM}">{FORUM_NAME}</a></h2><!-- ENDIF -->
<form id="login_forum" method="post" action="{S_LOGIN_ACTION}">
{S_FORM_TOKEN}
<div class="panel">
<div class="inner">
<div class="content">
<h2 class="login-title">{L_LOGIN}</h2>
<p>{L_LOGIN_FORUM}</p>
<fieldset class="fields1">
<!-- IF LOGIN_ERROR -->
<dl>
<dt>&nbsp;</dt>
<dd class="error">{LOGIN_ERROR}</dd>
</dl>
<!-- ENDIF -->
<dl>
<dt><label for="password">{L_PASSWORD}{L_COLON}</label></dt>
<dd><input type="password" tabindex="1" id="password" name="password" size="25" class="inputbox narrow" autocomplete="off" /></dd>
</dl>
{S_LOGIN_REDIRECT}
{S_FORM_TOKEN_LOGIN}
<dl>
<dt>&nbsp;</dt>
<dd>{S_HIDDEN_FIELDS}<input type="submit" name="login" id="login" class="button1 button button-form" value="{L_LOGIN}" tabindex="2" /></dd>
</dl>
</fieldset>
</div>
</div>
</div>
</form>
<!-- INCLUDE jumpbox.html -->
<!-- INCLUDE overall_footer.html -->

View file

@ -0,0 +1,81 @@
<!-- IF S_AJAX_REQUEST -->
<h3>{MESSAGE_TITLE}</h3>
<p>{MESSAGE_TEXT}</p>
<!-- IF S_NOTIFY_POSTER -->
<label><input type="checkbox" name="notify_poster" checked="checked" /> <!-- IF S_APPROVE -->{L_NOTIFY_POSTER_APPROVAL}<!-- ELSE -->{L_NOTIFY_POSTER_DISAPPROVAL}<!-- ENDIF --></label>
<!-- ENDIF -->
<!-- IF not S_APPROVE and not S_RESTORE and .reason -->
<label><strong>{L_DISAPPROVE_REASON}{L_COLON}</strong>
<select name="reason_id">
<!-- BEGIN reason --><option value="{reason.ID}"<!-- IF reason.S_SELECTED --> selected="selected"<!-- ENDIF -->>{reason.DESCRIPTION}</option><!-- END reason -->
</select></label>
<label><strong>{L_MORE_INFO}{L_COLON}</strong><br /><span>{L_CAN_LEAVE_BLANK}</span>
<textarea class="inputbox" name="reason" id="reason" rows="4" cols="40">{REASON}</textarea>
</label>
<!-- ENDIF -->
<fieldset class="submit-buttons">
<input type="button" name="confirm" value="{YES_VALUE}" class="button1 button button-form" />&nbsp;
<input type="button" name="cancel" value="{L_NO}" class="button1 button button-form-bold" />
</fieldset>
<!-- ELSE -->
<!-- INCLUDE overall_header.html -->
<form id="confirm" action="{S_CONFIRM_ACTION}" method="post">
<div class="panel">
{S_FORM_TOKEN}
<div class="inner">
<div class="content">
<h2 class="message-title">{MESSAGE_TITLE}</h2>
<!-- IF ADDITIONAL_MSG --><p class="error">{ADDITIONAL_MSG}</p><!-- ENDIF -->
<fieldset>
<!-- IF S_NOTIFY_POSTER -->
<dl class="fields2 nobg">
<dt>&nbsp;</dt>
<dd><label><input type="checkbox" name="notify_poster" checked="checked" /> <!-- IF S_APPROVE -->{L_NOTIFY_POSTER_APPROVAL}<!-- ELSE -->{L_NOTIFY_POSTER_DISAPPROVAL}<!-- ENDIF --></label></dd>
</dl>
<!-- ENDIF -->
<!-- IF not S_APPROVE and not S_RESTORE and .reason -->
<dl class="fields2 nobg">
<dt><label>{L_DISAPPROVE_REASON}{L_COLON}</label></dt>
<dd><select name="reason_id">
<!-- BEGIN reason --><option value="{reason.ID}"<!-- IF reason.S_SELECTED --> selected="selected"<!-- ENDIF -->>{reason.DESCRIPTION}</option><!-- END reason -->
</select>
</dd>
</dl>
<dl class="fields2 nobg">
<dt><label for="reason">{L_MORE_INFO}{L_COLON}</label><br /><span>{L_CAN_LEAVE_BLANK}</span></dt>
<dd><textarea class="inputbox" name="reason" id="reason" rows="4" cols="40">{REASON}</textarea></dd>
</dl>
<!-- ENDIF -->
<dl class="fields2 nobg">
<dt>&nbsp;</dt>
<dd><strong>{MESSAGE_TEXT}</strong></dd>
</dl>
</fieldset>
<fieldset class="submit-buttons">
{S_HIDDEN_FIELDS}<input type="submit" name="confirm" value="{YES_VALUE}" class="button1 button button-form" />&nbsp;
<input type="submit" name="cancel" value="{L_NO}" class="button1 button button-form-bold" />
</fieldset>
</div>
</div>
</div>
</form>
<!-- INCLUDE overall_footer.html -->
<!-- ENDIF -->

View file

@ -0,0 +1,128 @@
<!-- INCLUDE mcp_header.html -->
<script>
var ban_length = new Array();
ban_length[-1] = '';
var ban_reason = new Array();
ban_reason[-1] = '';
var ban_give_reason = new Array();
ban_give_reason[-1] = '';
<!-- BEGIN bans -->
ban_length['{bans.BAN_ID}'] = '{{ bans.A_LENGTH }}';
<!-- IF bans.A_REASON -->
ban_reason['{bans.BAN_ID}'] = '{{ bans.REASON | e('js') }}';
<!-- ENDIF -->
<!-- IF bans.A_GIVE_REASON -->
ban_give_reason['{bans.BAN_ID}'] = '{{ bans.GIVE_REASON | e('js') }}';
<!-- ENDIF -->
<!-- END bans -->
function display_details(option)
{
document.getElementById('unbanlength').innerHTML = ban_length[option];
if (option in ban_reason) {
document.getElementById('unbanreason').innerHTML = ban_reason[option];
} else {
document.getElementById('unbanreason').innerHTML = '';
}
if (option in ban_give_reason) {
document.getElementById('unbangivereason').innerHTML = ban_give_reason[option];
} else {
document.getElementById('unbangivereason').innerHTML = '';
}
}
</script>
<form id="mcp_ban" method="post" action="{U_ACTION}">
<h2>{L_TITLE}</h2>
<div class="panel">
<div class="inner">
<h3>{L_TITLE}</h3>
<p>{L_EXPLAIN}</p>
<fieldset>
<!-- EVENT mcp_ban_fields_before -->
<dl>
<dt><label for="ban">{L_BAN_CELL}{L_COLON}</label></dt>
<dd><label for="ban"><textarea name="ban" id="ban" class="inputbox" cols="40" rows="3">{BAN_QUANTIFIER}</textarea></label></dd>
<!-- IF S_USERNAME_BAN --><dd><strong><a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a></strong></dd><!-- ENDIF -->
</dl>
<dl>
<dt><label for="banlength">{L_BAN_LENGTH}{L_COLON}</label></dt>
<dd><label for="banlength"><select name="banlength" id="banlength" onchange="if(this.value==-1){document.getElementById('banlengthother').style.display = 'block';}else{document.getElementById('banlengthother').style.display='none';}">{S_BAN_END_OPTIONS}</select></label></dd>
<dd id="banlengthother" style="display: none;"><label><input type="text" name="banlengthother" class="inputbox" /><br /><span>{L_YEAR_MONTH_DAY}</span></label></dd>
</dl>
<dl>
<dt><label for="banreason">{L_BAN_REASON}{L_COLON}</label></dt>
<dd><input name="banreason" id="banreason" type="text" class="inputbox" maxlength="255" /></dd>
</dl>
<dl>
<dt><label for="bangivereason">{L_BAN_GIVE_REASON}{L_COLON}</label></dt>
<dd><input name="bangivereason" id="bangivereason" type="text" class="inputbox" maxlength="255" /></dd>
</dl>
<hr />
<!-- EVENT mcp_ban_fields_after -->
</fieldset>
</div>
</div>
<fieldset class="submit-buttons">
{S_HIDDEN_FIELDS}
<input type="submit" name="bansubmit" value="{L_SUBMIT}" class="button1 button button-form" />
{S_FORM_TOKEN}
</fieldset>
<div class="panel">
<div class="inner">
<h3>{L_UNBAN_TITLE}</h3>
<p>{L_UNBAN_EXPLAIN}</p>
<!-- IF S_BANNED_OPTIONS -->
<fieldset>
<!-- EVENT mcp_ban_unban_before -->
<dl>
<dt><label for="unban">{L_BAN_CELL}{L_COLON}</label></dt>
<dd><select name="unban[]" id="unban" multiple="multiple" size="5" onchange="if (this.selectedIndex != -1) {display_details(this.options[this.selectedIndex].value);}">{BANNED_OPTIONS}</select></dd>
</dl>
<dl>
<dt>{L_BAN_LENGTH}{L_COLON}</dt>
<dd><strong id="unbanlength"></strong></dd>
</dl>
<dl>
<dt>{L_BAN_REASON}{L_COLON}</dt>
<dd><strong id="unbanreason"></strong></dd>
</dl>
<dl>
<dt>{L_BAN_GIVE_REASON}{L_COLON}</dt>
<dd><strong id="unbangivereason"></strong></dd>
</dl>
<!-- EVENT mcp_ban_unban_after -->
</fieldset>
</div>
</div>
<fieldset class="submit-buttons">
{S_HIDDEN_FIELDS}
<input type="submit" name="unbansubmit" value="{L_SUBMIT}" class="button1 button button-form" />
</fieldset>
<!-- ELSE -->
<p><strong>{L_NO_BAN_CELL}</strong></p>
</div>
</div>
<!-- ENDIF -->
</form>
<!-- INCLUDE mcp_footer.html -->

View file

@ -0,0 +1,8 @@
</div>
</div>
</div>
</div>
<!-- INCLUDE overall_footer.html -->

View file

@ -0,0 +1,174 @@
<!-- INCLUDE mcp_header.html -->
<!-- DEFINE $CUSTOM_FIELDSET_CLASS = 'forum-selection2' -->
<!-- INCLUDE jumpbox.html -->
<h2><a href="{U_VIEW_FORUM}">{L_FORUM}{L_COLON} {FORUM_NAME}</a></h2>
<form method="post" id="mcp" action="{S_MCP_ACTION}">
<div class="panel">
<div class="inner">
<div class="action-bar bar-top">
<div class="pagination">
{TOTAL_TOPICS}
<!-- IF .pagination -->
<!-- INCLUDE pagination.html -->
<!-- ELSE -->
&bull; {PAGE_NUMBER}
<!-- ENDIF -->
</div>
</div>
<!-- IF .topicrow -->
<ul class="topiclist<!-- IF S_MERGE_SELECT --> missing-column<!-- ENDIF -->">
<li class="header">
<dl class="row-item">
<dt><div class="list-inner">{L_TOPICS}</div></dt>
<dd class="posts">{L_REPLIES}</dd>
<dd class="lastpost"><span>{L_LAST_POST}</span></dd>
<!-- IF not S_MERGE_SELECT --><dd class="mark">{L_MARK}</dd><!-- ENDIF -->
</dl>
</li>
</ul>
<ul class="topiclist cplist<!-- IF S_MERGE_SELECT --> missing-column<!-- ENDIF -->">
<!-- BEGIN topicrow -->
<li class="row<!-- IF topicrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- IF topicrow.S_TOPIC_REPORTED --> reported<!-- ENDIF -->">
<dl class="row-item">
<dt>
<a class="row-item-link{% if topicrow.S_UNREAD_TOPIC %} unread{% else %} read{% endif %}" href="{topicrow.U_VIEW_TOPIC}" title="{topicrow.TOPIC_FOLDER_IMG_ALT}">
{{ Icon('svg', {
'globe' : topicrow.S_POST_GLOBAL,
'bullhorn' : topicrow.S_POST_ANNOUNCE,
'thumbtack' : topicrow.S_POST_STICKY,
'lock' : topicrow.S_TOPIC_LOCKED,
'arrow-right-bold' : topicrow.S_TOPIC_MOVED,
'fire' : topicrow.S_TOPIC_HOT,
'file-document-outline' : true,
}, '', true, 'c-forum-row-icon') }}
</a>
{% if lang(topicrow.TOPIC_AUTHOR) == S_USERNAME %}
<span class="row-item-link-mine"></span>
{% endif%}
{% if topicrow.TOPIC_ICON_IMG and S_TOPIC_ICONS %}
<img class="row-item-sub" src="{T_ICONS_PATH}{topicrow.TOPIC_ICON_IMG}" alt="">
{% endif %}
<div class="list-inner">
<!-- EVENT topiclist_row_prepend -->
<!-- IF topicrow.S_SELECT_TOPIC --><a href="{topicrow.U_SELECT_TOPIC}" class="topictitle">[ {L_SELECT_MERGE} ]</a>&nbsp;&nbsp; <!-- ENDIF -->
<!-- EVENT mcp_forum_topic_title_before -->
<a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a>
<!-- EVENT mcp_forum_topic_title_after -->
<!-- IF topicrow.S_TOPIC_UNAPPROVED or topicrow.S_POSTS_UNAPPROVED -->
<a href="{topicrow.U_MCP_QUEUE}" title="{L_TOPIC_UNAPPROVED}">
{{ Icon('font', 'circle-question', lang('TOPIC_UNAPPROVED'), true, 'fas c-unapproved-icon o-icon-baseline') }}
</a>
<!-- ENDIF -->
<!-- IF topicrow.S_TOPIC_DELETED or topicrow.S_POSTS_DELETED -->
<a href="{topicrow.U_MCP_QUEUE}" title="{L_TOPIC_DELETED}">
{{ Icon('font', 'recycle', lang('TOPIC_DELETED'), true, 'fas c-topic-deleted-icon o-icon-baseline') }}
</a>
<!-- ENDIF -->
<!-- IF topicrow.S_TOPIC_REPORTED -->
<a href="{topicrow.U_MCP_REPORT}" title="{L_TOPIC_REPORTED}">
{{ Icon('font', 'triangle-exclamation', lang('TOPIC_REPORTED'), true, 'fas c-topic-reported-icon o-icon-baseline') }}
</a>
<!-- ENDIF -->
<!-- IF topicrow.S_MOVED_TOPIC and S_CAN_DELETE -->&nbsp;<a href="{topicrow.U_DELETE_TOPIC}" class="topictitle">[ {L_DELETE_SHADOW_TOPIC} ]</a><!-- ENDIF -->
<br />
<!-- EVENT topiclist_row_topic_title_after -->
<div class="responsive-show" style="display: none;">
{% if topicrow.ATTACH_ICON_IMG %}{{ Icon('font', 'paperclip', '', true) }} {% endif %}
{L_LAST_POST} {L_POST_BY_AUTHOR} {% EVENT mcp_forum_last_post_author_username_prepend %}{topicrow.LAST_POST_AUTHOR_FULL}{% EVENT mcp_forum_last_post_author_username_append %} &laquo; {topicrow.LAST_POST_TIME}<br />
</div>
<span class="responsive-show left-box" style="display: none;">{L_REPLIES}{L_COLON} <strong>{topicrow.REPLIES}</strong></span>
<!-- IF .topicrow.pagination -->
<div class="pagination">
<ul>
<!-- BEGIN pagination -->
<!-- IF topicrow.pagination.S_IS_PREV -->
<!-- ELSEIF topicrow.pagination.S_IS_CURRENT -->
<li class="active"><span>{{ topicrow.pagination.PAGE_NUMBER }}</span></li>
<!-- ELSEIF topicrow.pagination.S_IS_ELLIPSIS -->
<li class="ellipsis"><span>{{ lang('ELLIPSIS') }}</span></li>
<!-- ELSEIF topicrow.pagination.S_IS_NEXT -->
<!-- ELSE -->
<li><a class="button" href="{{ topicrow.pagination.PAGE_URL }}" role="button">{{ topicrow.pagination.PAGE_NUMBER }}</a></li>
<!-- ENDIF -->
<!-- END pagination -->
</ul>
</div>
<!-- ENDIF -->
<div class="responsive-hide">
{% if topicrow.ATTACH_ICON_IMG %}{{ Icon('font', 'paperclip', '', true) }} {% endif %}
{% EVENT topiclist_row_topic_by_author_before %}
{L_POST_BY_AUTHOR} {% EVENT mcp_forum_topic_author_username_prepend %}{topicrow.TOPIC_AUTHOR_FULL}{% EVENT mcp_forum_topic_author_username_append %} &raquo; {topicrow.FIRST_POST_TIME}
{% EVENT topiclist_row_topic_by_author_after %}
</div>
<!-- EVENT topiclist_row_append -->
</div>
</dt>
<dd class="posts">{topicrow.REPLIES} <dfn>{L_REPLIES}</dfn></dd>
<dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {% EVENT mcp_forum_last_post_author_username_prepend %}{topicrow.LAST_POST_AUTHOR_FULL}{% EVENT mcp_forum_last_post_author_username_append %}<br />{topicrow.LAST_POST_TIME}</span></dd>
<!-- IF not S_MERGE_SELECT -->
<dd class="mark">
<!-- IF not topicrow.S_MOVED_TOPIC --><input type="checkbox" name="topic_id_list[]" value="{topicrow.TOPIC_ID}"<!-- IF topicrow.S_TOPIC_CHECKED --> checked="checked"<!-- ENDIF --> /><!-- ELSE -->&nbsp;<!-- ENDIF -->
</dd>
<!-- ENDIF -->
</dl>
</li>
<!-- END topicrow -->
</ul>
<!-- ELSE -->
<ul class="topiclist">
<li><p class="notopics">{L_NO_TOPICS}</p></li>
</ul>
<!-- ENDIF -->
<div class="action-bar bottom">
<!-- INCLUDE display_options.html -->
<div class="pagination">
{TOTAL_TOPICS}
<!-- IF .pagination -->
<!-- INCLUDE pagination.html -->
<!-- ELSE -->
&bull; {PAGE_NUMBER}
<!-- ENDIF -->
</div>
</div>
</div>
</div>
<!-- EVENT mcp_forum_actions_before -->
<fieldset class="display-actions">
<!-- IF not S_MERGE_SELECT -->
<select name="action">
<option value="" selected="selected">{L_SELECT_ACTION}</option>
<!-- IF S_CAN_DELETE --><option value="delete_topic">{L_DELETE}</option><!-- ENDIF -->
<!-- IF S_CAN_RESTORE --><option value="restore_topic">{L_RESTORE}</option><!-- ENDIF -->
<!-- IF S_CAN_MERGE --><option value="merge_topics">{L_MERGE}</option><!-- ENDIF -->
<!-- IF S_CAN_MOVE --><option value="move">{L_MOVE}</option><!-- ENDIF -->
<!-- IF S_CAN_FORK --><option value="fork">{L_FORK}</option><!-- ENDIF -->
<!-- IF S_CAN_LOCK --><option value="lock">{L_LOCK}</option><option value="unlock">{L_UNLOCK}</option><!-- ENDIF -->
<!-- IF S_CAN_SYNC --><option value="resync">{L_RESYNC}</option><!-- ENDIF -->
<!-- IF S_CAN_MAKE_NORMAL --><option value="make_normal">{L_MAKE_NORMAL}</option><!-- ENDIF -->
<!-- IF S_CAN_MAKE_STICKY --><option value="make_sticky">{L_MAKE_STICKY}</option><!-- ENDIF -->
<!-- IF S_CAN_MAKE_ANNOUNCE --><option value="make_announce">{L_MAKE_ANNOUNCE}</option><!-- ENDIF -->
<!-- IF S_CAN_MAKE_ANNOUNCE_GLOBAL --><option value="make_global">{L_MAKE_GLOBAL}</option><!-- ENDIF -->
<!-- EVENT mcp_forum_actions_append -->
</select>
<input class="button1 button button-form-bold" type="submit" value="{L_SUBMIT}" />
<div><a href="#" onclick="marklist('mcp', 'topic_id_list', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('mcp', 'topic_id_list', false); return false;">{L_UNMARK_ALL}</a></div>
<!-- ENDIF -->
{S_FORM_TOKEN}
</fieldset>
<!-- EVENT mcp_forum_actions_after -->
</form>
<!-- INCLUDE mcp_footer.html -->

View file

@ -0,0 +1,194 @@
<!-- INCLUDE mcp_header.html -->
<h2>{PAGE_TITLE}</h2>
<!-- EVENT mcp_front_latest_unapproved_before -->
<!-- IF S_SHOW_UNAPPROVED -->
<form id="mcp_queue" method="post" action="{S_MCP_QUEUE_ACTION}">
<div class="panel">
<div class="inner">
<h3>{L_LATEST_UNAPPROVED}</h3>
<p>{L_UNAPPROVED_TOTAL}</p>
<!-- IF .unapproved -->
<ul class="topiclist missing-column">
<li class="header">
<dl>
<dt><div class="list-inner">{L_VIEW_DETAILS}</div></dt>
<dd class="moderation"><span>{L_TOPIC} &amp; {L_FORUM}</span></dd>
<dd class="mark">{{ lang('MARK') }}</dd>
</dl>
</li>
</ul>
<ul class="topiclist cplist missing-column responsive-show-all">
<!-- BEGIN unapproved -->
<li class="row<!-- IF unapproved.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
<dl>
<dt>
<div class="list-inner">
<a href="{unapproved.U_POST_DETAILS}" class="topictitle">{unapproved.SUBJECT}</a> <!-- IF unapproved.ATTACH_ICON_IMG -->{{ Icon('font', 'paperclip', '', true) }}<!-- ENDIF --> <br />
{L_POSTED} {L_POST_BY_AUTHOR} {unapproved.AUTHOR_FULL} &raquo; {unapproved.POST_TIME}
</div>
</dt>
<dd class="moderation"><span>
{L_TOPIC}{L_COLON} <a href="{unapproved.U_TOPIC}">{unapproved.TOPIC_TITLE}</a> [<a href="{unapproved.U_MCP_TOPIC}">{L_MODERATE}</a>]<br />
{L_FORUM}{L_COLON} <!-- IF unapproved.U_FORUM --><a href="{unapproved.U_FORUM}">{unapproved.FORUM_NAME}</a><!-- ELSE -->{unapproved.FORUM_NAME}<!-- ENDIF --><!-- IF unapproved.U_MCP_FORUM --> [<a href="{unapproved.U_MCP_FORUM}">{L_MODERATE}</a>]<!-- ENDIF --></span>
</dd>
<dd class="mark"><input type="checkbox" name="post_id_list[]" value="{unapproved.POST_ID}" /></dd>
</dl>
</li>
<!-- END unapproved -->
</ul>
<!-- ENDIF -->
</div>
{S_FORM_TOKEN}
</div>
<!-- IF .unapproved -->
<fieldset class="display-actions">
{S_HIDDEN_FIELDS}
<input class="button1 button button-form-bold" type="submit" name="action[disapprove]" value="{L_DISAPPROVE}" />&nbsp;
<input class="button1 button button-form" type="submit" name="action[approve]" value="{L_APPROVE}" />
<div><a href="#" onclick="marklist('mcp_queue', 'post_id_list', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('mcp_queue', 'post_id_list', false); return false;">{L_UNMARK_ALL}</a></div>
</fieldset>
<!-- ENDIF -->
</form>
<!-- ENDIF -->
<!-- EVENT mcp_front_latest_reported_before -->
<!-- IF S_SHOW_REPORTS -->
<div class="panel">
<div class="inner">
<h3>{L_LATEST_REPORTED}</h3>
<p>{L_REPORTS_TOTAL}</p>
<!-- IF .report -->
<ul class="topiclist two-long-columns">
<li class="header">
<dl>
<dt><div class="list-inner">{L_VIEW_DETAILS}</div></dt>
<dd class="moderation"><span>{L_REPORTER} &amp; {L_FORUM}</span></dd>
</dl>
</li>
</ul>
<ul class="topiclist cplist two-long-columns responsive-show-all">
<!-- BEGIN report -->
<li class="row<!-- IF report.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
<dl>
<dt>
<div class="list-inner">
<a href="{report.U_POST_DETAILS}#reports" class="topictitle">{report.SUBJECT}</a> <!-- IF report.ATTACH_ICON_IMG -->{{ Icon('font', 'paperclip', '', true) }}<!-- ENDIF --> <br />
<span>{L_POSTED} {L_POST_BY_AUTHOR} {report.AUTHOR_FULL} &raquo; {report.POST_TIME}</span>
</div>
</dt>
<dd class="moderation">
<span>{L_REPORTED} {L_POST_BY_AUTHOR} {report.REPORTER_FULL} {L_REPORTED_ON_DATE} {{ report.REPORT_TIME }}<br />
{L_FORUM}{L_COLON} <a href="{report.U_FORUM}">{report.FORUM_NAME}</a></span>
</dd>
</dl>
</li>
<!-- END report -->
</ul>
<!-- ENDIF -->
</div>
</div>
<!-- ENDIF -->
<!-- EVENT mcp_front_latest_reported_pms_before -->
<!-- IF S_SHOW_PM_REPORTS -->
<div class="panel">
<div class="inner">
<h3>{L_LATEST_REPORTED_PMS}</h3>
<p>{L_PM_REPORTS_TOTAL}</p>
<!-- IF .pm_report -->
<ul class="topiclist two-long-columns">
<li class="header">
<dl>
<dt><div class="list-inner">{L_VIEW_DETAILS}</div></dt>
<dd class="moderation"><span>{L_REPORTER}</span></dd>
</dl>
</li>
</ul>
<ul class="topiclist cplist two-long-columns responsive-show-all">
<!-- BEGIN pm_report -->
<li class="row<!-- IF pm_report.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
<dl>
<dt>
<div class="list-inner">
<a href="{pm_report.U_PM_DETAILS}" class="topictitle">{pm_report.PM_SUBJECT}</a> <!-- IF pm_report.ATTACH_ICON_IMG -->{{ Icon('font', 'paperclip', '', true) }}<!-- ENDIF --> <br />
<span>{L_MESSAGE_BY_AUTHOR} {pm_report.PM_AUTHOR_FULL} &raquo; {pm_report.PM_TIME}</span><br />
<span>{L_MESSAGE_TO} {pm_report.RECIPIENTS}</span>
</div>
</dt>
<dd class="moderation">
<span>{L_REPORTED} {L_POST_BY_AUTHOR} {pm_report.REPORTER_FULL} {L_REPORTED_ON_DATE} {pm_report.REPORT_TIME}</span>
</dd>
</dl>
</li>
<!-- END pm_report -->
</ul>
<!-- ENDIF -->
</div>
</div>
<!-- ENDIF -->
<!-- EVENT mcp_front_latest_logs_before -->
<!-- IF S_SHOW_LOGS -->
<div class="panel">
<div class="inner">
<h3>{L_LATEST_LOGS}</h3>
<table class="table1">
<thead>
<tr>
<th class="name">{L_ACTION}</th>
<th class="name">{L_USERNAME}</th>
<th class="name">{L_IP}</th>
<th class="name">{L_VIEW_TOPIC}</th>
<th class="name">{L_VIEW_TOPIC_LOGS}</th>
<th class="name">{L_TIME}</th>
</tr>
</thead>
<tbody>
<!-- BEGIN log -->
<tr class="<!-- IF log.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
<td>{log.ACTION}</td>
<td><span>{log.USERNAME}</span></td>
<td><span>{log.IP}</span></td>
<td><span><!-- IF log.U_VIEW_TOPIC --><a href="{log.U_VIEW_TOPIC}" title="{L_VIEW_TOPIC}">{L_VIEW_TOPIC}</a><!-- ENDIF -->&nbsp;</span></td>
<td><span><!-- IF log.U_VIEWLOGS --><a href="{log.U_VIEWLOGS}">{L_VIEW_TOPIC_LOGS}</a><!-- ENDIF -->&nbsp;</span></td>
<td><span>{log.TIME}</span></td>
</tr>
<!-- BEGINELSE -->
<tr>
<td colspan="6">{L_NO_ENTRIES}</td>
</tr>
<!-- END log -->
</tbody>
</table>
</div>
</div>
<!-- ENDIF -->
<!-- EVENT mcp_front_latest_logs_after -->
<!-- INCLUDE mcp_footer.html -->

View file

@ -0,0 +1,49 @@
<!-- INCLUDE overall_header.html -->
<h2>{L_MCP}</h2>
<!-- IF U_MCP -->
<p class="linkmcp responsive-center">
[<!-- IF U_ACP -->&nbsp;<a href="{U_ACP}" title="{L_ACP}" data-responsive-text="{L_ACP_SHORT}">{L_ACP}</a>&nbsp;|<!-- ENDIF -->&nbsp;<a href="{U_MCP}" title="{L_MCP}" data-responsive-text="{L_MCP_SHORT}">{L_MCP}</a><!-- IF U_MCP_FORUM -->&nbsp;|&nbsp;<a href="{U_MCP_FORUM}">{L_MODERATE_FORUM}</a><!-- ENDIF --><!-- IF U_MCP_TOPIC -->&nbsp;|&nbsp;<a href="{U_MCP_TOPIC}">{L_MODERATE_TOPIC}</a><!-- ENDIF --><!-- IF U_MCP_POST -->&nbsp;|&nbsp;<a href="{U_MCP_POST}">{L_MODERATE_POST}</a><!-- ENDIF -->&nbsp;]
</p>
<!-- ENDIF -->
<div id="tabs" class="tabs">
<ul>
<!-- BEGIN l_block1 -->
<li class="tab<!-- IF l_block1.S_SELECTED --> activetab<!-- ENDIF -->"><a href="{l_block1.U_TITLE}">{l_block1.L_TITLE}</a></li>
<!-- END l_block1 -->
</ul>
</div>
<div class="panel bg3">
<div class="inner">
<div style="width: 100%;">
<div id="cp-menu" class="cp-menu">
<div id="navigation" class="navigation" role="navigation">
<ul>
<!-- BEGIN l_block1 -->
<!-- IF l_block1.S_SELECTED -->
<!-- BEGIN l_block2 -->
<!-- IF l_block1.l_block2.S_SELECTED -->
<li id="active-subsection" class="active-subsection"><a href="{l_block1.l_block2.U_TITLE}"><span>{l_block1.l_block2.L_TITLE}<!-- IF l_block1.l_block2.ADD_ITEM --> ({l_block1.l_block2.ADD_ITEM})<!-- ENDIF --></span></a></li>
<!-- ELSE -->
<li><a href="{l_block1.l_block2.U_TITLE}"><span>{l_block1.l_block2.L_TITLE}<!-- IF l_block1.l_block2.ADD_ITEM --> ({l_block1.l_block2.ADD_ITEM})<!-- ENDIF --></span></a></li>
<!-- ENDIF -->
<!-- END l_block2 -->
<!-- ENDIF -->
<!-- END l_block1 -->
</ul>
</div>
</div>
<div id="cp-main" class="cp-main mcp-main panel-container">
<!-- IF MESSAGE -->
<div class="content">
<h2 class="message-title">{L_MESSAGE}</h2>
<p class="error">{MESSAGE}</p>
<p><!-- BEGIN return_links -->{return_links.MESSAGE_LINK}<br /><br /><!-- END return_links --></p>
</div>
<!-- ENDIF -->

View file

@ -0,0 +1,88 @@
<!-- INCLUDE mcp_header.html -->
<h2>{L_TITLE}</h2>
<form method="post" id="mcp" action="{U_POST_ACTION}">
<div class="panel">
<div class="inner">
<div class="action-bar bar-top">
{L_SEARCH_KEYWORDS}{L_COLON} <input type="search" class="inputbox autowidth" name="keywords" value="{S_KEYWORDS}" />&nbsp;<input type="submit" class="button1 button button-form-bold" name="filter" value="{L_SEARCH}" />
<div class="pagination">
{TOTAL}
<!-- IF .pagination -->
<!-- INCLUDE pagination.html -->
<!-- ELSE -->
&bull; {PAGE_NUMBER}
<!-- ENDIF -->
</div>
</div>
<table class="table1">
<thead>
<tr>
<th class="name">{L_USERNAME}</th>
<th class="center">{L_IP}</th>
<th class="center">{L_TIME}</th>
<th class="name">{L_ACTION}</th>
<!-- IF S_CLEAR_ALLOWED --><th>{L_MARK}</th><!-- ENDIF -->
</tr>
</thead>
<tbody>
<!-- IF S_LOGS -->
<!-- BEGIN log -->
<!-- IF log.S_ROW_COUNT is even --><tr class="bg1"><!-- ELSE --><tr class="bg2"><!-- ENDIF -->
<td>{log.USERNAME}</td>
<td class="center">{log.IP}</td>
<td class="center">{log.DATE}</td>
<td>{log.ACTION}<br />
{log.DATA}
</td>
<!-- IF S_CLEAR_ALLOWED --><td style="width: 5%" align="center"><input type="checkbox" name="mark[]" value="{log.ID}" /></td><!-- ENDIF -->
</tr>
<!-- END log -->
<!-- ELSE -->
<tr>
<td class="bg1" colspan="<!-- IF S_CLEAR_ALLOWED -->5<!-- ELSE -->4<!-- ENDIF -->" align="center"><span class="gen">{L_NO_ENTRIES}</span></td>
</tr>
<!-- ENDIF -->
</tbody>
</table>
<!-- IF .log -->
<div class="action-bar bottom">
<!-- INCLUDE display_options.html -->
<div class="pagination">
{TOTAL}
<!-- IF .pagination -->
<!-- INCLUDE pagination.html -->
<!-- ELSE -->
&bull; {PAGE_NUMBER}
<!-- ENDIF -->
</div>
</div>
{S_FORM_TOKEN}
</div>
</div>
<!-- IF S_CLEAR_ALLOWED -->
<fieldset class="display-actions">
<input class="button1 button button-form-bold" type="submit" name="action[del_all]" value="{L_DELETE_ALL}" />
&nbsp;<input class="button1 button button-form" type="submit" value="{L_DELETE_MARKED}" name="action[del_marked]" />
<div><a href="#" onclick="marklist('mcp', 'mark', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('mcp', 'mark', false); return false;">{L_UNMARK_ALL}</a></div>
</fieldset>
<!-- ENDIF -->
<!-- ELSE -->
{S_FORM_TOKEN}
</div>
</div>
<!-- ENDIF -->
</form>
<br />
<!-- INCLUDE mcp_footer.html -->

View file

@ -0,0 +1,8 @@
<!-- INCLUDE mcp_header.html -->
<div class="content">
<h2 class="message-title">{MESSAGE_TITLE}</h2>
<p>{MESSAGE_TEXT}</p>
</div>
<!-- INCLUDE mcp_footer.html -->

View file

@ -0,0 +1,73 @@
<!-- IF S_AJAX_REQUEST -->
<h3>{MESSAGE_TITLE}</h3>
<p>{MESSAGE_TEXT}</p>
<!-- IF ADDITIONAL_MSG --><p>{ADDITIONAL_MSG}</p><!-- ENDIF -->
<label>
<strong>{L_SELECT_DESTINATION_FORUM}{L_COLON}</strong>
<select name="to_forum_id">{S_FORUM_SELECT}</select>
</label>
<!-- IF S_CAN_LEAVE_SHADOW -->
<label for="move_leave_shadow">
<input type="checkbox" name="move_leave_shadow" id="move_leave_shadow" />{L_LEAVE_SHADOW}
</label>
<!-- ENDIF -->
<!-- IF S_CAN_LOCK_TOPIC -->
<label for="move_lock_topics">
<input type="checkbox" name="move_lock_topics" id="move_lock_topics" />{L_LOCK_TOPIC}
</label>
<!-- ENDIF -->
<fieldset class="submit-buttons">
<input type="button" name="confirm" value="{YES_VALUE}" class="button1 button button-form" />&nbsp;
<input type="button" name="cancel" value="{L_NO}" class="button1 button button-form-bold" />
</fieldset>
<!-- ELSE -->
<!-- INCLUDE overall_header.html -->
<!-- EVENT mcp_move_before -->
<form id="confirm" action="{S_CONFIRM_ACTION}" method="post">
<div class="panel">
<div class="inner">
<div class="content">
<h2 class="message-title">{MESSAGE_TITLE}</h2>
<!-- IF ADDITIONAL_MSG --><p>{ADDITIONAL_MSG}</p><!-- ENDIF -->
<fieldset>
{% EVENT mcp_move_destination_forum_before %}
<dl class="fields2">
<dt><label>{L_SELECT_DESTINATION_FORUM}{L_COLON}</label></dt>
<dd><select name="to_forum_id">{S_FORUM_SELECT}</select></dd>
<!-- IF S_CAN_LEAVE_SHADOW --><dd><label for="move_leave_shadow"><input type="checkbox" name="move_leave_shadow" id="move_leave_shadow" />{L_LEAVE_SHADOW}</label></dd><!-- ENDIF -->
<!-- IF S_CAN_LOCK_TOPIC --><dd><label for="move_lock_topics"><input type="checkbox" name="move_lock_topics" id="move_lock_topics" />{L_LOCK_TOPIC}</label></dd><!-- ENDIF -->
</dl>
{% EVENT mcp_move_destination_forum_after %}
<dl class="fields2">
<dt>&nbsp;</dt>
<dd><strong>{MESSAGE_TEXT}</strong></dd>
</dl>
</fieldset>
<fieldset class="submit-buttons">
{S_HIDDEN_FIELDS}<input type="submit" name="confirm" value="{YES_VALUE}" class="button1 button button-form" />&nbsp;
<input type="submit" name="cancel" value="{L_NO}" class="button1 button button-form-bold" />
{S_FORM_TOKEN}
</fieldset>
</div>
</div>
</div>
</form>
<!-- INCLUDE overall_footer.html -->
<!-- ENDIF -->

View file

@ -0,0 +1,27 @@
<!-- INCLUDE mcp_header.html -->
<form method="post" id="mcp" action="{U_POST_ACTION}">
<h2>{L_TITLE}</h2>
<div class="panel">
<div class="inner">
<fieldset>
<dl>
<dt><label for="username">{L_SELECT_USER}{L_COLON}</label></dt>
<dd><input name="username" id="username" type="text" class="inputbox" /></dd>
<dd><strong><a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a></strong></dd>
</dl>
</fieldset>
</div>
</div>
<fieldset class="submit-buttons">
<input type="submit" name="submituser" value="{L_SUBMIT}" class="button1 button button-form" />
{S_FORM_TOKEN}
</fieldset>
</form>
<!-- INCLUDE mcp_footer.html -->

View file

@ -0,0 +1,121 @@
<!-- INCLUDE mcp_header.html -->
<form method="post" id="mcp" action="{U_POST_ACTION}">
<h2>{L_TITLE}</h2>
<div class="panel">
<div class="inner">
<h3>{USERNAME_FULL}</h3>
<div>
<div class="column1">
<!-- IF AVATAR_HTML --><div>{AVATAR_HTML}</div><!-- ENDIF -->
</div>
<div class="column2">
<dl class="details">
<!-- IF RANK_TITLE --><dt>{L_RANK}{L_COLON}</dt><dd>{RANK_TITLE}</dd><!-- ENDIF -->
{% if RANK_IMG %}<dt>{% if RANK_TITLE %}&nbsp;{% else %}{{ lang('RANK') ~ lang('COLON') }}{% endif %}</dt><dd class="rank-img">{{ RANK_IMG }}</dd>{% endif %}
<dt>{L_JOINED}{L_COLON}</dt><dd>{JOINED}</dd>
<dt>{L_TOTAL_POSTS}{L_COLON}</dt><dd>{POSTS}</dd>
<dt>{L_WARNINGS}{L_COLON} </dt><dd>{WARNINGS}</dd>
</dl>
</div>
</div>
</div>
</div>
<div class="panel">
<div class="inner">
<h3>{L_ADD_FEEDBACK}</h3>
<p>{L_ADD_FEEDBACK_EXPLAIN}</p>
<fieldset>
<textarea name="usernote" id="usernote" class="inputbox" cols="40" rows="3"></textarea>
</fieldset>
</div>
</div>
<fieldset class="submit-buttons">
{S_HIDDEN_FIELDS}
<input type="submit" name="action[add_feedback]" value="{L_SUBMIT}" class="button1 button button-form" />
{S_FORM_TOKEN}
</fieldset>
<div class="panel">
<div class="inner">
<div class="action-bar bar-top">
{L_SEARCH_KEYWORDS}{L_COLON} <input type="search" class="inputbox autowidth" name="keywords" value="{S_KEYWORDS}" />&nbsp;<input type="submit" class="button1 button button-form-bold" name="filter" value="{L_SEARCH}" />
<div class="pagination">
{TOTAL_REPORTS}
<!-- IF .pagination -->
<!-- INCLUDE pagination.html -->
<!-- ELSE -->
&bull; {PAGE_NUMBER}
<!-- ENDIF -->
</div>
</div>
<table class="table1">
<thead>
<tr>
<th class="name reportby">{L_REPORT_BY}</th>
<th class="center">{L_IP}</th>
<th class="center">{L_TIME}</th>
<th>{L_ACTION_NOTE}</th>
<!-- IF S_CLEAR_ALLOWED --><th>{L_MARK}</th><!-- ENDIF -->
</tr>
</thead>
<tbody>
<!-- BEGIN usernotes -->
<!-- IF usernotes.S_ROW_COUNT is even --><tr class="bg1"><!-- ELSE --><tr class="bg2"><!-- ENDIF -->
<td>{usernotes.REPORT_BY}</td>
<td class="center">{usernotes.IP}</td>
<td class="center">{usernotes.REPORT_AT}</td>
<td>{usernotes.ACTION}</td>
<!-- IF S_CLEAR_ALLOWED --><td class="center" style="width: 5%;"><input type="checkbox" name="marknote[]" id="note-{usernotes.ID}" value="{usernotes.ID}" /></td><!-- ENDIF -->
</tr>
<!-- BEGINELSE -->
<tr>
<td class="bg1" colspan="<!-- IF S_CLEAR_ALLOWED -->5<!-- ELSE -->4<!-- ENDIF -->" align="center"><span class="gen">{L_NO_ENTRIES}</span></td>
</tr>
<!-- END usernotes -->
</tbody>
</table>
<div class="action-bar bottom">
<!-- INCLUDE display_options.html -->
<div class="pagination">
{TOTAL_REPORTS}
<!-- IF .pagination -->
<!-- INCLUDE pagination.html -->
<!-- ELSE -->
&bull; {PAGE_NUMBER}
<!-- ENDIF -->
</div>
</div>
</div>
</div>
<!-- IF S_CLEAR_ALLOWED -->
<fieldset class="display-actions">
<input class="button1 button button-form-bold" type="submit" name="action[del_all]" value="{L_DELETE_ALL}" />
&nbsp;<input class="button1 button button-form" type="submit" name="action[del_marked]" value="{L_DELETE_MARKED}" />
</fieldset>
<fieldset class="display-actions">
<div><a href="#" onclick="marklist('mcp', 'marknote', true); return false;">{L_MARK_ALL}</a> &bull; <a href="#" onclick="marklist('mcp', 'marknote', false); return false;">{L_UNMARK_ALL}</a></div>
</fieldset>
<!-- ENDIF -->
</form>
<!-- INCLUDE mcp_footer.html -->

View file

@ -0,0 +1,367 @@
<!-- INCLUDE mcp_header.html -->
<!-- IF S_MCP_REPORT -->
<!-- IF S_PM -->
<h2>{L_PM_REPORT_DETAILS}</h2>
<!-- ELSE -->
<h2>{L_REPORT_DETAILS}</h2>
<!-- ENDIF -->
<div id="report" class="panel">
<div class="inner">
<div class="postbody">
<h3>{L_REPORT_REASON}{L_COLON} {REPORT_REASON_TITLE}</h3>
<p class="author">{L_REPORTED} {L_POST_BY_AUTHOR} {REPORTER_FULL} &laquo; {REPORT_DATE}</p>
<!-- IF S_REPORT_CLOSED -->
<p class="post-notice reported">{{ Icon('font', 'exclamation', '', true, 'fas c-topic-reported-icon') }}{L_REPORT_CLOSED}</p>
<!-- ENDIF -->
<div class="content">
<!-- IF REPORT_TEXT -->
{REPORT_TEXT}
<!-- ELSE -->
{REPORT_REASON_DESCRIPTION}
<!-- ENDIF -->
</div>
</div>
</div>
</div>
<form method="post" id="mcp_report" action="{S_CLOSE_ACTION}">
<fieldset class="submit-buttons">
{% EVENT mcp_post_report_buttons_top_before %}
<!-- IF not S_REPORT_CLOSED -->
<input class="button1 button button-form" type="submit" value="{L_CLOSE_REPORT}" name="action[close]" /> &nbsp;
<!-- ENDIF -->
<input class="button1 button button-form-bold" type="submit" value="{L_DELETE_REPORT}" name="action[delete]" />
{% EVENT mcp_post_report_buttons_top_after %}
<input type="hidden" name="report_id_list[]" value="{REPORT_ID}" />
{S_FORM_TOKEN}
</fieldset>
</form>
<!-- ELSE -->
<h2>{L_POST_DETAILS}</h2>
<!-- ENDIF -->
<div class="panel">
<div class="inner">
<div class="postbody">
<h3><a href="{U_VIEW_POST}">{POST_SUBJECT}</a></h3>
<ul class="post-buttons">
<li id="expand">
<a href="#post_details" onclick="viewableArea(getElementById('post_details'), true); var rev_text = getElementById('expand').getElementsByTagName('a').item(0).firstChild; if (rev_text.data.trim() == '{LA_EXPAND_VIEW}'){rev_text.data = '{LA_COLLAPSE_VIEW}'; } else if (rev_text.data.trim() == '{LA_COLLAPSE_VIEW}'){rev_text.data = '{LA_EXPAND_VIEW}';} return false;">
{L_EXPAND_VIEW}
</a>
</li>
<!-- IF U_EDIT -->
<li>
<a href="{U_EDIT}" title="{L_EDIT_POST}" class="button">
{{ Icon('font', 'pencil', lang('EDIT_POST'), true, 'fas c-button-icon') }}
</a>
</li>
<!-- ENDIF -->
</ul>
<!-- IF S_PM -->
<p class="author">
<strong>{L_SENT_AT}{L_COLON}</strong> {POST_DATE}
<br /><strong>{L_PM_FROM}{L_COLON}</strong> {POST_AUTHOR_FULL}
<!-- IF S_TO_RECIPIENT --><br /><strong>{L_TO}{L_COLON}</strong> <!-- BEGIN to_recipient --><!-- IF to_recipient.NAME_FULL -->{to_recipient.NAME_FULL}<!-- ELSE --><a href="{to_recipient.U_VIEW}"<!-- IF to_recipient.COLOUR --> style="color:{to_recipient.COLOUR};"<!-- ENDIF -->><strong>{to_recipient.NAME}</strong></a><!-- ENDIF -->&nbsp;<!-- END to_recipient --><!-- ENDIF -->
<!-- IF S_BCC_RECIPIENT --><br /><strong>{L_BCC}{L_COLON}</strong> <!-- BEGIN bcc_recipient --><!-- IF bcc_recipient.NAME_FULL -->{bcc_recipient.NAME_FULL}<!-- ELSE --><a href="{bcc_recipient.U_VIEW}"<!-- IF bcc_recipient.COLOUR --> style="color:{bcc_recipient.COLOUR};"<!-- ENDIF -->><strong>{bcc_recipient.NAME}</strong></a><!-- ENDIF -->&nbsp;<!-- END bcc_recipient --><!-- ENDIF -->
</p>
<!-- ELSE -->
<p class="author"><span>{{ Icon('font', 'file', MINI_POST, true, 'fas c-topic-icon') }}</span> {L_POSTED} {L_POST_BY_AUTHOR} {POST_AUTHOR_FULL} &raquo; {POST_DATE}</p>
<!-- ENDIF -->
{% if S_CAN_APPROVE %}
<!-- IF S_POST_UNAPPROVED -->
<form method="post" id="mcp_approve" action="{U_APPROVE_ACTION}">
<p class="post-notice unapproved">
<input class="button1 button button-form-bold" type="submit" value="{L_DISAPPROVE}" name="action[disapprove]" /> &nbsp;
<input class="button1 button button-form" type="submit" value="{L_APPROVE}" name="action[approve]" />
<!-- IF not S_FIRST_POST --><input type="hidden" name="mode" value="unapproved_posts" /><!-- ENDIF -->
<input type="hidden" name="post_id_list[]" value="{POST_ID}" />
{S_FORM_TOKEN}
</p>
</form>
<!-- ELSEIF S_POST_DELETED -->
<form method="post" id="mcp_approve" action="{U_APPROVE_ACTION}">
<p class="post-notice deleted">
<!-- IF S_CAN_DELETE_POST --><input class="button1 button button-form-bold" type="submit" value="{L_DELETE}" name="action[delete]" /> &nbsp;<!-- ENDIF -->
<input class="button1 button button-form" type="submit" value="{L_RESTORE}" name="action[restore]" />
<!-- IF not S_FIRST_POST --><input type="hidden" name="mode" value="deleted_posts" /><!-- ENDIF -->
<input type="hidden" name="post_id_list[]" value="{POST_ID}" />
{S_FORM_TOKEN}
</p>
</form>
<!-- ENDIF -->
{% endif %}
{% if S_POST_REPORTED and not S_MCP_REPORT %}
<p class="post-notice reported">
{{ Icon('font', 'exclamation', lang('TOPIC_REPORTED'), true, 'fas c-topic-reported-icon') }}
<a href="{U_MCP_REPORT}"><strong>{{ lang('POST_REPORTED') }}</strong></a>
</p>
{% endif %}
{% EVENT mcp_post_text_before %}
<div id="post_details" class="content post_details">
{POST_PREVIEW}
</div>
{% EVENT mcp_post_text_after %}
<!-- IF S_HAS_ATTACHMENTS -->
<dl class="attachbox">
<dt>{L_ATTACHMENTS}</dt>
<!-- BEGIN attachment -->
<dd>{attachment.DISPLAY_ATTACHMENT}</dd>
<!-- END attachment -->
</dl>
<!-- ENDIF -->
<!-- IF DELETED_MESSAGE or DELETE_REASON -->
<div class="notice">
{DELETED_MESSAGE}
<!-- IF DELETE_REASON --><br /><strong>{L_REASON}{L_COLON}</strong> <em>{DELETE_REASON}</em><!-- ENDIF -->
</div>
<!-- ENDIF -->
<!-- IF SIGNATURE -->
<div id="sig{POST_ID}" class="signature">{SIGNATURE}</div>
<!-- ENDIF -->
<!-- IF S_MCP_REPORT and S_CAN_VIEWIP -->
<hr />
<div><!-- IF S_PM -->{L_THIS_PM_IP}<!-- ELSE -->{L_THIS_POST_IP}<!-- ENDIF -->{L_COLON} <!-- IF U_WHOIS -->
<a href="{U_WHOIS}"><!-- IF POST_IPADDR -->{POST_IPADDR}<!-- ELSE -->{POST_IP}<!-- ENDIF --></a> (<!-- IF POST_IPADDR -->{POST_IP}<!-- ELSE --><a href="{U_LOOKUP_IP}">{L_LOOKUP_IP}</a><!-- ENDIF -->)
<!-- ELSE -->
<!-- IF POST_IPADDR -->{POST_IPADDR} ({POST_IP})<!-- ELSE -->{POST_IP}<!-- IF U_LOOKUP_IP --> (<a href="{U_LOOKUP_IP}">{L_LOOKUP_IP}</a>)<!-- ENDIF --><!-- ENDIF -->
<!-- ENDIF --></div>
<!-- ENDIF -->
</div>
</div>
</div>
<!-- IF S_CAN_LOCK_POST or S_CAN_DELETE_POST or S_CAN_CHGPOSTER or S_MCP_POST_ADDITIONAL_OPTS -->
<div class="panel">
<div class="inner">
<h3>{L_MOD_OPTIONS}</h3>
<!-- IF S_CAN_CHGPOSTER -->
<form method="post" id="mcp_chgposter" action="{U_POST_ACTION}">
<fieldset>
<dl>
<dt><label>{L_CHANGE_POSTER}{L_COLON}</label></dt>
<!-- IF S_USER_SELECT --><dd><select name="u">{S_USER_SELECT}</select> <input type="submit" class="button1 button button-form-bold" name="action[chgposter_ip]" value="{L_CONFIRM}" /></dd><!-- ENDIF -->
<dd style="margin-top:3px;">
<input class="inputbox autowidth" type="text" name="username" value="" />
<input type="submit" class="button1 button button-form-bold" name="action[chgposter]" value="{L_CONFIRM}" />
<br />
<span>[ <a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a> ]</span>
</dd>
</dl>
{S_FORM_TOKEN}
</fieldset>
</form>
<!-- ENDIF -->
<!-- EVENT mcp_post_additional_options -->
<!-- IF S_CAN_LOCK_POST or S_CAN_DELETE_POST -->
<form method="post" id="mcp" action="{U_MCP_ACTION}">
<fieldset>
<dl>
<dt><label>{L_MOD_OPTIONS}{L_COLON}</label></dt>
<dd><select name="action">
<!-- IF S_CAN_LOCK_POST --><!-- IF S_POST_LOCKED --><option value="unlock_post">{L_UNLOCK_POST} [{L_UNLOCK_POST_EXPLAIN}]</option><!-- ELSE --><option value="lock_post">{L_LOCK_POST} [{L_LOCK_POST_EXPLAIN}]</option><!-- ENDIF --><!-- ENDIF -->
<!-- IF S_CAN_DELETE_POST --><option value="delete_post">{L_DELETE_POST}</option><!-- ENDIF -->
</select> <input class="button1 button button-form-bold" type="submit" value="{L_SUBMIT}" />
</dd>
</dl>
{S_FORM_TOKEN}
</fieldset>
</form>
<!-- ENDIF -->
</div>
</div>
<!-- ENDIF -->
<!-- IF S_MCP_QUEUE or S_MCP_REPORT or RETURN_TOPIC -->
<div class="panel">
<div class="inner">
<p><!-- IF S_MCP_QUEUE -->{RETURN_QUEUE} | {RETURN_TOPIC_SIMPLE} | {RETURN_POST}<!-- ELSEIF S_MCP_REPORT -->{RETURN_REPORTS}<!-- IF not S_PM --> | <a href="{U_VIEW_POST}">{L_VIEW_POST}</a> | <a href="{U_VIEW_TOPIC}">{L_VIEW_TOPIC}</a> | <a href="{U_VIEW_FORUM}">{L_VIEW_FORUM}</a><!-- ENDIF --><!-- ELSE -->{RETURN_TOPIC}<!-- ENDIF --></p>
</div>
</div>
<!-- ENDIF -->
<!-- IF S_MCP_QUEUE -->
<!-- ELSE -->
<!-- IF S_SHOW_USER_NOTES -->
<div class="panel" id="usernotes">
<div class="inner">
<form method="post" id="mcp_notes" action="{U_POST_ACTION}">
<!-- IF S_USER_NOTES -->
<h3>{L_FEEDBACK}</h3>
<!-- BEGIN usernotes -->
<span class="small"><strong>{L_REPORTED_BY}{L_COLON} {usernotes.REPORT_BY} &laquo; {usernotes.REPORT_AT}</strong></span>
<!-- IF S_CLEAR_ALLOWED --><div class="right-box"><input type="checkbox" name="marknote[]" value="{usernotes.ID}" /></div><!-- ENDIF -->
<div class="postbody">{usernotes.ACTION}</div>
<hr class="dashed" />
<!-- END usernotes -->
<!-- IF S_CLEAR_ALLOWED -->
<fieldset class="submit-buttons">
<input class="button1 button button-form-bold" type="submit" name="action[del_all]" value="{L_DELETE_ALL}" />&nbsp;
<input class="button1 button button-form-bold" type="submit" name="action[del_marked]" value="{L_DELETE_MARKED}" />
</fieldset>
<!-- ENDIF -->
<!-- ENDIF -->
<h3>{L_ADD_FEEDBACK}</h3>
<p>{L_ADD_FEEDBACK_EXPLAIN}</p>
<fieldset>
<textarea name="usernote" rows="4" cols="76" class="inputbox"></textarea>
</fieldset>
<fieldset class="submit-buttons">
<input class="button1 button button-form" type="submit" name="action[add_feedback]" value="{L_SUBMIT}" />&nbsp;
<input class="button1 button button-form-bold" type="reset" value="{L_RESET}" />
{S_FORM_TOKEN}
</fieldset>
</form>
</div>
</div>
<!-- ENDIF -->
<!-- IF S_SHOW_REPORTS -->
<div class="panel" id="reports">
<div class="inner">
<h3>{L_MCP_POST_REPORTS}</h3>
<!-- BEGIN reports -->
<span class="small"><strong>{L_REPORTED_BY}{L_COLON} <!-- IF reports.U_REPORTER --><a href="{reports.U_REPORTER}">{reports.REPORTER}</a><!-- ELSE -->{reports.REPORTER}<!-- ENDIF --> &laquo; {reports.REPORT_TIME}</strong></span>
<p><em>{reports.REASON_TITLE}{L_COLON} {reports.REASON_DESC}</em><!-- IF reports.REPORT_TEXT --><br />{reports.REPORT_TEXT}<!-- ENDIF --></p>
<!-- END reports -->
</div>
</div>
<!-- ENDIF -->
<!-- IF S_CAN_VIEWIP and not S_MCP_REPORT -->
<div class="panel" id="ip">
<div class="inner">
<p>{L_THIS_POST_IP}{L_COLON} <!-- IF U_WHOIS -->
<a href="{U_WHOIS}"><!-- IF POST_IPADDR -->{POST_IPADDR}<!-- ELSE -->{POST_IP}<!-- ENDIF --></a> (<!-- IF POST_IPADDR -->{POST_IP}<!-- ELSE --><a href="{U_LOOKUP_IP}">{L_LOOKUP_IP}</a><!-- ENDIF -->)
<!-- ELSE -->
<!-- IF POST_IPADDR -->{POST_IPADDR} ({POST_IP})<!-- ELSE -->{POST_IP}<!-- IF U_LOOKUP_IP --> (<a href="{U_LOOKUP_IP}">{L_LOOKUP_IP}</a>)<!-- ENDIF --><!-- ENDIF -->
<!-- ENDIF --></p>
<table class="table1">
<thead>
<tr>
<th class="name">{L_OTHER_USERS}</th>
<th class="posts">{L_POSTS}</th>
</tr>
</thead>
<tbody>
<!-- BEGIN userrow -->
<tr class="<!-- IF userrow.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
<td><!-- IF userrow.U_PROFILE --><a href="{userrow.U_PROFILE}">{userrow.USERNAME}</a><!-- ELSE -->{userrow.USERNAME}<!-- ENDIF --></td>
<td class="posts"><a href="{userrow.U_SEARCHPOSTS}" title="{L_SEARCH_POSTS_BY} {userrow.USERNAME}">{userrow.NUM_POSTS}</a></td>
</tr>
<!-- BEGINELSE -->
<tr>
<td colspan="2">{L_NO_MATCHES_FOUND}</td>
</tr>
<!-- END userrow -->
</tbody>
</table>
<div class="pagination">
<!-- INCLUDE pagination.html -->
</div>
</div>
</div>
<div class="panel">
<div class="inner">
<table class="table1">
<thead>
<tr>
<th class="name">{L_IPS_POSTED_FROM}</th>
<th class="posts">{L_POSTS}</th>
</tr>
</thead>
<tbody>
<!-- BEGIN iprow -->
<tr class="<!-- IF iprow.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
<td><!-- IF iprow.HOSTNAME --><a href="{iprow.U_WHOIS}">{iprow.HOSTNAME}</a> ({iprow.IP})<!-- ELSE --><a href="{iprow.U_WHOIS}">{iprow.IP}</a> (<a href="{iprow.U_LOOKUP_IP}">{L_LOOKUP_IP}</a>)<!-- ENDIF --></td>
<td class="posts">{iprow.NUM_POSTS}</td>
</tr>
<!-- BEGINELSE -->
<tr>
<td colspan="2">{L_NO_MATCHES_FOUND}</td>
</tr>
<!-- END iprow -->
</tbody>
</table>
{% if U_LOOKUP_ALL %}
<div class="buttons">
<p><a href="{U_LOOKUP_ALL}#ip">{L_LOOKUP_ALL}</a></p>
</div>
{% endif %}
<div class="pagination">
<ul>
<!-- BEGIN pagination_ips -->
<!-- IF pagination_ips.S_IS_PREV -->
<li class="arrow previous"><a class="button button-icon-only" href="{pagination_ips.PAGE_URL}" rel="prev" role="button">{{ Icon('font', 'chevron-' ~ S_CONTENT_FLOW_BEGIN, lang('PREVIOUS'), true, 'fas c-button-icon') }}</a></li>
<!-- ELSEIF pagination_ips.S_IS_CURRENT -->
<li class="active"><span>{pagination_ips.PAGE_NUMBER}</span></li>
<!-- ELSEIF pagination_ips.S_IS_ELLIPSIS -->
<li class="ellipsis" role="separator"><span>{L_ELLIPSIS}</span></li>
<!-- ELSEIF pagination_ips.S_IS_NEXT -->
<li class="arrow next"><a class="button button-icon-only" href="{pagination_ips.PAGE_URL}" rel="next" role="button">{{ Icon('font', 'chevron-' ~ S_CONTENT_FLOW_END, lang('NEXT'), true, 'fas c-button-icon') }}</a></li>
<!-- ELSE -->
<li><a class="button" href="{pagination_ips.PAGE_URL}" role="button">{pagination_ips.PAGE_NUMBER}</a></li>
<!-- ENDIF -->
<!-- END pagination_ips -->
</ul>
</div>
</div>
</div>
<!-- ENDIF -->
<!-- ENDIF -->
<!-- IF S_TOPIC_REVIEW --><!-- INCLUDE posting_topic_review.html --><!-- ENDIF -->
<!-- INCLUDE mcp_footer.html -->

View file

@ -0,0 +1,123 @@
<!-- INCLUDE mcp_header.html -->
<form id="mcp" method="post" action="{S_MCP_ACTION}">
<fieldset class="forum-selection">
<label for="fo">{L_FORUM}{L_COLON} <select name="f" id="fo">{S_FORUM_OPTIONS}</select></label>
<input type="submit" name="sort" value="{L_GO}" class="button1 button button-form-bold" />
{S_FORM_TOKEN}
</fieldset>
<h2>{L_TITLE}</h2>
<div class="panel">
<div class="inner">
<p>{L_EXPLAIN}</p>
<!-- IF .postrow -->
<div class="action-bar bar-top">
<div class="pagination">
{TOTAL}
<!-- IF .pagination -->
<!-- INCLUDE pagination.html -->
<!-- ELSE -->
&bull; {PAGE_NUMBER}
<!-- ENDIF -->
</div>
</div>
<ul class="topiclist missing-column">
<li class="header">
<dl>
<dt><div class="list-inner"><!-- IF S_TOPICS -->{L_TOPIC}<!-- ELSE -->{L_POST}<!-- ENDIF --></div></dt>
<dd class="moderation"><span><!-- IF not S_TOPICS -->{L_TOPIC} &amp; <!-- ENDIF -->{L_FORUM}</span></dd>
<dd class="mark">{L_MARK}</dd>
</dl>
</li>
</ul>
<ul class="topiclist cplist missing-column responsive-show-all">
<!-- BEGIN postrow -->
<!-- IF postrow.S_DELETED_TOPIC -->
<li><p class="notopics">{L_DELETED_TOPIC}</p></li>
<!-- ELSE -->
<li class="row<!-- IF postrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
<dl>
<dt>
<div class="list-inner">
<a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.POST_SUBJECT}</a><!-- IF postrow.S_HAS_ATTACHMENTS --> {{ Icon('font', 'paperclip', '', true) }} <!-- ENDIF --><br />
<span>{L_POSTED} {L_POST_BY_AUTHOR} {postrow.POST_AUTHOR_FULL} &raquo; {postrow.POST_TIME}</span>
</div>
</dt>
<dd class="moderation">
<span>
<!-- IF S_TOPICS --><br /><!-- ELSE -->{L_TOPIC}{L_COLON} <a href="{postrow.U_TOPIC}">{postrow.TOPIC_TITLE}</a> <br /><!-- ENDIF -->
{L_FORUM}{L_COLON} <a href="{postrow.U_VIEWFORUM}">{postrow.FORUM_NAME}</a>
</span>
</dd>
<dd class="mark">
<!-- IF S_TOPICS -->
<input type="checkbox" name="topic_id_list[]" value="{postrow.TOPIC_ID}" />
<!-- ELSE -->
<input type="checkbox" name="post_id_list[]" value="{postrow.POST_ID}" />
<!-- ENDIF -->
</dd>
</dl>
</li>
<!-- ENDIF -->
<!-- END postrow -->
</ul>
<div class="action-bar bottom">
<!-- INCLUDE display_options.html -->
<!-- IF TOPIC_ID --><label><input type="checkbox" class="radio" name="t" value="{TOPIC_ID}" checked="checked" onClick="document.getElementById('mcp').submit()" /> <strong>{L_ONLY_TOPIC}</strong></label><!-- ENDIF -->
<div class="pagination">
{TOTAL}
<!-- IF .pagination -->
<!-- INCLUDE pagination.html -->
<!-- ELSE -->
&bull; {PAGE_NUMBER}
<!-- ENDIF -->
</div>
</div>
<!-- ELSE -->
<p class="notopics"><strong>
<!-- IF S_RESTORE -->
<!-- IF S_TOPICS -->{L_NO_TOPICS_DELETED}<!-- ELSE -->{L_NO_POSTS_DELETED}<!-- ENDIF -->
<!-- ELSE -->
<!-- IF S_TOPICS -->{L_NO_TOPICS_QUEUE}<!-- ELSE -->{L_NO_POSTS_QUEUE}<!-- ENDIF -->
<!-- ENDIF -->
</strong></p>
<!-- ENDIF -->
</div>
</div>
<!-- IF .postrow -->
<fieldset class="display-actions">
<!-- IF S_RESTORE -->
<input class="button1 button button-form-bold" type="submit" name="action[delete]" value="{L_DELETE}" />&nbsp;
<input class="button1 button button-form" type="submit" name="action[restore]" value="{L_RESTORE}" />
<!-- ELSE -->
<input class="button1 button button-form-bold" type="submit" name="action[disapprove]" value="{L_DISAPPROVE}" />&nbsp;
<input class="button1 button button-form" type="submit" name="action[approve]" value="{L_APPROVE}" />
<!-- ENDIF -->
<div>
<!-- IF S_TOPICS -->
<a href="#" onclick="marklist('mcp', 'topic_id_list', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('mcp', 'topic_id_list', false); return false;">{L_UNMARK_ALL}</a>
<!-- ELSE -->
<a href="#" onclick="marklist('mcp', 'post_id_list', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('mcp', 'post_id_list', false); return false;">{L_UNMARK_ALL}</a>
<!-- ENDIF -->
</div>
</fieldset>
<!-- ENDIF -->
</form>
<!-- INCLUDE mcp_footer.html -->

View file

@ -0,0 +1,122 @@
<!-- INCLUDE mcp_header.html -->
<form id="mcp" method="post" action="{S_MCP_ACTION}">
<!-- IF not S_PM -->
<fieldset class="forum-selection">
<label for="fo">{L_FORUM}{L_COLON} <select name="f" id="fo">{S_FORUM_OPTIONS}</select></label>
<input type="submit" name="sort" value="{L_GO}" class="button1 button button-form-bold" />
{S_FORM_TOKEN}
</fieldset>
<!-- ENDIF -->
<h2>{L_TITLE}</h2>
<div class="panel">
<div class="inner">
<p>{L_EXPLAIN}</p>
<!-- IF .postrow -->
<div class="action-bar bar-top">
<div class="pagination">
{TOTAL_REPORTS}
<!-- IF .pagination -->
<!-- INCLUDE pagination.html -->
<!-- ELSE -->
&bull; {PAGE_NUMBER}
<!-- ENDIF -->
</div>
</div>
<ul class="topiclist missing-column">
<li class="header">
<dl>
<dt><div class="list-inner">{L_VIEW_DETAILS}</div></dt>
<dd class="moderation"><span>{L_REPORTER}<!-- IF not S_PM --> &amp; {L_FORUM}<!-- ENDIF --></span></dd>
<dd class="mark">{L_MARK}</dd>
</dl>
</li>
</ul>
<ul class="topiclist cplist missing-column">
<!-- BEGIN postrow -->
<li class="row<!-- IF postrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
<dl>
<!-- IF S_PM -->
<dt>
<div class="list-inner">
<a href="{{ postrow.U_VIEW_DETAILS }}" class="topictitle">{{ postrow.PM_SUBJECT }}</a>
{% if postrow.ATTACH_ICON_IMG %}{{ Icon('font', 'paperclip', '', true) }}{% endif %}
<br>
<span>{L_MESSAGE_BY_AUTHOR} {postrow.PM_AUTHOR_FULL} &raquo; {postrow.PM_TIME}</span><br />
<span>{L_MESSAGE_TO} {postrow.RECIPIENTS}</span>
<div class="responsive-show" style="display: none;">
{L_REPORTER}{L_COLON} {postrow.REPORTER_FULL} &laquo; {postrow.REPORT_TIME}
</div>
</div>
</dt>
<dd class="moderation">
<span>{postrow.REPORTER_FULL} &laquo; {postrow.REPORT_TIME}</span>
</dd>
<!-- ELSE -->
<dt>
<div class="list-inner">
<a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.POST_SUBJECT}</a>
{% if postrow.ATTACH_ICON_IMG %}{{ Icon('font', 'paperclip', '', true) }} {% endif %}
<br>
<span>{L_POSTED} {L_POST_BY_AUTHOR} {postrow.POST_AUTHOR_FULL} &raquo; {postrow.POST_TIME}</span>
<div class="responsive-show" style="display: none;">
{L_REPORTER}{L_COLON} {postrow.REPORTER_FULL} &laquo; {postrow.REPORT_TIME}<br />
<!-- IF postrow.U_VIEWFORUM -->{L_FORUM}{L_COLON} <a href="{postrow.U_VIEWFORUM}">{postrow.FORUM_NAME}</a><!-- ELSE -->{postrow.FORUM_NAME}<!-- ENDIF -->
</div>
</div>
</dt>
<dd class="moderation">
<span>{postrow.REPORTER_FULL} &laquo; {postrow.REPORT_TIME}<br />
<!-- IF postrow.U_VIEWFORUM -->{L_FORUM}{L_COLON} <a href="{postrow.U_VIEWFORUM}">{postrow.FORUM_NAME}</a><!-- ELSE -->{postrow.FORUM_NAME}<!-- ENDIF --></span>
</dd>
<!-- ENDIF -->
<dd class="mark"><input type="checkbox" name="report_id_list[]" value="{postrow.REPORT_ID}" /></dd>
</dl>
</li>
<!-- END postrow -->
</ul>
<div class="action-bar bottom">
<!-- INCLUDE display_options.html -->
<!-- IF TOPIC_ID -->
<label>
<input type="hidden" name="t" value="0">
<input type="checkbox" class="radio" name="t" value="{TOPIC_ID}" checked="checked" onClick="document.getElementById('mcp').submit()" />
<strong>{L_ONLY_TOPIC}</strong>
</label>
<!-- ENDIF -->
<div class="pagination">
{TOTAL_REPORTS}
<!-- IF .pagination -->
<!-- INCLUDE pagination.html -->
<!-- ELSE -->
&bull; {PAGE_NUMBER}
<!-- ENDIF -->
</div>
</div>
<!-- ELSE -->
<p><strong>{L_NO_REPORTS}</strong></p>
<!-- ENDIF -->
</div>
</div>
<!-- IF .postrow -->
<fieldset class="display-actions">
<input class="button1 button button-form-bold" type="submit" value="{L_DELETE_REPORTS}" name="action[delete]" />
<!-- IF not S_CLOSED -->&nbsp;<input class="button1 button button-form" type="submit" name="action[close]" value="{L_CLOSE_REPORTS}" /><!-- ENDIF -->
<div><a href="#" onclick="marklist('mcp', 'report_id_list', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('mcp', 'report_id_list', false); return false;">{L_UNMARK_ALL}</a></div>
</fieldset>
<!-- ENDIF -->
</form>
<!-- INCLUDE mcp_footer.html -->

View file

@ -0,0 +1,207 @@
<!-- INCLUDE mcp_header.html -->
<div class="tabs-container">
<h2><a href="{U_VIEW_TOPIC}">{L_TOPIC}{L_COLON} {TOPIC_TITLE}</a></h2>
<!-- IF S_MERGE_VIEW -->
<!-- DEFINE $SHOW_PANEL = 'merge-panel' -->
<!-- ELSEIF S_SPLIT_VIEW -->
<!-- DEFINE $SHOW_PANEL = 'split-panel' -->
<!-- ELSE -->
<!-- DEFINE $SHOW_PANEL = 'display-panel' -->
<!-- ENDIF -->
<div id="minitabs" class="minitabs sub-panels" data-show-panel="{$SHOW_PANEL}" role="tablist">
<ul>
<li id="display-panel-tab" class="tab<!-- IF not S_MERGE_VIEW --> activetab<!-- ENDIF -->">
<a href="#minitabs" data-subpanel="display-panel" role="tab" aria-controls="display-panel">{L_DISPLAY_OPTIONS}</a>
</li>
<li id="split-panel-tab" class="tab">
<a href="#minitabs" data-subpanel="split-panel" role="tab" aria-controls="split-panel">{L_SPLIT_TOPIC}</a>
</li>
<li id="merge-panel-tab" class="tab<!-- IF S_MERGE_VIEW --> activetab<!-- ENDIF -->">
<a href="#minitabs" data-subpanel="merge-panel" role="tab" aria-controls="merge-panel">{L_MERGE_POSTS}</a>
</li>
</ul>
</div>
</div>
<form id="mcp" method="post" action="{S_MCP_ACTION}">
<div class="panel">
<div class="inner">
<fieldset id="display-panel" class="fields2" role="tabpanel">
<dl>
<dt><label for="posts_per_page">{L_POSTS_PER_PAGE}{L_COLON}</label><br /><span>{L_POSTS_PER_PAGE_EXPLAIN}</span></dt>
<dd><input class="inputbox autowidth" type="number" min="0" max="999999" name="posts_per_page" id="posts_per_page" value="{POSTS_PER_PAGE}" /></dd>
</dl>
<dl>
<dt><label>{L_DISPLAY_POSTS}{L_COLON}</label></dt>
<dd>{S_SELECT_SORT_DAYS}&nbsp;&nbsp;<label>{L_SORT_BY} {S_SELECT_SORT_KEY}</label><label>{S_SELECT_SORT_DIR}</label> <input type="submit" name="sort" value="{L_GO}" class="button1 button button-form-bold" /></dd>
</dl>
</fieldset>
<!-- IF S_CAN_SPLIT -->
<fieldset id="split-panel" class="fields2" role="tabpanel">
<p>{L_SPLIT_TOPIC_EXPLAIN}</p>
<!-- IF S_SHOW_TOPIC_ICONS -->
<dl>
<dt><label for="icon">{L_TOPIC_ICON}{L_COLON}</label></dt>
<dd><label for="icon"><input type="radio" name="icon" id="icon" value="0" checked="checked" /> {L_NO_TOPIC_ICON}</label>
<!-- BEGIN topic_icon --><label for="icon-{topic_icon.ICON_ID}"><input type="radio" name="icon" id="icon-{topic_icon.ICON_ID}" value="{topic_icon.ICON_ID}" {topic_icon.S_ICON_CHECKED} /><img src="{topic_icon.ICON_IMG}" width="{topic_icon.ICON_WIDTH}" height="{topic_icon.ICON_HEIGHT}" alt="" title="" /></label> <!-- END topic_icon --></dd>
</dl>
<!-- ENDIF -->
<!-- EVENT mcp_topic_options_before -->
<dl>
<dt><label for="subject">{L_SPLIT_SUBJECT}{L_COLON}</label></dt>
<dd><input type="text" name="subject" id="subject" size="45" maxlength="124" tabindex="2" value="{SPLIT_SUBJECT}" title="{L_SPLIT_SUBJECT}" class="inputbox" /></dd>
</dl>
<!-- EVENT mcp_topic_options_after -->
<dl>
<dt><label>{L_SPLIT_FORUM}{L_COLON}</label></dt>
<dd><select name="to_forum_id">{S_FORUM_SELECT}</select></dd>
</dl>
</fieldset>
<!-- ENDIF -->
<!-- IF S_CAN_MERGE -->
<fieldset id="merge-panel" class="fields2" role="tabpanel">
<p>{L_MERGE_TOPIC_EXPLAIN}</p>
<dl>
<dt><label for="to_topic_id">{L_MERGE_TOPIC_ID}{L_COLON}</label></dt>
<dd>
<input class="inputbox autowidth" type="number" min="0" max="9999999999" name="to_topic_id" id="to_topic_id" value="{TO_TOPIC_ID}" />
<a href="{U_SELECT_TOPIC}" >{L_SELECT_TOPIC}</a>
</dd>
<!-- IF TO_TOPIC_INFO --><dd>{TO_TOPIC_INFO}</dd><!-- ENDIF -->
</dl>
</fieldset>
<!-- ENDIF -->
</div>
</div>
<div class="panel">
<div class="inner">
<h3 id="review" class="review">
<span class="right-box"><a href="#review" onclick="viewableArea(getElementById('topicreview'), true); var rev_text = getElementById('review').getElementsByTagName('a').item(0).firstChild; if (rev_text.data == '{LA_EXPAND_VIEW}'){rev_text.data = '{LA_COLLAPSE_VIEW}'; } else if (rev_text.data == '{LA_COLLAPSE_VIEW}'){rev_text.data = '{LA_EXPAND_VIEW}'};">{L_EXPAND_VIEW}</a></span>
{L_TOPIC_REVIEW}{L_COLON} <!-- EVENT mcp_topic_topic_title_before -->{TOPIC_TITLE}<!-- EVENT mcp_topic_topic_title_after -->
</h3>
<div id="topicreview" class="topicreview">
<!-- BEGIN postrow -->
<!-- EVENT mcp_topic_postrow_post_before -->
<!-- IF postrow.S_FIRST_UNREAD -->
<a id="unread" class="anchor"<!-- IF S_UNREAD_VIEW --> data-url="{postrow.U_MINI_POST}"<!-- ENDIF -->></a>
<!-- ENDIF -->
<div class="post <!-- IF postrow.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
<div class="inner">
<div class="postbody" id="pr{postrow.POST_ID}">
<ul class="post-buttons">
<li>
<a href="{postrow.U_POST_DETAILS}" title="{L_POST_DETAILS}" class="button button-icon-only">
{{ Icon('font', 'info', lang('POST_DETAILS'), true, 'fas c-button-icon') }}
</a>
</li>
<li>
<label for="post_id_list_select_{postrow.POST_ID}">{L_SELECT}{L_COLON}
<input type="checkbox" id="post_id_list_select_{postrow.POST_ID}" name="post_id_list[]" value="{postrow.POST_ID}"<!-- IF postrow.S_CHECKED --> checked="checked"<!-- ENDIF --> />
</label>
</li>
</ul>
<!-- EVENT mcp_topic_postrow_post_subject_before -->
<h3><a href="{postrow.U_POST_DETAILS}">{postrow.POST_SUBJECT}</a></h3>
<!-- EVENT mcp_topic_postrow_post_subject_after -->
<!-- EVENT mcp_topic_postrow_post_details_before -->
<p class="author">
<a href="{postrow.U_MINI_POST}" title="{postrow.MINI_POST}">
{{ Icon('font', 'file', postrow.MINI_POST, true) }}
</a> {L_POSTED} {postrow.POST_DATE} {L_POST_BY_AUTHOR} {% EVENT mcp_topic_post_author_full_prepend %}<strong>{postrow.POST_AUTHOR_FULL}</strong>{% EVENT mcp_topic_post_author_full_append %}<!-- IF postrow.U_MCP_DETAILS --> [ <a href="{postrow.U_MCP_DETAILS}">{L_POST_DETAILS}</a> ]<!-- ENDIF -->
</p>
<!-- EVENT mcp_topic_postrow_post_details_after -->
<!-- IF postrow.S_POST_UNAPPROVED -->
<p class="post-notice unapproved">
<a href="{postrow.U_MCP_APPROVE}">{{ Icon('font', 'exclamation', '', true, 'fas c-topic-reported-icon') }}<strong>{L_POST_UNAPPROVED}</strong></a>
</p>
<!-- ENDIF -->
<!-- IF postrow.S_POST_DELETED -->
<p class="post-notice deleted">
<a href="{postrow.U_MCP_APPROVE}"><strong>{L_POST_DELETED}</strong></a>
</p>
<!-- ENDIF -->
<!-- IF postrow.S_POST_REPORTED -->
<p class="post-notice reported">
<a href="{postrow.U_MCP_REPORT}">{{ Icon('font', 'exclamation', '', true, 'fas c-topic-reported-icon') }}<strong>{L_POST_REPORTED}</strong></a>
</p>
<!-- ENDIF -->
<div class="content" id="message_{postrow.POST_ID}">{postrow.MESSAGE}</div>
<!-- EVENT mcp_topic_postrow_attachments_before -->
<!-- IF postrow.S_HAS_ATTACHMENTS -->
<dl class="attachbox">
<dt>{L_ATTACHMENTS}</dt>
<!-- BEGIN attachment -->
<dd>{postrow.attachment.DISPLAY_ATTACHMENT}</dd>
<!-- END attachment -->
</dl>
<!-- ENDIF -->
<!-- EVENT mcp_topic_postrow_attachments_after -->
</div>
</div>
</div>
<!-- BEGINELSE -->
<p><strong>{{ lang('NO_POSTS_TIME_FRAME') }}</strong></p>
<!-- END postrow -->
</div>
<hr />
<div class="action-bar bar-bottom">
<div class="pagination">
{TOTAL_POSTS}
<!-- IF .pagination -->
<!-- INCLUDE pagination.html -->
<!-- ELSE -->
&bull; {PAGE_NUMBER}
<!-- ENDIF -->
</div>
</div>
</div>
</div>
<fieldset class="display-actions">
<select name="action">
<option value="" selected="selected">{L_SELECT_ACTION}</option>
<!-- IF S_CAN_APPROVE --><option value="approve">{L_APPROVE_POSTS}</option><!-- ENDIF -->
<!-- IF S_CAN_LOCK --><option value="lock_post">{L_LOCK_POST_POSTS} [ {L_LOCK_POST_EXPLAIN} ]</option><option value="unlock_post">{L_UNLOCK_POST_POSTS}</option><!-- ENDIF -->
<!-- IF S_CAN_DELETE --><option value="delete_post">{L_DELETE_POSTS}</option><!-- ENDIF -->
<!-- IF S_CAN_RESTORE --><option value="restore">{L_RESTORE_POSTS}</option><!-- ENDIF -->
<!-- IF S_CAN_MERGE --><option value="merge_posts"<!-- IF S_MERGE_VIEW --> selected="selected"<!-- ENDIF -->>{L_MERGE_POSTS}</option><!-- ENDIF -->
<!-- IF S_CAN_SPLIT --><option value="split_all"<!-- IF S_SPLIT_VIEW --> selected="selected"<!-- ENDIF -->>{L_SPLIT_POSTS}</option><option value="split_beyond">{L_SPLIT_AFTER}</option><!-- ENDIF -->
<!-- IF S_CAN_SYNC --><option value="resync">{L_RESYNC}</option><!-- ENDIF -->
</select>&nbsp;
<input class="button1 button button-form" type="submit" name="mcp_topic_submit" value="{L_SUBMIT}" />
<div><a href="#" onclick="marklist('mcp', 'post', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('mcp', 'post', false); return false;">{L_UNMARK_ALL}</a></div>
{S_HIDDEN_FIELDS}
{S_FORM_TOKEN}
</fieldset>
</form>
<!-- INCLUDE mcp_footer.html -->

View file

@ -0,0 +1,96 @@
<!-- INCLUDE mcp_header.html -->
<form method="post" id="mcp" action="{U_POST_ACTION}">
<h2>{L_WARN_USER}</h2>
<div class="panel">
<div class="inner">
<h3>{L_SELECT_USER}</h3>
<fieldset>
<dl>
<dt><label for="username">{L_SELECT_USER}{L_COLON}</label></dt>
<dd><input name="username" id="username" type="text" class="inputbox" /></dd>
<dd><strong><a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a></strong></dd>
</dl>
</fieldset>
</div>
</div>
<fieldset class="submit-buttons">
<input type="submit" name="submituser" value="{L_SUBMIT}" class="button1 button button-form" />
{S_FORM_TOKEN}
</fieldset>
</form>
<div class="panel">
<div class="inner">
<h3>{L_MOST_WARNINGS}</h3>
<!-- IF .highest -->
<table class="table1">
<thead>
<tr>
<th class="name">{L_USERNAME}</th>
<th class="name">{L_WARNINGS}</th>
<th class="name">{L_LATEST_WARNING_TIME}</th>
<th></th>
</tr>
</thead>
<tbody>
<!-- BEGIN highest -->
<tr class="<!-- IF highest.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
<td>{highest.USERNAME_FULL}</td>
<td>{highest.WARNINGS}</td>
<td>{highest.WARNING_TIME}</td>
<td><a href="{highest.U_NOTES}">{L_VIEW_NOTES}</a></td>
</tr>
<!-- END highest -->
</tbody>
</table>
<!-- ELSE -->
<p><strong>{L_NO_WARNINGS}</strong></p>
<!-- ENDIF -->
</div>
</div>
<div class="panel">
<div class="inner">
<h3>{L_LATEST_WARNINGS}</h3>
<!-- IF .latest -->
<table class="table1">
<thead>
<tr>
<th class="name">{L_USERNAME}</th>
<th class="name">{L_TIME}</th>
<th class="name">{L_TOTAL_WARNINGS}</th>
<th></th>
</tr>
</thead>
<tbody>
<!-- BEGIN latest -->
<tr class="<!-- IF latest.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
<td>{latest.USERNAME_FULL}</td>
<td>{latest.WARNING_TIME}</td>
<td>{latest.WARNINGS}</td>
<td><a href="{latest.U_NOTES}">{L_VIEW_NOTES}</a></td>
</tr>
<!-- END latest -->
</tbody>
</table>
<!-- ELSE -->
<p><strong>{L_NO_WARNINGS}</strong></p>
<!-- ENDIF -->
</div>
</div>
<!-- INCLUDE mcp_footer.html -->

View file

@ -0,0 +1,70 @@
<!-- INCLUDE mcp_header.html -->
<form method="post" id="mcp" action="{U_POST_ACTION}">
<h2>{L_WARNED_USERS}</h2>
<div class="panel">
<div class="inner">
<p>{L_WARNED_USERS_EXPLAIN}</p>
<!-- IF .user -->
<div class="action-bar bar-top">
<div class="pagination">
{TOTAL_USERS}
<!-- IF .pagination -->
<!-- INCLUDE pagination.html -->
<!-- ELSE -->
&bull; {PAGE_NUMBER}
<!-- ENDIF -->
</div>
</div>
<table class="table1">
<thead>
<tr>
<th class="name">{L_USERNAME}</th>
<th class="name">{L_WARNINGS}</th>
<th class="name">{L_LATEST_WARNING_TIME}</th>
<th></th>
</tr>
</thead>
<tbody>
<!-- BEGIN user -->
<tr class="<!-- IF user.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
<td>{user.USERNAME_FULL}</td>
<td>{user.WARNINGS}</td>
<td>{user.WARNING_TIME}</td>
<td><a href="{user.U_NOTES}">{L_VIEW_NOTES}</a></td>
</tr>
<!-- END user -->
</tbody>
</table>
<div class="action-bar bottom">
<!-- INCLUDE display_options.html -->
<div class="pagination">
{TOTAL_USERS}
<!-- IF .pagination -->
<!-- INCLUDE pagination.html -->
<!-- ELSE -->
&bull; {PAGE_NUMBER}
<!-- ENDIF -->
</div>
</div>
<!-- ELSE -->
<p><strong>{L_NO_WARNINGS}</strong></p>
<!-- ENDIF -->
</div>
{S_FORM_TOKEN}
</div>
</form>
<!-- INCLUDE mcp_footer.html -->

View file

@ -0,0 +1,77 @@
<!-- INCLUDE mcp_header.html -->
<form method="post" id="mcp" action="{U_POST_ACTION}">
<h2>{L_MCP_WARN_POST}</h2>
<div class="panel">
<div class="inner">
<h3><!-- IF USER_COLOR --><span style="color: #{USER_COLOR}">{USERNAME}</span><!-- ELSE -->{USERNAME}<!-- ENDIF --></h3>
<div>
<div class="column1">
<!-- IF AVATAR_HTML --><div>{AVATAR_HTML}</div><!-- ENDIF -->
</div>
<div class="column2">
<dl class="details">
<!-- IF RANK_TITLE --><dt>{L_RANK}{L_COLON}</dt><dd>{RANK_TITLE}</dd><!-- ENDIF -->
{% if RANK_IMG %}<dt>{% if RANK_TITLE %}&nbsp;{% else %}{{ lang('RANK') ~ lang('COLON') }}{% endif %}</dt><dd class="rank-img">{{ RANK_IMG }}</dd>{% endif %}
<dt>{L_JOINED}{L_COLON}</dt><dd>{JOINED}</dd>
<dt>{L_TOTAL_POSTS}{L_COLON}</dt><dd>{POSTS}</dd>
<dt>{L_WARNINGS}{L_COLON} </dt><dd>{WARNINGS}</dd>
</dl>
</div>
</div>
</div>
</div>
<div class="panel">
<div class="inner">
<h3>{L_POST_DETAILS}</h3>
<div class="postbody">
<div class="content">
{POST}
</div>
</div>
</div>
</div>
<!-- EVENT mcp_warn_post_add_warning_field_before -->
<div class="panel">
<div class="inner">
<h3>{L_ADD_WARNING}</h3>
<p>{L_ADD_WARNING_EXPLAIN}</p>
<fieldset>
<textarea name="warning" id="warning" class="inputbox" cols="40" rows="3">{L_WARNING_POST_DEFAULT}</textarea>
<!-- IF S_CAN_NOTIFY -->
<br /><br />
<dl class="panel">
<dt>&nbsp;</dt>
<dd><label><input type="checkbox" name="notify_user" checked="checked" /> {L_NOTIFY_USER_WARN}</label></dd>
</dl>
<!-- ENDIF -->
</fieldset>
</div>
</div>
<!-- EVENT mcp_warn_post_add_warning_field_after -->
<fieldset class="submit-buttons">
<input type="submit" name="action[add_warning]" value="{L_SUBMIT}" class="button1 button button-form" />
{S_FORM_TOKEN}
</fieldset>
</form>
<!-- INCLUDE mcp_footer.html -->

View file

@ -0,0 +1,61 @@
<!-- INCLUDE mcp_header.html -->
<form method="post" id="mcp" action="{U_POST_ACTION}">
<h2>{L_WARN_USER}</h2>
<div class="panel">
<div class="inner">
<h3>{USERNAME_FULL}</h3>
<div>
<div class="column1">
<!-- IF AVATAR_HTML --><div>{AVATAR_HTML}</div><!-- ENDIF -->
</div>
<div class="column2">
<dl class="details">
<!-- IF RANK_TITLE --><dt>{L_RANK}{L_COLON}</dt><dd>{RANK_TITLE}</dd><!-- ENDIF -->
{% if RANK_IMG %}<dt>{% if RANK_TITLE %}&nbsp;{% else %}{{ lang('RANK') ~ lang('COLON') }}{% endif %}</dt><dd class="rank-img">{{ RANK_IMG }}</dd>{% endif %}
<dt>{L_JOINED}{L_COLON}</dt><dd>{JOINED}</dd>
<dt>{L_TOTAL_POSTS}{L_COLON}</dt><dd>{POSTS}</dd>
<dt>{L_WARNINGS}{L_COLON} </dt><dd>{WARNINGS}</dd>
</dl>
</div>
</div>
</div>
</div>
<!-- EVENT mcp_warn_user_add_warning_field_before -->
<div class="panel">
<div class="inner">
<h3>{L_ADD_WARNING}</h3>
<p>{L_ADD_WARNING_EXPLAIN}</p>
<fieldset>
<textarea name="warning" id="warning" class="inputbox" cols="40" rows="3"></textarea>
<!-- IF S_CAN_NOTIFY -->
<br /><br />
<dl class="panel">
<dt>&nbsp;</dt>
<dd><label><input type="checkbox" name="notify_user" checked="checked" /> {L_NOTIFY_USER_WARN}</label></dd>
</dl>
<!-- ENDIF -->
</fieldset>
</div>
</div>
<!-- EVENT mcp_warn_user_add_warning_field_after -->
<fieldset class="submit-buttons">
<input type="submit" name="action[add_warning]" value="{L_SUBMIT}" class="button1 button button-form" />
{S_FORM_TOKEN}
</fieldset>
</form>
<!-- INCLUDE mcp_footer.html -->

View file

@ -0,0 +1,22 @@
<!-- INCLUDE mcp_header.html -->
<h2>{L_WHOIS}</h2>
<div class="panel">
<div class="inner">
<p>
<a href="{U_RETURN_POST}" class="arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
{{ Icon('font', 'angle-' ~ S_CONTENT_FLOW_BEGIN, lang('RETURN_POST'), false, 'fas c-return-arrow-icon') }}
</a>
</p>
<div class="postbody"><div class="content">
<pre>{WHOIS}</pre>
</div></div>
<p>
<a href="{U_RETURN_POST}" class="arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
{{ Icon('font', 'angle-' ~ S_CONTENT_FLOW_BEGIN, lang('RETURN_POST'), false, 'fas c-return-arrow-icon') }}
</a>
</p>
</div>
</div>
<!-- INCLUDE mcp_footer.html -->

View file

@ -0,0 +1,190 @@
<!-- IF S_IN_SEARCH_POPUP -->
<!-- INCLUDE simple_header.html -->
<!-- INCLUDE memberlist_search.html -->
<form method="post" id="results" action="{S_MODE_ACTION}" onsubmit="insert_marked_users('#results', this.user); return false;" data-form-name="{S_FORM_NAME}" data-field-name="{S_FIELD_NAME}">
<!-- ELSE -->
<!-- INCLUDE overall_header.html -->
<div class="panel" id="memberlist_search"<!-- IF not S_SEARCH_USER --> style="display: none;"<!-- ENDIF -->>
<!-- INCLUDE memberlist_search.html -->
</div>
<form method="post" action="{S_MODE_ACTION}">
<!-- ENDIF -->
{% EVENT memberlist_body_page_header_after %}
<!-- IF S_SHOW_GROUP -->
{% EVENT memberlist_body_group_name_before %}
<h2 class="group-title"<!-- IF GROUP_COLOR --> style="color:#{GROUP_COLOR};"<!-- ENDIF -->>{GROUP_NAME}</h2>
{% EVENT memberlist_body_group_name_after %}
<!-- IF U_MANAGE -->
<p class="right responsive-center manage rightside"><a href="{U_MANAGE}">{L_MANAGE_GROUP}</a></p>
<!-- ENDIF -->
<div class="group-description">{GROUP_DESC} {GROUP_TYPE}</div>
{% EVENT memberlist_body_group_desc_after %}
<p>
<!-- IF AVATAR_HTML -->{AVATAR_HTML}<!-- ENDIF -->
{% EVENT memberlist_body_group_rank_before %}
{% if RANK_IMG %}<span class="rank-img">{{ RANK_IMG }}</span>{% endif %}
{% if GROUP_RANK %}
{% if not RANK_IMG %}
{{ lang('GROUP_RANK') ~ lang('COLON') }}
{% endif %}
{{ GROUP_RANK }}
{% endif %}
{% EVENT memberlist_body_group_rank_after %}
</p>
<!-- ELSE -->
{% EVENT memberlist_body_page_title_before %}
<h2 class="solo">{PAGE_TITLE}<!-- IF SEARCH_WORDS -->{L_COLON} <a href="{U_SEARCH_WORDS}">{SEARCH_WORDS}</a><!-- ENDIF --></h2>
<div class="action-bar bar-top">
<div class="member-search panel">
<!-- IF U_FIND_MEMBER and not S_SEARCH_USER --><a href="{U_FIND_MEMBER}" id="member_search" data-alt-text="{L_HIDE_MEMBER_SEARCH}">{L_FIND_USERNAME}</a> &bull; <!-- ELSEIF S_SEARCH_USER and U_HIDE_FIND_MEMBER and not S_IN_SEARCH_POPUP --><a href="{U_HIDE_FIND_MEMBER}" id="member_search" data-alt-text="{L_FIND_USERNAME}">{L_HIDE_MEMBER_SEARCH}</a> &bull; <!-- ENDIF -->
<strong>
<!-- BEGIN first_char -->
<a href="{first_char.U_SORT}">{first_char.DESC}</a>&nbsp;
<!-- END first_char -->
</strong>
</div>
<div class="pagination">
{TOTAL_USERS}
<!-- IF .pagination -->
<!-- INCLUDE pagination.html -->
<!-- ELSE -->
&bull; {PAGE_NUMBER}
<!-- ENDIF -->
</div>
</div>
<!-- ENDIF -->
<!-- IF S_LEADERS_SET or not S_SHOW_GROUP or not .memberrow -->
<div class="forumbg forumbg-table">
<div class="inner">
<table class="table1 memberlist" id="memberlist">
<thead>
<tr>
<th class="name" data-dfn="{L_RANK}{L_COMMA_SEPARATOR}<!-- IF S_SHOW_GROUP and .memberrow -->{L_GROUP_LEADER}<!-- ELSE -->{L_USERNAME}<!-- ENDIF -->"><span class="rank-img"><a href="{U_SORT_RANK}">{L_RANK}</a></span><a href="{U_SORT_USERNAME}"><!-- IF S_SHOW_GROUP and .memberrow -->{L_GROUP_LEADER}<!-- ELSE -->{L_USERNAME}<!-- ENDIF --></a></th>
<th class="posts"><a href="{U_SORT_POSTS}#memberlist">{L_POSTS}</a></th>
<th class="info"><!-- BEGIN custom_fields --><!-- IF not custom_fields.S_FIRST_ROW -->{L_COMMA_SEPARATOR} <!-- ENDIF -->{custom_fields.PROFILE_FIELD_NAME}<!-- END custom_fields --></th>
<th class="joined"><a href="{U_SORT_JOINED}#memberlist">{L_JOINED}</a></th>
<!-- IF U_SORT_ACTIVE --><th class="active"><a href="{U_SORT_ACTIVE}#memberlist">{L_LAST_ACTIVE}</a></th><!-- ENDIF -->
{% EVENT memberlist_body_memberlist_after %}
</tr>
</thead>
<tbody>
<!-- ENDIF -->
<!-- BEGIN memberrow -->
<!-- IF S_SHOW_GROUP -->
<!-- IF not memberrow.S_GROUP_LEADER and not $S_MEMBER_HEADER -->
<!-- IF S_LEADERS_SET and memberrow.S_FIRST_ROW -->
<tr class="bg1">
<td colspan="<!-- IF U_SORT_ACTIVE -->5<!-- ELSE -->4<!-- ENDIF -->">&nbsp;</td>
</tr>
<!-- ENDIF -->
<!-- IF S_LEADERS_SET -->
</tbody>
</table>
</div>
</div>
<!-- ENDIF -->
<div class="forumbg forumbg-table">
<div class="inner">
<table class="table1">
<thead>
<tr>
<!-- IF not S_LEADERS_SET -->
<th class="name" data-dfn="{L_RANK}{L_COMMA_SEPARATOR}{L_USERNAME}"><span class="rank-img"><a href="{U_SORT_RANK}">{L_RANK}</a></span><a href="{U_SORT_USERNAME}"><!-- IF S_SHOW_GROUP -->{L_GROUP_MEMBERS}<!-- ELSE -->{L_USERNAME}<!-- ENDIF --></a></th>
<th class="posts"><a href="{U_SORT_POSTS}#memberlist">{L_POSTS}</a></th>
<th class="info">{% for field in custom_fields %}{% if not loop.first %}{L_COMMA_SEPARATOR} {% endif %}{{ field.PROFILE_FIELD_NAME }}{% endfor %}</th>
<th class="joined"><a href="{U_SORT_JOINED}#memberlist">{L_JOINED}</a></th>
<!-- IF U_SORT_ACTIVE --><th class="active"><a href="{U_SORT_ACTIVE}#memberlist">{L_LAST_ACTIVE}</a></th><!-- ENDIF -->
{% EVENT memberlist_body_leaders_set_after %}
<!-- ELSEIF S_SHOW_GROUP -->
<th class="name">{L_GROUP_MEMBERS}</th>
<th class="posts">{L_POSTS}</th>
<th class="info"><!-- BEGIN custom_fields --><!-- IF not custom_fields.S_FIRST_ROW -->{L_COMMA_SEPARATOR} <!-- ENDIF -->{custom_fields.PROFILE_FIELD_NAME}<!-- END custom_fields --></th>
<th class="joined">{L_JOINED}</th>
<!-- IF U_SORT_ACTIVE --><th class="active">{L_LAST_ACTIVE}</th><!-- ENDIF -->
{% EVENT memberlist_body_show_group_after %}
<!-- ENDIF -->
</tr>
</thead>
<tbody>
<!-- DEFINE $S_MEMBER_HEADER = 1 -->
<!-- ENDIF -->
<!-- ENDIF -->
<tr class="<!-- IF memberrow.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF --><!-- IF memberrow.S_INACTIVE --> inactive<!-- ENDIF -->">
<td><span class="rank-img"><!-- EVENT memberlist_body_rank_prepend --><!-- IF memberrow.RANK_IMG -->{memberrow.RANK_IMG}<!-- ELSE -->{memberrow.RANK_TITLE}<!-- ENDIF --><!-- EVENT memberlist_body_rank_append --></span><!-- IF S_IN_SEARCH_POPUP and not S_SELECT_SINGLE --><input type="checkbox" name="user" value="{memberrow.USERNAME}" /> <!-- ENDIF --><!-- EVENT memberlist_body_username_prepend -->{memberrow.USERNAME_FULL}<!-- IF memberrow.S_INACTIVE --> ({L_INACTIVE})<!-- ENDIF --><!-- EVENT memberlist_body_username_append --><!-- IF S_IN_SEARCH_POPUP --><br />[&nbsp;<a href="#" onclick="insert_single_user('#results', '{memberrow.A_USERNAME}'); return false;">{L_SELECT}</a>&nbsp;]<!-- ENDIF --></td>
<td class="posts"><!-- IF memberrow.POSTS and S_DISPLAY_SEARCH --><a href="{memberrow.U_SEARCH_USER}" title="{L_SEARCH_USER_POSTS}">{memberrow.POSTS}</a><!-- ELSE -->{memberrow.POSTS}<!-- ENDIF --></td>
<td class="info">
{%- for field in memberrow.custom_fields -%}
<div>{% if field.S_PROFILE_CONTACT %}<a href="{{ field.PROFILE_FIELD_CONTACT }}">{% endif %}{{ field.PROFILE_FIELD_VALUE }}{% if field.S_PROFILE_CONTACT %}</a>{% endif %}</div>
{%- else -%}
&nbsp;
{%- endfor -%}
</td>
<td>{memberrow.JOINED}</td>
<!-- IF S_VIEWONLINE --><td>{memberrow.LAST_ACTIVE}&nbsp;</td><!-- ENDIF -->
{% EVENT memberlist_body_memberrow_after %}
</tr>
<!-- BEGINELSE -->
<tr class="bg1">
<td colspan="<!-- IF S_VIEWONLINE -->5<!-- ELSE -->4<!-- ENDIF -->">{L_NO_MEMBERS}</td>
</tr>
<!-- END memberrow -->
</tbody>
</table>
</div>
</div>
<!-- IF S_IN_SEARCH_POPUP and not S_SELECT_SINGLE -->
<fieldset class="display-actions">
<input type="submit" name="submit" value="{L_SELECT_MARKED}" class="button1 button button-form-bold" />
<div><a href="#" onclick="marklist('results', 'user', true); return false;">{L_MARK_ALL}</a> &bull; <a href="#" onclick="marklist('results', 'user', false); return false;">{L_UNMARK_ALL}</a></div>
</fieldset>
<!-- ENDIF -->
<!-- IF S_IN_SEARCH_POPUP -->
</form>
<form method="post" id="sort-results" action="{S_MODE_ACTION}">
<!-- ENDIF -->
<!-- IF S_IN_SEARCH_POPUP and not S_SEARCH_USER -->
<fieldset class="display-options">
<label for="sk">{L_SELECT_SORT_METHOD}{L_COLON} <select name="sk" id="sk">{S_MODE_SELECT}</select></label>
<label for="sd">{L_ORDER} <select name="sd" id="sd">{S_ORDER_SELECT}</select></label>
<input type="submit" name="sort" value="{L_SUBMIT}" class="button1 button button-form-bold" />
</fieldset>
<!-- ENDIF -->
</form>
<div class="action-bar bar-bottom">
<div class="pagination">
{TOTAL_USERS}
<!-- IF .pagination -->
<!-- INCLUDE pagination.html -->
<!-- ELSE -->
&bull; {PAGE_NUMBER}
<!-- ENDIF -->
</div>
</div>
{% EVENT memberlist_body_page_footer_before %}
<!-- IF S_IN_SEARCH_POPUP -->
<!-- INCLUDE simple_footer.html -->
<!-- ELSE -->
<!-- INCLUDE jumpbox.html -->
<!-- INCLUDE overall_footer.html -->
<!-- ENDIF -->

View file

@ -0,0 +1,113 @@
<!-- INCLUDE overall_header.html -->
<!-- EVENT memberlist_email_before -->
<!-- IF S_CONTACT_ADMIN-->
<h2 class="titlespace">{L_CONTACT_ADMIN}</h2>
<!-- ELSEIF S_SEND_USER -->
<h2 class="titlespace">{L_SEND_EMAIL_USER}</h2>
<!-- ELSE -->
<h2 class="titlespace">{L_EMAIL_TOPIC}</h2>
<!-- ENDIF -->
<form method="post" action="{S_POST_ACTION}" id="post">
<!-- IF CONTACT_INFO -->
<div class="panel">
<div class="inner">
<div class="postbody">
<div class="content">
{CONTACT_INFO}
</div>
</div>
</div>
</div>
<br class="clear" />
<!-- ENDIF -->
<div class="panel">
<div class="inner">
<div class="content">
<!-- IF ERROR_MESSAGE --><p class="error">{ERROR_MESSAGE}</p><!-- ENDIF -->
<fieldset class="fields2">
<!-- IF S_SEND_USER -->
<dl>
<dt><label>{L_RECIPIENT}{L_COLON}</label></dt>
<dd><strong>{USERNAME_FULL}</strong></dd>
</dl>
<dl>
<dt><label for="subject">{L_SUBJECT}{L_COLON}</label></dt>
<dd><input class="inputbox autowidth" type="text" name="subject" id="subject" size="50" tabindex="1" value="{SUBJECT}" /></dd>
</dl>
<!-- ELSEIF S_CONTACT_ADMIN-->
<dl>
<dt><label>{L_RECIPIENT}{L_COLON}</label></dt>
<dd><strong>{L_ADMINISTRATOR}</strong></dd>
</dl>
<!-- IF not S_IS_REGISTERED -->
<dl>
<dt><label for="email">{L_SENDER_EMAIL_ADDRESS}{L_COLON}</label></dt>
<dd><input class="inputbox autowidth" type="text" name="email" id="email" size="50" maxlength="100" tabindex="1" value="{EMAIL}" /></dd>
</dl>
<dl>
<dt><label for="name">{L_SENDER_NAME}{L_COLON}</label></dt>
<dd><input class="inputbox autowidth" type="text" name="name" id="name" size="50" tabindex="2" value="{NAME}" /></dd>
</dl>
<!-- ENDIF -->
<dl>
<dt><label for="subject">{L_SUBJECT}{L_COLON}</label></dt>
<dd><input class="inputbox autowidth" type="text" name="subject" id="subject" size="50" tabindex="3" value="{SUBJECT}" /></dd>
</dl>
<!-- ELSE -->
<dl>
<dt><label for="email">{L_EMAIL_ADDRESS}{L_COLON}</label></dt>
<dd><input class="inputbox autowidth" type="email" name="email" id="email" size="50" maxlength="100" tabindex="2" value="{EMAIL}" /></dd>
</dl>
<dl>
<dt><label for="name">{L_REAL_NAME}{L_COLON}</label></dt>
<dd><input class="inputbox autowidth" type="text" name="name" id="name" size="50" tabindex="3" value="{NAME}" /></dd>
</dl>
<dl>
<dt><label for="lang">{L_DEST_LANG}{L_COLON}</label><br />
<span>{L_DEST_LANG_EXPLAIN}</span></dt>
<dd>
<select name="lang" id="lang">
{% for option in lang_options %}
<option value="{{ option.LANG_ISO }}"{% if option.SELECTED %} selected="selected"{% endif %}>{{ option.LANG_LOCAL_NAME }}</option>
{% endfor %}
</select>
</dd>
</dl>
<!-- ENDIF -->
<dl>
<dt><label for="message">{L_MESSAGE_BODY}{L_COLON}</label><br />
<span>{L_EMAIL_BODY_EXPLAIN}</span></dt>
<dd><textarea class="inputbox" name="message" id="message" rows="15" cols="76" tabindex="4">{MESSAGE}</textarea></dd>
</dl>
<!-- IF S_REGISTERED_USER -->
<dl>
<dt>&nbsp;</dt>
<dd><label for="cc_sender"><input type="checkbox" name="cc_sender" id="cc_sender" value="1" checked="checked" tabindex="5" /> {L_CC_SENDER}</label></dd>
</dl>
<!-- ENDIF -->
</fieldset>
</div>
</div>
</div>
<div class="panel">
<div class="inner">
<div class="content">
<fieldset class="submit-buttons">
<input type="submit" tabindex="6" name="submit" class="button1 button button-form" value="{L_SEND_EMAIL}" />
</fieldset>
</div>
</div>
{S_FORM_TOKEN}
</div>
</form>
<!-- INCLUDE overall_footer.html -->

View file

@ -0,0 +1,46 @@
<!-- INCLUDE simple_header.html -->
<h2>{L_SEND_IM}</h2>
<form method="post" action="{S_IM_ACTION}">
<div class="panel bg2">
<div class="inner">
<p>{L_SEND_IM_EXPLAIN}</p>
<!-- IF S_SENT_JABBER -->
<p>{L_IM_SENT_JABBER}</p>
<!-- ENDIF -->
<fieldset>
<dl class="fields2">
<dt><label>{L_IM_RECIPIENT}{L_COLON}</label></dt>
<dd><strong>{USERNAME}</strong><!-- IF S_NO_SEND_JABBER --> [ {IM_CONTACT} ]<!-- ENDIF --><!-- IF PRESENCE_IMG --> {PRESENCE_IMG}<!-- ENDIF --></dd>
</dl>
<!-- IF S_SEND_JABBER -->
<dl class="fields2">
<dt><label for="message">{L_IM_MESSAGE}{L_COLON}</label></dt>
<dd><textarea class="inputbox autowidth" name="message" id="message" rows="5" cols="45"></textarea></dd>
</dl>
<dl class="fields2">
<dt>&nbsp;</dt>
<dd><input class="button1 button button-form" name="submit" type="submit" value="{L_IM_SEND}" /></dd>
</dl>
<!-- ELSE IF S_NO_SEND_JABBER -->
<dl class="fields2">
<dt>&nbsp;</dt>
<dd>{L_IM_NO_JABBER}</dd>
</dl>
<!-- ENDIF -->
{S_FORM_TOKEN}
</fieldset>
</div>
</div>
</form>
<a href="#" onclick="window.close(); return false;">{L_CLOSE_WINDOW}</a>
<!-- INCLUDE simple_footer.html -->

View file

@ -0,0 +1,86 @@
<h2 class="solo">{L_FIND_USERNAME}</h2>
<form method="post" action="{S_MODE_ACTION}" id="search_memberlist">
<div class="panel">
<div class="inner">
<p>{L_FIND_USERNAME_EXPLAIN}</p>
<!-- EVENT memberlist_search_fields_before -->
<fieldset class="fields1 column1">
<dl style="overflow: visible;">
<dt><label for="username">{L_USERNAME}{L_COLON}</label></dt>
<dd>
<!-- IF U_LIVE_SEARCH --><div class="dropdown-container dropdown-{S_CONTENT_FLOW_END}"><!-- ENDIF -->
<input type="text" name="username" id="username" value="{USERNAME}" class="inputbox"<!-- IF U_LIVE_SEARCH --> autocomplete="off" data-filter="phpbb.search.filter" data-ajax="member_search" data-min-length="3" data-url="{U_LIVE_SEARCH}" data-results="#user-search"<!-- ENDIF --> />
<!-- IF U_LIVE_SEARCH -->
<div class="dropdown live-search hidden" id="user-search">
<div class="pointer"><div class="pointer-inner"></div></div>
<ul class="dropdown-contents search-results">
<li class="search-result-tpl"><span class="search-result"></span></li>
</ul>
</div>
</div>
<!-- ENDIF -->
</dd>
</dl>
<!-- IF S_EMAIL_SEARCH_ALLOWED -->
<dl>
<dt><label for="email">{L_EMAIL}{L_COLON}</label></dt>
<dd><input type="text" name="email" id="email" value="{EMAIL}" class="inputbox" /></dd>
</dl>
<!-- ENDIF -->
<!-- IF S_JABBER_ENABLED -->
<dl>
<dt><label for="jabber">{L_JABBER}{L_COLON}</label></dt>
<dd><input type="text" name="jabber" id="jabber" value="{JABBER}" class="inputbox" /></dd>
</dl>
<!-- ENDIF -->
<dl>
<dt><label for="search_group_id">{L_GROUP}{L_COLON}</label></dt>
<dd><select name="search_group_id" id="search_group_id">{S_GROUP_SELECT}</select></dd>
</dl>
<!-- EVENT memberlist_search_sorting_options_before -->
<dl>
<dt><label for="sk" class="label3">{L_SORT_BY}{L_COLON}</label></dt>
<dd><select name="sk" id="sk">{S_SORT_OPTIONS}</select> <select name="sd">{S_ORDER_SELECT}</select></dd>
</dl>
</fieldset>
<fieldset class="fields1 column2">
<dl>
<dt><label for="joined">{L_JOINED}{L_COLON}</label></dt>
<dd><select name="joined_select">{S_JOINED_TIME_OPTIONS}</select> <input class="inputbox medium" type="text" name="joined" id="joined" value="{JOINED}" /></dd>
</dl>
<!-- IF S_VIEWONLINE -->
<dl>
<dt><label for="active">{L_LAST_ACTIVE}{L_COLON}</label></dt>
<dd><select name="active_select">{S_ACTIVE_TIME_OPTIONS}</select> <input class="inputbox medium" type="text" name="active" id="active" value="{ACTIVE}" /></dd>
</dl>
<!-- ENDIF -->
<dl>
<dt><label for="count">{L_POSTS}{L_COLON}</label></dt>
<dd><select name="count_select">{S_COUNT_OPTIONS}</select> <input class="inputbox medium" type="number" min="0" name="count" id="count" value="{COUNT}" /></dd>
</dl>
<!-- IF S_IP_SEARCH_ALLOWED -->
<dl>
<dt><label for="ip">{L_POST_IP}{L_COLON}</label></dt>
<dd><input class="inputbox medium" type="text" name="ip" id="ip" value="{IP}" /></dd>
</dl>
<!-- ENDIF -->
<!-- EVENT memberlist_search_fields_after -->
</fieldset>
<div class="clear"></div>
<hr />
<fieldset class="submit-buttons">
<input type="submit" name="submit" value="{L_SEARCH}" class="button1 button button-form" />
{S_FORM_TOKEN}
</fieldset>
</div>
</div>
</form>

View file

@ -0,0 +1,47 @@
<!-- INCLUDE overall_header.html -->
<h2 class="solo">{PAGE_TITLE}</h2>
<form method="post" action="{S_MODE_ACTION}">
<!-- BEGIN group -->
<div class="forumbg forumbg-table">
<div class="inner">
<table class="table1 team" id="team">
<thead>
<tr>
<th class="name" data-dfn="{L_RANK}{L_COMMA_SEPARATOR}{L_USERNAME}"><span class="rank-img">{L_RANK}&nbsp;</span><!-- IF group.U_GROUP --><a href="{group.U_GROUP}">{group.GROUP_NAME}</a><!-- ELSE -->{group.GROUP_NAME}<!-- ENDIF --></th>
<th class="info">{L_PRIMARY_GROUP}</th>
<!-- IF S_DISPLAY_MODERATOR_FORUMS --><th class="info">{L_MODERATOR}</th><!-- ENDIF -->
</tr>
</thead>
<tbody>
<!-- BEGIN user -->
<tr class="<!-- IF group.user.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF --><!-- IF group.user.S_INACTIVE --> inactive<!-- ENDIF -->">
<td><!-- IF group.user.RANK_IMG --><span class="rank-img">{group.user.RANK_IMG}</span><!-- ELSE --><span class="rank-img">{group.user.RANK_TITLE}</span><!-- ENDIF --><!-- EVENT memberlist_team_username_prepend -->{group.user.USERNAME_FULL}<!-- IF group.user.S_INACTIVE --> ({L_INACTIVE})<!-- ENDIF --><!-- EVENT memberlist_team_username_append --></td>
<td class="info"><!-- IF group.user.U_GROUP -->
<a<!-- IF group.user.GROUP_COLOR --> style="font-weight: bold; color: #{group.user.GROUP_COLOR}"<!-- ENDIF --> href="{group.user.U_GROUP}">{group.user.GROUP_NAME}</a>
<!-- ELSE -->
{group.user.GROUP_NAME}
<!-- ENDIF --></td>
<!-- IF S_DISPLAY_MODERATOR_FORUMS -->
<td class="info"><!-- IF group.user.FORUM_OPTIONS --><select style="width: 100%;">{group.user.FORUMS}</select><!-- ELSEIF group.user.FORUMS -->{group.user.FORUMS}<!-- ELSE -->-<!-- ENDIF --></td>
<!-- ENDIF -->
</tr>
<!-- BEGINELSE -->
<tr class="bg1">
<td colspan="3"><strong>{L_NO_MEMBERS}</strong></td>
</tr>
<!-- END user -->
</tbody>
</table>
</div>
</div>
<!-- END group -->
</form>
<!-- INCLUDE jumpbox.html -->
<!-- INCLUDE overall_footer.html -->

View file

@ -0,0 +1,143 @@
<!-- INCLUDE overall_header.html -->
<h2 class="memberlist-title">{PAGE_TITLE}</h2>
<!-- EVENT memberlist_view_content_prepend -->
<form method="post" action="{S_PROFILE_ACTION}" id="viewprofile">
<div class="panel bg1">
<div class="inner">
<!-- IF AVATAR_HTML -->
<dl class="left-box avatar-rank-container">
<dt class="profile-avatar">{AVATAR_HTML}</dt>
<!-- EVENT memberlist_view_rank_avatar_before -->
<!-- IF RANK_TITLE --><dd class="profile-avatar">{RANK_TITLE}</dd><!-- ENDIF -->
<!-- EVENT memberlist_view_rank_avatar_after -->
</dl>
<!-- ENDIF -->
<dl class="left-box details profile-details">
<dt>
{L_USERNAME}{L_COLON}
</dt>
<dd>
<!-- EVENT memberlist_view_username_prepend --><!-- IF USER_COLOR --><span style="color: {USER_COLOR}; font-weight: bold;"><!-- ELSE --><span><!-- ENDIF -->{USERNAME}</span><!-- EVENT memberlist_view_username_append --> <!-- IF S_ONLINE --> {{ Icon('font', 'circle', lang('ONLINE'), true, 'fas c-online-icon') }}<!-- ENDIF -->
<!-- IF U_EDIT_SELF --> [ <a href="{U_EDIT_SELF}">{L_EDIT_PROFILE}</a> ]<!-- ENDIF -->
<!-- IF U_USER_ADMIN --> [ <a href="{U_USER_ADMIN}">{L_USER_ADMIN}</a> ]<!-- ENDIF -->
<!-- IF U_USER_BAN --> [ <a href="{U_USER_BAN}">{L_USER_BAN}</a> ]<!-- ENDIF -->
<!-- IF U_SWITCH_PERMISSIONS --> [ <a href="{U_SWITCH_PERMISSIONS}">{L_USE_PERMISSIONS}</a> ]<!-- ENDIF -->
</dd>
<!-- IF not AVATAR_HTML -->
<!-- EVENT memberlist_view_rank_no_avatar_before -->
<!-- IF RANK_TITLE --><dt>{L_RANK}{L_COLON}</dt> <dd>{RANK_TITLE}</dd><!-- ENDIF -->
{% if RANK_IMG %}<dt>{% if RANK_TITLE %}&nbsp;{% else %}{{ lang('RANK') ~ lang('COLON') }}{% endif %}</dt><dd class="rank-img">{{ RANK_IMG }}</dd>{% endif %}
<!-- EVENT memberlist_view_rank_no_avatar_after -->
<!-- ENDIF -->
<!-- IF S_USER_INACTIVE --><dt>{L_USER_IS_INACTIVE}{L_COLON}</dt> <dd>{USER_INACTIVE_REASON}</dd><!-- ENDIF -->
<!-- IF AGE !== '' --><dt>{L_AGE}{L_COLON}</dt> <dd>{AGE}</dd><!-- ENDIF -->
<!-- IF S_GROUP_OPTIONS --><dt>{L_USERGROUPS}{L_COLON}</dt> <dd><select name="g">{S_GROUP_OPTIONS}</select> <input type="submit" name="submit" value="{L_GO}" class="button1 button button-form-bold" /></dd><!-- ENDIF -->
<!-- EVENT memberlist_view_non_contact_custom_fields_before -->
<!-- BEGIN custom_fields -->
<!-- IF not custom_fields.S_PROFILE_CONTACT -->
<dt>{custom_fields.PROFILE_FIELD_NAME}{L_COLON}</dt> <dd>{custom_fields.PROFILE_FIELD_VALUE}</dd>
<!-- ENDIF -->
<!-- END custom_fields -->
<!-- EVENT memberlist_view_non_contact_custom_fields_after -->
<!-- EVENT memberlist_view_zebra_before -->
<!-- IF S_USER_LOGGED_IN and S_ZEBRA -->
<!-- IF U_REMOVE_FRIEND -->
<dt>&nbsp;</dt> <dd class="zebra"><a href="{U_REMOVE_FRIEND}" data-ajax="zebra"><strong>{L_REMOVE_FRIEND}</strong></a></dd>
<!-- ELSEIF U_REMOVE_FOE -->
<dt>&nbsp;</dt> <dd class="zebra"><a href="{U_REMOVE_FOE}" data-ajax="zebra"><strong>{L_REMOVE_FOE}</strong></a></dd>
<!-- ELSE -->
<!-- IF U_ADD_FRIEND -->
<dt>&nbsp;</dt> <dd class="zebra"><a href="{U_ADD_FRIEND}" data-ajax="zebra"><strong>{L_ADD_FRIEND}</strong></a></dd>
<!-- ENDIF -->
<!-- IF U_ADD_FOE -->
<dt>&nbsp;</dt> <dd class="zebra"><a href="{U_ADD_FOE}" data-ajax="zebra"><strong>{L_ADD_FOE}</strong></a></dd>
<!-- ENDIF -->
<!-- ENDIF -->
<!-- ENDIF -->
<!-- EVENT memberlist_view_zebra_after -->
</dl>
</div>
</div>
<!-- EVENT memberlist_view_contact_before -->
<div class="panel bg2">
<div class="inner">
<div class="column1">
<h3>{L_CONTACT_USER}</h3>
<dl class="details">
<!-- IF U_EMAIL --><dt>{L_EMAIL_ADDRESS}{L_COLON}</dt> <dd><a href="{U_EMAIL}">{L_SEND_EMAIL_USER}</a></dd><!-- ENDIF -->
<!-- IF U_PM --><dt>{L_PM}{L_COLON}</dt> <dd><a href="{U_PM}">{L_SEND_PRIVATE_MESSAGE}</a></dd><!-- ENDIF -->
<!-- IF U_JABBER and S_JABBER_ENABLED --><dt>{L_JABBER}{L_COLON}</dt> <dd><a href="{U_JABBER}" onclick="popup(this.href, 750, 320); return false;">{L_SEND_JABBER_MESSAGE}</a></dd><!-- ELSEIF USER_JABBER --><dt>{L_JABBER}{L_COLON}</dt> <dd>{USER_JABBER}</dd><!-- ENDIF -->
<!-- EVENT memberlist_view_contact_custom_fields_before -->
<!-- BEGIN custom_fields -->
<!-- IF custom_fields.S_PROFILE_CONTACT -->
<dt>{custom_fields.PROFILE_FIELD_NAME}{L_COLON}</dt>
<!-- IF custom_fields.PROFILE_FIELD_CONTACT -->
<dd><a href="{custom_fields.PROFILE_FIELD_CONTACT}">{custom_fields.PROFILE_FIELD_DESC}</a></dd>
<!-- ELSE -->
<dd>{custom_fields.PROFILE_FIELD_VALUE}</dd>
<!-- ENDIF -->
<!-- ENDIF -->
<!-- END custom_fields -->
<!-- EVENT memberlist_view_contact_custom_fields_after -->
<!-- IF S_PROFILE_FIELD1 -->
<!-- NOTE: Use a construct like this to include admin defined profile fields. Replace FIELD1 with the name of your field. -->
<dt>{PROFILE_FIELD1_NAME}{L_COLON}</dt> <dd>{PROFILE_FIELD1_VALUE}</dd>
<!-- ENDIF -->
</dl>
</div>
<div class="column2">
<h3>{L_USER_FORUM}</h3>
<dl class="details">
<!-- EVENT memberlist_view_user_statistics_before -->
<dt>{L_JOINED}{L_COLON}</dt> <dd>{JOINED}</dd>
<dt>{L_LAST_ACTIVE}{L_COLON}</dt> <dd>{LAST_ACTIVE}</dd>
<!-- IF S_WARNINGS -->
<dt>{L_WARNINGS}{L_COLON} </dt>
<dd><strong>{WARNINGS}</strong><!-- IF U_NOTES or U_WARN --> [ <!-- IF U_NOTES --><a href="{U_NOTES}">{L_VIEW_NOTES}</a><!-- ENDIF --> <!-- IF U_WARN --><!-- IF U_NOTES --> | <!-- ENDIF --><a href="{U_WARN}">{L_WARN_USER}</a><!-- ENDIF --> ]<!-- ENDIF --></dd>
<!-- ENDIF -->
<dt>{L_TOTAL_POSTS}{L_COLON}</dt>
<dd>{POSTS} <!-- IF S_DISPLAY_SEARCH -->| <strong><a href="{U_SEARCH_USER}">{L_SEARCH_USER_POSTS}</a></strong><!-- ENDIF -->
<!-- IF POSTS_PCT --><br />({POSTS_PCT} / {POSTS_DAY})<!-- ENDIF -->
<!-- IF POSTS_IN_QUEUE and U_MCP_QUEUE --><br />(<a href="{U_MCP_QUEUE}">{L_POSTS_IN_QUEUE}</a>)<!-- ELSEIF POSTS_IN_QUEUE --><br />({L_POSTS_IN_QUEUE})<!-- ENDIF -->
</dd>
<!-- IF S_SHOW_ACTIVITY and POSTS -->
<dt>{L_ACTIVE_IN_FORUM}{L_COLON}</dt> <dd><!-- IF ACTIVE_FORUM != '' --><strong><a href="{U_ACTIVE_FORUM}">{ACTIVE_FORUM}</a></strong><br />({ACTIVE_FORUM_POSTS} / {ACTIVE_FORUM_PCT})<!-- ELSE --> - <!-- ENDIF --></dd>
<dt>{L_ACTIVE_IN_TOPIC}{L_COLON}</dt> <dd><!-- IF ACTIVE_TOPIC != '' --><strong><a href="{U_ACTIVE_TOPIC}">{ACTIVE_TOPIC}</a></strong><br />({ACTIVE_TOPIC_POSTS} / {ACTIVE_TOPIC_PCT})<!-- ELSE --> - <!-- ENDIF --></dd>
<!-- ENDIF -->
<!-- EVENT memberlist_view_user_statistics_after -->
</dl>
</div>
</div>
</div>
<!-- EVENT memberlist_view_contact_after -->
<!-- IF SIGNATURE -->
<div class="panel bg1">
<div class="inner">
<h3>{L_SIGNATURE}</h3>
<div class="postbody"><div class="signature standalone">{SIGNATURE}</div></div>
</div>
</div>
<!-- ENDIF -->
</form>
<!-- EVENT memberlist_view_content_append -->
<!-- INCLUDE jumpbox.html -->
<!-- INCLUDE overall_footer.html -->

View file

@ -0,0 +1,6 @@
<template data-id="mention-media-span"><span class="mention-media"></span></template>
<template data-id="mention-media-avatar-img"><img class="avatar mention-media-avatar" src="" alt=""></template>
<template data-id="mention-name-span"><span class="mention-name"></span></template>
<template data-id="mention-default-avatar"><svg class="mention-media-avatar" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path fill-rule="evenodd" d="M12,19.2C9.5,19.2 7.29,17.92 6,16C6.03,14 10,12.9 12,12.9C14,12.9 17.97,14 18,16C16.71,17.92 14.5,19.2 12,19.2M12,5A3,3 0 0,1 15,8A3,3 0 0,1 12,11A3,3 0 0,1 9,8A3,3 0 0,1 12,5M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z"/></svg></template>
<template data-id="mention-default-avatar-group"><svg class="mention-media-avatar" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path fill-rule="evenodd" d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z"/></svg></template>
<template data-id="mention-rank-span"><span class="mention-rank"></span></template>

View file

@ -0,0 +1,25 @@
<!-- IF S_SIMPLE_MESSAGE -->
<!-- INCLUDE simple_header.html -->
<!-- ELSE -->
<!-- INCLUDE overall_header.html -->
<!-- ENDIF -->
<div class="panel" id="message">
<div class="inner">
<h2 class="message-title">{MESSAGE_TITLE}</h2>
<p>{MESSAGE_TEXT}</p>
<!-- IF SCRIPT_NAME == "search" and not S_BOARD_DISABLED and not S_NO_SEARCH and L_RETURN_TO_SEARCH_ADV -->
<p>
<a href="{U_SEARCH}" class="arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
{{ Icon('font', 'angle-' ~ S_CONTENT_FLOW_BEGIN, lang('GO_TO_SEARCH_ADV'), true, 'fas c-return-arrow-icon') }}
</a>
</p>
<!-- ENDIF -->
</div>
</div>
<!-- IF S_SIMPLE_MESSAGE -->
<!-- INCLUDE simple_footer.html -->
<!-- ELSE -->
<!-- INCLUDE overall_footer.html -->
<!-- ENDIF -->

View file

@ -0,0 +1,117 @@
<div class="navbar" role="navigation">
<div class="inner">
<ul id="nav-footer" class="nav-footer linklist" role="menubar">
<li class="breadcrumbs">
{% if U_SITE_HOME %}
{% apply spaceless %}
<span class="crumb">
<a href="{{ U_SITE_HOME }}" data-navbar-reference="home">
{{ Icon('font', 'home', lang('SITE_HOME'), false, 'fas o-icon-baseline') }}
</a>
</span>
{% endapply %}
{% endif %}
{% EVENT overall_footer_breadcrumb_prepend %}
{% apply spaceless %}
<span class="crumb">
<a href="{{ U_INDEX }}" data-navbar-reference="index">
{% if U_SITE_HOME %}
<span>{{ lang('INDEX') }}</span>
{% else %}
{{ Icon('font', 'home', lang('INDEX'), false, 'fas o-icon-baseline') }}
{% endif %}
</a>
</span>
{% endapply %}
{% EVENT overall_footer_breadcrumb_append %}
</li>
{% block nav_footer_left_side %}
{% if U_WATCH_FORUM_LINK and not S_IS_BOT %}
<li class="in-menu">
<a href="{{ U_WATCH_FORUM_LINK }}" title="{{ S_WATCH_FORUM_TITLE }}" data-ajax="toggle_link" data-toggle-text="{{ S_WATCH_FORUM_TOGGLE }}" data-toggle-url="{{ U_WATCH_FORUM_TOGGLE }}">
{% if S_WATCHING_FORUM %}
{{ Icon('font', 'bell-slash', '', true, 'far c-watch-icon is-active') }}
{{ Icon('font', 'bell', '', true, 'far c-watch-icon') }}
{% else %}
{{ Icon('font', 'bell', '', true, 'far c-watch-icon is-active') }}
{{ Icon('font', 'bell-slash', '', true, 'far c-watch-icon') }}
{% endif %}
<span>{{ S_WATCH_FORUM_TITLE }}</span>
</a>
</li>
{% endif %}
{% endblock nav_footer_left_side %}
{# End of left side menu Start of right side menu #}
{% EVENT overall_footer_timezone_before %}
<li class="rightside">
{{ S_TIMEZONE }}
</li>
{% EVENT overall_footer_timezone_after %}
{% block nav_footer_right_side %}
{% if not S_IS_BOT %}
<li class="rightside in-menu">
<a href="{{ U_DELETE_COOKIES }}" data-ajax="true" data-refresh="true" role="menuitem">
{{ Icon('font', 'trash', lang('DELETE_COOKIES'), false) }}
</a>
</li>
{% if S_DISPLAY_MEMBERLIST %}
<li class="rightside in-menu">
<a href="{{ U_MEMBERLIST }}" title="{{ lang('MEMBERLIST_EXPLAIN') }}" role="menuitem">
{{ Icon('font', 'users', lang('MEMBERLIST'), false) }}
</a>
</li>
{% endif %}
{% endif %}
{% EVENT overall_footer_teamlink_before %}
{% if U_TEAM %}
<li class="rightside in-menu">
<a href="{{ U_TEAM }}" role="menuitem">
{{ Icon('font', 'shield-halved', lang('THE_TEAM'), false) }}
</a>
</li>
{% endif %}
{% EVENT overall_footer_teamlink_after %}
{% if U_CONTACT_US %}
<li class="rightside in-menu">
<a href="{{ U_CONTACT_US }}" role="menuitem">
{{ Icon('font', 'envelope', lang('CONTACT_US'), false) }}
</a>
</li>
{% endif %}
{% endblock nav_footer_right_side %}
{# right side responsive menu #}
<li class="rightside dropdown-container responsive-menu">
<a class="dropdown-toggle" href="">
{{ Icon('font', 'bars', '', true) }}
</a>
<div class="dropdown">
<div class="pointer">
<div class="pointer-inner"></div>
</div>
<ul class="dropdown-contents">
{{ block('nav_footer_left_side', _self) }}
<li class="separator"></li>
{{ block('nav_footer_right_side', _self) }}
</ul>
</div>
</li>
</ul>
</div>
</div>

View file

@ -0,0 +1,263 @@
<div class="navbar" role="navigation">
<div class="inner">
<ul id="nav-main" class="nav-main linklist" role="menubar">
<li id="quick-links" class="quick-links dropdown-container responsive-menu{% if not S_DISPLAY_QUICK_LINKS and not S_DISPLAY_SEARCH %} hidden{% endif %}">
<a href="#" class="dropdown-trigger">
{{ Icon('font', 'bars', lang('QUICK_LINKS'), false) }}
</a>
<div class="dropdown">
<div class="pointer"><div class="pointer-inner"></div></div>
<ul class="dropdown-contents" role="menu">
{% EVENT navbar_header_quick_links_before %}
{% if S_DISPLAY_SEARCH %}
<li class="separator"></li>
{% if S_REGISTERED_USER %}
<li>
<a href="{{ U_SEARCH_SELF }}" role="menuitem">
{{ Icon('font', 'file', lang('SEARCH_SELF'), false, 'far icon icon-gray') }}
</a>
</li>
{% endif %}
{% if S_USER_LOGGED_IN %}
<li>
<a href="{{ U_SEARCH_NEW }}" role="menuitem">
{{ Icon('font', 'file', lang('SEARCH_NEW'), false, 'far icon icon-red') }}
</a>
</li>
{% endif %}
{% if S_LOAD_UNREADS %}
<li>
<a href="{{ U_SEARCH_UNREAD }}" role="menuitem">
{{ Icon('font', 'file', lang('SEARCH_UNREAD'), false, 'far icon icon-red') }}
</a>
</li>
{% endif %}
<li>
<a href="{{ U_SEARCH_UNANSWERED }}" role="menuitem">
{{ Icon('font', 'file', lang('SEARCH_UNANSWERED'), false, 'far icon icon-gray') }}
</a>
</li>
<li>
<a href="{{ U_SEARCH_ACTIVE_TOPICS }}" role="menuitem">
{{ Icon('font', 'file-lines', lang('SEARCH_ACTIVE_TOPICS'), false, 'far icon icon-blue') }}
</a>
</li>
<li class="separator"></li>
<li>
<a href="{{ U_SEARCH }}" role="menuitem">
{{ Icon('font', 'search', lang('SEARCH'), false) }}
</a>
</li>
{% endif %}
{% if not S_IS_BOT and (S_DISPLAY_MEMBERLIST or U_TEAM) %}
<li class="separator"></li>
{% if S_DISPLAY_MEMBERLIST %}
<li>
<a href="{{ U_MEMBERLIST }}" role="menuitem">
{{ Icon('font', 'users', lang('MEMBERLIST'), false) }}
</a>
</li>
{% endif %}
{% if U_TEAM %}
<li>
<a href="{{ U_TEAM }}" role="menuitem">
{{ Icon('font', 'shield-halved', lang('THE_TEAM'), false) }}
</a>
</li>
{% endif %}
{% endif %}
{% EVENT navbar_header_quick_links_after %}
<li class="separator in-menu"></li>
{% block nav_main_left_side %}
{% EVENT overall_header_navigation_prepend %}
<li class="in-menu">
<a href="{{ U_FAQ }}" rel="help" title="{{ lang('FAQ_EXPLAIN') }}" role="menuitem">
{{ Icon('font', 'question-circle', lang('FAQ'), false) }}
</a>
</li>
{% EVENT overall_header_navigation_append %}
{% endblock nav_main_left_side %}
</ul>
</div>
</li>
{{ block('nav_main_left_side', _self) }}
{% if U_ACP %}
<li>
<a href="{{ U_ACP }}" title="{{ lang('ACP') }}" role="menuitem">
{{ Icon('font', 'gears', lang('ACP_SHORT'), false) }}
</a>
</li>
{% endif %}
{% if U_MCP %}
<li>
<a href="{{ U_MCP }}" title="{{ lang('MCP') }}" role="menuitem">
{{ Icon('font', 'gavel', lang('MCP_SHORT'), false) }}
</a>
</li>
{% endif %}
{% if S_REGISTERED_USER %}
{% EVENT navbar_header_user_profile_prepend %}
<li id="username_logged_in" class="rightside {% if CURRENT_USER_AVATAR_HTML %} no-bulletin{% endif %}">
{% EVENT navbar_header_username_prepend %}
<div class="header-profile dropdown-container">
<a href="{{ U_PROFILE }}" class="header-avatar dropdown-trigger">
{% if CURRENT_USER_AVATAR_HTML %}{{ CURRENT_USER_AVATAR_HTML }} {% endif %}
{{ CURRENT_USERNAME_SIMPLE }}
{{ Icon('font', 'caret-down', '', true, '', {'style': 'color: #' ~ CURRENT_USER_GROUP_COLOR}) }}
</a>
<div class="dropdown">
<div class="pointer"><div class="pointer-inner"></div></div>
<ul class="dropdown-contents" role="menu">
{% if U_RESTORE_PERMISSIONS %}
<li>
<a href="{{ U_RESTORE_PERMISSIONS }}">
{{ Icon('font', 'rotate', lang('RESTORE_PERMISSIONS'), false) }}
</a>
</li>
{% endif %}
{% EVENT navbar_header_profile_list_before %}
<li>
<a href="{{ U_PROFILE }}" title="{{ lang('PROFILE') }}" role="menuitem">
{{ Icon('font', 'sliders', lang('PROFILE'), false) }}
</a>
</li>
{% if U_USER_PROFILE %}
<li>
<a href="{{ U_USER_PROFILE }}" title="{{ lang('READ_PROFILE') }}" role="menuitem">
{{ Icon('font', 'user', lang('READ_PROFILE'), false) }}
</a>
</li>
{% endif %}
{% EVENT navbar_header_profile_list_after %}
<li class="separator"></li>
<li>
<a href="{{ U_LOGIN_LOGOUT }}" title="{{ lang('LOGIN_LOGOUT') }}" accesskey="x" role="menuitem">
{{ Icon('font', 'power-off', lang('LOGIN_LOGOUT'), false) }}
</a>
</li>
</ul>
</div>
</div>
{% EVENT navbar_header_username_append %}
</li>
{% if S_DISPLAY_PM %}
<li class="rightside">
<a href="{{ U_PRIVATEMSGS }}" role="menuitem">
{{ Icon('font', 'inbox', lang('PRIVATE_MESSAGES'), false) }}<strong class="badge{% if not PRIVATE_MESSAGE_COUNT %} hidden{% endif %}"> {PRIVATE_MESSAGE_COUNT}</strong>
</a>
</li>
{% endif %}
{% if S_NOTIFICATIONS_DISPLAY %}
<li class="dropdown-container dropdown-{S_CONTENT_FLOW_END} rightside">
<a href="{{ U_VIEW_ALL_NOTIFICATIONS }}" id="notification-button" class="dropdown-trigger">
{{ Icon('font', 'bell', lang('NOTIFICATIONS'), false) }}<strong class="badge{% if not NOTIFICATIONS_COUNT %} hidden{% endif %}">{NOTIFICATIONS_COUNT}</strong>
</a>
{% include 'notification_dropdown.html' %}
</li>
{% endif %}
{% EVENT navbar_header_user_profile_append %}
{% elseif not S_IS_BOT %}
<li class="rightside" >
<a href="{{ U_LOGIN_LOGOUT }}" title="{{ lang('LOGIN_LOGOUT') }}" accesskey="x" role="menuitem">
{{ Icon('font', 'power-off', lang('LOGIN_LOGOUT'), false) }}
</a>
</li>
{% if S_REGISTER_ENABLED and not (S_SHOW_COPPA or S_REGISTRATION) %}
<li class="rightside">
<a href="{{ U_REGISTER }}" role="menuitem">
{{ Icon('font', 'pen-to-square', lang('REGISTER'), false) }}
</a>
</li>
{% endif %}
{% EVENT navbar_header_logged_out_content %}
{% endif %}
</ul>
<ul id="nav-breadcrumbs" class="nav-breadcrumbs linklist navlinks" role="menubar">
{% set MICRODATA = 'itemtype="https://schema.org/ListItem" itemprop="itemListElement" itemscope' %}
{% set navlink_position = 1 %}
{% EVENT overall_header_breadcrumbs_before %}
<li class="breadcrumbs" itemscope itemtype="https://schema.org/BreadcrumbList">
{% if U_SITE_HOME %}
<span class="crumb" {{ MICRODATA }}>
{% apply spaceless %}
<a itemprop="item" href="{{ U_SITE_HOME }}" data-navbar-reference="home">
{{ Icon('font', 'home', '', true, 'fas o-icon-baseline') }}
<span itemprop="name">{{ L_SITE_HOME }}</span>
</a>
{% endapply %}
<meta itemprop="position" content="{{ navlink_position }}{% set navlink_position = navlink_position + 1 %}">
</span>
{% endif %}
{% EVENT overall_header_breadcrumb_prepend %}
<span class="crumb" {{ MICRODATA }}>
{% apply spaceless %}
<a itemprop="item" href="{{ U_INDEX }}" accesskey="h" data-navbar-reference="index">
{% if not U_SITE_HOME %}{{ Icon('font', 'home', '', true, 'fas o-icon-baseline') }}{% endif %}
<span itemprop="name">{{ L_INDEX }}</span>
</a>
{% endapply %}
<meta itemprop="position" content="{{ navlink_position }}{% set navlink_position = navlink_position + 1 %}">
</span>
{% for navlink in navlinks %}
{% set NAVLINK_NAME = navlink.BREADCRUMB_NAME | default(navlink.FORUM_NAME) %}
{% set NAVLINK_LINK = navlink.U_BREADCRUMB | default(navlink.U_VIEW_FORUM) %}
{% EVENT overall_header_navlink_prepend %}
<span class="crumb" {{ MICRODATA }}{% if navlink.MICRODATA %} {{ navlink.MICRODATA }}{% endif %}>
{% apply spaceless %}
<a itemprop="item" href="{{ NAVLINK_LINK }}">
<span itemprop="name">{{ NAVLINK_NAME }}</span>
</a>
{% endapply %}
<meta itemprop="position" content="{{ navlink_position }}{% set navlink_position = navlink_position + 1 %}">
</span>
{% EVENT overall_header_navlink_append %}
{% endfor %}
{% EVENT overall_header_breadcrumb_append %}
</li>
{% EVENT overall_header_breadcrumbs_after %}
{% if S_DISPLAY_SEARCH and not S_IN_SEARCH %}
<li class="rightside responsive-search">
<a href="{{ U_SEARCH }}" title="{{ lang('SEARCH_ADV_EXPLAIN') }}" role="menuitem">
{{ Icon('font', 'search', lang('SEARCH'), true) }}
</a>
</li>
{% endif %}
</ul>
</div>
</div>

Some files were not shown because too many files have changed in this diff Show more