diff options
author | Matt Friedman <maf675@gmail.com> | 2013-10-29 19:12:32 -0700 |
---|---|---|
committer | Matt Friedman <maf675@gmail.com> | 2013-10-29 19:12:32 -0700 |
commit | 16213c92fe71cb1029bdac3b797529c6c74f6e96 (patch) | |
tree | 2256b3b880d113b814cd8c8b42b415dd407f0ef1 | |
parent | 67beb97efec06c4a663c7eec8d54ab3194744f83 (diff) | |
parent | 2f1cf0d287f416f1c3b388d5d3e68d897f226aaf (diff) | |
download | forums-16213c92fe71cb1029bdac3b797529c6c74f6e96.tar forums-16213c92fe71cb1029bdac3b797529c6c74f6e96.tar.gz forums-16213c92fe71cb1029bdac3b797529c6c74f6e96.tar.bz2 forums-16213c92fe71cb1029bdac3b797529c6c74f6e96.tar.xz forums-16213c92fe71cb1029bdac3b797529c6c74f6e96.zip |
[ticket/11935] Merge remote-tracking branch 'upstream/develop'
PHPBB3-11935
118 files changed, 2929 insertions, 1006 deletions
diff --git a/.travis.yml b/.travis.yml index a5c27632b4..2a80b8ce0b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,18 +10,23 @@ env: - DB=mysql - DB=postgres -before_script: - - sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'DROP DATABASE IF EXISTS phpbb_tests;' -U postgres; fi" - - sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'create database phpbb_tests;' -U postgres; fi" +install: - sh -c "if [ '$DB' = 'mariadb' ]; then travis/setup-mariadb.sh; fi" - - sh -c "if [ '$DB' = 'mysql' -o '$DB' = 'mariadb' ]; then mysql -e 'create database IF NOT EXISTS phpbb_tests;'; fi" + - sh -c "if [ `php -r "echo (int) version_compare(PHP_VERSION, '5.3.19', '>=');"` = "1" ]; then travis/setup-webserver.sh; fi" - travis/install-php-extensions.sh - cd phpBB - php ../composer.phar install --dev --no-interaction --prefer-source - cd .. - - sh -c "if [ `php -r "echo (int) version_compare(PHP_VERSION, '5.3.19', '>=');"` = "1" ]; then travis/setup-webserver.sh; fi" + +before_script: + - sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'DROP DATABASE IF EXISTS phpbb_tests;' -U postgres; fi" + - sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'create database phpbb_tests;' -U postgres; fi" + - sh -c "if [ '$DB' = 'mysql' -o '$DB' = 'mariadb' ]; then mysql -e 'create database IF NOT EXISTS phpbb_tests;'; fi" script: + - cd build + - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.5' -a '$DB' = 'mysql' ]; then ../phpBB/vendor/bin/phing sniff; fi" + - cd .. - phpBB/vendor/bin/phpunit --configuration travis/phpunit-$DB-travis.xml notifications: @@ -26,8 +26,8 @@ To be able to run an installation from the repo (and not from a pre-built packag ## AUTOMATED TESTING We have unit and functional tests in order to prevent regressions. You can view the bamboo continuous integration [here](http://bamboo.phpbb.com) or check our travis build below. -develop - [![Build Status](https://secure.travis-ci.org/phpbb/phpbb3.png?branch=develop)](http://travis-ci.org/phpbb/phpbb3) -develop-olympus - [![Build Status](https://secure.travis-ci.org/phpbb/phpbb3.png?branch=develop-olympus)](http://travis-ci.org/phpbb/phpbb3) +develop - [![Build Status](https://secure.travis-ci.org/phpbb/phpbb.png?branch=develop)](http://travis-ci.org/phpbb/phpbb) +develop-olympus - [![Build Status](https://secure.travis-ci.org/phpbb/phpbb.png?branch=develop-olympus)](http://travis-ci.org/phpbb/phpbb) ## LICENSE diff --git a/build/build.xml b/build/build.xml index 82bb979a02..c033b1fefd 100644 --- a/build/build.xml +++ b/build/build.xml @@ -74,6 +74,30 @@ passthru="true" /> </target> + <target name="sniff"> + <exec command="phpBB/vendor/bin/phpcs + -s + --extensions=php + --standard=build/code_sniffer/ruleset-php-strict.xml + --ignore=phpBB/phpbb/db/migration/data/v30x/* + phpBB/phpbb" + dir="." checkreturn="true" passthru="true" /> + <exec command="phpBB/vendor/bin/phpcs + -s + --extensions=php + --standard=build/code_sniffer/ruleset-php-legacy.xml + --ignore=phpBB/cache/* + --ignore=phpBB/develop/* + --ignore=phpBB/includes/diff/*.php + --ignore=phpBB/includes/sphinxapi.php + --ignore=phpBB/includes/utf/data/* + --ignore=phpBB/install/data/* + --ignore=phpBB/phpbb/* + --ignore=phpBB/vendor/* + phpBB" + dir="." checkreturn="true" passthru="true" /> + </target> + <target name="docs"> <!-- only works if you setup phpdoctor: git clone https://github.com/peej/phpdoctor.git diff --git a/code_sniffer/phpbb/Sniffs/Commenting/FileCommentSniff.php b/build/code_sniffer/phpbb/Sniffs/Commenting/FileCommentSniff.php index 68e9e6bb86..68e9e6bb86 100644 --- a/code_sniffer/phpbb/Sniffs/Commenting/FileCommentSniff.php +++ b/build/code_sniffer/phpbb/Sniffs/Commenting/FileCommentSniff.php diff --git a/code_sniffer/phpbb/Tests/Commenting/FileCommentUnitTest.inc b/build/code_sniffer/phpbb/Tests/Commenting/FileCommentUnitTest.inc index 0ace1c1bda..0ace1c1bda 100644 --- a/code_sniffer/phpbb/Tests/Commenting/FileCommentUnitTest.inc +++ b/build/code_sniffer/phpbb/Tests/Commenting/FileCommentUnitTest.inc diff --git a/code_sniffer/phpbb/Tests/Commenting/FileCommentUnitTest.php b/build/code_sniffer/phpbb/Tests/Commenting/FileCommentUnitTest.php index affa27b56c..affa27b56c 100644 --- a/code_sniffer/phpbb/Tests/Commenting/FileCommentUnitTest.php +++ b/build/code_sniffer/phpbb/Tests/Commenting/FileCommentUnitTest.php diff --git a/code_sniffer/phpbb/build.xml b/build/code_sniffer/phpbb/build.xml index b6d3bf6451..b6d3bf6451 100644 --- a/code_sniffer/phpbb/build.xml +++ b/build/code_sniffer/phpbb/build.xml diff --git a/code_sniffer/phpbb/phpbbCodingStandard.php b/build/code_sniffer/phpbb/phpbbCodingStandard.php index adbba9d915..adbba9d915 100644 --- a/code_sniffer/phpbb/phpbbCodingStandard.php +++ b/build/code_sniffer/phpbb/phpbbCodingStandard.php diff --git a/build/code_sniffer/ruleset-minimum.xml b/build/code_sniffer/ruleset-minimum.xml new file mode 100644 index 0000000000..2de1fb4be4 --- /dev/null +++ b/build/code_sniffer/ruleset-minimum.xml @@ -0,0 +1,12 @@ +<?xml version="1.0"?> +<ruleset name="phpBB Minimum Standard"> + + <description>phpBB minimum coding standard</description> + + <!-- All code files MUST use only UTF-8 without BOM. --> + <rule ref="Generic.Files.ByteOrderMark" /> + + <!-- All code files MUST use the Unix LF (linefeed) line ending. --> + <rule ref="Generic.Files.LineEndings" /> + +</ruleset> diff --git a/build/code_sniffer/ruleset-php-legacy.xml b/build/code_sniffer/ruleset-php-legacy.xml new file mode 100644 index 0000000000..ed8c7e98a0 --- /dev/null +++ b/build/code_sniffer/ruleset-php-legacy.xml @@ -0,0 +1,23 @@ +<?xml version="1.0"?> +<ruleset name="phpBB PHP Legacy Standard"> + + <description>phpBB legacy coding standard for PHP files</description> + + <rule ref="./ruleset-minimum.xml" /> + + <!-- The body of each structure MUST be enclosed by braces. --> + <rule ref="Generic.ControlStructures.InlineControlStructure" /> + + <!-- Class constants MUST be declared in all upper case with underscore separators. --> + <rule ref="Generic.NamingConventions.UpperCaseConstantName" /> + + <!-- Only <?php, no short tags. --> + <rule ref="Generic.PHP.DisallowShortOpenTag.EchoFound" /> + + <!-- Method arguments with default values MUST go at the end of the argument list. --> + <rule ref="PEAR.Functions.ValidDefaultValue" /> + + <!-- The ?> closing tag MUST be omitted from files containing only PHP. --> + <rule ref="Zend.Files.ClosingTag" /> + +</ruleset> diff --git a/build/code_sniffer/ruleset-php-strict.xml b/build/code_sniffer/ruleset-php-strict.xml new file mode 100644 index 0000000000..65b6763c57 --- /dev/null +++ b/build/code_sniffer/ruleset-php-strict.xml @@ -0,0 +1,42 @@ +<?xml version="1.0"?> +<ruleset name="phpBB PHP Strict Standard"> + + <description>phpBB coding standard for PHP files</description> + + <rule ref="./ruleset-php-legacy.xml" /> + + <!-- There SHOULD NOT be more than 80 characters per line + There MUST NOT be more than 120 characters per line --> + <!-- + <rule ref="Generic.Files.LineLength"> + <properties> + <property name="lineLimit" value="80"/> + <property name="absoluteLineLimit" value="120"/> + </properties> + </rule> + --> + + <!-- The PHP constants true, false, and null MUST be in lower case. --> + <rule ref="Generic.PHP.LowerCaseConstant" /> + + <!-- PHP keywords MUST be in lower case. --> + <rule ref="Generic.PHP.LowerCaseKeyword" /> + + <!-- There MUST NOT be trailing whitespace at the end of lines. --> + <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace" /> + + <!-- There MUST NOT be whitespace before the first content of a file --> + <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace.StartFile" /> + + <!-- There MUST NOT be whitespace after the last content of a file --> + <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace.EndFile" /> + + <!-- Functions MUST NOT contain multiple empty lines in a row --> + <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace.EmptyLines" /> + + <!-- When present, all use declarations MUST go after the namespace declaration. + There MUST be one use keyword per declaration. + There MUST be one blank line after the use block. --> + <rule ref="PSR2.Namespaces.UseDeclaration" /> + +</ruleset> diff --git a/phpBB/adm/images/corners_left.gif b/phpBB/adm/images/corners_left.gif Binary files differdeleted file mode 100644 index bacd276495..0000000000 --- a/phpBB/adm/images/corners_left.gif +++ /dev/null diff --git a/phpBB/adm/images/corners_left2.gif b/phpBB/adm/images/corners_left2.gif Binary files differdeleted file mode 100644 index 206e50368d..0000000000 --- a/phpBB/adm/images/corners_left2.gif +++ /dev/null diff --git a/phpBB/adm/images/corners_right.gif b/phpBB/adm/images/corners_right.gif Binary files differdeleted file mode 100644 index bcb5bd7d14..0000000000 --- a/phpBB/adm/images/corners_right.gif +++ /dev/null diff --git a/phpBB/adm/images/corners_right2.gif b/phpBB/adm/images/corners_right2.gif Binary files differdeleted file mode 100644 index 0ba66d50b2..0000000000 --- a/phpBB/adm/images/corners_right2.gif +++ /dev/null diff --git a/phpBB/adm/images/toggle.gif b/phpBB/adm/images/toggle.gif Binary files differdeleted file mode 100644 index 8af6861bd1..0000000000 --- a/phpBB/adm/images/toggle.gif +++ /dev/null diff --git a/phpBB/adm/style/acp_avatar_options_local.html b/phpBB/adm/style/acp_avatar_options_local.html index 148efd051b..0cdb3644d7 100644 --- a/phpBB/adm/style/acp_avatar_options_local.html +++ b/phpBB/adm/style/acp_avatar_options_local.html @@ -8,18 +8,14 @@ </select> <input type="submit" value="{L_GO}" name="avatar_local_go" class="button2" /></dd> </dl> <!-- IF AVATAR_LOCAL_SHOW --> - <table> + <ul id="gallery"> <!-- BEGIN avatar_local_row --> - <tr> - <!-- BEGIN avatar_local_col --> - <td class="row1" style="text-align: center;"><img src="{avatar_local_row.avatar_local_col.AVATAR_IMAGE}" alt="{avatar_local_row.avatar_local_col.AVATAR_NAME}" title="{avatar_local_row.avatar_local_col.AVATAR_NAME}"/></td> - <!-- END avatar_local_col --> - </tr> - <tr> - <!-- BEGIN avatar_local_option --> - <td class="row2" style="text-align: center;"><input type="radio" name="avatar_local_file" id="av-{avatar_local_row.S_ROW_COUNT}-{avatar_local_row.avatar_local_option.S_ROW_COUNT}" value="{avatar_local_row.avatar_local_option.AVATAR_FILE}" /></td> - <!-- END avatar_local_option --> - </tr> + <!-- BEGIN avatar_local_col --> + <li> + <label for="av-{avatar_local_row.S_ROW_COUNT}-{avatar_local_row.avatar_local_col.S_ROW_COUNT}"><img src="{avatar_local_row.avatar_local_col.AVATAR_IMAGE}" alt="" /><br /> + <input type="radio" name="avatar_local_file" id="av-{avatar_local_row.S_ROW_COUNT}-{avatar_local_row.avatar_local_col.S_ROW_COUNT}" value="{avatar_local_row.avatar_local_col.AVATAR_FILE}" /></label> + </li> + <!-- END avatar_local_col --> <!-- END avatar_local_row --> - </table> + </ul> <!-- ENDIF --> diff --git a/phpBB/adm/style/acp_forums.html b/phpBB/adm/style/acp_forums.html index 8e451c9fe3..77b81b82e3 100644 --- a/phpBB/adm/style/acp_forums.html +++ b/phpBB/adm/style/acp_forums.html @@ -440,19 +440,19 @@ <p><strong>{NAVIGATION}<!-- IF S_NO_FORUMS --> [<a href="{U_EDIT}">{L_EDIT}</a> | <a href="{U_DELETE}">{L_DELETE}</a><!-- IF not S_LINK --> | <a href="{U_SYNC}">{L_RESYNC}</a><!-- ENDIF -->]<!-- ENDIF --></strong></p> <!-- IF .forums --> - <table class="table1"> + <table class="table1 forums"> <col class="row1" /><col class="row1" /><col class="row2" /> <tbody> <!-- BEGIN forums --> <tr data-down="{forums.U_MOVE_DOWN}" data-up="{forums.U_MOVE_UP}"> - <td style="width: 5%; text-align: center;">{forums.FOLDER_IMAGE}</td> - <td> + <td class="folder">{forums.FOLDER_IMAGE}</td> + <td class="forum-desc"> <!-- IF forums.FORUM_IMAGE --><div style="float: {S_CONTENT_FLOW_BEGIN}; margin-right: 5px;">{forums.FORUM_IMAGE}</div><!-- ENDIF --> <strong><!-- IF forums.S_FORUM_LINK -->{forums.FORUM_NAME}<!-- ELSE --><a href="{forums.U_FORUM}">{forums.FORUM_NAME}</a><!-- ENDIF --></strong> <!-- IF forums.FORUM_DESCRIPTION --><br /><span>{forums.FORUM_DESCRIPTION}</span><!-- ENDIF --> <!-- IF forums.S_FORUM_POST --><br /><br /><span>{L_TOPICS}{L_COLON} <strong>{forums.FORUM_TOPICS}</strong> / {L_POSTS}{L_COLON} <strong>{forums.FORUM_POSTS}</strong></span><!-- ENDIF --> </td> - <td style="vertical-align: top; width: 100px; text-align: right; white-space: nowrap;"> + <td class="actions"> <!-- IF forums.S_FIRST_ROW && not forums.S_LAST_ROW --> <span class="up">{ICON_MOVE_UP_DISABLED}</span> <span class="down"><a href="{forums.U_MOVE_DOWN}" data-ajax="row_down" data-overlay="false">{ICON_MOVE_DOWN}</a></span> diff --git a/phpBB/adm/style/acp_groups_position.html b/phpBB/adm/style/acp_groups_position.html index 399dc422cd..b55c38e479 100644 --- a/phpBB/adm/style/acp_groups_position.html +++ b/phpBB/adm/style/acp_groups_position.html @@ -41,7 +41,7 @@ <tr data-down="{legend.U_MOVE_DOWN}" data-up="{legend.U_MOVE_UP}"> <td><strong<!-- IF legend.GROUP_COLOUR --> style="color: {legend.GROUP_COLOUR}"<!-- ENDIF -->>{legend.GROUP_NAME}</strong></td> <td style="text-align: center;">{legend.GROUP_TYPE}</td> - <td style="vertical-align: top; width: 100px; text-align: right; white-space: nowrap;"> + <td class="actions"> <!-- IF legend.S_FIRST_ROW && not legend.S_LAST_ROW --> <span class="up">{ICON_MOVE_UP_DISABLED}</span> <span class="down"><a href="{legend.U_MOVE_DOWN}" data-ajax="row_down" data-overlay="false">{ICON_MOVE_DOWN}</a></span> @@ -136,7 +136,7 @@ </td> <td style="text-align: center;"><!-- IF teampage.GROUP_TYPE -->{teampage.GROUP_TYPE}<!-- ELSE -->-<!-- ENDIF --> </td></td> - <td style="vertical-align: top; width: 100px; text-align: right; white-space: nowrap;"> + <td class="actions"> <!-- IF teampage.S_FIRST_ROW && not teampage.S_LAST_ROW --> <span class="up">{ICON_MOVE_UP_DISABLED}</span> <span class="down"><a href="{teampage.U_MOVE_DOWN}" data-ajax="row_down" data-overlay="false">{ICON_MOVE_DOWN}</a></span> diff --git a/phpBB/adm/style/acp_main.html b/phpBB/adm/style/acp_main.html index 2e84ce5658..bb39ffe050 100644 --- a/phpBB/adm/style/acp_main.html +++ b/phpBB/adm/style/acp_main.html @@ -78,7 +78,7 @@ <!-- EVENT acp_main_notice_after --> - <table class="table1"> + <table class="table1 two-columns no-header" data-no-responsive-header="true"> <caption>{L_FORUM_STATS}</caption> <col class="col1" /><col class="col2" /><col class="col1" /><col class="col2" /> <thead> @@ -168,21 +168,21 @@ </dl> </form> - <form id="action_stats_form" method="post" action="{U_ACTION}" data-ajax="true"> + <form id="action_stats_form" method="post" action="{U_ACTION}"> <dl> <dt><label for="action_stats">{L_RESYNC_STATS}</label><br /><span>{L_RESYNC_STATS_EXPLAIN}</span></dt> <dd><input type="hidden" name="action" value="stats" /><input class="button2" type="submit" id="action_stats" name="action_stats" value="{L_RUN}" /></dd> </dl> </form> - <form id="action_user_form" method="post" action="{U_ACTION}" data-ajax="true"> + <form id="action_user_form" method="post" action="{U_ACTION}"> <dl> <dt><label for="action_user">{L_RESYNC_POSTCOUNTS}</label><br /><span>{L_RESYNC_POSTCOUNTS_EXPLAIN}</span></dt> <dd><input type="hidden" name="action" value="user" /><input class="button2" type="submit" id="action_user" name="action_user" value="{L_RUN}" /></dd> </dl> </form> - <form id="action_db_track_form" method="post" action="{U_ACTION}" data-ajax="true"> + <form id="action_db_track_form" method="post" action="{U_ACTION}"> <dl> <dt><label for="action_db_track">{L_RESYNC_POST_MARKING}</label><br /><span>{L_RESYNC_POST_MARKING_EXPLAIN}</span></dt> <dd><input type="hidden" name="action" value="db_track" /><input class="button2" type="submit" id="action_db_track" name="action_db_track" value="{L_RUN}" /></dd> diff --git a/phpBB/adm/style/acp_permission_roles.html b/phpBB/adm/style/acp_permission_roles.html index a246d6dc9a..b8fdaeb837 100644 --- a/phpBB/adm/style/acp_permission_roles.html +++ b/phpBB/adm/style/acp_permission_roles.html @@ -90,9 +90,8 @@ </div> <!-- BEGIN auth --> <div class="permissions-panel" id="options00{auth.S_ROW_COUNT}"<!-- IF auth.S_FIRST_ROW --><!-- ELSE --> style="display: none;"<!-- ENDIF -->> - <span class="corners-top"><span></span></span> <div class="tablewrap"> - <table id="table00{auth.S_ROW_COUNT}" class="table1"> + <table id="table00{auth.S_ROW_COUNT}" class="table1 not-responsive"> <colgroup> <col class="permissions-name" /> <col class="permissions-yes" /> @@ -120,7 +119,6 @@ </tbody> </table> </div> - <span class="corners-bottom"><span></span></span> </div> <!-- END auth --> </div> diff --git a/phpBB/adm/style/acp_permissions.html b/phpBB/adm/style/acp_permissions.html index 88a82532a1..6dc9dca2e7 100644 --- a/phpBB/adm/style/acp_permissions.html +++ b/phpBB/adm/style/acp_permissions.html @@ -110,7 +110,7 @@ <!-- ELSEIF S_SELECT_USERGROUP --> - <div style="float: {S_CONTENT_FLOW_BEGIN}; width: 48%;"> + <div class="column1"> <!-- IF S_CAN_SELECT_USER --> @@ -155,7 +155,7 @@ </div> - <div style="float: {S_CONTENT_FLOW_END}; width: 48%"> + <div class="column2"> <!-- IF S_CAN_SELECT_GROUP --> @@ -200,7 +200,7 @@ <!-- ELSEIF S_SELECT_USERGROUP_VIEW --> - <div style="float: {S_CONTENT_FLOW_BEGIN}; width: 48%;"> + <div class="column1"> <h1>{L_USERS}</h1> @@ -241,7 +241,7 @@ </div> - <div style="float: {S_CONTENT_FLOW_END}; width: 48%"> + <div class="column2"> <h1>{L_USERGROUPS}</h1> @@ -324,7 +324,7 @@ </form> <!-- ENDIF --> - <br /><br /> + <br class="responsive-hide" /><br class="responsive-hide" /> <!-- include tooltip file --> <script type="text/javascript" src="style/tooltip.js"></script> @@ -340,7 +340,7 @@ <!-- INCLUDE permission_mask.html --> - <br /><br /> + <br class="responsive-hide" /><br class="responsive-hide" /> <fieldset class="quick" style="float: {S_CONTENT_FLOW_END};"> <input class="button1" type="submit" name="action[apply_all_permissions]" value="{L_APPLY_ALL_PERMISSIONS}" /> @@ -348,7 +348,7 @@ {S_FORM_TOKEN} </fieldset> - <br /><br /> + <br class="responsive-hide" /><br class="responsive-hide" /> </form> diff --git a/phpBB/adm/style/acp_styles.html b/phpBB/adm/style/acp_styles.html index 49efcf9ac0..b5c691b36b 100644 --- a/phpBB/adm/style/acp_styles.html +++ b/phpBB/adm/style/acp_styles.html @@ -79,7 +79,7 @@ <!-- ENDIF --> <!-- IF .styles_list --> - <table class="table1"> + <table class="table1 styles"> <thead> <tr> <th>{L_STYLE_NAME}</th> @@ -97,9 +97,9 @@ <!-- ELSE --> <!-- IF $ROW_CLASS == 'row2a' --><!-- DEFINE $ROW_CLASS = 'row2b' --><!-- ELSE --><!-- DEFINE $ROW_CLASS = 'row2a' --><!-- ENDIF --> <!-- ENDIF --> - <td class="{$ROW_CLASS}" style="padding-left: {styles_list.PADDING}px;"> + <td class="{$ROW_CLASS}" style="padding-{S_CONTENT_FLOW_BEGIN}: {styles_list.PADDING}px;"> <!-- IF styles_list.STYLE_ID and styles_list.COMMENT == '' and styles_list.STYLE_ACTIVE --> - <div class="default-style" style="display: none; float: right;"> + <div class="default-style" style="display: none; float: {S_CONTENT_FLOW_END};"> <input class="radio" type="radio" name="default" value="{styles_list.STYLE_ID}"<!-- IF styles_list.DEFAULT --> checked="checked"<!-- ELSE --><!-- DEFINE $S_DEFAULT = 1 --><!-- ENDIF --> title="{L_STYLE_DEFAULT}" /> </div> <!-- ENDIF --> @@ -117,9 +117,9 @@ <!-- ENDIF --> </td> <!-- IF not STYLES_LIST_HIDE_COUNT --> - <td class="{$ROW_CLASS}" style="text-align: center;">{styles_list.USERS}</td> + <td class="{$ROW_CLASS} users">{styles_list.USERS}</td> <!-- ENDIF --> - <td class="{$ROW_CLASS}" style="text-align: center;"> + <td class="{$ROW_CLASS} actions"> <!-- BEGIN actions --> <!-- IF styles_list.actions.S_ROW_COUNT > 0 --> | <!-- ENDIF --> <!-- IF styles_list.actions.U_ACTION --> @@ -129,7 +129,7 @@ <!-- END actions --> </td> {styles_list.EXTRA} - <td class="{$ROW_CLASS}" width="20" style="text-align: center;"> + <td class="{$ROW_CLASS} mark" width="20"> <!-- IF styles_list.STYLE_ID --> <input class="checkbox" type="checkbox" name="ids[]" value="{styles_list.STYLE_ID}" /> <!-- ELSE --> diff --git a/phpBB/adm/style/admin.css b/phpBB/adm/style/admin.css index 4e63052960..a8655973ed 100644 --- a/phpBB/adm/style/admin.css +++ b/phpBB/adm/style/admin.css @@ -18,11 +18,11 @@ body, div, p, th, td, li, dd { font-size: x-small; voice-family: "\"}\""; voice-family: inherit; - font-size: small + font-size: small; } html>body, html>div, html>p, html>th, html>td, html>li, html>dd { - font-size: small + font-size: small; } html { @@ -31,6 +31,7 @@ html { /* Always show a scrollbar for short pages - stops the jump when the scrollbar appears. non-ie browsers */ height: 100%; margin-bottom: 1px; + word-wrap: break-word; } body { @@ -105,6 +106,23 @@ hr { display: none; } +@media only screen and (max-width: 800px), only screen and (max-device-width: 800px) +{ + body { + margin: 5px 5px 0; + } +} + +@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) +{ + html, body { + height: auto; + margin: 0; + padding: 0; + } +} + + /* General links */ a:link, a:visited { color: #105289; @@ -136,6 +154,7 @@ li { list-style-type: inherit; } + /* Main blocks ---------------------------------------- */ #wrap { @@ -174,7 +193,7 @@ li { #page-body { clear: both; - min-width: 700px; + min-width: 650px; } #page-footer { @@ -195,19 +214,23 @@ li { } #main { - float: left; - width: 76%; - margin: 0 0 0 3%; - min-height: 350px; + float: right; + width: 100%; + margin: 0 0 0 -210px; } .rtl #main { float: right; - margin: 0 3% 0 0; + margin: 0 -210px 0 0; +} + +.main { + margin-left: 210px; } -* html #main { - height: 350px; +.rtl .main { + margin-left: 0; + margin-right: 210px; } #page-body.simple-page-body { @@ -216,17 +239,81 @@ li { min-width: 0; } +@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) +{ + #wrap, #page-body, #page-body.simple-page-body { + padding: 0; + min-width: 300px; + } + + #page-header { + margin: 5px; + padding-left: 160px; + height: auto; + min-height: 54px; + overflow: hidden; + } + + .rtl #page-header { + padding-right: 160px; + padding-left: 0; + } + + #page-header h1 { + font-size: 1.2em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + #page-header fieldset { + margin-top: 5px; + } + + #main, .rtl #main, .main, .rtl .main { + float: none; + width: auto; + margin: 0; + } + + #content { + background: #F3F3F3 url("../images/innerbox_bg.gif") repeat-x top; + padding: 5px; + } + + #page-footer { + padding: 0 5px 5px; + } +} + +@media only screen and (max-width: 400px), only screen and (max-device-width: 400px) +{ + #page-header { + background-size: 76px 26.5px; + padding-left: 80px; + min-height: 30px; + } + + .rtl #page-header { + padding-right: 80px; + } + + #page-header h1 { + padding-top: 0; + font-size: 1.1em; + } +} + + /* Tabbed menu Based on: http://www.alistapart.com/articles/slidingdoors2/ ----------------------------------------*/ #tabs { line-height: normal; - margin: 0 0 -6px 7px; + margin: 0 7px; min-width: 600px; -} - -.rtl #tabs { - margin: 0 7px -6px 0; + position: relative; + z-index: 2; } #tabs ul { @@ -235,14 +322,27 @@ li { list-style: none; } +#tabs ul:after { + content: ''; + display: block; + clear: both; +} + #tabs li { - display: inline; + display: block; + float: left; margin: 0; padding: 0; font-size: 0.85em; font-weight: bold; } +#tabs li:after { + content: ''; + display: block; + clear: both; +} + #tabs a { float: left; background:url("../images/bg_tabs1.gif") no-repeat 0% -34px; @@ -261,6 +361,7 @@ li { display: block; background: url("../images/bg_tabs2.gif") no-repeat 100% -34px; padding: 7px 10px 4px 4px; + min-height: 14px; color: #767676; white-space: nowrap; font-family: Arial, Helvetica, sans-serif; @@ -280,12 +381,12 @@ li { color: #BC2A4D; } -#tabs #activetab a { +#tabs .activetab a { background-position: 0 0; border-bottom: 1px solid #DCDEE2; } -#tabs #activetab a span { +#tabs .activetab a span { background-position: 100% 0; padding-bottom: 5px; color: #23649F; @@ -299,103 +400,135 @@ li { background-position: 100% -69px; } -#tabs #activetab a:hover span { +#tabs .activetab a:hover span { color: #115098; } +.responsive-tab { + position: relative; +} -/* Main Panel ----------------------------------------- */ -#acp { - margin: 4px 0; - padding: 3px 1px; - min-width: 550px; - background-color: #FFFFFF; - border: 1px #999999 solid; +.responsive-tab .responsive-tab-link span { + display: inline-block; + font-size: 16px; + position: relative; + width: 16px; + line-height: 14px; + text-decoration: none; } -.panel { - background: #F3F3F3 url("../images/innerbox_bg.gif") repeat-x top; - padding: 0; +.responsive-tab .responsive-tab-link span:before { + content: ''; + position: absolute; + left: 5px; + top: 8px; + height: .125em; + width: 14px; + border-bottom: 0.125em solid #767676; + border-top: 0.375em double #767676; } -span.corners-top, span.corners-bottom, -span.corners-top span, span.corners-bottom span { - font-size: 1px; - line-height: 1px; - display: block; - height: 5px; - background-repeat: no-repeat; +.responsive-tab .responsive-tab-link:hover span:before { + border-color: #BC2A4D; } -span.corners-top { - background-image: url("../images/corners_left.gif"); - background-position: 0 0; - margin: -4px -2px 0; +.responsive-tab.activetab .responsive-tab-link span:before { + border-color: #23649F; } -span.corners-top span { - background-image: url("../images/corners_right.gif"); - background-position: 100% 0; +.responsive-tab.activetab .responsive-tab-link:hover span:before { + border-color: #115098; } -span.corners-bottom { - background-image: url("../images/corners_left.gif"); - background-position: 0 100%; - margin: 0 -2px -4px; - clear: both; +#tabs .dropdown { + top: 18px; + margin-right: -1px; } -span.corners-bottom span { - background-image: url("../images/corners_right.gif"); - background-position: 100% 100%; +#tabs .dropdown-right .dropdown { + margin-left: -2px; } -/* WinIE tweaks \*/ -* html span.corners-top, * html span.corners-bottom { background-image: url("../images/corners_left.gif"); } -* html span.corners-top span, * html span.corners-bottom span { background-image: url("../images/corners_right.gif"); } -/* End tweaks */ +#tabs .dropdown li { + display: block !important; + float: none; + background: transparent none; + padding: 0; +} -/* Sub-navigation Menu ----------------------------------------- */ +#tabs .dropdown a, #tabs .dropdown a span { + background: transparent; + display: block; + border-width: 0; + float: none; + margin: 0; + padding: 0; + text-align: right; +} -/* Toggle */ -#toggle { - padding: 5px; - width: 5%; - height: 100px; - position: absolute; - left: 15%; - top: 28px; - margin-left: 2px; +#tabs .dropdown a span { + padding: 4px 8px; + color: inherit !important; } -.rtl #toggle { - left: 75%; - margin-right: 0; - margin-left: 6px; +@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) +{ + #tabs { + min-width: 0; + } } -#toggle-handle { - display: block; - width: 18px; - height: 19px; - float: right; - background-image: url(../images/toggle.gif); +/* Main Panel +---------------------------------------- */ +#acp { + clear: both; + position: relative; + top: -2px; + margin: 0 0 2px; + padding: 3px 1px; + min-width: 550px; + background: #F3F3F3 url("../images/innerbox_bg.gif") repeat-x top; + border: 1px #999999 solid; + border-radius: 5px; + box-shadow: #FFF 0 0 0 1px inset; +} + +#acp:first-child { + top: 0; +} + +.panel { + background: #F3F3F3 url("../images/innerbox_bg.gif") repeat-x top; + padding: 5px 0; + border-radius: 5px; + overflow: hidden; } -.rtl #toggle-handle { - background-image: url(../images/toggle.gif); - background-position: 100% 50%; +@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) +{ + #acp { + min-width: 0; + min-height: 0; + border-radius: 0; + border-width: 1px 0; + background: #fff; + padding: 1px 0; + box-shadow: none; + } } +/* Sub-navigation Menu +---------------------------------------- */ + /* Menu */ #menu { float: left; - width: 20%; + width: 200px; font-size: 1.00em; padding: 0; border-right: 1px solid #CCCFD3; + position: relative; + z-index: 1; } .rtl #menu { @@ -412,15 +545,16 @@ span.corners-bottom span { list-style: none; margin: 0; padding: 0; + word-wrap: normal; } /* Default list state */ -#menu li { +#menu li, #menu .header { padding: 0; margin: 0; font-size: 0.85em; font-weight: bold; - display: inline; + display: block; } /* Link styles for the sub-section links */ @@ -437,6 +571,12 @@ span.corners-bottom span { padding: 3px 8px 3px 3px; } +#menu li span, #menu .header { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + #menu li a:hover, #menu li a:hover span { text-decoration: none; background-color: #FFFFFF; @@ -485,7 +625,7 @@ span.corners-bottom span { background: url("../images/arrow_down.gif") 99% 50% no-repeat; } -#menu li.header { +#menu .header { font-family: Tahoma, Helvetica, sans-serif; display: block; font-weight: bold; @@ -495,8 +635,71 @@ span.corners-bottom span { margin-top: 15px; text-transform: uppercase; font-size: 0.75em; + text-decoration: none; + cursor: inherit; + outline-style: none; } +@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) +{ + #menu, .rtl #menu { + float: none; + width: auto; + border-width: 0; + max-width: 200px; + margin: 0 auto 10px; + } + + #menu p { + text-align: center; + } + + #menu .menu-block.active { + margin: 0 -5px; + padding: 0 5px 3px; + background: rgba(255, 255, 255, .5); + border-radius: 5px; + } + + #menu .menu-block.no-header.active { + padding-top: 3px; + } + + #menu .menu-block .header { + margin-top: 5px; + cursor: pointer; + border-bottom-width: 0; + position: relative; + text-decoration: underline; + } + + #menu .menu-block .header:focus, #menu .menu-block.active .header { + color: #D31141; + text-decoration: none; + } + + #menu .menu-block ul { + display: none; + } + + .nojs #menu .menu-block:hover ul, #menu .menu-block.active ul, #menu .menu-block.no-header ul { + display: block; + } + + #menu .menu-block li:last-child { + border-bottom: 1px solid #327AA5; + } + + #menu .menu-block:last-child li:last-child, #menu .menu-block.active li:last-child { + border-bottom-width: 0; + } + + #menu .menu-block li a span { + border-radius: 2px; + } +} + + /* Table styles ---------------------------------------- */ @@ -658,6 +861,161 @@ td.name { color: #BC2A4D; } +/* Specific tables */ +table.forums td.folder { + width: 27px; + text-align: center; +} + +table td.actions { + vertical-align: middle; + width: 100px; + text-align: center; + white-space: nowrap; +} + +table.styles td.users, table td.mark { + text-align: center; +} + +@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) +{ + table.responsive, table.responsive tbody, table.responsive tr, table.responsive td { + display: block; + } + + table.responsive thead, table.responsive th, table.responsive colgroup { + display: none; + } + + table.responsive.show-header thead, table.responsive.show-header th:first-child, table.responsive caption { + display: block; + width: auto !important; + text-align: left !important; + margin: 0; + } + + table.responsive { + background: transparent none; + border-width: 0; + padding: 0; + } + + table.responsive caption { + padding: 3px 4px; + color: #FFFFFF; + background: #70AED3 url("../images/gradient2b.gif") bottom left repeat-x; + border-top: 1px solid #6DACD2; + border-bottom: 1px solid #327AA5; + text-align: left; + font-size: 0.75em; + font-weight: bold; + text-transform: uppercase; + } + + table.responsive.show-header th:first-child span.rank-img, table.responsive.no-caption caption, table.responsive.no-header thead { + display: none; + } + + table.responsive tr { + margin: 2px 0; + border: 1px solid #CCCFD3; + background-color: #FFFFFF; + padding: 1px 1px 0; + overflow: hidden; + } + + table.responsive tr.row1 td { background-color: #F9F9F9; } + table.responsive tr.row2 td { background-color: #DCEBFE; } + table.responsive tr.row3 td { background-color: #DBDFE2; } + table.responsive tr.row4 td { background-color: #E4E8EB; } + table.responsive tr.col1 td { background-color: #DCEBFE; } + table.responsive tr.col2 td { background-color: #F9F9F9; } + table.responsive tr.row1a td { background-color: #F9F9F9; } + table.responsive tr.row1b td { background-color: #F6F6F6; } + table.responsive tr.row2a td { background-color: #E7EEF4; } + table.responsive tr.row2b td { background-color: #E3EBF2; } + + table.responsive td { + width: auto !important; + text-align: left !important; + padding: 4px; + margin-bottom: 1px; + } + + table.responsive td.empty { + display: none !important; + } + + table.responsive td > dfn { + display: inline-block !important; + } + + table.responsive td > dfn:after { + content: ':'; + padding-right: 5px; + } + + table.responsive.two-columns td { + width: 50% !important; + float: left; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + table.responsive.two-columns td:nth-child(2n+1) { + clear: left; + } + + table.responsive span.rank-img { + float: none; + padding-right: 5px; + } + + table.responsive#memberlist td:first-child input[type="checkbox"] { + float: right; + } + + /* Specific tables */ + table.responsive.forums td.folder { + float: left; + width: 27px; + background: transparent; + } + .rtl table.responsive.forums td.folder { + float: right; + } + + table.responsive.forums td.forum-desc { + margin-left: 35px; + min-height: 27px; + background: transparent; + } + + .rtl table.responsive.forums td.forum-desc { + margin-left: 0; + margin-right: 35px; + } + + table.responsive td.actions { + clear: both; + text-align: right !important; + } + + .rtl table.responsive td.actions { + text-align: left !important; + } + + table.responsive.styles tr.responsive-style-row td:first-child { + padding-left: 4px !important; + padding-right: 4px !important; + } + + table.responsive.styles td:first-child > dfn, table.responsive td.actions > dfn { + display: none !important; + } +} + /* General form styles ----------------------------------------*/ fieldset { @@ -669,6 +1027,7 @@ fieldset { border-left: 1px solid #D7D7D7; background-color: #FFFFFF; position: relative; + border-radius: 3px; } .rtl fieldset { @@ -678,10 +1037,6 @@ fieldset { border-left: 1px solid #CCCCCC; } -* html fieldset { - padding: 0 10px 5px 10px; -} - fieldset p { font-size: 0.85em; } @@ -700,23 +1055,10 @@ legend { vertical-align: middle; } -* html legend { - margin: 0 0 -10px -7px; - line-height: 1em; - font-size: .85em; -} - -/* Holly hack, .rtl comes after html */ -* html .rtl legend { - margin: 0; - margin-right: -7px; -} - input, textarea { font-family: Verdana, Helvetica, Arial, sans-serif; font-size: 0.90em; font-weight: normal; - cursor: text; vertical-align: middle; padding: 2px; color: #111111; @@ -878,6 +1220,22 @@ select#full_folder_action { width: 95%; } +@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) +{ + fieldset { + padding: 5px; + } + + fieldset.quick, p.quick { + float: none !important; + text-align: center; + } + + fieldset.display-options { + clear: both; + } +} + /* Definition list layout for forms Other general def. list properties defined in prosilver_main.css ---------------------------------------- */ @@ -1009,6 +1367,51 @@ input:focus, textarea:focus { outline-style: none; } +@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) +{ + fieldset dl { + margin-bottom: 5px; + padding-bottom: 5px; + border-bottom: 1px solid #e8e8e8; + } + + fieldset > dl:last-child, fieldset > form:last-child > dl:last-child { + border-bottom-width: 0; + margin-bottom: 0; + } + + fieldset dt, .rtl fieldset dt, fieldset dd, .rtl fieldset dd { + border-width: 0; + margin-left: 0; + margin-right: 0; + float: none; + width: auto; + } + + .ltr fieldset dd { + padding-left: 20px; + } + + .rtl fieldset dd { + padding-right: 20px; + } + + select, dd select, dd input { + max-width: 300px; + } + + input[type="number"], dd input[type="number"] { + max-width: 70px; + } +} + +@media only screen and (max-width: 400px), only screen and (max-device-width: 400px) +{ + select, dd select, dd input { + max-width: 240px; + } +} + /* Submit button fieldset or paragraph ---------------------------------------- */ fieldset.submit-buttons { @@ -1035,6 +1438,13 @@ fieldset.submit-buttons legend { display: none; } +@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) +{ + p.submit-buttons { + margin-top: 0; + } +} + /* Input field styles ---------------------------------------- */ @@ -1050,7 +1460,6 @@ textarea.full { width: 99%; } -* html input.full, * html textarea.full { width: 95%;} input.medium { width: 50%;} input.narrow { width: 25%;} input.tiny { width: 10%;} @@ -1114,8 +1523,10 @@ input.button1:focus, input.button2:focus, input.button3:focus { position: fixed; display: none; top: 150px; - left: 25%; - width: 50%; + left: 0; + right: 0; + max-width: 600px; + margin: 0 auto; z-index: 50; padding: 25px; padding: 0 25px 20px 25px; @@ -1169,6 +1580,22 @@ input.button1:focus, input.button2:focus, input.button3:focus { height: 100%; background-color: #000000; opacity: 0.5; + z-index: 45; +} + +@media only screen and (max-height: 500px), only screen and (max-device-width: 500px) +{ + .phpbb_alert { + top: 25px; + } +} + +@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) +{ + .phpbb_alert { + max-width: none; + margin: 0 25px; + } } /* Pagination @@ -1252,6 +1679,20 @@ li.pagination ul { border-color: #B4BAC0; } +@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) +{ + .pagination, .rtl .pagination { + float: none; + text-align: center; + margin: 5px 0; + } + + .pagination li a, .pagination li span { + display: inline-block; + min-width: 10px; + } +} + /* Action Highlighting ---------------------------------------- */ .successbox, .errorbox { @@ -1277,8 +1718,6 @@ li.pagination ul { background-color: #BC2A4D; } -* html .errorbox, * html .successbox { height: 1%; } /* Pixel shift fix for IE */ - .successbox h3, .errorbox h3 { color: #FFFFFF; margin: 0 0 0.5em; @@ -1372,7 +1811,7 @@ li.pagination ul { visibility: hidden; }*/ -.clearfix, #tabs, .row, #content, fieldset dl, #page-body { +.clearfix, .row, #content, fieldset dl, #page-body { height: 1%; overflow: hidden; } @@ -1427,6 +1866,15 @@ li.pagination ul { /* Permission interface ---------------------------------------- */ +.column1, .column2 { + width: 48%; + float: left; +} + +.ltr .column2, .rtl .column1 { + float: right; +} + fieldset.permissions legend { text-transform: none; } @@ -1624,60 +2072,15 @@ fieldset.permissions .padding { float: left; background-color: #CADCEB; width: 100%; + border-radius: 5px; + overflow: hidden; + padding: 5px 0; } .rtl .permissions-panel { float: right; } -.permissions-panel span.corners-top { - background-image: url("../images/corners_left2.gif"); -} - -.permissions-panel span.corners-top span { - background-image: url("../images/corners_right2.gif"); -} - -.permissions-panel span.corners-bottom { - background-image: url("../images/corners_left2.gif"); -} - -.permissions-panel span.corners-bottom span { - background-image: url("../images/corners_right2.gif"); -} - -.permissions-panel span.corners-top, .permissions-panel span.corners-bottom, -.permissions-panel span.corners-top span, .permissions-panel span.corners-bottom span { - font-size: 1px; - line-height: 1px; - display: block; - height: 5px; - background-repeat: no-repeat; -} - -.permissions-panel span.corners-top { - background-image: url("../images/corners_left2.gif"); - background-position: 0 0; - margin: 0 0; -} - -.permissions-panel span.corners-top span { - background-image: url("../images/corners_right2.gif"); - background-position: 100% 0; -} - -.permissions-panel span.corners-bottom { - background-image: url("../images/corners_left2.gif"); - background-position: 0 100%; - margin: 0 0; - clear: both; -} - -.permissions-panel span.corners-bottom span { - background-image: url("../images/corners_right2.gif"); - background-position: 100% 100%; -} - /* Permission table ---------------------------------------- */ .permissions-panel .tablewrap { @@ -1760,6 +2163,205 @@ fieldset.permissions .padding { padding: 0; } +@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) +{ + .column1, .column2 { + float: none !important; + width: auto; + } + + .permissions-simple { + clear: both; + } + + .permissions-simple td, .permissions-simple dd { + width: auto !important; + margin-left: 0 !important; + margin-right: 0 !important; + } + + .permissions-simple dd { + margin-top: 5px; + } + + .permissions-panel .tablewrap { + margin: 0 5px; + } + + .permissions-category { + min-width: 0; + margin: 0 !important; + } + + .permissions-category a, .permissions-category a span.tabbg { + display: block; + float: none !important; + background: transparent none; + } + + .permissions-category a { + background: #d9e5ee; + margin: 5px 0; + padding: 0 !important; + border-radius: 3px; + text-decoration: underline; + } + + .permissions-category .activetab a { + background-color: #dd6900; + color: #fff; + } + + .permissions-category a span.tabbg { + color: inherit !important; + padding-top: 6px !important; + padding-bottom: 6px !important; + } + + .permissions-category .activetab span.colour { + border-color: #fff; + } +} + +/* Avatars gallery +---------------------------------------- */ +#gallery { + display: block; + margin: 0 -5px; + padding: 0; + overflow: hidden; +} + +#gallery li { + display: block; + float: left; + border: 1px solid #ccc; + border-radius: 2px; + background: #fff; + padding: 5px; + margin: 5px; +} + +#gallery li:hover { + background-color: #eee; +} + +#gallery li label { + display: block; + text-align: center; + padding: 0; +} + +/* Dropdown menu +----------------------------------------*/ +.dropdown { + position: absolute; + left: 0; + top: 22px; + z-index: 2; + border: 1px solid transparent; + border-radius: 5px; + padding: 9px 0 0; +} + +.dropdown-up .dropdown { + top: auto; + bottom: 18px; + padding: 0 0 9px; +} + +.dropdown-left .dropdown { + left: auto; + right: 0; +} + +.dropdown .pointer, .dropdown .pointer-inner { + position: absolute; + width: 0; + height: 0; + border-top-width: 0; + border-bottom: 10px solid transparent; + border-left: 10px dashed transparent; + border-right: 10px dashed transparent; + -webkit-transform: rotate(360deg); /* better anti-aliasing in webkit */ + display: block; +} + +.dropdown-up .pointer, .dropdown-up .pointer-inner { + border-bottom-width: 0; + border-top: 10px solid transparent; +} + +.dropdown .pointer { + right: auto; + left: 10px; + top: 0; + z-index: 3; +} + +.dropdown-up .pointer { + bottom: 0; + top: auto; +} + +.dropdown-left .dropdown .pointer { + left: auto; + right: 10px; +} + +.dropdown .pointer-inner { + top: auto; + bottom: -11px; + left: -10px; +} + +.dropdown-up .pointer-inner { + bottom: auto; + top: -11px; +} + +.dropdown .pointer { + border-color: #B9B9B9 transparent; +} + +.dropdown .pointer-inner { + border-color: #FFF transparent; +} + +.dropdown .dropdown-contents { + z-index: 2; + overflow: hidden; + background: #fff; + border: 1px solid #b9b9b9; + border-radius: 5px; + padding: 5px; + position: relative; + box-shadow: 1px 3px 5px rgba(0, 0, 0, 0.2); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.dropdown-up .dropdown-contents { + box-shadow: 1px 0 5px rgba(0, 0, 0, 0.2); +} + +.dropdown li { + float: none; + margin: 0; + white-space: nowrap; + text-align: left; +} + +.wrap .dropdown li, .dropdown.wrap li { + white-space: normal; +} + +.dropdown li:before, .dropdown li:after { + display: none !important; +} + + /* Classes for additional tasks ---------------------------------------- */ @@ -1782,3 +2384,11 @@ fieldset.permissions .padding { color: #FFFFFF; font-size: 1.4em; } + +@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) +{ + .responsive-hide { display: none !important; } + .responsive-show { display: block !important; } + .responsive-show-inline { display: inline !important; } + .responsive-show-inline-block { display: inline-block !important; } +} diff --git a/phpBB/adm/style/admin.js b/phpBB/adm/style/admin.js new file mode 100644 index 0000000000..e9f0f1e512 --- /dev/null +++ b/phpBB/adm/style/admin.js @@ -0,0 +1,243 @@ +/** +* phpBB3 ACP functions +*/ + +/** +* Parse document block +*/ +function parse_document(container) +{ + var test = document.createElement('div'), + oldBrowser = (typeof test.style.borderRadius == 'undefined'); + + delete test; + + /** + * Navigation + */ + container.find('#menu').each(function() { + var menu = $(this), + blocks = menu.children('.menu-block'); + + if (!blocks.length) { + return; + } + + // Set onclick event + blocks.children('a.header').click(function() { + var parent = $(this).parent(); + if (!parent.hasClass('active')) { + parent.siblings().removeClass('active'); + } + parent.toggleClass('active'); + }); + + // Set active menu + menu.find('#activemenu').parents('.menu-block').addClass('active'); + + // Check if there is active menu + if (!blocks.filter('.active').length) { + blocks.filter(':first').addClass('active'); + } + }); + + /** + * Responsive tables + */ + container.find('table').not('.not-responsive').each(function() { + var $this = $(this), + th = $this.find('thead > tr > th'), + columns = th.length, + headers = [], + totalHeaders = 0, + i, headersLength; + + // Find columns + $this.find('colgroup:first').children().each(function(i) { + var column = $(this); + $this.find('td:nth-child(' + (i + 1) + ')').addClass(column.prop('className')); + }); + + // Styles table + if ($this.hasClass('styles')) { + $this.find('td:first-child[style]').each(function() { + var style = $(this).attr('style'); + if (style.length) { + $(this).parent('tr').attr('style', style.toLowerCase().replace('padding', 'margin')).addClass('responsive-style-row'); + } + }); + } + + // Find each header + if (!$this.data('no-responsive-header')) + { + th.each(function(column) { + var cell = $(this), + colspan = parseInt(cell.attr('colspan')), + dfn = cell.attr('data-dfn'), + text = dfn ? dfn : cell.text().trim(); + + if (text == ' ') 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')), + text = cell.text().trim(); + + if (headersLength <= column) { + return; + } + + if ((text.length && text !== '-') || cell.children().length) { + if (headers[column] != '') { + 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').each(function() { + var items = $(this).children('tr'); + if (items.length == 0) + { + $(this).parent('table:first').addClass('responsive-hide'); + } + }); + + /** + * Fieldsets with empty <span> + */ + container.find('fieldset dt > span:last-child').each(function() { + var $this = $(this); + if ($this.html() == ' ') { + $this.addClass('responsive-hide'); + } + + }); + + /** + * Responsive tabs + */ + container.find('#tabs').not('[data-skip-responsive]').each(function() { + var $this = $(this), + $body = $('body'), + ul = $this.children(), + tabs = ul.children().not('[data-skip-responsive]'), + links = tabs.children('a'), + item = ul.append('<li class="responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link"><span> </span></a><div class="dropdown tab-dropdown" style="display: none;"><div class="pointer"><div class="pointer-inner" /></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 link = $(this); + maxHeight = Math.max(maxHeight, Math.max(link.outerHeight(true), link.parent().outerHeight(true))); + }) + + function check() { + var width = $body.width(), + height = $this.height(); + + if (arguments.length == 0 && (!responsive || width <= lastWidth) && height <= maxHeight) { + return; + } + + tabs.show(); + item.hide(); + + lastWidth = width; + height = $this.height(); + if (height <= maxHeight) { + responsive = false; + 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)); + tab.hide(); + if ($this.height() <= maxHeight) { + menu.find('a').click(function() { check(true); }); + return; + } + } + menu.find('a').click(function() { check(true); }); + } + + phpbb.registerDropdown(item.find('a.responsive-tab-link'), item.find('.dropdown'), {visibleClass: 'activetab', verticalDirection: 'down'}); + + check(true); + $(window).resize(check); + }); +} + +/** +* Run onload functions +*/ +(function($) { + $(document).ready(function() { + // Swap .nojs and .hasjs + $('body.nojs').toggleClass('nojs hasjs'); + + // Focus forms + $('form[data-focus]:first').each(function() { + $('#' + this.getAttribute('data-focus')).focus(); + }); + + parse_document($('body')); + }); +})(jQuery); diff --git a/phpBB/adm/style/install_footer.html b/phpBB/adm/style/install_footer.html index f7d62d7c7e..c5356e7b9d 100644 --- a/phpBB/adm/style/install_footer.html +++ b/phpBB/adm/style/install_footer.html @@ -1,10 +1,7 @@ - - </div> + </div> + </div><!-- /#main --> </div> - <span class="corners-bottom"><span></span></span> - <div class="clear"></div> - </div> - </div> + </div><!-- /#acp --> </div> <div id="page-footer"> @@ -14,6 +11,8 @@ <script type="text/javascript" src="{T_JQUERY_LINK}"></script> <!-- IF S_ALLOW_CDN --><script type="text/javascript">window.jQuery || document.write(unescape('%3Cscript src="{T_ASSETS_PATH}/javascript/jquery.js" type="text/javascript"%3E%3C/script%3E'));</script><!-- ENDIF --> +<!-- INCLUDEJS admin.js --> +{$SCRIPTS} </body> </html> diff --git a/phpBB/adm/style/install_header.html b/phpBB/adm/style/install_header.html index 5631b83e17..560bf501e9 100644 --- a/phpBB/adm/style/install_header.html +++ b/phpBB/adm/style/install_header.html @@ -2,6 +2,7 @@ <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}"> <head> <meta charset="utf-8"> +<meta name="viewport" content="width=device-width" /> <!-- IF META -->{META}<!-- ENDIF --> <title>{PAGE_TITLE}</title> @@ -34,7 +35,7 @@ function dE(n, s, type) </head> -<body class="{S_CONTENT_DIRECTION}"> +<body class="{S_CONTENT_DIRECTION} nojs"> <div id="wrap"> <div id="page-header"> <h1>{L_INSTALL_PANEL}</h1> @@ -54,16 +55,15 @@ function dE(n, s, type) <div id="tabs"> <ul> <!-- BEGIN t_block1 --> - <li<!-- IF t_block1.S_SELECTED --> id="activetab"<!-- ENDIF -->><a href="{t_block1.U_TITLE}"><span>{t_block1.L_TITLE}</span></a></li> + <li<!-- IF t_block1.S_SELECTED --> class="activetab"<!-- ENDIF -->><a href="{t_block1.U_TITLE}"><span>{t_block1.L_TITLE}</span></a></li> <!-- END t_block1 --> </ul> </div> <div id="acp"> - <div class="panel"> - <span class="corners-top"><span></span></span> <div id="content"> <div id="menu"> + <div class="menu-block no-header"> <ul> <!-- BEGIN l_block1 --> <li<!-- IF l_block1.S_SELECTED --> id="activemenu"<!-- ENDIF -->><a href="{l_block1.U_TITLE}"><span>{l_block1.L_TITLE}</span></a></li> @@ -72,6 +72,8 @@ function dE(n, s, type) <li<!-- IF l_block2.S_SELECTED --> id="activemenu"<!-- ENDIF -->><span<!-- IF l_block2.S_COMPLETE --> class="completed"<!-- ENDIF -->>{l_block2.L_TITLE}</span></li> <!-- END l_block2 --> </ul> + </div> </div> <div id="main" class="install-body"> + <div class="main"> diff --git a/phpBB/adm/style/install_update_diff.html b/phpBB/adm/style/install_update_diff.html index 1f30fe4d13..c27304a425 100644 --- a/phpBB/adm/style/install_update_diff.html +++ b/phpBB/adm/style/install_update_diff.html @@ -2,6 +2,7 @@ <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}"> <head> <meta charset="utf-8"> +<meta name="viewport" content="width=device-width" /> <!-- IF META -->{META}<!-- ENDIF --> <title>{PAGE_TITLE}</title> @@ -33,7 +34,7 @@ window.onresize = resize_panel; <style type="text/css"> /* <![CDATA[ */ -#main { +#main, .rtl #main { font-size: 1em; line-height: 0.7em; margin: 0; @@ -43,6 +44,7 @@ window.onresize = resize_panel; #diff_content { padding: 30px 10px 10px; + overflow: hidden; } <!-- IF DIFF_MODE neq 'side_by_side' and DIFF_MODE neq 'raw' --> @@ -238,15 +240,13 @@ table.hrdiff caption span { <div id="page-body"> <div id="acp"> - <div class="panel" id="codepanel"> - <span class="corners-top"><span></span></span> + <div id="codepanel"> <div id="diff_content"> <div id="main"> {DIFF_CONTENT} </div> </div> - <span class="corners-bottom"><span></span></span> - </div> + </div> </div> </div> diff --git a/phpBB/adm/style/overall_footer.html b/phpBB/adm/style/overall_footer.html index 145ad18709..3c291842dc 100644 --- a/phpBB/adm/style/overall_footer.html +++ b/phpBB/adm/style/overall_footer.html @@ -1,10 +1,7 @@ - - </div> + </div> + </div><!-- /#main --> </div> - <span class="corners-bottom"><span></span></span> - <div class="clear"></div> - </div> - </div> + </div><!-- /#acp --> </div> <div id="page-footer"> @@ -38,6 +35,7 @@ <!-- IF S_ALLOW_CDN --><script type="text/javascript">window.jQuery || document.write(unescape('%3Cscript src="{T_ASSETS_PATH}/javascript/jquery.js?assets_version={T_ASSETS_VERSION}" type="text/javascript"%3E%3C/script%3E'));</script><!-- ENDIF --> <script type="text/javascript" src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script> <!-- INCLUDEJS ajax.js --> +<!-- INCLUDEJS admin.js --> {$SCRIPTS} <!-- EVENT acp_overall_footer_after --> diff --git a/phpBB/adm/style/overall_header.html b/phpBB/adm/style/overall_header.html index 3a9b6db2a3..455446f8e3 100644 --- a/phpBB/adm/style/overall_header.html +++ b/phpBB/adm/style/overall_header.html @@ -2,6 +2,7 @@ <html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}"> <head> <meta charset="utf-8"> +<meta name="viewport" content="width=device-width" /> <!-- IF META -->{META}<!-- ENDIF --> <title>{PAGE_TITLE}</title> @@ -14,9 +15,6 @@ var on_page = '{ON_PAGE}'; var per_page = '{PER_PAGE}'; var base_url = '{BASE_URL|e('js')}'; -var menu_state = 'shown'; - - /** * Jump to page */ @@ -103,62 +101,12 @@ function popup(url, width, height, name) return false; } -/** -* Hiding/Showing the side menu -*/ -function switch_menu() -{ - var menu = document.getElementById('menu'); - var main = document.getElementById('main'); - var toggle = document.getElementById('toggle'); - var handle = document.getElementById('toggle-handle'); - - switch (menu_state) - { - // hide - case 'shown': - main.style.width = '93%'; - menu_state = 'hidden'; - menu.style.display = 'none'; - toggle.style.width = '20px'; - handle.style.backgroundImage = 'url(images/toggle.gif)'; - handle.style.backgroundRepeat = 'no-repeat'; - - <!-- IF S_CONTENT_DIRECTION eq 'rtl' --> - handle.style.backgroundPosition = '0% 50%'; - toggle.style.left = '96%'; - <!-- ELSE --> - handle.style.backgroundPosition = '100% 50%'; - toggle.style.left = '0'; - <!-- ENDIF --> - break; - - // show - case 'hidden': - main.style.width = '76%'; - menu_state = 'shown'; - menu.style.display = 'block'; - toggle.style.width = '5%'; - handle.style.backgroundImage = 'url(images/toggle.gif)'; - handle.style.backgroundRepeat = 'no-repeat'; - - <!-- IF S_CONTENT_DIRECTION eq 'rtl' --> - handle.style.backgroundPosition = '100% 50%'; - toggle.style.left = '75%'; - <!-- ELSE --> - handle.style.backgroundPosition = '0% 50%'; - toggle.style.left = '15%'; - <!-- ENDIF --> - break; - } -} - // ]]> </script> <!-- EVENT acp_overall_header_head_append --> </head> -<body class="{S_CONTENT_DIRECTION}"> +<body class="{S_CONTENT_DIRECTION} nojs"> <div id="wrap"> <div id="page-header"> @@ -171,29 +119,25 @@ function switch_menu() <div id="tabs"> <ul> <!-- BEGIN t_block1 --> - <li<!-- IF t_block1.S_SELECTED --> id="activetab"<!-- ENDIF -->><a href="{t_block1.U_TITLE}"><span>{t_block1.L_TITLE}</span></a></li> + <li<!-- IF t_block1.S_SELECTED --> class="activetab"<!-- ENDIF -->><a href="{t_block1.U_TITLE}"><span>{t_block1.L_TITLE}</span></a></li> <!-- END t_block1 --> </ul> </div> <div id="acp"> - <div class="panel"> - <span class="corners-top"><span></span></span> <div id="content"> - <!-- IF not S_USER_NOTICE --> - <div id="toggle"> - <a id="toggle-handle" accesskey="m" title="{L_MENU_TOGGLE}" onclick="switch_menu(); return false;" href="#"></a></div> - <!-- ENDIF --> <div id="menu"> <p>{L_LOGGED_IN_AS}<br /><strong>{USERNAME}</strong> [ <a href="{U_LOGOUT}">{L_LOGOUT}</a> ][ <a href="{U_ADM_LOGOUT}">{L_ADM_LOGOUT}</a> ] </p> - <ul> <!-- DEFINE $LI_USED = 0 --> <!-- BEGIN l_block1 --> <!-- IF l_block1.S_SELECTED --> <!-- BEGIN l_block2 --> <!-- IF .l_block1.l_block2.l_block3 --> - <li class="header">{l_block1.l_block2.L_TITLE}</li> + <!-- IF $LI_USED --></ul></div><!-- ENDIF --> + <div class="menu-block"> + <a class="header" href="javascript:void(0);">{l_block1.l_block2.L_TITLE}</a> + <ul> <!-- DEFINE $LI_USED = 1 --> <!-- ENDIF --> @@ -205,10 +149,12 @@ function switch_menu() <!-- ENDIF --> <!-- END l_block1 --> - <!-- IF not $LI_USED --> - <li></li> + <!-- IF $LI_USED --> + </ul> + </div> <!-- ENDIF --> </ul> </div> <div id="main"> + <div class="main"> diff --git a/phpBB/adm/style/permission_mask.html b/phpBB/adm/style/permission_mask.html index d26cd5d8a6..7b5c071693 100644 --- a/phpBB/adm/style/permission_mask.html +++ b/phpBB/adm/style/permission_mask.html @@ -75,9 +75,8 @@ <!-- BEGIN category --> <div class="permissions-panel" id="options{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}{p_mask.f_mask.category.S_ROW_COUNT}" <!-- IF p_mask.S_FIRST_ROW and p_mask.f_mask.S_FIRST_ROW and p_mask.f_mask.category.S_FIRST_ROW --><!-- ELSE --> style="display: none;"<!-- ENDIF -->> - <span class="corners-top"><span></span></span> <div class="tablewrap"> - <table id="table{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}{p_mask.f_mask.category.S_ROW_COUNT}" class="table1"> + <table id="table{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}{p_mask.f_mask.category.S_ROW_COUNT}" class="table1 not-responsive"> <colgroup> <col class="permissions-name" /> <col class="permissions-yes" /> @@ -128,7 +127,6 @@ <!-- ENDIF --> - <span class="corners-bottom"><span></span></span> </div> <!-- END category --> <div class="clearfix"></div> diff --git a/phpBB/assets/javascript/core.js b/phpBB/assets/javascript/core.js index ab0891e70c..efb945a117 100644 --- a/phpBB/assets/javascript/core.js +++ b/phpBB/assets/javascript/core.js @@ -27,12 +27,12 @@ phpbb.loadingAlert = function() { } else { loadingAlert.show(); dark.fadeIn(phpbb.alertTime, function() { - // Wait five seconds and display an error if nothing has been returned by then. + // Wait fifteen seconds and display an error if nothing has been returned by then. phpbbAlertTimer = setTimeout(function() { if (loadingAlert.is(':visible')) { phpbb.alert($('#phpbb_alert').attr('data-l-err'), $('#phpbb_alert').attr('data-l-timeout-processing-req')); } - }, 5000); + }, 15000); }); } @@ -830,12 +830,146 @@ phpbb.applyCodeEditor = function(textarea) { }; /** +* List of classes that toggle dropdown menu, +* list of classes that contain visible dropdown menu +* +* Add your own classes to strings with comma (probably you +* will never need to do that) +*/ +phpbb.dropdownHandles = '.dropdown-container.dropdown-visible .dropdown-toggle'; +phpbb.dropdownVisibleContainers = '.dropdown-container.dropdown-visible'; + +/** +* Dropdown toggle event handler +* This handler is used by phpBB.registerDropdown() and other functions +*/ +phpbb.toggleDropdown = function() { + var $this = $(this), + options = $this.data('dropdown-options'), + parent = options.parent, + visible = parent.hasClass('dropdown-visible'); + + if (!visible) { + // Hide other dropdown menus + $(phpbb.dropdownHandles).each(phpbb.toggleDropdown); + + // Figure out direction of dropdown + var direction = options.direction, + verticalDirection = options.verticalDirection, + offset = $this.offset(); + + if (direction == 'auto') { + if (($(window).width() - $this.outerWidth(true)) / 2 > offset.left) { + direction = 'right'; + } + else { + direction = 'left'; + } + } + parent.toggleClass(options.leftClass, direction == 'left').toggleClass(options.rightClass, direction == 'right'); + + if (verticalDirection == 'auto') { + var height = $(window).height(), + top = offset.top - $(window).scrollTop(); + + if (top < height * 0.7) { + verticalDirection = 'down'; + } + else { + verticalDirection = 'up'; + } + } + parent.toggleClass(options.upClass, verticalDirection == 'up').toggleClass(options.downClass, verticalDirection == 'down'); + } + + options.dropdown.toggle(); + parent.toggleClass(options.visibleClass, !visible).toggleClass('dropdown-visible', !visible); + + // Check dimensions when showing dropdown + // !visible because variable shows state of dropdown before it was toggled + if (!visible) { + options.dropdown.find('.dropdown-contents').each(function() { + var $this = $(this), + windowWidth = $(window).width(); + + $this.css({ + marginLeft: 0, + left: 0, + maxWidth: (windowWidth - 4) + 'px' + }); + + var offset = $this.offset().left, + width = $this.outerWidth(true); + + if (offset < 2) { + $this.css('left', (2 - offset) + 'px'); + } + else if ((offset + width + 2) > windowWidth) { + $this.css('margin-left', (windowWidth - offset - width - 2) + 'px'); + } + }); + } + + // Prevent event propagation + if (arguments.length > 0) { + try { + var e = arguments[0]; + e.preventDefault(); + e.stopPropagation(); + } + catch (error) { } + } + return false; +}; + +/** +* Register dropdown menu +* Shows/hides dropdown, decides which side to open to +* +* @param {jQuery} toggle Link that toggles dropdown. +* @param {jQuery} dropdown Dropdown menu. +* @param {Object} options List of options. Optional. +*/ +phpbb.registerDropdown = function(toggle, dropdown, options) +{ + var ops = { + parent: toggle.parent(), // Parent item to add classes to + direction: 'auto', // Direction of dropdown menu. Possible values: auto, left, right + verticalDirection: 'auto', // Vertical direction. Possible values: auto, up, down + visibleClass: 'visible', // Class to add to parent item when dropdown is visible + leftClass: 'dropdown-left', // Class to add to parent item when dropdown opens to left side + rightClass: 'dropdown-right', // Class to add to parent item when dropdown opens to right side + upClass: 'dropdown-up', // Class to add to parent item when dropdown opens above menu item + downClass: 'dropdown-down' // Class to add to parent item when dropdown opens below menu item + }; + if (options) { + ops = $.extend(ops, options); + } + ops.dropdown = dropdown; + + ops.parent.addClass('dropdown-container'); + toggle.addClass('dropdown-toggle'); + + toggle.data('dropdown-options', ops); + + toggle.click(phpbb.toggleDropdown); +}; + +/** * Apply code editor to all textarea elements with data-bbcode attribute */ $(document).ready(function() { $('textarea[data-bbcode]').each(function() { phpbb.applyCodeEditor(this); }); + + // Hide active dropdowns when click event happens outside + $('body').click(function(e) { + var parents = $(e.target).parents(); + if (!parents.is(phpbb.dropdownVisibleContainers)) { + $(phpbb.dropdownHandles).each(phpbb.toggleDropdown); + } + }); }); })(jQuery); // Avoid conflicts with other libraries diff --git a/phpBB/assets/javascript/plupload.js b/phpBB/assets/javascript/plupload.js index 32ff178896..1befb88eb6 100644 --- a/phpBB/assets/javascript/plupload.js +++ b/phpBB/assets/javascript/plupload.js @@ -62,6 +62,47 @@ function phpbb_plupload_clear_params(obj) { } } +/** + * Update hidden attachment inputs in posting form + * Pre-existing hidden inputs will be removed by comparing the old attachment + * data (old_data) to the new attachment data (data) that has been sent back + * by plupload. + * + * @param object form Posting form + * @param object data Current attachment_data + * @param object old_date Previous attachment_data (before submission) + * + * @return void + */ +phpbb.update_hidden_attachment_inputs = function(form, data, old_data) { + // Update already existing hidden inputs + for (var i = 0; i < form.length; i++) { + if (data.hasOwnProperty(form[i].name)) { + form[i].value = data[form[i].name]; + delete data[form[i].name]; + } else if (typeof old_data !== 'undefined' && old_data.hasOwnProperty(form[i].name)) { + var inputRegex = /\b^[a-z_]+[+[0-9]+]/; + var inputName = inputRegex.exec(form[i].name); + if (typeof inputName !== 'undefined' && inputName[0] !== '') { + $("input[type='hidden'][name^='" + inputName[0] + "']").remove(); + } + } + } + + // Append new inputs + for (var key in data) { + if (!data.hasOwnProperty(key)) { + continue; + } + + var input = $('<input />') + .attr('type', 'hidden') + .attr('name', key) + .attr('value', data[key]); + $(form).append(input); + } +} + jQuery(function($) { $(phpbb.plupload.config.element_hook).pluploadQueue(phpbb.plupload.config); var uploader = $(phpbb.plupload.config.element_hook).pluploadQueue(); @@ -208,26 +249,7 @@ jQuery(function($) { var form = $(phpbb.plupload.config.form_hook)[0]; var data = phpbb_plupload_attachment_data_serialize(); - // Update already existing hidden inputs - for (var i = 0; i < form.length; i++) { - if (data.hasOwnProperty(form[i].name)) { - form[i].value = data[form[i].name]; - delete data[form[i].name]; - } - } - - // Append new inputs - for (var key in data) { - if (!data.hasOwnProperty(key)) { - continue; - } - - var input = $('<input />') - .attr('type', 'hidden') - .attr('name', key) - .attr('value', data[key]); - $(form).append(input); - } + phpbb.update_hidden_attachment_inputs(form, data); files.forEach(function(file) { if (file.status !== plupload.DONE) { @@ -257,6 +279,7 @@ jQuery(function($) { var done = function(response) { up.removeFile(file); plupload.attachment_data = response; + phpbb.update_hidden_attachment_inputs(form, phpbb_plupload_attachment_data_serialize(), data); phpbb_plupload_clear_params(up.settings.multipart_params); up.settings.multipart_params = $.extend( up.settings.multipart_params, diff --git a/phpBB/composer.json b/phpBB/composer.json index 455ad49aac..ddb264de17 100644 --- a/phpBB/composer.json +++ b/phpBB/composer.json @@ -14,6 +14,7 @@ "fabpot/goutte": "1.0.*", "phpunit/dbunit": "1.2.*", "phpunit/phpunit": "3.7.*", - "phing/phing": "2.4.*" + "phing/phing": "2.4.*", + "squizlabs/php_codesniffer": "1.*" } } diff --git a/phpBB/composer.lock b/phpBB/composer.lock index eb57ddb4d9..5d1ba4efe1 100644 --- a/phpBB/composer.lock +++ b/phpBB/composer.lock @@ -3,7 +3,7 @@ "This file locks the dependencies of your project to a known state", "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" ], - "hash": "0bc0fd0d784720629ae0ba6d4be6a577", + "hash": "7bcfe8f8ce4fa46cb53c276cf93dcd3e", "packages": [ { "name": "lusitanian/oauth", @@ -302,7 +302,7 @@ "Symfony\\Component\\EventDispatcher\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1376,6 +1376,76 @@ "time": "2013-01-13 10:24:48" }, { + "name": "squizlabs/php_codesniffer", + "version": "1.5.0RC4", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "146a9b54e4adeaca0a3ae073e0a8a03570d6cc43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/146a9b54e4adeaca0a3ae073e0a8a03570d6cc43", + "reference": "146a9b54e4adeaca0a3ae073e0a8a03570d6cc43", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.1.2" + }, + "suggest": { + "phpunit/php-timer": "dev-master" + }, + "bin": [ + "scripts/phpcs" + ], + "type": "library", + "autoload": { + "classmap": [ + "CodeSniffer.php", + "CodeSniffer/CLI.php", + "CodeSniffer/Exception.php", + "CodeSniffer/File.php", + "CodeSniffer/Report.php", + "CodeSniffer/Reporting.php", + "CodeSniffer/Sniff.php", + "CodeSniffer/Tokens.php", + "CodeSniffer/Reports/", + "CodeSniffer/CommentParser/", + "CodeSniffer/Tokenizers/", + "CodeSniffer/DocGenerators/", + "CodeSniffer/Standards/AbstractPatternSniff.php", + "CodeSniffer/Standards/AbstractScopeSniff.php", + "CodeSniffer/Standards/AbstractVariableSniff.php", + "CodeSniffer/Standards/IncorrectPatternException.php", + "CodeSniffer/Standards/Generic/Sniffs/", + "CodeSniffer/Standards/MySource/Sniffs/", + "CodeSniffer/Standards/PEAR/Sniffs/", + "CodeSniffer/Standards/PSR1/Sniffs/", + "CodeSniffer/Standards/PSR2/Sniffs/", + "CodeSniffer/Standards/Squiz/Sniffs/", + "CodeSniffer/Standards/Zend/Sniffs/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenises PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "http://www.squizlabs.com/php-codesniffer", + "keywords": [ + "phpcs", + "standards" + ], + "time": "2013-09-26 00:14:02" + }, + { "name": "symfony/browser-kit", "version": "v2.3.4", "target-dir": "Symfony/Component/BrowserKit", diff --git a/phpBB/config/avatars.yml b/phpBB/config/avatars.yml index 31ae1ecef9..d22a5db2ae 100644 --- a/phpBB/config/avatars.yml +++ b/phpBB/config/avatars.yml @@ -5,6 +5,7 @@ services: - @config - %core.root_path% - %core.php_ext% + - @path_helper - @cache.driver calls: - [set_name, [avatar.driver.gravatar]] @@ -17,6 +18,7 @@ services: - @config - %core.root_path% - %core.php_ext% + - @path_helper - @cache.driver calls: - [set_name, [avatar.driver.local]] @@ -29,6 +31,7 @@ services: - @config - %core.root_path% - %core.php_ext% + - @path_helper - @cache.driver calls: - [set_name, [avatar.driver.remote]] @@ -41,6 +44,7 @@ services: - @config - %core.root_path% - %core.php_ext% + - @path_helper - @cache.driver calls: - [set_name, [avatar.driver.upload]] diff --git a/phpBB/config/services.yml b/phpBB/config/services.yml index c6490a21d7..7e3202d86b 100644 --- a/phpBB/config/services.yml +++ b/phpBB/config/services.yml @@ -22,7 +22,6 @@ services: arguments: - @config - @avatar.driver_collection - - @service_container cache: class: phpbb\cache\service diff --git a/phpBB/develop/export_events_for_wiki.php b/phpBB/develop/export_events_for_wiki.php new file mode 100644 index 0000000000..b276b4c5fa --- /dev/null +++ b/phpBB/develop/export_events_for_wiki.php @@ -0,0 +1,307 @@ +<?php +/** +* +* @copyright (c) 2013 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +if (php_sapi_name() != 'cli') +{ + die("This program must be run from the command line.\n"); +} + +$phpEx = substr(strrchr(__FILE__, '.'), 1); +$phpbb_root_path = __DIR__ . '/../'; + +function usage() +{ + echo "Usage: export_events_for_wiki.php COMMAND\n"; + echo "\n"; + echo "acp:\n"; + echo " Export all events for files in the acp style.\n"; + echo "\n"; + echo "styles:\n"; + echo " Export all events for files in the prosilver and subsilver2 styles.\n"; + echo "\n"; + echo "php:\n"; + echo " Export all events for php-files.\n"; + exit(2); +} + +function export_from_eventsmd($phpbb_root_path, $filter) +{ + $file_content = file_get_contents($phpbb_root_path . 'docs/events.md'); + + $events = explode("\n\n", $file_content); + foreach ($events as $event) + { + // Last row of the file + if (strpos($event, "\n===\n") === false) continue; + + list($event_name, $details) = explode("\n===\n", $event); + + if ($filter == 'acp' && strpos($event_name, 'acp_') !== 0) continue; + if ($filter == 'styles' && strpos($event_name, 'acp_') === 0) continue; + + list($file_details, $details) = explode("\n* Since: ", $details); + list($version, $explanition) = explode("\n* Purpose: ", $details); + + echo "|- id=\"{$event_name}\"\n"; + echo "| [[#{$event_name}|{$event_name}]] || "; + + if (strpos($file_details, "* Locations:\n + ") === 0) + { + $file_details = substr($file_details, strlen("* Locations:\n + ")); + $files = explode("\n + ", $file_details); + $prosilver = $subsilver2 = array(); + foreach ($files as $file) + { + if (strpos($file, 'styles/prosilver/template/') === 0) + { + $prosilver[] = substr($file, strlen('styles/prosilver/template/')); + } + if (strpos($file, 'styles/subsilver2/template/') === 0) + { + $subsilver2[] = substr($file, strlen('styles/subsilver2/template/')); + } + } + echo implode(', ', $prosilver) . ' || ' . implode(', ', $subsilver2); + } + else if ($filter == 'acp') + { + echo substr($file_details, strlen("* Location: adm/style/")); + } + echo " || {$version} || " . str_replace("\n", ' ', $explanition) . "\n"; + + } +} + +function export_from_php($phpbb_root_path) +{ + $files = get_file_list($phpbb_root_path); + $events = array(); + foreach ($files as $file) + { + $file_events = check_for_events($phpbb_root_path, $file); + if (!empty($file_events)) + { + $events = array_merge($events, $file_events); + } + } + + ksort($events); + + foreach ($events as $event) + { + echo '|- id="' . $event['event'] . '"' . "\n"; + echo '| [[#' . $event['event'] . '|' . $event['event'] . ']] || ' . $event['file'] . ' || ' . implode(', ', $event['arguments']) . ' || ' . $event['since'] . ' || ' . $event['description'] . "\n"; + } +} + +function check_for_events($phpbb_root_path, $file) +{ + $events = array(); + $content = file_get_contents($phpbb_root_path . $file); + + if (strpos($content, "phpbb_dispatcher->trigger_event('") || strpos($content, "phpbb_dispatcher->dispatch('")) + { + $lines = explode("\n", $content); + for ($i = 0, $num_lines = sizeof($lines); $i < $num_lines; $i++) + { + $event_line = 0; + if ($found_trigger_event = strpos($lines[$i], "phpbb_dispatcher->trigger_event('")) + { + $event_line = $i; + $event_name = $lines[$event_line]; + $event_name = substr($event_name, $found_trigger_event + strlen("phpbb_dispatcher->trigger_event('")); + $event_name = substr($event_name, 0, strpos($event_name, "'")); + + // Find $vars array lines + $find_varsarray_line = 1; + while (strpos($lines[$event_line - $find_varsarray_line], "vars = array('") === false) + { + $find_varsarray_line++; + + if ($find_varsarray_line > min(50, $event_line)) + { + throw new LogicException('Can not find "$vars = array()"-line for event "' . $event_name . '" in file "' . $file . '"'); + } + } + $varsarray = substr(trim($lines[$event_line - $find_varsarray_line]), strlen("\$vars = array('"), -3); + $arguments = explode("', '", $varsarray); + + // Validate $vars array with @var + $find_vars_line = 3; + $doc_vars = array(); + while (strpos(trim($lines[$event_line - $find_vars_line]), '*') === 0) + { + $var_line = trim($lines[$event_line - $find_vars_line]); + $var_line = preg_replace('!\s+!', ' ', $var_line); + if (strpos($var_line, '* @var ') === 0) + { + $doc_line = explode(' ', $var_line); + if (isset($doc_line[3])) + { + $doc_vars[] = $doc_line[3]; + } + } + $find_vars_line++; + } + if (sizeof($arguments) !== sizeof($doc_vars) && array_intersect($arguments, $doc_vars)) + { + throw new LogicException('$vars array does not match the list of @var tags for event "' . $event_name . '" in file "' . $file . '"'); + } + } + else if ($found_trigger_event = strpos($lines[$i], "phpbb_dispatcher->dispatch('")) + { + $event_line = $i; + $event_name = $lines[$event_line]; + $event_name = substr($event_name, $found_trigger_event + strlen("phpbb_dispatcher->dispatch('")); + $event_name = substr($event_name, 0, strpos($event_name, "'")); + $arguments = array(); + } + + if ($event_line) + { + // Validate @event name + $find_event_line = 1; + while (strpos($lines[$event_line - $find_event_line], '* @event ') === false) + { + $find_event_line++; + + if ($find_event_line > min(50, $event_line)) + { + throw new LogicException('Can not find @event tag for event "' . $event_name . '" in file "' . $file . '"'); + } + } + $event_name_tag = substr(trim($lines[$event_line - $find_event_line]), strlen('* @event ')); + if ($event_name_tag !== $event_name) + { + throw new LogicException('Event name does not match @event tag for event "' . $event_name . '" in file "' . $file . '"'); + } + + // Find @since + $find_since_line = 1; + while (strpos($lines[$event_line - $find_since_line], '* @since ') === false) + { + $find_since_line++; + + if ($find_since_line > min(50, $event_line)) + { + throw new LogicException('Can not find @since tag for event "' . $event_name . '" in file "' . $file . '"'); + } + } + $since = substr(trim($lines[$event_line - $find_since_line]), strlen('* @since ')); + $since = ($since == '3.1-A1') ? '3.1.0-a1' : $since; + + // Find event description line + $find_description_line = 3; + while (strpos(trim($lines[$event_line - $find_description_line]), '*') === 0) + { + $find_description_line++; + + if ($find_description_line > min(50, $event_line)) + { + throw new LogicException('Can not find description-line for event "' . $event_name . '" in file "' . $file . '"'); + } + } + $description = substr(trim($lines[$event_line - $find_description_line + 1]), strlen('* ')); + + $events[$event_name] = array( + 'event' => $event_name, + 'file' => $file, + 'arguments' => $arguments, + 'since' => $since, + 'description' => $description, + ); + } + } + } + + return $events; +} + +/** +* Returns a list of files in that directory +* +* Works recursive with any depth +* +* @param string $dir Directory to go through +* @return array List of files (including directories from within $dir +*/ +function get_file_list($dir, $path = '') +{ + try + { + $iterator = new \DirectoryIterator($dir); + } + catch (Exception $e) + { + return array(); + } + + $files = array(); + foreach ($iterator as $file_info) + { + if ($file_info->isDot()) + { + continue; + } + + // Do not scan some directories + if ($file_info->isDir() && ( + ($path == '' && in_array($file_info->getFilename(), array('cache', 'develop', 'ext', 'files', 'language', 'store', 'vendor'))) + || ($path == '/includes' && in_array($file_info->getFilename(), array('utf'))) + || ($path == '/phpbb/db/migration' && in_array($file_info->getFilename(), array('data'))) + || ($path == '/phpbb' && in_array($file_info->getFilename(), array('event'))) + )) + { + continue; + } + else if ($file_info->isDir()) + { + $sub_dir = get_file_list($file_info->getPath() . '/' . $file_info->getFilename(), $path . '/' . $file_info->getFilename()); + foreach ($sub_dir as $file) + { + $files[] = $file_info->getFilename() . '/' . $file; + } + } + else if ($file_info->getExtension() == 'php') + { + $files[] = $file_info->getFilename(); + } + } + + return $files; +} + +function validate_argument_count($arguments, $count) +{ + if ($arguments <= $count) + { + usage(); + } +} + +validate_argument_count($argc, 1); + +$action = $argv[1]; + +switch ($action) +{ + case 'acp': + export_from_eventsmd($phpbb_root_path, 'acp'); + break; + + case 'styles': + export_from_eventsmd($phpbb_root_path, 'styles'); + break; + + case 'php': + export_from_php($phpbb_root_path); + break; + + default: + usage(); +} diff --git a/phpBB/docs/INSTALL.html b/phpBB/docs/INSTALL.html index 937568cf10..01eeea6540 100644 --- a/phpBB/docs/INSTALL.html +++ b/phpBB/docs/INSTALL.html @@ -132,6 +132,7 @@ <li>A SQL database system, <strong>one of</strong>: <ul> <li>MySQL 3.23 or above (MySQLi supported)</li> + <li>MariaDB 5.1 or above</li> <li>PostgreSQL 8.3+</li> <li>SQLite 2.8.2+ (SQLite 3 is not supported)</li> <li>Firebird 2.1+</li> diff --git a/phpBB/docs/README.html b/phpBB/docs/README.html index 899ca64fb5..27ace05169 100644 --- a/phpBB/docs/README.html +++ b/phpBB/docs/README.html @@ -323,7 +323,7 @@ <p>Please remember that running any application on a development (unstable, e.g. a beta release) version of PHP can lead to strange/unexpected results which may appear to be bugs in the application. Therefore, we recommend you upgrade to the newest stable version of PHP before running phpBB3. If you are running a development version of PHP please check any bugs you find on a system running a stable release before submitting.</p> - <p>This board has been developed and tested under Linux and Windows (amongst others) running Apache using MySQL 3.23, 4.x, 5.x, MSSQL Server 2000, PostgreSQL 8.x, Oracle 8, SQLite 2 and Firebird. Versions of PHP used range from 5.3.x to 5.4.x without problem.</p> + <p>This board has been developed and tested under Linux and Windows (amongst others) running Apache using MySQL 3.23, 4.x, 5.x, MariaDB 5.x, MSSQL Server 2000, PostgreSQL 8.x, Oracle 8, SQLite 2 and Firebird. Versions of PHP used range from 5.3.x to 5.4.x without problem.</p> <a name="phpsec"></a><h3>7.i. Notice on PHP security issues</h3> diff --git a/phpBB/docs/events.md b/phpBB/docs/events.md index bef4727149..49804a57bc 100644 --- a/phpBB/docs/events.md +++ b/phpBB/docs/events.md @@ -1,41 +1,49 @@ acp_forums_normal_settings_append === * Location: adm/style/acp_forums.html +* Since: 3.1.0-a1 * Purpose: Add settings to forums acp_main_actions_append === * Location: adm/style/acp_main.html +* Since: 3.1.0-a1 * Purpose: Add actions to the ACP main page below the cache purge action acp_main_notice_after === * Location: adm/style/acp_main.html +* Since: 3.1.0-a1 * Purpose: Add notices or other blocks in the ACP below other configuration notices acp_overall_footer_after === * Location: adm/style/overall_footer.html +* Since: 3.1.0-a1 * Purpose: Add content below the footer in the ACP acp_overall_header_head_append === * Location: adm/style/overall_header.html -* Add assets within the `<head>` tags in the ACP +* Since: 3.1.0-a1 +* Purpose: Add assets within the `<head>` tags in the ACP acp_simple_footer_after === * Location: adm/style/simple_footer.html +* Since: 3.1.0-a1 * Purpose: Add content below the simple footer in the ACP acp_simple_header_head_append === * Location: adm/style/overall_header.html -* Add assets within the `<head>` tags in the simple header of the ACP +* Since: 3.1.0-a1 +* Purpose: Add assets within the `<head>` tags in the simple header of the ACP acp_users_overview_options_append === * Location: adm/style/acp_users.html +* Since: 3.1.0-a1 * Purpose: Add options and settings on user overview page forumlist_body_last_post_title_prepend @@ -43,6 +51,7 @@ forumlist_body_last_post_title_prepend * Locations: + styles/prosilver/template/forumlist_body.html + styles/subsilver2/template/forumlist_body.html +* Since: 3.1.0-a1 * Purpose: Add content before the post title of the latest post in a forum on the forum list. index_body_stat_blocks_before @@ -50,6 +59,7 @@ index_body_stat_blocks_before * Locations: + styles/prosilver/template/index_body.html + styles/subsilver2/template/index_body.html +* Since: 3.1.0-a1 * Purpose: Add new statistic blocks above the Who Is Online and Board Statistics blocks memberlist_body_username_append @@ -57,6 +67,7 @@ memberlist_body_username_append * Locations: + styles/prosilver/template/memberlist_body.html + styles/subsilver2/template/memberlist_body.html +* Since: 3.1.0-a1 * Purpose: Add information after every username in the memberlist. Works in all display modes (leader, group and normal memberlist). @@ -65,6 +76,7 @@ memberlist_body_username_prepend * Locations: + styles/prosilver/template/memberlist_body.html + styles/subsilver2/template/memberlist_body.html +* Since: 3.1.0-a1 * Purpose: Add information before every username in the memberlist. Works in all display modes (leader, group and normal memberlist). @@ -73,6 +85,7 @@ memberlist_view_user_statistics_after * Locations: + styles/prosilver/template/memberlist_view.html + styles/subsilver2/template/memberlist_view.html +* Since: 3.1.0-a1 * Purpose: Add entries after the user statistics part of any user profile memberlist_view_user_statistics_before @@ -80,6 +93,7 @@ memberlist_view_user_statistics_before * Locations: + styles/prosilver/template/memberlist_view.html + styles/subsilver2/template/memberlist_view.html +* Since: 3.1.0-a1 * Purpose: Add entries before the user statistics part of any user profile overall_footer_after @@ -87,11 +101,14 @@ overall_footer_after * Locations: + styles/prosilver/template/overall_footer.html + styles/subsilver2/template/overall_footer.html +* Since: 3.1.0-a1 * Purpose: Add content at the end of the file, directly prior to the `</body>` tag overall_footer_breadcrumb_append === -* Location: styles/prosilver/template/overall_footer.html +* Locations: + + styles/prosilver/template/overall_footer.html +* Since: 3.1.0-a1 * Purpose: Add links to the list of breadcrumbs in the footer overall_footer_copyright_append @@ -99,6 +116,7 @@ overall_footer_copyright_append * Locations: + styles/prosilver/template/overall_footer.html + styles/subsilver2/template/overall_footer.html +* Since: 3.1.0-a1 * Purpose: Add content after the copyright line (no new line by default), before the ACP link overall_footer_copyright_prepend @@ -106,6 +124,7 @@ overall_footer_copyright_prepend * Locations: + styles/prosilver/template/overall_footer.html + styles/subsilver2/template/overall_footer.html +* Since: 3.1.0-a1 * Purpose: Add content before the copyright line overall_header_breadcrumb_append @@ -113,6 +132,7 @@ overall_header_breadcrumb_append * Locations: + styles/prosilver/template/overall_header.html + styles/subsilver2/template/breadcrumbs.html +* Since: 3.1.0-a1 * Purpose: Add links to the list of breadcrumbs in the header overall_header_head_append @@ -120,16 +140,21 @@ overall_header_head_append * Locations: + styles/prosilver/template/overall_header.html + styles/subsilver2/template/overall_header.html +* Since: 3.1.0-a1 * Purpose: Add asset calls directly before the `</head>` tag overall_header_navigation_append === -* Location: styles/prosilver/template/overall_header.html +* Locations: + + styles/prosilver/template/overall_header.html +* Since: 3.1.0-a1 * Purpose: Add links after the navigation links in the header overall_header_navigation_prepend === -* Location: styles/prosilver/template/overall_header.html +* Locations: + + styles/prosilver/template/overall_header.html +* Since: 3.1.0-a1 * Purpose: Add links before the navigation links in the header posting_editor_options_prepend @@ -137,11 +162,14 @@ posting_editor_options_prepend * Locations: + styles/prosilver/template/posting_editor.html + styles/prosilver/template/posting_body.html +* Since: 3.1.0-a1 * Purpose: Add posting options on the posting screen simple_footer_after === -* Location: styles/prosilver/template/simple_footer.html +* Locations: + + styles/prosilver/template/simple_footer.html +* Since: 3.1.0-a1 * Purpose: Add content directly prior to the `</body>` tag of the simple footer topiclist_row_prepend @@ -151,6 +179,7 @@ topiclist_row_prepend + styles/prosilver/template/viewforum_body.html + styles/subsilver2/template/search_results.html + styles/subsilver2/template/viewforum_body.html +* Since: 3.1.0-a1 * Purpose: Add content into topic rows (inside the elements containing topic titles) topiclist_row_append @@ -160,23 +189,30 @@ topiclist_row_append + styles/prosilver/template/viewforum_body.html + styles/subsilver2/template/search_results.html + styles/subsilver2/template/viewforum_body.html +* Since: 3.1.0-a1 * Purpose: Add content into topic rows (inside the elements containing topic titles) ucp_pm_viewmessage_custom_fields_after === -* Location: styles/prosilver/template/ucp_pm_viewmessage.html +* Locations: + + styles/prosilver/template/ucp_pm_viewmessage.html +* Since: 3.1.0-a1 * Purpose: Add data after the custom fields on the user profile when viewing a private message ucp_pm_viewmessage_custom_fields_before === -* Location: styles/prosilver/template/ucp_pm_viewmessage.html +* Locations: + + styles/prosilver/template/ucp_pm_viewmessage.html +* Since: 3.1.0-a1 * Purpose: Add data before the custom fields on the user profile when viewing a private message ucp_pm_viewmessage_print_head_append === -* Location: styles/prosilver/template/ucp_pm_viewmessage_print.html +* Locations: + + styles/prosilver/template/ucp_pm_viewmessage_print.html +* Since: 3.1.0-a1 * Purpose: Add asset calls directly before the `</head>` tag of the Print PM screen ucp_prefs_personal_prepend @@ -184,6 +220,7 @@ ucp_prefs_personal_prepend * Locations: + styles/prosilver/template/ucp_prefs_personal.html + styles/subsilver2/template/ucp_prefs_personal.html +* Since: 3.1.0-a1 * Purpose: Add user options to the top of the Edit Global Settings block ucp_prefs_personal_append @@ -191,6 +228,7 @@ ucp_prefs_personal_append * Locations: + styles/prosilver/template/ucp_prefs_personal.html + styles/subsilver2/template/ucp_prefs_personal.html +* Since: 3.1.0-a1 * Purpose: Add user options to the bottom of the Edit Global Settings block ucp_prefs_post_prepend @@ -198,6 +236,7 @@ ucp_prefs_post_prepend * Locations: + styles/prosilver/template/ucp_prefs_post.html + styles/subsilver2/template/ucp_prefs_post.html +* Since: 3.1.0-a1 * Purpose: Add user options to the top of the Edit Posting Defaults block ucp_prefs_post_append @@ -205,6 +244,7 @@ ucp_prefs_post_append * Locations: + styles/prosilver/template/ucp_prefs_post.html + styles/subsilver2/template/ucp_prefs_post.html +* Since: 3.1.0-a1 * Purpose: Add user options to the bottom of the Edit Posting Defaults block ucp_prefs_view_radio_buttons_prepend @@ -212,6 +252,7 @@ ucp_prefs_view_radio_buttons_prepend * Locations: + styles/prosilver/template/ucp_prefs_view.html + styles/subsilver2/template/ucp_prefs_view.html +* Since: 3.1.0-a1 * Purpose: Add options to the top of the radio buttons block of the Edit Display Options screen @@ -220,6 +261,7 @@ ucp_prefs_view_radio_buttons_append * Locations: + styles/prosilver/template/ucp_prefs_view.html + styles/subsilver2/template/ucp_prefs_view.html +* Since: 3.1.0-a1 * Purpose: Add options to the bottom of the radio buttons block of the Edit Display Options screen @@ -228,6 +270,7 @@ ucp_prefs_view_select_menu_prepend * Locations: + styles/prosilver/template/ucp_prefs_view.html + styles/subsilver2/template/ucp_prefs_view.html +* Since: 3.1.0-a1 * Purpose: Add options to the top of the drop-down lists block of the Edit Display Options screen @@ -236,12 +279,15 @@ ucp_prefs_view_select_menu_append * Locations: + styles/prosilver/template/ucp_prefs_view.html + styles/subsilver2/template/ucp_prefs_view.html +* Since: 3.1.0-a1 * Purpose: Add options to the bottom of the drop-down lists block of the Edit Display Options screen viewtopic_print_head_append === -* Location: styles/prosilver/template/viewtopic_print.html +* Locations: + + styles/prosilver/template/viewtopic_print.html +* Since: 3.1.0-a1 * Purpose: Add asset calls directly before the `</head>` tag of the Print Topic screen viewtopic_body_footer_before @@ -249,6 +295,7 @@ viewtopic_body_footer_before * Locations: + styles/prosilver/template/viewtopic_body.html + styles/subsilver2/template/viewtopic_body.html +* Since: 3.1.0-a1 * Purpose: Add content to the bottom of the View topic screen below the posts and quick reply, directly before the jumpbox in Prosilver, breadcrumbs in Subsilver2. @@ -258,6 +305,7 @@ viewtopic_body_post_buttons_after * Locations: + styles/prosilver/template/viewtopic_body.html + styles/subsilver2/template/viewtopic_body.html +* Since: 3.1.0-a1 * Purpose: Add post button to posts (next to edit, quote etc), at the end of the list. @@ -266,6 +314,7 @@ viewtopic_body_post_buttons_before * Locations: + styles/prosilver/template/viewtopic_body.html + styles/subsilver2/template/viewtopic_body.html +* Since: 3.1.0-a1 * Purpose: Add post button to posts (next to edit, quote etc), at the start of the list. @@ -274,6 +323,7 @@ viewtopic_body_postrow_custom_fields_after * Locations: + styles/prosilver/template/viewtopic_body.html + styles/subsilver2/template/viewtopic_body.html +* Since: 3.1.0-a1 * Purpose: Add data after the custom fields on the user profile when viewing a post @@ -282,6 +332,7 @@ viewtopic_body_postrow_custom_fields_before * Locations: + styles/prosilver/template/viewtopic_body.html + styles/subsilver2/template/viewtopic_body.html +* Since: 3.1.0-a1 * Purpose: Add data before the custom fields on the user profile when viewing a post @@ -290,4 +341,5 @@ viewtopic_topic_title_prepend * Locations: + styles/prosilver/template/viewtopic_body.html + styles/subsilver2/template/viewtopic_body.html +* Since: 3.1.0-a1 * Purpose: Add content directly before the topic title link on the View topic screen diff --git a/phpBB/download/file.php b/phpBB/download/file.php index 04d68f6a48..7d39ee4821 100644 --- a/phpBB/download/file.php +++ b/phpBB/download/file.php @@ -181,7 +181,7 @@ else trigger_error('NO_ATTACHMENT_SELECTED'); } -$sql = 'SELECT attach_id, post_msg_id, topic_id, in_message, is_orphan, physical_filename, real_filename, extension, mimetype, filesize, filetime +$sql = 'SELECT attach_id, post_msg_id, topic_id, in_message, poster_id, is_orphan, physical_filename, real_filename, extension, mimetype, filesize, filetime FROM ' . ATTACHMENTS_TABLE . " WHERE $sql_where"; $result = $db->sql_query($sql); diff --git a/phpBB/includes/acp/acp_database.php b/phpBB/includes/acp/acp_database.php index fc08a5fb94..86879de816 100644 --- a/phpBB/includes/acp/acp_database.php +++ b/phpBB/includes/acp/acp_database.php @@ -94,29 +94,29 @@ class acp_database case 'mysqli': case 'mysql4': case 'mysql': - $extractor = new mysql_extractor($download, $store, $format, $filename, $time); + $extractor = new mysql_extractor($format, $filename, $time, $download, $store); break; case 'sqlite': - $extractor = new sqlite_extractor($download, $store, $format, $filename, $time); + $extractor = new sqlite_extractor($format, $filename, $time, $download, $store); break; case 'postgres': - $extractor = new postgres_extractor($download, $store, $format, $filename, $time); + $extractor = new postgres_extractor($format, $filename, $time, $download, $store); break; case 'oracle': - $extractor = new oracle_extractor($download, $store, $format, $filename, $time); + $extractor = new oracle_extractor($format, $filename, $time, $download, $store); break; case 'mssql': case 'mssql_odbc': case 'mssqlnative': - $extractor = new mssql_extractor($download, $store, $format, $filename, $time); + $extractor = new mssql_extractor($format, $filename, $time, $download, $store); break; case 'firebird': - $extractor = new firebird_extractor($download, $store, $format, $filename, $time); + $extractor = new firebird_extractor($format, $filename, $time, $download, $store); break; } @@ -488,7 +488,7 @@ class base_extractor var $format; var $run_comp = false; - function base_extractor($download = false, $store = false, $format, $filename, $time) + function base_extractor($format, $filename, $time, $download = false, $store = false) { global $request; diff --git a/phpBB/includes/acp/acp_forums.php b/phpBB/includes/acp/acp_forums.php index 258aabcc0d..029f4b23c9 100644 --- a/phpBB/includes/acp/acp_forums.php +++ b/phpBB/includes/acp/acp_forums.php @@ -1470,7 +1470,7 @@ class acp_forums /** * Event when we move content from one forum to another * - * @event core.acp_manage_forums_move_children + * @event core.acp_manage_forums_move_content * @var int from_id If of the current parent forum * @var int to_id If of the new parent forum * @var bool sync Shall we sync the "to"-forum's data diff --git a/phpBB/includes/acp/acp_styles.php b/phpBB/includes/acp/acp_styles.php index 094d84de40..d5492d85a3 100644 --- a/phpBB/includes/acp/acp_styles.php +++ b/phpBB/includes/acp/acp_styles.php @@ -888,7 +888,11 @@ class acp_styles protected function list_style(&$style, $level) { // Mark row as shown - if (!empty($style['_shown'])) return; + if (!empty($style['_shown'])) + { + return; + } + $style['_shown'] = true; // Generate template variables diff --git a/phpBB/includes/acp/auth.php b/phpBB/includes/acp/auth.php index f5f90fb5b8..a023bced0a 100644 --- a/phpBB/includes/acp/auth.php +++ b/phpBB/includes/acp/auth.php @@ -506,7 +506,7 @@ class auth_admin extends \phpbb\auth\auth 'FORUM_ID' => $forum_id) ); - $this->assign_cat_array($ug_array, $tpl_pmask . '.' . $tpl_fmask . '.' . $tpl_category, $tpl_mask, $ug_id, $forum_id, $show_trace, ($mode == 'view')); + $this->assign_cat_array($ug_array, $tpl_pmask . '.' . $tpl_fmask . '.' . $tpl_category, $tpl_mask, $ug_id, $forum_id, ($mode == 'view'), $show_trace); unset($content_array[$ug_id]); } @@ -593,7 +593,7 @@ class auth_admin extends \phpbb\auth\auth 'FORUM_ID' => $forum_id) ); - $this->assign_cat_array($forum_array, $tpl_pmask . '.' . $tpl_fmask . '.' . $tpl_category, $tpl_mask, $ug_id, $forum_id, $show_trace, ($mode == 'view')); + $this->assign_cat_array($forum_array, $tpl_pmask . '.' . $tpl_fmask . '.' . $tpl_category, $tpl_mask, $ug_id, $forum_id, ($mode == 'view'), $show_trace); } unset($hold_ary[$ug_id], $ug_names_ary[$ug_id]); @@ -1099,7 +1099,7 @@ class auth_admin extends \phpbb\auth\auth * Assign category to template * used by display_mask() */ - function assign_cat_array(&$category_array, $tpl_cat, $tpl_mask, $ug_id, $forum_id, $show_trace = false, $s_view) + function assign_cat_array(&$category_array, $tpl_cat, $tpl_mask, $ug_id, $forum_id, $s_view, $show_trace = false) { global $template, $user, $phpbb_admin_path, $phpEx, $phpbb_container; diff --git a/phpBB/includes/captcha/captcha_gd_wave.php b/phpBB/includes/captcha/captcha_gd_wave.php index e19f54f777..a61324d120 100644 --- a/phpBB/includes/captcha/captcha_gd_wave.php +++ b/phpBB/includes/captcha/captcha_gd_wave.php @@ -184,7 +184,7 @@ class captcha for ($x = 1; $x <= $full_x; ++$x) { - $cur_height = $this->wave_height($x, $y, $subdivision_factor) + $this->grid_height($x, $y, 1, $x_grid, $y_grid); + $cur_height = $this->wave_height($x, $y, $subdivision_factor) + $this->grid_height($x, $y, $x_grid, $y_grid, 1); // height is a z-factor, not a y-factor $offset = $cur_height - $prev_height; @@ -264,7 +264,7 @@ class captcha return ((sin($x / (3 * $factor)) + sin($y / (3 * $factor))) * 10 * $tweak); } - function grid_height($x, $y, $factor = 1, $x_grid, $y_grid) + function grid_height($x, $y, $x_grid, $y_grid, $factor = 1) { return ((!($x % ($x_grid * $factor)) || !($y % ($y_grid * $factor))) ? 3 : 0); } diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index ad5e3c05ce..510f46fcb4 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -5597,14 +5597,14 @@ function garbage_collection() global $cache, $db; global $phpbb_dispatcher; - /** - * Unload some objects, to free some memory, before we finish our task - * - * @event core.garbage_collection - * @since 3.1-A1 - */ if (!empty($phpbb_dispatcher)) { + /** + * Unload some objects, to free some memory, before we finish our task + * + * @event core.garbage_collection + * @since 3.1-A1 + */ $phpbb_dispatcher->dispatch('core.garbage_collection'); } diff --git a/phpBB/includes/functions_compress.php b/phpBB/includes/functions_compress.php index c79a31930e..39a1b2ad21 100644 --- a/phpBB/includes/functions_compress.php +++ b/phpBB/includes/functions_compress.php @@ -46,7 +46,7 @@ class compress if (is_file($phpbb_root_path . $src)) { - $this->data($src_path, file_get_contents("$phpbb_root_path$src"), false, stat("$phpbb_root_path$src")); + $this->data($src_path, file_get_contents("$phpbb_root_path$src"), stat("$phpbb_root_path$src"), false); } else if (is_dir($phpbb_root_path . $src)) { @@ -86,7 +86,7 @@ class compress continue; } - $this->data("$src_path$path$file", file_get_contents("$phpbb_root_path$src$path$file"), false, stat("$phpbb_root_path$src$path$file")); + $this->data("$src_path$path$file", file_get_contents("$phpbb_root_path$src$path$file"), stat("$phpbb_root_path$src$path$file"), false); } } } @@ -109,7 +109,7 @@ class compress return false; } - $this->data($filename, file_get_contents($src), false, stat($src)); + $this->data($filename, file_get_contents($src), stat($src), false); return true; } @@ -123,7 +123,7 @@ class compress $stat[4] = $stat[5] = 0; $stat[7] = strlen($src); $stat[9] = time(); - $this->data($name, $src, false, $stat); + $this->data($name, $src, $stat, false); return true; } @@ -395,7 +395,7 @@ class compress_zip extends compress /** * Create the structures ... note we assume version made by is MSDOS */ - function data($name, $data, $is_dir = false, $stat) + function data($name, $data, $stat, $is_dir = false) { $name = str_replace('\\', '/', $name); $name = $this->unique_filename($name); @@ -669,7 +669,7 @@ class compress_tar extends compress /** * Create the structures */ - function data($name, $data, $is_dir = false, $stat) + function data($name, $data, $stat, $is_dir = false) { $name = $this->unique_filename($name); $this->wrote = true; diff --git a/phpBB/includes/functions_messenger.php b/phpBB/includes/functions_messenger.php index 5b343e616e..6ceeb50330 100644 --- a/phpBB/includes/functions_messenger.php +++ b/phpBB/includes/functions_messenger.php @@ -1414,7 +1414,7 @@ class smtp_class $result = false; $stream_meta = stream_get_meta_data($this->socket); - if (socket_set_blocking($this->socket, 1)); + if (socket_set_blocking($this->socket, 1)) { $result = stream_socket_enable_crypto($this->socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); socket_set_blocking($this->socket, (int) $stream_meta['blocked']); diff --git a/phpBB/includes/functions_url_matcher.php b/phpBB/includes/functions_url_matcher.php index fdde302e3b..c5d6815119 100644 --- a/phpBB/includes/functions_url_matcher.php +++ b/phpBB/includes/functions_url_matcher.php @@ -32,7 +32,7 @@ function phpbb_get_url_matcher(\phpbb\extension\finder $finder, RequestContext $ { if (defined('DEBUG')) { - return phpbb_create_url_matcher($finder, $context); + return phpbb_create_url_matcher($finder, $context, $root_path); } if (!phpbb_url_matcher_dumped($root_path, $php_ext)) @@ -54,7 +54,7 @@ function phpbb_get_url_matcher(\phpbb\extension\finder $finder, RequestContext $ function phpbb_create_dumped_url_matcher(\phpbb\extension\finder $finder, $root_path, $php_ext) { $provider = new \phpbb\controller\provider(); - $routes = $provider->import_paths_from_finder($finder)->find(); + $routes = $provider->import_paths_from_finder($finder)->find($root_path); $dumper = new PhpMatcherDumper($routes); $cached_url_matcher_dump = $dumper->dump(array( 'class' => 'phpbb_url_matcher', @@ -70,10 +70,10 @@ function phpbb_create_dumped_url_matcher(\phpbb\extension\finder $finder, $root_ * @param RequestContext $context Symfony RequestContext object * @return UrlMatcher */ -function phpbb_create_url_matcher(\phpbb\extension\finder $finder, RequestContext $context) +function phpbb_create_url_matcher(\phpbb\extension\finder $finder, RequestContext $context, $root_path) { $provider = new \phpbb\controller\provider(); - $routes = $provider->import_paths_from_finder($finder)->find(); + $routes = $provider->import_paths_from_finder($finder)->find($root_path); return new UrlMatcher($routes, $context); } diff --git a/phpBB/includes/ucp/ucp_notifications.php b/phpBB/includes/ucp/ucp_notifications.php index 145963837c..dd62b69342 100644 --- a/phpBB/includes/ucp/ucp_notifications.php +++ b/phpBB/includes/ucp/ucp_notifications.php @@ -78,9 +78,9 @@ class ucp_notifications trigger_error($message); } - $this->output_notification_methods('notification_methods', $phpbb_notifications, $template, $user); + $this->output_notification_methods($phpbb_notifications, $template, $user, 'notification_methods'); - $this->output_notification_types($subscriptions, 'notification_types', $phpbb_notifications, $template, $user); + $this->output_notification_types($subscriptions, $phpbb_notifications, $template, $user, 'notification_types'); $this->tpl_name = 'ucp_notifications'; $this->page_title = 'UCP_NOTIFICATION_OPTIONS'; @@ -162,12 +162,12 @@ class ucp_notifications /** * Output all the notification types to the template * - * @param string $block * @param \phpbb\notification\manager $phpbb_notifications * @param \phpbb\template\template $template * @param \phpbb\user $user + * @param string $block */ - public function output_notification_types($subscriptions, $block = 'notification_types', \phpbb\notification\manager $phpbb_notifications, \phpbb\template\template $template, \phpbb\user $user) + public function output_notification_types($subscriptions, \phpbb\notification\manager $phpbb_notifications, \phpbb\template\template $template, \phpbb\user $user, $block = 'notification_types') { $notification_methods = $phpbb_notifications->get_subscription_methods(); @@ -209,12 +209,12 @@ class ucp_notifications /** * Output all the notification methods to the template * - * @param string $block * @param \phpbb\notification\manager $phpbb_notifications * @param \phpbb\template\template $template * @param \phpbb\user $user + * @param string $block */ - public function output_notification_methods($block = 'notification_methods', \phpbb\notification\manager $phpbb_notifications, \phpbb\template\template $template, \phpbb\user $user) + public function output_notification_methods(\phpbb\notification\manager $phpbb_notifications, \phpbb\template\template $template, \phpbb\user $user, $block = 'notification_methods') { $notification_methods = $phpbb_notifications->get_subscription_methods(); diff --git a/phpBB/includes/ucp/ucp_zebra.php b/phpBB/includes/ucp/ucp_zebra.php index 6bb3cdc145..090f9bf34c 100644 --- a/phpBB/includes/ucp/ucp_zebra.php +++ b/phpBB/includes/ucp/ucp_zebra.php @@ -64,7 +64,7 @@ class ucp_zebra * @var array user_ids User ids we remove * @since 3.1-A1 */ - $vars = array('user_ids'); + $vars = array('mode', 'user_ids'); extract($phpbb_dispatcher->trigger_event('core.ucp_remove_zebra', compact($vars))); $sql = 'DELETE FROM ' . ZEBRA_TABLE . ' diff --git a/phpBB/phpbb/auth/provider/ldap.php b/phpBB/phpbb/auth/provider/ldap.php index 9d29789567..2123a587cb 100644 --- a/phpBB/phpbb/auth/provider/ldap.php +++ b/phpBB/phpbb/auth/provider/ldap.php @@ -97,7 +97,6 @@ class ldap extends \phpbb\auth\provider\base @ldap_close($ldap); - if (!is_array($result) || sizeof($result) < 2) { return sprintf($this->user->lang['LDAP_NO_IDENTITY'], $this->user->data['username']); diff --git a/phpBB/phpbb/auth/provider/oauth/oauth.php b/phpBB/phpbb/auth/provider/oauth/oauth.php index de81ac0d04..5df56db00a 100644 --- a/phpBB/phpbb/auth/provider/oauth/oauth.php +++ b/phpBB/phpbb/auth/provider/oauth/oauth.php @@ -179,7 +179,7 @@ class oauth extends \phpbb\auth\provider\base $storage = new \phpbb\auth\provider\oauth\token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table); $query = 'mode=login&login=external&oauth_service=' . $service_name_original; - $service = $this->get_service($service_name_original, $storage, $service_credentials, $this->service_providers[$service_name]->get_auth_scope(), $query); + $service = $this->get_service($service_name_original, $storage, $service_credentials, $query, $this->service_providers[$service_name]->get_auth_scope()); if ($this->request->is_set('code', \phpbb\request\request_interface::GET)) { @@ -273,13 +273,13 @@ class oauth extends \phpbb\auth\provider\base * @param string $service_name The name of the service * @param \phpbb\auth\provider\oauth\token_storage $storage * @param array $service_credentials {@see \phpbb\auth\provider\oauth\oauth::get_service_credentials} - * @param array $scope The scope of the request against - * the api. * @param string $query The query string of the * current_uri used in redirection + * @param array $scope The scope of the request against + * the api. * @return \OAuth\Common\Service\ServiceInterface */ - protected function get_service($service_name, \phpbb\auth\provider\oauth\token_storage $storage, array $service_credentials, array $scopes = array(), $query) + protected function get_service($service_name, \phpbb\auth\provider\oauth\token_storage $storage, array $service_credentials, $query, array $scopes = array()) { $current_uri = $this->get_current_uri($service_name, $query); @@ -458,7 +458,7 @@ class oauth extends \phpbb\auth\provider\base // Prepare for an authentication request $service_credentials = $this->service_providers[$service_name]->get_service_credentials(); $scopes = $this->service_providers[$service_name]->get_auth_scope(); - $service = $this->get_service(strtolower($link_data['oauth_service']), $storage, $service_credentials, $scopes, $query); + $service = $this->get_service(strtolower($link_data['oauth_service']), $storage, $service_credentials, $query, $scopes); $this->service_providers[$service_name]->set_external_service_provider($service); // The user has already authenticated successfully, request to authenticate again @@ -491,7 +491,7 @@ class oauth extends \phpbb\auth\provider\base $query = 'i=ucp_auth_link&mode=auth_link&link=1&oauth_service=' . strtolower($link_data['oauth_service']); $service_credentials = $this->service_providers[$service_name]->get_service_credentials(); $scopes = $this->service_providers[$service_name]->get_auth_scope(); - $service = $this->get_service(strtolower($link_data['oauth_service']), $storage, $service_credentials, $scopes, $query); + $service = $this->get_service(strtolower($link_data['oauth_service']), $storage, $service_credentials, $query, $scopes); if ($this->request->is_set('code', \phpbb\request\request_interface::GET)) { diff --git a/phpBB/phpbb/auth/provider/oauth/token_storage.php b/phpBB/phpbb/auth/provider/oauth/token_storage.php index 2ce0e32da3..cc912abf6d 100644 --- a/phpBB/phpbb/auth/provider/oauth/token_storage.php +++ b/phpBB/phpbb/auth/provider/oauth/token_storage.php @@ -78,7 +78,7 @@ class token_storage implements TokenStorageInterface { $service = $this->get_service_name_for_db($service); - if ($this->cachedToken instanceOf TokenInterface) + if ($this->cachedToken instanceof TokenInterface) { return $this->cachedToken; } @@ -238,7 +238,7 @@ class token_storage implements TokenStorageInterface { $service = $this->get_service_name_for_db($service); - if ($this->cachedToken instanceOf TokenInterface) { + if ($this->cachedToken instanceof TokenInterface) { return $this->cachedToken; } diff --git a/phpBB/phpbb/avatar/driver/driver.php b/phpBB/phpbb/avatar/driver/driver.php index 0c54951cbd..206df86543 100644 --- a/phpBB/phpbb/avatar/driver/driver.php +++ b/phpBB/phpbb/avatar/driver/driver.php @@ -48,6 +48,12 @@ abstract class driver implements \phpbb\avatar\driver\driver_interface protected $php_ext; /** + * Path Helper + * @var \phpbb\path_helper + */ + protected $path_helper; + + /** * Cache driver * @var \phpbb\cache\driver\driver_interface */ @@ -75,13 +81,15 @@ abstract class driver implements \phpbb\avatar\driver\driver_interface * @param \phpbb\request\request $request Request object * @param string $phpbb_root_path Path to the phpBB root * @param string $php_ext PHP file extension + * @param \phpbb_path_helper $path_helper phpBB path helper * @param \phpbb\cache\driver\driver_interface $cache Cache driver */ - public function __construct(\phpbb\config\config $config, $phpbb_root_path, $php_ext, \phpbb\cache\driver\driver_interface $cache = null) + public function __construct(\phpbb\config\config $config, $phpbb_root_path, $php_ext, \phpbb\path_helper $path_helper, \phpbb\cache\driver\driver_interface $cache = null) { $this->config = $config; $this->phpbb_root_path = $phpbb_root_path; $this->php_ext = $php_ext; + $this->path_helper = $path_helper; $this->cache = $cache; } diff --git a/phpBB/phpbb/avatar/driver/local.php b/phpBB/phpbb/avatar/driver/local.php index d779099c46..0686ffe79a 100644 --- a/phpBB/phpbb/avatar/driver/local.php +++ b/phpBB/phpbb/avatar/driver/local.php @@ -29,7 +29,7 @@ class local extends \phpbb\avatar\driver\driver public function get_data($row) { return array( - 'src' => $this->phpbb_root_path . $this->config['avatar_gallery_path'] . '/' . $row['avatar'], + 'src' => $this->path_helper->get_web_root_path() . $this->config['avatar_gallery_path'] . '/' . $row['avatar'], 'width' => $row['avatar_width'], 'height' => $row['avatar_height'], ); diff --git a/phpBB/phpbb/avatar/driver/upload.php b/phpBB/phpbb/avatar/driver/upload.php index 377c9a0b04..bda872df7a 100644 --- a/phpBB/phpbb/avatar/driver/upload.php +++ b/phpBB/phpbb/avatar/driver/upload.php @@ -29,7 +29,7 @@ class upload extends \phpbb\avatar\driver\driver public function get_data($row, $ignore_config = false) { return array( - 'src' => $this->phpbb_root_path . 'download/file.' . $this->php_ext . '?avatar=' . $row['avatar'], + 'src' => $this->path_helper->get_web_root_path() . 'download/file.' . $this->php_ext . '?avatar=' . $row['avatar'], 'width' => $row['avatar_width'], 'height' => $row['avatar_height'], ); diff --git a/phpBB/phpbb/avatar/manager.php b/phpBB/phpbb/avatar/manager.php index c28380a401..7c26bce5ae 100644 --- a/phpBB/phpbb/avatar/manager.php +++ b/phpBB/phpbb/avatar/manager.php @@ -42,12 +42,6 @@ class manager protected $avatar_drivers; /** - * Service container object - * @var object - */ - protected $container; - - /** * Default avatar data row * @var array */ @@ -63,13 +57,27 @@ class manager * * @param \phpbb\config\config $config phpBB configuration * @param array $avatar_drivers Avatar drivers passed via the service container - * @param object $container Container object */ - public function __construct(\phpbb\config\config $config, $avatar_drivers, $container) + public function __construct(\phpbb\config\config $config, $avatar_drivers) { $this->config = $config; - $this->avatar_drivers = $avatar_drivers; - $this->container = $container; + $this->register_avatar_drivers($avatar_drivers); + } + + /** + * Register avatar drivers + * + * @param array $avatar_drivers Service collection of avatar drivers + */ + protected function register_avatar_drivers($avatar_drivers) + { + if (!empty($avatar_drivers)) + { + foreach ($avatar_drivers as $driver) + { + $this->avatar_drivers[$driver->get_name()] = $driver; + } + } } /** @@ -112,7 +120,7 @@ class manager * There is no need to handle invalid avatar types as the following code * will cause a ServiceNotFoundException if the type does not exist */ - $driver = $this->container->get($avatar_type); + $driver = $this->avatar_drivers[$avatar_type]; return $driver; } diff --git a/phpBB/phpbb/controller/provider.php b/phpBB/phpbb/controller/provider.php index 3aad08e3aa..048ca72084 100644 --- a/phpBB/phpbb/controller/provider.php +++ b/phpBB/phpbb/controller/provider.php @@ -31,17 +31,17 @@ class provider * YAML file(s) containing route information * @var array */ - protected $routing_paths; + protected $routing_files; /** * Construct method * - * @param array() $routing_paths Array of strings containing paths + * @param array() $routing_files Array of strings containing paths * to YAML files holding route information */ - public function __construct($routing_paths = array()) + public function __construct($routing_files = array()) { - $this->routing_paths = $routing_paths; + $this->routing_files = $routing_files; } /** @@ -54,12 +54,11 @@ class provider { // We hardcode the path to the core config directory // because the finder cannot find it - $this->routing_paths = array_merge(array('config'), array_map('dirname', array_keys($finder + $this->routing_files = array_merge(array('config/routing.yml'), array_keys($finder ->directory('config') - ->prefix('routing') - ->suffix('yml') + ->suffix('routing.yml') ->find() - ))); + )); return $this; } @@ -73,10 +72,10 @@ class provider public function find($base_path = '') { $routes = new RouteCollection; - foreach ($this->routing_paths as $path) + foreach ($this->routing_files as $file_path) { - $loader = new YamlFileLoader(new FileLocator($base_path . $path)); - $routes->addCollection($loader->load('routing.yml')); + $loader = new YamlFileLoader(new FileLocator($base_path)); + $routes->addCollection($loader->load($file_path)); } return $routes; diff --git a/phpBB/phpbb/db/driver/mssql.php b/phpBB/phpbb/db/driver/mssql.php index 50096deded..e1b41461e2 100644 --- a/phpBB/phpbb/db/driver/mssql.php +++ b/phpBB/phpbb/db/driver/mssql.php @@ -259,7 +259,7 @@ class mssql extends \phpbb\db\driver\driver { foreach ($row as $key => $value) { - $row[$key] = ($value === ' ' || $value === NULL) ? '' : $value; + $row[$key] = ($value === ' ' || $value === null) ? '' : $value; } } diff --git a/phpBB/phpbb/db/driver/mssqlnative.php b/phpBB/phpbb/db/driver/mssqlnative.php index aade311bcb..2eb625fb11 100644 --- a/phpBB/phpbb/db/driver/mssqlnative.php +++ b/phpBB/phpbb/db/driver/mssqlnative.php @@ -195,7 +195,7 @@ class result_mssqlnative */ class mssqlnative extends \phpbb\db\driver\mssql_base { - var $m_insert_id = NULL; + var $m_insert_id = null; var $last_query_text = ''; var $query_options = array(); var $connect_error = ''; @@ -427,7 +427,7 @@ class mssqlnative extends \phpbb\db\driver\mssql_base { foreach ($row as $key => $value) { - $row[$key] = ($value === ' ' || $value === NULL) ? '' : $value; + $row[$key] = ($value === ' ' || $value === null) ? '' : $value; } // remove helper values from LIMIT queries diff --git a/phpBB/phpbb/db/driver/mysqli.php b/phpBB/phpbb/db/driver/mysqli.php index 4d0e43b464..6144dba0c4 100644 --- a/phpBB/phpbb/db/driver/mysqli.php +++ b/phpBB/phpbb/db/driver/mysqli.php @@ -47,11 +47,11 @@ class mysqli extends \phpbb\db\driver\mysql_base $this->server = ($this->persistency) ? 'p:' . (($sqlserver) ? $sqlserver : 'localhost') : $sqlserver; $this->dbname = $database; - $port = (!$port) ? NULL : $port; + $port = (!$port) ? null : $port; // If port is set and it is not numeric, most likely mysqli socket is set. // Try to map it to the $socket parameter. - $socket = NULL; + $socket = null; if ($port) { if (is_numeric($port)) @@ -61,7 +61,7 @@ class mysqli extends \phpbb\db\driver\mysql_base else { $socket = $port; - $port = NULL; + $port = null; } } diff --git a/phpBB/phpbb/db/driver/postgres.php b/phpBB/phpbb/db/driver/postgres.php index 9cbb1ecb07..5cd6578d87 100644 --- a/phpBB/phpbb/db/driver/postgres.php +++ b/phpBB/phpbb/db/driver/postgres.php @@ -328,7 +328,7 @@ class postgres extends \phpbb\db\driver\driver return false; } - $temp_result = @pg_fetch_assoc($temp_q_id, NULL); + $temp_result = @pg_fetch_assoc($temp_q_id, null); @pg_free_result($query_id); return ($temp_result) ? $temp_result['last_value'] : false; @@ -456,7 +456,7 @@ class postgres extends \phpbb\db\driver\driver if ($result = @pg_query($this->db_connect_id, "EXPLAIN $explain_query")) { - while ($row = @pg_fetch_assoc($result, NULL)) + while ($row = @pg_fetch_assoc($result, null)) { $html_table = $this->sql_report('add_select_row', $query, $html_table, $row); } @@ -476,7 +476,7 @@ class postgres extends \phpbb\db\driver\driver $endtime = $endtime[0] + $endtime[1]; $result = @pg_query($this->db_connect_id, $query); - while ($void = @pg_fetch_assoc($result, NULL)) + while ($void = @pg_fetch_assoc($result, null)) { // Take the time spent on parsing rows into account } diff --git a/phpBB/phpbb/db/migration/data/v310/notifications.php b/phpBB/phpbb/db/migration/data/v310/notifications.php index 10f1392094..61be25bb5f 100644 --- a/phpBB/phpbb/db/migration/data/v310/notifications.php +++ b/phpBB/phpbb/db/migration/data/v310/notifications.php @@ -34,7 +34,7 @@ class notifications extends \phpbb\db\migration\migration ), $this->table_prefix . 'notifications' => array( 'COLUMNS' => array( - 'notification_id' => array('UINT', NULL, 'auto_increment'), + 'notification_id' => array('UINT', null, 'auto_increment'), 'item_type' => array('VCHAR:255', ''), 'item_id' => array('UINT', 0), 'item_parent_id' => array('UINT', 0), diff --git a/phpBB/phpbb/db/migration/data/v310/notifications_schema_fix.php b/phpBB/phpbb/db/migration/data/v310/notifications_schema_fix.php index 8ed626d8a6..eb2eb361ee 100644 --- a/phpBB/phpbb/db/migration/data/v310/notifications_schema_fix.php +++ b/phpBB/phpbb/db/migration/data/v310/notifications_schema_fix.php @@ -26,7 +26,7 @@ class notifications_schema_fix extends \phpbb\db\migration\migration 'add_tables' => array( $this->table_prefix . 'notification_types' => array( 'COLUMNS' => array( - 'notification_type_id' => array('USINT', NULL, 'auto_increment'), + 'notification_type_id' => array('USINT', null, 'auto_increment'), 'notification_type_name' => array('VCHAR:255', ''), 'notification_type_enabled' => array('BOOL', 1), ), @@ -37,7 +37,7 @@ class notifications_schema_fix extends \phpbb\db\migration\migration ), $this->table_prefix . 'notifications' => array( 'COLUMNS' => array( - 'notification_id' => array('UINT:10', NULL, 'auto_increment'), + 'notification_id' => array('UINT:10', null, 'auto_increment'), 'notification_type_id' => array('USINT', 0), 'item_id' => array('UINT', 0), 'item_parent_id' => array('UINT', 0), @@ -73,7 +73,7 @@ class notifications_schema_fix extends \phpbb\db\migration\migration ), $this->table_prefix . 'notifications' => array( 'COLUMNS' => array( - 'notification_id' => array('UINT', NULL, 'auto_increment'), + 'notification_id' => array('UINT', null, 'auto_increment'), 'item_type' => array('VCHAR:255', ''), 'item_id' => array('UINT', 0), 'item_parent_id' => array('UINT', 0), diff --git a/phpBB/phpbb/db/migration/data/v310/style_update_p2.php b/phpBB/phpbb/db/migration/data/v310/style_update_p2.php index 202a8409fb..c5b45d9dc9 100644 --- a/phpBB/phpbb/db/migration/data/v310/style_update_p2.php +++ b/phpBB/phpbb/db/migration/data/v310/style_update_p2.php @@ -56,7 +56,7 @@ class style_update_p2 extends \phpbb\db\migration\migration 'add_tables' => array( $this->table_prefix . 'styles_imageset' => array( 'COLUMNS' => array( - 'imageset_id' => array('UINT', NULL, 'auto_increment'), + 'imageset_id' => array('UINT', null, 'auto_increment'), 'imageset_name' => array('VCHAR_UNI:255', ''), 'imageset_copyright' => array('VCHAR_UNI', ''), 'imageset_path' => array('VCHAR:100', ''), @@ -68,7 +68,7 @@ class style_update_p2 extends \phpbb\db\migration\migration ), $this->table_prefix . 'styles_imageset_data' => array( 'COLUMNS' => array( - 'image_id' => array('UINT', NULL, 'auto_increment'), + 'image_id' => array('UINT', null, 'auto_increment'), 'image_name' => array('VCHAR:200', ''), 'image_filename' => array('VCHAR:200', ''), 'image_lang' => array('VCHAR:30', ''), @@ -83,7 +83,7 @@ class style_update_p2 extends \phpbb\db\migration\migration ), $this->table_prefix . 'styles_template' => array( 'COLUMNS' => array( - 'template_id' => array('UINT', NULL, 'auto_increment'), + 'template_id' => array('UINT', null, 'auto_increment'), 'template_name' => array('VCHAR_UNI:255', ''), 'template_copyright' => array('VCHAR_UNI', ''), 'template_path' => array('VCHAR:100', ''), @@ -112,7 +112,7 @@ class style_update_p2 extends \phpbb\db\migration\migration ), $this->table_prefix . 'styles_theme' => array( 'COLUMNS' => array( - 'theme_id' => array('UINT', NULL, 'auto_increment'), + 'theme_id' => array('UINT', null, 'auto_increment'), 'theme_name' => array('VCHAR_UNI:255', ''), 'theme_copyright' => array('VCHAR_UNI', ''), 'theme_path' => array('VCHAR:100', ''), diff --git a/phpBB/phpbb/db/migration/data/v310/teampage.php b/phpBB/phpbb/db/migration/data/v310/teampage.php index 80cc4be1c0..172435c672 100644 --- a/phpBB/phpbb/db/migration/data/v310/teampage.php +++ b/phpBB/phpbb/db/migration/data/v310/teampage.php @@ -27,7 +27,7 @@ class teampage extends \phpbb\db\migration\migration 'add_tables' => array( $this->table_prefix . 'teampage' => array( 'COLUMNS' => array( - 'teampage_id' => array('UINT', NULL, 'auto_increment'), + 'teampage_id' => array('UINT', null, 'auto_increment'), 'group_id' => array('UINT', 0), 'teampage_name' => array('VCHAR_UNI:255', ''), 'teampage_position' => array('UINT', 0), diff --git a/phpBB/phpbb/db/tools.php b/phpBB/phpbb/db/tools.php index 1f156fbb04..d9bd8cf568 100644 --- a/phpBB/phpbb/db/tools.php +++ b/phpBB/phpbb/db/tools.php @@ -33,7 +33,7 @@ class tools /** * @var object DB object */ - var $db = NULL; + var $db = null; /** * The Column types for every database we support diff --git a/phpBB/phpbb/event/kernel_exception_subscriber.php b/phpBB/phpbb/event/kernel_exception_subscriber.php index 09103680e8..7003e73b38 100644 --- a/phpBB/phpbb/event/kernel_exception_subscriber.php +++ b/phpBB/phpbb/event/kernel_exception_subscriber.php @@ -72,7 +72,6 @@ class kernel_exception_subscriber implements EventSubscriberInterface page_footer(true, false, false); - $status_code = $exception instanceof HttpException ? $exception->getStatusCode() : 500; $response = new Response($this->template->assign_display('body'), $status_code); $event->setResponse($response); diff --git a/phpBB/phpbb/extension/manager.php b/phpBB/phpbb/extension/manager.php index ce6d7e05c8..f8beb963ba 100644 --- a/phpBB/phpbb/extension/manager.php +++ b/phpBB/phpbb/extension/manager.php @@ -234,7 +234,9 @@ class manager */ public function enable($name) { + // @codingStandardsIgnoreStart while ($this->enable_step($name)); + // @codingStandardsIgnoreEnd } /** @@ -311,7 +313,9 @@ class manager */ public function disable($name) { + // @codingStandardsIgnoreStart while ($this->disable_step($name)); + // @codingStandardsIgnoreEnd } /** @@ -388,7 +392,9 @@ class manager */ public function purge($name) { + // @codingStandardsIgnoreStart while ($this->purge_step($name)); + // @codingStandardsIgnoreEnd } /** diff --git a/phpBB/phpbb/extension/metadata_manager.php b/phpBB/phpbb/extension/metadata_manager.php index 19c6288e96..ff5d55c7f2 100644 --- a/phpBB/phpbb/extension/metadata_manager.php +++ b/phpBB/phpbb/extension/metadata_manager.php @@ -169,7 +169,7 @@ class metadata_manager throw new \phpbb\extension\exception('file_get_contents failed on ' . $this->metadata_file); } - if (($metadata = json_decode($file_contents, true)) === NULL) + if (($metadata = json_decode($file_contents, true)) === null) { throw new \phpbb\extension\exception('json_decode failed on ' . $this->metadata_file); } diff --git a/phpBB/phpbb/feed/base.php b/phpBB/phpbb/feed/base.php index de7dd41df4..8245b849a1 100644 --- a/phpBB/phpbb/feed/base.php +++ b/phpBB/phpbb/feed/base.php @@ -150,7 +150,7 @@ abstract class base */ function get($key) { - return (isset($this->keys[$key])) ? $this->keys[$key] : NULL; + return (isset($this->keys[$key])) ? $this->keys[$key] : null; } function get_readable_forums() diff --git a/phpBB/phpbb/notification/type/approve_topic.php b/phpBB/phpbb/notification/type/approve_topic.php index ca5bb67754..9f061b8be1 100644 --- a/phpBB/phpbb/notification/type/approve_topic.php +++ b/phpBB/phpbb/notification/type/approve_topic.php @@ -34,7 +34,7 @@ class approve_topic extends \phpbb\notification\type\topic { return 'approve_topic'; } - + /** * Language key used to output the text * diff --git a/phpBB/phpbb/search/fulltext_native.php b/phpBB/phpbb/search/fulltext_native.php index 33326f2882..024b8f441b 100644 --- a/phpBB/phpbb/search/fulltext_native.php +++ b/phpBB/phpbb/search/fulltext_native.php @@ -850,7 +850,6 @@ class fulltext_native extends \phpbb\search\base } $this->db->sql_freeresult($result); - // if we use mysql and the total result count is not cached yet, retrieve it from the db if (!$total_results && $is_mysql) { diff --git a/phpBB/phpbb/session.php b/phpBB/phpbb/session.php index 5e4380bfc8..214ab8fd33 100644 --- a/phpBB/phpbb/session.php +++ b/phpBB/phpbb/session.php @@ -1235,7 +1235,6 @@ class session $this->session_create(ANONYMOUS); } - // Determine which message to output $till_date = ($ban_row['ban_end']) ? $this->format_date($ban_row['ban_end']) : ''; $message = ($ban_row['ban_end']) ? 'BOARD_BAN_TIME' : 'BOARD_BAN_PERM'; diff --git a/phpBB/phpbb/template/context.php b/phpBB/phpbb/template/context.php index 24234c1e4a..decd1c7956 100644 --- a/phpBB/phpbb/template/context.php +++ b/phpBB/phpbb/template/context.php @@ -285,7 +285,7 @@ class context // Search array to get correct position list($search_key, $search_value) = @each($key); - $key = NULL; + $key = null; foreach ($block as $i => $val_ary) { if ($val_ary[$search_key] === $search_value) @@ -296,7 +296,7 @@ class context } // key/value pair not found - if ($key === NULL) + if ($key === null) { return false; } diff --git a/phpBB/phpbb/template/twig/node/includephp.php b/phpBB/phpbb/template/twig/node/includephp.php index 4024cf0cc8..70dcf85d62 100644 --- a/phpBB/phpbb/template/twig/node/includephp.php +++ b/phpBB/phpbb/template/twig/node/includephp.php @@ -23,7 +23,7 @@ class includephp extends \Twig_Node /** @var Twig_Environment */ protected $environment; - public function __construct(\Twig_Node_Expression $expr, \phpbb\template\twig\environment $environment, $ignoreMissing = false, $lineno, $tag = null) + public function __construct(\Twig_Node_Expression $expr, \phpbb\template\twig\environment $environment, $lineno, $ignoreMissing = false, $tag = null) { $this->environment = $environment; diff --git a/phpBB/phpbb/template/twig/tokenparser/includephp.php b/phpBB/phpbb/template/twig/tokenparser/includephp.php index d906837590..25170e7214 100644 --- a/phpBB/phpbb/template/twig/tokenparser/includephp.php +++ b/phpBB/phpbb/template/twig/tokenparser/includephp.php @@ -43,7 +43,7 @@ class includephp extends \Twig_TokenParser $stream->expect(\Twig_Token::BLOCK_END_TYPE); - return new \phpbb\template\twig\node\includephp($expr, $this->parser->getEnvironment(), $ignoreMissing, $token->getLine(), $this->getTag()); + return new \phpbb\template\twig\node\includephp($expr, $this->parser->getEnvironment(), $token->getLine(), $ignoreMissing, $this->getTag()); } /** diff --git a/phpBB/phpbb/user.php b/phpBB/phpbb/user.php index f97cc94d40..d82acbf501 100644 --- a/phpBB/phpbb/user.php +++ b/phpBB/phpbb/user.php @@ -343,7 +343,6 @@ class user extends \phpbb\session } } - // Does the user need to change their password? If so, redirect to the // ucp profile reg_details page ... of course do not redirect if we're already in the ucp if (!defined('IN_ADMIN') && !defined('ADMIN_START') && $config['chg_passforce'] && !empty($this->data['is_registered']) && $auth->acl_get('u_chgpasswd') && $this->data['user_passchg'] < time() - ($config['chg_passforce'] * 86400)) diff --git a/phpBB/posting.php b/phpBB/posting.php index 396b320eac..e29b74af65 100644 --- a/phpBB/posting.php +++ b/phpBB/posting.php @@ -1525,7 +1525,7 @@ $template->assign_vars(array( * @event core.posting_modify_template_vars * @since 3.1-A1 */ -$phpbb_dispatcher->trigger_event('core.posting_modify_template_vars'); +$phpbb_dispatcher->dispatch('core.posting_modify_template_vars'); // Build custom bbcodes array display_custom_bbcodes(); diff --git a/phpBB/styles/prosilver/template/drafts.html b/phpBB/styles/prosilver/template/drafts.html index b6e6a7f5b7..4b2e1bf0c6 100644 --- a/phpBB/styles/prosilver/template/drafts.html +++ b/phpBB/styles/prosilver/template/drafts.html @@ -13,26 +13,31 @@ <div class="<!-- IF not S_PRIVMSGS -->forumbg<!-- ELSE -->panel<!-- ENDIF -->"> <div class="inner"> - <ul class="topiclist"> + <ul class="topiclist two-long-columns"> <li class="header"> <dl> <dt>{L_LOAD_DRAFT}</dt> - <dd class="posted">{L_SAVE_DATE}</dd> + <dd class="info">{L_SAVE_DATE}</dd> </dl> </li> </ul> - <ul class="topiclist<!-- IF not S_PRIVMSGS --> topics<!-- ELSE --> cplist<!-- ENDIF -->"> + <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> - <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="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="posted">{draftrow.DATE}</dd> + <dd class="info"><span>{draftrow.DATE}</span></dd> </dl> </li> <!-- END draftrow --> diff --git a/phpBB/styles/prosilver/template/forum_fn.js b/phpBB/styles/prosilver/template/forum_fn.js index a2758de9dc..1b2b1954ef 100644 --- a/phpBB/styles/prosilver/template/forum_fn.js +++ b/phpBB/styles/prosilver/template/forum_fn.js @@ -410,424 +410,560 @@ function insert_single_user(formId, user) } /** -* Run onload functions +* Parse document block */ -(function($) { - $(document).ready(function() { - // Swap .nojs and .hasjs - $('#phpbb.nojs').toggleClass('nojs hasjs'); - - // Focus forms - $('form[data-focus]:first').each(function() { - $('#' + this.getAttribute('data-focus')).focus(); - }); +function parse_document(container) +{ + var test = document.createElement('div'), + oldBrowser = (typeof test.style.borderRadius == 'undefined'); - // Reset avatar dimensions when changing URL or EMAIL - $('input[data-reset-on-edit]').bind('keyup', function() { - $(this.getAttribute('data-reset-on-edit')).val(''); - }); + delete test; - // Pagination - $('a.pagination-trigger').click(function() { - jumpto($(this)); - }); + /** + * Reset avatar dimensions when changing URL or EMAIL + */ + container.find('input[data-reset-on-edit]').bind('keyup', function() { + $(this.getAttribute('data-reset-on-edit')).val(''); + }); - // Adjust HTML code for IE8 and older versions - var test = document.createElement('div'), - oldBrowser = (typeof test.style.borderRadius == 'undefined'); - delete test; + /** + * Pagination + */ + container.find('a.pagination-trigger').click(function() { + jumpto($(this)); + }); - if (oldBrowser) { - // Fix .linklist.bulletin lists - $('ul.linklist.bulletin li:first-child, ul.linklist.bulletin li.rightside:last-child').addClass('no-bulletin'); + /** + * Adjust HTML code for IE8 and older versions + */ + if (oldBrowser) { + // Fix .linklist.bulletin lists + container.find('ul.linklist.bulletin li:first-child, ul.linklist.bulletin li.rightside:last-child').addClass('no-bulletin'); - // Do not run functions below for old browsers - return; - } + // Do not run functions below for old browsers + return; + } - // Adjust topiclist lists with check boxes - $('ul.topiclist dd.mark').siblings('dt').children('.list-inner').addClass('with-mark'); + /** + * Resize navigation 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'); - // Resize navigation block to keep all links on same line - $('.navlinks').each(function() { - var $this = $(this), - left = $this.children().not('.rightside'), - right = $this.children('.rightside'); + if (left.length !== 1 || !right.length) return; - if (left.length !== 1 || !right.length) return; + function resize() { + var width = 0, + diff = left.outerWidth(true) - left.width(); - function resize() { - var width = 0, - diff = left.outerWidth(true) - left.width(); + right.each(function() { + width += $(this).outerWidth(true); + }); + left.css('max-width', Math.floor($this.width() - width - diff) + 'px'); + } - right.each(function() { - width += $(this).outerWidth(true); - }); - left.css('max-width', Math.floor($this.width() - width - diff) + 'px'); - } + resize(); + $(window).resize(resize); + }); - resize(); - $(window).resize(resize); + /** + * Makes breadcrumbs responsive + */ + container.find('.breadcrumbs:not([data-skip-responsive])').each(function() { + var $this = $(this), + $body = $('body'), + 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()); }); - // Responsive breadcrumbs - $('.breadcrumbs:not(.skip-responsive, .linklist.leftside .breadcrumbs)').each(function() { - var $this = $(this), - $body = $('body'), - links = $this.find('.crumb'), - length = links.length, - classes = ['wrapped-wide', 'wrapped-medium', 'wrapped-small'], - classesLength = classes.length, - maxHeight = 0, - lastWidth = false, - wrapped = false; - - // Test height by setting nowrap - $this.css('white-space', 'nowrap'); - maxHeight = $this.height() + 1; - $this.css('white-space', ''); + // Funciton that checks breadcrumbs + function check() { + var height = $this.height(), + width = $body.width(), + link, i, j; - // Set tooltips - $this.find('a').each(function() { - var $link = $(this); - $link.attr('title', $link.text()); + maxHeight = parseInt($this.css('line-height')) | 0; + links.each(function() { + if ($(this).height() > 0) { + maxHeight = Math.max(maxHeight, $(this).outerHeight(true)); + } }); - // Funciton that checks breadcrumbs - function check() { - var height = $this.height(), - width = $body.width(), - link, i, j; + if (height <= maxHeight) { + if (!wrapped || lastWidth === false || lastWidth >= width) { + lastWidth = width; + return; + } + } + lastWidth = width; - if (height <= maxHeight) { - if (!wrapped || lastWidth === false || lastWidth >= width) { - lastWidth = width; - return; - } + if (wrapped) { + $this.removeClass('wrapped').find('.crumb.wrapped').removeClass('wrapped ' + classes.join(' ')); + wrapped = false; + if ($this.height() <= maxHeight) { + return; } - lastWidth = width; + } - if (wrapped) { - $this.removeClass('wrapped').find('.crumb.wrapped').removeClass('wrapped ' + classes.join(' ')); - wrapped = false; + wrapped = true; + $this.addClass('wrapped'); + if ($this.height() <= maxHeight) { + return; + } + + for (i = 0; i < classesLength; i ++) { + for (j = length - 1; j >= 0; j --) { + links.eq(j).addClass('wrapped ' + classes[i]); if ($this.height() <= maxHeight) { return; } } + } + } - wrapped = true; - $this.addClass('wrapped'); - if ($this.height() <= maxHeight) { - return; - } + // Run function and set event + check(); + $(window).resize(check); + }); - for (i = 0; i < classesLength; i ++) { - for (j = length - 1; j >= 0; j --) { - links.eq(j).addClass('wrapped ' + classes[i]); - if ($this.height() <= maxHeight) { - 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 = (block.text().trim().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(); } - // Run function and set event - check(); - $(window).resize(check); - }); + block.append((first ? '' : '<br />') + html); - // Responsive tables - $('table.table1').not('.not-responsive').each(function() { - var $this = $(this), - th = $this.find('thead > tr > th'), - columns = th.length, - headers = [], - totalHeaders = 0, - i, headersLength; - - // Find each header - th.each(function() { - var cell = $(this), - colspan = parseInt(cell.attr('colspan')), - dfn = cell.attr('data-dfn'), - text = dfn ? dfn : cell.text(); + first = false; + }); + }); - colspan = isNaN(colspan) || colspan < 1 ? 1 : colspan; + /** + * 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 ++; + }); - for (i=0; i<colspan; i++) { - headers.push(text); - } - totalHeaders ++; - }); - - headersLength = headers.length; + if (!headersLength) { + return; + } - // Add header text to each cell as <dfn> - $this.addClass('responsive'); + // Parse each row + list.find('dl').each(function() { + var $this = $(this), + block = $this.find('dt .responsive-show:last-child'), + first = true; - if (totalHeaders < 2) { - $this.addClass('show-header'); - return; + // 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 = (block.text().trim().length == 0); } - $this.find('tbody > tr').each(function() { - var row = $(this), - cells = row.children('td'), - column = 0; + // Copy contents of each column + $this.find('dd').not('.mark').each(function(i) { + var column = $(this), + children = column.children(), + html = column.html(); - if (cells.length == 1) { - row.addClass('big-column'); - return; + if (children.length == 1 && children.text() == column.text()) { + html = children.html(); } - cells.each(function() { - var cell = $(this), - colspan = parseInt(cell.attr('colspan')), - text = cell.text().trim(); - - if (headersLength <= column) { - return; - } + // Prepend contents of matching header before contents of column + if (i < headersLength) { + html = headers[i] + ': <strong>' + html + '</strong>'; + } - if (text.length && text !== '-') { - cell.prepend('<dfn style="display: none;">' + headers[column] + '</dfn>'); - } - else { - cell.addClass('empty'); - } + block.append((first ? '' : '<br />') + html); - colspan = isNaN(colspan) || colspan < 1 ? 1 : colspan; - column += colspan; - }); + first = false; }); }); + }); - // Responsive link lists - $('.linklist:not(.navlinks, .skip-responsive), .postbody ul.profile-icons:not(.skip-responsive)').each(function() { - var $this = $(this), - $body = $('body'), - links = $this.children().not('.skip-responsive'), - html = '<li class="responsive-menu" style="display:none;"><a href="javascript:void(0);" class="responsive-menu-link"> </a><ul class="responsive-popup" style="display:none;" /></li>', - // List of items that should be hidden last - filterString = '.pagination, .icon-notifications, .icon-pm, .icon-logout, .icon-login, .mark-read, .breadcrumbs, .edit-icon, .quote-icon', - filtered = links.filter(filterString); - - if (links.is('.rightside')) - { - links.filter('.rightside:first').before(html); + /** + * Responsive tables + */ + container.find('table.table1').not('.not-responsive').each(function() { + var $this = $(this), + th = $this.find('thead > tr > th'), + columns = th.length, + headers = [], + totalHeaders = 0, + i, headersLength; + + // Find each header + th.each(function(column) { + var cell = $(this), + colspan = parseInt(cell.attr('colspan')), + 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); } - else - { - $this.append(html); + totalHeaders ++; + + if (dfn && !column) { + $this.addClass('show-header'); } + }); + + headersLength = headers.length; - var toggle = $this.children('.responsive-menu'), - toggleLink = toggle.find('a.responsive-menu-link'), - menu = toggle.find('ul.responsive-popup'), - lastWidth = false, - compact = false, - responsive = false, - copied = false; - - function check() { - var width = $body.width(); - if (responsive && width <= lastWidth) { - return; - } + // Add header text to each cell as <dfn> + $this.addClass('responsive'); - // Reset responsive and compact layout - if (responsive) { - responsive = false; - $this.removeClass('responsive'); - links.css('display', ''); - toggle.css('display', 'none'); - } + if (totalHeaders < 2) { + $this.addClass('show-header'); + return; + } - if (compact) { - compact = false; - $this.removeClass('compact'); - } + $this.find('tbody > tr').each(function() { + var row = $(this), + cells = row.children('td'), + column = 0; - // Find tallest element - var maxHeight = 0; - links.each(function() { - if (!$(this).height()) return; - maxHeight = Math.max(maxHeight, $(this).outerHeight(true)); - }); + if (cells.length == 1) { + row.addClass('big-column'); + return; + } + + cells.each(function() { + var cell = $(this), + colspan = parseInt(cell.attr('colspan')), + text = cell.text().trim(); - if (maxHeight < 1) { + if (headersLength <= column) { return; } - // Nothing to resize if block's height is not bigger than tallest element's height - if ($this.height() <= maxHeight) { - toggle.removeClass('visible'); - menu.hide(); - return; + if ((text.length && text !== '-') || cell.children().length) { + cell.prepend('<dfn style="display: none;">' + headers[column] + '</dfn>'); + } + else { + cell.addClass('empty'); } - // Enable compact layout, find tallest element, compare to height of whole block - compact = true; - $this.addClass('compact'); + colspan = isNaN(colspan) || colspan < 1 ? 1 : colspan; + column += colspan; + }); + }); + }); - var compactMaxHeight = 0; - links.each(function() { - if (!$(this).height()) return; - compactMaxHeight = Math.max(compactMaxHeight, $(this).outerHeight(true)); - }); + /** + * Hide empty responsive tables + */ + container.find('table.responsive > tbody').each(function() { + var items = $(this).children('tr'); + if (items.length == 0) + { + $(this).parent('table:first').addClass('responsive-hide'); + } + }); - if ($this.height() <= maxHeight) { - toggle.removeClass('visible'); - menu.hide(); - return; - } + /** + * Responsive link lists + */ + container.find('.linklist:not(.navlinks, [data-skip-responsive]), .postbody ul.profile-icons:not([data-skip-responsive])').each(function() { + var $this = $(this), + $body = $('body'), + filterSkip = '.breadcrumbs, [data-skip-responsive]', + filterLast = '.pagination, .icon-notifications, .icon-pm, .icon-logout, .icon-login, .mark-read, .edit-icon, .quote-icon', + allLinks = $this.children(), + links = allLinks.not(filterSkip), + html = '<li class="responsive-menu" style="display:none;"><a href="javascript:void(0);" class="responsive-menu-link"> </a><div class="dropdown" style="display:none;"><div class="pointer"><div class="pointer-inner" /></div><ul class="dropdown-contents" /></div></li>', + filterLastList = links.filter(filterLast); + + if (links.is('.rightside')) + { + links.filter('.rightside:first').before(html); + } + else + { + $this.append(html); + } - // Compact layout did not resize block enough, switch to responsive layout + var item = $this.children('.responsive-menu'), + menu = item.find('.dropdown-contents'), + lastWidth = false, + compact = false, + responsive = false, + copied = false; + + function check() { + var width = $body.width(); + if (responsive && width <= lastWidth) { + return; + } + + // Reset responsive and compact layout + if (responsive) { + responsive = false; + $this.removeClass('responsive'); + links.css('display', ''); + item.css('display', 'none'); + } + + if (compact) { compact = false; $this.removeClass('compact'); - responsive = true; + } - if (!copied) { - if (menu.parents().is('.rightside')) { - menu.addClass('responsive-rightside'); - } - menu.append(links.clone(true)); - menu.find('li.leftside, li.rightside').removeClass('leftside rightside'); - menu.find('.inputbox').parents('li:first').css('white-space', 'normal'); - copied = true; - } - else { - menu.children().css('display', ''); - } + // Find tallest element + var maxHeight = 0; + allLinks.each(function() { + if (!$(this).height()) return; + maxHeight = Math.max(maxHeight, $(this).outerHeight(true)); + }); - toggle.css('display', ''); - $this.addClass('responsive'); + if (maxHeight < 1) { + return; + } - // Try to not hide filtered items - if (filtered.length) { - links.not(filterString).css('display', 'none'); + // Nothing to resize if block's height is not bigger than tallest element's height + if ($this.height() <= maxHeight) { + return; + } - maxHeight = 0; - filtered.each(function() { - if (!$(this).height()) return; - maxHeight = Math.max(maxHeight, $(this).outerHeight(true)); - }); + // Enable compact layout, find tallest element, compare to height of whole block + compact = true; + $this.addClass('compact'); - if ($this.height() <= maxHeight) { - menu.children().filter(filterString).css('display', 'none'); - return; - } - } + var compactMaxHeight = 0; + allLinks.each(function() { + if (!$(this).height()) return; + compactMaxHeight = Math.max(compactMaxHeight, $(this).outerHeight(true)); + }); - links.css('display', 'none'); + if ($this.height() <= maxHeight) { + return; } - toggleLink.click(function() { - if (!responsive) return; - if (!toggle.hasClass('visible')) { - // Hide other popups - $('.responsive-menu.visible').removeClass('visible').find('.responsive-popup').hide(); - } - toggle.toggleClass('visible'); - menu.toggle(); - }); + // Compact layout did not resize block enough, switch to responsive layout + compact = false; + $this.removeClass('compact'); + responsive = true; - check(); - $(window).resize(check); - }); + if (!copied) { + var clone = links.clone(true); + clone.filter('.rightside').each(function() { + menu.prepend(this); + }); + menu.prepend(clone.not('.rightside')); + menu.find('li.leftside, li.rightside').removeClass('leftside rightside'); + menu.find('.inputbox').parents('li:first').css('white-space', 'normal'); + copied = true; + } + else { + menu.children().css('display', ''); + } - // Responsive tabs - $('#tabs, #minitabs').not('.skip-responsive').each(function() { - var $this = $(this), - $body = $('body'), - ul = $this.children(), - tabs = ul.children().not('.skip-responsive'), - links = tabs.children('a'), - toggle = ul.append('<li class="responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link"><span> </span></a><ul class="responsive-tabs" style="display:none;" /></li>').find('li.responsive-tab'), - toggleLink = toggle.find('a.responsive-tab-link'), - menu = toggle.find('ul.responsive-tabs'), - maxHeight = 0, - lastWidth = false, - responsive = false; + item.css('display', ''); + $this.addClass('responsive'); - links.each(function() { - maxHeight = Math.max(maxHeight, $(this).outerHeight(true)); - }) + // Try to not hide filtered items + if (filterLastList.length) { + links.not(filterLast).css('display', 'none'); - function check() { - var width = $body.width(), - height = $this.height(); + maxHeight = 0; + filterLastList.each(function() { + if (!$(this).height()) return; + maxHeight = Math.max(maxHeight, $(this).outerHeight(true)); + }); - if (arguments.length == 0 && (!responsive || width <= lastWidth) && height <= maxHeight) { + if ($this.height() <= maxHeight) { + menu.children().filter(filterLast).css('display', 'none'); return; } + } + + links.css('display', 'none'); + } - tabs.show(); - toggle.hide(); + phpbb.registerDropdown(item.find('a.responsive-menu-link'), item.find('.dropdown')); - lastWidth = width; + check(); + $(window).resize(check); + }); + + /** + * Responsive tabs + */ + container.find('#tabs, #minitabs').not('[data-skip-responsive]').each(function() { + var $this = $(this), + $body = $('body'), + ul = $this.children(), + tabs = ul.children().not('[data-skip-responsive]'), + links = tabs.children('a'), + item = ul.append('<li class="responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link"><span> </span></a><div class="dropdown tab-dropdown" style="display: none;"><div class="pointer"><div class="pointer-inner" /></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 link = $(this); + maxHeight = Math.max(maxHeight, Math.max(link.outerHeight(true), link.parent().outerHeight(true))); + }) + + function check() { + var width = $body.width(), height = $this.height(); - if (height <= maxHeight) { - responsive = false; - return; - } - responsive = true; - toggle.show(); - menu.hide().html(''); + if (arguments.length == 0 && (!responsive || width <= lastWidth) && height <= maxHeight) { + return; + } - var availableTabs = tabs.filter(':not(.activetab, .responsive-tab)'), - total = availableTabs.length, - i, tab; + tabs.show(); + item.hide(); - for (i = total - 1; i >= 0; i --) { - tab = availableTabs.eq(i); - menu.prepend(tab.clone(true)); - tab.hide(); - if ($this.height() <= maxHeight) { - menu.find('a').click(function() { check(true); }); - return; - } + lastWidth = width; + height = $this.height(); + if (height <= maxHeight) { + responsive = false; + if (item.hasClass('dropdown-visible')) { + phpbb.toggleDropdown.call(item.find('a.responsive-tab-link').get(0)); } - menu.find('a').click(function() { check(true); }); + return; } - toggleLink.click(function() { - if (!responsive) return; - menu.toggle(); - }); + responsive = true; + item.show(); + menu.html(''); - check(true); - $(window).resize(check); - }); + var availableTabs = tabs.filter(':not(.activetab, .responsive-tab)'), + total = availableTabs.length, + i, tab; - // Hide responsive menu and tabs - $('#phpbb').click(function(e) { - var parents = $(e.target).parents(); - if (!parents.is('.responsive-menu.visible')) { - $('.responsive-menu.visible').removeClass('visible').find('.responsive-popup').hide(); - } - if (!parents.is('.responsive-tab')) { - $('.responsive-tabs').hide(); + for (i = total - 1; i >= 0; i --) { + tab = availableTabs.eq(i); + menu.prepend(tab.clone(true)); + tab.hide(); + if ($this.height() <= maxHeight) { + menu.find('a').click(function() { check(true); }); + return; + } } - }); + menu.find('a').click(function() { check(true); }); + } - // Hide *CP navigation if there is only 1 item - $('#navigation').each(function() { - var items = $(this).children('ol, ul').children('li'); - if (items.length == 1) - { - $(this).addClass('responsive-hide'); - } - }); + phpbb.registerDropdown(item.find('a.responsive-tab-link'), item.find('.dropdown'), {visibleClass: 'activetab'}); - // Hide empty responsive tables - $('table.responsive > tbody').each(function() { - var items = $(this).children('tr'); - if (items.length == 0) - { - $(this).parent('table:first').addClass('responsive-hide'); + 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 +*/ +(function($) { + $(document).ready(function() { + // Swap .nojs and .hasjs + $('#phpbb.nojs').toggleClass('nojs hasjs'); + + // Focus forms + $('form[data-focus]:first').each(function() { + $('#' + this.getAttribute('data-focus')).focus(); }); + + parse_document($('body')); }); })(jQuery); diff --git a/phpBB/styles/prosilver/template/forumlist_body.html b/phpBB/styles/prosilver/template/forumlist_body.html index 9fb6b3d951..f9019b4fe3 100644 --- a/phpBB/styles/prosilver/template/forumlist_body.html +++ b/phpBB/styles/prosilver/template/forumlist_body.html @@ -42,6 +42,16 @@ <a href="{forumrow.subforum.U_SUBFORUM}" class="subforum<!-- IF forumrow.subforum.S_UNREAD --> unread<!-- ELSE --> read<!-- ENDIF -->" title="<!-- IF forumrow.subforum.UNREAD -->{L_UNREAD_POSTS}<!-- ELSE -->{L_NO_UNREAD_POSTS}<!-- ENDIF -->">{forumrow.subforum.SUBFORUM_NAME}</a><!-- IF not forumrow.subforum.S_LAST_ROW -->,<!-- ENDIF --> <!-- END subforum --> <!-- 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 --> diff --git a/phpBB/styles/prosilver/template/index_body.html b/phpBB/styles/prosilver/template/index_body.html index 2e21c5a341..4565a2d7c7 100644 --- a/phpBB/styles/prosilver/template/index_body.html +++ b/phpBB/styles/prosilver/template/index_body.html @@ -1,7 +1,7 @@ <!-- INCLUDE overall_header.html --> <p class="{S_CONTENT_FLOW_END} responsive-center<!-- IF S_USER_LOGGED_IN --> rightside<!-- ENDIF -->"><!-- IF S_USER_LOGGED_IN -->{LAST_VISIT_DATE}<!-- ELSE -->{CURRENT_TIME}<!-- ENDIF --></p> -<!-- IF U_MCP --><p class="responsive-center">{CURRENT_TIME} <br />[ <a href="{U_MCP}">{L_MCP}</a> ]</p><!-- ELSEIF S_USER_LOGGED_IN --><p>{CURRENT_TIME}</p><!-- ENDIF --> +<!-- IF U_MCP --><p class="responsive-center">{CURRENT_TIME} <br />[ <a href="{U_MCP}">{L_MCP}</a> ]</p><!-- ELSEIF S_USER_LOGGED_IN --><p class="responsive-center">{CURRENT_TIME}</p><!-- ENDIF --> <!-- IF S_DISPLAY_SEARCH or (S_USER_LOGGED_IN and not S_IS_BOT) --> <ul class="linklist bulletin"> @@ -25,10 +25,10 @@ <form method="post" action="{S_LOGIN_ACTION}" class="headerspace"> <h3><a href="{U_LOGIN_LOGOUT}">{L_LOGIN_LOGOUT}</a><!-- IF S_REGISTER_ENABLED --> • <a href="{U_REGISTER}">{L_REGISTER}</a><!-- ENDIF --></h3> <fieldset class="quick-login"> - <label for="username">{L_USERNAME}{L_COLON}</label> <input type="text" name="username" id="username" size="10" class="inputbox" title="{L_USERNAME}" /> - <label for="password">{L_PASSWORD}{L_COLON}</label> <input type="password" name="password" id="password" size="10" class="inputbox" title="{L_PASSWORD}" /> + <label for="username"><span>{L_USERNAME}{L_COLON}</span> <input type="text" name="username" id="username" size="10" class="inputbox" title="{L_USERNAME}" /></label> + <label for="password"><span>{L_PASSWORD}{L_COLON}</span> <input type="password" name="password" id="password" size="10" class="inputbox" title="{L_PASSWORD}" /></label> <!-- IF S_AUTOLOGIN_ENABLED --> - | <label for="autologin">{L_LOG_ME_IN} <input type="checkbox" name="autologin" id="autologin" /></label> + <span class="responsive-hide">|</span> <label for="autologin">{L_LOG_ME_IN} <input type="checkbox" name="autologin" id="autologin" /></label> <!-- ENDIF --> <input type="submit" name="login" value="{L_LOGIN}" class="button2" /> {S_LOGIN_REDIRECT} diff --git a/phpBB/styles/prosilver/template/mcp_forum.html b/phpBB/styles/prosilver/template/mcp_forum.html index ca8a945e74..6ca176a4aa 100644 --- a/phpBB/styles/prosilver/template/mcp_forum.html +++ b/phpBB/styles/prosilver/template/mcp_forum.html @@ -63,7 +63,15 @@ </ul> </div> <!-- ENDIF --> - <!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} » {topicrow.FIRST_POST_TIME} + <div class="responsive-hide"> + <!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF --> + {L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} » {topicrow.FIRST_POST_TIME} + </div> + <div class="responsive-show" style="display: none;"> + <!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF --> + {L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} « {topicrow.LAST_POST_TIME}<br /> + {L_REPLIES}{L_COLON} <strong>{topicrow.REPLIES}</strong> + </div> </div> </dt> diff --git a/phpBB/styles/prosilver/template/mcp_front.html b/phpBB/styles/prosilver/template/mcp_front.html index 3f3d6aaf7f..44295611cf 100644 --- a/phpBB/styles/prosilver/template/mcp_front.html +++ b/phpBB/styles/prosilver/template/mcp_front.html @@ -21,7 +21,7 @@ </dl> </li> </ul> - <ul class="topiclist cplist missing-column"> + <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 -->"> @@ -75,7 +75,7 @@ </dl> </li> </ul> - <ul class="topiclist cplist two-long-columns"> + <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 -->"> @@ -116,7 +116,7 @@ </dl> </li> </ul> - <ul class="topiclist cplist two-long-columns"> + <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 -->"> diff --git a/phpBB/styles/prosilver/template/mcp_queue.html b/phpBB/styles/prosilver/template/mcp_queue.html index c2d39eff98..461d5982db 100644 --- a/phpBB/styles/prosilver/template/mcp_queue.html +++ b/phpBB/styles/prosilver/template/mcp_queue.html @@ -35,7 +35,7 @@ </dl> </li> </ul> - <ul class="topiclist cplist missing-column"> + <ul class="topiclist cplist missing-column responsive-show-all"> <!-- BEGIN postrow --> diff --git a/phpBB/styles/prosilver/template/mcp_reports.html b/phpBB/styles/prosilver/template/mcp_reports.html index 902744fe25..ffa82d5e0e 100644 --- a/phpBB/styles/prosilver/template/mcp_reports.html +++ b/phpBB/styles/prosilver/template/mcp_reports.html @@ -48,6 +48,9 @@ <a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.PM_SUBJECT}</a> {postrow.ATTACH_ICON_IMG}<br /> <span>{L_MESSAGE_BY_AUTHOR} {postrow.PM_AUTHOR_FULL} » {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} « {postrow.REPORT_TIME} + </div> </div> </dt> <dd class="moderation"> @@ -58,6 +61,10 @@ <div class="list-inner"> <a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.POST_SUBJECT}</a> {postrow.ATTACH_ICON_IMG}<br /> <span>{L_POSTED} {L_POST_BY_AUTHOR} {postrow.POST_AUTHOR_FULL} » {postrow.POST_TIME}</span> + <div class="responsive-show" style="display: none;"> + {L_REPORTER}{L_COLON} {postrow.REPORTER_FULL} « {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"> diff --git a/phpBB/styles/prosilver/template/overall_footer.html b/phpBB/styles/prosilver/template/overall_footer.html index 6940024627..86e55c54f6 100644 --- a/phpBB/styles/prosilver/template/overall_footer.html +++ b/phpBB/styles/prosilver/template/overall_footer.html @@ -5,7 +5,7 @@ <div class="navbar"> <div class="inner"> - <ul class="linklist leftside bulletin"> + <ul class="linklist bulletin"> <li class="icon-home breadcrumbs"><!-- IF U_SITE_HOME --><span class="crumb"><a href="{U_SITE_HOME}">{L_SITE_HOME}</a> <strong>‹</strong></span> <!-- ENDIF --><span class="crumb"><a href="{U_INDEX}" accesskey="h">{L_INDEX}</a></span> <!-- EVENT overall_footer_breadcrumb_append --> </li> @@ -15,11 +15,9 @@ <!-- IF U_BOOKMARK_TOPIC --><li class="icon-bookmark"><a href="{U_BOOKMARK_TOPIC}" title="{L_BOOKMARK_TOPIC}" data-ajax="alt_text" data-alt-text="{S_BOOKMARK_TOGGLE}">{S_BOOKMARK_TOPIC}</a></li><!-- ENDIF --> <!-- IF U_BUMP_TOPIC --><li class="icon-bump"><a href="{U_BUMP_TOPIC}" title="{L_BUMP_TOPIC}" data-ajax="true">{L_BUMP_TOPIC}</a></li><!-- ENDIF --> <!-- ENDIF --> - </ul> - <ul class="linklist rightside bulletin"> - <!-- IF U_TEAM --><li><a href="{U_TEAM}">{L_THE_TEAM}</a><!-- ENDIF --> - <!-- IF not S_IS_BOT --><li><a href="{U_DELETE_COOKIES}" data-ajax="true" data-refresh="true">{L_DELETE_COOKIES}</a></li><!-- ENDIF --> - <li>{S_TIMEZONE}</li> + <li class="rightside">{S_TIMEZONE}</li> + <!-- IF not S_IS_BOT --><li class="rightside"><a href="{U_DELETE_COOKIES}" data-ajax="true" data-refresh="true">{L_DELETE_COOKIES}</a></li><!-- ENDIF --> + <!-- IF U_TEAM --><li class="rightside"><a href="{U_TEAM}">{L_THE_TEAM}</a><!-- ENDIF --> </ul> </div> diff --git a/phpBB/styles/prosilver/template/overall_header.html b/phpBB/styles/prosilver/template/overall_header.html index 6ab0b3d553..6186fe051e 100644 --- a/phpBB/styles/prosilver/template/overall_header.html +++ b/phpBB/styles/prosilver/template/overall_header.html @@ -29,7 +29,7 @@ <!-- IF S_ALLOW_CDN --><link href="//fonts.googleapis.com/css?family=Open+Sans:600&subset=latin,cyrillic-ext,latin-ext,cyrillic,greek-ext,greek,vietnamese" rel="stylesheet" type="text/css" media="screen, projection" /><!-- ENDIF --> <link href="{T_STYLESHEET_LINK}" rel="stylesheet" type="text/css" media="screen, projection" /> <link href="{T_STYLESHEET_LANG_LINK}" rel="stylesheet" type="text/css" media="screen, projection" /> -<link href="{T_THEME_PATH}/responsive.css" rel="stylesheet" type="text/css" media="only screen and (max-width: 700px), only screen and (max-device-width: 700px)" /> +<link href="{T_THEME_PATH}/responsive.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="only screen and (max-width: 700px), only screen and (max-device-width: 700px)" /> <!-- IF S_CONTENT_DIRECTION eq 'rtl' --> <link href="{T_THEME_PATH}/bidi.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="screen, projection" /> @@ -97,43 +97,45 @@ <!-- IF S_DISPLAY_SEARCH and not S_IN_SEARCH --><li class="responsive-search rightside" style="display: none;"><a href="{U_SEARCH}" title="{L_SEARCH_ADV_EXPLAIN}">{L_SEARCH}</a></li><!-- ENDIF --> </ul> + <ul class="linklist bulletin"> <!-- IF not S_IS_BOT and S_USER_LOGGED_IN --> - <ul class="linklist leftside bulletin"> <!-- IF S_NOTIFICATIONS_DISPLAY --> - <li class="icon-notification skip-responsive"> + <li class="icon-notification" data-skip-responsive="true"> <a href="{U_VIEW_ALL_NOTIFICATIONS}" id="notification_list_button"><span>{L_NOTIFICATIONS} [</span><strong>{NOTIFICATIONS_COUNT}</strong><span>]</span></a> - <div id="notification_list" class="notification_list"> - <div class="pointer"><div class="pointer_inner"></div></div> - <div class="header"> - {L_NOTIFICATIONS} - <span class="header_settings"><a href="{U_NOTIFICATION_SETTINGS}">{L_SETTINGS}</a></span> - </div> - - <ul> - <!-- IF not .notifications --> - <li> - {L_NO_NOTIFICATIONS} - </li> - <!-- ENDIF --> - <!-- BEGIN notifications --> - <li class="<!-- IF notifications.UNREAD --> bg2<!-- ENDIF -->"> - <!-- IF notifications.URL --><a href="<!-- IF notifications.UNREAD -->{notifications.U_MARK_READ}<!-- ELSE -->{notifications.URL}<!-- ENDIF -->"><!-- ENDIF --> - <!-- IF notifications.AVATAR -->{notifications.AVATAR}<!-- ELSE --><img src="{T_THEME_PATH}/images/no_avatar.gif" alt="" /><!-- ENDIF --> - <div class="notification_text"> - <p>{notifications.FORMATTED_TITLE}</p> - <p>» {notifications.TIME}</p> - - <!-- IF not notifications.URL and notifications.U_MARK_READ --> - <p><a href="{notifications.U_MARK_READ}">{L_MARK_READ}</a></p> - <!-- ENDIF --> - </div> - <!-- IF notifications.URL --></a><!-- ENDIF --> - </li> - <!-- END notifications --> - </ul> - - <div class="footer"> - <a href="{U_VIEW_ALL_NOTIFICATIONS}"><span>{L_SEE_ALL}</span></a> + <div id="notification_list" class="dropdown notification_list"> + <div class="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></span> + </div> + + <ul> + <!-- IF not .notifications --> + <li> + {L_NO_NOTIFICATIONS} + </li> + <!-- ENDIF --> + <!-- BEGIN notifications --> + <li class="<!-- IF notifications.UNREAD --> bg2<!-- ENDIF -->"> + <!-- IF notifications.URL --><a href="<!-- IF notifications.UNREAD -->{notifications.U_MARK_READ}<!-- ELSE -->{notifications.URL}<!-- ENDIF -->"><!-- ENDIF --> + <!-- IF notifications.AVATAR -->{notifications.AVATAR}<!-- ELSE --><img src="{T_THEME_PATH}/images/no_avatar.gif" alt="" /><!-- ENDIF --> + <div class="notification_text"> + <p>{notifications.FORMATTED_TITLE}</p> + <p>» {notifications.TIME}</p> + + <!-- IF not notifications.URL and notifications.U_MARK_READ --> + <p><a href="{notifications.U_MARK_READ}">{L_MARK_READ}</a></p> + <!-- ENDIF --> + </div> + <!-- IF notifications.URL --></a><!-- ENDIF --> + </li> + <!-- END notifications --> + </ul> + + <div class="footer"> + <a href="{U_VIEW_ALL_NOTIFICATIONS}"><span>{L_SEE_ALL}</span></a> + </div> </div> </div> </li> @@ -152,18 +154,16 @@ <!-- IF U_RESTORE_PERMISSIONS --> <li class="icon-restore-permissions"><a href="{U_RESTORE_PERMISSIONS}">{L_RESTORE_PERMISSIONS}</a></li> <!-- ENDIF --> - </ul> <!-- ENDIF --> - <ul class="linklist rightside<!-- IF S_IS_BOT or not S_USER_LOGGED_IN --> fullwidth<!-- ENDIF -->"> - <!-- EVENT overall_header_navigation_prepend --> - <li class="icon-faq"><a href="{U_FAQ}" title="{L_FAQ_EXPLAIN}">{L_FAQ}</a></li> + <!-- EVENT overall_header_navigation_append --> <!-- IF not S_IS_BOT --> - <!-- IF S_DISPLAY_MEMBERLIST --><li class="icon-members"><a href="{U_MEMBERLIST}" title="{L_MEMBERLIST_EXPLAIN}">{L_MEMBERLIST}</a></li><!-- ENDIF --> - <!-- IF not S_USER_LOGGED_IN and S_REGISTER_ENABLED and not (S_SHOW_COPPA or S_REGISTRATION) --><li class="icon-register"><a href="{U_REGISTER}">{L_REGISTER}</a></li><!-- ENDIF --> - <li class="icon-logout"><a href="{U_LOGIN_LOGOUT}" title="{L_LOGIN_LOGOUT}" accesskey="x">{L_LOGIN_LOGOUT}</a></li> + <li class="icon-logout rightside no-bulletin"><a href="{U_LOGIN_LOGOUT}" title="{L_LOGIN_LOGOUT}" accesskey="x">{L_LOGIN_LOGOUT}</a></li> + <!-- IF not S_USER_LOGGED_IN and S_REGISTER_ENABLED and not (S_SHOW_COPPA or S_REGISTRATION) --><li class="icon-register rightside no-bulletin"><a href="{U_REGISTER}">{L_REGISTER}</a></li><!-- ENDIF --> + <!-- IF S_DISPLAY_MEMBERLIST --><li class="icon-members rightside no-bulletin"><a href="{U_MEMBERLIST}" title="{L_MEMBERLIST_EXPLAIN}">{L_MEMBERLIST}</a></li><!-- ENDIF --> <!-- ENDIF --> - <!-- EVENT overall_header_navigation_append --> + <li class="icon-faq rightside no-bulletin"><a href="{U_FAQ}" title="{L_FAQ_EXPLAIN}">{L_FAQ}</a></li> + <!-- EVENT overall_header_navigation_prepend --> </ul> </div> diff --git a/phpBB/styles/prosilver/template/simple_header.html b/phpBB/styles/prosilver/template/simple_header.html index e922893588..53c86689e0 100644 --- a/phpBB/styles/prosilver/template/simple_header.html +++ b/phpBB/styles/prosilver/template/simple_header.html @@ -12,7 +12,7 @@ <!-- IF S_ALLOW_CDN --><link href="//fonts.googleapis.com/css?family=Open+Sans:600&subset=latin,cyrillic-ext,latin-ext,cyrillic,greek-ext,greek,vietnamese" rel="stylesheet" type="text/css" media="screen, projection" /><!-- ENDIF --> <link href="{T_STYLESHEET_LINK}" rel="stylesheet" type="text/css" media="screen, projection" /> <link href="{T_STYLESHEET_LANG_LINK}" rel="stylesheet" type="text/css" media="screen, projection" /> -<link href="{T_THEME_PATH}/responsive.css" rel="stylesheet" type="text/css" media="only screen and (max-width: 700px), only screen and (max-device-width: 700px)" /> +<link href="{T_THEME_PATH}/responsive.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="only screen and (max-width: 700px), only screen and (max-device-width: 700px)" /> <!-- IF S_CONTENT_DIRECTION eq 'rtl' --> <link href="{T_THEME_PATH}/bidi.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet" type="text/css" media="screen, projection" /> diff --git a/phpBB/styles/prosilver/template/ucp_attachments.html b/phpBB/styles/prosilver/template/ucp_attachments.html index feb04278dc..ed39e80c12 100644 --- a/phpBB/styles/prosilver/template/ucp_attachments.html +++ b/phpBB/styles/prosilver/template/ucp_attachments.html @@ -31,7 +31,7 @@ </dl> </li> </ul> - <ul class="topiclist cplist"> + <ul class="topiclist cplist responsive-show-columns"> <!-- BEGIN attachrow --> <li class="row<!-- IF attachrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->"> diff --git a/phpBB/styles/prosilver/template/ucp_auth_link_oauth.html b/phpBB/styles/prosilver/template/ucp_auth_link_oauth.html index a3e27328cd..18316613b0 100644 --- a/phpBB/styles/prosilver/template/ucp_auth_link_oauth.html +++ b/phpBB/styles/prosilver/template/ucp_auth_link_oauth.html @@ -20,7 +20,7 @@ <dt> </dt> <dd><input type="submit" name="submit" tabindex="6" value="{L_UCP_AUTH_LINK_LINK}" class="button1" /></dd> </dl> - <!-- ENDIF--> + <!-- ENDIF --> </fieldset> {oauth.HIDDEN_FIELDS} {S_HIDDEN_FIELDS} diff --git a/phpBB/styles/prosilver/template/ucp_groups_manage.html b/phpBB/styles/prosilver/template/ucp_groups_manage.html index 0148959ae1..019b5aa3e1 100644 --- a/phpBB/styles/prosilver/template/ucp_groups_manage.html +++ b/phpBB/styles/prosilver/template/ucp_groups_manage.html @@ -214,7 +214,7 @@ </dl> </li> </ul> - <ul class="topiclist cplist two-long-columns"> + <ul class="topiclist cplist two-long-columns responsive-show-all"> <!-- BEGIN leader --> <li class="row<!-- IF attachrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->"> diff --git a/phpBB/styles/prosilver/template/ucp_main_bookmarks.html b/phpBB/styles/prosilver/template/ucp_main_bookmarks.html index 017fadad77..477b06249e 100644 --- a/phpBB/styles/prosilver/template/ucp_main_bookmarks.html +++ b/phpBB/styles/prosilver/template/ucp_main_bookmarks.html @@ -54,7 +54,15 @@ </ul> </div> <!-- ENDIF --> - <!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} » {topicrow.FIRST_POST_TIME} + <div class="responsive-hide"> + <!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF --> + {L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} » {topicrow.FIRST_POST_TIME} + </div> + <div class="responsive-show" style="display: none;"> + <!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF --> + {L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} « + <a href="{topicrow.U_LAST_POST}">{topicrow.LAST_POST_TIME}</a> + </div> </div> </dt> <dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} diff --git a/phpBB/styles/prosilver/template/ucp_main_drafts.html b/phpBB/styles/prosilver/template/ucp_main_drafts.html index 723186e20c..52ad5b503b 100644 --- a/phpBB/styles/prosilver/template/ucp_main_drafts.html +++ b/phpBB/styles/prosilver/template/ucp_main_drafts.html @@ -45,6 +45,10 @@ <!-- ELSEIF draftrow.S_LINK_FORUM -->{L_FORUM}{L_COLON} <a href="{draftrow.U_VIEW}">{draftrow.TITLE}</a> <!-- ELSEIF S_PRIVMSGS --> <!-- ELSE -->{L_NO_TOPIC_FORUM}<!-- ENDIF --> + <div class="responsive-show" style="display: none;"> + {L_SAVE_DATE}{L_COLON} <strong>{draftrow.DATE}</strong><br /> + <!-- IF draftrow.U_INSERT --><a href="{draftrow.U_INSERT}">{L_LOAD_DRAFT}</a> • <!-- ENDIF --><a href="{draftrow.U_VIEW_EDIT}">{L_VIEW_EDIT}</a> + </div> </div> </dt> <dd class="info"><span>{draftrow.DATE}<br /><!-- IF draftrow.U_INSERT --><a href="{draftrow.U_INSERT}">{L_LOAD_DRAFT}</a> • <!-- ENDIF --><a href="{draftrow.U_VIEW_EDIT}">{L_VIEW_EDIT}</a></span></dd> diff --git a/phpBB/styles/prosilver/template/ucp_main_front.html b/phpBB/styles/prosilver/template/ucp_main_front.html index 1e26e43772..fa3291cd6c 100644 --- a/phpBB/styles/prosilver/template/ucp_main_front.html +++ b/phpBB/styles/prosilver/template/ucp_main_front.html @@ -31,7 +31,14 @@ </ul> </div> <!-- ENDIF --> - <!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} » {topicrow.FIRST_POST_TIME} + <div class="responsive-hide"> + <!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF --> + {L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} » {topicrow.FIRST_POST_TIME} + </div> + <div class="responsive-show" style="display: none;"> + <!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF --> + {L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} « <a href="{topicrow.U_LAST_POST}">{topicrow.LAST_POST_TIME}</a> + </div> </div> </dt> <dd class="lastpost"><span>{L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} diff --git a/phpBB/styles/prosilver/template/ucp_main_subscribed.html b/phpBB/styles/prosilver/template/ucp_main_subscribed.html index 90fa76cefc..7344a4af1a 100755 --- a/phpBB/styles/prosilver/template/ucp_main_subscribed.html +++ b/phpBB/styles/prosilver/template/ucp_main_subscribed.html @@ -23,7 +23,17 @@ <!-- BEGIN forumrow --> <li class="row<!-- IF forumrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->"> <dl class="icon {forumrow.FORUM_IMG_STYLE}"> - <dt><div class="list-inner"><a href="{forumrow.U_VIEWFORUM}" class="forumtitle">{forumrow.FORUM_NAME}</a><br />{forumrow.FORUM_DESC}</div></dt> + <dt> + <div class="list-inner"> + <a href="{forumrow.U_VIEWFORUM}" class="forumtitle">{forumrow.FORUM_NAME}</a><br /> + {forumrow.FORUM_DESC} + <!-- IF forumrow.LAST_POST_TIME --> + <div class="responsive-show" style="display: none;"> + {L_LAST_POST} {L_POST_BY_AUTHOR} {forumrow.LAST_POST_AUTHOR_FULL} « <a href="{topicrow.U_LAST_POST}">{forumrow.LAST_POST_TIME}</a> + </div> + <!-- ENDIF --> + </div> + </dt> <dd class="lastpost"><!-- IF forumrow.LAST_POST_TIME --><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {forumrow.LAST_POST_AUTHOR_FULL} <a href="{topicrow.U_LAST_POST}">{LAST_POST_IMG}</a> <br />{forumrow.LAST_POST_TIME}</span> <!-- ELSE -->{L_NO_POSTS}<br /> <!-- ENDIF --> @@ -79,7 +89,14 @@ </ul> </div> <!-- ENDIF --> - <!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} » {topicrow.FIRST_POST_TIME} + <div class="responsive-hide"> + <!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF --> + {L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} » {topicrow.FIRST_POST_TIME} + </div> + <div class="responsive-show" style="display: none;"> + <!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF --> + {L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} « <a href="{topicrow.U_LAST_POST}">{topicrow.LAST_POST_TIME}</a> + </div> </div> </dt> <dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} diff --git a/phpBB/styles/prosilver/template/ucp_pm_viewfolder.html b/phpBB/styles/prosilver/template/ucp_pm_viewfolder.html index 0fe0a0c7e0..efe6663db0 100644 --- a/phpBB/styles/prosilver/template/ucp_pm_viewfolder.html +++ b/phpBB/styles/prosilver/template/ucp_pm_viewfolder.html @@ -53,7 +53,7 @@ </dl> </li> </ul> - <ul class="topiclist cplist pmlist <!-- IF S_SHOW_RECIPIENTS -->missing-column<!-- ELSE -->two-columns<!-- ENDIF -->"> + <ul class="topiclist cplist pmlist responsive-show-all <!-- IF S_SHOW_RECIPIENTS -->missing-column<!-- ELSE -->two-columns<!-- ENDIF -->"> <!-- BEGIN messagerow --> <li class="row<!-- IF messagerow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- IF messagerow.PM_CLASS --> {messagerow.PM_CLASS}<!-- ENDIF -->"> diff --git a/phpBB/styles/prosilver/template/viewforum_body.html b/phpBB/styles/prosilver/template/viewforum_body.html index 0b677efc33..6a8c3382da 100644 --- a/phpBB/styles/prosilver/template/viewforum_body.html +++ b/phpBB/styles/prosilver/template/viewforum_body.html @@ -163,8 +163,19 @@ </ul> </div> <!-- ENDIF --> - <!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF -->{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} » {topicrow.FIRST_POST_TIME} - <!-- IF topicrow.S_POST_GLOBAL and FORUM_ID != topicrow.FORUM_ID --> » {L_IN} <a href="{topicrow.U_VIEW_FORUM}">{topicrow.FORUM_NAME}</a><!-- ENDIF --> + <div class="responsive-hide"> + <!-- IF topicrow.ATTACH_ICON_IMG -->{topicrow.ATTACH_ICON_IMG} <!-- ENDIF --> + {L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} » {topicrow.FIRST_POST_TIME} + <!-- IF topicrow.S_POST_GLOBAL and FORUM_ID != topicrow.FORUM_ID --> » {L_IN} <a href="{topicrow.U_VIEW_FORUM}">{topicrow.FORUM_NAME}</a><!-- ENDIF --> + </div> + <!-- IF not S_IS_BOT --> + <div class="responsive-show" style="display: none;"> + {L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} « <a href="{topicrow.U_LAST_POST}">{topicrow.LAST_POST_TIME}</a> + <!-- IF topicrow.S_POST_GLOBAL and FORUM_ID != topicrow.FORUM_ID --><br />{L_POSTED} {L_IN} <a href="{topicrow.U_VIEW_FORUM}">{topicrow.FORUM_NAME}</a><!-- ENDIF --> + <!-- IF topicrow.REPLIES --><br />{L_REPLIES}{L_COLON} <strong>{topicrow.REPLIES}</strong><!-- ENDIF --> + </div> + <!-- ENDIF --> + <!-- EVENT topiclist_row_append --> </div> </dt> diff --git a/phpBB/styles/prosilver/template/viewtopic_body.html b/phpBB/styles/prosilver/template/viewtopic_body.html index e4b6445ccd..91c1cb7a5d 100644 --- a/phpBB/styles/prosilver/template/viewtopic_body.html +++ b/phpBB/styles/prosilver/template/viewtopic_body.html @@ -193,7 +193,7 @@ <!-- ENDIF --> <!-- ENDIF --> - <p class="author"><!-- IF S_IS_BOT -->{postrow.MINI_POST_IMG}<!-- ELSE --><a href="{postrow.U_MINI_POST}">{postrow.MINI_POST_IMG}</a><!-- ENDIF -->{L_POST_BY_AUTHOR} <strong>{postrow.POST_AUTHOR_FULL}</strong> » {postrow.POST_DATE} </p> + <p class="author"><!-- IF S_IS_BOT -->{postrow.MINI_POST_IMG}<!-- ELSE --><a href="{postrow.U_MINI_POST}">{postrow.MINI_POST_IMG}</a><!-- ENDIF --><span class="responsive-hide">{L_POST_BY_AUTHOR} <strong>{postrow.POST_AUTHOR_FULL}</strong> » </span>{postrow.POST_DATE} </p> <!-- IF postrow.S_POST_UNAPPROVED --> <form method="post" class="mcp_approve" action="{postrow.U_APPROVE_ACTION}"> diff --git a/phpBB/styles/prosilver/theme/buttons.css b/phpBB/styles/prosilver/theme/buttons.css index e2c0dc9145..33f924717a 100644 --- a/phpBB/styles/prosilver/theme/buttons.css +++ b/phpBB/styles/prosilver/theme/buttons.css @@ -103,6 +103,12 @@ ul.linklist.bulletin li.icon-bookmark:before, ul.linklist.bulletin li.icon-bump: display: none; } +.icon-home > span:first-child > a, .icon-notification > a, .icon-pm > a { + display: inline-block; + margin-left: -17px; + padding-left: 17px; +} + /* Poster profile icons ----------------------------------------*/ ul.profile-icons { @@ -170,13 +176,13 @@ ul.profile-icons.responsive a.responsive-menu-link:before { border-top: 0.375em double transparent; } -.postbody ul.profile-icons.responsive .responsive-popup { +.postbody ul.profile-icons.responsive .popup-pointer { left: auto; right: 7px; - top: 19px; + top: 20px; } -.postbody ul.profile-icons.responsive .responsive-popup li, .postbody ul.profile-icons.responsive .responsive-popup li a { +.postbody ul.profile-icons .dropdown li, .postbody ul.profile-icons .dropdown li a { display: block; background: transparent none; width: auto; @@ -187,7 +193,7 @@ ul.profile-icons.responsive a.responsive-menu-link:before { list-style-type: none; } -.postbody ul.profile-icons.responsive .responsive-popup li span { +.postbody ul.profile-icons .dropdown li span { display: block; text-align: right; font-size: 1.2em; diff --git a/phpBB/styles/prosilver/theme/colours.css b/phpBB/styles/prosilver/theme/colours.css index a0db75d07f..960415afbf 100644 --- a/phpBB/styles/prosilver/theme/colours.css +++ b/phpBB/styles/prosilver/theme/colours.css @@ -844,7 +844,7 @@ ul.cplist { background-color: #F9F9F9; } -#minitabs li.activetab a, #minitabs li.activetab a:hover { +#minitabs li.activetab a span, #minitabs li.activetab a:hover span { color: #333333; } @@ -889,6 +889,13 @@ ul.cplist { color: #D31141; } +@media only screen and (max-width: 700px), only screen and (max-device-width: 700px) +{ + #navigation a, .rtl #navigation a { + background-image: none; + } +} + /* Preferences pane layout ----------------------------------------*/ #cp-main h2 { @@ -1097,11 +1104,6 @@ input.disabled { background-color: #000000; } -#notification_list { - background-color: #FFFFFF; - border-color: #B9B9B9; -} - #notification_list ul li { border-bottom-color: #B9B9B9; } @@ -1111,12 +1113,12 @@ input.disabled { color: #000000; } -#notification_list > .header, .notification_list > .footer { +#notification_list .header, .notification_list .footer { border-color: #B9B9B9; color: #000000; } -#notification_list > .header { +#notification_list .header { background: #F1F8FF; background: -moz-linear-gradient(top, #F1F8FF 0%, #CADCEB 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F1F8FF), color-stop(100%, #CADCEB)); @@ -1126,33 +1128,36 @@ input.disabled { background: linear-gradient(to bottom, #F1F8FF 0%, #CADCEB 100%); } -.notification_list .pointer { - border-bottom-color: #B9B9B9; +.dropdown .pointer { + border-color: #B9B9B9 transparent; } -.notification_list .pointer_inner { - border-bottom-color: #F1F8FF; +.dropdown .pointer-inner { + border-color: #FFF transparent; +} + +#notification_list .pointer-inner, #minitabs .pointer-inner { + border-color: #F1F8FF transparent; } ul.linklist li.responsive-menu a.responsive-menu-link:before { border-color: #105289; } -ul.linklist li.responsive-menu a.responsive-menu-link:hover:before { +ul.linklist li.responsive-menu a.responsive-menu-link:hover:before, ul.linklist li.responsive-menu.visible a.responsive-menu-link:before { border-color: #D31141; } -ul.responsive-popup { +.dropdown .dropdown-contents { background: #fff; border-color: #b9b9b9; box-shadow: 1px 3px 5px rgba(0, 0, 0, 0.2); } -.navbar ul.responsive-popup { - background-color: #CADCEB; + +.dropdown-up .dropdown-contents { + box-shadow: 1px 0 5px rgba(0, 0, 0, 0.2); } -#tabs ul.responsive-tabs, #minitabs ul.responsive-tabs { - background: #ddedfb; - border-color: #c0c9d5; - box-shadow: 1px 3px 5px rgba(0, 0, 0, 0.4); +#minitabs .dropdown-contents { + background-color: #F1F8FF; } diff --git a/phpBB/styles/prosilver/theme/common.css b/phpBB/styles/prosilver/theme/common.css index 2c61ecfdea..84aea8212c 100644 --- a/phpBB/styles/prosilver/theme/common.css +++ b/phpBB/styles/prosilver/theme/common.css @@ -361,16 +361,18 @@ ul.rightside { text-align: right; } -ul.linklist.responsive { +ul.linklist li.responsive-menu { position: relative; + margin: 0 5px; } ul.linklist li.responsive-menu a.responsive-menu-link { display: inline-block; + margin: 0 5px; font-size: 16px; position: relative; width: 16px; - line-height: 16px; + line-height: 16.5px; text-decoration: none; } @@ -393,6 +395,24 @@ ul.linklist li.responsive-menu a.responsive-menu-link:before { max-width: none; } +li.responsive-menu.dropdown-right .dropdown { + left: -9px; +} + +li.responsive-menu.dropdown-left .dropdown { + right: -6px; +} + +li.responsive-menu .dropdown .dropdown-contents { + padding: 0 5px; +} + +ul.linklist .dropdown li { + clear: both; +} + + + /* Bulletin icons for list items ----------------------------------------*/ ul.linklist.bulletin li:before { @@ -415,57 +435,125 @@ ul.linklist.bulletin li.no-bulletin:before { display: none !important; } -/* Responsive popup +/* Dropdown menu ----------------------------------------*/ -ul.responsive-popup { +.dropdown { position: absolute; left: 0; - top: 24px; + top: 22px; z-index: 2; border: 1px solid transparent; border-radius: 5px; - padding: 5px; + padding: 9px 0 0; } -ul.responsive-popup.responsive-rightside { +.dropdown-up .dropdown { + top: auto; + bottom: 18px; + padding: 0 0 9px; +} + +.dropdown-left .dropdown { left: auto; right: 0; } -ul.responsive-popup li { + +.dropdown .pointer, .dropdown .pointer-inner { + position: absolute; + width: 0; + height: 0; + border-top-width: 0; + border-bottom: 10px solid transparent; + border-left: 10px dashed transparent; + border-right: 10px dashed transparent; + -webkit-transform: rotate(360deg); /* better anti-aliasing in webkit */ + display: block; +} + +.dropdown-up .pointer, .dropdown-up .pointer-inner { + border-bottom-width: 0; + border-top: 10px solid transparent; +} + +.dropdown .pointer { + right: auto; + left: 10px; + top: 0; + z-index: 3; +} + +.dropdown-up .pointer { + bottom: 0; + top: auto; +} + +.dropdown-left .dropdown .pointer { + left: auto; + right: 10px; +} + +.dropdown .pointer-inner { + top: auto; + bottom: -11px; + left: -10px; +} + +.dropdown-up .pointer-inner { + bottom: auto; + top: -11px; +} + +.dropdown .dropdown-contents { + z-index: 2; + overflow: hidden; + border: 1px solid transparent; + border-radius: 5px; + padding: 5px; + position: relative; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.dropdown li { float: none; margin: 0; white-space: nowrap; text-align: left; } -.wrap ul.responsive-popup li { +.wrap .dropdown li, .dropdown.wrap li, #notification_list li { white-space: normal; } -ul.responsive-popup li:before, ul.responsive-popup li:after { +.dropdown li:before, .dropdown li:after { display: none !important; } /* Responsive breadcrumbs ----------------------------------------*/ .breadcrumbs .crumb { - display: inline-block; - vertical-align: bottom; -} - -.breadcrumbs.wrapped .crumb { - letter-spacing: -.5px; + word-wrap: normal; } -.breadcrumbs .crumb.wrapped { +.breadcrumbs .crumb a { + display: inline-block; white-space: nowrap; - overflow: hidden; text-overflow: ellipsis; + vertical-align: bottom; + overflow: hidden; } -.breadcrumbs .crumb.wrapped-wide { max-width: 120px; } -.breadcrumbs .crumb.wrapped-medium { max-width: 80px; } -.breadcrumbs .crumb.wrapped-small { max-width: 30px; } + +.breadcrumbs.wrapped .crumb a { letter-spacing: -.3px; } +.breadcrumbs.wrapped .crumb.wrapped-medium a { letter-spacing: -.4px; } +.breadcrumbs.wrapped .crumb.wrapped-tiny a { letter-spacing: -.5px; } + +.breadcrumbs .crumb.wrapped-max a { max-width: 120px; } +.breadcrumbs .crumb.wrapped-wide a { max-width: 100px; } +.breadcrumbs .crumb.wrapped-medium a { max-width: 80px; } +.breadcrumbs .crumb.wrapped-small a { max-width: 60px; } +.breadcrumbs .crumb.wrapped-tiny a { max-width: 40px; } /* Table styles ----------------------------------------*/ @@ -643,7 +731,7 @@ li.pagination ul { line-height: normal; } -.pagination li a, .pagnation li span, li .pagination li a, li .pagnation li span, .pagination li.active span, .pagination li.ellipsis span { +.pagination li a, .pagnation li span, li .pagination li a, li .pagination li span, .pagination li.active span, .pagination li.ellipsis span { font-weight: normal; text-decoration: none; padding: 0 2px; @@ -670,13 +758,22 @@ li.pagination ul { position: fixed; display: none; top: 150px; - left: 25%; - width: 50%; + left: 0; + right: 0; + max-width: 640px; + margin: 0 auto; z-index: 50; padding: 25px; padding: 0 25px 20px 25px; } +@media only screen and (max-height: 500px), only screen and (max-device-width: 500px) +{ + .phpbb_alert { + top: 25px; + } +} + .phpbb_alert .alert_close { display: block; float: right; @@ -823,10 +920,7 @@ form > p.post-notice strong { left: 0; width: 330px; z-index: 1; - border: 1px solid; - box-shadow: 3px 3px 5px darkgray; - border-radius: 5px; - top: 32px; + top: 22px; } #notification_list ul { @@ -850,7 +944,11 @@ form > p.post-notice strong { display: none; } -#notification_list > .header { +#notification_list .dropdown-contents { + padding: 0; +} + +#notification_list .header { padding: 0 10px; font-family: Arial, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 11px; @@ -862,18 +960,18 @@ form > p.post-notice strong { border-radius: 5px 5px 0 0; } -#notification_list > .header > .header_settings { +#notification_list .header .header_settings { float: right; font-weight: normal; text-transform: none; } -#notification_list > .footer { +#notification_list .footer { text-align: center; font-size: 1.2em; } -#notification_list ul li a, .notification_list dt > a, #notification_list > .footer > a { +#notification_list ul li a, .notification_list dt > a, #notification_list .footer > a { display: block; text-decoration: none; } @@ -890,30 +988,6 @@ form > p.post-notice strong { margin: 0; } -.notification_list .pointer, .notification_list .pointer_inner { - position: absolute; - width: 0; - height: 0; - border-top-width: 0; - border-bottom: 10px solid; - border-left: 10px dashed transparent; - border-right: 10px dashed transparent; - -webkit-transform: rotate(360deg); /* better anti-aliasing in webkit */ - display: block; -} - -.notification_list .pointer { - right: auto; - left: 10px; - top: -11px; -} - -.notification_list .pointer_inner { - top: auto; - bottom: -11px; - left: -10px; -} - .notification_list div.notifications { padding: 5px; } diff --git a/phpBB/styles/prosilver/theme/content.css b/phpBB/styles/prosilver/theme/content.css index 7d91d331d6..389f93fa4e 100644 --- a/phpBB/styles/prosilver/theme/content.css +++ b/phpBB/styles/prosilver/theme/content.css @@ -516,6 +516,7 @@ blockquote .codebox { padding: 6px; border: 1px dashed transparent; clear: left; + -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } @@ -711,6 +712,11 @@ fieldset.polls dd div { margin-bottom: 3px; } +.postprofile .avatar img { + max-width: 90%; + height: auto !important; +} + .online { background-image: none; background-position: 100% 0; diff --git a/phpBB/styles/prosilver/theme/cp.css b/phpBB/styles/prosilver/theme/cp.css index e0863f7458..2003fef954 100644 --- a/phpBB/styles/prosilver/theme/cp.css +++ b/phpBB/styles/prosilver/theme/cp.css @@ -105,6 +105,7 @@ ul.cplist { .tabs-container #minitabs { float: right; margin-top: 19px; + max-width: 50%; } .tabs-container:after { @@ -218,6 +219,10 @@ ul.cplist { /* Responsive tabs ----------------------------------------*/ +.responsive-tab { + position: relative; +} + .responsive-tab .responsive-tab-link span { display: inline-block; font-size: 16px; @@ -251,29 +256,39 @@ ul.cplist { position: relative; } -#tabs ul.responsive-tabs, #minitabs ul.responsive-tabs { - position: absolute; - right: 0; - top: 26px; - z-index: 2; - border: 1px solid transparent; - border-radius: 5px; +#tabs .dropdown, #minitabs .dropdown { + top: 29px; + margin-right: -1px; } -#minitabs ul.responsive-tabs { - top: 23px; +#minitabs .dropdown { + top: 18px; } -.tabs-container #minitabs ul.responsive-tabs { - right: auto; - left: 0; +#tabs .dropdown-up .dropdown, #minitabs .dropdown-up .dropdown { + bottom: -5px; + top: auto; +} + +#minitabs .dropdown-up .dropdown { + bottom: 18px; +} + +#tabs .dropdown-right .dropdown, #minitabs .dropdown-right .dropdown { + margin-left: -41px; } -#tabs .responsive-tabs li, #minitabs .responsive-tabs li { +#tabs .dropdown li, #minitabs .dropdown li { display: block !important; + background: transparent none; + padding: 0; } -#tabs .responsive-tabs a, #tabs .responsive-tabs a span, #minitabs .responsive-tabs a, #minitabs .responsive-tabs a span { +.tabs-container #minitabs .dropdown a span { + display: block; +} + +#tabs .dropdown a, #tabs .dropdown a span, #minitabs .dropdown a, #minitabs .dropdown a span { background: transparent; float: none; margin: 0; @@ -281,14 +296,16 @@ ul.cplist { text-align: right; } -.tabs-container #minitabs .responsive-tabs a span { +.tabs-container #minitabs .dropdown a span { text-align: left; } -#tabs .responsive-tabs a span, #minitabs .responsive-tabs a span { - padding: 5px; +#tabs .dropdown a span, #minitabs .dropdown a span { + padding: 5px 8px; + color: inherit !important; } + /* UCP navigation menu ----------------------------------------*/ /* Container for sub-navigation list */ @@ -417,3 +434,41 @@ ol.def-rules li { border: 1px solid transparent; text-align: center; } + +/* Responsive *CP navigation +----------------------------------------*/ +@media only screen and (max-width: 900px), only screen and (max-device-width: 900px) +{ + .nojs #tabs a span, .nojs #minitabs a span { + max-width: 40px; + overflow: hidden; + text-overflow: ellipsis; + letter-spacing: -.5px; + } + + #cp-menu, #navigation, #cp-main { + float: none; + width: auto; + margin: 0; + } + + #navigation { + padding: 0; + margin: 0 auto; + max-width: 320px; + } + + #navigation a { + background-image: none; + } + + #navigation li:first-child a { + border-top-left-radius: 5px; + border-top-right-radius: 5px; + } + + #navigation li:last-child a { + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + } +} diff --git a/phpBB/styles/prosilver/theme/forms.css b/phpBB/styles/prosilver/theme/forms.css index adb8c5e521..f128450955 100644 --- a/phpBB/styles/prosilver/theme/forms.css +++ b/phpBB/styles/prosilver/theme/forms.css @@ -206,7 +206,11 @@ fieldset.forum-selection2 { fieldset.jumpbox { text-align: right; margin-top: 15px; - height: 2.5em; + min-height: 2.5em; +} + +fieldset.jumpbox select { + max-width: 50%; } fieldset.quickmod { diff --git a/phpBB/styles/prosilver/theme/images/icon_post_menu.png b/phpBB/styles/prosilver/theme/images/icon_post_menu.png Binary files differindex 55723ddda1..2b48289fdb 100644 --- a/phpBB/styles/prosilver/theme/images/icon_post_menu.png +++ b/phpBB/styles/prosilver/theme/images/icon_post_menu.png diff --git a/phpBB/styles/prosilver/theme/responsive.css b/phpBB/styles/prosilver/theme/responsive.css index a9d7b1abc7..d7af7519b7 100644 --- a/phpBB/styles/prosilver/theme/responsive.css +++ b/phpBB/styles/prosilver/theme/responsive.css @@ -17,7 +17,7 @@ body { } #wrap { - min-width: 320px; + min-width: 300px; padding: 0; } @@ -133,35 +133,12 @@ ul.topiclist.forums dt, ul.topiclist.topics dt { } ul.topiclist.forums dt .list-inner, ul.topiclist.topics dt .list-inner { margin-right: 250px; - padding-bottom: 18px; } ul.topiclist.forums dd.lastpost, ul.topiclist.topics dd.lastpost { display: block; } -ul.topiclist.forums dd.topics, ul.topiclist.topics dd.posts { - display: block; - position: absolute; - left: 45px; - right: 0; - bottom: 0; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - min-height: 0; - height: auto; - border-width: 0; - margin: 0; - padding: 5px 0; - width: auto; - min-width: 0; - text-align: left; - font-weight: bold; - font-size: 1.2em; - line-height: 1em; -} - ul.topiclist dd.mark { display: block; position: absolute; @@ -196,6 +173,19 @@ ul.topiclist.forums dd.topics dfn, ul.topiclist.topics dd.posts dfn { } } +li.row .responsive-show strong { + font-weight: bold; + color: inherit; +} + +ul.topiclist li.row dt a.subforum { + display: inline-block; + vertical-align: bottom; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100px; +} + /* Notifications list ----------------------------------------*/ @media only screen and (max-width: 350px), only screen and (max-device-width: 350px) @@ -211,39 +201,10 @@ ul.topiclist.forums dd.topics dfn, ul.topiclist.topics dd.posts dfn { margin: 5px 0; } -/* *CP navigation -----------------------------------------*/ -.nojs #tabs a span, .nojs #minitabs a span { - max-width: 40px; - overflow: hidden; - text-overflow: ellipsis; - letter-spacing: -.5px; -} - -#cp-menu, #navigation, #cp-main { - float: none; - width: auto; - margin: 0; -} - -#navigation { - padding: 0; - margin: 0 auto; - max-width: 320px; -} - -#navigation a { - background-image: none; -} - -#navigation li:first-child a { - border-top-left-radius: 5px; - border-top-right-radius: 5px; -} - -#navigation li:last-child a { - border-bottom-left-radius: 5px; - border-bottom-right-radius: 5px; +.pagination li a, .pagination li span { + min-width: 10px; + display: inline-block; + text-align: center; } /* Responsive tables @@ -262,6 +223,10 @@ table.responsive.show-header thead, table.responsive.show-header th:first-child text-align: left !important; } +table.responsive.show-header th:first-child span.rank-img { + display: none; +} + table.responsive tr { margin: 2px 0; } @@ -355,6 +320,43 @@ dl.pmlist dd:first-of-type { display: inline-block !important; } +fieldset.quick-login label { + display: block; + margin-bottom: 5px; + white-space: normal; +} + +fieldset.quick-login label > span { + display: inline-block; + min-width: 100px; +} + +fieldset.quick-login input.inputbox { + width: 85%; + max-width: 300px; + margin-left: 20px; +} + +fieldset.quick-login label[for="autologin"] { + display: inline-block; + text-align: right; + min-width: 50%; +} + +@media only screen and (max-width: 500px), only screen and (max-device-width: 500px) +{ + select, .inputbox { + max-width: 260px; + } +} + +@media only screen and (max-width: 320px), only screen and (max-device-width: 320px) +{ + select, .inputbox { + max-width: 240px; + } +} + /* User profile ----------------------------------------*/ .column1, .column2, .left-box.profile-details { @@ -438,6 +440,14 @@ fieldset.polls dd.resultbar, fieldset.polls dd.poll_option_percent { max-height: 32px; } +@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi), (min-resolution: 1.5dppx) +{ + /* Scale online image for HD displays */ + .online { + background-size: 40px; + } +} + /* Misc stuff ----------------------------------------*/ h2 { @@ -468,6 +478,12 @@ fieldset.quickmod { text-align: center; } +fieldset.display-options label { + display: block; + clear: both; + margin-bottom: 5px; +} + dl.mini dd.pm-legend { float: left; min-width: 200px; @@ -482,6 +498,11 @@ fieldset.display-actions { white-space: normal; } +.phpbb_alert { + max-width: none; + margin: 0 25px; +} + @media only screen and (max-width: 500px), only screen and (max-device-width: 500px) { p.responsive-center { diff --git a/phpBB/styles/subsilver2/template/ucp_auth_link_oauth.html b/phpBB/styles/subsilver2/template/ucp_auth_link_oauth.html index 56a4c89125..80564d207b 100644 --- a/phpBB/styles/subsilver2/template/ucp_auth_link_oauth.html +++ b/phpBB/styles/subsilver2/template/ucp_auth_link_oauth.html @@ -23,7 +23,7 @@ <tr> <td class="row1"><input type="submit" name="submit" tabindex="6" value="{L_UCP_AUTH_LINK_LINK}" class="button1" /></td> </tr> - <!-- ENDIF--> + <!-- ENDIF --> </table> {oauth.HIDDEN_FIELDS} {S_HIDDEN_FIELDS} diff --git a/tests/avatar/manager_test.php b/tests/avatar/manager_test.php index ba1fb04b33..0db3f13617 100644 --- a/tests/avatar/manager_test.php +++ b/tests/avatar/manager_test.php @@ -25,9 +25,17 @@ class phpbb_avatar_manager_test extends PHPUnit_Framework_TestCase $config = new \phpbb\config\config(array()); $request = $this->getMock('\phpbb\request\request'); $cache = $this->getMock('\phpbb\cache\driver\driver_interface'); + $path_helper = new \phpbb\path_helper( + new \phpbb\symfony_request( + new phpbb_mock_request() + ), + new \phpbb\filesystem(), + $this->phpbb_root_path, + $this->phpEx + ); // $this->avatar_foobar will be needed later on - $this->avatar_foobar = $this->getMock('\phpbb\avatar\driver\foobar', array('get_name'), array($config, $phpbb_root_path, $phpEx, $cache)); + $this->avatar_foobar = $this->getMock('\phpbb\avatar\driver\foobar', array('get_name'), array($config, $phpbb_root_path, $phpEx, $path_helper, $cache)); $this->avatar_foobar->expects($this->any()) ->method('get_name') ->will($this->returnValue('avatar.driver.foobar')); @@ -40,7 +48,7 @@ class phpbb_avatar_manager_test extends PHPUnit_Framework_TestCase foreach ($this->avatar_drivers() as $driver) { - $cur_avatar = $this->getMock('\phpbb\avatar\driver\\' . $driver, array('get_name'), array($config, $phpbb_root_path, $phpEx, $cache)); + $cur_avatar = $this->getMock('\phpbb\avatar\driver\\' . $driver, array('get_name'), array($config, $phpbb_root_path, $phpEx, $path_helper, $cache)); $cur_avatar->expects($this->any()) ->method('get_name') ->will($this->returnValue('avatar.driver.' . $driver)); @@ -104,7 +112,7 @@ class phpbb_avatar_manager_test extends PHPUnit_Framework_TestCase public function test_get_driver_enabled($driver_name, $expected) { $driver = $this->manager->get_driver($driver_name); - $this->assertEquals($expected, $driver); + $this->assertEquals($expected, ($driver === null) ? null : $driver->get_name()); } public function get_driver_data_all() @@ -125,7 +133,7 @@ class phpbb_avatar_manager_test extends PHPUnit_Framework_TestCase public function test_get_driver_all($driver_name, $expected) { $driver = $this->manager->get_driver($driver_name, false); - $this->assertEquals($expected, $driver); + $this->assertEquals($expected, ($driver === null) ? $driver : $driver->get_name()); } public function test_get_avatar_settings() diff --git a/tests/controller/controller_test.php b/tests/controller/controller_test.php index 10fced05a2..588adbcfb1 100644 --- a/tests/controller/controller_test.php +++ b/tests/controller/controller_test.php @@ -34,10 +34,17 @@ class phpbb_controller_controller_test extends phpbb_test_case $provider = new \phpbb\controller\provider; $routes = $provider ->import_paths_from_finder($this->extension_manager->get_finder()) - ->find('./tests/controller/'); + ->find(__DIR__); // This will need to be updated if any new routes are defined - $this->assertEquals(2, sizeof($routes)); + $this->assertInstanceOf('Symfony\Component\Routing\Route', $routes->get('core_controller')); + $this->assertEquals('/core_foo', $routes->get('core_controller')->getPath()); + + $this->assertInstanceOf('Symfony\Component\Routing\Route', $routes->get('controller1')); + $this->assertEquals('/foo', $routes->get('controller1')->getPath()); + + $this->assertInstanceOf('Symfony\Component\Routing\Route', $routes->get('controller2')); + $this->assertEquals('/foo/bar', $routes->get('controller2')->getPath()); } public function test_controller_resolver() diff --git a/tests/controller/ext/foo/config/routing.yml b/tests/controller/ext/foo/config/routing.yml index 4799fec37d..6cc275d96d 100644 --- a/tests/controller/ext/foo/config/routing.yml +++ b/tests/controller/ext/foo/config/routing.yml @@ -1,3 +1,7 @@ controller1: pattern: /foo defaults: { _controller: foo.controller:handle } + +include_controller2: + resource: "routing_2.yml" + prefix: /foo diff --git a/tests/controller/ext/foo/config/routing_2.yml b/tests/controller/ext/foo/config/routing_2.yml new file mode 100644 index 0000000000..35fff27037 --- /dev/null +++ b/tests/controller/ext/foo/config/routing_2.yml @@ -0,0 +1,3 @@ +controller2: + pattern: /bar + defaults: { _controller: foo.controller:handle } diff --git a/travis/setup-mariadb.sh b/travis/setup-mariadb.sh index 02520b1c2c..aceb6af7ee 100755 --- a/travis/setup-mariadb.sh +++ b/travis/setup-mariadb.sh @@ -4,6 +4,7 @@ # @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 # set -e +set -x # MariaDB Series VERSION='5.5' @@ -12,21 +13,31 @@ VERSION='5.5' OS_CODENAME=$(lsb_release --codename --short) # Manually purge MySQL to remove conflicting files (e.g. /etc/mysql/my.cnf) -sudo apt-get purge -qq mysql-common +sudo apt-get purge -y mysql-common if ! which add-apt-repository > /dev/null then - sudo apt-get update -qq - sudo apt-get install -qq python-software-properties + sudo apt-get update + sudo apt-get install -y python-software-properties fi +MIRROR_DOMAIN='ftp.osuosl.org' sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db -sudo add-apt-repository "deb http://ftp.osuosl.org/pub/mariadb/repo/$VERSION/ubuntu $OS_CODENAME main" -sudo apt-get update -qq +sudo add-apt-repository "deb http://$MIRROR_DOMAIN/pub/mariadb/repo/$VERSION/ubuntu $OS_CODENAME main" +sudo apt-get update + +# Pin repository in order to avoid conflicts with MySQL from distribution +# repository. See https://mariadb.com/kb/en/installing-mariadb-deb-files +# section "Version Mismatch Between MariaDB and Ubuntu/Debian Repositories" +echo " +Package: * +Pin: origin $MIRROR_DOMAIN +Pin-Priority: 1000 +" | sudo tee /etc/apt/preferences.d/mariadb sudo debconf-set-selections <<< "mariadb-server-$VERSION mysql-server/root_password password rootpasswd" sudo debconf-set-selections <<< "mariadb-server-$VERSION mysql-server/root_password_again password rootpasswd" -sudo apt-get install -qq mariadb-server +sudo apt-get install -y mariadb-server # Set root password to empty string. echo " diff --git a/travis/setup-webserver.sh b/travis/setup-webserver.sh index 95fc4ec1f8..f1bf69c575 100755 --- a/travis/setup-webserver.sh +++ b/travis/setup-webserver.sh @@ -4,9 +4,10 @@ # @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 # set -e +set -x -sudo apt-get update -qq -sudo apt-get install -qq nginx realpath +sudo apt-get update +sudo apt-get install -y nginx realpath sudo service nginx stop |