Compare commits

...

51 commits

Author SHA1 Message Date
Daniel James
6c95881c59
Merge bd77b30372 into b8c49f9711 2025-06-16 10:19:13 -04:00
Marc Alexander
b8c49f9711
Merge branch '3.3.x' 2025-06-16 10:37:08 +02:00
Marc Alexander
2f43c1facd
[ticket/17399] Fix docblock and use space-ship operator
PHPBB-17399
2025-06-16 10:34:38 +02:00
Marc Alexander
9c49a2b86b
[ticket/17399] Fix declaration to be in line with PHP documentation
PHPBB-17399
2025-06-15 19:59:13 +02:00
Marc Alexander
d017eff8f1
Merge branch '3.3.x' 2025-06-15 09:10:57 +02:00
Marc Alexander
d4a3311b76
Merge pull request #6829 from battye/ticket/17399
[ticket/17399] Fix selected language bug in installer
2025-06-15 09:08:49 +02:00
Marc Alexander
bc470285fc
Merge pull request #6770 from rxu/ticket/15214
[ticket/15214] Add event & functionality for assigning template event priority
2025-06-15 08:59:31 +02:00
rxu
1d7543c778
[ticket/15214] Address code review issues, add equal priority events test
PHPBB3-15214
2025-06-15 01:35:31 +07:00
battye
8411da1819 [ticket/17399] Fix selected language in installer
This fixes a bug where a user could have other languages in the installer
but the language dropdown did not match the language shown.

PHPBB-17399
2025-06-14 14:35:18 +00:00
Marc Alexander
e34e1759c7 Merge branch '3.3.x' 2025-06-14 07:00:39 +00:00
Marc Alexander
8f8a93fa71
Merge pull request #6818 from rxu/ticket/17515
[ticket/17515] Add template event before PM text - 3.3.x
2025-06-14 08:51:41 +02:00
Marc Alexander
f1d8255aca
Merge pull request #6819 from rxu/ticket/17515-master
[ticket/17515] Add template event before PM text - master
2025-06-14 08:51:36 +02:00
Marc Alexander
851de03961
Merge pull request #6821 from rxu/ticket/17509
[ticket/17509] Bump DBMS supported versions
2025-06-14 08:50:03 +02:00
Marc Alexander
0a86130f7f
Merge pull request #6817 from iMattPro/ticket/17513
[ticket/17513] Wrap async logic inside event.waitUntil in push worker
2025-06-14 08:46:57 +02:00
Marc Alexander
083ae1102b Merge branch '3.3.x' 2025-06-13 18:52:53 +00:00
Marc Alexander
c726382d84
Merge pull request #6824 from iMattPro/ticket/17519
[ticket/17519] Correctly encode cron task urls
2025-06-13 20:41:22 +02:00
Marc Alexander
db19a4a578
Merge pull request #6828 from marc1706/ticket/17519-master
[ticket/17519] Correctly encode cron task urls -- master version
2025-06-13 20:41:18 +02:00
Marc Alexander
0b3897b8c3
[ticket/17519] Adapt wrapper test for master
PHPBB-17519
2025-06-12 21:38:55 +02:00
Marc Alexander
b2d48b679f
Merge branch 'ticket/17519' into ticket/17519-master 2025-06-12 21:15:38 +02:00
Marc Alexander
5deeea025f
[ticket/17519] Add unit tests for task wrapper
PHPBB-17519
2025-06-12 21:00:24 +02:00
Matt Friedman
6947dc8c92 [ticket/17519] Correctly encode cron task urls
PHPBB-17519
2025-06-03 04:21:24 +00:00
rxu
f23af6f485
[ticket/17509] Add MariaDB version requirement check
PHPBB-17509
2025-05-30 11:54:32 +07:00
rxu
b8e5caedbf
[ticket/17509] Fix tests
PHPBB-17509
2025-05-30 11:20:25 +07:00
rxu
50e7103080
[ticket/17509] Output db tools error test
PHPBB-17509
2025-05-29 23:15:47 +07:00
rxu
d8bbe3e58c
[ticket/17509] Upgrade Doctrine dbal to the v.3.9
PHPBB-17509
2025-05-29 22:13:32 +07:00
rxu
bf2c22354a
[ticket/17509] Add installer DBMS version checks
PHPBB-17509
2025-05-29 20:27:47 +07:00
rxu
215d1bf1eb
[ticket/17509] Bump DBMS supported versions
PHPBB-17509
2025-05-29 17:45:32 +07:00
rxu
759f061656
Merge branch 'ticket/17515' into ticket/17515-master 2025-05-22 14:02:28 +07:00
rxu
ddc7f1df34
[ticket/17515] Add template event before PM text
PHPBB-17515
2025-05-22 13:29:47 +07:00
rxu
ccbdfb49c7
[ticket/15214] Adjust core event name and docblock
PHPBB3-15214
2025-05-21 11:25:35 +07:00
rxu
43cf7b73bd
[ticket/15214] Adjust event node logic
PHPBB3-15214
2025-05-21 10:47:27 +07:00
Matt Friedman
6b6b5ffc28
[ticket/17513] Fix JS linting
PHPBB-17513
2025-05-20 12:11:39 -07:00
Matt Friedman
4f66ec8758
[ticket/17513] Wrap async logic inside event.waitUntil in push worker
PHPBB-17513
2025-05-20 10:23:00 -07:00
rxu
3a5247d01b
[ticket/15214] Get event dispatcher from environment rather than as dependency
Also this will allow to significantly reduce unrelated tests changes.

PHPBB3-15214
2025-05-20 17:36:15 +07:00
rxu
5e0dc9ef2e
[ticket/15214] Fix rebasing and some other issues
PHPBB3-15214
2025-05-20 16:24:38 +07:00
rxu
8338ff9e56
[ticket/15214] Fix Windows tests
PHPBB3-15214
2025-05-20 16:24:37 +07:00
toxyy
84e7e34a66
[ticket/15214] Fix tests again
Adding per rxu's recommendation

PHPBB3-15214
2025-05-20 16:24:37 +07:00
rxu
18bae795f0
[ticket/15214] Fix Windows tests
Purge Twig compiled cache in Windows.
Set appropriate folder access control options to do that.

PHPBB3-15214
2025-05-20 16:24:36 +07:00
rxu
09fd86ffb0
[ticket/15214] Fix test foo/foo extension listener
PHPBB3-15214
2025-05-20 16:24:34 +07:00
rxu
4a00212f2d
[ticket/15214] Optimize event node code and add template event order tests
PHPBB3-15214
2025-05-20 16:24:34 +07:00
toxyy
cb47d78d26
[ticket/15214] Update block, restart tests
Make docblock look a bit cleaner and restart the tests

PHPBB3-15214
2025-05-20 16:24:33 +07:00
toxyy
0eb98d51e2
[ticket/15214] Provide usage example within event docblock
Adds similar usage examples like the event core.permissions has

PHPBB3-15214
2025-05-20 16:24:32 +07:00
toxyy
82a5e20f3e
[ticket/15214] Replace arrow functions with anonymous functions
Arrow functions aren't added until PHP 7.4, so we can't use them yet.
Anonymous functions have been added since PHP 5.3

PHPBB3-15214
2025-05-20 16:24:32 +07:00
toxyy
71fe9d60c4
[ticket/15214] Add fixes for various other tests
Add new dispatch parameter to the template\twig\extension calls

PHPBB3-15214
2025-05-20 16:24:31 +07:00
toxyy
59b482a222
[ticket/15214] Test fix for test_bbcode_firstpass
Add new dispatch parameter to the template\twig\extension call

PHPBB3-15214
2025-05-20 16:24:30 +07:00
toxyy
d934c8c4b7
[ticket/15214] Test fix for test_helper_url_no_rewrite
Add new dispatch parameter to the template\twig\extension call

PHPBB3-15214
2025-05-20 16:24:29 +07:00
toxyy
d07aeb00d8
[ticket/15214] Add event & functionality for assigning template event priority
Event added to allow template events to be assigned priority per extension,
event location chosen so that it only fires once.
Twig node event class refactored to allow template event priority assignment,
compile calls are deferred until all locations are processed
per extension namespace.
Priority precedence mirrors Symfony priority, with higher numbers
being placed at the beginning of the array.
Duplicate priority assignment will currently have the later events
compiled before the others.

PHPBB3-15214
2025-05-20 16:24:24 +07: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
212 changed files with 20028 additions and 111 deletions

View file

@ -20,7 +20,7 @@
<form method="post" action="#" id="language_selector">
<fieldset class="nobg">
<label for="language">{L_SELECT_LANG}{L_COLON}</label>
<select id="language" name="language">
<select id="language" name="language">
<!-- BEGIN language_select_item -->
<option value="{language_select_item.VALUE}"<!-- IF language_select_item.SELECTED --> selected="selected"<!-- ENDIF -->>{language_select_item.NAME}</option>
<!-- END language_select_item -->

View file

@ -36,7 +36,7 @@
"composer/composer": "^2.0",
"composer/installers": "^1.9",
"composer/package-versions-deprecated": "^1.11",
"doctrine/dbal": "~3.3.6",
"doctrine/dbal": "^3.9",
"google/recaptcha": "~1.1",
"guzzlehttp/guzzle": " ^7.0",
"marc1706/fast-image-size": "^1.1",

