Compare commits

..

2 commits

Author SHA1 Message Date
Matt Friedman
01f9bdeb62
Merge 158a561651 into 954bc07de1 2025-06-27 01:25:24 +00:00
Matt Friedman
158a561651
[ticket/17517] Update and refactor eslint implementation
PHPBB-17517
2025-06-26 18:25:05 -07:00
10 changed files with 3490 additions and 3537 deletions

View file

@ -1,5 +1,6 @@
/* global phpbb */
/* eslint no-var: 0 */
/* eslint no-unused-vars: 0 */
/**
* phpBB ACP functions
@ -8,16 +9,19 @@
/**
* Parse document block
*/
function parseDocument(container) {
var test = document.createElement('div');
function parse_document(container)
{
var test = document.createElement('div'),
oldBrowser = (typeof test.style.borderRadius === 'undefined');
test.remove();
/**
* Navigation
*/
container.find('#menu').each(function() {
var menu = $(this);
var blocks = menu.children('.menu-block');
var menu = $(this),
blocks = menu.children('.menu-block');
if (!blocks.length) {
return;
@ -29,7 +33,6 @@ function parseDocument(container) {
if (!parent.hasClass('active')) {
parent.siblings().removeClass('active');
}
parent.toggleClass('active');
});
@ -46,11 +49,12 @@ function parseDocument(container) {
* Responsive tables
*/
container.find('table').not('.not-responsive').each(function() {
var $this = $(this);
var th = $this.find('thead > tr > th');
var headers = [];
var totalHeaders = 0;
var i;
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) {
@ -69,24 +73,21 @@ function parseDocument(container) {
}
// Find each header
if (!$this.data('no-responsive-header')) {
if (!$this.data('no-responsive-header'))
{
th.each(function(column) {
var cell = $(this);
var colspan = parseInt(cell.attr('colspan'), 10);
var dfn = cell.attr('data-dfn');
var text = dfn ? dfn : $.trim(cell.text());
if (text === ' ') {
text = '';
}
var cell = $(this),
colspan = parseInt(cell.attr('colspan')),
dfn = cell.attr('data-dfn'),
text = dfn ? dfn : $.trim(cell.text());
if (text === ' ') text = '';
colspan = isNaN(colspan) || colspan < 1 ? 1 : colspan;
for (i = 0; i < colspan; i++) {
for (i=0; i<colspan; i++) {
headers.push(text);
}
totalHeaders++;
totalHeaders ++;
if (dfn && !column) {
$this.addClass('show-header');
@ -105,9 +106,9 @@ function parseDocument(container) {
}
$this.find('tbody > tr').each(function() {
var row = $(this);
var cells = row.children('td');
var column = 0;
var row = $(this),
cells = row.children('td'),
column = 0;
if (cells.length === 1) {
row.addClass('big-column');
@ -115,9 +116,9 @@ function parseDocument(container) {
}
cells.each(function() {
var cell = $(this);
var colspan = parseInt(cell.attr('colspan'), 10);
var text = $.trim(cell.text());
var cell = $(this),
colspan = parseInt(cell.attr('colspan')),
text = $.trim(cell.text());
if (headersLength <= column) {
return;
@ -127,7 +128,8 @@ function parseDocument(container) {
if (headers[column].length) {
cell.prepend($('<dfn>').css('display', 'none').text(headers[column]));
}
} else {
}
else {
cell.addClass('empty');
}
@ -145,7 +147,8 @@ function parseDocument(container) {
*/
container.find('table.responsive > tbody').each(function() {
var items = $(this).children('tr');
if (!items.length) {
if (!items.length)
{
$(this).parent('table:first').addClass('responsive-hide');
}
});
@ -179,16 +182,16 @@ function parseDocument(container) {
* Responsive tabs
*/
container.find('#tabs').not('[data-skip-responsive]').each(function() {
var $this = $(this);
var $body = $('body');
var ul = $this.children();
var tabs = ul.children().not('[data-skip-responsive]');
var links = tabs.children('a');
var item = ul.append('<li class="tab responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link">&nbsp;</a><div class="dropdown tab-dropdown" style="display: none;"><div class="pointer"><div class="pointer-inner"></div></div><ul class="dropdown-contents" /></div></li>').find('li.responsive-tab');
var menu = item.find('.dropdown-contents');
var maxHeight = 0;
var lastWidth = false;
var responsive = false;
var $this = $(this),
$body = $('body'),
ul = $this.children(),
tabs = ul.children().not('[data-skip-responsive]'),
links = tabs.children('a'),
item = ul.append('<li class="tab responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link">&nbsp;</a><div class="dropdown tab-dropdown" style="display: none;"><div class="pointer"><div class="pointer-inner"></div></div><ul class="dropdown-contents" /></div></li>').find('li.responsive-tab'),
menu = item.find('.dropdown-contents'),
maxHeight = 0,
lastWidth = false,
responsive = false;
links.each(function() {
var link = $(this);
@ -196,8 +199,8 @@ function parseDocument(container) {
});
function check() {
var width = $body.width();
var height = $this.height();
var width = $body.width(),
height = $this.height();
if (!arguments.length && (!responsive || width <= lastWidth) && height <= maxHeight) {
return;
@ -213,7 +216,6 @@ function parseDocument(container) {
if (item.hasClass('dropdown-visible')) {
phpbb.toggleDropdown.call(item.find('a.responsive-tab-link').get(0));
}
return;
}
@ -221,26 +223,20 @@ function parseDocument(container) {
item.show();
menu.html('');
var availableTabs = tabs.filter(':not(.activetab, .responsive-tab)');
var total = availableTabs.length;
var i;
var tab;
var availableTabs = tabs.filter(':not(.activetab, .responsive-tab)'),
total = availableTabs.length,
i, tab;
for (i = total - 1; i >= 0; i--) {
for (i = total - 1; i >= 0; i --) {
tab = availableTabs.eq(i);
menu.prepend(tab.clone(true).removeClass('tab'));
tab.hide();
if ($this.height() <= maxHeight) {
menu.find('a').click(() => {
check(true);
});
menu.find('a').click(function() { check(true); });
return;
}
}
menu.find('a').click(() => {
check(true);
});
menu.find('a').click(function() { check(true); });
}
phpbb.registerDropdown(item.find('a.responsive-tab-link'), item.find('.dropdown'), { visibleClass: 'activetab', verticalDirection: 'down' });
@ -254,7 +250,7 @@ function parseDocument(container) {
* Run onload functions
*/
(function($) {
$(document).ready(() => {
$(document).ready(function() {
// Swap .nojs and .hasjs
$('body.nojs').toggleClass('nojs hasjs');
@ -263,7 +259,7 @@ function parseDocument(container) {
$('#' + this.getAttribute('data-focus')).focus();
});
parseDocument($('body'));
parse_document($('body'));
$('#questionnaire-form').css('display', 'none');
var $triggerConfiglist = $('#trigger-configlist');

View file

@ -1,421 +1,425 @@
/* global phpbb, statsData */
/* eslint no-var: 0 */
(function($) { // Avoid conflicts with other libraries
'use strict';
(function($) { // Avoid conflicts with other libraries
phpbb.prepareSendStats = function() {
var $form = $('#acp_help_phpbb');
var $dark = $('#darkenwrapper');
var $loadingIndicator;
'use strict';
$form.on('submit', function(event) {
var $this = $(this);
var currentTime = Math.floor(new Date().getTime() / 1000);
var statsTime = parseInt($this.find('input[name=help_send_statistics_time]').val(), 10);
event.preventDefault();
$this.unbind('submit');
phpbb.prepareSendStats = function() {
var $form = $('#acp_help_phpbb');
var $dark = $('#darkenwrapper');
var $loadingIndicator;
// Skip ajax request if form is submitted too early or send stats
// checkbox is not checked
if (!$this.find('input[name=help_send_statistics]').is(':checked') || statsTime > currentTime) {
$form.on('submit', function(event) {
var $this = $(this),
currentTime = Math.floor(new Date().getTime() / 1000),
statsTime = parseInt($this.find('input[name=help_send_statistics_time]').val(), 10);
event.preventDefault();
$this.unbind('submit');
// Skip ajax request if form is submitted too early or send stats
// checkbox is not checked
if (!$this.find('input[name=help_send_statistics]').is(':checked') ||
statsTime > currentTime) {
$form.find('input[type=submit]').click();
setTimeout(function() {
$form.find('input[type=submit]').click();
setTimeout(() => {
$form.find('input[type=submit]').click();
}, 300);
return;
}, 300);
return;
}
/**
* Handler for AJAX errors
*/
function errorHandler(jqXHR, textStatus, errorThrown) {
if (typeof console !== 'undefined' && console.log) {
console.log('AJAX error. status: ' + textStatus + ', message: ' + errorThrown);
}
phpbb.clearLoadingTimeout();
var errorText = '';
if (typeof errorThrown === 'string' && errorThrown.length > 0) {
errorText = errorThrown;
} else {
errorText = $dark.attr('data-ajax-error-text-' + textStatus);
if (typeof errorText !== 'string' || !errorText.length) {
errorText = $dark.attr('data-ajax-error-text');
}
}
phpbb.alert($dark.attr('data-ajax-error-title'), errorText);
}
/**
* This is a private function used to handle the callbacks, refreshes
* and alert. It calls the callback, refreshes the page if necessary, and
* displays an alert to the user and removes it after an amount of time.
*
* It cannot be called from outside this function, and is purely here to
* avoid repetition of code.
*
* @param {object} res The object sent back by the server.
*/
function returnHandler(res) {
phpbb.clearLoadingTimeout();
// If a confirmation is not required, display an alert and call the
// callbacks.
$dark.fadeOut(phpbb.alertTime);
if ($loadingIndicator) {
$loadingIndicator.fadeOut(phpbb.alertTime);
}
/**
* Handler for AJAX errors
*/
function errorHandler(jqXHR, textStatus, errorThrown) {
if (typeof console !== 'undefined' && console.log) {
console.log('AJAX error. status: ' + textStatus + ', message: ' + errorThrown);
}
phpbb.clearLoadingTimeout();
var errorText = '';
if (typeof errorThrown === 'string' && errorThrown.length > 0) {
errorText = errorThrown;
} else {
errorText = $dark.attr('data-ajax-error-text-' + textStatus);
if (typeof errorText !== 'string' || !errorText.length) {
errorText = $dark.attr('data-ajax-error-text');
}
}
phpbb.alert($dark.attr('data-ajax-error-title'), errorText);
}
/**
* This is a private function used to handle the callbacks, refreshes
* and alert. It calls the callback, refreshes the page if necessary, and
* displays an alert to the user and removes it after an amount of time.
*
* It cannot be called from outside this function, and is purely here to
* avoid repetition of code.
*
* @param {object} res The object sent back by the server.
*/
function returnHandler(res) {
phpbb.clearLoadingTimeout();
// If a confirmation is not required, display an alert and call the
// callbacks.
$dark.fadeOut(phpbb.alertTime);
if ($loadingIndicator) {
$loadingIndicator.fadeOut(phpbb.alertTime);
}
var $sendStatisticsSuccess = $('<input />', {
type: 'hidden',
name: 'send_statistics_response',
value: JSON.stringify(res),
});
$sendStatisticsSuccess.appendTo('p.submit-buttons');
// Finish actual form submission
$form.find('input[type=submit]').click();
}
$loadingIndicator = phpbb.loadingIndicator();
$.ajax({
url: $this.attr('data-ajax-action').replace('&amp;', '&'),
type: 'POST',
data: statsData,
success: returnHandler,
error: errorHandler,
cache: false,
}).always(() => {
if ($loadingIndicator && $loadingIndicator.is(':visible')) {
$loadingIndicator.fadeOut(phpbb.alertTime);
}
var $sendStatisticsSuccess = $('<input />', {
type: 'hidden',
name: 'send_statistics_response',
value: JSON.stringify(res),
});
$sendStatisticsSuccess.appendTo('p.submit-buttons');
// Finish actual form submission
$form.find('input[type=submit]').click();
}
$loadingIndicator = phpbb.loadingIndicator();
$.ajax({
url: $this.attr('data-ajax-action').replace('&amp;', '&'),
type: 'POST',
data: statsData,
success: returnHandler,
error: errorHandler,
cache: false,
}).always(function() {
if ($loadingIndicator && $loadingIndicator.is(':visible')) {
$loadingIndicator.fadeOut(phpbb.alertTime);
}
});
};
});
};
/**
* The following callbacks are for reording items. row_down
* is triggered when an item is moved down, and row_up is triggered when
* an item is moved up. It moves the row up or down, and deactivates /
* activates any up / down icons that require it (the ones at the top or bottom).
*/
phpbb.addAjaxCallback('row_down', function(res) {
if (typeof res.success === 'undefined' || !res.success) {
return;
}
var $firstTr = $(this).parents('tr'),
$secondTr = $firstTr.next();
$firstTr.insertAfter($secondTr);
});
phpbb.addAjaxCallback('row_up', function(res) {
if (typeof res.success === 'undefined' || !res.success) {
return;
}
var $secondTr = $(this).parents('tr'),
$firstTr = $secondTr.prev();
$secondTr.insertBefore($firstTr);
});
/**
* This callback replaces activate links with deactivate links and vice versa.
* It does this by replacing the text, and replacing all instances of "activate"
* in the href with "deactivate", and vice versa.
*/
phpbb.addAjaxCallback('activate_deactivate', function(res) {
var $this = $(this),
newHref = $this.attr('href');
$this.text(res.text);
if (newHref.indexOf('deactivate') !== -1) {
newHref = newHref.replace('deactivate', 'activate');
} else {
newHref = newHref.replace('activate', 'deactivate');
}
$this.attr('href', newHref);
});
/**
* The removes the parent row of the link or form that triggered the callback,
* and is good for stuff like the removal of forums.
*/
phpbb.addAjaxCallback('row_delete', function(res) {
if (res.SUCCESS !== false) {
$(this).parents('tr').remove();
}
});
/**
* This callback generates the VAPID keys for the web push notification service.
*/
phpbb.addAjaxCallback('generate_vapid_keys', () => {
/**
* The following callbacks are for reording items. row_down
* is triggered when an item is moved down, and row_up is triggered when
* an item is moved up. It moves the row up or down, and deactivates /
* activates any up / down icons that require it (the ones at the top or bottom).
*/
phpbb.addAjaxCallback('row_down', function(res) {
if (typeof res.success === 'undefined' || !res.success) {
return;
}
var $firstTr = $(this).parents('tr');
var $secondTr = $firstTr.next();
$firstTr.insertAfter($secondTr);
});
phpbb.addAjaxCallback('row_up', function(res) {
if (typeof res.success === 'undefined' || !res.success) {
return;
}
var $secondTr = $(this).parents('tr');
var $firstTr = $secondTr.prev();
$secondTr.insertBefore($firstTr);
});
/**
* This callback replaces activate links with deactivate links and vice versa.
* It does this by replacing the text, and replacing all instances of "activate"
* in the href with "deactivate", and vice versa.
*/
phpbb.addAjaxCallback('activate_deactivate', function(res) {
var $this = $(this);
var newHref = $this.attr('href');
$this.text(res.text);
if (newHref.indexOf('deactivate') === -1) {
newHref = newHref.replace('activate', 'deactivate');
} else {
newHref = newHref.replace('deactivate', 'activate');
}
$this.attr('href', newHref);
});
/**
* The removes the parent row of the link or form that triggered the callback,
* and is good for stuff like the removal of forums.
*/
phpbb.addAjaxCallback('row_delete', function(res) {
if (res.SUCCESS !== false) {
$(this).parents('tr').remove();
}
});
/**
* This callback generates the VAPID keys for the web push notification service.
*/
phpbb.addAjaxCallback('generate_vapid_keys', () => {
/**
* Generate VAPID keypair with public and private key string
*
* @returns {Promise<{privateKey: string, publicKey: string}|null>}
*/
async function generateVAPIDKeys() {
try {
* Generate VAPID keypair with public and private key string
*
* @returns {Promise<{privateKey: string, publicKey: string}|null>}
*/
async function generateVAPIDKeys() {
try {
// Generate a new key pair using the Subtle Crypto API
const keyPair = await crypto.subtle.generateKey(
{
name: 'ECDH',
namedCurve: 'P-256',
},
true,
[ 'deriveKey', 'deriveBits' ],
);
const keyPair = await crypto.subtle.generateKey(
{
name: 'ECDH',
namedCurve: 'P-256',
},
true,
[ 'deriveKey', 'deriveBits' ],
);
const privateKeyJwk = await crypto.subtle.exportKey('jwk', keyPair.privateKey);
const privateKeyString = privateKeyJwk.d;
const privateKeyJwk = await crypto.subtle.exportKey('jwk', keyPair.privateKey);
const privateKeyString = privateKeyJwk.d;
const publicKeyBuffer = await crypto.subtle.exportKey('raw', keyPair.publicKey);
const publicKeyString = phpbb.base64UrlEncode(phpbb.rawKeyToBase64(publicKeyBuffer));
const publicKeyBuffer = await crypto.subtle.exportKey('raw', keyPair.publicKey);
const publicKeyString = phpbb.base64UrlEncode(phpbb.rawKeyToBase64(publicKeyBuffer));
return {
privateKey: privateKeyString,
publicKey: publicKeyString,
};
} catch (error) {
console.error('Error generating keys with SubtleCrypto:', error);
return null;
}
return {
privateKey: privateKeyString,
publicKey: publicKeyString,
};
} catch (error) {
console.error('Error generating keys with SubtleCrypto:', error);
return null;
}
}
generateVAPIDKeys().then(keyPair => {
if (!keyPair) {
return;
}
const publicKeyInput = document.querySelector('#webpush_vapid_public');
const privateKeyInput = document.querySelector('#webpush_vapid_private');
publicKeyInput.value = keyPair.publicKey;
privateKeyInput.value = keyPair.privateKey;
});
});
/**
* Handler for submitting permissions form in chunks
* This call will submit permissions forms in chunks of 5 fieldsets.
*/
function submitPermissions() {
var $form = $('form#set-permissions'),
fieldsetList = $form.find('fieldset[id^=perm]'),
formDataSets = [],
dataSetIndex = 0,
$submitAllButton = $form.find('input[type=submit][name^=action]')[0],
$submitButton = $form.find('input[type=submit][data-clicked=true]')[0];
// Set proper start values for handling refresh of page
var permissionSubmitSize = 0,
permissionRequestCount = 0,
forumIds = [],
permissionSubmitFailed = false,
clearIndicator = true,
$loadingIndicator;
if ($submitAllButton !== $submitButton) {
fieldsetList = $form.find('fieldset#' + $submitButton.closest('fieldset.permissions').id);
}
$.each(fieldsetList, function(key, value) {
dataSetIndex = Math.floor(key / 5);
var $fieldset = $('fieldset#' + value.id);
if (key % 5 === 0) {
formDataSets[dataSetIndex] = $fieldset.find('select:visible, input:not([data-name])').serialize();
} else {
formDataSets[dataSetIndex] += '&' + $fieldset.find('select:visible, input:not([data-name])').serialize();
}
generateVAPIDKeys().then(keyPair => {
if (!keyPair) {
return;
}
const publicKeyInput = document.querySelector('#webpush_vapid_public');
const privateKeyInput = document.querySelector('#webpush_vapid_private');
publicKeyInput.value = keyPair.publicKey;
privateKeyInput.value = keyPair.privateKey;
});
// Find proper role value
var roleInput = $fieldset.find('input[name^=role][data-name]');
if (roleInput.val()) {
formDataSets[dataSetIndex] += '&' + roleInput.attr('name') + '=' + roleInput.val();
} else {
formDataSets[dataSetIndex] += '&' + roleInput.attr('name') + '=' +
$fieldset.find('select[name="' + roleInput.attr('name') + '"]').val();
}
});
/**
* Handler for submitting permissions form in chunks
* This call will submit permissions forms in chunks of 5 fieldsets.
*/
function submitPermissions() {
var $form = $('form#set-permissions');
var fieldsetList = $form.find('fieldset[id^=perm]');
var formDataSets = [];
var dataSetIndex = 0;
var $submitAllButton = $form.find('input[type=submit][name^=action]')[0];
var $submitButton = $form.find('input[type=submit][data-clicked=true]')[0];
permissionSubmitSize = formDataSets.length;
// Set proper start values for handling refresh of page
var permissionSubmitSize = 0;
var permissionRequestCount = 0;
var forumIds = [];
var permissionSubmitFailed = false;
var clearIndicator = true;
if ($submitAllButton !== $submitButton) {
fieldsetList = $form.find('fieldset#' + $submitButton.closest('fieldset.permissions').id);
// Add each forum ID to forum ID list to preserve selected forums
$.each($form.find('input[type=hidden][name^=forum_id]'), function(key, value) {
if (value.name.match(/^forum_id\[([0-9]+)\]$/)) {
forumIds.push(value.value);
}
});
$.each(fieldsetList, (key, value) => {
dataSetIndex = Math.floor(key / 5);
var $fieldset = $('fieldset#' + value.id);
if (key % 5 === 0) {
formDataSets[dataSetIndex] = $fieldset.find('select:visible, input:not([data-name])').serialize();
} else {
formDataSets[dataSetIndex] += '&' + $fieldset.find('select:visible, input:not([data-name])').serialize();
}
$loadingIndicator = phpbb.loadingIndicator();
// Find proper role value
var roleInput = $fieldset.find('input[name^=role][data-name]');
if (roleInput.val()) {
formDataSets[dataSetIndex] += '&' + roleInput.attr('name') + '=' + roleInput.val();
} else {
formDataSets[dataSetIndex] += '&' + roleInput.attr('name') + '='
+ $fieldset.find('select[name="' + roleInput.attr('name') + '"]').val();
}
});
/**
* Handler for submitted permissions form chunk
*
* @param {object} res Object returned by AJAX call
*/
function handlePermissionReturn(res) {
permissionRequestCount++;
var $dark = $('#darkenwrapper');
permissionSubmitSize = formDataSets.length;
if (res.S_USER_WARNING) {
phpbb.alert(res.MESSAGE_TITLE, res.MESSAGE_TEXT);
permissionSubmitFailed = true;
} else if (!permissionSubmitFailed && res.S_USER_NOTICE) {
// Display success message at the end of submitting the form
if (permissionRequestCount >= permissionSubmitSize) {
clearIndicator = true;
// Add each forum ID to forum ID list to preserve selected forums
$.each($form.find('input[type=hidden][name^=forum_id]'), (key, value) => {
if (value.name.match(/^forum_id\[([0-9]+)\]$/)) {
forumIds.push(value.value);
}
});
var $alert = phpbb.alert(res.MESSAGE_TITLE, res.MESSAGE_TEXT);
var $alertBoxLink = $alert.find('p.alert_text > a');
var $loadingIndicator = phpbb.loadingIndicator();
// Create form to submit instead of normal "Back to previous page" link
if ($alertBoxLink) {
// Remove forum_id[] from URL
$alertBoxLink.attr('href', $alertBoxLink.attr('href').replace(/(&forum_id\[\]=[0-9]+)/g, ''));
const $previousPageForm = $('<form>').attr({
action: $alertBoxLink.attr('href'),
method: 'post',
});
/**
* Handler for submitted permissions form chunk
*
* @param {object} res Object returned by AJAX call
*/
function handlePermissionReturn(res) {
permissionRequestCount++;
var $dark = $('#darkenwrapper');
$.each(forumIds, function(key, value) {
$previousPageForm.append($('<input>').attr({
type: 'text',
name: 'forum_id[]',
value: value,
}));
});
if (res.S_USER_WARNING) {
phpbb.alert(res.MESSAGE_TITLE, res.MESSAGE_TEXT);
permissionSubmitFailed = true;
} else if (!permissionSubmitFailed && res.S_USER_NOTICE) {
// Display success message at the end of submitting the form
if (permissionRequestCount >= permissionSubmitSize) {
clearIndicator = true;
$alertBoxLink.on('click', function(e) {
$('body').append($previousPageForm);
e.preventDefault();
$previousPageForm.submit();
});
}
var $alert = phpbb.alert(res.MESSAGE_TITLE, res.MESSAGE_TEXT);
var $alertBoxLink = $alert.find('p.alert_text > a');
// Do not allow closing alert
$dark.off('click');
$alert.find('.alert_close').hide();
// Create form to submit instead of normal "Back to previous page" link
if ($alertBoxLink) {
// Remove forum_id[] from URL
$alertBoxLink.attr('href', $alertBoxLink.attr('href').replace(/(&forum_id\[\]=[0-9]+)/g, ''));
const $previousPageForm = $('<form>').attr({
action: $alertBoxLink.attr('href'),
if (typeof res.REFRESH_DATA !== 'undefined') {
setTimeout(function() {
// Create forum to submit using POST. This will prevent
// exceeding the maximum length of URLs
const $form = $('<form>').attr({
action: res.REFRESH_DATA.url.replace(/(&forum_id\[\]=[0-9]+)/g, ''),
method: 'post',
});
$.each(forumIds, (key, value) => {
$previousPageForm.append($('<input>').attr({
$.each(forumIds, function(key, value) {
$form.append($('<input>').attr({
type: 'text',
name: 'forum_id[]',
value,
value: value,
}));
});
$alertBoxLink.on('click', e => {
$('body').append($previousPageForm);
e.preventDefault();
$previousPageForm.submit();
$('body').append($form);
// Hide the alert even if we refresh the page, in case the user
// presses the back button.
$dark.fadeOut(phpbb.alertTime, function() {
if (typeof $alert !== 'undefined') {
$alert.hide();
}
});
}
// Do not allow closing alert
$dark.off('click');
$alert.find('.alert_close').hide();
if (typeof res.REFRESH_DATA !== 'undefined') {
setTimeout(() => {
// Create forum to submit using POST. This will prevent
// exceeding the maximum length of URLs
const $form = $('<form>').attr({
action: res.REFRESH_DATA.url.replace(/(&forum_id\[\]=[0-9]+)/g, ''),
method: 'post',
});
$.each(forumIds, (key, value) => {
$form.append($('<input>').attr({
type: 'text',
name: 'forum_id[]',
value,
}));
});
$('body').append($form);
// Hide the alert even if we refresh the page, in case the user
// presses the back button.
$dark.fadeOut(phpbb.alertTime, () => {
if (typeof $alert !== 'undefined') {
$alert.hide();
}
});
// Submit form
$form.submit();
}, res.REFRESH_DATA.time * 1000); // Server specifies time in seconds
}
} else {
// Still more forms to submit, so do not clear indicator
clearIndicator = false;
}
}
if (clearIndicator) {
phpbb.clearLoadingTimeout();
if ($loadingIndicator) {
$loadingIndicator.fadeOut(phpbb.alertTime);
// Submit form
$form.submit();
}, res.REFRESH_DATA.time * 1000); // Server specifies time in seconds
}
} else {
// Still more forms to submit, so do not clear indicator
clearIndicator = false;
}
}
// Create AJAX request for each form data set
$.each(formDataSets, (key, formData) => {
$.ajax({
url: $form.action,
type: 'POST',
data: formData + '&' + $submitButton.name + '=' + encodeURIComponent($submitButton.value)
+ '&creation_time=' + $form.find('input[type=hidden][name=creation_time]')[0].value
+ '&form_token=' + $form.find('input[type=hidden][name=form_token]')[0].value
+ '&' + $form.children('input[type=hidden]').serialize()
+ '&' + $form.find('input[type=checkbox][name^=inherit]').serialize(),
success: handlePermissionReturn,
error: handlePermissionReturn,
});
if (clearIndicator) {
phpbb.clearLoadingTimeout();
if ($loadingIndicator) {
$loadingIndicator.fadeOut(phpbb.alertTime);
}
}
}
// Create AJAX request for each form data set
$.each(formDataSets, function(key, formData) {
$.ajax({
url: $form.action,
type: 'POST',
data: formData + '&' + $submitButton.name + '=' + encodeURIComponent($submitButton.value) +
'&creation_time=' + $form.find('input[type=hidden][name=creation_time]')[0].value +
'&form_token=' + $form.find('input[type=hidden][name=form_token]')[0].value +
'&' + $form.children('input[type=hidden]').serialize() +
'&' + $form.find('input[type=checkbox][name^=inherit]').serialize(),
success: handlePermissionReturn,
error: handlePermissionReturn,
});
});
}
$('[data-ajax]').each(function() {
var $this = $(this),
ajax = $this.attr('data-ajax');
if (ajax !== 'false') {
var fn = (ajax !== 'true') ? ajax : null;
phpbb.ajaxify({
selector: this,
refresh: $this.attr('data-refresh') !== undefined,
callback: fn,
});
}
});
/**
* Automatically resize textarea
*/
$(function() {
phpbb.resizeTextArea($('textarea:not(.no-auto-resize)'), { minHeight: 75 });
var $setPermissionsForm = $('form#set-permissions');
if ($setPermissionsForm.length) {
$setPermissionsForm.on('submit', function(e) {
submitPermissions();
e.preventDefault();
});
$setPermissionsForm.find('input[type=submit]').click(function() {
$('input[type=submit]', $(this).parents($('form#set-permissions'))).removeAttr('data-clicked');
$(this).attr('data-clicked', true);
});
}
$('[data-ajax]').each(function() {
var $this = $(this);
var ajax = $this.attr('data-ajax');
// Handle date option changes
const dateoptionSelect = document.getElementById('dateoptions');
if (dateoptionSelect) {
dateoptionSelect.addEventListener('change', function() {
const dateoptionInput = document.getElementById(this.getAttribute('data-dateoption'));
if (this.value === 'custom') {
dateoptionInput.value = this.getAttribute('data-dateoption-default');
} else {
dateoptionInput.value = this.value;
}
});
}
if (ajax !== 'false') {
var fn = (ajax === 'true') ? null : ajax;
phpbb.ajaxify({
selector: this,
refresh: $this.attr('data-refresh') !== undefined,
callback: fn,
});
}
});
if ($('#acp_help_phpbb')) {
phpbb.prepareSendStats();
}
});
/**
* Automatically resize textarea
*/
$(() => {
phpbb.resizeTextArea($('textarea:not(.no-auto-resize)'), { minHeight: 75 });
var $setPermissionsForm = $('form#set-permissions');
if ($setPermissionsForm.length) {
$setPermissionsForm.on('submit', e => {
submitPermissions();
e.preventDefault();
});
$setPermissionsForm.find('input[type=submit]').click(function() {
$('input[type=submit]', $(this).parents($('form#set-permissions'))).removeAttr('data-clicked');
$(this).attr('data-clicked', true);
});
}
// Handle date option changes
const dateoptionSelect = document.getElementById('dateoptions');
if (dateoptionSelect) {
dateoptionSelect.addEventListener('change', function() {
const dateoptionInput = document.getElementById(this.getAttribute('data-dateoption'));
if (this.value === 'custom') {
dateoptionInput.value = this.getAttribute('data-dateoption-default');
} else {
dateoptionInput.value = this.value;
}
});
}
if ($('#acp_help_phpbb')) {
phpbb.prepareSendStats();
}
});
})(jQuery); // Avoid conflicts with other libraries

View file

@ -13,11 +13,12 @@ function display_checkboxes(status) {
var cb = document.getElementsByTagName('input');
var display;
//show
if (status) {
// show
display = 'inline';
} else {
// hide
}
//hide
else {
display = 'none';
}
@ -34,10 +35,10 @@ function display_checkboxes(status) {
* value = 0 (hidden) till 10 (fully visible)
*/
function set_opacity(e, value) {
e.style.opacity = value / 10;
e.style.opacity = value/10;
// IE opacity currently turned off, because of its astronomical stupidity
// e.style.filter = 'alpha(opacity=' + value*10 + ')';
//IE opacity currently turned off, because of its astronomical stupidity
//e.style.filter = 'alpha(opacity=' + value*10 + ')';
}
/**
@ -75,11 +76,11 @@ function reset_opacity(status, except_id) {
}
}
if (typeof (except_id) !== 'undefined') {
if (typeof(except_id) !== 'undefined') {
set_opacity(document.getElementById('perm' + except_id), 10);
}
// reset checkboxes too
//reset checkboxes too
marklist('set-permissions', 'inherit', !status);
}
@ -89,14 +90,13 @@ function reset_opacity(status, except_id) {
* rb = array of radiobuttons
*/
function get_radio_status(index, rb) {
for (var i = index; i < rb.length; i += 3 ) {
for (var i = index; i < rb.length; i = i + 3 ) {
if (rb[i].checked !== true) {
if (i > index) {
// at least one is true, but not all (custom)
//at least one is true, but not all (custom)
return 2;
}
// first one is not true
//first one is not true
return 0;
}
}
@ -115,7 +115,7 @@ function set_colours(id, init, quick) {
var table = document.getElementById('table' + id);
var tab = document.getElementById('tab' + id);
if (typeof (quick) !== 'undefined') {
if (typeof(quick) !== 'undefined') {
tab.className = 'permissions-preset-' + quick + ' activetab';
return;
}
@ -165,7 +165,7 @@ function init_colours(block_id) {
}
}
tab.className += ' activetab';
tab.className = tab.className + ' activetab';
}
/**
@ -174,12 +174,11 @@ function init_colours(block_id) {
* adv = we are opening advanced permissions
* view = called from view permissions
*/
// eslint-disable-next-line max-params
function swap_options(pmask, fmask, cat, adv, view) {
id = pmask + fmask + cat;
active_option = active_pmask + active_fmask + active_cat;
var old_tab = document.getElementById('tab' + active_option);
var old_tab = document.getElementById('tab' + active_option);
var new_tab = document.getElementById('tab' + id);
var adv_block = document.getElementById('advanced' + pmask + fmask);
@ -201,14 +200,14 @@ function swap_options(pmask, fmask, cat, adv, view) {
display_checkboxes(true);
reset_opacity(1);
} else if (adv) {
// Checkbox might have been clicked, but we need full visibility
//Checkbox might have been clicked, but we need full visibility
display_checkboxes(true);
reset_opacity(1);
}
// set active tab
old_tab.className = old_tab.className.replace(/ activetab/g, '');
new_tab.className += ' activetab';
old_tab.className = old_tab.className.replace(/\ activetab/g, '');
new_tab.className = new_tab.className + ' activetab';
if (id === active_option && adv !== true) {
return;
@ -216,7 +215,7 @@ function swap_options(pmask, fmask, cat, adv, view) {
phpbb.toggleDisplay('options' + active_option, -1);
// hiding and showing the checkbox
//hiding and showing the checkbox
if (document.getElementById('checkbox' + active_pmask + active_fmask)) {
phpbb.toggleDisplay('checkbox' + pmask + fmask, -1);
@ -232,7 +231,6 @@ function swap_options(pmask, fmask, cat, adv, view) {
if (!view) {
phpbb.toggleDisplay('advanced' + pmask + fmask, 1);
}
phpbb.toggleDisplay('options' + id, 1);
active_pmask = pmask;
@ -254,7 +252,7 @@ function mark_options(id, s) {
var rb = t.getElementsByTagName('input');
for (var r = 0; r < rb.length; r++) {
if (rb[r].id.substr(rb[r].id.length - 1) === s) {
if (rb[r].id.substr(rb[r].id.length-1) === s) {
rb[r].checked = true;
}
}
@ -270,7 +268,7 @@ function mark_one_option(id, field_name, s) {
var rb = t.getElementsByTagName('input');
for (var r = 0; r < rb.length; r++) {
if (rb[r].id.substr(rb[r].id.length - field_name.length - 3, field_name.length) === field_name && rb[r].id.substr(rb[r].id.length - 1) === s) {
if (rb[r].id.substr(rb[r].id.length-field_name.length-3, field_name.length) === field_name && rb[r].id.substr(rb[r].id.length-1) === s) {
rb[r].checked = true;
}
}
@ -293,10 +291,10 @@ function reset_role(id) {
}
// Before resetting the role dropdown, try and match any permission role
var parent = t.parentNode;
var roleId = match_role_settings(id.replace('role', 'perm'));
var text = no_role_assigned;
var index = 0;
var parent = t.parentNode,
roleId = match_role_settings(id.replace('role', 'perm')),
text = no_role_assigned,
index = 0;
// If a role permissions was matched, grab that option's value and index
if (roleId) {
@ -332,9 +330,7 @@ function set_role_settings(role_id, target_id) {
mark_options(target_id, 'u');
for (var r in settings) {
if (Object.prototype.hasOwnProperty.call(settings, r)) {
mark_one_option(target_id, r, (settings[r] === 1) ? 'y' : 'n');
}
mark_one_option(target_id, r, (settings[r] === 1) ? 'y' : 'n');
}
}
@ -345,9 +341,9 @@ function set_role_settings(role_id, target_id) {
* @return {number} The permission role identifier
*/
function match_role_settings(id) {
var fieldset = document.getElementById(id);
var radios = fieldset.getElementsByTagName('input');
var set = {};
var fieldset = document.getElementById(id),
radios = fieldset.getElementsByTagName('input'),
set = {};
// Iterate over all the radio buttons
for (var i = 0; i < radios.length; i++) {
@ -363,7 +359,8 @@ function match_role_settings(id) {
set = sort_and_stringify(set);
// Iterate over the available role options and return the first match
for (var r in role_options) {
for (var r in role_options)
{
if (sort_and_stringify(role_options[r]) === set) {
return parseInt(r, 10);
}
@ -379,7 +376,7 @@ function match_role_settings(id) {
* @return {string} The sorted object as a string
*/
function sort_and_stringify(obj) {
return JSON.stringify(Object.keys(obj).sort().reduce((result, key) => {
return JSON.stringify(Object.keys(obj).sort().reduce(function(result, key) {
result[key] = obj[key];
return result;
}, {}));

View file

@ -14,209 +14,213 @@ phpBB Development Team:
*/
(function($) { // Avoid conflicts with other libraries
'use strict';
var tooltips = [];
'use strict';
/**
* Enable tooltip replacements for selects
* @param {string} id ID tag of select
* @param {string} headline Text that should appear on top of tooltip
* @param {string} [subId] Sub ID that should only be using tooltips (optional)
*/
phpbb.enableTooltipsSelect = function(id, headline, subId) {
var $links;
var tooltips = [];
var hold = $('<span />', {
id: '_tooltip_container',
css: {
position: 'absolute',
},
});
/**
* Enable tooltip replacements for selects
* @param {string} id ID tag of select
* @param {string} headline Text that should appear on top of tooltip
* @param {string} [subId] Sub ID that should only be using tooltips (optional)
*/
phpbb.enableTooltipsSelect = function(id, headline, subId) {
var $links, hold;
$('body').append(hold);
hold = $('<span />', {
id: '_tooltip_container',
css: {
position: 'absolute',
},
});
if (id) {
$links = $('.roles-options li', '#' + id);
} else {
$links = $('.roles-options li');
}
$('body').append(hold);
$links.each(function() {
var $this = $(this);
if (!id) {
$links = $('.roles-options li');
} else {
$links = $('.roles-options li', '#' + id);
}
if (subId) {
if ($this.parent().attr('id').substr(0, subId.length) === subId) {
phpbb.prepareTooltips($this, headline);
}
} else {
$links.each(function() {
var $this = $(this);
if (subId) {
if ($this.parent().attr('id').substr(0, subId.length) === subId) {
phpbb.prepareTooltips($this, headline);
}
});
};
/**
* Prepare elements to replace
*
* @param {jQuery} $element Element to prepare for tooltips
* @param {string} headText Text heading to display
*/
phpbb.prepareTooltips = function($element, headText) {
var text = $element.attr('data-title');
if (text === null || text.length === 0) {
return;
}
var $title = $('<span />', {
class: 'top',
css: {
display: 'block',
},
})
.append(document.createTextNode(headText));
var $desc = $('<span />', {
class: 'bottom',
html: text,
css: {
display: 'block',
},
});
var $tooltip = $('<span />', {
class: 'tooltip',
css: {
display: 'block',
},
})
.append($title)
.append($desc);
tooltips[$element.attr('data-id')] = $tooltip;
$element.on('mouseover', phpbb.showTooltip);
$element.on('mouseout', phpbb.hideTooltip);
};
/**
* Show tooltip
*
* @param {object} $element Element passed by .on()
*/
phpbb.showTooltip = function($element) {
var $this = $($element.target);
$('#_tooltip_container').append(tooltips[$this.attr('data-id')]);
phpbb.positionTooltip($this);
};
/**
* Hide tooltip
*/
phpbb.hideTooltip = function() {
var d = document.getElementById('_tooltip_container');
if (d.childNodes.length > 0) {
d.removeChild(d.firstChild);
}
};
/**
* Correct positioning of tooltip container
*
* @param {jQuery} $element Tooltip element that should be positioned
*/
phpbb.positionTooltip = function($element) {
$element = $element.parent();
var offset = $element.offset();
if ($('body').hasClass('rtl')) {
$('#_tooltip_container').css({
top: offset.top + 30,
left: offset.left + 255,
});
} else {
$('#_tooltip_container').css({
top: offset.top + 30,
left: offset.left - 205,
phpbb.prepareTooltips($this, headline);
}
});
};
/**
* Prepare elements to replace
*
* @param {jQuery} $element Element to prepare for tooltips
* @param {string} headText Text heading to display
*/
phpbb.prepareTooltips = function($element, headText) {
var $tooltip, text, $desc, $title;
text = $element.attr('data-title');
if (text === null || text.length === 0) {
return;
}
$title = $('<span />', {
class: 'top',
css: {
display: 'block',
},
})
.append(document.createTextNode(headText));
$desc = $('<span />', {
class: 'bottom',
html: text,
css: {
display: 'block',
},
});
$tooltip = $('<span />', {
class: 'tooltip',
css: {
display: 'block',
},
})
.append($title)
.append($desc);
tooltips[$element.attr('data-id')] = $tooltip;
$element.on('mouseover', phpbb.showTooltip);
$element.on('mouseout', phpbb.hideTooltip);
};
/**
* Show tooltip
*
* @param {object} $element Element passed by .on()
*/
phpbb.showTooltip = function($element) {
var $this = $($element.target);
$('#_tooltip_container').append(tooltips[$this.attr('data-id')]);
phpbb.positionTooltip($this);
};
/**
* Hide tooltip
*/
phpbb.hideTooltip = function() {
var d = document.getElementById('_tooltip_container');
if (d.childNodes.length > 0) {
d.removeChild(d.firstChild);
}
};
/**
* Correct positioning of tooltip container
*
* @param {jQuery} $element Tooltip element that should be positioned
*/
phpbb.positionTooltip = function($element) {
var offset;
$element = $element.parent();
offset = $element.offset();
if ($('body').hasClass('rtl')) {
$('#_tooltip_container').css({
top: offset.top + 30,
left: offset.left + 255,
});
} else {
$('#_tooltip_container').css({
top: offset.top + 30,
left: offset.left - 205,
});
}
};
/**
* Prepare roles drop down select
*/
phpbb.prepareRolesDropdown = function() {
var $options = $('.roles-options li');
// Display span and hide select
$('.roles-options > span').css('display', 'block');
$('.roles-options > select').hide();
$('.roles-options > input[type=hidden]').each(function() {
var $this = $(this);
if ($this.attr('data-name') && !$this.attr('name')) {
$this.attr('name', $this.attr('data-name'));
}
});
// Prepare highlighting of select options and settings update
$options.each(function() {
var $this = $(this);
var $rolesOptions = $this.closest('.roles-options');
var $span = $rolesOptions.children('span');
// Correctly show selected option
if (typeof $this.attr('data-selected') !== 'undefined') {
$rolesOptions
.children('span')
.text($this.text())
.attr('data-default', $this.text())
.attr('data-default-val', $this.attr('data-id'));
// Save default text of drop down if there is no default set yet
if (typeof $span.attr('data-default') === 'undefined') {
$span.attr('data-default', $span.text());
}
// Prepare resetting drop down on form reset
$this.closest('form').on('reset', function() {
$span.text($span.attr('data-default'));
$rolesOptions.children('input[type=hidden]')
.val($span.attr('data-default-val'));
});
}
};
/**
* Prepare roles drop down select
*/
phpbb.prepareRolesDropdown = function() {
var $options = $('.roles-options li');
// Display span and hide select
$('.roles-options > span').css('display', 'block');
$('.roles-options > select').hide();
$('.roles-options > input[type=hidden]').each(function() {
$this.on('mouseover', function() {
var $this = $(this);
if ($this.attr('data-name') && !$this.attr('name')) {
$this.attr('name', $this.attr('data-name'));
}
});
// Prepare highlighting of select options and settings update
$options.each(function() {
$options.removeClass('roles-highlight');
$this.addClass('roles-highlight');
}).on('click', function() {
var $this = $(this);
var $rolesOptions = $this.closest('.roles-options');
var $span = $rolesOptions.children('span');
// Correctly show selected option
if (typeof $this.attr('data-selected') !== 'undefined') {
$rolesOptions
.children('span')
.text($this.text())
.attr('data-default', $this.text())
.attr('data-default-val', $this.attr('data-id'));
// Update settings
set_role_settings($this.attr('data-id'), $this.attr('data-target-id'));
init_colours($this.attr('data-target-id').replace('advanced', ''));
// Save default text of drop down if there is no default set yet
if (typeof $span.attr('data-default') === 'undefined') {
$span.attr('data-default', $span.text());
}
// Set selected setting
$rolesOptions.children('span')
.text($this.text());
$rolesOptions.children('input[type=hidden]')
.val($this.attr('data-id'));
// Prepare resetting drop down on form reset
$this.closest('form').on('reset', () => {
$span.text($span.attr('data-default'));
$rolesOptions.children('input[type=hidden]')
.val($span.attr('data-default-val'));
});
}
$this.on('mouseover', function() {
var $this = $(this);
$options.removeClass('roles-highlight');
$this.addClass('roles-highlight');
}).on('click', function() {
var $this = $(this);
var $rolesOptions = $this.closest('.roles-options');
// Update settings
// eslint-disable-next-line no-undef
set_role_settings($this.attr('data-id'), $this.attr('data-target-id'));
// eslint-disable-next-line no-undef
init_colours($this.attr('data-target-id').replace('advanced', ''));
// Set selected setting
$rolesOptions.children('span')
.text($this.text());
$rolesOptions.children('input[type=hidden]')
.val($this.attr('data-id'));
// Trigger hiding of selection options
$('body').trigger('click');
});
// Trigger hiding of selection options
$('body').trigger('click');
});
};
// Run onload functions for RolesDropdown and tooltips
$(() => {
// Enable tooltips
phpbb.enableTooltipsSelect('set-permissions', $('#set-permissions').attr('data-role-description'), 'role');
// Prepare dropdown
phpbb.prepareRolesDropdown();
});
};
// Run onload functions for RolesDropdown and tooltips
$(function() {
// Enable tooltips
phpbb.enableTooltipsSelect('set-permissions', $('#set-permissions').attr('data-role-description'), 'role');
// Prepare dropdown
phpbb.prepareRolesDropdown();
});
})(jQuery); // Avoid conflicts with other libraries

File diff suppressed because it is too large Load diff

View file

@ -4,9 +4,6 @@
/* eslint no-unused-vars: 0 */
/* eslint no-var: 0 */
var form_name = 'postform';
var text_name = 'message';
/**
* bbCode control by subBlue design [ www.subBlue.com ]
* Includes unixsafe colour palette selector by SHS`
@ -41,7 +38,7 @@ function initInsertions() {
var textarea = doc.forms[form_name].elements[text_name];
if (is_ie && typeof (baseHeight) !== 'number') {
if (is_ie && typeof(baseHeight) !== 'number') {
textarea.focus();
baseHeight = doc.selection.createRange().duplicate().boundingHeight;
@ -55,11 +52,11 @@ function initInsertions() {
* bbstyle
*/
function bbstyle(bbnumber) {
if (bbnumber === -1) {
if (bbnumber !== -1) {
bbfontstyle(bbtags[bbnumber], bbtags[bbnumber+1]);
} else {
insert_text('[*]');
document.forms[form_name].elements[text_name].focus();
} else {
bbfontstyle(bbtags[bbnumber], bbtags[bbnumber + 1]);
}
}
@ -91,7 +88,7 @@ function bbfontstyle(bbopen, bbclose) {
return;
}
// The new position for the cursor after adding the bbcode
//The new position for the cursor after adding the bbcode
var caret_pos = getCaretPosition(textarea).start;
var new_pos = caret_pos + bbopen.length;
@ -103,8 +100,9 @@ function bbfontstyle(bbopen, bbclose) {
if (!isNaN(textarea.selectionStart)) {
textarea.selectionStart = new_pos;
textarea.selectionEnd = new_pos;
} else if (document.selection) {
// IE
}
// IE
else if (document.selection) {
var range = textarea.createTextRange();
range.move('character', new_pos);
range.select();
@ -120,10 +118,10 @@ function bbfontstyle(bbopen, bbclose) {
function insert_text(text, spaces, popup) {
var textarea;
if (popup) {
textarea = opener.document.forms[form_name].elements[text_name];
} else {
if (!popup) {
textarea = document.forms[form_name].elements[text_name];
} else {
textarea = opener.document.forms[form_name].elements[text_name];
}
if (spaces) {
@ -148,7 +146,7 @@ function insert_text(text, spaces, popup) {
var caret_pos = textarea.caretPos;
caret_pos.text = caret_pos.text.charAt(caret_pos.text.length - 1) === ' ' ? caret_pos.text + text + ' ' : caret_pos.text + text;
} else {
textarea.value += text;
textarea.value = textarea.value + text;
}
if (!popup) {
@ -177,7 +175,6 @@ function addquote(post_id, username, l_wrote, attributes) {
// Backwards compatibility
l_wrote = 'wrote';
}
if (typeof attributes !== 'object') {
attributes = {};
}
@ -202,10 +199,10 @@ function addquote(post_id, username, l_wrote, attributes) {
if (divarea.innerHTML) {
theSelection = divarea.innerHTML.replace(/<br>/ig, '\n');
theSelection = theSelection.replace(/<br\/>/ig, '\n');
theSelection = theSelection.replace(/&lt;/ig, '<');
theSelection = theSelection.replace(/&gt;/ig, '>');
theSelection = theSelection.replace(/&amp;/ig, '&');
theSelection = theSelection.replace(/&nbsp;/ig, ' ');
theSelection = theSelection.replace(/&lt\;/ig, '<');
theSelection = theSelection.replace(/&gt\;/ig, '>');
theSelection = theSelection.replace(/&amp\;/ig, '&');
theSelection = theSelection.replace(/&nbsp\;/ig, ' ');
} else if (document.all) {
theSelection = divarea.innerText;
} else if (divarea.textContent) {
@ -220,7 +217,7 @@ function addquote(post_id, username, l_wrote, attributes) {
attributes.author = username;
insert_text(generateQuote(theSelection, attributes));
} else {
insert_text(username + ' ' + l_wrote + ':\n');
insert_text(username + ' ' + l_wrote + ':' + '\n');
var lines = split_lines(theSelection);
for (i = 0; i < lines.length; i++) {
insert_text('> ' + lines[i] + '\n');
@ -250,14 +247,12 @@ function generateQuote(text, attributes) {
quote += '=' + formatAttributeValue(attributes.author);
delete attributes.author;
}
for (var name in attributes) {
if (Object.hasOwn(attributes, name)) {
if (attributes.hasOwnProperty(name)) {
var value = attributes[name];
quote += ' ' + name + '=' + formatAttributeValue(value.toString());
}
}
quote += ']';
var newline = ((quote + text + '[/quote]').length > 80 || text.indexOf('\n') > -1) ? '\n' : '';
quote += newline + text + newline + '[/quote]';
@ -280,20 +275,19 @@ function formatAttributeValue(str) {
// Return as-is if it contains none of: space, ' " \ or ]
return str;
}
var singleQuoted = '\'' + str.replace(/[\\']/g, '\\$&') + '\'';
var doubleQuoted = '"' + str.replace(/[\\"]/g, '\\$&') + '"';
var singleQuoted = '\'' + str.replace(/[\\']/g, '\\$&') + '\'',
doubleQuoted = '"' + str.replace(/[\\"]/g, '\\$&') + '"';
return (singleQuoted.length < doubleQuoted.length) ? singleQuoted : doubleQuoted;
}
function split_lines(text) {
var lines = text.split('\n');
var splitLines = [];
var splitLines = new Array();
var j = 0;
var i;
for (i = 0; i < lines.length; i++) {
for(i = 0; i < lines.length; i++) {
if (lines[i].length <= 80) {
splitLines[j] = lines[i];
j++;
@ -312,10 +306,9 @@ function split_lines(text) {
j++;
}
}
while (splitAt !== -1);
while(splitAt !== -1);
}
}
return splitLines;
}
@ -323,12 +316,12 @@ function split_lines(text) {
* From http://www.massless.org/mozedit/
*/
function mozWrap(txtarea, open, close) {
var selLength = (typeof (txtarea.textLength) === 'undefined') ? txtarea.value.length : txtarea.textLength;
var selLength = (typeof(txtarea.textLength) === 'undefined') ? txtarea.value.length : txtarea.textLength;
var selStart = txtarea.selectionStart;
var selEnd = txtarea.selectionEnd;
var scrollTop = txtarea.scrollTop;
var s1 = (txtarea.value).substring(0, selStart);
var s1 = (txtarea.value).substring(0,selStart);
var s2 = (txtarea.value).substring(selStart, selEnd);
var s3 = (txtarea.value).substring(selEnd, selLength);
@ -337,6 +330,8 @@ function mozWrap(txtarea, open, close) {
txtarea.selectionEnd = selEnd + open.length;
txtarea.focus();
txtarea.scrollTop = scrollTop;
return;
}
/**
@ -367,8 +362,9 @@ function getCaretPosition(txtarea) {
if (txtarea.selectionStart || txtarea.selectionStart === 0) {
caretPos.start = txtarea.selectionStart;
caretPos.end = txtarea.selectionEnd;
} else if (document.selection) {
// dirty and slow IE way
}
// dirty and slow IE way
else if (document.selection) {
// get current selection
var range = document.selection.createRange();

View file

@ -49,10 +49,7 @@
var $warningContainer = $('#warning-container');
var $logContainer = $('#log-container');
var $title;
var $description;
var $msgElement;
var arraySize = messages.length;
var $title, $description, $msgElement, arraySize = messages.length;
for (var i = 0; i < arraySize; i++) {
$msgElement = $('<div />');
$title = $('<strong />');
@ -65,19 +62,24 @@
$msgElement.append($description);
}
if (type === 'error') {
$msgElement.addClass('errorbox');
$errorContainer.append($msgElement);
} else if (type === 'warning') {
$msgElement.addClass('warningbox');
$warningContainer.append($msgElement);
} else if (type === 'log') {
$msgElement.addClass('log');
$logContainer.prepend($msgElement);
$logContainer.addClass('show_log_container');
} else if (type === 'success') {
$msgElement.addClass('successbox');
$errorContainer.prepend($msgElement);
switch (type) {
case 'error':
$msgElement.addClass('errorbox');
$errorContainer.append($msgElement);
break;
case 'warning':
$msgElement.addClass('warningbox');
$warningContainer.append($msgElement);
break;
case 'log':
$msgElement.addClass('log');
$logContainer.prepend($msgElement);
$logContainer.addClass('show_log_container');
break;
case 'success':
$msgElement.addClass('successbox');
$errorContainer.prepend($msgElement);
break;
}
}
}
@ -85,12 +87,10 @@
/**
* Render a download box
*/
function addDownloadBox(downloadArray) {
function addDownloadBox(downloadArray)
{
var $downloadContainer = $('#download-wrapper');
var $downloadBox;
var $title;
var $content;
var $link;
var $downloadBox, $title, $content, $link;
for (var i = 0; i < downloadArray.length; i++) {
$downloadBox = $('<div />');
@ -119,7 +119,8 @@
/**
* Render update files' status
*/
function addUpdateFileStatus(fileStatus) {
function addUpdateFileStatus(fileStatus)
{
var $statusContainer = $('#file-status-wrapper');
$statusContainer.html(fileStatus);
}
@ -142,10 +143,8 @@
* @param navObj
*/
function updateNavbarStatus(navObj) {
var navID;
var $stage;
var $stageListItem;
var $active = $('#activemenu');
var navID, $stage, $stageListItem, $active;
$active = $('#activemenu');
if (navObj.hasOwnProperty('finished')) {
// This should be an Array
@ -183,11 +182,7 @@
* @param progressObject
*/
function setProgress(progressObject) {
var $statusText;
var $progressBar;
var $progressText;
var $progressFiller;
var $progressFillerText;
var $statusText, $progressBar, $progressText, $progressFiller, $progressFillerText;
if (progressObject.task_name.length) {
if (!progressBarTriggered) {
@ -254,8 +249,8 @@
}
// Redirects user
function redirect(url, useAjax) {
if (useAjax) {
function redirect(url, use_ajax) {
if (use_ajax) {
resetPolling();
var xhReq = createXhrObject();
@ -284,7 +279,6 @@
if (window.console) {
console.log('Failed to parse JSON object\n\nMessage: ' + err.message + '\n\nServer Response: ' + messageJSON);
} else {
// eslint-disable-next-line no-alert
alert('Failed to parse JSON object\n\nMessage: ' + err.message + '\n\nServer Response: ' + messageJSON);
}
@ -367,14 +361,12 @@
setTimeout(queryInstallerStatus, 5000);
} else {
$('#loading_indicator').css('display', 'none');
addMessage('error', [
{
// eslint-disable-next-line no-undef
addMessage('error',
[ {
title: installLang.title,
// eslint-disable-next-line no-undef
description: installLang.msg,
},
]);
} ],
);
}
}
@ -396,7 +388,7 @@
}
url = url.substring(0, position) + lookUp + '/installer/status';
$.getJSON(url, data => {
$.getJSON(url, function(data) {
processTimeoutResponse(data.status);
});
}
@ -409,10 +401,7 @@
function pollContent(xhReq) {
var messages = xhReq.responseText;
var msgSeparator = '}\n\n';
var unprocessed;
var messageEndIndex;
var endOfMessageIndex;
var message;
var unprocessed, messageEndIndex, endOfMessageIndex, message;
do {
unprocessed = messages.substring(nextReadPosition);
@ -480,7 +469,7 @@
currentProgress = Math.floor(progressStart);
clearInterval(progressTimer);
progressTimer = setInterval(() => {
progressTimer = setInterval(function() {
incrementFiller($progressText, $progressFiller, $progressFillerText, progressLimit);
}, 10);
}
@ -501,7 +490,7 @@
function startPolling(xhReq) {
resetPolling();
transmissionOver = false;
pollTimer = setInterval(() => {
pollTimer = setInterval(function() {
pollContent(xhReq);
}, 250);
}
@ -619,9 +608,7 @@
function interceptFormSubmit($form) {
if (!$form.length) {
return;
}
if ($form.find('input[name="admin_name"]').length > 0) {
} else if ($form.find('input[name="admin_name"]').length > 0) {
setAdminTimezone($form);
}
@ -639,8 +626,7 @@
function setAdminTimezone($form) {
// Set admin timezone if it does not exist yet
if ($form.find('input[name="admin_timezone"]').length === 0) {
// eslint-disable-next-line new-cap
const { timeZone } = Intl.DateTimeFormat().resolvedOptions();
const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
// Add timezone as form entry
const timezoneEntry = $('<input type="hidden" name="admin_timezone" value="' + timeZone + '">');

File diff suppressed because it is too large Load diff

View file

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

View file

@ -37,10 +37,10 @@ function popup(url, width, height, name) {
function pageJump(item) {
'use strict';
var page = parseInt(item.val(), 10);
var perPage = item.attr('data-per-page');
var baseUrl = item.attr('data-base-url');
var startName = item.attr('data-start-name');
var page = parseInt(item.val(), 10),
perPage = item.attr('data-per-page'),
baseUrl = item.attr('data-base-url'),
startName = item.attr('data-start-name');
if (page !== null && !isNaN(page) && page === Math.floor(page) && page > 0) {
if (baseUrl.indexOf('?') === -1) {
@ -81,34 +81,35 @@ function viewableArea(e, itself) {
e = e.parentNode;
}
if (e.vaHeight) {
// Restore viewable area height to the default
e.style.height = e.vaHeight + 'px';
e.style.overflow = 'auto';
e.style.maxHeight = e.vaMaxHeight;
e.vaHeight = false;
} else {
if (!e.vaHeight) {
// Store viewable area height before changing style to auto
e.vaHeight = e.offsetHeight;
e.vaMaxHeight = e.style.maxHeight;
e.style.height = 'auto';
e.style.maxHeight = 'none';
e.style.overflow = 'visible';
} else {
// Restore viewable area height to the default
e.style.height = e.vaHeight + 'px';
e.style.overflow = 'auto';
e.style.maxHeight = e.vaMaxHeight;
e.vaHeight = false;
}
}
/**
* Alternate display of subPanels
*/
jQuery($ => {
jQuery(function($) {
'use strict';
$('.sub-panels').each(function() {
var $childNodes = $('a[data-subpanel]', this);
var panels = $childNodes.map(function() {
return this.getAttribute('data-subpanel');
});
var showPanel = this.getAttribute('data-show-panel');
var $childNodes = $('a[data-subpanel]', this),
panels = $childNodes.map(function() {
return this.getAttribute('data-subpanel');
}),
showPanel = this.getAttribute('data-show-panel');
if (panels.length) {
activateSubPanel(showPanel, panels);
@ -126,13 +127,11 @@ jQuery($ => {
function activateSubPanel(p, panels) {
'use strict';
var i;
var showPanel;
var i, showPanel;
if (typeof p === 'string') {
showPanel = p;
}
$('input[name="show_panel"]').val(showPanel);
if (typeof panels === 'undefined') {
@ -152,8 +151,7 @@ function selectCode(a) {
// Get ID of code block
var e = a.parentNode.parentNode.getElementsByTagName('CODE')[0];
var s;
var r;
var s, r;
// Not IE and IE9+
if (window.getSelection) {
@ -169,11 +167,12 @@ function selectCode(a) {
s.removeAllRanges();
s.addRange(r);
}
} else {
// Firefox and Opera
}
// Firefox and Opera
else {
// workaround for bug # 42885
if (window.opera && e.innerHTML.substring(e.innerHTML.length - 4) === '<BR>') {
e.innerHTML += '&nbsp;';
e.innerHTML = e.innerHTML + '&nbsp;';
}
r = document.createRange();
@ -181,15 +180,17 @@ function selectCode(a) {
s.removeAllRanges();
s.addRange(r);
}
} else if (document.getSelection) {
// Some older browsers
}
// Some older browsers
else if (document.getSelection) {
s = document.getSelection();
r = document.createRange();
r.selectNodeContents(e);
s.removeAllRanges();
s.addRange(r);
} else if (document.selection) {
// IE
}
// IE
else if (document.selection) {
r = document.body.createTextRange();
r.moveToElementText(e);
r.select();
@ -231,7 +232,7 @@ function phpbbCheckKey(event) {
/**
* Apply onkeypress event for forcing default submit button on ENTER key press
*/
jQuery($ => {
jQuery(function($) {
'use strict';
$('form input[type=text], form input[type=password]').on('keypress', function(e) {
@ -260,10 +261,10 @@ jQuery($ => {
function insertUser(formId, value) {
'use strict';
var $form = jQuery(formId);
var formName = $form.attr('data-form-name');
var fieldName = $form.attr('data-field-name');
var item = opener.document.forms[formName][fieldName];
var $form = jQuery(formId),
formName = $form.attr('data-form-name'),
fieldName = $form.attr('data-field-name'),
item = opener.document.forms[formName][fieldName];
if (item.value.length && item.type === 'textarea') {
value = item.value + '\n' + value;
@ -295,9 +296,9 @@ function insert_single_user(formId, user) {
function parseDocument($container) {
'use strict';
var test = document.createElement('div');
var oldBrowser = (typeof test.style.borderRadius === 'undefined');
var $body = $('body');
var test = document.createElement('div'),
oldBrowser = (typeof test.style.borderRadius === 'undefined'),
$body = $('body');
/**
* Reset avatar dimensions when changing URL or EMAIL
@ -324,7 +325,7 @@ function parseDocument($container) {
$container.find('.pagination .dropdown-trigger').click(function() {
var $dropdownContainer = $(this).parent();
// Wait a little bit to make sure the dropdown has activated
setTimeout(() => {
setTimeout(function() {
if ($dropdownContainer.hasClass('dropdown-visible')) {
$dropdownContainer.find('input.inputbox').focus();
}
@ -335,18 +336,19 @@ function parseDocument($container) {
* Resize navigation (breadcrumbs) block to keep all links on same line
*/
$container.find('.navlinks').each(function() {
var $this = $(this);
var $left = $this.children().not('.rightside');
var $right = $this.children('.rightside');
var $this = $(this),
$left = $this.children().not('.rightside'),
$right = $this.children('.rightside');
if ($left.length !== 1 || !$right.length) {
return;
}
function resize() {
var width = 0;
var diff = $left.outerWidth(true) - $left.width();
var minWidth = Math.max($this.width() / 3, 240);
var width = 0,
diff = $left.outerWidth(true) - $left.width(),
minWidth = Math.max($this.width() / 3, 240),
maxWidth;
$right.each(function() {
var $this = $(this);
@ -355,7 +357,7 @@ function parseDocument($container) {
}
});
var maxWidth = $this.width() - width - diff;
maxWidth = $this.width() - width - diff;
$left.css('max-width', Math.floor(Math.max(maxWidth, minWidth)) + 'px');
}
@ -367,14 +369,14 @@ function parseDocument($container) {
* Makes breadcrumbs responsive
*/
$container.find('.breadcrumbs:not([data-skip-responsive])').each(function() {
var $this = $(this);
var $links = $this.find('.crumb');
var { length } = $links;
var classes = [ 'wrapped-max', 'wrapped-wide', 'wrapped-medium', 'wrapped-small', 'wrapped-tiny' ];
var classesLength = classes.length;
var maxHeight = 0;
var lastWidth = false;
var wrapped = false;
var $this = $(this),
$links = $this.find('.crumb'),
length = $links.length,
classes = [ 'wrapped-max', 'wrapped-wide', 'wrapped-medium', 'wrapped-small', 'wrapped-tiny' ],
classesLength = classes.length,
maxHeight = 0,
lastWidth = false,
wrapped = false;
// Set tooltips
$this.find('a').each(function() {
@ -384,8 +386,8 @@ function parseDocument($container) {
// Function that checks breadcrumbs
function check() {
var height = $this.height();
var width;
var height = $this.height(),
width;
// Test max-width set in code for .navlinks above
width = parseInt($this.css('max-width'), 10);
@ -405,7 +407,6 @@ function parseDocument($container) {
return;
}
}
lastWidth = width;
if (wrapped) {
@ -456,23 +457,23 @@ function parseDocument($container) {
* responsive-show-all to list of classes
*/
$container.find('.topiclist.responsive-show-all > li > dl').each(function() {
var $this = $(this);
var $block = $this.find('dt .responsive-show:last-child');
var first = true;
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) {
first = ($.trim($block.text()).length === 0);
} else {
if (!$block.length) {
$this.find('dt > .list-inner').append('<div class="responsive-show" style="display:none;" />');
$block = $this.find('dt .responsive-show:last-child');
} else {
first = ($.trim($block.text()).length === 0);
}
// Copy contents of each column
$this.find('dd').not('.mark').each(function() {
var column = $(this);
var $children = column.children();
var html = column.html();
var column = $(this),
$children = column.children(),
html = column.html();
if ($children.length === 1 && $children.text() === column.text()) {
html = $children.html();
@ -492,9 +493,9 @@ function parseDocument($container) {
* responsive-show-columns to list of classes
*/
$container.find('.topiclist.responsive-show-columns').each(function() {
var $list = $(this);
var headers = [];
var headersLength = 0;
var $list = $(this),
headers = [],
headersLength = 0;
// Find all headers, get contents
$list.prev('.topiclist').find('li.header dd').not('.mark').each(function() {
@ -508,23 +509,23 @@ function parseDocument($container) {
// Parse each row
$list.find('dl').each(function() {
var $this = $(this);
var $block = $this.find('dt .responsive-show:last-child');
var first = true;
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) {
first = ($.trim($block.text()).length === 0);
} else {
if (!$block.length) {
$this.find('dt > .list-inner').append('<div class="responsive-show" style="display:none;" />');
$block = $this.find('dt .responsive-show:last-child');
} else {
first = ($.trim($block.text()).length === 0);
}
// Copy contents of each column
$this.find('dd').not('.mark').each(function(i) {
var column = $(this);
var children = column.children();
var html = column.html();
var column = $(this),
children = column.children(),
html = column.html();
if (children.length === 1 && children.text() === column.text()) {
html = children.html();
@ -546,25 +547,24 @@ function parseDocument($container) {
* Responsive tables
*/
$container.find('table.table1').not('.not-responsive').each(function() {
var $this = $(this);
var $th = $this.find('thead > tr > th');
var headers = [];
var totalHeaders = 0;
var i;
var $this = $(this),
$th = $this.find('thead > tr > th'),
headers = [],
totalHeaders = 0,
i, headersLength;
// Find each header
$th.each(function(column) {
var cell = $(this);
var colspan = parseInt(cell.attr('colspan'), 10);
var dfn = cell.attr('data-dfn');
var text = dfn ? dfn : cell.text();
var cell = $(this),
colspan = parseInt(cell.attr('colspan'), 10),
dfn = cell.attr('data-dfn'),
text = dfn ? dfn : cell.text();
colspan = isNaN(colspan) || colspan < 1 ? 1 : colspan;
for (i = 0; i < colspan; i++) {
headers.push(text);
}
totalHeaders++;
if (dfn && !column) {
@ -572,7 +572,7 @@ function parseDocument($container) {
}
});
var headersLength = headers.length;
headersLength = headers.length;
// Add header text to each cell as <dfn>
$this.addClass('responsive');
@ -583,9 +583,9 @@ function parseDocument($container) {
}
$this.find('tbody > tr').each(function() {
var row = $(this);
var cells = row.children('td');
var column = 0;
var row = $(this),
cells = row.children('td'),
column = 0;
if (cells.length === 1) {
row.addClass('big-column');
@ -593,9 +593,9 @@ function parseDocument($container) {
}
cells.each(function() {
var cell = $(this);
var colspan = parseInt(cell.attr('colspan'), 10);
var text = $.trim(cell.text());
var cell = $(this),
colspan = parseInt(cell.attr('colspan'), 10),
text = $.trim(cell.text());
if (headersLength <= column) {
return;
@ -629,15 +629,15 @@ function parseDocument($container) {
* Responsive tabs
*/
$container.find('#tabs, #minitabs').not('[data-skip-responsive]').each(function() {
var $this = $(this);
var $ul = $this.children();
var $tabs = $ul.children().not('[data-skip-responsive]');
var $links = $tabs.children('a');
var $item = $ul.append('<li class="tab responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link">&nbsp;</a><div class="dropdown tab-dropdown" style="display: none;"><div class="pointer"><div class="pointer-inner"></div></div><ul class="dropdown-contents" /></div></li>').find('li.responsive-tab');
var $menu = $item.find('.dropdown-contents');
var maxHeight = 0;
var lastWidth = false;
var responsive = false;
var $this = $(this),
$ul = $this.children(),
$tabs = $ul.children().not('[data-skip-responsive]'),
$links = $tabs.children('a'),
$item = $ul.append('<li class="tab responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link">&nbsp;</a><div class="dropdown tab-dropdown" style="display: none;"><div class="pointer"><div class="pointer-inner"></div></div><ul class="dropdown-contents" /></div></li>').find('li.responsive-tab'),
$menu = $item.find('.dropdown-contents'),
maxHeight = 0,
lastWidth = false,
responsive = false;
$links.each(function() {
var $this = $(this);
@ -645,8 +645,8 @@ function parseDocument($container) {
});
function check() {
var width = $body.width();
var height = $this.height();
var width = $body.width(),
height = $this.height();
if (!arguments.length && (!responsive || width <= lastWidth) && height <= maxHeight) {
return;
@ -661,7 +661,6 @@ function parseDocument($container) {
if ($item.hasClass('dropdown-visible')) {
phpbb.toggleDropdown.call($item.find('a.responsive-tab-link').get(0));
}
return;
}
@ -669,24 +668,22 @@ function parseDocument($container) {
$item.show();
$menu.html('');
var $availableTabs = $tabs.filter(':not(.activetab, .responsive-tab)');
var total = $availableTabs.length;
var i;
var $tab;
var $availableTabs = $tabs.filter(':not(.activetab, .responsive-tab)'),
total = $availableTabs.length,
i, $tab;
for (i = total - 1; i >= 0; i--) {
$tab = $availableTabs.eq(i);
$menu.prepend($tab.clone(true).removeClass('tab'));
$tab.hide();
if ($this.height() <= maxHeight) {
$menu.find('a').click(() => {
$menu.find('a').click(function() {
check(true);
});
return;
}
}
$menu.find('a').click(() => {
$menu.find('a').click(function() {
check(true);
});
}
@ -714,26 +711,23 @@ function parseDocument($container) {
* Replace responsive text
*/
$container.find('[data-responsive-text]').each(function() {
var $this = $(this);
var fullText = $this.text();
var responsiveText = $this.attr('data-responsive-text');
var responsive = false;
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;
}
@ -746,7 +740,7 @@ function parseDocument($container) {
/**
* Run onload functions
*/
jQuery($ => {
jQuery(function($) {
'use strict';
// Swap .nojs and .hasjs