diff --git a/README.md b/README.md
index b08b6c3a84..831a6aa303 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,7 @@
[](https://travis-ci.org/NodeBB/NodeBB)
[](https://david-dm.org/nodebb/nodebb)
[](https://codeclimate.com/github/designcreateplay/NodeBB)
+[](https://readthedocs.org/projects/nodebb/?badge=latest)
**NodeBB Forum Software** is powered by Node.js and built on a Redis database. It utilizes web sockets for instant interactions and real-time notifications. NodeBB is compatible down to IE8 and has many modern features out of the box such as social network integration and streaming discussions.
diff --git a/public/language/en_GB/error.json b/public/language/en_GB/error.json
index 75d43fce3f..c9de71d2f4 100644
--- a/public/language/en_GB/error.json
+++ b/public/language/en_GB/error.json
@@ -23,6 +23,7 @@
"email-not-confirmed": "Your email is not confirmed, please click here to confirm your email.",
"username-too-short": "Username too short",
+ "username-too-long": "Username too long",
"user-banned": "User banned",
diff --git a/public/language/nl/language.json b/public/language/nl/language.json
index 5490106fc4..2ac1b09fb3 100644
--- a/public/language/nl/language.json
+++ b/public/language/nl/language.json
@@ -1,5 +1,5 @@
{
"name": "Nederlands",
- "code": "nl",
+ "code": "nl_NL",
"dir": "ltr"
}
\ No newline at end of file
diff --git a/public/language/pt_BR/email.json b/public/language/pt_BR/email.json
index 92f058e6ff..f0b4cce398 100644
--- a/public/language/pt_BR/email.json
+++ b/public/language/pt_BR/email.json
@@ -7,14 +7,14 @@
"welcome.text2": "To fully activate your account, we need to verify that you own the email address you registered with.",
"welcome.cta": "Clique aqui para confirmar seu endereço de email",
"reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.",
- "reset.text2": "To continue with the password reset, please click on the following link:",
+ "reset.text2": "Para continuar com a redefinição de senha, por favor clique no link:\n",
"reset.cta": "Clique aqui para recuperar sua senha",
- "digest.notifications": "You have some unread notifications from %1:",
+ "digest.notifications": "Você tem algumas notificações não lidas de %1:",
"digest.latest_topics": "Últimos tópicos de %1",
"digest.cta": "Clique aqui para visitar %1",
- "digest.unsub.info": "This digest was sent to you due to your subscription settings.",
+ "digest.unsub.info": "Este resumo foi enviado para você devido a configuração de assinatura",
"digest.unsub.cta": "Clique aqui para alterar suas configurações",
- "digest.daily.no_topics": "There have been no active topics in the past day",
- "test.text1": "This is a test email to verify that the emailer is set up correctly for your NodeBB.",
+ "digest.daily.no_topics": "Não houve nenhum tópico ativo atualmente",
+ "test.text1": "Este é um e-mail de teste, para verificar que o email está corretamente configurado no seu NodeBB.\n",
"closing": "Obrigado!"
}
\ No newline at end of file
diff --git a/public/language/ro/email.json b/public/language/ro/email.json
index 98e591ab02..9c7da47629 100644
--- a/public/language/ro/email.json
+++ b/public/language/ro/email.json
@@ -1,8 +1,8 @@
{
"password-reset-requested": "Password Reset Requested - %1!",
- "welcome-to": "Welcome to %1",
- "greeting_no_name": "Hello",
- "greeting_with_name": "Hello %1",
+ "welcome-to": "Salutare lui %1",
+ "greeting_no_name": "Salut",
+ "greeting_with_name": "Salut %1",
"welcome.text1": "Thank you for registering with %1!",
"welcome.text2": "To fully activate your account, we need to verify that you own the email address you registered with.",
"welcome.cta": "Click here to confirm your email address",
@@ -11,10 +11,10 @@
"reset.cta": "Click here to reset your password",
"digest.notifications": "You have some unread notifications from %1:",
"digest.latest_topics": "Latest topics from %1",
- "digest.cta": "Click here to visit %1",
+ "digest.cta": "Apasă aici pentru a vizita %1",
"digest.unsub.info": "This digest was sent to you due to your subscription settings.",
"digest.unsub.cta": "Click here to alter those settings",
"digest.daily.no_topics": "There have been no active topics in the past day",
"test.text1": "This is a test email to verify that the emailer is set up correctly for your NodeBB.",
- "closing": "Thanks!"
+ "closing": "Mulțumesc!"
}
\ No newline at end of file
diff --git a/public/language/ro/global.json b/public/language/ro/global.json
index 028c2d5eb4..4f9c772e9d 100644
--- a/public/language/ro/global.json
+++ b/public/language/ro/global.json
@@ -13,7 +13,7 @@
"please_log_in": "Autentifică-te",
"logout": "Ieşire",
"posting_restriction_info": "Pentru a posta trebuie să fi înregistrat. Apasă aici pentru a te atentifica.",
- "welcome_back": "Welcome Back",
+ "welcome_back": "Bine ai revenit",
"you_have_successfully_logged_in": "Te-ai conectat cu succes",
"save_changes": "Salvează Modificări",
"close": "Închide",
diff --git a/public/language/ro/groups.json b/public/language/ro/groups.json
index c00c111e11..78a79dab26 100644
--- a/public/language/ro/groups.json
+++ b/public/language/ro/groups.json
@@ -1,7 +1,7 @@
{
- "view_group": "View Group",
- "details.title": "Group Details",
- "details.members": "Member List",
- "details.has_no_posts": "This group's members have not made any posts.",
- "details.latest_posts": "Latest Posts"
+ "view_group": "Vezi Grup",
+ "details.title": "Detalii Grup",
+ "details.members": "Listă Membrii",
+ "details.has_no_posts": "Membrii acestui grup nu au facut nici o postare.",
+ "details.latest_posts": "Ultimele Mesaje"
}
\ No newline at end of file
diff --git a/public/language/ro/modules.json b/public/language/ro/modules.json
index cd35ee205e..0c4ad4d148 100644
--- a/public/language/ro/modules.json
+++ b/public/language/ro/modules.json
@@ -1,18 +1,18 @@
{
"chat.chatting_with": "Conversează cu ",
- "chat.placeholder": "Type chat message here, press enter to send",
+ "chat.placeholder": "introdu mesajul conversației aici, apasă enter pentru a trimite",
"chat.send": "Trimite",
"chat.no_active": "Nu ai nici o conversație activă",
"chat.user_typing": "%1 scrie ...",
"chat.user_has_messaged_you": "%1 ți-a trimis un mesaj.",
"chat.see_all": "Vezi toate conversațiile",
"chat.no-messages": "Please select a recipient to view chat message history",
- "chat.recent-chats": "Recent Chats",
- "chat.contacts": "Contacts",
- "chat.message-history": "Message History",
+ "chat.recent-chats": "Conversații Recente",
+ "chat.contacts": "Contacte",
+ "chat.message-history": "Istorie Mesaje",
"chat.pop-out": "Pop out chat",
- "chat.maximize": "Maximize",
- "composer.user_said_in": "%1 said in %2:",
- "composer.user_said": "%1 said:",
+ "chat.maximize": "Maximizează",
+ "composer.user_said_in": "%1 a spus în %2:",
+ "composer.user_said": "%1 a spus:",
"composer.discard": "Ești sigur că vrei să renunți la acest mesaj?"
}
\ No newline at end of file
diff --git a/public/language/ro/recent.json b/public/language/ro/recent.json
index b08a68e279..b17702e5e9 100644
--- a/public/language/ro/recent.json
+++ b/public/language/ro/recent.json
@@ -3,6 +3,6 @@
"day": "Zi",
"week": "Săptămână",
"month": "Lună",
- "year": "Year",
+ "year": "An",
"no_recent_topics": "Nu există subiecte recente."
}
\ No newline at end of file
diff --git a/public/language/ro/user.json b/public/language/ro/user.json
index 2fd29f39ed..19de3dccf8 100644
--- a/public/language/ro/user.json
+++ b/public/language/ro/user.json
@@ -3,7 +3,7 @@
"offline": "Deconectat",
"username": "Nume utilizator",
"email": "Adresă Email",
- "confirm_email": "Confirm Email",
+ "confirm_email": "Confirmă Email",
"fullname": "Nume Întreg",
"website": "Pagină Web",
"location": "Locație",
diff --git a/public/src/forum/admin/tags.js b/public/src/forum/admin/tags.js
index e6468c7f21..965ae0db13 100644
--- a/public/src/forum/admin/tags.js
+++ b/public/src/forum/admin/tags.js
@@ -1,8 +1,9 @@
"use strict";
-/*global define, socket, app, admin*/
+/*global define, socket, app, admin, utils*/
-define('forum/admin/tags', [], function() {
+define('forum/admin/tags', ['forum/infinitescroll'], function(infinitescroll) {
var Tags = {};
+ var timeoutId = 0;
Tags.init = function() {
handleColorPickers();
@@ -12,10 +13,22 @@ define('forum/admin/tags', [], function() {
});
$('#tag-search').on('input propertychange', function() {
- $('.tag-list').children().each(function() {
- var $this = $(this);
- $this.toggleClass('hide', $this.attr('data-tag').indexOf($('#tag-search').val()) === -1);
- });
+ if (timeoutId) {
+ clearTimeout(timeoutId);
+ timeoutId = 0;
+ }
+ timeoutId = setTimeout(function() {
+ socket.emit('topics.searchAndLoadTags', {query: $('#tag-search').val()}, function(err, tags) {
+ if (err) {
+ return app.alertError(err.message);
+ }
+ infinitescroll.parseAndTranslate('admin/tags', 'tags', {tags: tags}, function(html) {
+ $('.tag-list').html(html);
+ utils.makeNumbersHumanReadable(html.find('.human-readable-number'));
+ timeoutId = 0;
+ });
+ });
+ }, 100);
});
};
diff --git a/public/src/forum/register.js b/public/src/forum/register.js
index 8899fd161a..a332aa7c6f 100644
--- a/public/src/forum/register.js
+++ b/public/src/forum/register.js
@@ -106,7 +106,7 @@ define('forum/register', function() {
if (password.length < config.minimumPasswordLength) {
showError(password_notify, '[[user:change_password_error_length]]');
} else if (!utils.isPasswordValid(password)) {
- showError(password_notify, '[[user:change_password_error_]]');
+ showError(password_notify, '[[user:change_password_error]]');
} else {
showSuccess(password_notify, successIcon);
}
diff --git a/public/src/forum/tags.js b/public/src/forum/tags.js
index c96a921472..bf4395f497 100644
--- a/public/src/forum/tags.js
+++ b/public/src/forum/tags.js
@@ -1,20 +1,59 @@
'use strict';
-/* globals define, app */
+/* globals define, app, utils, socket */
-define('forum/tags', function() {
+define('forum/tags', ['forum/infinitescroll'], function(infinitescroll) {
var Tags = {};
+ var timeoutId = 0;
Tags.init = function() {
app.enterRoom('tags');
$('#tag-search').on('input propertychange', function() {
- $('.tag-list').children().each(function() {
- var $this = $(this);
- $this.toggleClass('hide', $this.find('a').attr('data-value').indexOf($('#tag-search').val()) === -1);
- })
+ if (timeoutId) {
+ clearTimeout(timeoutId);
+ timeoutId = 0;
+ }
+ timeoutId = setTimeout(function() {
+ socket.emit('topics.searchAndLoadTags', {query: $('#tag-search').val()}, function(err, results) {
+ if (err) {
+ return app.alertError(err.message);
+ }
+ onTagsLoaded(results, true, function() {
+ timeoutId = 0;
+ });
+ });
+ }, 100);
+ });
+
+ infinitescroll.init(Tags.loadMoreTags);
+ };
+
+ Tags.loadMoreTags = function(direction) {
+ if(direction < 0 || !$('.tag-list').length) {
+ return;
+ }
+
+ infinitescroll.loadMore('topics.loadMoreTags', {
+ after: $('.tag-list').attr('data-nextstart')
+ }, function(data, done) {
+ if (data && data.tags && data.tags.length) {
+ onTagsLoaded(data.tags, false, done);
+ $('.tag-list').attr('data-nextstart', data.nextStart);
+ } else {
+ done();
+ }
});
};
+ function onTagsLoaded(tags, replace, callback) {
+ callback = callback || function() {};
+ infinitescroll.parseAndTranslate('tags', 'tags', {tags: tags}, function(html) {
+ $('.tag-list')[replace ? 'html' : 'append'](html);
+ utils.makeNumbersHumanReadable(html.find('.human-readable-number'));
+ callback();
+ });
+ }
+
return Tags;
});
diff --git a/public/src/utils.js b/public/src/utils.js
index 84f9567927..28973b9c8d 100644
--- a/public/src/utils.js
+++ b/public/src/utils.js
@@ -139,7 +139,7 @@
},
isPasswordValid: function(password) {
- return typeof password === 'string' && password.length && password.indexOf(' ') === -1;
+ return typeof password === 'string' && password.length;
},
isNumber: function(n) {
diff --git a/public/theme-rocket/cover/0231ab8358cc9079b8207bcc78b66c1d b/public/theme-rocket/cover/0231ab8358cc9079b8207bcc78b66c1d
new file mode 100644
index 0000000000..b88748ab3a
Binary files /dev/null and b/public/theme-rocket/cover/0231ab8358cc9079b8207bcc78b66c1d differ
diff --git a/public/vendor/fontawesome/fonts/FontAwesome.otf b/public/vendor/fontawesome/fonts/FontAwesome.otf
index 3461e3fce6..81c9ad949b 100644
Binary files a/public/vendor/fontawesome/fonts/FontAwesome.otf and b/public/vendor/fontawesome/fonts/FontAwesome.otf differ
diff --git a/public/vendor/fontawesome/fonts/fontawesome-webfont.eot b/public/vendor/fontawesome/fonts/fontawesome-webfont.eot
index 6cfd566095..84677bc0c5 100644
Binary files a/public/vendor/fontawesome/fonts/fontawesome-webfont.eot and b/public/vendor/fontawesome/fonts/fontawesome-webfont.eot differ
diff --git a/public/vendor/fontawesome/fonts/fontawesome-webfont.svg b/public/vendor/fontawesome/fonts/fontawesome-webfont.svg
index a9f8469503..d907b25ae6 100644
--- a/public/vendor/fontawesome/fonts/fontawesome-webfont.svg
+++ b/public/vendor/fontawesome/fonts/fontawesome-webfont.svg
@@ -32,473 +32,489 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/public/vendor/fontawesome/fonts/fontawesome-webfont.ttf b/public/vendor/fontawesome/fonts/fontawesome-webfont.ttf
index 5cd6cff6d6..96a3639cdd 100644
Binary files a/public/vendor/fontawesome/fonts/fontawesome-webfont.ttf and b/public/vendor/fontawesome/fonts/fontawesome-webfont.ttf differ
diff --git a/public/vendor/fontawesome/fonts/fontawesome-webfont.woff b/public/vendor/fontawesome/fonts/fontawesome-webfont.woff
index 9eaecb3799..628b6a52a8 100644
Binary files a/public/vendor/fontawesome/fonts/fontawesome-webfont.woff and b/public/vendor/fontawesome/fonts/fontawesome-webfont.woff differ
diff --git a/public/vendor/fontawesome/less/core.less b/public/vendor/fontawesome/less/core.less
index 6d223bc2f0..01d1910f72 100644
--- a/public/vendor/fontawesome/less/core.less
+++ b/public/vendor/fontawesome/less/core.less
@@ -3,10 +3,9 @@
.@{fa-css-prefix} {
display: inline-block;
- font-family: FontAwesome;
- font-style: normal;
- font-weight: normal;
- line-height: 1;
+ font: normal normal normal 14px/1 FontAwesome; // shortening font declaration
+ font-size: inherit; // can't have font-size inherit on line above, so need to override
+ text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
diff --git a/public/vendor/fontawesome/less/extras.less b/public/vendor/fontawesome/less/extras.less
new file mode 100644
index 0000000000..89faf70fc9
--- /dev/null
+++ b/public/vendor/fontawesome/less/extras.less
@@ -0,0 +1,2 @@
+// Extras
+// --------------------------
diff --git a/public/vendor/fontawesome/less/font-awesome.less b/public/vendor/fontawesome/less/font-awesome.less
index 50cbcac49c..195fd46c66 100644
--- a/public/vendor/fontawesome/less/font-awesome.less
+++ b/public/vendor/fontawesome/less/font-awesome.less
@@ -1,5 +1,5 @@
/*!
- * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/
diff --git a/public/vendor/fontawesome/less/icons.less b/public/vendor/fontawesome/less/icons.less
index 13d8c685b0..b5c26c701b 100644
--- a/public/vendor/fontawesome/less/icons.less
+++ b/public/vendor/fontawesome/less/icons.less
@@ -14,6 +14,8 @@
.@{fa-css-prefix}-th:before { content: @fa-var-th; }
.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }
.@{fa-css-prefix}-check:before { content: @fa-var-check; }
+.@{fa-css-prefix}-remove:before,
+.@{fa-css-prefix}-close:before,
.@{fa-css-prefix}-times:before { content: @fa-var-times; }
.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }
.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }
@@ -129,7 +131,8 @@
.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }
.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; }
.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; }
-.@{fa-css-prefix}-bar-chart-o:before { content: @fa-var-bar-chart-o; }
+.@{fa-css-prefix}-bar-chart-o:before,
+.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; }
.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }
.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }
.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }
@@ -432,7 +435,6 @@
.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }
.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }
.@{fa-css-prefix}-digg:before { content: @fa-var-digg; }
-.@{fa-css-prefix}-pied-piper-square:before,
.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }
.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }
.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }
@@ -477,6 +479,7 @@
.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }
.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }
.@{fa-css-prefix}-life-bouy:before,
+.@{fa-css-prefix}-life-buoy:before,
.@{fa-css-prefix}-life-saver:before,
.@{fa-css-prefix}-support:before,
.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }
@@ -504,3 +507,46 @@
.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }
.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }
.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }
+.@{fa-css-prefix}-soccer-ball-o:before,
+.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; }
+.@{fa-css-prefix}-tty:before { content: @fa-var-tty; }
+.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; }
+.@{fa-css-prefix}-plug:before { content: @fa-var-plug; }
+.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; }
+.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; }
+.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; }
+.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; }
+.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; }
+.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; }
+.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; }
+.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; }
+.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; }
+.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; }
+.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; }
+.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; }
+.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; }
+.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; }
+.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; }
+.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; }
+.@{fa-css-prefix}-trash:before { content: @fa-var-trash; }
+.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; }
+.@{fa-css-prefix}-at:before { content: @fa-var-at; }
+.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; }
+.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; }
+.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; }
+.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; }
+.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; }
+.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; }
+.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; }
+.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; }
+.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; }
+.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; }
+.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; }
+.@{fa-css-prefix}-bus:before { content: @fa-var-bus; }
+.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; }
+.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; }
+.@{fa-css-prefix}-cc:before { content: @fa-var-cc; }
+.@{fa-css-prefix}-shekel:before,
+.@{fa-css-prefix}-sheqel:before,
+.@{fa-css-prefix}-ils:before { content: @fa-var-ils; }
+.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; }
diff --git a/public/vendor/fontawesome/less/list.less b/public/vendor/fontawesome/less/list.less
index eed9340515..0b440382f6 100644
--- a/public/vendor/fontawesome/less/list.less
+++ b/public/vendor/fontawesome/less/list.less
@@ -14,6 +14,6 @@
top: (2em / 14);
text-align: center;
&.@{fa-css-prefix}-lg {
- left: -@fa-li-width + (4em / 14);
+ left: (-@fa-li-width + (4em / 14));
}
}
diff --git a/public/vendor/fontawesome/less/mixins.less b/public/vendor/fontawesome/less/mixins.less
index 19e5a6457b..b7bfadc797 100644
--- a/public/vendor/fontawesome/less/mixins.less
+++ b/public/vendor/fontawesome/less/mixins.less
@@ -1,20 +1,25 @@
// Mixins
// --------------------------
+.fa-icon() {
+ display: inline-block;
+ font: normal normal normal 14px/1 FontAwesome; // shortening font declaration
+ font-size: inherit; // can't have font-size inherit on line above, so need to override
+ text-rendering: auto; // optimizelegibility throws things off #1094
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
.fa-icon-rotate(@degrees, @rotation) {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation);
-webkit-transform: rotate(@degrees);
- -moz-transform: rotate(@degrees);
-ms-transform: rotate(@degrees);
- -o-transform: rotate(@degrees);
transform: rotate(@degrees);
}
.fa-icon-flip(@horiz, @vert, @rotation) {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1);
-webkit-transform: scale(@horiz, @vert);
- -moz-transform: scale(@horiz, @vert);
-ms-transform: scale(@horiz, @vert);
- -o-transform: scale(@horiz, @vert);
transform: scale(@horiz, @vert);
}
diff --git a/public/vendor/fontawesome/less/path.less b/public/vendor/fontawesome/less/path.less
index d73bff8b50..c5a691246d 100644
--- a/public/vendor/fontawesome/less/path.less
+++ b/public/vendor/fontawesome/less/path.less
@@ -3,11 +3,11 @@
@font-face {
font-family: 'FontAwesome';
- src: ~"url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}')";
- src: ~"url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype')",
- ~"url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff')",
- ~"url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype')",
- ~"url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg')";
+ src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
+ src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
+ url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
+ url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
+ url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
// src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
font-weight: normal;
font-style: normal;
diff --git a/public/vendor/fontawesome/less/rotated-flipped.less b/public/vendor/fontawesome/less/rotated-flipped.less
index 8fff3a6c41..f6ba81475b 100644
--- a/public/vendor/fontawesome/less/rotated-flipped.less
+++ b/public/vendor/fontawesome/less/rotated-flipped.less
@@ -7,3 +7,14 @@
.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
+
+// Hook for IE8-9
+// -------------------------
+
+:root .@{fa-css-prefix}-rotate-90,
+:root .@{fa-css-prefix}-rotate-180,
+:root .@{fa-css-prefix}-rotate-270,
+:root .@{fa-css-prefix}-flip-horizontal,
+:root .@{fa-css-prefix}-flip-vertical {
+ filter: none;
+}
diff --git a/public/vendor/fontawesome/less/spinning.less b/public/vendor/fontawesome/less/spinning.less
index 06b71ecb4c..6e1564e05e 100644
--- a/public/vendor/fontawesome/less/spinning.less
+++ b/public/vendor/fontawesome/less/spinning.less
@@ -2,31 +2,28 @@
// --------------------------
.@{fa-css-prefix}-spin {
- -webkit-animation: spin 2s infinite linear;
- -moz-animation: spin 2s infinite linear;
- -o-animation: spin 2s infinite linear;
- animation: spin 2s infinite linear;
+ -webkit-animation: fa-spin 2s infinite linear;
+ animation: fa-spin 2s infinite linear;
}
-@-moz-keyframes spin {
- 0% { -moz-transform: rotate(0deg); }
- 100% { -moz-transform: rotate(359deg); }
-}
-@-webkit-keyframes spin {
- 0% { -webkit-transform: rotate(0deg); }
- 100% { -webkit-transform: rotate(359deg); }
-}
-@-o-keyframes spin {
- 0% { -o-transform: rotate(0deg); }
- 100% { -o-transform: rotate(359deg); }
-}
-@keyframes spin {
+@-webkit-keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
- transform: rotate(0deg);
+ transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
- transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+
+@keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
}
}
diff --git a/public/vendor/fontawesome/less/variables.less b/public/vendor/fontawesome/less/variables.less
index de35a8d9ca..56a699851f 100644
--- a/public/vendor/fontawesome/less/variables.less
+++ b/public/vendor/fontawesome/less/variables.less
@@ -2,9 +2,9 @@
// --------------------------
@fa-font-path: "./vendor/fontawesome/fonts";
-//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.1.0/fonts"; // for referencing Bootstrap CDN font files directly
+//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts"; // for referencing Bootstrap CDN font files directly
@fa-css-prefix: fa;
-@fa-version: "4.1.0";
+@fa-version: "4.2.0";
@fa-border-color: #eee;
@fa-inverse: #fff;
@fa-li-width: (30em / 14);
@@ -18,6 +18,7 @@
@fa-var-ambulance: "\f0f9";
@fa-var-anchor: "\f13d";
@fa-var-android: "\f17b";
+@fa-var-angellist: "\f209";
@fa-var-angle-double-down: "\f103";
@fa-var-angle-double-left: "\f100";
@fa-var-angle-double-right: "\f101";
@@ -28,6 +29,7 @@
@fa-var-angle-up: "\f106";
@fa-var-apple: "\f179";
@fa-var-archive: "\f187";
+@fa-var-area-chart: "\f1fe";
@fa-var-arrow-circle-down: "\f0ab";
@fa-var-arrow-circle-left: "\f0a8";
@fa-var-arrow-circle-o-down: "\f01a";
@@ -45,10 +47,12 @@
@fa-var-arrows-h: "\f07e";
@fa-var-arrows-v: "\f07d";
@fa-var-asterisk: "\f069";
+@fa-var-at: "\f1fa";
@fa-var-automobile: "\f1b9";
@fa-var-backward: "\f04a";
@fa-var-ban: "\f05e";
@fa-var-bank: "\f19c";
+@fa-var-bar-chart: "\f080";
@fa-var-bar-chart-o: "\f080";
@fa-var-barcode: "\f02a";
@fa-var-bars: "\f0c9";
@@ -57,6 +61,11 @@
@fa-var-behance-square: "\f1b5";
@fa-var-bell: "\f0f3";
@fa-var-bell-o: "\f0a2";
+@fa-var-bell-slash: "\f1f6";
+@fa-var-bell-slash-o: "\f1f7";
+@fa-var-bicycle: "\f206";
+@fa-var-binoculars: "\f1e5";
+@fa-var-birthday-cake: "\f1fd";
@fa-var-bitbucket: "\f171";
@fa-var-bitbucket-square: "\f172";
@fa-var-bitcoin: "\f15a";
@@ -73,7 +82,9 @@
@fa-var-building-o: "\f0f7";
@fa-var-bullhorn: "\f0a1";
@fa-var-bullseye: "\f140";
+@fa-var-bus: "\f207";
@fa-var-cab: "\f1ba";
+@fa-var-calculator: "\f1ec";
@fa-var-calendar: "\f073";
@fa-var-calendar-o: "\f133";
@fa-var-camera: "\f030";
@@ -87,6 +98,13 @@
@fa-var-caret-square-o-right: "\f152";
@fa-var-caret-square-o-up: "\f151";
@fa-var-caret-up: "\f0d8";
+@fa-var-cc: "\f20a";
+@fa-var-cc-amex: "\f1f3";
+@fa-var-cc-discover: "\f1f2";
+@fa-var-cc-mastercard: "\f1f1";
+@fa-var-cc-paypal: "\f1f4";
+@fa-var-cc-stripe: "\f1f5";
+@fa-var-cc-visa: "\f1f0";
@fa-var-certificate: "\f0a3";
@fa-var-chain: "\f0c1";
@fa-var-chain-broken: "\f127";
@@ -110,6 +128,7 @@
@fa-var-circle-thin: "\f1db";
@fa-var-clipboard: "\f0ea";
@fa-var-clock-o: "\f017";
+@fa-var-close: "\f00d";
@fa-var-cloud: "\f0c2";
@fa-var-cloud-download: "\f0ed";
@fa-var-cloud-upload: "\f0ee";
@@ -128,6 +147,7 @@
@fa-var-compass: "\f14e";
@fa-var-compress: "\f066";
@fa-var-copy: "\f0c5";
+@fa-var-copyright: "\f1f9";
@fa-var-credit-card: "\f09d";
@fa-var-crop: "\f125";
@fa-var-crosshairs: "\f05b";
@@ -169,6 +189,7 @@
@fa-var-external-link-square: "\f14c";
@fa-var-eye: "\f06e";
@fa-var-eye-slash: "\f070";
+@fa-var-eyedropper: "\f1fb";
@fa-var-facebook: "\f09a";
@fa-var-facebook-square: "\f082";
@fa-var-fast-backward: "\f049";
@@ -214,6 +235,7 @@
@fa-var-forward: "\f04e";
@fa-var-foursquare: "\f180";
@fa-var-frown-o: "\f119";
+@fa-var-futbol-o: "\f1e3";
@fa-var-gamepad: "\f11b";
@fa-var-gavel: "\f0e3";
@fa-var-gbp: "\f154";
@@ -232,6 +254,7 @@
@fa-var-google: "\f1a0";
@fa-var-google-plus: "\f0d5";
@fa-var-google-plus-square: "\f0d4";
+@fa-var-google-wallet: "\f1ee";
@fa-var-graduation-cap: "\f19d";
@fa-var-group: "\f0c0";
@fa-var-h-square: "\f0fd";
@@ -249,6 +272,7 @@
@fa-var-home: "\f015";
@fa-var-hospital-o: "\f0f8";
@fa-var-html5: "\f13b";
+@fa-var-ils: "\f20b";
@fa-var-image: "\f03e";
@fa-var-inbox: "\f01c";
@fa-var-indent: "\f03c";
@@ -257,6 +281,7 @@
@fa-var-inr: "\f156";
@fa-var-instagram: "\f16d";
@fa-var-institution: "\f19c";
+@fa-var-ioxhost: "\f208";
@fa-var-italic: "\f033";
@fa-var-joomla: "\f1aa";
@fa-var-jpy: "\f157";
@@ -266,15 +291,19 @@
@fa-var-krw: "\f159";
@fa-var-language: "\f1ab";
@fa-var-laptop: "\f109";
+@fa-var-lastfm: "\f202";
+@fa-var-lastfm-square: "\f203";
@fa-var-leaf: "\f06c";
@fa-var-legal: "\f0e3";
@fa-var-lemon-o: "\f094";
@fa-var-level-down: "\f149";
@fa-var-level-up: "\f148";
@fa-var-life-bouy: "\f1cd";
+@fa-var-life-buoy: "\f1cd";
@fa-var-life-ring: "\f1cd";
@fa-var-life-saver: "\f1cd";
@fa-var-lightbulb-o: "\f0eb";
+@fa-var-line-chart: "\f201";
@fa-var-link: "\f0c1";
@fa-var-linkedin: "\f0e1";
@fa-var-linkedin-square: "\f08c";
@@ -297,6 +326,7 @@
@fa-var-male: "\f183";
@fa-var-map-marker: "\f041";
@fa-var-maxcdn: "\f136";
+@fa-var-meanpath: "\f20c";
@fa-var-medkit: "\f0fa";
@fa-var-meh-o: "\f11a";
@fa-var-microphone: "\f130";
@@ -312,9 +342,11 @@
@fa-var-mortar-board: "\f19d";
@fa-var-music: "\f001";
@fa-var-navicon: "\f0c9";
+@fa-var-newspaper-o: "\f1ea";
@fa-var-openid: "\f19b";
@fa-var-outdent: "\f03b";
@fa-var-pagelines: "\f18c";
+@fa-var-paint-brush: "\f1fc";
@fa-var-paper-plane: "\f1d8";
@fa-var-paper-plane-o: "\f1d9";
@fa-var-paperclip: "\f0c6";
@@ -322,6 +354,7 @@
@fa-var-paste: "\f0ea";
@fa-var-pause: "\f04c";
@fa-var-paw: "\f1b0";
+@fa-var-paypal: "\f1ed";
@fa-var-pencil: "\f040";
@fa-var-pencil-square: "\f14b";
@fa-var-pencil-square-o: "\f044";
@@ -329,15 +362,16 @@
@fa-var-phone-square: "\f098";
@fa-var-photo: "\f03e";
@fa-var-picture-o: "\f03e";
+@fa-var-pie-chart: "\f200";
@fa-var-pied-piper: "\f1a7";
@fa-var-pied-piper-alt: "\f1a8";
-@fa-var-pied-piper-square: "\f1a7";
@fa-var-pinterest: "\f0d2";
@fa-var-pinterest-square: "\f0d3";
@fa-var-plane: "\f072";
@fa-var-play: "\f04b";
@fa-var-play-circle: "\f144";
@fa-var-play-circle-o: "\f01d";
+@fa-var-plug: "\f1e6";
@fa-var-plus: "\f067";
@fa-var-plus-circle: "\f055";
@fa-var-plus-square: "\f0fe";
@@ -358,6 +392,7 @@
@fa-var-reddit: "\f1a1";
@fa-var-reddit-square: "\f1a2";
@fa-var-refresh: "\f021";
+@fa-var-remove: "\f00d";
@fa-var-renren: "\f18b";
@fa-var-reorder: "\f0c9";
@fa-var-repeat: "\f01e";
@@ -387,6 +422,8 @@
@fa-var-share-alt-square: "\f1e1";
@fa-var-share-square: "\f14d";
@fa-var-share-square-o: "\f045";
+@fa-var-shekel: "\f20b";
+@fa-var-sheqel: "\f20b";
@fa-var-shield: "\f132";
@fa-var-shopping-cart: "\f07a";
@fa-var-sign-in: "\f090";
@@ -396,7 +433,9 @@
@fa-var-skype: "\f17e";
@fa-var-slack: "\f198";
@fa-var-sliders: "\f1de";
+@fa-var-slideshare: "\f1e7";
@fa-var-smile-o: "\f118";
+@fa-var-soccer-ball-o: "\f1e3";
@fa-var-sort: "\f0dc";
@fa-var-sort-alpha-asc: "\f15d";
@fa-var-sort-alpha-desc: "\f15e";
@@ -463,17 +502,22 @@
@fa-var-tint: "\f043";
@fa-var-toggle-down: "\f150";
@fa-var-toggle-left: "\f191";
+@fa-var-toggle-off: "\f204";
+@fa-var-toggle-on: "\f205";
@fa-var-toggle-right: "\f152";
@fa-var-toggle-up: "\f151";
+@fa-var-trash: "\f1f8";
@fa-var-trash-o: "\f014";
@fa-var-tree: "\f1bb";
@fa-var-trello: "\f181";
@fa-var-trophy: "\f091";
@fa-var-truck: "\f0d1";
@fa-var-try: "\f195";
+@fa-var-tty: "\f1e4";
@fa-var-tumblr: "\f173";
@fa-var-tumblr-square: "\f174";
@fa-var-turkish-lira: "\f195";
+@fa-var-twitch: "\f1e8";
@fa-var-twitter: "\f099";
@fa-var-twitter-square: "\f081";
@fa-var-umbrella: "\f0e9";
@@ -501,6 +545,7 @@
@fa-var-weibo: "\f18a";
@fa-var-weixin: "\f1d7";
@fa-var-wheelchair: "\f193";
+@fa-var-wifi: "\f1eb";
@fa-var-windows: "\f17a";
@fa-var-won: "\f159";
@fa-var-wordpress: "\f19a";
@@ -508,6 +553,7 @@
@fa-var-xing: "\f168";
@fa-var-xing-square: "\f169";
@fa-var-yahoo: "\f19e";
+@fa-var-yelp: "\f1e9";
@fa-var-yen: "\f157";
@fa-var-youtube: "\f167";
@fa-var-youtube-play: "\f16a";
diff --git a/src/controllers/admin.js b/src/controllers/admin.js
index f853f16cf7..13b0bfde7b 100644
--- a/src/controllers/admin.js
+++ b/src/controllers/admin.js
@@ -132,7 +132,7 @@ function filterAndRenderCategories(req, res, next, active) {
}
adminController.tags.get = function(req, res, next) {
- topics.getTags(0, -1, function(err, tags) {
+ topics.getTags(0, 99, function(err, tags) {
if (err) {
return next(err);
}
diff --git a/src/controllers/tags.js b/src/controllers/tags.js
index 258a28b6c9..6d3d18c1f0 100644
--- a/src/controllers/tags.js
+++ b/src/controllers/tags.js
@@ -47,14 +47,13 @@ tagsController.getTag = function(req, res, next) {
};
tagsController.getTags = function(req, res, next) {
- topics.getTags(0, -1, function(err, tags) {
+ topics.getTags(0, 99, function(err, tags) {
if (err) {
return next(err);
}
- res.render('tags', {tags: tags});
+ res.render('tags', {tags: tags, nextStart: 100});
});
-
};
module.exports = tagsController;
diff --git a/src/emitter.js b/src/emitter.js
index 22e11620fe..e95b01c216 100644
--- a/src/emitter.js
+++ b/src/emitter.js
@@ -1,7 +1,6 @@
"use strict";
-var events = require('events'),
- eventEmitter = new events.EventEmitter();
+var eventEmitter = new (require('events')).EventEmitter();
eventEmitter.all = function(events, callback) {
diff --git a/src/routes/index.js b/src/routes/index.js
index 2d2cd8730e..01b095a092 100644
--- a/src/routes/index.js
+++ b/src/routes/index.js
@@ -163,8 +163,7 @@ module.exports = function(app, middleware) {
app.all(relativePath + '/api/?*', middleware.updateLastOnlineTime, middleware.prepareAPI);
app.all(relativePath + '/api/admin/*', middleware.admin.isAdmin, middleware.prepareAPI);
- app.all(relativePath + '/admin/*', middleware.admin.isAdmin);
- app.get(relativePath + '/admin', middleware.admin.isAdmin);
+ app.all(relativePath + '/admin/?*', middleware.admin.isAdmin);
adminRoutes(router, middleware, controllers);
metaRoutes(router, middleware, controllers);
@@ -202,9 +201,9 @@ module.exports = function(app, middleware) {
plugins.reloadRoutes();
// plugins.ready(function() {
// plugins.fireHook('static:app.load', pluginRouter, middleware, controllers, function() {
-
-
+
+
// });
// });
};
diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js
index 510b7fb23b..0b1c308bb8 100644
--- a/src/socket.io/topics.js
+++ b/src/socket.io/topics.js
@@ -522,4 +522,53 @@ SocketTopics.search = function(socket, data, callback) {
topics.search(data.tid, data.term, callback);
};
+SocketTopics.searchAndLoadTags = function(socket, data, callback) {
+ topics.searchTags(data, function(err, tags) {
+ if (err) {
+ return callback(err);
+ }
+ async.parallel({
+ counts: function(next) {
+ db.sortedSetScores('tags:topic:count', tags, next);
+ },
+ tagData: function(next) {
+ tags = tags.map(function(tag) {
+ return {value: tag};
+ });
+
+ topics.getTagData(tags, next);
+ }
+ }, function(err, results) {
+ if (err) {
+ return callback(err);
+ }
+ results.tagData.forEach(function(tag, index) {
+ tag.score = results.counts[index];
+ });
+ results.tagData.sort(function(a, b) {
+ return parseInt(b.score, 10) - parseInt(a.score, 10);
+ });
+
+ callback(null, results.tagData);
+ });
+ });
+};
+
+SocketTopics.loadMoreTags = function(socket, data, callback) {
+ if(!data || !data.after) {
+ return callback(new Error('[[error:invalid-data]]'));
+ }
+
+ var start = parseInt(data.after, 10),
+ end = start + 99;
+
+ topics.getTags(start, end, function(err, tags) {
+ if (err) {
+ return callback(err);
+ }
+
+ callback(null, {tags: tags, nextStart: end + 1});
+ });
+};
+
module.exports = SocketTopics;
diff --git a/src/topics/tags.js b/src/topics/tags.js
index ecca55eb2f..681d137fc9 100644
--- a/src/topics/tags.js
+++ b/src/topics/tags.js
@@ -89,11 +89,11 @@ module.exports = function(Topics) {
return callback(err);
}
- addTagData(tags, callback);
+ Topics.getTagData(tags, callback);
});
};
- function addTagData(tags, callback) {
+ Topics.getTagData = function(tags, callback) {
var keys = tags.map(function(tag) {
return 'tag:' + tag.value;
});
@@ -109,7 +109,7 @@ module.exports = function(Topics) {
});
callback(null, tags);
});
- }
+ };
Topics.getTopicTags = function(tid, callback) {
db.getSetMembers('topic:' + tid + ':tags', callback);
@@ -139,7 +139,7 @@ module.exports = function(Topics) {
async.parallel({
tagData: function(next) {
- addTagData(tags, next);
+ Topics.getTagData(tags, next);
},
counts: function(next) {
db.sortedSetScores('tags:topic:count', uniqueTopicTags, next);
@@ -214,12 +214,13 @@ module.exports = function(Topics) {
return callback(null, []);
}
-
db.getSortedSetRevRange('tags:topic:count', 0, -1, function(err, tags) {
if (err) {
return callback(null, []);
}
-
+ if (data.query === '') {
+ return callback(null, tags);
+ }
data.query = data.query.toLowerCase();
var matches = [];
for(var i=0; i meta.config.maximumUsernameLength) {
+ return next(new Error('[[error:username-too-long]]'));
+ }
+
if(!utils.isUserNameValid(data.username) || !userslug) {
return next(new Error('[[error:invalid-username]]'));
}