38
phpBB/composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "5ed4369e5ba29297443f428dd3001fae",
"content-hash": "39f3a7c03ba85a8c7892e5c076372eb0",
"packages": [
{
"name": "bantu/ini-get-wrapper",
@ -1128,38 +1128,38 @@
},
{
"name": "doctrine/dbal",
"version": "3.3.8",
"version": "3.9.4",
"source": {
"type": "git",
"url": "https://github.com/doctrine/dbal.git",
"reference": "f873a820227bc352d023791775a01f078a30dfe1"
"reference": "ec16c82f20be1a7224e65ac67144a29199f87959"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/dbal/zipball/f873a820227bc352d023791775a01f078a30dfe1",
"reference": "f873a820227bc352d023791775a01f078a30dfe1",
"url": "https://api.github.com/repos/doctrine/dbal/zipball/ec16c82f20be1a7224e65ac67144a29199f87959",
"reference": "ec16c82f20be1a7224e65ac67144a29199f87959",
"shasum": ""
},
"require": {
"composer-runtime-api": "^2",
"doctrine/cache": "^1.11|^2.0",
"doctrine/deprecations": "^0.5.3|^1",
"doctrine/event-manager": "^1.0",
"php": "^7.3 || ^8.0",
"doctrine/event-manager": "^1|^2",
"php": "^7.4 || ^8.0",
"psr/cache": "^1|^2|^3",
"psr/log": "^1|^2|^3"
},
"require-dev": {
"doctrine/coding-standard": "9.0.0",
"jetbrains/phpstorm-stubs": "2022.1",
"phpstan/phpstan": "1.8.2",
"phpstan/phpstan-strict-rules": "^1.3",
"phpunit/phpunit": "9.5.21",
"psalm/plugin-phpunit": "0.17.0",
"squizlabs/php_codesniffer": "3.7.1",
"symfony/cache": "^5.2|^6.0",
"symfony/console": "^2.7|^3.0|^4.0|^5.0|^6.0",
"vimeo/psalm": "4.24.0"
"doctrine/coding-standard": "12.0.0",
"fig/log-test": "^1",
"jetbrains/phpstorm-stubs": "2023.1",
"phpstan/phpstan": "2.1.1",
"phpstan/phpstan-strict-rules": "^2",
"phpunit/phpunit": "9.6.22",
"slevomat/coding-standard": "8.13.1",
"squizlabs/php_codesniffer": "3.10.2",
"symfony/cache": "^5.4|^6.0|^7.0",
"symfony/console": "^4.4|^5.4|^6.0|^7.0"
},
"suggest": {
"symfony/console": "For helpful console commands such as SQL execution and import of files."
@ -1219,7 +1219,7 @@
],
"support": {
"issues": "https://github.com/doctrine/dbal/issues",
"source": "https://github.com/doctrine/dbal/tree/3.3.8"
"source": "https://github.com/doctrine/dbal/tree/3.9.4"
},
"funding": [
{
@ -1235,7 +1235,7 @@
"type": "tidelift"
}
],
"time": "2022-08-05T15:35:35+00:00"
"time": "2025-01-16T08:28:55+00:00"
},
{
"name": "doctrine/deprecations",

View file

@ -2821,6 +2821,13 @@ ucp_pm_viewmessage_custom_fields_before
* Purpose: Add data before the custom fields on the user profile when viewing
a private message
ucp_pm_viewmessage_message_content_before
===
* Locations:
+ styles/prosilver/template/ucp_pm_viewmessage.html
* Since: 3.3.16-RC1
* Purpose: Add content before the private message text
ucp_pm_viewmessage_options_before
===
* Locations:

View file

@ -70,11 +70,11 @@ $lang = array_merge($lang, array(
<p>phpBB supports the following databases:</p>
<ul>
<li>MySQL 4.1.3 or above (MySQLi required)</li>
<li>PostgreSQL 8.3+</li>
<li>SQLite 3.6.15+</li>
<li>MS SQL Server 2000 or above (directly or via ODBC)</li>
<li>MS SQL Server 2005 or above (native)</li>
<li>MySQL 5.6 or above</li>
<li>MariaDB 10.2.7 or above</li>
<li>PostgreSQL 9.4 or above</li>
<li>SQLite 3.8.3 or above</li>
<li>MS SQL Server 2012 or above (via ODBC or the native adapter)</li>
<li>Oracle</li>
</ul>
@ -184,9 +184,9 @@ $lang = array_merge($lang, array(
'TABLE_PREFIX_EXPLAIN' => 'The prefix must start with a letter and must only contain letters, numbers and underscores.',
// Database options
'DB_OPTION_MSSQL_ODBC' => 'MSSQL Server 2000+ via ODBC',
'DB_OPTION_MSSQLNATIVE' => 'MSSQL Server 2005+ [ Native ]',
'DB_OPTION_MYSQLI' => 'MySQL with MySQLi Extension',
'DB_OPTION_MSSQL_ODBC' => 'MSSQL Server via ODBC',
'DB_OPTION_MSSQLNATIVE' => 'MSSQL Server [ Native ]',
'DB_OPTION_MYSQLI' => 'MySQL',
'DB_OPTION_ORACLE' => 'Oracle',
'DB_OPTION_POSTGRES' => 'PostgreSQL',
'DB_OPTION_SQLITE3' => 'SQLite 3',
@ -202,10 +202,13 @@ $lang = array_merge($lang, array(
'INST_ERR_DB_NO_WRITABLE' => 'Both the database and the directory containing it must be writable.',
'INST_ERR_DB_NO_ERROR' => 'No error message given.',
'INST_ERR_PREFIX' => 'Tables with the specified prefix already exist, please choose an alternative.',
'INST_ERR_DB_NO_MYSQLI' => 'The version of MySQL installed on this machine is incompatible with the “MySQL with MySQLi Extension” option you have selected. Please try the “MySQL” option instead.',
'INST_ERR_DB_NO_SQLITE3' => 'The version of the SQLite extension you have installed is too old, it must be upgraded to at least 3.6.15.',
'INST_ERR_DB_NO_ORACLE' => 'The version of Oracle installed on this machine requires you to set the <var>NLS_CHARACTERSET</var> parameter to <var>UTF8</var>. Either upgrade your installation to 9.2+ or change the parameter.',
'INST_ERR_DB_NO_POSTGRES' => 'The database you have selected was not created in <var>UNICODE</var> or <var>UTF8</var> encoding. Try installing with a database in <var>UNICODE</var> or <var>UTF8</var> encoding.',
'INST_ERR_DB_NO_MARIADB' => 'The version of MariaDB installed on this machine is too old, it must be upgraded to at least 10.2.7.',
'INST_ERR_DB_NO_MYSQLI' => 'The version of MySQL installed on this machine is too old, it must be upgraded to at least 5.6.',
'INST_ERR_DB_NO_MSSQL' => 'The version of Microsoft SQL Server installed on this machine is too old, it must be upgraded to at least SQL Server 2012 (11.0.2100.60)',
'INST_ERR_DB_NO_SQLITE3' => 'The version of the SQLite extension you have installed is too old, it must be upgraded to at least 3.8.3.',
'INST_ERR_DB_NO_ORACLE' => 'The version of Oracle installed is too old, it must be upgraded to at least 12.1.0.2.',
'INST_ERR_DB_NO_POSTGRES' => 'The version of the PostgreSQL you have installed is too old, it must be upgraded to at least 9.4.',
'INST_ERR_DB_NO_POSTGRES_UTF8' => 'The database you have selected was not created in <var>UNICODE</var> or <var>UTF8</var> encoding. Try installing with a database in <var>UNICODE</var> or <var>UTF8</var> encoding.',
'INST_SCHEMA_FILE_NOT_WRITABLE' => 'The schema file is not writable',
//

View file

@ -79,7 +79,7 @@ class connection_parameter_factory
string|null $name = null,
string|null $port = null) : array
{
if ($params['driver'] === 'pdo_sqlite')
if (in_array($params['driver'], ['pdo_sqlite', 'sqlite3']))
{
return self::enrich_parameters(
self::build_sqlite_parameters($params, $host, $user, $password)

View file

@ -15,7 +15,7 @@ namespace phpbb\db\driver;
/**
* SQLite3 Database Abstraction Layer
* Minimum Requirement: 3.6.15+
* Minimum Requirement: 3.8.3+
*/
class sqlite3 extends \phpbb\db\driver\driver
{

View file

@ -289,6 +289,12 @@ class doctrine implements tools_interface
if (count($primary_key_indexes))
{
// For PostgreSQL, drop primary index first to avoid "Dependent objects still exist" error
if (stripos($this->get_schema_manager()->getDatabasePlatform()->getname(), 'postgresql') !== false)
{
$this->get_schema_manager()->dropIndex('"primary"', $table_name);
}
$ret = $this->alter_schema(
function (Schema $schema) use ($table_name, $column_name): void
{
@ -478,7 +484,7 @@ class doctrine implements tools_interface
catch (Exception $e)
{
// @todo: check if it makes sense to properly handle the exception
return false;
return [$e->getMessage()];
}
}

View file

@ -339,6 +339,14 @@ class helper
protected function render_language_select($selected_language = null)
{
$langs = $this->lang_helper->get_available_languages();
// The first language will be selected by default. Unless a user has consciously included
// other languages in the installation process, it will be British English anyway.
if ($selected_language === null && count($langs))
{
$selected_language = $langs[0]['iso'];
}
foreach ($langs as $lang)
{
$this->template->assign_block_vars('language_select_item', array(

View file

@ -39,7 +39,7 @@ class database
// Note: php 5.5 alpha 2 deprecated mysql.
// Keep mysqli before mysql in this list.
'mysqli' => array(
'LABEL' => 'MySQL with MySQLi Extension',
'LABEL' => 'MySQL',
'SCHEMA' => 'mysql_41',
'MODULE' => 'mysqli',
'DOCTRINE' => ['pdo_mysql'],
@ -59,7 +59,7 @@ class database
'2.0.x' => true,
),
'mssqlnative' => array(
'LABEL' => 'MS SQL Server 2005+ [ Native ]',
'LABEL' => 'MS SQL Server [ Native ]',
'SCHEMA' => 'mssql',
'MODULE' => 'sqlsrv',
'DOCTRINE' => ['pdo_sqlsrv'],
@ -78,7 +78,7 @@ class database
'2.0.x' => false,
),
'postgres' => array(
'LABEL' => 'PostgreSQL 8.3+',
'LABEL' => 'PostgreSQL',
'SCHEMA' => 'postgres',
'MODULE' => 'pgsql',
'DOCTRINE' => ['pdo_pgsql'],
@ -405,10 +405,29 @@ class database
}
// Check if database version is supported
/** @psalm-suppress UndefinedInterfaceMethod */
$db_server_version = $doctrine_db->getWrappedConnection()->getServerVersion();
switch ($dbms)
{
case 'mysqli':
if (stripos($db->sql_server_info(), 'mariadb') !== false && version_compare($db_server_version, '10.2.7', '<'))
{
$errors[] = array(
'title' => 'INST_ERR_DB_NO_MARIADB',
);
}
else
{
if (version_compare($db_server_version, '5.6', '<'))
{
$errors[] = array(
'title' => 'INST_ERR_DB_NO_MYSQLI',
);
}
}
break;
case 'sqlite3':
if (version_compare($db->sql_server_info(true), '3.6.15', '<'))
if (version_compare($db_server_version, '3.8.3', '<'))
{
$errors[] = array(
'title' => 'INST_ERR_DB_NO_SQLITE3',
@ -416,20 +435,7 @@ class database
}
break;
case 'oracle':
$sql = "SELECT *
FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER = 'NLS_RDBMS_VERSION'
OR PARAMETER = 'NLS_CHARACTERSET'";
$result = $db->sql_query($sql);
$stats = [];
while ($row = $db->sql_fetchrow($result))
{
$stats[$row['parameter']] = $row['value'];
}
$db->sql_freeresult($result);
if (version_compare($stats['NLS_RDBMS_VERSION'], '9.2', '<') && $stats['NLS_CHARACTERSET'] !== 'UTF8')
if (version_compare($db_server_version, '12.1.0.2', '<'))
{
$errors[] = array(
'title' => 'INST_ERR_DB_NO_ORACLE',
@ -437,17 +443,35 @@ class database
}
break;
case 'postgres':
$sql = "SHOW server_encoding;";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
if ($row['server_encoding'] !== 'UNICODE' && $row['server_encoding'] !== 'UTF8')
if (version_compare($db_server_version, '9.4', '<'))
{
$errors[] = array(
'title' => 'INST_ERR_DB_NO_POSTGRES',
);
}
else
{
$sql = "SHOW server_encoding;";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
if ($row['server_encoding'] !== 'UNICODE' && $row['server_encoding'] !== 'UTF8')
{
$errors[] = array(
'title' => 'INST_ERR_DB_NO_POSTGRES_UTF8',
);
}
}
break;
case 'mssqlnative':
case 'mssql_odbc':
if (version_compare($db_server_version, '11.0.2100.60', '<'))
{
$errors[] = array(
'title' => 'INST_ERR_DB_NO_MSSQL',
);
}
break;
}
}

View file

@ -65,6 +65,8 @@ class language_file_helper
$available_languages[] = $this->get_language_data_from_json($data);
}
usort($available_languages, [$this, 'sort_by_local_name']);
return $available_languages;
}
@ -123,4 +125,16 @@ class language_file_helper
'turnstile_lang' => $data['extra']['turnstile-lang'] ?? '',
];
}
/**
* Sorts the languages by their name instead of iso code
*
* @param mixed $a First language data
* @param mixed $b Second language data
* @return int
*/
private static function sort_by_local_name(mixed $a, mixed $b): int
{
return $a['local_name'] <=> $b['local_name'];
}
}

View file

@ -161,6 +161,16 @@ class environment extends \Twig\Environment
return $this->assets_bag;
}
/**
* Gets the event dispatcher instance
*
* @return dispatcher_interface
*/
public function get_phpbb_dispatcher()
{
return $this->phpbb_dispatcher;
}
/**
* Get the namespace look up order
*

View file

@ -24,9 +24,13 @@ class event extends \Twig\Node\Node
/** @var \phpbb\template\twig\environment */
protected $environment;
public function __construct(\Twig\Node\Expression\AbstractExpression $expr, \phpbb\template\twig\environment $environment, $lineno, $tag = null)
/** @var array */
protected $template_event_priority_array;
public function __construct(\Twig\Node\Expression\AbstractExpression $expr, \phpbb\template\twig\environment $environment, $lineno, $tag = null, $template_event_priority_array = [])
{
$this->environment = $environment;
$this->template_event_priority_array = $template_event_priority_array;
parent::__construct(array('expr' => $expr), array(), $lineno, $tag);
}
@ -42,10 +46,20 @@ class event extends \Twig\Node\Node
$location = $this->listener_directory . $this->getNode('expr')->getAttribute('name');
$template_event_listeners = [];
// Group and sort extension template events in according to their priority (0 by default if not set)
foreach ($this->environment->get_phpbb_extensions() as $ext_namespace => $ext_path)
{
$ext_namespace = str_replace('/', '_', $ext_namespace);
$priority_key = intval($this->template_event_priority_array[$ext_namespace][$location] ?? 0);
$template_event_listeners[$priority_key][] = $ext_namespace;
}
krsort($template_event_listeners);
$template_event_listeners = array_merge(...$template_event_listeners);
foreach ($template_event_listeners as $ext_namespace)
{
if ($this->environment->isDebug())
{
// If debug mode is enabled, lets check for new/removed EVENT
@ -54,8 +68,7 @@ class event extends \Twig\Node\Node
// purge the cache when a new event template file is added)
$compiler
->write("if (\$this->env->getLoader()->exists('@{$ext_namespace}/{$location}.html')) {\n")
->indent()
;
->indent();
}
if ($this->environment->isDebug() || $this->environment->getLoader()->exists('@' . $ext_namespace . '/' . $location . '.html'))
@ -66,16 +79,14 @@ class event extends \Twig\Node\Node
// We set the namespace lookup order to be this extension first, then the main path
->write("\$this->env->setNamespaceLookUpOrder(array('{$ext_namespace}', '__main__'));\n")
->write("\$this->env->loadTemplate(\$this->env->getTemplateClass('@{$ext_namespace}/{$location}.html'), '@{$ext_namespace}/{$location}.html')->display(\$context);\n")
->write("\$this->env->setNamespaceLookUpOrder(\$previous_look_up_order);\n")
;
->write("\$this->env->setNamespaceLookUpOrder(\$previous_look_up_order);\n");
}
if ($this->environment->isDebug())
{
$compiler
->outdent()
->write("}\n\n")
;
->write("}\n\n");
}
}
}

View file

@ -18,6 +18,9 @@ class event extends \Twig\TokenParser\AbstractTokenParser
/** @var \phpbb\template\twig\environment */
protected $environment;
/** @var array */
protected $template_event_priority_array;
/**
* Constructor
*
@ -26,6 +29,25 @@ class event extends \Twig\TokenParser\AbstractTokenParser
public function __construct(\phpbb\template\twig\environment $environment)
{
$this->environment = $environment;
$phpbb_dispatcher = $this->environment->get_phpbb_dispatcher();
$template_event_priority_array = [];
/**
* Allows assigning priority to template event listeners
*
* @event core.twig_event_tokenparser_constructor
* @var array template_event_priority_array Array with template event priority assignments per extension namespace
*
* @since 4.0.0-a1
*/
if ($phpbb_dispatcher)
{
$vars = ['template_event_priority_array'];
extract($phpbb_dispatcher->trigger_event('core.twig_event_tokenparser_constructor', compact($vars)));
}
$this->template_event_priority_array = $template_event_priority_array;
unset($template_event_priority_array);
}
/**
@ -42,7 +64,7 @@ class event extends \Twig\TokenParser\AbstractTokenParser
$stream = $this->parser->getStream();
$stream->expect(\Twig\Token::BLOCK_END_TYPE);
return new \phpbb\template\twig\node\event($expr, $this->environment, $token->getLine(), $this->getTag());
return new \phpbb\template\twig\node\event($expr, $this->environment, $token->getLine(), $this->getTag(), $this->template_event_priority_array);
}
/**

View file

@ -34,41 +34,48 @@ self.addEventListener('push', event => {
notificationVersion = parseInt(notificationData.version, 10);
pushToken = notificationData.token;
} catch {
self.registration.showNotification(event.data.text());
event.waitUntil(self.registration.showNotification(event.data.text()));
return;
}
const getNotificationUrl = '{{ U_WEBPUSH_GET_NOTIFICATION }}';
const assetsVersion = parseInt('{{ ASSETS_VERSION }}', 10);
event.waitUntil((async() => {
const getNotificationUrl = '{{ U_WEBPUSH_GET_NOTIFICATION }}';
const assetsVersion = parseInt('{{ ASSETS_VERSION }}', 10);
// Force update if versions differ
if (assetsVersion !== notificationVersion) {
self.registration.update();
}
// Force update if versions differ
if (assetsVersion !== notificationVersion) {
await self.registration.update();
}
const formData = new FormData();
formData.append('item_id', itemId.toString(10));
formData.append('type_id', typeId.toString(10));
formData.append('user_id', userId.toString(10));
formData.append('token', pushToken);
const formData = new FormData();
formData.append('item_id', itemId.toString(10));
formData.append('type_id', typeId.toString(10));
formData.append('user_id', userId.toString(10));
formData.append('token', pushToken);
fetch(getNotificationUrl, {
method: 'POST',
headers: {
'X-Requested-With': 'XMLHttpRequest',
},
body: formData,
})
.then(response => response.json())
.then(response => {
const responseBody = response.title + '\n' + response.text;
try {
const response = await fetch(getNotificationUrl, {
method: 'POST',
headers: {
'X-Requested-With': 'XMLHttpRequest',
},
body: formData,
});
const responseData = await response.json();
const responseBody = responseData.title + '\n' + responseData.text;
const options = {
body: responseBody,
data: response,
icon: response.avatar.src,
data: responseData,
icon: responseData.avatar.src,
};
self.registration.showNotification(response.heading, options);
});
await self.registration.showNotification(responseData.heading, options);
} catch (e) {
console.error('Push error:', e);
}
})());
});
/**

View file

@ -4,4 +4,4 @@
to hide visually and `aria-hidden="true"` to hide from screen-readers; using
`hidden` or `display: none` would prevent the task from running.
#}
<img class="sr-only" aria-hidden="true" src="{{ CRON_TASK_URL|e('html_attr') }}" width="1" height="1" alt="">
<img class="sr-only" aria-hidden="true" src="{{ CRON_TASK_URL|e('url') }}" width="1" height="1" alt="">

View file

@ -149,6 +149,7 @@
<!-- 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>
{% EVENT ucp_pm_viewmessage_message_content_before %}
<div class="content">{MESSAGE}</div>

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>

View file

@ -0,0 +1,56 @@
<div id="notification-menu" class="dropdown dropdown-extended notification-menu">
<div class="pointer dropdown-extended-pointer"><div class="pointer-inner"></div></div>
<div class="dropdown-contents">
<div class="header">
{L_NOTIFICATIONS}
<span class="header-settings">
<a href="{U_NOTIFICATION_SETTINGS}">{L_SETTINGS}</a>
<!-- IF NOTIFICATIONS_COUNT -->
<span id="mark_all_notifications"> &bull; <a href="{U_MARK_ALL_NOTIFICATIONS}" data-ajax="notification.mark_all_read">{L_MARK_ALL_READ}</a></span>
<!-- ENDIF -->
</span>
</div>
<ul class="dropdown-extended-list notification-list">
<!-- IF not .notifications -->
<li class="dropdown-extended-item no-notifications">
{L_NO_NOTIFICATIONS}
</li>
<!-- ENDIF -->
<!-- BEGIN notifications -->
<li class="dropdown-extended-item notification-item<!-- IF notifications.UNREAD --> bg2<!-- ENDIF --><!-- IF notifications.STYLING --> {notifications.STYLING}<!-- ENDIF --><!-- IF not notifications.URL --> no-url<!-- ENDIF -->" <!-- IF notifications.UNREAD -->data-notification-unread="true"<!-- ENDIF -->>
<!-- IF notifications.URL -->
<a class="notification-block" href="<!-- IF notifications.UNREAD -->{notifications.U_MARK_READ}" data-real-url="{notifications.URL}<!-- ELSE -->{notifications.URL}<!-- ENDIF -->">
<!-- ENDIF -->
<!-- IF notifications.AVATAR_HTML -->{notifications.AVATAR_HTML}<!-- ELSE --><img class="avatar notification-avatar" src="{{ NO_AVATAR_SOURCE }}" alt="" /><!-- ENDIF -->
<div class="notification-text">
<p class="notification-title">{notifications.FORMATTED_TITLE}</p>
<!-- IF notifications.REFERENCE --><p class="notification-reference">{notifications.REFERENCE}</p><!-- ENDIF -->
<!-- IF notifications.FORUM --><p class="notification-forum">{notifications.FORUM}</p><!-- ENDIF -->
<!-- IF notifications.REASON --><p class="notification-reason">{notifications.REASON}</p><!-- ENDIF -->
<p class="notification-time">{notifications.TIME}</p>
</div>
<!-- IF notifications.URL --></a><!-- ENDIF -->
<!-- IF notifications.UNREAD -->
<a href="{notifications.U_MARK_READ}" class="mark_read icon-mark" data-ajax="notification.mark_read" title="{L_MARK_READ}">
{{ Icon('font', 'circle-check', lang('MARK_READ'), true, 'fas c-notification-check-icon') }}
</a>
<!-- ENDIF -->
</li>
<!-- END notifications -->
</ul>
{% EVENT notification_dropdown_footer_before %}
<div class="footer">
<a href="{U_VIEW_ALL_NOTIFICATIONS}"><span>{L_SEE_ALL}</span></a>
</div>
{% if NOTIFICATIONS_WEBPUSH_ENABLE and notification_types is not defined %}
<div class="footer webpush-subscribe">
<span class="ellipsis-text">{{ lang('NOTIFY_WEB_PUSH_ENABLE') ~ lang('COLON') }}</span>
<button id="subscribe_webpush" name="subscribe_webpush" class="notification-subscribe-toggle" data-l-err="{{ lang('INFORMATION') }}" data-l-msg="{{ lang('NOTIFY_WEB_PUSH_DENIED') }}">{{ Icon('svg', 'toggle-off', lang('NOTIFY_WEB_PUSH_SUBSCRIBE'), true, 'push-subscribe-toggle-icon toggle-off') }}</button>
<button id="unsubscribe_webpush" name="unsubscribe_webpush" class="notification-subscribe-toggle hidden">{{ Icon('svg', 'toggle-on', lang('NOTIFY_WEB_PUSH_SUBSCRIBED'), true, 'push-subscribe-toggle-icon toggle-on') }}</button>
</div>
{% endif %}
{% EVENT notification_dropdown_footer_after %}
</div>
</div>

View file

@ -0,0 +1,128 @@
<!-- EVENT overall_footer_content_after -->
</div>
<!-- EVENT overall_footer_page_body_after -->
<div id="page-footer" class="page-footer" role="contentinfo">
<!-- INCLUDE navbar_footer.html -->
<div class="copyright">
<!-- EVENT overall_footer_copyright_prepend -->
<p class="footer-row">
<span class="footer-copyright">{{ CREDIT_LINE }}</span>
</p>
<!-- IF TRANSLATION_INFO -->
<p class="footer-row">
<span class="footer-copyright">{{ TRANSLATION_INFO }}</span>
</p>
<!-- ENDIF -->
<!-- EVENT overall_footer_copyright_append -->
<p class="footer-row" role="menu">
<a class="footer-link" href="{{ U_PRIVACY }}" title="{{ lang('PRIVACY_LINK') }}" role="menuitem">
<span class="footer-link-text">{{ lang('PRIVACY_LINK') }}</span>
</a>
|
<a class="footer-link" href="{{ U_TERMS_USE }}" title="{{ lang('TERMS_LINK') }}" role="menuitem">
<span class="footer-link-text">{{ lang('TERMS_LINK') }}</span>
</a>
</p>
<!-- IF DEBUG_OUTPUT -->
<p class="footer-row">
<span class="footer-info">{{ DEBUG_OUTPUT }}</span>
</p>
<!-- ENDIF -->
<!-- IF U_ACP -->
<p class="footer-row">
<a class="footer-link text-strong" href="{{ U_ACP }}">{{ lang('ACP') }}</a>
</p>
<!-- ENDIF -->
</div>
<div id="darkenwrapper" class="darkenwrapper" data-ajax-error-title="{L_AJAX_ERROR_TITLE}" data-ajax-error-text="{L_AJAX_ERROR_TEXT}" data-ajax-error-text-abort="{L_AJAX_ERROR_TEXT_ABORT}" data-ajax-error-text-timeout="{L_AJAX_ERROR_TEXT_TIMEOUT}" data-ajax-error-text-parsererror="{L_AJAX_ERROR_TEXT_PARSERERROR}">
<div id="darken" class="darken">&nbsp;</div>
</div>
<div id="loading_indicator" class="loading_indicator">
<div class="loader">
<svg class="spinner" width="48px" height="48px" viewBox="0 0 66 66" xmlns="http://www.w3.org/2000/svg" aria-labelledby="loader-title" role="img">
<title id="loader-title">{L_LOADING}</title>
<circle class="spinner-path" fill="none" stroke-width="6" stroke-linecap="round" cx="33" cy="33" r="30"></circle>
</svg>
</div>
</div>
<div id="phpbb_alert" class="phpbb_alert" data-l-err="{L_ERROR}" data-l-timeout-processing-req="{L_TIMEOUT_PROCESSING_REQ}">
<a href="#" class="alert_close">
{{ Icon('font', 'circle-xmark', '', true) }}
</a>
<h3 class="alert_title">&nbsp;</h3><p class="alert_text"></p>
</div>
<div id="phpbb_confirm" class="phpbb_alert">
<a href="#" class="alert_close">
{{ Icon('font', 'circle-xmark', '', true) }}
</a>
<div class="alert_text"></div>
</div>
</div>
</div>
<div>
<a id="bottom" class="anchor" accesskey="z"></a>
{% if not S_IS_BOT %}{{ RUN_CRON_TASK }}{% endif %}
</div>
<script src="{T_JQUERY_LINK}"></script>
<!-- IF S_ALLOW_CDN --><script>window.jQuery || document.write('\x3Cscript src="{T_ASSETS_PATH}/javascript/jquery-3.7.1.min.js?assets_version={T_ASSETS_VERSION}">\x3C/script>');</script><!-- ENDIF -->
<script src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script>
<!-- INCLUDEJS forum_fn.js -->
<!-- INCLUDEJS ajax.js -->
{% if S_ALLOW_CDN %}
<script>
(function($){
const $fa_cdn = $('head').find('link[rel="stylesheet"]').first(),
$span = $('<span class="fa" style="display:none"></span>').appendTo('body');
if ($span.css('fontFamily') !== '"Font Awesome 6 Free"') {
$fa_cdn.after('<link href="{{ T_ASSETS_PATH ~ '/css/font-awesome.min.css' }}" rel="stylesheet">');
$fa_cdn.remove();
}
$span.remove();
})(jQuery);
</script>
{% endif %}
<!-- IF S_COOKIE_NOTICE -->
<script src="{T_ASSETS_PATH}/cookieconsent/cookieconsent.min.js?assets_version={T_ASSETS_VERSION}"></script>
<script>
if (typeof window.cookieconsent === "object") {
window.addEventListener("load", function(){
window.cookieconsent.initialise({
"palette": {
"popup": {
"background": "#0F538A"
},
"button": {
"background": "#E5E5E5"
}
},
"theme": "classic",
"content": {
"message": "{LA_COOKIE_CONSENT_MSG}",
"dismiss": "{LA_COOKIE_CONSENT_OK}",
"link": "{LA_COOKIE_CONSENT_INFO}",
"href": "{UA_PRIVACY}"
}
});
});
}
</script>
<!-- ENDIF -->
<!-- EVENT overall_footer_after -->
<!-- IF S_PLUPLOAD --><!-- INCLUDE plupload.html --><!-- ENDIF -->
{$SCRIPTS}
<!-- EVENT overall_footer_body_after -->
</body>
</html>

View file

@ -0,0 +1,137 @@
<!DOCTYPE html>
<html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="apple-mobile-web-app-title" content="{{ SITENAME }}">
{META}
<title><!-- IF UNREAD_NOTIFICATIONS_COUNT -->({UNREAD_NOTIFICATIONS_COUNT}) <!-- ENDIF --><!-- IF not S_VIEWTOPIC and not S_VIEWFORUM -->{SITENAME} - <!-- ENDIF --><!-- IF S_IN_MCP -->{L_MCP} - <!-- ELSEIF S_IN_UCP -->{L_UCP} - <!-- ENDIF -->{PAGE_TITLE}<!-- IF S_VIEWTOPIC or S_VIEWFORUM --> - {SITENAME}<!-- ENDIF --></title>
<!-- IF S_ENABLE_FEEDS -->
<!-- IF S_ENABLE_FEEDS_OVERALL --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {SITENAME}" href="{{ path('phpbb_feed_index') }}"><!-- ENDIF -->
<!-- IF S_ENABLE_FEEDS_NEWS --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_FEED_NEWS}" href="{{ path('phpbb_feed_news') }}"><!-- ENDIF -->
<!-- IF S_ENABLE_FEEDS_FORUMS --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_ALL_FORUMS}" href="{{ path('phpbb_feed_forums') }}"><!-- ENDIF -->
<!-- IF S_ENABLE_FEEDS_TOPICS --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_FEED_TOPICS_NEW}" href="{{ path('phpbb_feed_topics') }}"><!-- ENDIF -->
<!-- IF S_ENABLE_FEEDS_TOPICS_ACTIVE --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_FEED_TOPICS_ACTIVE}" href="{{ path('phpbb_feed_topics_active') }}"><!-- ENDIF -->
<!-- IF S_ENABLE_FEEDS_FORUM and S_FORUM_ID --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_FORUM} - {FORUM_NAME}" href="{{ path('phpbb_feed_forum', { forum_id : S_FORUM_ID } ) }}"><!-- ENDIF -->
<!-- IF S_ENABLE_FEEDS_TOPIC and S_TOPIC_ID --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_TOPIC} - {TOPIC_TITLE}" href="{{ path('phpbb_feed_topic', { topic_id : S_TOPIC_ID } ) }}"><!-- ENDIF -->
<!-- EVENT overall_header_feeds -->
<!-- ENDIF -->
<!-- IF U_CANONICAL -->
<link rel="canonical" href="{U_CANONICAL}">
<!-- ENDIF -->
<!--
phpBB style name: prosilver2
Based on style: prosilver
Original author: phpBB Limited ( https://www.phpbb.com/ )
Modified by: phpBB Limited ( https://www.phpbb.com/ )
-->
<!-- IF S_ALLOW_CDN -->
<script>
WebFontConfig = {
google: {
families: ['Open+Sans:300,300i,400,400i,600,600i,700,700i,800,800i&subset=cyrillic,cyrillic-ext,greek,greek-ext,latin-ext,vietnamese']
}
};
(function(d) {
var wf = d.createElement('script'), s = d.scripts[0];
wf.src = 'https://cdn.jsdelivr.net/npm/webfontloader@1.6.28/webfontloader.min.js';
wf.async = true;
s.parentNode.insertBefore(wf, s);
})(document);
</script>
<!-- ENDIF -->
<link href="{T_FONT_AWESOME_LINK}" rel="stylesheet">
<link href="{T_STYLESHEET_LINK}" rel="stylesheet">
<link href="{T_STYLESHEET_LANG_LINK}" rel="stylesheet">
<!-- IF S_PLUPLOAD -->
<link href="{T_THEME_PATH}/plupload.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet">
<!-- ENDIF -->
<!-- IF S_COOKIE_NOTICE -->
<link href="{T_ASSETS_PATH}/cookieconsent/cookieconsent.min.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet">
<!-- ENDIF -->
<link rel="manifest" href="{{ U_MANIFEST }}">
<!-- EVENT overall_header_head_append -->
{$STYLESHEETS}
<!-- EVENT overall_header_stylesheets_after -->
{% if NOTIFICATIONS_WEBPUSH_ENABLE %}
{% include('ucp_notifications_webpush.html') %}
{% endif %}
</head>
<body id="phpbb" class="nojs notouch section-{SCRIPT_NAME} {S_CONTENT_DIRECTION} {BODY_CLASS}">
<!-- EVENT overall_header_body_before -->
<div id="wrap" class="wrap">
<a id="top" class="top-anchor" accesskey="t"></a>
<div id="page-header">
<div class="headerbar" role="banner">
<!-- EVENT overall_header_headerbar_before -->
<div class="inner">
<hgroup id="site-description" class="site-description c-hero">
<a id="logo" class="c-hero-logo" href="{% if U_SITE_HOME %}{{ U_SITE_HOME }}{% else %}{{ U_INDEX }}{% endif %}" title="{% if U_SITE_HOME %}{{ L_SITE_HOME }}{% else %}{{ L_INDEX }}{% endif %}">
{{ Icon('svg', 'logo', SITENAME, true, 'c-hero-logo-img') }}
</a>
<h1 class="c-hero-heading">
{{ SITENAME }}
<p class="c-hero-lead">{{ SITE_DESCRIPTION }}</p>
</h1>
<p class="skiplink"><a href="#start_here">{L_SKIP}</a></p>
</hgroup>
<!-- EVENT overall_header_searchbox_before -->
<!-- IF S_DISPLAY_SEARCH and not S_IN_SEARCH -->
<div id="search-box" class="search-box search-header" role="search">
<form action="{U_SEARCH}" method="get" id="search">
<fieldset>
<input name="keywords" id="keywords" type="search" maxlength="128" title="{L_SEARCH_KEYWORDS}" class="inputbox search tiny" size="20" value="{SEARCH_WORDS}" placeholder="{L_SEARCH_MINI}" />
<button class="button button-search" type="submit" title="{L_SEARCH}">
{{ Icon('font', 'search', lang('SEARCH'), true, 'fas c-button-icon') }}
</button>
<a href="{U_SEARCH}" class="button button-search-end" title="{L_SEARCH_ADV}">
{{ Icon('font', 'gear', lang('SEARCH_ADV'), true, 'fas c-button-icon') }}
</a>
{S_SEARCH_HIDDEN_FIELDS}
</fieldset>
</form>
</div>
<!-- ENDIF -->
<!-- EVENT overall_header_searchbox_after -->
</div>
<!-- EVENT overall_header_headerbar_after -->
</div>
<!-- EVENT overall_header_navbar_before -->
<!-- INCLUDE navbar_header.html -->
</div>
<!-- EVENT overall_header_page_body_before -->
<a id="start_here" class="anchor"></a>
<div id="page-body" class="page-body" role="main">
<!-- IF S_BOARD_DISABLED and S_USER_LOGGED_IN and (U_MCP or U_ACP) -->
<div id="information" class="rules">
<div class="inner">
<strong>{L_INFORMATION}{L_COLON}</strong> {L_BOARD_DISABLED}
</div>
</div>
<!-- ENDIF -->
<!-- EVENT overall_header_content_before -->

View file

@ -0,0 +1,30 @@
<ul>
<!-- IF BASE_URL and TOTAL_PAGES > 6 -->
<li class="dropdown-container dropdown-button-control dropdown-page-jump page-jump">
<a class="button button-icon-only dropdown-trigger" href="#" title="{L_JUMP_TO_PAGE_CLICK}" role="button">{{ Icon('font', 'turn-down', PAGE_NUMBER, true, 'fas fa-rotate-270 c-button-icon c-pagination-icon') }}</a>
<div class="dropdown">
<div class="pointer"><div class="pointer-inner"></div></div>
<ul class="dropdown-contents">
<li>{L_JUMP_TO_PAGE}{L_COLON}</li>
<li class="page-jump-form">
<input type="number" name="page-number" min="1" max="999999" title="{L_JUMP_PAGE}" class="inputbox tiny" data-per-page="{PER_PAGE}" data-base-url="{BASE_URL|e('html_attr')}" data-start-name="{START_NAME}" />
<input class="button1 button button-form-bold" value="{L_GO}" type="button" />
</li>
</ul>
</div>
</li>
<!-- ENDIF -->
<!-- BEGIN pagination -->
<!-- IF pagination.S_IS_PREV -->
<li class="arrow previous"><a class="button button-icon-only" href="{pagination.PAGE_URL}" rel="prev" role="button">{{ Icon('font', 'chevron-' ~ S_CONTENT_FLOW_BEGIN, lang('PREVIOUS'), true, 'fas c-button-icon c-pagination-icon') }}</a></li>
<!-- ELSEIF pagination.S_IS_CURRENT -->
<li class="active"><span>{pagination.PAGE_NUMBER}</span></li>
<!-- ELSEIF pagination.S_IS_ELLIPSIS -->
<li class="ellipsis" role="separator"><span>{L_ELLIPSIS}</span></li>
<!-- ELSEIF pagination.S_IS_NEXT -->
<li class="arrow next"><a class="button button-icon-only" href="{pagination.PAGE_URL}" rel="next" role="button">{{ Icon('font', 'chevron-' ~ S_CONTENT_FLOW_END, lang('NEXT'), true, 'fas c-button-icon c-pagination-icon') }}</a></li>
<!-- ELSE -->
<li><a class="button" href="{pagination.PAGE_URL}" role="button">{pagination.PAGE_NUMBER}</a></li>
<!-- ENDIF -->
<!-- END pagination -->
</ul>

View file

@ -0,0 +1,75 @@
<script>
phpbb.plupload = {
i18n: {
'b': '{LA_BYTES_SHORT}',
'kb': '{LA_KB}',
'mb': '{LA_MB}',
'gb': '{LA_GB}',
'tb': '{LA_TB}',
'Add Files': '{LA_PLUPLOAD_ADD_FILES}',
'Add files to the upload queue and click the start button.': '{LA_PLUPLOAD_ADD_FILES_TO_QUEUE}',
'Close': '{LA_PLUPLOAD_CLOSE}',
'Drag files here.': '{LA_PLUPLOAD_DRAG}',
'Duplicate file error.': '{LA_PLUPLOAD_DUPLICATE_ERROR}',
'File: %s': '{LA_PLUPLOAD_FILE}',
'File: %s, size: %d, max file size: %d': '{LA_PLUPLOAD_FILE_DETAILS}',
'File count error.': '{LA_PLUPLOAD_ERR_FILE_COUNT}',
'File extension error.': '{LA_PLUPLOAD_EXTENSION_ERROR}',
'File size error.': '{LA_PLUPLOAD_SIZE_ERROR}',
'File too large:': '{LA_PLUPLOAD_ERR_FILE_TOO_LARGE}',
'Filename': '{LA_PLUPLOAD_FILENAME}',
'Generic error.': '{LA_PLUPLOAD_GENERIC_ERROR}',
'HTTP Error.': '{LA_PLUPLOAD_HTTP_ERROR}',
'Image format either wrong or not supported.': '{LA_PLUPLOAD_IMAGE_FORMAT}',
'Init error.': '{LA_PLUPLOAD_INIT_ERROR}',
'IO error.': '{LA_PLUPLOAD_IO_ERROR}',
'Invalid file extension:': '{LA_PLUPLOAD_ERR_FILE_INVALID_EXT}',
'N/A': '{LA_PLUPLOAD_NOT_APPLICABLE}',
'Runtime ran out of available memory.': '{LA_PLUPLOAD_ERR_RUNTIME_MEMORY}',
'Security error.': '{LA_PLUPLOAD_SECURITY_ERROR}',
'Select files': '{LA_PLUPLOAD_SELECT_FILES}',
'Size': '{LA_PLUPLOAD_SIZE}',
'Start Upload': '{LA_PLUPLOAD_START_UPLOAD}',
'Start uploading queue': '{LA_PLUPLOAD_START_CURRENT_UPLOAD}',
'Status': '{LA_PLUPLOAD_STATUS}',
'Stop Upload': '{LA_PLUPLOAD_STOP_UPLOAD}',
'Stop current upload': '{LA_PLUPLOAD_STOP_CURRENT_UPLOAD}',
"Upload URL might be wrong or doesn't exist.": '{LA_PLUPLOAD_ERR_UPLOAD_URL}',
'Uploaded %d/%d files': '{LA_PLUPLOAD_UPLOADED}',
'%d files queued': '{LA_PLUPLOAD_FILES_QUEUED}',
'%s already present in the queue.': '{LA_PLUPLOAD_ALREADY_QUEUED}'
},
config: {
runtimes: 'html5',
url: '{S_PLUPLOAD_URL}',
max_file_size: '{FILESIZE}b',
chunk_size: '{CHUNK_SIZE}b',
unique_names: true,
filters: {
mime_types: [
{FILTERS}
],
mime_types_max_file_size: [
{FILTERS}
],
},
{S_RESIZE}
headers: {'X-PHPBB-USING-PLUPLOAD': '1', 'X-Requested-With': 'XMLHttpRequest'},
file_data_name: 'fileupload',
multipart_params: {'add_file': '{LA_ADD_FILE}'},
form_hook: '#postform',
browse_button: 'add_files',
drop_element : 'message',
},
lang: {
ERROR: '{LA_ERROR}',
TOO_MANY_ATTACHMENTS: '{LA_TOO_MANY_ATTACHMENTS}',
FORM_INVALID: '{LA_FORM_INVALID}',
},
order: '{ATTACH_ORDER}',
maxFiles: {MAX_ATTACHMENTS},
data: {S_ATTACH_DATA},
}
</script>
<!-- INCLUDEJS {T_ASSETS_PATH}/plupload/plupload.full.min.js -->
<!-- INCLUDEJS {T_ASSETS_PATH}/javascript/plupload.js -->

View file

@ -0,0 +1,94 @@
<div class="panel bg3 panel-container" id="attach-panel">
<div class="inner">
<p>{L_ADD_ATTACHMENT_EXPLAIN} <span class="hidden" id="drag-n-drop-message">{L_PLUPLOAD_DRAG_TEXTAREA}</span></p>
{% if MAX_ATTACHMENT_FILESIZE is not empty %}<p>{{ MAX_ATTACHMENT_FILESIZE }}</p>{% endif %}
<fieldset class="fields2" id="attach-panel-basic">
<dl>
<dt><label for="fileupload">{L_FILENAME}{L_COLON}</label></dt>
<dd>
<input type="file" accept="{{ ALLOWED_ATTACHMENTS }}" name="fileupload" id="fileupload" class="inputbox autowidth" />
<input type="submit" name="add_file" value="{L_ADD_FILE}" class="button1 button button-form-bold" onclick="upload = true;" />
</dd>
</dl>
<dl>
<dt><label for="filecomment">{L_FILE_COMMENT}{L_COLON}</label></dt>
<dd><textarea name="filecomment" id="filecomment" rows="1" cols="40" class="inputbox autowidth">{FILE_COMMENT}</textarea></dd>
</dl>
</fieldset>
<div id="attach-panel-multi" class="attach-panel-multi">
<input type="button" class="button1 button button-form-bold" value="{L_PLUPLOAD_ADD_FILES}" id="add_files" />
</div>
{% EVENT posting_attach_body_file_list_before %}
<div class="panel<!-- IF not .attach_row --> hidden<!-- ENDIF --> file-list-container" id="file-list-container">
<div class="inner">
<table class="table1 zebra-list fixed-width-table">
<thead>
<tr>
<th class="attach-name">{L_PLUPLOAD_FILENAME}</th>
<th class="attach-comment">{L_FILE_COMMENT}</th>
<th class="attach-filesize">{L_PLUPLOAD_SIZE}</th>
<th class="attach-status">{L_PLUPLOAD_STATUS}</th>
</tr>
</thead>
<tbody class="responsive-skip-empty file-list" id="file-list">
<tr class="attach-row attach-row-tpl" id="attach-row-tpl">
<td class="attach-name">
<span class="file-name ellipsis-text"></span>
<span class="attach-controls">
{% if S_BBCODE_ALLOWED %}<input type="button" value="{{ lang('PLACE_INLINE') }}" class="button1 button button-form-bold hidden file-inline-bbcode" />&nbsp;{% endif %}
<input type="button" value="{L_DELETE_FILE}" class="button1 button button-form-bold file-delete" />
</span>
<span class="clear"></span>
</td>
<td class="attach-comment">
<textarea rows="1" cols="30" class="inputbox"></textarea>
</td>
<td class="attach-filesize">
<span class="file-size"></span>
</td>
<td class="attach-status">
<span class="file-progress">
<span class="file-progress-bar"></span>
</span>
<span class="file-status"></span>
</td>
</tr>
{% EVENT posting_attach_body_attach_row_before %}
<!-- BEGIN attach_row -->
{% EVENT posting_attach_body_attach_row_prepend %}
<tr class="attach-row" data-attach-id="{attach_row.ATTACH_ID}">
<td class="attach-name">
<span class="file-name ellipsis-text"><a href="{attach_row.U_VIEW_ATTACHMENT}">{attach_row.FILENAME}</a></span>
{% EVENT posting_attach_body_attach_row_controls_prepend %}
<span class="attach-controls">
{% if S_BBCODE_ALLOWED and S_INLINE_ATTACHMENT_OPTIONS %}<input type="button" value="{{ lang('PLACE_INLINE') }}" class="button1 button button-form-bold file-inline-bbcode" />&nbsp;{% endif %}
<input type="submit" name="delete_file[{attach_row.ASSOC_INDEX}]" value="{L_DELETE_FILE}" class="button1 button button-form-bold file-delete" />
</span>
{% EVENT posting_attach_body_attach_row_controls_append %}
<span class="clear"></span>
</td>
<td class="attach-comment">
<textarea name="comment_list[{attach_row.ASSOC_INDEX}]" rows="1" cols="30" class="inputbox">{attach_row.FILE_COMMENT}</textarea>
{attach_row.S_HIDDEN}
</td>
<td class="attach-filesize">
<span class="file-size">{attach_row.FILESIZE}</span>
</td>
<td class="attach-status">
<span class="file-status file-uploaded"></span>
</td>
</tr>
{% EVENT posting_attach_body_attach_row_append %}
<!-- END attach_row -->
{% EVENT posting_attach_body_attach_row_after %}
</tbody>
</table>
</div>
</div>
{% EVENT posting_attach_body_file_list_after %}
</div>
</div>

View file

@ -0,0 +1,6 @@
<!-- IF S_PRIVMSGS -->
<!-- INCLUDE posting_pm_layout.html -->
<!-- ELSE -->
<!-- INCLUDE posting_layout.html -->
<!-- ENDIF -->

View file

@ -0,0 +1,105 @@
<script>
var form_name = 'postform';
var text_name = <!-- IF $SIG_EDIT -->'signature'<!-- ELSE -->'message'<!-- ENDIF -->;
var load_draft = false;
var upload = false;
// Define the bbCode tags
var bbcode = new Array();
var bbtags = new Array('[b]','[/b]','[i]','[/i]','[u]','[/u]','[quote]','[/quote]','[code]','[/code]','[list]','[/list]','[list=]','[/list]','[img]','[/img]','[url]','[/url]','[size=]','[/size]'<!-- BEGIN custom_tags -->, {custom_tags.BBCODE_NAME}<!-- END custom_tags -->);
var imageTag = false;
function change_palette()
{
phpbb.toggleDisplay('colour_palette');
e = document.getElementById('colour_palette');
if (e.style.display == 'block')
{
document.getElementById('bbpalette').value = '{LA_FONT_COLOR_HIDE}';
}
else
{
document.getElementById('bbpalette').value = '{LA_FONT_COLOR}';
}
}
</script>
{% include 'mentions_templates.html' %}
<!-- INCLUDEJS {T_ASSETS_PATH}/javascript/editor.js -->
<!-- INCLUDEJS {T_ASSETS_PATH}/javascript/tribute.min.js -->
<!-- INCLUDEJS {T_ASSETS_PATH}/javascript/mentions.js -->
<!-- IF S_BBCODE_ALLOWED -->
<div id="colour_palette" style="display: none;">
<dl style="clear: left;">
<dt><label>{L_FONT_COLOR}{L_COLON}</label></dt>
<dd id="color_palette_placeholder" class="color_palette_placeholder" data-color-palette="h" data-height="12" data-width="15" data-bbcode="true"></dd>
</dl>
</div>
<!-- EVENT posting_editor_buttons_before -->
<div id="format-buttons" class="format-buttons"<!-- IF S_ALLOW_MENTIONS --> data-mention-url="{U_MENTION_URL}" data-mention-names-limit="{S_MENTION_NAMES_LIMIT}" data-topic-id="{S_TOPIC_ID}" data-user-id="{S_USER_ID}"<!-- ENDIF -->>
<button type="button" class="button button-icon-only bbcode-b" accesskey="b" name="addbbcode0" value=" B " onclick="bbstyle(0)" title="{L_BBCODE_B_HELP}">
{{ Icon('font', 'bold', '', true, 'fas c-button-icon') }}
</button>
<button type="button" class="button button-icon-only bbcode-i" accesskey="i" name="addbbcode2" value=" i " onclick="bbstyle(2)" title="{L_BBCODE_I_HELP}">
{{ Icon('font', 'italic', '', true, 'fas c-button-icon') }}
</button>
<button type="button" class="button button-icon-only bbcode-u" accesskey="u" name="addbbcode4" value=" u " onclick="bbstyle(4)" title="{L_BBCODE_U_HELP}">
{{ Icon('font', 'underline', '', true, 'fas c-button-icon') }}
</button>
<!-- IF S_BBCODE_QUOTE -->
<button type="button" class="button button-icon-only bbcode-quote" accesskey="q" name="addbbcode6" value="Quote" onclick="bbstyle(6)" title="{L_BBCODE_Q_HELP}">
{{ Icon('font', 'quote-left', '', true, 'fas c-button-icon') }}
</button>
<!-- ENDIF -->
<button type="button" class="button button-icon-only bbcode-code" accesskey="c" name="addbbcode8" value="Code" onclick="bbstyle(8)" title="{L_BBCODE_C_HELP}">
{{ Icon('font', 'code', '', true, 'fas c-button-icon') }}
</button>
<button type="button" class="button button-icon-only bbcode-list" accesskey="l" name="addbbcode10" value="List" onclick="bbstyle(10)" title="{L_BBCODE_L_HELP}">
{{ Icon('font', 'list-ul', '', true, 'fas c-button-icon') }}
</button>
<button type="button" class="button button-icon-only bbcode-list-" accesskey="o" name="addbbcode12" value="List=" onclick="bbstyle(12)" title="{L_BBCODE_O_HELP}">
{{ Icon('font', 'list-ol', '', true, 'fas c-button-icon') }}
</button>
<button type="button" class="button button-icon-only bbcode-asterisk" accesskey="y" name="addlistitem" value="[*]" onclick="bbstyle(-1)" title="{L_BBCODE_LISTITEM_HELP}">
{{ Icon('font', 'asterisk', '', true, 'fas c-button-icon') }}
</button>
<!-- IF S_BBCODE_IMG -->
<button type="button" class="button button-icon-only bbcode-img" accesskey="p" name="addbbcode14" value="Img" onclick="bbstyle(14)" title="{L_BBCODE_P_HELP}">
{{ Icon('font', 'image', '', true, 'far c-button-icon') }}
</button>
<!-- ENDIF -->
<!-- IF S_LINKS_ALLOWED -->
<button type="button" class="button button-icon-only bbcode-url" accesskey="w" name="addbbcode16" value="URL" onclick="bbstyle(16)" title="{L_BBCODE_W_HELP}">
{{ Icon('font', 'link', '', true, 'fas c-button-icon') }}
</button>
<!-- ENDIF -->
<button type="button" class="button button-icon-only bbcode-color" name="bbpalette" id="bbpalette" value="{L_FONT_COLOR}" onclick="change_palette();" title="{L_BBCODE_S_HELP}">
{{ Icon('font', 'droplet', '', true, 'fas c-button-icon') }}
</button>
<select name="addbbcode18" class="bbcode-size" onchange="bbfontstyle('[size=' + this.form.addbbcode18.options[this.form.addbbcode18.selectedIndex].value + ']', '[/size]');this.form.addbbcode18.selectedIndex = 2;" title="{L_BBCODE_F_HELP}">
<option value="50">{L_FONT_TINY}</option>
<option value="85">{L_FONT_SMALL}</option>
<option value="100" selected="selected">{L_FONT_NORMAL}</option>
<!-- IF not MAX_FONT_SIZE or MAX_FONT_SIZE >= 150 -->
<option value="150">{L_FONT_LARGE}</option>
<!-- IF not MAX_FONT_SIZE or MAX_FONT_SIZE >= 200 -->
<option value="200">{L_FONT_HUGE}</option>
<!-- ENDIF -->
<!-- ENDIF -->
</select>
<!-- EVENT posting_editor_buttons_custom_tags_before -->
<!-- BEGIN custom_tags -->
<button type="button" class="button button-secondary bbcode-{custom_tags.BBCODE_TAG_CLEAN}" name="addbbcode{custom_tags.BBCODE_ID}" value="{custom_tags.BBCODE_TAG}" onclick="bbstyle({custom_tags.BBCODE_ID})" title="{{ custom_tags.BBCODE_HELPLINE }}">
{custom_tags.BBCODE_TAG}
</button>
<!-- END custom_tags -->
</div>
<!-- EVENT posting_editor_buttons_after -->
<!-- ENDIF -->

View file

@ -0,0 +1,205 @@
<fieldset class="fields1">
<!-- IF ERROR --><p class="error">{ERROR}</p><!-- ENDIF -->
{% EVENT posting_editor_topic_icons_before %}
<!-- IF S_SHOW_TOPIC_ICONS or S_SHOW_PM_ICONS -->
<dl>
<dt><label for="icon">{L_ICON}{L_COLON}</label></dt>
<dd>
{% EVENT posting_editor_topic_icons_prepend %}
<label for="icon"><input type="radio" name="icon" id="icon" value="0" checked="checked" tabindex="1" /> <!-- IF S_SHOW_TOPIC_ICONS -->{L_NO_TOPIC_ICON}<!-- ELSE -->{L_NO_PM_ICON}<!-- ENDIF --></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} tabindex="1" /><img src="{topic_icon.ICON_IMG}" width="{topic_icon.ICON_WIDTH}" height="{topic_icon.ICON_HEIGHT}" alt="{topic_icon.ICON_ALT}" title="{topic_icon.ICON_ALT}" /></label> <!-- END topic_icon -->
{% EVENT posting_editor_topic_icons_append %}
</dd>
</dl>
<!-- ENDIF -->
{% EVENT posting_editor_topic_icons_after %}
<!-- IF not S_PRIVMSGS and S_DISPLAY_USERNAME -->
<dl style="clear: left;">
<dt><label for="username">{L_USERNAME}{L_COLON}</label></dt>
<dd><input type="text" tabindex="1" name="username" id="username" size="25" value="{USERNAME}" class="inputbox autowidth" /></dd>
</dl>
<!-- ENDIF -->
<!-- EVENT posting_editor_subject_before -->
<!-- IF S_POST_ACTION or S_PRIVMSGS or S_EDIT_DRAFT -->
<dl style="clear: left;">
<dt><label for="subject">{L_SUBJECT}{L_COLON}</label></dt>
<dd>
<!-- EVENT posting_editor_subject_prepend -->
<input type="text" name="subject" id="subject" size="45" maxlength="<!-- IF S_NEW_MESSAGE -->120<!-- ELSE -->124<!-- ENDIF -->" tabindex="2" value="{SUBJECT}{DRAFT_SUBJECT}" class="inputbox autowidth" />
<!-- EVENT posting_editor_subject_append -->
</dd>
</dl>
<!-- IF CAPTCHA_TEMPLATE and S_CONFIRM_CODE -->
<!-- DEFINE $CAPTCHA_TAB_INDEX = 3 -->
<!-- INCLUDE {CAPTCHA_TEMPLATE} -->
<!-- ENDIF -->
<!-- ENDIF -->
<!-- EVENT posting_editor_subject_after -->
<!-- INCLUDE posting_buttons.html -->
<div id="smiley-box" class="smiley-box">
<!-- EVENT posting_editor_smilies_before -->
<!-- IF S_SMILIES_ALLOWED and .smiley -->
<strong>{L_SMILIES}</strong><br />
<!-- BEGIN smiley -->
<a href="#" onclick="insert_text('{smiley.A_SMILEY_CODE}', true); return false;"><img src="{smiley.SMILEY_IMG}" width="{smiley.SMILEY_WIDTH}" height="{smiley.SMILEY_HEIGHT}" alt="{smiley.SMILEY_CODE}" title="{smiley.SMILEY_DESC}" /></a>
<!-- END smiley -->
<!-- ENDIF -->
<!-- IF S_SHOW_SMILEY_LINK and S_SMILIES_ALLOWED -->
<br /><a href="{U_MORE_SMILIES}" onclick="popup(this.href, 750, 350, '_phpbbsmilies'); return false;">{L_MORE_SMILIES}</a>
<!-- ENDIF -->
<!-- EVENT posting_editor_smilies_after -->
<!-- IF BBCODE_STATUS -->
<div class="bbcode-status">
<!-- IF .smiley --><hr /><!-- ENDIF -->
{BBCODE_STATUS}<br />
<!-- IF S_BBCODE_ALLOWED -->
{IMG_STATUS}<br />
{URL_STATUS}<br />
<!-- ENDIF -->
{SMILIES_STATUS}
</div>
<!-- ENDIF -->
<!-- EVENT posting_editor_bbcode_status_after -->
<!-- IF S_EDIT_DRAFT || S_DISPLAY_REVIEW -->
<!-- IF S_DISPLAY_REVIEW --><hr /><!-- ENDIF -->
<!-- IF S_EDIT_DRAFT --><strong><a href="{S_UCP_ACTION}">{L_BACK_TO_DRAFTS}</a></strong><!-- ENDIF -->
<!-- IF S_DISPLAY_REVIEW --><strong><a href="#review">{L_TOPIC_REVIEW}</a></strong><!-- ENDIF -->
<!-- ENDIF -->
</div>
<!-- EVENT posting_editor_message_before -->
<div id="message-box" class="message-box">
<textarea <!-- IF S_UCP_ACTION and not S_PRIVMSGS and not S_EDIT_DRAFT -->name="signature" id="signature" style="height: 9em;"<!-- ELSE -->name="message" id="message"<!-- ENDIF --> rows="15" cols="76" tabindex="4" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);" onfocus="initInsertions();" class="inputbox">{MESSAGE}{DRAFT_MESSAGE}{SIGNATURE}</textarea>
</div>
<!-- EVENT posting_editor_message_after -->
</fieldset>
<!-- IF $EXTRA_POSTING_OPTIONS eq 1 -->
<!-- IF not S_SHOW_DRAFTS -->
</div>
</div>
<!-- ENDIF -->
<!-- IF not S_SHOW_DRAFTS and not $SIG_EDIT eq 1 -->
<div class="panel bg2">
<div class="inner">
<fieldset class="submit-buttons">
{S_HIDDEN_ADDRESS_FIELD}
{S_HIDDEN_FIELDS}
<!-- EVENT posting_editor_submit_buttons -->
<!-- IF S_HAS_DRAFTS --><input type="submit" accesskey="d" tabindex="8" name="load" value="{L_LOAD_DRAFT}" class="button1 button button-form-bold" onclick="load_draft = true;" />&nbsp; <!-- ENDIF -->
<!-- IF S_SAVE_ALLOWED --><input type="submit" accesskey="k" tabindex="7" name="save" value="{L_SAVE_DRAFT}" class="button1 button button-form-bold" />&nbsp; <!-- ENDIF -->
<input type="submit" tabindex="5" name="preview" value="{L_PREVIEW}" class="button1 button button-form"<!-- IF not S_PRIVMSGS --> onclick="document.getElementById('postform').action += '#preview';"<!-- ENDIF --> />&nbsp;
<input type="submit" accesskey="s" tabindex="6" name="post" value="{L_SUBMIT}" class="button1 button button-form default-submit-action" />&nbsp;
</fieldset>
</div>
</div>
<!-- ENDIF -->
<!-- IF not S_PRIVMSGS and not S_SHOW_DRAFTS and not $SIG_EDIT eq 1 -->
<div id="tabs" class="tabs sub-panels" data-show-panel="<!-- IF SHOW_PANEL -->{SHOW_PANEL}<!-- ELSE -->options-panel<!-- ENDIF -->" role="tablist">
<ul>
<li id="options-panel-tab" class="tab activetab"><a href="#tabs" data-subpanel="options-panel" role="tab" aria-controls="options-panel"><span>{L_OPTIONS}</span></a></li>
<!-- IF S_SHOW_ATTACH_BOX and FILTERS -->
<li id="attach-panel-tab" class="tab">
<a href="#tabs" data-subpanel="attach-panel" role="tab" aria-controls="attach-panel">
{L_ATTACHMENTS} <strong id="file-total-progress" class="file-total-progress"><strong id="file-total-progress-bar" class="file-total-progress-bar"></strong></strong>
</a>
</li>
<!-- ENDIF -->
<!-- IF S_SHOW_POLL_BOX || S_POLL_DELETE -->
<li id="poll-panel-tab" class="tab">
<a href="#tabs" data-subpanel="poll-panel" role="tab" aria-controls="poll-panel">{L_ADD_POLL}</a>
</li>
<!-- ENDIF -->
<!-- EVENT posting_editor_add_panel_tab -->
</ul>
</div>
<!-- ENDIF -->
<!-- IF not S_SHOW_DRAFTS and not $SIG_EDIT eq 1 -->
<div class="panel bg3" id="options-panel">
<div class="inner">
<fieldset class="fields1">
<!-- EVENT posting_editor_options_prepend -->
<!-- IF S_BBCODE_ALLOWED -->
<div><label for="disable_bbcode"><input type="checkbox" name="disable_bbcode" id="disable_bbcode"{S_BBCODE_CHECKED} /> {L_DISABLE_BBCODE}</label></div>
<!-- ENDIF -->
<!-- IF S_SMILIES_ALLOWED -->
<div><label for="disable_smilies"><input type="checkbox" name="disable_smilies" id="disable_smilies"{S_SMILIES_CHECKED} /> {L_DISABLE_SMILIES}</label></div>
<!-- ENDIF -->
<!-- IF S_LINKS_ALLOWED -->
<div><label for="disable_magic_url"><input type="checkbox" name="disable_magic_url" id="disable_magic_url"{S_MAGIC_URL_CHECKED} /> {L_DISABLE_MAGIC_URL}</label></div>
<!-- ENDIF -->
<!-- IF S_SIG_ALLOWED -->
<div><label for="attach_sig"><input type="checkbox" name="attach_sig" id="attach_sig"{S_SIGNATURE_CHECKED} /> {L_ATTACH_SIG}</label></div>
<!-- ENDIF -->
<!-- IF S_NOTIFY_ALLOWED -->
<div><label for="notify"><input type="checkbox" name="notify" id="notify"{S_NOTIFY_CHECKED} /> {L_NOTIFY_REPLY}</label></div>
<!-- ENDIF -->
<!-- IF S_LOCK_TOPIC_ALLOWED -->
<div><label for="lock_topic"><input type="checkbox" name="lock_topic" id="lock_topic"{S_LOCK_TOPIC_CHECKED} /> {L_LOCK_TOPIC}</label></div>
<!-- ENDIF -->
<!-- IF S_LOCK_POST_ALLOWED -->
<div><label for="lock_post"><input type="checkbox" name="lock_post" id="lock_post"{S_LOCK_POST_CHECKED} /> {L_LOCK_POST} [{L_LOCK_POST_EXPLAIN}]</label></div>
<!-- ENDIF -->
<!-- IF S_TYPE_TOGGLE or S_TOPIC_TYPE_ANNOUNCE or S_TOPIC_TYPE_STICKY -->
<hr class="dashed" />
<!-- ENDIF -->
<!-- IF S_TYPE_TOGGLE -->
<dl>
<dt><label for="topic_type-0"><!-- IF S_EDIT_POST -->{L_CHANGE_TOPIC_TO}<!-- ELSE -->{L_POST_TOPIC_AS}<!-- ENDIF -->{L_COLON}</label></dt>
<dd><!-- BEGIN topic_type --><label for="topic_type-{topic_type.VALUE}"><input type="radio" name="topic_type" id="topic_type-{topic_type.VALUE}" value="{topic_type.VALUE}"{topic_type.S_CHECKED} />{topic_type.L_TOPIC_TYPE}</label> <!-- END topic_type --></dd>
</dl>
<!-- ENDIF -->
<!-- IF S_TOPIC_TYPE_ANNOUNCE or S_TOPIC_TYPE_STICKY -->
<dl>
<dt><label for="topic_time_limit">{L_STICK_TOPIC_FOR}{L_COLON}</label></dt>
<dd><label for="topic_time_limit"><input type="number" min="0" max="999" name="topic_time_limit" id="topic_time_limit" value="{TOPIC_TIME_LIMIT}" class="inputbox autowidth" /> {L_DAYS}</label></dd>
<dd>{L_STICK_TOPIC_FOR_EXPLAIN}</dd>
</dl>
<!-- ENDIF -->
{% if S_SOFTDELETE_ALLOWED || S_DELETE_ALLOWED %}
<hr class="dashed">
<dl>
<dt><label for="delete">{{ lang('DELETE_POST') ~ lang('COLON') }}</label></dt>
{% if S_SOFTDELETE_ALLOWED %}
<dd><label for="delete"><input type="checkbox" name="delete" id="delete" {{ S_SOFTDELETE_CHECKED }}> {{ lang('DELETE_POST_WARN') }}</label></dd>
{% endif %}
{% if S_DELETE_ALLOWED %}
<dd><label for="delete_permanent"><input type="checkbox" name="delete_permanent" id="delete_permanent"> {{ lang('DELETE_POST_PERMANENTLY') }}</label></dd>
{% endif %}
</dl>
{% endif %}
<!-- IF S_EDIT_REASON -->
<dl>
<dt><label for="edit_reason">{L_EDIT_REASON}{L_COLON}</label></dt>
<dd><input type="text" name="edit_reason" id="edit_reason" value="{EDIT_REASON}" class="inputbox" /></dd>
</dl>
<!-- ENDIF -->
</fieldset>
<!-- ENDIF -->
<!-- ENDIF -->

View file

@ -0,0 +1,65 @@
<!-- INCLUDE overall_header.html -->
<!-- IF TOPIC_TITLE -->
<h2 class="posting-title"><!-- EVENT posting_topic_title_before --><a href="{U_VIEW_TOPIC}">{TOPIC_TITLE}</a><!-- EVENT posting_topic_title_after --></h2>
<!-- ELSE -->
<h2 class="posting-title"><a href="{U_VIEW_FORUM}">{FORUM_NAME}</a></h2>
<!-- ENDIF -->
<!-- IF S_FORUM_RULES -->
<div class="rules<!-- IF U_FORUM_RULES --> rules-link<!-- ENDIF -->">
<div class="inner">
<!-- IF U_FORUM_RULES -->
<a href="{U_FORUM_RULES}">{L_FORUM_RULES}</a>
<!-- ELSE -->
<strong>{L_FORUM_RULES}</strong><br />
{FORUM_RULES}
<!-- ENDIF -->
</div>
</div>
<!-- ENDIF -->
<form id="postform" method="post" action="{S_POST_ACTION}"{S_FORM_ENCTYPE}>
<!-- IF S_DRAFT_LOADED -->
<div class="panel">
<div class="inner">
<h3>{L_INFORMATION}</h3>
<p>{L_DRAFT_LOADED}</p>
</div>
</div>
<!-- ENDIF -->
<!-- IF S_SHOW_DRAFTS --><!-- INCLUDE drafts.html --><!-- ENDIF -->
<!-- IF S_POST_REVIEW --><!-- INCLUDE posting_review.html --><!-- ENDIF -->
<!-- IF S_DISPLAY_PREVIEW --><!-- INCLUDE posting_preview.html --><!-- ENDIF -->
<div class="panel" id="postingbox">
<div class="inner">
<h3>{L_POST_A}</h3>
<!-- DEFINE $EXTRA_POSTING_OPTIONS = 1 -->
<!-- INCLUDE posting_editor.html -->
<input type="hidden" name="show_panel" value="options-panel" />
{S_FORM_TOKEN}
</div>
</div>
<!-- IF S_SHOW_ATTACH_BOX and FILTERS --><!-- INCLUDE posting_attach_body.html --><!-- ENDIF -->
<!-- IF S_SHOW_POLL_BOX or S_POLL_DELETE --><!-- INCLUDE posting_poll_body.html --><!-- ENDIF -->
<!-- EVENT posting_layout_include_panel_body -->
<!-- IF S_DISPLAY_REVIEW --><!-- INCLUDE posting_topic_review.html --><!-- ENDIF -->
</form>
<!-- INCLUDE overall_footer.html -->

View file

@ -0,0 +1,116 @@
<fieldset class="fields1">
{% if not S_SHOW_DRAFTS %}
{% if S_GROUP_OPTIONS %}
<div class="column2">
<label for="group_list"><strong>{{ lang('TO_ADD_GROUPS') ~ lang('COLON') }}</strong></label><br>
<select name="group_list[]" id="group_list" multiple="multiple" size="3" class="inputbox">{{ S_GROUP_OPTIONS }}</select><br>
</div>
{% endif %}
{% if S_ALLOW_MASS_PM %}
<div class="column1">
{% if not S_EDIT_POST %}
<dl class="pmlist">
<dt><label><strong>{{ lang('TO_ADD_MASS') ~ lang('COLON') }}</strong><textarea id="username_list" name="username_list" class="inputbox" cols="50" rows="2" tabindex="1"></textarea></label></dt>
<dd class="recipients">
<input type="submit" name="add_to" value="{{ lang('ADD') }}" class="button1 button button-form-bold" tabindex="1">
<input type="submit" name="add_bcc" value="{{ lang('ADD_BCC') }}" class="button1 button button-form-bold" tabindex="1">
{% EVENT posting_pm_header_find_username_before %}
<span><a href="{{ U_FIND_USERNAME }}" onclick="find_username(this.href); return false;">{{ lang('FIND_USERNAME') }}</a></span>
{% EVENT posting_pm_header_find_username_after %}
</dd>
</dl>
{% endif %}
</div>
{% if to_recipient or bcc_recipient %}
<hr>
{% endif %}
<div class="column1">
{% if to_recipient %}
<dl>
<dt><label>{{ lang('TO_MASS') ~ lang('COLON') }}</label></dt>
<dd class="recipients">
<ul class="recipients">
{% for recipient in to_recipient %}
<li>
{% if not S_EDIT_POST %}
<button type="submit" name="remove_{{ recipient.TYPE }}[{{ recipient.UG_ID }}]">
{{ Icon('font', 'xmark', lang('REMOVE'), true, 'c-warning-icon') }}
</button>
{% endif %}
{% if recipient.IS_GROUP %}
<a href="{{ recipient.U_VIEW }}" style="color: {{ recipient.COLOUR }}"><strong>{{ recipient.NAME }}</strong></a>
{% else %}
{{ recipient.NAME_FULL }}
{% endif %}
</li>
{% endfor %}
</ul>
</dd>
</dl>
{% endif %}
</div>
{% if bcc_recipient %}
<div class="column2">
<dl>
<dt><label>{{ lang('BCC') ~ lang('COLON') }}</label></dt>
<dd class="recipients">
<ul class="recipients">
{% for recipient in bcc_recipient %}
<li>
{% if not S_EDIT_POST %}
<button type="submit" name="remove_{{ recipient.TYPE }}[{{ recipient.UG_ID }}]">
{{ Icon('font', 'xmark', lang('REMOVE'), true, 'c-warning-icon') }}
</button>
{% endif %}
{% if recipient.IS_GROUP %}
<a href="{{ recipient.U_VIEW }}" style="color: {{ recipient.COLOUR }}"><strong>{{ recipient.NAME }}</strong></a>
{% else %}
{{ recipient.NAME_FULL }}
{% endif %}
</li>
{% endfor %}
</ul>
</dd>
</dl>
</div>
{% endif %}
{% else %}
<div class="column1">
<dl>
<dt>
<label for="username_list">{{ lang('TO_ADD') ~ lang('COLON') }}</label>
{% if not S_EDIT_POST %}
<br><span><a href="{{ U_FIND_USERNAME }}" onclick="find_username(this.href); return false">{{ lang('FIND_USERNAME') }}</a></span>
{% endif %}
</dt>
{% if not S_EDIT_POST %}
<dd>
<input class="inputbox" type="text" name="username_list" id="username_list" size="20" value=""> <input type="submit" name="add_to" value="{{ lang('ADD') }}" class="button1 button button-form-bold">
</dd>
{% endif %}
{% if to_recipient %}
<dd class="recipients">
<ul class="recipients">
{% for recipient in to_recipient %}
<li>
{% if not S_EDIT_POST %}
<button type="submit" name="remove_{{ recipient.TYPE }}[{{ recipient.UG_ID }}]">
{{ Icon('font', 'xmark', lang('REMOVE'), true, 'c-warning-icon') }}
</button>
{% endif %}
{% if recipient.IS_GROUP %}
<a href="{{ recipient.U_VIEW }}"><strong>{{ recipient.NAME }}</strong></a>
{% else %}
{{ recipient.NAME_FULL }}
{% endif %}
</li>
{% endfor %}
</ul>
</dd>
{% endif %}
</dl>
</div>
{% endif %}
{% endif %}
</fieldset>

View file

@ -0,0 +1,43 @@
<!-- INCLUDE ucp_header.html -->
<!-- IF S_DRAFT_LOADED -->
<div class="panel">
<div class="inner">
<h3>{L_INFORMATION}</h3>
<p>{L_DRAFT_LOADED_PM}</p>
</div>
</div>
<!-- ENDIF -->
<!-- IF S_SHOW_DRAFTS --><!-- INCLUDE drafts.html --><!-- ENDIF -->
<!-- IF S_DISPLAY_PREVIEW --><!-- INCLUDE posting_preview.html --><!-- ENDIF -->
<h2 class="posting-title">{L_TITLE}</h2>
<div class="panel" id="pmheader-postingbox">
<div class="inner">
<!-- EVENT posting_pm_layout_include_pm_header_before -->
<!-- INCLUDE posting_pm_header.html -->
<!-- EVENT posting_pm_layout_include_pm_header_after -->
</div>
</div>
<div class="panel" id="postingbox">
<div class="inner">
<!-- DEFINE $EXTRA_POSTING_OPTIONS = 1 -->
<!-- INCLUDE posting_editor.html -->
</div>
</div>
<!-- IF S_SHOW_ATTACH_BOX and FILTERS --><!-- INCLUDE posting_attach_body.html --><!-- ENDIF -->
<!-- IF S_DISPLAY_REVIEW --><!-- INCLUDE posting_topic_review.html --><!-- ENDIF -->
<!-- IF S_DISPLAY_HISTORY --><!-- INCLUDE ucp_pm_history.html --><!-- ENDIF -->
<!-- INCLUDE ucp_footer.html -->

View file

@ -0,0 +1,53 @@
<div class="panel bg3" id="poll-panel">
<div class="inner">
<!-- IF S_SHOW_POLL_BOX -->
<p>{L_ADD_POLL_EXPLAIN}</p>
<!-- ENDIF -->
<fieldset class="fields2">
<!-- IF S_POLL_DELETE -->
<dl>
<dt><label for="poll_delete">{L_POLL_DELETE}{L_COLON}</label></dt>
<dd><label for="poll_delete"><input type="checkbox" name="poll_delete" id="poll_delete"<!-- IF S_POLL_DELETE_CHECKED --> checked="checked"<!-- ENDIF --> /> </label></dd>
</dl>
<!-- ENDIF -->
<!-- IF S_SHOW_POLL_BOX -->
<dl>
<dt><label for="poll_title">{{ lang('POLL_QUESTION') ~ lang('COLON') }}</label></dt>
<dd><input type="text" name="poll_title" id="poll_title" maxlength="100" value="{{ POLL_TITLE }}" class="inputbox" /></dd>
</dl>
<dl>
<dt><label for="poll_option_text">{L_POLL_OPTIONS}{L_COLON}</label><br /><span>{L_POLL_OPTIONS_EXPLAIN}</span></dt>
<dd><textarea name="poll_option_text" id="poll_option_text" rows="5" cols="35" class="inputbox">{POLL_OPTIONS}</textarea></dd>
</dl>
<hr class="dashed" />
<dl>
<dt><label for="poll_max_options">{L_POLL_MAX_OPTIONS}{L_COLON}</label></dt>
<dd><input type="number" min="0" max="999" name="poll_max_options" id="poll_max_options" value="{POLL_MAX_OPTIONS}" class="inputbox autowidth" /></dd>
<dd>{L_POLL_MAX_OPTIONS_EXPLAIN}</dd>
</dl>
<dl>
<dt><label for="poll_length">{L_POLL_FOR}{L_COLON}</label></dt>
<dd><label for="poll_length"><input type="number" min="0" max="999" name="poll_length" id="poll_length" value="{POLL_LENGTH}" class="inputbox autowidth" /> {L_DAYS}</label></dd>
<dd>{L_POLL_FOR_EXPLAIN}</dd>
</dl>
<!-- IF S_POLL_VOTE_CHANGE -->
<hr class="dashed" />
<dl>
<dt><label for="poll_vote_change">{L_POLL_VOTE_CHANGE}{L_COLON}</label></dt>
<dd><label for="poll_vote_change"><input type="checkbox" id="poll_vote_change" name="poll_vote_change"{VOTE_CHANGE_CHECKED} /> {L_POLL_VOTE_CHANGE_EXPLAIN}</label></dd>
</dl>
<!-- ENDIF -->
<!-- ENDIF -->
<!-- EVENT posting_poll_body_options_after -->
</fieldset>
</div>
</div>

View file

@ -0,0 +1,51 @@
<div class="post <!-- IF S_PRIVMSGS -->pm<!-- ELSE -->bg2<!-- ENDIF -->" id="preview">
<div class="inner">
<!-- IF S_HAS_POLL_OPTIONS -->
<div class="content">
<h2>{L_PREVIEW}{L_COLON} {POLL_QUESTION}</h2>
<p class="author"><!-- IF L_POLL_LENGTH -->{L_POLL_LENGTH}<br /><!-- ENDIF -->{L_MAX_VOTES}</p>
<fieldset class="polls">
<!-- BEGIN poll_option -->
<dl>
<dt><label for="vote_{poll_option.POLL_OPTION_ID}">{poll_option.POLL_OPTION_CAPTION}</label></dt>
<dd style="width: auto;"><!-- IF S_IS_MULTI_CHOICE --><input type="checkbox" name="vote_id[]" id="vote_{poll_option.POLL_OPTION_ID}" value="{poll_option.POLL_OPTION_ID}"<!-- IF poll_option.POLL_OPTION_VOTED --> checked="checked"<!-- ENDIF --> /><!-- ELSE --><input type="radio" name="vote_id[]" id="vote_{poll_option.POLL_OPTION_ID}" value="{poll_option.POLL_OPTION_ID}"<!-- IF poll_option.POLL_OPTION_VOTED --> checked="checked"<!-- ENDIF --> /><!-- ENDIF --></dd>
</dl>
<!-- END poll_option -->
</fieldset>
</div>
</div>
</div>
<div class="post bg2">
<div class="inner">
<!-- ENDIF -->
<!-- EVENT posting_preview_poll_after -->
<div class="postbody">
<h3>{L_PREVIEW}{L_COLON} {PREVIEW_SUBJECT}</h3>
<div class="content">{PREVIEW_MESSAGE}</div>
<!-- EVENT posting_preview_content_after -->
<!-- IF .attachment -->
<dl class="attachbox">
<dt>{L_ATTACHMENTS}</dt>
<!-- BEGIN attachment -->
<dd>{attachment.DISPLAY_ATTACHMENT}</dd>
<!-- END attachment -->
</dl>
<!-- ENDIF -->
<!-- IF PREVIEW_SIGNATURE --><div class="signature">{PREVIEW_SIGNATURE}</div><!-- ENDIF -->
</div>
</div>
</div>
<hr />

View file

@ -0,0 +1,45 @@
<h3>{L_POST_REVIEW}</h3>
<p>{L_POST_REVIEW_EXPLAIN}</p>
<!-- BEGIN post_review_row -->
<!-- IF post_review_row.S_IGNORE_POST -->
<div class="post bg3 post-ignore">
<div class="inner">
{post_review_row.L_IGNORE_POST}<br>
<a class="display_post_review" href="{{ post_review_row.U_MINI_POST }}">{{ lang('POST_DISPLAY') }}</a>
<!-- ELSE -->
<div class="post <!-- IF post_review_row.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
<div class="inner">
<!-- ENDIF -->
<div class="postbody" id="ppr{post_review_row.POST_ID}">
<h3><a href="{post_review_row.U_MINI_POST}">{post_review_row.POST_SUBJECT}</a></h3>
<p class="author">
<!-- IF S_IS_BOT -->
<span title="{post_review_row.MINI_POST}">{{ Icon('font', 'file', post_review_row.MINI_POST, true, 'fas c-topic-icon') }}</span>
<!-- ELSE -->
<a href="{post_review_row.U_MINI_POST}" title="{post_review_row.MINI_POST}">
{{ Icon('font', 'file', post_review_row.MINI_POST, true, 'fas c-topic-icon') }}
</a>
<!-- ENDIF -->
{L_POST_BY_AUTHOR} <!-- EVENT posting_review_row_post_author_username_prepend --><strong>{post_review_row.POST_AUTHOR_FULL}</strong><!-- EVENT posting_review_row_post_author_username_append --> &raquo; {post_review_row.POST_DATE}
</p>
<div class="content">{post_review_row.MESSAGE}</div>
<!-- IF post_review_row.S_HAS_ATTACHMENTS -->
<dl class="attachbox">
<dt>{L_ATTACHMENTS}</dt>
<!-- BEGIN attachment -->
<dd>{post_review_row.attachment.DISPLAY_ATTACHMENT}</dd>
<!-- END attachment -->
</dl>
<!-- ENDIF -->
</div>
</div>
</div>
<!-- END post_review_row -->
<hr />

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