diff --git a/README.md b/README.md index b08b6c3a84..831a6aa303 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![Build Status](https://travis-ci.org/NodeBB/NodeBB.svg?branch=master)](https://travis-ci.org/NodeBB/NodeBB) [![Dependency Status](https://david-dm.org/nodebb/nodebb.svg)](https://david-dm.org/nodebb/nodebb) [![Code Climate](https://codeclimate.com/github/designcreateplay/NodeBB.png)](https://codeclimate.com/github/designcreateplay/NodeBB) +[![Documentation Status](https://readthedocs.org/projects/nodebb/badge/?version=latest)](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]]')); }