From cd35c135ccd25b0caf0c1f3c6ff1ec8a3ece0242 Mon Sep 17 00:00:00 2001 From: pichalite Date: Mon, 10 Oct 2016 23:35:57 +0000 Subject: [PATCH 01/79] modify user edit password screen to match register page for displaying validations --- public/src/client/account/edit/password.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/public/src/client/account/edit/password.js b/public/src/client/account/edit/password.js index 3dc36c25b2..cadf12c146 100644 --- a/public/src/client/account/edit/password.js +++ b/public/src/client/account/edit/password.js @@ -98,21 +98,19 @@ define('forum/account/edit/password', ['forum/account/header', 'translator'], fu function showError(element, msg) { translator.translate(msg, function(msg) { - element.find('.error').html(msg).removeClass('hide').siblings().addClass('hide'); + element.html(msg); element.parent() - .removeClass('alert-success') - .addClass('alert-danger'); - element.show(); + .removeClass('show-success') + .addClass('show-danger'); }); } function showSuccess(element) { - element.find('.success').removeClass('hide').siblings().addClass('hide'); + element.html(''); element.parent() - .removeClass('alert-danger') - .addClass('alert-success'); - element.show(); + .removeClass('show-danger') + .addClass('show-success'); } return AccountEditPassword; From 3c52327c0bb9e2618aa6e03ee6af4d8ee6112c3e Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 11 Oct 2016 10:43:44 +0300 Subject: [PATCH 02/79] closes #5098 --- public/src/widgets.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/public/src/widgets.js b/public/src/widgets.js index ffa539c6ff..8bae7cc465 100644 --- a/public/src/widgets.js +++ b/public/src/widgets.js @@ -1,5 +1,5 @@ "use strict"; -/*global ajaxify, templates, config, RELATIVE_PATH*/ +/*global ajaxify, templates, config, utils*/ (function(ajaxify) { ajaxify.widgets = {}; @@ -15,6 +15,7 @@ }; ajaxify.widgets.render = function(template, url, callback) { + callback = callback || function() {}; if (template.match(/^admin/)) { return callback(); } @@ -35,9 +36,7 @@ } function renderWidgets(locations) { - var areaDatas = []; - - $.get(RELATIVE_PATH + '/api/widgets/render' + (config['cache-buster'] ? '?v=' + config['cache-buster'] : ''), { + $.get(config.relative_path + '/api/widgets/render' + (config['cache-buster'] ? '?v=' + config['cache-buster'] : ''), { locations: locations, template: template + '.tpl', url: url, @@ -91,9 +90,7 @@ }); $(window).trigger('action:widgets.loaded', {}); - if (typeof callback === 'function') { - callback(); - } + callback(renderedAreas); }); } From 035d59f52cea49bbfdb0208335a82e15b53487c3 Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Tue, 11 Oct 2016 09:02:17 -0400 Subject: [PATCH 03/79] Latest translations and fallbacks --- public/language/nl/category.json | 4 +-- public/language/nl/error.json | 14 +++++----- public/language/nl/global.json | 10 +++---- public/language/nl/groups.json | 2 +- public/language/nl/modules.json | 4 +-- public/language/nl/topic.json | 22 ++++++++-------- public/language/pl/category.json | 4 +-- public/language/pl/error.json | 4 +-- public/language/pl/global.json | 6 ++--- public/language/pl/groups.json | 6 ++--- public/language/pl/modules.json | 6 ++--- public/language/pl/notifications.json | 4 +-- public/language/pl/pages.json | 16 +++++------ public/language/pl/topic.json | 38 +++++++++++++-------------- public/language/pl/user.json | 24 ++++++++--------- 15 files changed, 82 insertions(+), 82 deletions(-) diff --git a/public/language/nl/category.json b/public/language/nl/category.json index 13cfde9a39..15a78d7d92 100644 --- a/public/language/nl/category.json +++ b/public/language/nl/category.json @@ -14,7 +14,7 @@ "ignoring": "Negerend", "watching.description": "Toon ongelezen onderwerpen", "ignoring.description": "Toon geen onderwerpen onder ongelezen onderwerpen", - "watch.message": "You are now watching updates from this category and all subcategories", - "ignore.message": "You are now ignoring updates from this category and all subcategories", + "watch.message": "Van deze categorie en alle sub-categorieën worden nu meldingen ontvangen ", + "ignore.message": " Er worden geen meldingen van deze categorie en alle sub-categorieën ontvangen ", "watched-categories": "Categorieën die bekeken zijn." } \ No newline at end of file diff --git a/public/language/nl/error.json b/public/language/nl/error.json index a3545d8fd9..f680a96487 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -20,7 +20,7 @@ "email-taken": "E-mailadres is al in gebruik", "email-not-confirmed": "Het e-mailadres van dit account is nog niet bevestigd, klik hier om je e-mailadres te bevestigen.", "email-not-confirmed-chat": "Het gebruik van chatfunctionaliteit is pas toegestaan na validatie van het e-mailadres.", - "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email.", + "email-not-confirmed-email-sent": "Je email adres is niet bevestigd, kijk of je de bevestigingsmail hebt ontvangen.", "no-email-to-confirm": "Dit berichtenforum vereist bevestiging per e-mail, klik hier om een e-mailadres te registreren", "email-confirm-failed": "Helaas kon het e-mailadres niet bevestigd worden, probeer het later nog eens.", "confirm-email-already-sent": "Bevestigingsmail is zojuist al verzonden, wacht alsjeblieft %1 minuut (minuten) voordat je opnieuw een bevestigingsmail aanvraagt.", @@ -29,7 +29,7 @@ "username-too-long": "Gebruikersnaam is te lang", "password-too-long": "Wachtwoord is te lang", "user-banned": "Gebruiker verbannen", - "user-banned-reason": "User banned (Reason: %1)", + "user-banned-reason": "Gebruiker verbannen (Reden: 1%)", "user-too-new": "Helaas, het is een vereiste om %1 seconde(n) te wachten voordat het eerste bericht geplaatst kan worden.", "blacklisted-ip": "Sorry, uw IP-adres is verbannen uit deze community. Als u meent dat dit onterecht is, neem dan contact op met een beheerder.", "ban-expiry-missing": "Geef een einddatum op voor deze ban.", @@ -56,13 +56,13 @@ "post-delete-duration-expired-hours-minutes": "Je kunt berichten pas %1 uur %2 minuten na het plaatsen verwijderen.", "post-delete-duration-expired-days": "Je kunt berichten pas %1 dagen na het plaatsen verwijderen.", "post-delete-duration-expired-days-hours": "Je kunt berichten pas %1 dag(en) %2 uur na het plaatsen verwijderen.", - "cant-delete-topic-has-reply": "You can't delete your topic after it has a reply", - "cant-delete-topic-has-replies": "You can't delete your topic after it has %1 replies", + "cant-delete-topic-has-reply": "Je kunt je topic niet verwijderen nadat iemand heeft gereageerd", + "cant-delete-topic-has-replies": "Je kunt je topic niet verwijderen als het %1 reacties heeft", "content-too-short": "Geef wat meer inhoud aan een bericht! Berichten dienen uit minimaal %1 teken(s) te bestaan.", "content-too-long": "Kort het bericht wat in, het aantal gebruikte tekens overschrijdt het ingestelde limiet want berichten mogen niet meer dan %1 teken(s) bevatten.", "title-too-short": "Geef een titel op die uit meer tekens bestaat. Titels dienen ten minste uit %1 teken(s) te bestaan.", "title-too-long": "Geef een kortere titel op. Titels mogen uit niet meer dan %1 teken(s) bestaan.", - "category-not-selected": "Category not selected.", + "category-not-selected": "Categorie niet geselecteerd ", "too-many-posts": "Het is slechts toegestaan iedere %1 seconde(n) een bericht te plaatsen - wacht even voordat opnieuw een bericht verzonden wordt", "too-many-posts-newbie": "Nieuwe gebruikersaccounts zoals deze zijn begrensd en mogen slechts iedere %1 seconde(n) berichten plaatsen, tot het moment dat %2 reputatie verdiend is - wacht daarom even met opnieuw een bericht te plaatsten", "tag-too-short": "Geef een tag op die uit meer tekens bestaat. Tags dienen uit minimaal %1 teken(s) te bestaan.", @@ -126,6 +126,6 @@ "cant-kick-self": "Je kunt jezelf niet uit een groep schoppen", "no-users-selected": "Geen gebruiker(s) geselecteerd", "invalid-home-page-route": "Onbekende homepage route", - "invalid-session": "Session Mismatch", - "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page." + "invalid-session": "Verkeerde sessie combinatie", + "invalid-session-text": "Het lijkt erop dat je login sessie niet meer actief is of niet langer synchroon is met de server. Ververs de pagina." } \ No newline at end of file diff --git a/public/language/nl/global.json b/public/language/nl/global.json index b8e4f21a31..d23baeb60d 100644 --- a/public/language/nl/global.json +++ b/public/language/nl/global.json @@ -7,10 +7,10 @@ "403.login": "Je kan proberen in te loggen?", "404.title": "Niet gevonden", "404.message": "Deze pagina bestaat niet. Klik hier om naar de hoofdpagina van deze website te navigeren.", - "500.title": "Internal Error.", + "500.title": "Interne fout", "500.message": "Oeps! Ziet er naar uit dat iets fout ging!", - "400.title": "Bad Request.", - "400.message": "It looks like this link is malformed, please double-check and try again. Otherwise, return to the home page.", + "400.title": "Foutief verzoek", + "400.message": "Het lijkt erop dat de link onjuist is. Kijk het nog eens na en probeer het opnieuw. Of ga terug naar de startpagina.", "register": "Registeren", "login": "Login", "please_log_in": "Aanmelden", @@ -96,7 +96,7 @@ "upload_file": "Upload bestand", "upload": "Upload", "allowed-file-types": "Toegestane bestandstypen zijn %1", - "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", + "unsaved-changes": "Je hebt niet opgeslagen wijzigingen aangebracht. Weet je zeker dat je de pagina wilt verlaten?", + "reconnecting-message": "Het lijkt erop dat je verbinding naar %1 verloren is gegaan, wacht even terwijl we de verbinding proberen te herstellen.", "play": "Afspelen" } \ No newline at end of file diff --git a/public/language/nl/groups.json b/public/language/nl/groups.json index 23bab29f72..fe5486a4ef 100644 --- a/public/language/nl/groups.json +++ b/public/language/nl/groups.json @@ -51,6 +51,6 @@ "membership.reject": "Afwijzen", "new-group.group_name": "Groepsnaam:", "upload-group-cover": "Upload groepscover", - "bulk-invite-instructions": "Enter a list of comma separated usernames to invite to this group", + "bulk-invite-instructions": "Vul een lijst is met gebruikersnamen gescheiden met komma's om deze uit te nodigen voor deze groep", "bulk-invite": "Massa uitnodiging" } \ No newline at end of file diff --git a/public/language/nl/modules.json b/public/language/nl/modules.json index 2d000043d1..7ac1846c59 100644 --- a/public/language/nl/modules.json +++ b/public/language/nl/modules.json @@ -37,8 +37,8 @@ "composer.formatting.picture": "Afbeelding", "composer.upload-picture": "Upload afbeelding", "composer.upload-file": "Upload bestand", - "composer.zen_mode": "Zen Mode", - "composer.select_category": "Select a category", + "composer.zen_mode": "Zen-modus", + "composer.select_category": "Selecteer een categorie", "bootbox.ok": "OK", "bootbox.cancel": "Annuleren", "bootbox.confirm": "Bevestig", diff --git a/public/language/nl/topic.json b/public/language/nl/topic.json index e4a415c463..c1cf28394a 100644 --- a/public/language/nl/topic.json +++ b/public/language/nl/topic.json @@ -31,21 +31,21 @@ "bookmark_instructions": "Klik hier om terug te keren naar de laatst gelezen post in deze thread.", "flag_title": "Bericht aan beheerders melden", "flag_success": "Dit bericht is gerapporteerd aan de beheerder.", - "flag_manage_title": "Flagged post in %1", + "flag_manage_title": "Gemarkeerd bericht in %1", "flag_manage_history": "Activiteiten geschiedenis", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", + "flag_manage_no_history": "Geen geschiedenis te tonen", + "flag_manage_assignee": "Toekenning", + "flag_manage_state": "Staat", "flag_manage_state_open": "Nieuw/Open", - "flag_manage_state_wip": "Work in Progress", + "flag_manage_state_wip": "Wordt aan gewerkt", "flag_manage_state_resolved": "Opgelost", "flag_manage_state_rejected": "Afgewezen", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", + "flag_manage_notes": "Gedeelde notities", + "flag_manage_update": "Markering updaten", + "flag_manage_history_assignee": "Toegewezen aan %1", + "flag_manage_history_state": "Update status naar 1%", + "flag_manage_history_notes": "Update gemarkeerde notities", + "flag_manage_saved": "Markeering details geupdatet", "deleted_message": "Dit onderwerp is verwijderd. Alleen gebruikers met beheerrechten op onderwerpniveau kunnen dit inzien.", "following_topic.message": "Vanaf nu worden meldingen ontvangen zodra iemand een reactie op dit onderwerp geeft.", "not_following_topic.message": "Dit onderwerp zal verschijnen in de lijst van ongelezen onderwerpen, maar er zullen geen meldingen ontvangen zodra iemand een reactie op dit onderwerp geeft.", diff --git a/public/language/pl/category.json b/public/language/pl/category.json index 8b6e792605..9b88cda26d 100644 --- a/public/language/pl/category.json +++ b/public/language/pl/category.json @@ -14,7 +14,7 @@ "ignoring": "Ignorowanie", "watching.description": "Pokaż tematy jako nieprzeczytane", "ignoring.description": "Nie pokazuj tematów jako nieprzeczytane", - "watch.message": "You are now watching updates from this category and all subcategories", - "ignore.message": "You are now ignoring updates from this category and all subcategories", + "watch.message": "Włączyłeś powiadomienia dla tej kategorii oraz subkategorii.", + "ignore.message": "Wyłączyłeś powiadomienia dla tej kategorii oraz subkategorii.", "watched-categories": "Obserwowane kategorie" } \ No newline at end of file diff --git a/public/language/pl/error.json b/public/language/pl/error.json index 5285ccd8eb..2c13042f2e 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -15,7 +15,7 @@ "invalid-username-or-password": "Proszę podać nazwę użytkownika i hasło", "invalid-search-term": "Błędne wyszukiwane wyrażenie", "csrf-invalid": "Nie mogliśmy Cię zalogować. Zapewne przyczyną jest wygasła sesja. Proszę spróbuj ponownie.", - "invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", + "invalid-pagination-value": "Błędna wartość paginacji, zakres od %1 do %2", "username-taken": "Login zajęty", "email-taken": "Email zajęty", "email-not-confirmed": "Twój email nie został jeszcze potwierdzony. Proszę kliknąć tutaj by go potwierdzić.", @@ -62,7 +62,7 @@ "content-too-long": "Prosimy wpisać krótszy post. Posty nie mogą zawierać więcej niż %1 znaków.", "title-too-short": "Prosimy podać dłuższy tytuł. Tytuły powinny zawierać co najmniej %1 znaków.", "title-too-long": "Prosimy podać krótszy tytuł. Tytuły nie mogą być dłuższe niż %1 znaków.", - "category-not-selected": "Category not selected.", + "category-not-selected": "Nie wybrano kategorii.", "too-many-posts": "Możesz wysyłać posty raz na %1 sekund - prosimy poczekać przed ponownym dodaniem posta", "too-many-posts-newbie": "Jako nowy użytkownik możesz wysyłać posty raz na %1 sekund, dopóki nie zdobędziesz %2 reputacji - prosimy poczekać przed ponownym dodaniem posta", "tag-too-short": "Prosimy wprowadzić dłuższy tag. Tagi muszą posiadać przynajmniej %1 znak(ów)", diff --git a/public/language/pl/global.json b/public/language/pl/global.json index c8f158685b..7354281f22 100644 --- a/public/language/pl/global.json +++ b/public/language/pl/global.json @@ -57,15 +57,15 @@ "upvoted": "Oddane głosy za", "downvoters": "Głosujący przeciw", "downvoted": "Oddane głosy przeciw", - "views": "wyświetleń", + "views": "Wyświetleń", "reputation": "Punkty reputacji", "read_more": "czytaj więcej", "more": "Więcej", "posted_ago_by_guest": "wysłany %1 przez Gościa", "posted_ago_by": "wysłany %1 przez %2", "posted_ago": "wysłany %1", - "posted_in": "posted in %1", - "posted_in_by": "posted in %1 by %2", + "posted_in": "napisane w %1", + "posted_in_by": "napisane w %1 przez %2", "posted_in_ago": "wysłany w %1 %2", "posted_in_ago_by": "wysłany w %1 %2 przez %3", "user_posted_ago": "%1 wysłał %2", diff --git a/public/language/pl/groups.json b/public/language/pl/groups.json index 9124dc8a64..d80403decd 100644 --- a/public/language/pl/groups.json +++ b/public/language/pl/groups.json @@ -24,7 +24,7 @@ "details.has_no_posts": "Członkowie tej grupy nie napisali żadnych postów.", "details.latest_posts": "Ostatnie posty", "details.private": "Prywatna", - "details.disableJoinRequests": "Disable join requests", + "details.disableJoinRequests": "Wyłączono prośbę o dołączenie", "details.grant": "Nadaj/Cofnij prawa Właściciela", "details.kick": "Wykop", "details.owner_options": "Administracja grupy", @@ -51,6 +51,6 @@ "membership.reject": "Odrzuć", "new-group.group_name": "Nazwa Grupy:", "upload-group-cover": "Załaduj zdjęcie tła grupy", - "bulk-invite-instructions": "Enter a list of comma separated usernames to invite to this group", - "bulk-invite": "Bulk Invite" + "bulk-invite-instructions": "Wprowadź listę oddzielonych przecinkami nazw użytkowników, których chcesz zaprosić do tej grupy", + "bulk-invite": "Wielki zaproszenie" } \ No newline at end of file diff --git a/public/language/pl/modules.json b/public/language/pl/modules.json index 39b9f025bc..cce67284de 100644 --- a/public/language/pl/modules.json +++ b/public/language/pl/modules.json @@ -18,8 +18,8 @@ "chat.thirty_days": "30 dni", "chat.three_months": "3 miesiące", "chat.delete_message_confirm": "Jesteś pewny, że chcesz usunąć tą wiadomość?", - "chat.roomname": "Chat Room %1", - "chat.add-users-to-room": "Add users to room", + "chat.roomname": "Pokój Czatu %1", + "chat.add-users-to-room": "Dodaj użytkownika do pokoju czatu", "composer.compose": "Twórz", "composer.show_preview": "Pokaż Podgląd", "composer.hide_preview": "Ukryj Podgląd", @@ -38,7 +38,7 @@ "composer.upload-picture": "Wyślij obraz", "composer.upload-file": "Wyślij plik", "composer.zen_mode": "Tryb Zen", - "composer.select_category": "Select a category", + "composer.select_category": "Wybierz kategorie", "bootbox.ok": "OK", "bootbox.cancel": "Anuluj", "bootbox.confirm": "Potwierdź", diff --git a/public/language/pl/notifications.json b/public/language/pl/notifications.json index 1285c2dd83..bc111f1e74 100644 --- a/public/language/pl/notifications.json +++ b/public/language/pl/notifications.json @@ -12,8 +12,8 @@ "you_have_unread_notifications": "Masz nieprzeczytane powiadomienia.", "new_message_from": "Nowa wiadomość od %1", "upvoted_your_post_in": "%1 zagłosował na Twój post w %2", - "upvoted_your_post_in_dual": "%1 and %2 have upvoted your post in %3.", - "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", + "upvoted_your_post_in_dual": "%1 oraz%2 za na twój post w %3.", + "upvoted_your_post_in_multiple": "%1 oraz %2 innych zagłosowało za na twój post w%3.", "moved_your_post": "%1 przeniósł twoj post do %2", "moved_your_topic": "%1 przeniósł %2", "user_flagged_post_in": "%1 oflagował Twój post w %2", diff --git a/public/language/pl/pages.json b/public/language/pl/pages.json index 24f820e6e4..d75d4291e6 100644 --- a/public/language/pl/pages.json +++ b/public/language/pl/pages.json @@ -6,19 +6,19 @@ "popular-month": "Tematy popularne w tym miesiącu", "popular-alltime": "Wszystkie popularne tematy", "recent": "Ostatnie Tematy", - "flagged-posts": "Flagged Posts", + "flagged-posts": "Oflagowane posty", "users/online": "Dostępni Użytkownicy", "users/latest": "Nowi Użytkownicy", "users/sort-posts": "Użytkownicy z największą liczbą postów", "users/sort-reputation": "Użytkownicy z najwyższą reputacją", - "users/banned": "Banned Users", + "users/banned": "Zbanowani użytkownicy", "users/most-flags": "Najczęściej oznaczani użytkownicy", "users/search": "Wyszukiwanie Użytkownków", "notifications": "Powiadomienia", "tags": "Tagi", "tag": "Tematy oznaczone jako \"%1\"", "register": "Utwórz konto", - "registration-complete": "Registration complete", + "registration-complete": "Rejestracja przebiegła pomyślnie", "login": "Zaloguj się na swoje konto", "reset": "Zresetuj hasło do swojego konta", "categories": "Kategorie", @@ -27,9 +27,9 @@ "chats": "Rozmowy", "chat": "Rozmowa z %1", "account/edit": "Edytowanie \"%1\"", - "account/edit/password": "Editing password of \"%1\"", - "account/edit/username": "Editing username of \"%1\"", - "account/edit/email": "Editing email of \"%1\"", + "account/edit/password": "Edytowanie hasła \"%1\"", + "account/edit/username": "Edytowanie nazwy \"%1\"", + "account/edit/email": "Edytowanie adresu email \"%1\"", "account/info": "Informacje o koncie", "account/following": "Obserwowani przez %1", "account/followers": "Obserwujący %1", @@ -39,8 +39,8 @@ "account/favourites": "%1 - ulubione posty", "account/settings": "Ustawienia Użytkownika", "account/watched": "Tematy obserwowane przez %1", - "account/upvoted": "Posts upvoted by %1", - "account/downvoted": "Posts downvoted by %1", + "account/upvoted": "Posty za głosowane za przez %1", + "account/downvoted": "Posty za głosowane przeciw przez %1", "account/best": "Najlepsze posty od %1", "confirm": "E-mail potwierdzony", "maintenance.text": "Obecnie trwają prace konserwacyjne nad %1. Proszę wrócić później.", diff --git a/public/language/pl/topic.json b/public/language/pl/topic.json index 168bce58bf..a6b632d345 100644 --- a/public/language/pl/topic.json +++ b/public/language/pl/topic.json @@ -13,7 +13,7 @@ "notify_me": "Powiadamiaj mnie o nowych odpowiedziach w tym temacie", "quote": "Cytuj", "reply": "Odpowiedz", - "reply-as-topic": "Reply as topic", + "reply-as-topic": "Odpowiedz na temat", "guest-login-reply": "Zaloguj się, aby odpowiedzieć.", "edit": "Edytuj", "delete": "Usuń", @@ -31,21 +31,21 @@ "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Zgłoś post do moderacji", "flag_success": "Ten post został oznaczony do moderacji.", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", + "flag_manage_title": "Oflagowanych postów do %1", + "flag_manage_history": "Historia wykonanych akcji", + "flag_manage_no_history": "Brak historii eventów ", + "flag_manage_assignee": "Beneficjant", + "flag_manage_state": "Stan", + "flag_manage_state_open": "Nowy/Otwarty", + "flag_manage_state_wip": "W trakcie prac", + "flag_manage_state_resolved": "Zdecydowany", + "flag_manage_state_rejected": "Odrzucono", + "flag_manage_notes": "Udostępniono notki", + "flag_manage_update": "Zaktualizowano status oflagowanych postów", + "flag_manage_history_assignee": "Przypisane do %1", + "flag_manage_history_state": "Zaktualizowano stan do %1", + "flag_manage_history_notes": "Zaktualizowano notki oflagowanych postów", + "flag_manage_saved": "Zaktualizowano oflagowane posty", "deleted_message": "Ten temat został skasowany. Tylko użytkownicy z uprawnieniami do zarządzania mogą go zobaczyć.", "following_topic.message": "Będziesz od teraz otrzymywał powiadomienia, gdy ktoś odpowie w tym temacie.", "not_following_topic.message": "Zobaczysz ten temat na liście nieprzeczytanych, ale nie otrzymasz żadnego powiadomienia dotyczącego tego tematu.", @@ -113,7 +113,7 @@ "composer.uploading": "wysyłanie...", "composer.thumb_url_label": "Wklej adres miniaturki tematu", "composer.thumb_title": "Dodaj miniaturkę do tego tematu", - "composer.thumb_url_placeholder": "http://example.com/thumb.png", + "composer.thumb_url_placeholder": "http://przykład.pl/thumb.png", "composer.thumb_file_label": "lub wyślij plik", "composer.thumb_remove": "Wyczyść pola", "composer.drag_and_drop_images": "Przeciągnij i upuść obrazek tutaj.", @@ -127,9 +127,9 @@ "most_votes": "Najwięcej głosów", "most_posts": "Najwięcej postów", "stale.title": "Stworzyć nowy temat?", - "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", + "stale.warning": "Wątek na który chcesz udzielić odpowiedzi jest przestarzały. Czy nie chciałbyś, utworzyć nowego tematu zamiast udzielać się w tym.", "stale.create": "Stwórz nowy temat", - "stale.reply_anyway": "Reply to this topic anyway", + "stale.reply_anyway": "Odpowiedź na ten temat mimo tego", "link_back": "Re: [%1](%2)", "spam": "Spam", "offensive": "Obrażliwy", diff --git a/public/language/pl/user.json b/public/language/pl/user.json index e7d16aff71..7d5f06b7b0 100644 --- a/public/language/pl/user.json +++ b/public/language/pl/user.json @@ -21,8 +21,8 @@ "joined": "Dołączono", "lastonline": "Ostatnio online", "profile": "Profil", - "profile_views": "wyświetleń", - "reputation": "reputacji", + "profile_views": "Wyświetleń", + "reputation": "Reputacji", "favourites": "Ulubione", "watched": "Obserwowane", "followers": "Śledzących", @@ -80,9 +80,9 @@ "has_no_posts": "Ten użytkownik nic jeszcze nie napisał.", "has_no_topics": "Ten użytkownik nie stworzył jeszcze żadnych tematów.", "has_no_watched_topics": "Ten użytkownik nie obserwuje jeszcze żadnych tematów.", - "has_no_upvoted_posts": "This user hasn't upvoted any posts yet.", - "has_no_downvoted_posts": "This user hasn't downvoted any posts yet.", - "has_no_voted_posts": "This user has no voted posts", + "has_no_upvoted_posts": "Ten użytkownik jeszcze nie głosował za w żadnym temacie", + "has_no_downvoted_posts": "Ten użytkownik jeszcze nie głosował przeciw w żadnym temacie.", + "has_no_voted_posts": "Ten użytkownik nie ma jeszcze ocenionych postów", "email_hidden": "Adres e-mail ukryty", "hidden": "ukryty", "paginate_description": "Dziel tematy i posty na strony zamiast używać nieskończonego przewijania", @@ -106,11 +106,11 @@ "grouptitle": "Tytuł grupy", "no-group-title": "Brak tytułu grupy", "select-skin": "Wybierz Skórkę", - "select-homepage": "Select a Homepage", - "homepage": "Homepage", - "homepage_description": "Select a page to use as the forum homepage or 'None' to use the default homepage.", - "custom_route": "Custom Homepage Route", - "custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\", or \"popular\")", + "select-homepage": "Wybierz stronę startową", + "homepage": "Strona startowa", + "homepage_description": "Wybierz stroną jaką chcesz mieć ustawioną na domyślną, lub \"None\" jeśli chcesz używać domyślnej. ", + "custom_route": "Niestandardowa strona startowa", + "custom_route_help": "Wpisz niestandardowa stronę startową, bez slashu (np. \"recent\", albo \"popular\")", "sso.title": "Usługi Pojedynczego Logowania", "sso.associated": "Powiązane z", "sso.not-associated": "Kliknij tutaj, aby powiązać z", @@ -124,6 +124,6 @@ "info.banned-no-reason": "Nie podano powodu.", "info.username-history": "Historia nazwy użytkownika", "info.email-history": "Historia adresu e-mail", - "info.moderation-note": "Moderation Note", - "info.moderation-note.success": "Moderation note saved" + "info.moderation-note": "Notka moderatora", + "info.moderation-note.success": "Notka nie została zapisana" } \ No newline at end of file From 038418bf87fa42ef91e1d6e412b617b307e96487 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 11 Oct 2016 16:06:42 +0300 Subject: [PATCH 04/79] batch.processArray use batch.processArray in notifications.push and moveRecentReplies added notification tests added test for moveRecentReplies clear group cache if a group is deleted --- src/batch.js | 50 +++++++++++++++- src/categories/recentreplies.js | 58 +++++++----------- src/groups/delete.js | 7 ++- src/notifications.js | 35 +++-------- test/categories.js | 74 ++++++++++++++++++++--- test/groups.js | 14 ++--- test/notifications.js | 102 ++++++++++++++++++++++++++++++++ 7 files changed, 259 insertions(+), 81 deletions(-) create mode 100644 test/notifications.js diff --git a/src/batch.js b/src/batch.js index 1a425e1a21..329ae624d5 100644 --- a/src/batch.js +++ b/src/batch.js @@ -16,7 +16,7 @@ var async = require('async'), options = {}; } - callback = typeof callback === 'function' ? callback : function(){}; + callback = typeof callback === 'function' ? callback : function() {}; options = options || {}; if (typeof process !== 'function') { @@ -63,4 +63,52 @@ var async = require('async'), ); }; + Batch.processArray = function(array, process, options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + callback = typeof callback === 'function' ? callback : function() {}; + options = options || {}; + + if (!Array.isArray(array) || !array.length) { + return callback(); + } + if (typeof process !== 'function') { + return callback(new Error('[[error:process-not-a-function]]')); + } + + var batch = options.batch || DEFAULT_BATCH_SIZE; + var start = 0; + var done = false; + + async.whilst( + function() { + return !done; + }, + function(next) { + var currentBatch = array.slice(start, start + batch); + if (!currentBatch.length) { + done = true; + return next(); + } + process(currentBatch, function(err) { + if (err) { + return next(err); + } + start = start + batch; + if (options.interval) { + setTimeout(next, options.interval); + } else { + next(); + } + }); + }, + function(err) { + callback(err); + } + ); + }; + }(exports)); diff --git a/src/categories/recentreplies.js b/src/categories/recentreplies.js index e7a1d0ba4e..c71c1b907c 100644 --- a/src/categories/recentreplies.js +++ b/src/categories/recentreplies.js @@ -10,6 +10,7 @@ var db = require('../database'); var posts = require('../posts'); var topics = require('../topics'); var privileges = require('../privileges'); +var batch = require('../batch'); module.exports = function(Categories) { @@ -182,7 +183,8 @@ module.exports = function(Categories) { }); } - Categories.moveRecentReplies = function(tid, oldCid, cid) { + Categories.moveRecentReplies = function(tid, oldCid, cid, callback) { + callback = callback || function() {}; updatePostCount(tid, oldCid, cid); topics.getPids(tid, function(err, pids) { if (err) { @@ -193,47 +195,31 @@ module.exports = function(Categories) { return; } - var start = 0, - done = false, - batch = 50; + batch.processArray(pids, function(pids, next) { + async.waterfall([ + function(next) { + posts.getPostsFields(pids, ['timestamp'], next); + }, + function(postData, next) { + var timestamps = postData.map(function(post) { + return post && post.timestamp; + }); - async.whilst(function() { - return !done; - }, function(next) { - var movePids = pids.slice(start, start + batch); - if (!movePids.length) { - done = true; - return next(); - } - - posts.getPostsFields(movePids, ['timestamp'], function(err, postData) { - if (err) { - return next(err); + async.parallel([ + function(next) { + db.sortedSetRemove('cid:' + oldCid + ':pids', pids, next); + }, + function(next) { + db.sortedSetAdd('cid:' + cid + ':pids', timestamps, pids, next); + } + ], next); } - - var timestamps = postData.map(function(post) { - return post && post.timestamp; - }); - - async.parallel([ - function(next) { - db.sortedSetRemove('cid:' + oldCid + ':pids', movePids, next); - }, - function(next) { - db.sortedSetAdd('cid:' + cid + ':pids', timestamps, movePids, next); - } - ], function(err) { - if (err) { - return next(err); - } - start += batch; - next(); - }); - }); + ], next); }, function(err) { if (err) { winston.error(err.stack); } + callback(err); }); }); }; diff --git a/src/groups/delete.js b/src/groups/delete.js index 8c7b194d28..af79757e9c 100644 --- a/src/groups/delete.js +++ b/src/groups/delete.js @@ -16,6 +16,7 @@ module.exports = function(Groups) { return callback(); } var groupObj = groupsData[0]; + plugins.fireHook('action:group.destroy', groupObj); async.parallel([ @@ -40,7 +41,11 @@ module.exports = function(Groups) { }); } ], function(err) { - callback(err); + if (err) { + return callback(err); + } + Groups.resetCache(); + callback(); }); }); }; diff --git a/src/notifications.js b/src/notifications.js index e4df61f260..7c0056a533 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -11,6 +11,7 @@ var db = require('./database'); var User = require('./user'); var groups = require('./groups'); var meta = require('./meta'); +var batch = require('./batch'); var plugins = require('./plugins'); var utils = require('../public/src/utils'); @@ -168,36 +169,14 @@ var utils = require('../public/src/utils'); return callback(); } - var done = false; - var start = 0; - var batchSize = 50; - setTimeout(function() { - async.whilst( - function() { - return !done; - }, - function(next) { - var currentUids = uids.slice(start, start + batchSize); - if (!currentUids.length) { - done = true; - return next(); - } - pushToUids(currentUids, notification, function(err) { - if (err) { - return next(err); - } - start = start + batchSize; - - setTimeout(next, 1000); - }); - }, - function(err) { - if (err) { - winston.error(err.stack); - } + batch.processArray(uids, function(uids, next) { + pushToUids(uids, notification, next); + }, {interval: 1000}, function(err) { + if (err) { + winston.error(err.stack); } - ); + }); }, 1000); callback(); diff --git a/test/categories.js b/test/categories.js index 9e762f5a90..f9ce55f916 100644 --- a/test/categories.js +++ b/test/categories.js @@ -1,19 +1,30 @@ 'use strict'; -/*global require, process, after*/ +/*global require, after, before*/ -var winston = require('winston'); -process.on('uncaughtException', function (err) { - winston.error('Encountered error while running test suite: ' + err.message); -}); - -var assert = require('assert'), - db = require('./mocks/databasemock'); +var async = require('async'); +var assert = require('assert'); +var db = require('./mocks/databasemock'); var Categories = require('../src/categories'); +var Topics = require('../src/topics'); +var User = require('../src/user'); describe('Categories', function() { var categoryObj; + var posterUid; + + before(function(done) { + User.create({username: 'poster'}, function(err, _posterUid) { + if (err) { + return done(err); + } + + posterUid = _posterUid; + + done(); + }); + }); describe('.create', function() { it('should create a new category', function(done) { @@ -115,6 +126,53 @@ describe('Categories', function() { }); }); + describe('Categories.moveRecentReplies', function() { + var moveCid; + var moveTid; + before(function(done) { + async.parallel({ + category: function(next) { + Categories.create({ + name: 'Test Category 2', + description: 'Test category created by testing script' + }, next); + }, + topic: function(next) { + Topics.post({ + uid: posterUid, + cid: categoryObj.cid, + title: 'Test Topic Title', + content: 'The content of test topic' + }, next); + } + }, function(err, results) { + if (err) { + return done(err); + } + moveCid = results.category.cid; + moveTid = results.topic.topicData.tid; + Topics.reply({uid: posterUid, content: 'test post', tid: moveTid}, function(err) { + done(err); + }); + }); + }); + + it('should move posts from one category to another', function(done) { + Categories.moveRecentReplies(moveTid, categoryObj.cid, moveCid, function(err) { + assert.ifError(err); + db.getSortedSetRange('cid:' + categoryObj.cid + ':pids', 0, -1, function(err, pids) { + assert.ifError(err); + assert.equal(pids.length, 0); + db.getSortedSetRange('cid:' + moveCid + ':pids', 0, -1, function(err, pids) { + assert.ifError(err); + assert.equal(pids.length, 2); + done(); + }); + }); + }); + }); + }); + after(function(done) { db.flushdb(done); }); diff --git a/test/groups.js b/test/groups.js index 43b1857b99..a28e84f14e 100644 --- a/test/groups.js +++ b/test/groups.js @@ -1,15 +1,16 @@ 'use strict'; /*global require, before, after*/ -var assert = require('assert'), - async = require('async'), +var assert = require('assert'); +var async = require('async'); - db = require('./mocks/databasemock'), - Groups = require('../src/groups'), - User = require('../src/user'); +var db = require('./mocks/databasemock'); +var Groups = require('../src/groups'); +var User = require('../src/user'); describe('Groups', function() { before(function(done) { + Groups.resetCache(); async.parallel([ function(next) { // Create a group to play around with @@ -35,8 +36,7 @@ describe('Groups', function() { describe('.list()', function() { it('should list the groups present', function(done) { Groups.getGroupsFromSet('groups:createtime', 0, 0, -1, function(err, groups) { - if (err) return done(err); - + assert.ifError(err); assert.equal(groups.length, 3); done(); }); diff --git a/test/notifications.js b/test/notifications.js new file mode 100644 index 0000000000..923087fce5 --- /dev/null +++ b/test/notifications.js @@ -0,0 +1,102 @@ +'use strict'; +/*global require, after, before*/ + + +var assert = require('assert'); + +var db = require('./mocks/databasemock'); +var user = require('../src/user'); +var notifications = require('../src/notifications'); + +describe('Notifications', function() { + var uid; + var notification; + + before(function(done) { + user.create({username: 'poster'}, function(err, _uid) { + if (err) { + return done(err); + } + + uid = _uid; + done(); + }); + }); + + it('should create a notification', function(done) { + notifications.create({ + bodyShort: 'bodyShort', + nid: 'notification_id' + }, function(err, _notification) { + notification = _notification; + assert.ifError(err); + assert(notification); + db.exists('notifications:' + notification.nid, function(err, exists) { + assert.ifError(err); + assert(exists); + db.isSortedSetMember('notifications', notification.nid, function(err, isMember) { + assert.ifError(err); + assert(isMember); + done(); + }); + }); + }); + }); + + it('should get notifications', function(done) { + notifications.getMultiple([notification.nid], function(err, notificationsData) { + assert.ifError(err); + assert(Array.isArray(notificationsData)); + assert(notificationsData[0]); + assert.equal(notification.nid, notificationsData[0].nid); + done(); + }); + }); + + it('should push a notification to uid', function(done) { + notifications.push(notification, [uid], function(err) { + assert.ifError(err); + setTimeout(function() { + db.isSortedSetMember('uid:' + uid + ':notifications:unread', notification.nid, function(err, isMember) { + assert.ifError(err); + assert(isMember); + done(); + }); + }, 2000); + }); + }); + + it('should mark a notification read', function(done) { + notifications.markRead(notification.nid, uid, function(err) { + assert.ifError(err); + db.isSortedSetMember('uid:' + uid + ':notifications:unread', notification.nid, function(err, isMember) { + assert.ifError(err); + assert.equal(isMember, false); + db.isSortedSetMember('uid:' + uid + ':notifications:read', notification.nid, function(err, isMember) { + assert.ifError(err); + assert.equal(isMember, true); + done(); + }); + }); + }); + }); + + it('should mark a notification unread', function(done) { + notifications.markUnread(notification.nid, uid, function(err) { + assert.ifError(err); + db.isSortedSetMember('uid:' + uid + ':notifications:unread', notification.nid, function(err, isMember) { + assert.ifError(err); + assert.equal(isMember, true); + db.isSortedSetMember('uid:' + uid + ':notifications:read', notification.nid, function(err, isMember) { + assert.ifError(err); + assert.equal(isMember, false); + done(); + }); + }); + }); + }); + + after(function(done) { + db.flushdb(done); + }); +}); From 6c634b0689112e1d7fccbac68a5c1c9382783743 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 11 Oct 2016 16:11:44 +0300 Subject: [PATCH 05/79] fix tabs --- test/categories.js | 2 +- test/groups.js | 2 +- test/notifications.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/categories.js b/test/categories.js index f9ce55f916..a083f55308 100644 --- a/test/categories.js +++ b/test/categories.js @@ -11,7 +11,7 @@ var Topics = require('../src/topics'); var User = require('../src/user'); describe('Categories', function() { - var categoryObj; + var categoryObj; var posterUid; before(function(done) { diff --git a/test/groups.js b/test/groups.js index a28e84f14e..5cfef7a3cc 100644 --- a/test/groups.js +++ b/test/groups.js @@ -1,7 +1,7 @@ 'use strict'; /*global require, before, after*/ -var assert = require('assert'); +var assert = require('assert'); var async = require('async'); var db = require('./mocks/databasemock'); diff --git a/test/notifications.js b/test/notifications.js index 923087fce5..48210b49aa 100644 --- a/test/notifications.js +++ b/test/notifications.js @@ -2,7 +2,7 @@ /*global require, after, before*/ -var assert = require('assert'); +var assert = require('assert'); var db = require('./mocks/databasemock'); var user = require('../src/user'); From 7107f7f4a1eb496cba8578280f67ec1cdaeae956 Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Thu, 6 Oct 2016 07:59:33 -0400 Subject: [PATCH 06/79] Incremented version number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3c2694613a..6360f2ec79 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "1.2.0", + "version": "1.2.1", "homepage": "http://www.nodebb.org", "repository": { "type": "git", From 9b59bc32476799c5935ecbdb81e83488d22a07d9 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 11 Oct 2016 23:20:22 +0300 Subject: [PATCH 07/79] closes #5103 --- public/src/client/chats/search.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/public/src/client/chats/search.js b/public/src/client/chats/search.js index 947959f7a4..6701563639 100644 --- a/public/src/client/chats/search.js +++ b/public/src/client/chats/search.js @@ -1,6 +1,6 @@ 'use strict'; -/* globals define, socket, app, ajaxify */ +/* globals define, socket, app */ define('forum/chats/search', ['components'], function(components) { @@ -75,7 +75,9 @@ define('forum/chats/search', ['components'], function(components) { return app.alertError(err.message); } if (roomId) { - Chats.switchChat(roomId); + require(['forum/chats'], function(chats) { + chats.switchChat(roomId); + }); } else { app.newChat(userObj.uid); } From dd7839b7f5ad6090487df97c617b03482e870c94 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 11 Oct 2016 23:22:58 +0300 Subject: [PATCH 08/79] add admin next to username --- src/views/admin/manage/users.tpl | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/views/admin/manage/users.tpl b/src/views/admin/manage/users.tpl index 63da329784..aa74b72ed5 100644 --- a/src/views/admin/manage/users.tpl +++ b/src/views/admin/manage/users.tpl @@ -72,7 +72,6 @@ uid username - admin email postcount reputation @@ -85,11 +84,10 @@ {users.uid} - {users.username} - + {users.username} + - {users.email} From 59fb7d7eeff9afdac5f706274354e137cdfb290d Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 12 Oct 2016 11:28:59 +0300 Subject: [PATCH 09/79] failing tests for #5102 --- test/translator-new.js | 9 ++++++++- test/translator.js | 7 +++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/test/translator-new.js b/test/translator-new.js index 22ddf4e9d5..cdb854ea82 100644 --- a/test/translator-new.js +++ b/test/translator-new.js @@ -108,7 +108,7 @@ describe('new Translator(language)', function(){ }); it('should properly escape % and ,', function(done) { - var translator = new Translator('en_GB'); + var translator = new Translator('en_GB'); var title = 'Test 1, 2, 3 % salmon'; title = title.replace(/%/g, '%').replace(/,/g, ','); @@ -126,6 +126,13 @@ describe('new Translator(language)', function(){ done(); }); + it('should not translate [[derp] some text', function(done) { + var translator = new Translator('en_GB'); + translator.translate('[[derp] some text').then(function(translated) { + assert.strictEqual('[[derp] some text', translated); + done(); + }); + }); }); }); diff --git a/test/translator.js b/test/translator.js index f1ceeaed0d..40f5d42ec1 100644 --- a/test/translator.js +++ b/test/translator.js @@ -112,5 +112,12 @@ describe('translator adaptor', function(){ done(); }); }); + + it('should not translate [[derp] some text', function(done) { + translator.translate('[[derp] some text', function(translated) { + assert.strictEqual('[[derp] some text', translated); + done(); + }); + }); }); }); From eb174739ee608c67e2647e575073edcb42b82273 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 12 Oct 2016 11:53:25 +0300 Subject: [PATCH 10/79] closes #5101 --- public/language/en_GB/modules.json | 1 - src/messaging/rooms.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/public/language/en_GB/modules.json b/public/language/en_GB/modules.json index 363dafeada..556ef2fbf4 100644 --- a/public/language/en_GB/modules.json +++ b/public/language/en_GB/modules.json @@ -18,7 +18,6 @@ "chat.thirty_days": "30 Days", "chat.three_months": "3 Months", "chat.delete_message_confirm": "Are you sure you wish to delete this message?", - "chat.roomname": "Chat Room %1", "chat.add-users-to-room": "Add users to room", "composer.compose": "Compose", diff --git a/src/messaging/rooms.js b/src/messaging/rooms.js index 92a5815df6..5318f926b2 100644 --- a/src/messaging/rooms.js +++ b/src/messaging/rooms.js @@ -35,7 +35,7 @@ module.exports = function(Messaging) { function modifyRoomData(rooms) { rooms.forEach(function(data) { if (data) { - data.roomName = data.roomName || '[[modules:chat.roomname, ' + data.roomId + ']]'; + data.roomName = data.roomName || ''; data.roomName = validator.escape(String(data.roomName)); if (data.hasOwnProperty('groupChat')) { data.groupChat = parseInt(data.groupChat, 10) === 1; From 59d035376b2d79a4d54550b01cca1b2b49950eea Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 12 Oct 2016 14:46:04 +0300 Subject: [PATCH 11/79] closes #5025 --- src/socket.io/posts/tools.js | 93 ++++++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 31 deletions(-) diff --git a/src/socket.io/posts/tools.js b/src/socket.io/posts/tools.js index fcd076f124..e67819965e 100644 --- a/src/socket.io/posts/tools.js +++ b/src/socket.io/posts/tools.js @@ -60,11 +60,61 @@ module.exports = function(SocketPosts) { }; SocketPosts.delete = function(socket, data, callback) { - doPostAction('delete', 'event:post_deleted', socket, data, callback); + if (!data || !data.pid) { + return callback(new Error('[[error:invalid-data]]')); + } + var postData; + async.waterfall([ + function(next) { + posts.tools.delete(socket.uid, data.pid, next); + }, + function(_postData, next) { + postData = _postData; + isMainAndLastPost(data.pid, next); + }, + function(results, next) { + if (results.isMain && results.isLast) { + deleteTopicOf(data.pid, socket, next); + } else { + next(); + } + }, + function(next) { + websockets.in('topic_' + data.tid).emit('event:post_deleted', postData); + + events.log({ + type: 'post-delete', + uid: socket.uid, + pid: data.pid, + ip: socket.ip + }); + + next(); + } + ], callback); }; SocketPosts.restore = function(socket, data, callback) { - doPostAction('restore', 'event:post_restored', socket, data, callback); + if (!data || !data.pid) { + return callback(new Error('[[error:invalid-data]]')); + } + + posts.tools.restore(socket.uid, data.pid, function(err, postData) { + if (err) { + return callback(err); + } + + websockets.in('topic_' + data.tid).emit('event:post_restored', postData); + + events.log({ + type: 'post-restore', + uid: socket.uid, + pid: data.pid, + ip: socket.ip + }); + + callback(); + }); }; SocketPosts.deletePosts = function(socket, data, callback) { @@ -85,29 +135,6 @@ module.exports = function(SocketPosts) { }, callback); }; - function doPostAction(command, eventName, socket, data, callback) { - if (!data) { - return callback(new Error('[[error:invalid-data]]')); - } - - posts.tools[command](socket.uid, data.pid, function(err, postData) { - if (err) { - return callback(err); - } - - websockets.in('topic_' + data.tid).emit(eventName, postData); - - events.log({ - type: 'post-' + command, - uid: socket.uid, - pid: data.pid, - ip: socket.ip - }); - - callback(); - }); - } - SocketPosts.purge = function(socket, data, callback) { function purgePost() { posts.tools.purge(socket.uid, data.pid, function(err) { @@ -151,15 +178,19 @@ module.exports = function(SocketPosts) { return callback(new Error('[[error:cant-purge-main-post]]')); } - posts.getTopicFields(data.pid, ['tid', 'cid'], function(err, topic) { - if (err) { - return callback(err); - } - socketTopics.doTopicAction('delete', 'event:topic_deleted', socket, {tids: [topic.tid], cid: topic.cid}, callback); - }); + deleteTopicOf(data.pid, socket, callback); }); }; + function deleteTopicOf(pid, socket, callback) { + posts.getTopicFields(pid, ['tid', 'cid'], function(err, topic) { + if (err) { + return callback(err); + } + socketTopics.doTopicAction('delete', 'event:topic_deleted', socket, {tids: [topic.tid], cid: topic.cid}, callback); + }); + } + function isMainAndLastPost(pid, callback) { async.parallel({ isMain: function(next) { From af7220eea123dec140700bc809d5e252f7bb73af Mon Sep 17 00:00:00 2001 From: Sergii Paryzhskyi Date: Wed, 12 Oct 2016 14:05:29 +0200 Subject: [PATCH 12/79] Use eslint rules from airbnb (#5100) * Add development dependencies to extend eslint config from airbnb * Update eslint to the latest version * Extend airbnb eslint rules and ignore failing ones --- .eslintrc.json | 116 +++++++++++++++++++++++++++++++++++++++++++++++-- package.json | 8 +++- 2 files changed, 118 insertions(+), 6 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index f8ca19c4cb..996ebe85c2 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,6 +1,114 @@ { - "rules": { - "handle-callback-err": [ "error", "^(e$|(e|(.*(_e|E)))rr)" ] - } -} + "extends": "airbnb", + "rules": { + "handle-callback-err": [ "error","^(e$|(e|(.*(_e|E)))rr)" ], + "one-var": "off", + "no-undef": "off", + "max-len": "off", + "no-new": "off", + "max-nested-callbacks": "off", + "no-mixed-requires": "off", + "brace-style": "off", + "max-statements-per-line": "off", + "no-unused-vars": "off", + "no-mixed-spaces-and-tabs": "off", + "no-useless-concat": "off", + "require-jsdoc": "off", + "eqeqeq": "off", + "camelcase": "off", + "no-negated-condition": "off", + "wrap-iife": "off", + "one-var-declaration-per-line": "off", + "new-cap": "off", + "no-lonely-if": "off", + "radix": "off", + "no-else-return": "off", + "no-useless-escape": "off", + "block-scoped-var": "off", + "operator-assignment": "off", + "default-case": "off", + "yoda": "off", + "no-use-before-define": "off", + "no-loop-func": "off", + "no-void": "off", + "valid-jsdoc": "off", + "o-eq-null": "off", + "no-cond-assign": "off", + "no-eq-null": "off", + "no-redeclare": "off", + "no-unreachable": "off", + "no-nested-ternary": "off", + "operator-linebreak": "off", + "guard-for-in": "off", + "no-unneeded-ternary": "off", + "no-sequences": "off", + "no-extend-native": "off", + "no-shadow-restricted-names": "off", + "no-extra-boolean-cast": "off", + "no-undef-init": "off", + "no-script-url": "off", + "no-path-concat": "off", + "no-unused-expressions": "off", + "no-restricted-module": "off", + "no-return-assign": "off", + "no-restricted-modules": "off", + "no-tabs": "off", + "indent": "off", + "func-names": "off", + "prefer-arrow-callback": "off", + "space-before-function-paren": "off", + "object-curly-spacing": "off", + "no-var": "off", + "no-shadow": "off", + "prefer-template": "off", + "padded-blocks": "off", + "eol-last": "off", + "lines-around-directive": "off", + "space-before-blocks": "off", + "no-restricted-syntax": "off", + "vars-on-top": "off", + "no-prototype-builtins": "off", + "object-shorthand": "off", + "no-param-reassign": "off", + "consistent-return": "off", + "strict": "off", + "comma-dangle": "off", + "no-multi-spaces": "off", + "quotes": "off", + "keyword-spacing": "off", + "space-infix-ops": "off", + "no-plusplus": "off", + "no-mixed-operators": "off", + "semi": "off", + "comma-spacing": "off", + "global-require": "off", + "no-trailing-spaces": "off", + "key-spacing": "off", + "import/newline-after-import": "off", + "no-underscore-dangle": "off", + "prefer-spread": "off", + "no-multiple-empty-lines": "off", + "spaced-comment": "off", + "prefer-rest-params": "off", + "space-in-parens": "off", + "block-spacing": "off", + "quote-props": "off", + "no-console": "off", + "space-unary-ops": "off", + "import/no-dynamic-require": "off", + "semi-spacing": "off", + "no-bitwise": "off", + "no-empty": "off", + "array-bracket-spacin": "off", + "dot-notation": "off", + "func-call-spacing": "off", + "newline-per-chained-call": "off", + "newline-per-chained-call": "off", + "array-bracket-spacing": "off", + "object-property-newline": "off", + "no-continue": "off", + "no-extra-semi": "off", + "no-spaced-func": "off" + } +} diff --git a/package.json b/package.json index 6360f2ec79..6e4cfbba84 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,11 @@ "xregexp": "~3.1.0" }, "devDependencies": { - "eslint": "^3.4.0", + "eslint": "^3.7.1", + "eslint-config-airbnb": "^12.0.0", + "eslint-plugin-import": "^1.16.0", + "eslint-plugin-jsx-a11y": "^2.2.3", + "eslint-plugin-react": "^6.4.1", "grunt": "~0.4.5", "grunt-contrib-watch": "^1.0.0", "istanbul": "^0.4.2", @@ -122,4 +126,4 @@ "url": "https://github.com/barisusakli" } ] -} \ No newline at end of file +} From a1a21a5bf91846fbb129874d31373df65066c112 Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Wed, 12 Oct 2016 09:02:23 -0400 Subject: [PATCH 13/79] Latest translations and fallbacks --- public/language/ru/category.json | 4 ++-- public/language/ru/error.json | 2 +- public/language/ru/global.json | 10 +++++----- public/language/ru/groups.json | 4 ++-- public/language/ru/modules.json | 4 ++-- public/language/ru/pages.json | 4 ++-- public/language/ru/topic.json | 32 ++++++++++++++++---------------- public/language/ru/user.json | 8 ++++---- 8 files changed, 34 insertions(+), 34 deletions(-) diff --git a/public/language/ru/category.json b/public/language/ru/category.json index e6faa0cb27..341b57f917 100644 --- a/public/language/ru/category.json +++ b/public/language/ru/category.json @@ -14,7 +14,7 @@ "ignoring": "Игнорировать", "watching.description": "Показывать тему в непрочитанных", "ignoring.description": "Не показывать тему в непрочитанных", - "watch.message": "You are now watching updates from this category and all subcategories", - "ignore.message": "You are now ignoring updates from this category and all subcategories", + "watch.message": "Вы теперь следите за обновлениями из этой категории и всех подкатегорий", + "ignore.message": "Вы теперь игнорируете обновления из этой категории и всех подкатегорий", "watched-categories": "Наблюдаемые категории" } \ No newline at end of file diff --git a/public/language/ru/error.json b/public/language/ru/error.json index 58c8828584..a5034824f0 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -62,7 +62,7 @@ "content-too-long": "Слишком длинное сообщение. Максимум символов: %1.", "title-too-short": "Слишком короткое сообщение. Минимум символов: %1.", "title-too-long": "Слишком длинный заголовок. Максимум символов: %1.", - "category-not-selected": "Category not selected.", + "category-not-selected": "Категория не выбрана", "too-many-posts": "Вы можете создавать сообщение только один раз в %1 сек.", "too-many-posts-newbie": "Вы новый пользователь, поэтому можете создавать сообщение раз в %1 сек., пока не заработаете %2 п. репутации.", "tag-too-short": "Слишком короткий тэг. Минимум символов: %1.", diff --git a/public/language/ru/global.json b/public/language/ru/global.json index c736dbb191..e0a280d999 100644 --- a/public/language/ru/global.json +++ b/public/language/ru/global.json @@ -19,7 +19,7 @@ "welcome_back": "С возвращением", "you_have_successfully_logged_in": "Вы успешно вошли на форум", "save_changes": "Сохранить изменения", - "save": "Save", + "save": "Сохранить", "close": "Закрыть", "pagination": "Пагинация", "pagination.out_of": "%1 из %2", @@ -53,10 +53,10 @@ "topics": "Темы", "posts": "Сообщения", "best": "Лучшие", - "upvoters": "Upvoters", - "upvoted": "Upvoted", - "downvoters": "Downvoters", - "downvoted": "Downvoted", + "upvoters": "Кто лайкнул", + "upvoted": "Лайки", + "downvoters": "Кто дизлайкнул", + "downvoted": "Дизлайки", "views": "Просмотры", "reputation": "Репутация", "read_more": "читать дальше", diff --git a/public/language/ru/groups.json b/public/language/ru/groups.json index 4ce0f20f0e..c33cfb3d4c 100644 --- a/public/language/ru/groups.json +++ b/public/language/ru/groups.json @@ -51,6 +51,6 @@ "membership.reject": "Отклонить", "new-group.group_name": "Название группы:", "upload-group-cover": "Загрузить обложку группы", - "bulk-invite-instructions": "Enter a list of comma separated usernames to invite to this group", - "bulk-invite": "Bulk Invite" + "bulk-invite-instructions": "Введите через запятую имена пользователей, которых хотите пригласить в эту группу", + "bulk-invite": "Массовое приглашение" } \ No newline at end of file diff --git a/public/language/ru/modules.json b/public/language/ru/modules.json index 629be2fd3d..5cf2eb2a4e 100644 --- a/public/language/ru/modules.json +++ b/public/language/ru/modules.json @@ -37,8 +37,8 @@ "composer.formatting.picture": "Изображение", "composer.upload-picture": "Загрузить изображение", "composer.upload-file": "Загрузить файл", - "composer.zen_mode": "Zen Mode", - "composer.select_category": "Select a category", + "composer.zen_mode": "Полноэкранный режим", + "composer.select_category": "Выберите категорию", "bootbox.ok": "ОК", "bootbox.cancel": "Отмена", "bootbox.confirm": "Подтвердить", diff --git a/public/language/ru/pages.json b/public/language/ru/pages.json index 7602c703e9..86bd5e1844 100644 --- a/public/language/ru/pages.json +++ b/public/language/ru/pages.json @@ -12,13 +12,13 @@ "users/sort-posts": "Пользователи по кол-ву сообщений", "users/sort-reputation": "Пользователи по кол-ву репутации", "users/banned": "Заблокированные пользователи", - "users/most-flags": "Most flagged users", + "users/most-flags": "Пользователи на которых больше всех жалуются", "users/search": "Поиск пользователей", "notifications": "Уведомления", "tags": "Теги", "tag": "Темы с тегом \"%1\"", "register": "Зарегистрироваться", - "registration-complete": "Registration complete", + "registration-complete": "Регистрация завершена", "login": "Войти", "reset": "Забыл пароль?", "categories": "Категории", diff --git a/public/language/ru/topic.json b/public/language/ru/topic.json index e0fd460972..2223108c47 100644 --- a/public/language/ru/topic.json +++ b/public/language/ru/topic.json @@ -31,21 +31,21 @@ "bookmark_instructions": "Нажмите здесь, чтобы вернуться к последнему прочитанному сообщению в этой теме.", "flag_title": "Отметить сообщение для модерирования", "flag_success": "Это сообщение было помечено для модерации", - "flag_manage_title": "Flagged post in %1", - "flag_manage_history": "Action History", - "flag_manage_no_history": "No event history to report", - "flag_manage_assignee": "Assignee", - "flag_manage_state": "State", - "flag_manage_state_open": "New/Open", - "flag_manage_state_wip": "Work in Progress", - "flag_manage_state_resolved": "Resolved", - "flag_manage_state_rejected": "Rejected", - "flag_manage_notes": "Shared Notes", - "flag_manage_update": "Update Flag Status", - "flag_manage_history_assignee": "Assigned to %1", - "flag_manage_history_state": "Updated state to %1", - "flag_manage_history_notes": "Updated flag notes", - "flag_manage_saved": "Flag Details Updated", + "flag_manage_title": "Отмеченные сообщения в %1", + "flag_manage_history": "История действий", + "flag_manage_no_history": "В отчете нет событий", + "flag_manage_assignee": "Правоприемник", + "flag_manage_state": "Состояние", + "flag_manage_state_open": "Новое/Открытое", + "flag_manage_state_wip": "Рассматривается", + "flag_manage_state_resolved": "Подтверждено", + "flag_manage_state_rejected": "Отклонено", + "flag_manage_notes": "Коллективные заметки", + "flag_manage_update": "Обновить статус жалобы", + "flag_manage_history_assignee": "Назначено %1", + "flag_manage_history_state": "Статус обновлен на %1", + "flag_manage_history_notes": "Статус жалобы обновлен", + "flag_manage_saved": "Подробности жалобы обновлены", "deleted_message": "Эта тема была удалена. Только пользователи с правами управления темами могут ее видеть.", "following_topic.message": "Теперь вы будете получать уведомления при обновлении этой темы.", "not_following_topic.message": "Вы увидите эту тему в списке непрочитанных тем, но Вы не будете получать уведомления, когда кто-то напишет сообщение в эту тему.", @@ -107,7 +107,7 @@ "composer.title_placeholder": "Введите название темы...", "composer.handle_placeholder": "Название", "composer.discard": "Отменить", - "composer.submit": "Подтвердить", + "composer.submit": "Отправить", "composer.replying_to": "Ответ %1", "composer.new_topic": "Создать тему", "composer.uploading": "загрузка...", diff --git a/public/language/ru/user.json b/public/language/ru/user.json index af684f5059..b0bcf9ebf5 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -122,8 +122,8 @@ "info.banned-permanently": "Заблокирован навсегда", "info.banned-reason-label": "Причина", "info.banned-no-reason": "Без объяснения причин.", - "info.username-history": "Username History", - "info.email-history": "Email History", - "info.moderation-note": "Moderation Note", - "info.moderation-note.success": "Moderation note saved" + "info.username-history": "История имен", + "info.email-history": "История емейлов", + "info.moderation-note": "Примечание модератора", + "info.moderation-note.success": "Примечание модератора сохранено" } \ No newline at end of file From 58810aa0637b9b2097e7413dc2b735fed9fc4281 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 12 Oct 2016 16:45:33 +0300 Subject: [PATCH 14/79] only delete priv groups if they are empty --- src/groups/membership.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/groups/membership.js b/src/groups/membership.js index 14f34f0084..2e36a5d217 100644 --- a/src/groups/membership.js +++ b/src/groups/membership.js @@ -240,7 +240,7 @@ module.exports = function(Groups) { if (!groupData) { return callback(); } - if (parseInt(groupData.hidden, 10) === 1 && parseInt(groupData.memberCount, 10) === 0) { + if (Groups.isPrivilegeGroup(groupName) && parseInt(groupData.memberCount, 10) === 0) { Groups.destroy(groupName, next); } else { if (parseInt(groupData.hidden, 10) !== 1) { From 4f159acf5657e0de6d43b13688b4f97a6494cb3d Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 12 Oct 2016 10:09:49 -0400 Subject: [PATCH 15/79] fixes #5104 --- src/user/create.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/user/create.js b/src/user/create.js index d01cfaaf64..51ad7b03d0 100644 --- a/src/user/create.js +++ b/src/user/create.js @@ -133,7 +133,7 @@ module.exports = function(User) { }); }, function(next) { - User.updateDigestSetting(userData.uid, meta.config.dailyDigestSetting, next); + User.updateDigestSetting(userData.uid, meta.config.dailyDigestFreq, next); } ], next); }, From 2eec1afc46b0bee6b8a49c3b6921fa0426a5f71c Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 12 Oct 2016 17:46:45 +0300 Subject: [PATCH 16/79] fix upgrade script so it only runs once --- src/upgrade.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/upgrade.js b/src/upgrade.js index 791aefacae..f8177a90d0 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -893,7 +893,7 @@ Upgrade.upgrade = function(callback) { thisSchemaDate = Date.UTC(2016, 9, 8); - if (schemaDate < thisSchemaDate || 1) { + if (schemaDate < thisSchemaDate) { updatesMade = true; winston.info('[2016/10/8] favourite -> bookmark refactor'); async.series([upgradePosts, upgradeUsers], function(err) { From 2ce33ba2b0f13a851b932f37183e9f3ea53963d2 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Wed, 12 Oct 2016 12:48:43 -0600 Subject: [PATCH 17/79] Fix #5102, translator made more safe (#5106) --- package.json | 3 +- public/src/modules/translator.js | 34 ++++++- test/translator-new.js | 162 ------------------------------- test/translator.js | 115 ++++++++++++++++------ 4 files changed, 121 insertions(+), 193 deletions(-) delete mode 100644 test/translator-new.js diff --git a/package.json b/package.json index 6e4cfbba84..2132731a42 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "start": "node loader.js", "lint": "eslint --cache .", "pretest": "npm run lint", - "test": "istanbul cover _mocha test" + "test": "istanbul cover _mocha test", + "test-windows": "_mocha test" }, "dependencies": { "async": "~1.5.0", diff --git a/public/src/modules/translator.js b/public/src/modules/translator.js index f0fc980666..08525702d5 100644 --- a/public/src/modules/translator.js +++ b/public/src/modules/translator.js @@ -120,12 +120,44 @@ // the current level of nesting of the translation strings var level = 0; var sliced; + var textBeforeColonFound = false; + var colonFound = false; + var textAfterColonFound = false; + var commaAfterNameFound = false; while (cursor + 2 <= len) { sliced = str.slice(cursor, cursor + 2); + // found some text after the double bracket, + // so this is probably a translation string + if (!textBeforeColonFound && sliced[0].match(/[a-zA-Z0-9\-_]/)) { + textBeforeColonFound = true; + cursor += 1; + // found a colon, so this is probably a translation string + } else if (textBeforeColonFound && !colonFound && sliced[0] === ':') { + colonFound = true; + cursor += 1; + // found some text after the colon, + // so this is probably a translation string + } else if (colonFound && !textAfterColonFound && sliced[0].match(/[a-zA-Z0-9\-_]/)) { + textAfterColonFound = true; + cursor += 1; + } else if (textAfterColonFound && !commaAfterNameFound && sliced[0] === ',') { + commaAfterNameFound = true; + cursor += 1; + // a space or comma was found before the name + // this isn't a translation string, so back out + } else if (!(textBeforeColonFound && colonFound && textAfterColonFound && commaAfterNameFound) && + sliced[0].match(/[^a-zA-Z0-9\-_.\]]/)) { + cursor += 1; + lastBreak -= 2; + if (level > 0) { + level -= 1; + } else { + break; + } // if we're at the beginning of another translation string, // we're nested, so add to our level - if (sliced === '[[') { + } else if (sliced === '[[') { level += 1; cursor += 2; // if we're at the end of a translation string diff --git a/test/translator-new.js b/test/translator-new.js deleted file mode 100644 index cdb854ea82..0000000000 --- a/test/translator-new.js +++ /dev/null @@ -1,162 +0,0 @@ -'use strict'; -/*global require*/ - -var assert = require('assert'); -var Translator = require('../public/src/modules/translator.js').Translator; - - -describe('new Translator(language)', function(){ - describe('.translate()', function(){ - it('should handle basic translations', function(done) { - var translator = new Translator('en_GB'); - - translator.translate('[[global:home]]').then(function(translated) { - assert.strictEqual(translated, 'Home'); - done(); - }); - }); - - it('should handle language keys in regular text', function(done) { - var translator = new Translator('en_GB'); - - translator.translate('Let\'s go [[global:home]]').then(function(translated) { - assert.strictEqual(translated, 'Let\'s go Home'); - done(); - }); - }); - - it('should accept a language parameter and adjust accordingly', function(done) { - var translator = new Translator('de'); - - translator.translate('[[global:home]]').then(function(translated) { - assert.strictEqual(translated, 'Übersicht'); - done(); - }); - }); - - it('should handle language keys in regular text with another language specified', function(done) { - var translator = new Translator('de'); - - translator.translate('[[global:home]] test').then(function(translated) { - assert.strictEqual(translated, 'Übersicht test'); - done(); - }); - }); - - it('should handle language keys with parameters', function(done) { - var translator = new Translator('en_GB'); - - translator.translate('[[global:pagination.out_of, 1, 5]]').then(function(translated) { - assert.strictEqual(translated, '1 out of 5'); - done(); - }); - }); - - it('should handle language keys inside language keys', function(done) { - var translator = new Translator('en_GB'); - - translator.translate('[[notifications:outgoing_link_message, [[global:guest]]]]').then(function(translated) { - assert.strictEqual(translated, 'You are now leaving Guest'); - done(); - }); - }); - - it('should handle language keys inside language keys with multiple parameters', function(done) { - var translator = new Translator('en_GB'); - - translator.translate('[[notifications:user_posted_to, [[global:guest]], My Topic]]').then(function(translated) { - assert.strictEqual(translated, 'Guest has posted a reply to: My Topic'); - done(); - }); - }); - - it('should handle language keys inside language keys with all parameters as language keys', function(done) { - var translator = new Translator('en_GB'); - - translator.translate('[[notifications:user_posted_to, [[global:guest]], [[global:guest]]]]').then(function(translated) { - assert.strictEqual(translated, 'Guest has posted a reply to: Guest'); - done(); - }); - }); - - it('should properly handle parameters that contain square brackets', function(done) { - var translator = new Translator('en_GB'); - - translator.translate('[[global:pagination.out_of, [guest], [[global:home]]]]').then(function(translated) { - assert.strictEqual(translated, '[guest] out of Home'); - done(); - }); - }); - - it('should properly handle parameters that contain parentheses', function(done) { - var translator = new Translator('en_GB'); - - translator.translate('[[global:pagination.out_of, (foobar), [[global:home]]]]').then(function(translated) { - assert.strictEqual(translated, '(foobar) out of Home'); - done(); - }); - }); - - it('should not translate language key parameters with HTML in them', function(done) { - var translator = new Translator('en_GB'); - - var key = '[[global:403.login, test]]'; - translator.translate(key).then(function(translated) { - assert.strictEqual(translated, 'Perhaps you should try logging in?'); - done(); - }); - }); - - it('should properly escape % and ,', function(done) { - var translator = new Translator('en_GB'); - - var title = 'Test 1, 2, 3 % salmon'; - title = title.replace(/%/g, '%').replace(/,/g, ','); - var key = "[[topic:composer.replying_to, " + title + "]]"; - translator.translate(key).then(function(translated) { - assert.strictEqual(translated, 'Replying to Test 1, 2, 3 % salmon'); - done(); - }); - }); - - it('should throw if not passed a language', function(done) { - assert.throws(function () { - new Translator(); - }, /language string/); - done(); - }); - - it('should not translate [[derp] some text', function(done) { - var translator = new Translator('en_GB'); - translator.translate('[[derp] some text').then(function(translated) { - assert.strictEqual('[[derp] some text', translated); - done(); - }); - }); - }); -}); - -describe('Translator.create()', function(){ - describe('.translate()', function(){ - it('should return an instance of Translator', function(done) { - var translator = Translator.create('en_GB'); - - assert(translator instanceof Translator); - done(); - }); - it('should return the same object for the same language', function(done) { - var one = Translator.create('de'); - var two = Translator.create('de'); - - assert.strictEqual(one, two); - done(); - }); - it('should default to defaultLang', function(done) { - var translator = Translator.create(); - - assert.strictEqual(translator.lang, 'en_GB'); - done(); - }); - - }); -}); diff --git a/test/translator.js b/test/translator.js index 40f5d42ec1..4dc4156e27 100644 --- a/test/translator.js +++ b/test/translator.js @@ -2,122 +2,179 @@ /*global require*/ var assert = require('assert'); -var translator = require('../public/src/modules/translator.js'); +var shim = require('../public/src/modules/translator.js'); +var Translator = shim.Translator; -var plugins = require('../src/plugins'); -var languages = require('../src/languages'); +require('../src/languages').init(function () {}); -languages.init(function(){}); +describe('translator shim', function(){ + describe('.translate()', function(){ + it('should translate correctly', function(done) { + shim.translate('[[global:pagination.out_of, (foobar), [[global:home]]]]', function(translated) { + assert.strictEqual(translated, '(foobar) out of Home'); + done(); + }); + }); + }); +}); -describe('translator adaptor', function(){ +describe('new Translator(language)', function(){ describe('.translate()', function(){ it('should handle basic translations', function(done) { - translator.translate('[[global:home]]', function(translated) { + var translator = new Translator('en_GB'); + + translator.translate('[[global:home]]').then(function(translated) { assert.strictEqual(translated, 'Home'); done(); }); }); it('should handle language keys in regular text', function(done) { - translator.translate('Let\'s go [[global:home]]', function(translated) { + var translator = new Translator('en_GB'); + + translator.translate('Let\'s go [[global:home]]').then(function(translated) { assert.strictEqual(translated, 'Let\'s go Home'); done(); }); }); it('should accept a language parameter and adjust accordingly', function(done) { - translator.translate('[[global:home]]', 'de', function(translated) { + var translator = new Translator('de'); + + translator.translate('[[global:home]]').then(function(translated) { assert.strictEqual(translated, 'Übersicht'); done(); }); }); it('should handle language keys in regular text with another language specified', function(done) { - translator.translate('[[global:home]] test', 'de', function(translated) { + var translator = new Translator('de'); + + translator.translate('[[global:home]] test').then(function(translated) { assert.strictEqual(translated, 'Übersicht test'); done(); }); }); it('should handle language keys with parameters', function(done) { - translator.translate('[[global:pagination.out_of, 1, 5]]', function(translated) { + var translator = new Translator('en_GB'); + + translator.translate('[[global:pagination.out_of, 1, 5]]').then(function(translated) { assert.strictEqual(translated, '1 out of 5'); done(); }); }); it('should handle language keys inside language keys', function(done) { - translator.translate('[[notifications:outgoing_link_message, [[global:guest]]]]', function(translated) { + var translator = new Translator('en_GB'); + + translator.translate('[[notifications:outgoing_link_message, [[global:guest]]]]').then(function(translated) { assert.strictEqual(translated, 'You are now leaving Guest'); done(); }); }); it('should handle language keys inside language keys with multiple parameters', function(done) { - translator.translate('[[notifications:user_posted_to, [[global:guest]], My Topic]]', function(translated) { + var translator = new Translator('en_GB'); + + translator.translate('[[notifications:user_posted_to, [[global:guest]], My Topic]]').then(function(translated) { assert.strictEqual(translated, 'Guest has posted a reply to: My Topic'); done(); }); }); it('should handle language keys inside language keys with all parameters as language keys', function(done) { - translator.translate('[[notifications:user_posted_to, [[global:guest]], [[global:guest]]]]', function(translated) { + var translator = new Translator('en_GB'); + + translator.translate('[[notifications:user_posted_to, [[global:guest]], [[global:guest]]]]').then(function(translated) { assert.strictEqual(translated, 'Guest has posted a reply to: Guest'); done(); }); }); it('should properly handle parameters that contain square brackets', function(done) { - translator.translate('[[global:pagination.out_of, [guest], [[global:home]]]]', function(translated) { + var translator = new Translator('en_GB'); + + translator.translate('[[global:pagination.out_of, [guest], [[global:home]]]]').then(function(translated) { assert.strictEqual(translated, '[guest] out of Home'); done(); }); }); it('should properly handle parameters that contain parentheses', function(done) { - translator.translate('[[global:pagination.out_of, (foobar), [[global:home]]]]', function(translated) { + var translator = new Translator('en_GB'); + + translator.translate('[[global:pagination.out_of, (foobar), [[global:home]]]]').then(function(translated) { assert.strictEqual(translated, '(foobar) out of Home'); done(); }); }); it('should not translate language key parameters with HTML in them', function(done) { + var translator = new Translator('en_GB'); + var key = '[[global:403.login, test]]'; - translator.translate(key, function(translated) { + translator.translate(key).then(function(translated) { assert.strictEqual(translated, 'Perhaps you should try logging in?'); done(); }); }); it('should properly escape % and ,', function(done) { + var translator = new Translator('en_GB'); + var title = 'Test 1, 2, 3 % salmon'; title = title.replace(/%/g, '%').replace(/,/g, ','); var key = "[[topic:composer.replying_to, " + title + "]]"; - translator.translate(key, function(translated) { + translator.translate(key).then(function(translated) { assert.strictEqual(translated, 'Replying to Test 1, 2, 3 % salmon'); done(); }); }); - it('should properly handle translations added by plugins', function(done) { - plugins.customLanguages = { - 'en_GB/myplugin.json': { - 'foo': 'bar', - 'bar': 'baz, and %1' - } - }; + it('should throw if not passed a language', function(done) { + assert.throws(function () { + new Translator(); + }, /language string/); + done(); + }); - translator.translate('[[myplugin:foo]], [[myplugin:bar, quux]]', function(translated) { - assert.strictEqual(translated, 'bar, baz, and quux'); + it('should not translate [[derp] some text', function(done) { + var translator = new Translator('en_GB'); + translator.translate('[[derp] some text').then(function(translated) { + assert.strictEqual('[[derp] some text', translated); done(); }); }); - it('should not translate [[derp] some text', function(done) { - translator.translate('[[derp] some text', function(translated) { - assert.strictEqual('[[derp] some text', translated); + it('should not translate [[derp:xyz] some text', function(done) { + var translator = new Translator('en_GB'); + translator.translate('[[derp:xyz] some text').then(function(translated) { + assert.strictEqual('[[derp:xyz] some text', translated); done(); }); }); }); }); + +describe('Translator.create()', function(){ + it('should return an instance of Translator', function(done) { + var translator = Translator.create('en_GB'); + + assert(translator instanceof Translator); + done(); + }); + it('should return the same object for the same language', function(done) { + var one = Translator.create('de'); + var two = Translator.create('de'); + + assert.strictEqual(one, two); + done(); + }); + it('should default to defaultLang', function(done) { + var translator = Translator.create(); + + assert.strictEqual(translator.lang, 'en_GB'); + done(); + }); +}); From 460ac17eaa97b9f7a74594f8d73ac0b28160cad2 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 12 Oct 2016 22:20:01 +0300 Subject: [PATCH 18/79] closes #4647 addm upvotes, downvotes and votes to getPostSummary --- src/posts/summary.js | 155 ++++++++++++++++++++++--------------------- 1 file changed, 79 insertions(+), 76 deletions(-) diff --git a/src/posts/summary.js b/src/posts/summary.js index a245a41b29..31c398a321 100644 --- a/src/posts/summary.js +++ b/src/posts/summary.js @@ -23,96 +23,99 @@ module.exports = function(Posts) { options.parse = options.hasOwnProperty('parse') ? options.parse : true; options.extraFields = options.hasOwnProperty('extraFields') ? options.extraFields : []; - var fields = ['pid', 'tid', 'content', 'uid', 'timestamp', 'deleted'].concat(options.extraFields); + var fields = ['pid', 'tid', 'content', 'uid', 'timestamp', 'deleted', 'upvotes', 'downvotes'].concat(options.extraFields); - Posts.getPostsFields(pids, fields, function(err, posts) { - if (err) { - return callback(err); - } + var posts; + async.waterfall([ + function(next) { + Posts.getPostsFields(pids, fields, next); + }, + function(_posts, next) { + posts = _posts.filter(Boolean); - posts = posts.filter(Boolean); - - var uids = [], topicKeys = []; - for(var i=0; i Date: Wed, 12 Oct 2016 22:22:15 +0300 Subject: [PATCH 19/79] use post --- src/posts/summary.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/posts/summary.js b/src/posts/summary.js index 31c398a321..b40eeb1b40 100644 --- a/src/posts/summary.js +++ b/src/posts/summary.js @@ -64,7 +64,7 @@ module.exports = function(Posts) { posts.forEach(function(post, i) { post.index = utils.isNumber(results.indices[i]) ? parseInt(results.indices[i], 10) + 1 : 1; post.isMainPost = post.index - 1 === 0; - post.deleted = parseInt(posts[i].deleted, 10) === 1; + post.deleted = parseInt(post.deleted, 10) === 1; post.upvotes = parseInt(post.upvotes, 10) || 0; post.downvotes = parseInt(post.downvotes, 10) || 0; post.votes = post.upvotes - post.downvotes; From 0fc0b7e448757af8f6aa30c1771caef9bae6f591 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 13 Oct 2016 08:57:30 +0300 Subject: [PATCH 20/79] up composer --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2132731a42..fa98569cef 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "morgan": "^1.3.2", "mousetrap": "^1.5.3", "nconf": "~0.8.2", - "nodebb-plugin-composer-default": "4.2.8", + "nodebb-plugin-composer-default": "4.2.9", "nodebb-plugin-dbsearch": "1.0.2", "nodebb-plugin-emoji-extended": "1.1.1", "nodebb-plugin-emoji-one": "1.1.5", From 9a0d764bbd159277723b5138fff9de70faee1268 Mon Sep 17 00:00:00 2001 From: HeeL Date: Thu, 13 Oct 2016 11:40:10 +0200 Subject: [PATCH 21/79] Fix wrap-iife linter rule --- .eslintrc.json | 1 - public/src/modules/helpers.js | 4 ++-- public/src/modules/settings/array.js | 2 +- public/src/modules/settings/object.js | 2 +- public/src/modules/translator.js | 10 +++++----- public/src/overrides.js | 4 ++-- public/src/utils.js | 4 ++-- src/password.js | 2 +- src/socket.io/index.js | 2 +- 9 files changed, 15 insertions(+), 16 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 996ebe85c2..f96c075add 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -18,7 +18,6 @@ "eqeqeq": "off", "camelcase": "off", "no-negated-condition": "off", - "wrap-iife": "off", "one-var-declaration-per-line": "off", "new-cap": "off", "no-lonely-if": "off", diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index 7250fab3b6..db3f9c2728 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -286,8 +286,8 @@ define('helpers', exports); } -})( +}( typeof exports === 'object' ? exports : typeof define === 'function' && define.amd ? {} : helpers = {} -); +)); diff --git a/public/src/modules/settings/array.js b/public/src/modules/settings/array.js index 81071a65fa..fd94ed8226 100644 --- a/public/src/modules/settings/array.js +++ b/public/src/modules/settings/array.js @@ -107,7 +107,7 @@ define('settings/array', function () { } catch (_error) { return $(document.createTextNode(separator)); } - })(); + }()); if (typeof attributes !== 'object') { attributes = {}; } diff --git a/public/src/modules/settings/object.js b/public/src/modules/settings/object.js index 8c7a53f99a..05971d6d73 100644 --- a/public/src/modules/settings/object.js +++ b/public/src/modules/settings/object.js @@ -69,7 +69,7 @@ define('settings/object', function () { } catch (_error) { return $(document.createTextNode(separator)); } - })(); + }()); element.empty(); if (typeof value !== 'object') { value = {}; diff --git a/public/src/modules/translator.js b/public/src/modules/translator.js index 08525702d5..65a92772e5 100644 --- a/public/src/modules/translator.js +++ b/public/src/modules/translator.js @@ -29,16 +29,16 @@ } module.exports = factory(require('string'), loadServer); - })(); + }()); } else { window.translator = factory(window.string, loadClient); } -})(function (string, load) { +}(function (string, load) { 'use strict'; var assign = Object.assign || jQuery.extend; function classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var Translator = function () { + var Translator = (function () { /** * Construct a new Translator object * @param {string} language - Language code for this translator instance @@ -305,7 +305,7 @@ Translator.cache = {}; return Translator; - }(); + }()); var adaptor = { /** @@ -453,4 +453,4 @@ }; return adaptor; -}); +})); diff --git a/public/src/overrides.js b/public/src/overrides.js index 49dce7e754..ba4ab2745f 100644 --- a/public/src/overrides.js +++ b/public/src/overrides.js @@ -86,7 +86,7 @@ if ('undefined' !== typeof window) { }); } }); - })(jQuery || {fn:{}}); + }(jQuery || {fn:{}})); (function(){ // FIX FOR #1245 - https://github.com/NodeBB/NodeBB/issues/1245 @@ -109,7 +109,7 @@ if ('undefined' !== typeof window) { _clearMenus(); } }); - })(); + }()); overrides.overrideBootbox = function () { require(['translator'], function(translator) { diff --git a/public/src/utils.js b/public/src/utils.js index 190d0ab3c6..989a9506a6 100644 --- a/public/src/utils.js +++ b/public/src/utils.js @@ -478,8 +478,8 @@ window.utils = module.exports; } -})('undefined' === typeof module ? { +}('undefined' === typeof module ? { module: { exports: {} } -} : module); +} : module)); diff --git a/src/password.js b/src/password.js index 20f4c79a95..8b9fbb33a6 100644 --- a/src/password.js +++ b/src/password.js @@ -30,4 +30,4 @@ } return module; -})(exports); \ No newline at end of file +}(exports)); \ No newline at end of file diff --git a/src/socket.io/index.js b/src/socket.io/index.js index d3393ea2d2..dedf6aab8e 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -224,4 +224,4 @@ var ratelimit = require('../middleware/ratelimit'); }; }; -})(exports); +}(exports)); From 3fa1c1f9273a13ea6e52f636946eac1483b7f421 Mon Sep 17 00:00:00 2001 From: HeeL Date: Thu, 13 Oct 2016 11:42:29 +0200 Subject: [PATCH 22/79] Fix space-infix-ops linter rule --- .eslintrc.json | 1 - app.js | 2 +- install/databases.js | 2 +- loader.js | 8 ++++---- public/src/admin/appearance/skins.js | 2 +- public/src/admin/extend/rewards.js | 2 +- public/src/admin/extend/widgets.js | 4 ++-- public/src/admin/general/dashboard.js | 12 ++++++------ public/src/admin/manage/categories.js | 2 +- public/src/admin/manage/category.js | 4 ++-- public/src/admin/manage/users.js | 2 +- public/src/client/account/header.js | 2 +- public/src/client/categoryTools.js | 4 ++-- public/src/client/chats.js | 2 +- public/src/client/chats/search.js | 2 +- public/src/client/recent.js | 4 ++-- public/src/client/topic/events.js | 2 +- public/src/client/topic/posts.js | 2 +- public/src/client/topic/threadTools.js | 2 +- public/src/client/unread.js | 2 +- public/src/client/users.js | 2 +- public/src/modules/notifications.js | 2 +- public/src/modules/search.js | 8 ++++---- public/src/modules/taskbar.js | 2 +- public/src/modules/topicSelect.js | 2 +- public/src/utils.js | 8 ++++---- public/src/widgets.js | 4 ++-- src/analytics.js | 6 +++--- src/categories.js | 2 +- src/categories/topics.js | 2 +- src/controllers/accounts/helpers.js | 2 +- src/controllers/topics.js | 4 ++-- src/database/mongo/hash.js | 12 ++++++------ src/database/mongo/helpers.js | 2 +- src/database/mongo/sets.js | 8 ++++---- src/database/mongo/sorted.js | 12 ++++++------ src/database/redis/hash.js | 2 +- src/database/redis/helpers.js | 8 ++++---- src/database/redis/main.js | 2 +- src/database/redis/sorted.js | 24 ++++++++++++------------ src/file.js | 2 +- src/groups/membership.js | 2 +- src/groups/search.js | 2 +- src/hotswap.js | 2 +- src/image.js | 10 +++++----- src/logger.js | 2 +- src/messaging.js | 8 ++++---- src/middleware/header.js | 2 +- src/middleware/maintenance.js | 2 +- src/notifications.js | 2 +- src/pagination.js | 4 ++-- src/plugins.js | 4 ++-- src/plugins/load.js | 2 +- src/posts.js | 4 ++-- src/posts/summary.js | 2 +- src/posts/votes.js | 2 +- src/privileges/categories.js | 4 ++-- src/privileges/helpers.js | 14 +++++++------- src/privileges/posts.js | 2 +- src/privileges/topics.js | 2 +- src/routes/feeds.js | 2 +- src/routes/index.js | 4 ++-- src/sitemap.js | 12 ++++++------ src/socket.io/admin/rooms.js | 2 +- src/socket.io/admin/user.js | 2 +- src/socket.io/user.js | 2 +- src/topics.js | 2 +- src/topics/create.js | 4 ++-- src/topics/data.js | 2 +- src/topics/follow.js | 4 ++-- src/topics/posts.js | 4 ++-- src/topics/tags.js | 2 +- src/user/data.js | 2 +- src/user/digest.js | 4 ++-- src/user/settings.js | 2 +- test/mocks/databasemock.js | 12 ++++++------ test/user.js | 6 +++--- 77 files changed, 159 insertions(+), 160 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index f96c075add..6d13f18de6 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -76,7 +76,6 @@ "no-multi-spaces": "off", "quotes": "off", "keyword-spacing": "off", - "space-infix-ops": "off", "no-plusplus": "off", "no-mixed-operators": "off", "semi": "off", diff --git a/app.js b/app.js index c348cbfed5..8e19fb5184 100644 --- a/app.js +++ b/app.js @@ -251,7 +251,7 @@ function setup() { install.setup(function (err, data) { var separator = ' '; if (process.stdout.columns > 10) { - for(var x=0,cols=process.stdout.columns-10;x'; + html += ''; break; } html += '
'; diff --git a/public/src/admin/extend/widgets.js b/public/src/admin/extend/widgets.js index 91e05beb04..ad7479f247 100644 --- a/public/src/admin/extend/widgets.js +++ b/public/src/admin/extend/widgets.js @@ -197,13 +197,13 @@ define('admin/extend/widgets', ['jqueryui'], function(jqueryui) { $.get(RELATIVE_PATH + '/api/admin/extend/widgets', function(data) { var areas = data.areas; - for(var i=0; i'+ data.onlineRegisteredCount +'' + + '
' + data.onlineRegisteredCount + '
' + '
Users
' + '' + '
' + - '
'+ data.onlineGuestCount +'
' + + '
' + data.onlineGuestCount + '
' + '
Guests
' + '
' + '
' + - '
'+ (data.onlineRegisteredCount + data.onlineGuestCount) +'
' + + '
' + (data.onlineRegisteredCount + data.onlineGuestCount) + '
' + '
Total
' + '
' + '
' + - '
'+ data.socketCount +'
' + + '
' + data.socketCount + '
' + '
Connections
' + '
'; @@ -150,7 +150,7 @@ define('admin/general/dashboard', ['semver', 'Chart'], function(semver, Chart) { if (g > 255) g = 255; else if (g < 0) g = 0; - return (usePound?"#":"") + (g | (b << 8) | (r << 16)).toString(16); + return (usePound ? "#" : "") + (g | (b << 8) | (r << 16)).toString(16); } function setupGraphs() { @@ -277,7 +277,7 @@ define('admin/general/dashboard', ['semver', 'Chart'], function(semver, Chart) { switch($(this).attr('data-until')) { case 'last-month': var lastMonth = new Date(); - lastMonth.setDate(lastMonth.getDate()-30); + lastMonth.setDate(lastMonth.getDate() - 30); until = lastMonth.getTime(); } updateTrafficGraph($(this).attr('data-units'), until); diff --git a/public/src/admin/manage/categories.js b/public/src/admin/manage/categories.js index 398d24dd42..c406f0f879 100644 --- a/public/src/admin/manage/categories.js +++ b/public/src/admin/manage/categories.js @@ -179,7 +179,7 @@ define('admin/manage/categories', ['vendor/jquery/serializeObject/jquery.ba-seri container.append(html); // Handle and children categories in this level have - for(var x=0,numCategories=categories.length;x' : + '' : '
' + userObj['icon:text'] + '
') + ' ' + userObj.username; } diff --git a/public/src/client/recent.js b/public/src/client/recent.js index 973819d44d..0a990560fc 100644 --- a/public/src/client/recent.js +++ b/public/src/client/recent.js @@ -108,7 +108,7 @@ define('forum/recent', ['forum/infinitescroll', 'components'], function(infinite } else if (newPostCount === 1) { text = '[[recent:there-is-a-new-topic-and-a-new-post]]'; } else if (newPostCount > 1) { - text = '[[recent:there-is-a-new-topic-and-new-posts, ' + newPostCount +']]'; + text = '[[recent:there-is-a-new-topic-and-new-posts, ' + newPostCount + ']]'; } } else if (newTopicCount > 1) { if (newPostCount === 0) { @@ -116,7 +116,7 @@ define('forum/recent', ['forum/infinitescroll', 'components'], function(infinite } else if (newPostCount === 1) { text = '[[recent:there-are-new-topics-and-a-new-post, ' + newTopicCount + ']]'; } else if (newPostCount > 1) { - text = '[[recent:there-are-new-topics-and-new-posts, ' + newTopicCount + ', ' + newPostCount +']]'; + text = '[[recent:there-are-new-topics-and-new-posts, ' + newTopicCount + ', ' + newPostCount + ']]'; } } diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index bba3cb0dcb..2c63abc4fb 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -158,7 +158,7 @@ define('forum/topic/events', [ return true; } - for (var i=0; i 0) { - topicSearchEl.find('.count').html((index+1) + ' / ' + Search.current.results.length); + topicSearchEl.find('.count').html((index + 1) + ' / ' + Search.current.results.length); topicSearchEl.find('.prev, .next').removeAttr('disabled'); var data = { pid: Search.current.results[index], diff --git a/public/src/modules/taskbar.js b/public/src/modules/taskbar.js index 7f5978250b..3b38787e65 100644 --- a/public/src/modules/taskbar.js +++ b/public/src/modules/taskbar.js @@ -114,7 +114,7 @@ define('taskbar', function() { .addClass(data.options.className) .html('' + (data.options.icon ? ' ' : '') + - (data.options.image ? ' ': '') + + (data.options.image ? ' ' : '') + '' + title + '' + '') .attr({ diff --git a/public/src/modules/topicSelect.js b/public/src/modules/topicSelect.js index d0dd85b601..8362980993 100644 --- a/public/src/modules/topicSelect.js +++ b/public/src/modules/topicSelect.js @@ -71,7 +71,7 @@ define('topicSelect', ['components'], function(components) { end = tmp; } - for(var i=start; i<=end; ++i) { + for(var i = start; i <= end; ++i) { var topic = $('[component="category/topic"]').eq(i); toggleSelect(topic.find('[component="topic/select"]'), isSelected); } diff --git a/public/src/utils.js b/public/src/utils.js index 989a9506a6..474df8151c 100644 --- a/public/src/utils.js +++ b/public/src/utils.js @@ -276,7 +276,7 @@ for (var i = envs.length - 1; i >= 0; i--) { var env = envs[i]; - $el.addClass('hidden-'+env); + $el.addClass('hidden-' + env); if ($el.is(':hidden')) { $el.remove(); return env; @@ -309,8 +309,8 @@ labels = [], tmpDate; - for(var x=29;x>=0;x--) { - tmpDate = new Date(currentDay - (1000*60*60*24*x)); + for(var x = 29;x >= 0;x--) { + tmpDate = new Date(currentDay - (1000 * 60 * 60 * 24 * x)); labels.push(months[tmpDate.getMonth()] + ' ' + tmpDate.getDate()); } @@ -461,7 +461,7 @@ } var len = this.length; var suffixLen = suffix.length; - for (var i=1; (i <= suffixLen && this[len - i] === suffix[suffixLen - i]); ++i) { + for (var i = 1; (i <= suffixLen && this[len - i] === suffix[suffixLen - i]); ++i) { continue; } return i > suffixLen; diff --git a/public/src/widgets.js b/public/src/widgets.js index 8bae7cc465..c798ce0f93 100644 --- a/public/src/widgets.js +++ b/public/src/widgets.js @@ -42,12 +42,12 @@ url: url, isMobile: utils.isMobile() }, function(renderedAreas) { - for (var x=0; x 1) { url += '?page=' + currentPage; @@ -149,7 +149,7 @@ topicsController.get = function(req, res, callback) { }, function (topicData, next) { function findPost(index) { - for(var i=0; i origRatio) { - desiredRatio = 1/desiredRatio; + desiredRatio = 1 / desiredRatio; } if (origRatio >= 1) { y = 0; // height is the smaller dimension here - x = Math.floor((w/2) - (h * desiredRatio / 2)); + x = Math.floor((w / 2) - (h * desiredRatio / 2)); crop = async.apply(image.crop.bind(image), x, y, h * desiredRatio, h); } else { x = 0; // width is the smaller dimension here - y = Math.floor(h/2 - (w * desiredRatio / 2)); + y = Math.floor(h / 2 - (w * desiredRatio / 2)); crop = async.apply(image.crop.bind(image), x, y, w, w * desiredRatio); } } else { diff --git a/src/logger.js b/src/logger.js index e646046bd9..b99fbfbb91 100644 --- a/src/logger.js +++ b/src/logger.js @@ -148,7 +148,7 @@ var opts = { * The format is: io: */ try { - return 'io: '+_uid+' '+_type+' '+util.inspect(Array.prototype.slice.call(_args))+'\n'; + return 'io: ' + _uid + ' ' + _type + ' ' + util.inspect(Array.prototype.slice.call(_args)) + '\n'; } catch(err) { winston.info("Logger.prepare_io_string: Failed", err); return "error"; diff --git a/src/messaging.js b/src/messaging.js index ae554f7359..cdf5f77ce4 100644 --- a/src/messaging.js +++ b/src/messaging.js @@ -156,10 +156,10 @@ var userNotifications = require('./user/notifications'); // Add a spacer in between messages with time gaps between them messages = messages.map(function(message, index) { // Compare timestamps with the previous message, and check if a spacer needs to be added - if (index > 0 && parseInt(message.timestamp, 10) > parseInt(messages[index-1].timestamp, 10) + (1000*60*5)) { + if (index > 0 && parseInt(message.timestamp, 10) > parseInt(messages[index - 1].timestamp, 10) + (1000 * 60 * 5)) { // If it's been 5 minutes, this is a new set of messages message.newSet = true; - } else if (index > 0 && message.fromuid !== messages[index-1].fromuid) { + } else if (index > 0 && message.fromuid !== messages[index - 1].fromuid) { // If the previous message was from the other person, this is also a new set message.newSet = true; } @@ -176,7 +176,7 @@ var userNotifications = require('./user/notifications'); function(index, next) { // Continue only if this isn't the first message in sorted set if (index > 0) { - db.getSortedSetRange(key, index-1, index-1, next); + db.getSortedSetRange(key, index - 1, index - 1, next); } else { messages[0].newSet = true; return next(undefined, messages); @@ -191,7 +191,7 @@ var userNotifications = require('./user/notifications'); } if ( - (parseInt(messages[0].timestamp, 10) > parseInt(fields.timestamp, 10) + (1000*60*5)) || + (parseInt(messages[0].timestamp, 10) > parseInt(fields.timestamp, 10) + (1000 * 60 * 5)) || (parseInt(messages[0].fromuid, 10) !== parseInt(fields.fromuid, 10)) ) { // If it's been 5 minutes, this is a new set of messages diff --git a/src/middleware/header.js b/src/middleware/header.js index be56abc44b..3386e35856 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -50,7 +50,7 @@ module.exports = function(middleware) { 'brand:logo': meta.config['brand:logo'] || '', 'brand:logo:url': meta.config['brand:logo:url'] || '', 'brand:logo:alt': meta.config['brand:logo:alt'] || '', - 'brand:logo:display': meta.config['brand:logo']?'':'hide', + 'brand:logo:display': meta.config['brand:logo'] ? '' : 'hide', allowRegistration: registrationType === 'normal' || registrationType === 'admin-approval' || registrationType === 'admin-approval-ip', searchEnabled: plugins.hasListeners('filter:search.query'), config: res.locals.config, diff --git a/src/middleware/maintenance.js b/src/middleware/maintenance.js index 33079b88ef..2c8d30305b 100644 --- a/src/middleware/maintenance.js +++ b/src/middleware/maintenance.js @@ -43,7 +43,7 @@ module.exports = function(middleware) { }; var isAllowed = function(url) { - for(var x=0,numAllowed=allowedRoutes.length,route;x0; --i) { + for (i = pages.length - 1; i > 0; --i) { if (pages[i - 1].page !== pages[i].page - 1) { pages.splice(i, 0, {separator: true}); } diff --git a/src/plugins.js b/src/plugins.js index af3bc887c9..74cb39d034 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -126,7 +126,7 @@ var middleware; if (Plugins.versionWarning.length && nconf.get('isPrimary') === 'true') { process.stdout.write('\n'); winston.warn('[plugins/load] The following plugins may not be compatible with your version of NodeBB. This may cause unintended behaviour or crashing. In the event of an unresponsive NodeBB caused by this plugin, run `./nodebb reset -p PLUGINNAME` to disable it.'); - for(var x=0,numPlugins=Plugins.versionWarning.length;x= preventTopicDeleteAfterReplies) { var langKey = preventTopicDeleteAfterReplies > 1 ? - '[[error:cant-delete-topic-has-replies, ' + meta.config.preventTopicDeleteAfterReplies + ']]': + '[[error:cant-delete-topic-has-replies, ' + meta.config.preventTopicDeleteAfterReplies + ']]' : '[[error:cant-delete-topic-has-reply]]'; return callback(new Error(langKey)); } diff --git a/src/routes/feeds.js b/src/routes/feeds.js index 3ceefbb4d6..721a34cffc 100644 --- a/src/routes/feeds.js +++ b/src/routes/feeds.js @@ -350,7 +350,7 @@ function generateForPostsFeed(feedOptions, posts) { feed.item({ title: postData.topic ? postData.topic.title : '', description: postData.content, - url: nconf.get('url') + '/topic/' + (postData.topic ? postData.topic.slug : '#') + '/'+postData.index, + url: nconf.get('url') + '/topic/' + (postData.topic ? postData.topic.slug : '#') + '/' + postData.index, author: postData.user ? postData.user.username : '', date: new Date(parseInt(postData.timestamp, 10)).toUTCString() }); diff --git a/src/routes/index.js b/src/routes/index.js index 659f4132ae..3ef899d4df 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -94,7 +94,7 @@ module.exports = function(app, middleware, hotswapIds) { var ensureLoggedIn = require('connect-ensure-login'); if (Array.isArray(hotswapIds) && hotswapIds.length) { - for(var idx,x=0;x parseInt(max, 10)) { - return callback(new Error('[[error:'+ maxError + ', ' + max + ']]')); + return callback(new Error('[[error:' + maxError + ', ' + max + ']]')); } callback(); } diff --git a/src/topics/data.js b/src/topics/data.js index 6e7172bb5f..9a7553f2b0 100644 --- a/src/topics/data.js +++ b/src/topics/data.js @@ -40,7 +40,7 @@ module.exports = function(Topics) { Topics.getTopicsData = function(tids, callback) { var keys = []; - for (var i=0; i 19) { diff --git a/src/user/data.js b/src/user/data.js index c8af4698a9..19c54895dc 100644 --- a/src/user/data.js +++ b/src/user/data.js @@ -126,7 +126,7 @@ module.exports = function(User) { user.status = User.getStatus(user); } - for(var i=0; i 10 seconds', function(done) { - User.setUserField(testUid, 'lastposttime', +new Date()-(11*1000), function() { + User.setUserField(testUid, 'lastposttime', +new Date() - (11 * 1000), function() { Topics.post({ uid: testUid, title: 'Topic 3', @@ -141,7 +141,7 @@ describe('User', function() { Meta.config.newbiePostDelay = 30; Meta.config.newbiePostDelayThreshold = 3; - User.setUserField(testUid, 'lastposttime', +new Date()-(20*1000), function() { + User.setUserField(testUid, 'lastposttime', +new Date() - (20 * 1000), function() { Topics.post({ uid: testUid, title: 'Topic 4', @@ -156,7 +156,7 @@ describe('User', function() { it('should not error if a non-newbie user posts if the last post time is 10 < 30 seconds', function(done) { User.setUserFields(testUid, { - lastposttime: +new Date()-(20*1000), + lastposttime: +new Date() - (20 * 1000), reputation: 10 }, function() { Topics.post({ From 4a3c31b2dcc81baea88739452f512aafc940034b Mon Sep 17 00:00:00 2001 From: HeeL Date: Thu, 13 Oct 2016 11:43:39 +0200 Subject: [PATCH 23/79] Fix space-before-function-paren linter rule --- .eslintrc.json | 1 - Gruntfile.js | 6 +- app.js | 24 +- bcrypt.js | 6 +- install/databases.js | 2 +- install/web.js | 18 +- loader.js | 34 +- minifier.js | 14 +- public/src/admin/admin.js | 58 +-- public/src/admin/advanced/errors.js | 12 +- public/src/admin/advanced/events.js | 8 +- public/src/admin/advanced/logs.js | 10 +- public/src/admin/appearance/customise.js | 10 +- public/src/admin/appearance/skins.js | 18 +- public/src/admin/appearance/themes.js | 24 +- public/src/admin/extend/plugins.js | 66 ++-- public/src/admin/extend/rewards.js | 30 +- public/src/admin/extend/widgets.js | 36 +- public/src/admin/general/dashboard.js | 24 +- public/src/admin/general/homepage.js | 4 +- public/src/admin/general/languages.js | 4 +- public/src/admin/general/navigation.js | 24 +- public/src/admin/general/social.js | 10 +- public/src/admin/general/sounds.js | 10 +- public/src/admin/manage/categories.js | 34 +- public/src/admin/manage/category-analytics.js | 8 +- public/src/admin/manage/category.js | 108 +++--- public/src/admin/manage/flags.js | 28 +- public/src/admin/manage/group.js | 38 +- public/src/admin/manage/groups.js | 30 +- public/src/admin/manage/ip-blacklist.js | 16 +- public/src/admin/manage/registration.js | 14 +- public/src/admin/manage/tags.js | 40 +- public/src/admin/manage/users.js | 88 ++--- public/src/admin/modules/colorpicker.js | 10 +- public/src/admin/modules/instance.js | 10 +- public/src/admin/modules/search.js | 14 +- public/src/admin/modules/selectable.js | 4 +- public/src/admin/settings.js | 34 +- public/src/admin/settings/email.js | 22 +- public/src/admin/settings/general.js | 12 +- public/src/ajaxify.js | 54 +-- public/src/app.js | 120 +++--- public/src/client/account/best.js | 4 +- public/src/client/account/bookmarks.js | 4 +- public/src/client/account/downvoted.js | 4 +- public/src/client/account/edit.js | 60 +-- public/src/client/account/edit/email.js | 6 +- public/src/client/account/edit/password.js | 10 +- public/src/client/account/edit/username.js | 6 +- public/src/client/account/followers.js | 4 +- public/src/client/account/following.js | 4 +- public/src/client/account/groups.js | 6 +- public/src/client/account/header.js | 40 +- public/src/client/account/info.js | 8 +- public/src/client/account/posts.js | 10 +- public/src/client/account/profile.js | 10 +- public/src/client/account/settings.js | 26 +- public/src/client/account/topics.js | 10 +- public/src/client/account/upvoted.js | 4 +- public/src/client/account/watched.js | 4 +- public/src/client/categories.js | 14 +- public/src/client/category.js | 54 +-- public/src/client/categoryTools.js | 36 +- public/src/client/chats.js | 98 ++--- public/src/client/chats/messages.js | 40 +- public/src/client/chats/recent.js | 12 +- public/src/client/chats/search.js | 16 +- public/src/client/compose.js | 4 +- public/src/client/footer.js | 6 +- public/src/client/groups/details.js | 60 +-- public/src/client/groups/list.js | 26 +- public/src/client/groups/memberlist.js | 22 +- public/src/client/infinitescroll.js | 12 +- public/src/client/login.js | 12 +- public/src/client/notifications.js | 16 +- public/src/client/pagination.js | 12 +- public/src/client/popular.js | 4 +- public/src/client/recent.js | 24 +- public/src/client/register.js | 42 +-- public/src/client/reset.js | 8 +- public/src/client/reset_code.js | 8 +- public/src/client/search.js | 18 +- public/src/client/tag.js | 8 +- public/src/client/tags.js | 22 +- public/src/client/topic.js | 40 +- public/src/client/topic/delete-posts.js | 16 +- public/src/client/topic/events.js | 24 +- public/src/client/topic/flag.js | 18 +- public/src/client/topic/fork.js | 18 +- public/src/client/topic/move.js | 22 +- public/src/client/topic/postTools.js | 108 +++--- public/src/client/topic/posts.js | 62 ++-- public/src/client/topic/threadTools.js | 54 +-- public/src/client/unread.js | 26 +- public/src/client/users.js | 24 +- public/src/installer/install.js | 14 +- public/src/modules/alerts.js | 12 +- public/src/modules/autocomplete.js | 22 +- public/src/modules/chat.js | 84 ++--- public/src/modules/components.js | 32 +- public/src/modules/coverPhoto.js | 16 +- public/src/modules/helpers.js | 44 +-- public/src/modules/iconSelect.js | 22 +- public/src/modules/navigator.js | 44 +-- public/src/modules/notifications.js | 38 +- public/src/modules/postSelect.js | 10 +- public/src/modules/search.js | 34 +- public/src/modules/settings.js | 8 +- public/src/modules/share.js | 10 +- public/src/modules/sort.js | 6 +- public/src/modules/sounds.js | 14 +- public/src/modules/taskbar.js | 26 +- public/src/modules/topicSelect.js | 14 +- public/src/modules/uploader.js | 26 +- public/src/overrides.js | 48 +-- public/src/sockets.js | 8 +- public/src/utils.js | 88 ++--- public/src/widgets.js | 16 +- src/analytics.js | 46 +-- src/batch.js | 28 +- src/categories.js | 96 ++--- src/categories/activeusers.js | 8 +- src/categories/create.js | 28 +- src/categories/data.js | 32 +- src/categories/delete.js | 40 +- src/categories/recentreplies.js | 92 ++--- src/categories/topics.js | 26 +- src/categories/unread.js | 20 +- src/categories/update.js | 30 +- src/controllers/accounts/chats.js | 18 +- src/controllers/accounts/edit.js | 38 +- src/controllers/accounts/follow.js | 10 +- src/controllers/accounts/groups.js | 8 +- src/controllers/accounts/helpers.js | 26 +- src/controllers/accounts/info.js | 8 +- src/controllers/accounts/notifications.js | 4 +- src/controllers/accounts/posts.js | 26 +- src/controllers/accounts/profile.js | 14 +- src/controllers/accounts/session.js | 8 +- src/controllers/accounts/settings.js | 34 +- src/controllers/admin/appearance.js | 2 +- src/controllers/admin/blacklist.js | 4 +- src/controllers/admin/cache.js | 2 +- src/controllers/admin/categories.js | 12 +- src/controllers/admin/dashboard.js | 28 +- src/controllers/admin/database.js | 8 +- src/controllers/admin/errors.js | 8 +- src/controllers/admin/events.js | 8 +- src/controllers/admin/flags.js | 18 +- src/controllers/admin/groups.js | 20 +- src/controllers/admin/homepage.js | 16 +- src/controllers/admin/info.js | 28 +- src/controllers/admin/languages.js | 6 +- src/controllers/admin/logger.js | 2 +- src/controllers/admin/logs.js | 4 +- src/controllers/admin/navigation.js | 6 +- src/controllers/admin/plugins.js | 22 +- src/controllers/admin/rewards.js | 4 +- src/controllers/admin/settings.js | 12 +- src/controllers/admin/social.js | 4 +- src/controllers/admin/sounds.js | 6 +- src/controllers/admin/tags.js | 4 +- src/controllers/admin/themes.js | 4 +- src/controllers/admin/uploads.js | 36 +- src/controllers/admin/users.js | 60 +-- src/controllers/admin/widgets.js | 4 +- src/controllers/api.js | 64 ++-- src/controllers/authentication.js | 78 ++-- src/controllers/categories.js | 6 +- src/controllers/category.js | 18 +- src/controllers/globalmods.js | 8 +- src/controllers/groups.js | 38 +- src/controllers/helpers.js | 26 +- src/controllers/index.js | 54 +-- src/controllers/popular.js | 4 +- src/controllers/posts.js | 4 +- src/controllers/recent.js | 6 +- src/controllers/search.js | 4 +- src/controllers/sitemap.js | 18 +- src/controllers/tags.js | 12 +- src/controllers/topics.js | 28 +- src/controllers/unread.js | 24 +- src/controllers/uploads.js | 40 +- src/controllers/users.js | 58 +-- src/coverPhoto.js | 4 +- src/database/mongo.js | 32 +- src/database/mongo/hash.js | 62 ++-- src/database/mongo/helpers.js | 8 +- src/database/mongo/list.js | 32 +- src/database/mongo/main.js | 36 +- src/database/mongo/sets.js | 70 ++-- src/database/mongo/sorted.js | 164 ++++----- src/database/redis.js | 18 +- src/database/redis/hash.js | 60 +-- src/database/redis/helpers.js | 14 +- src/database/redis/list.js | 34 +- src/database/redis/main.js | 64 ++-- src/database/redis/sets.js | 50 +-- src/database/redis/sorted.js | 110 +++--- src/emailer.js | 28 +- src/emitter.js | 8 +- src/events.js | 64 ++-- src/file.js | 24 +- src/groups.js | 138 +++---- src/groups/cover.js | 14 +- src/groups/create.js | 4 +- src/groups/delete.js | 14 +- src/groups/membership.js | 172 ++++----- src/groups/ownership.js | 14 +- src/groups/search.js | 44 +-- src/groups/update.js | 44 +-- src/hotswap.js | 6 +- src/image.js | 30 +- src/install.js | 42 +-- src/languages.js | 20 +- src/logger.js | 32 +- src/messaging.js | 122 +++---- src/messaging/create.js | 16 +- src/messaging/delete.js | 8 +- src/messaging/edit.js | 14 +- src/messaging/notifications.js | 30 +- src/messaging/rooms.js | 54 +-- src/messaging/unread.js | 16 +- src/meta.js | 12 +- src/meta/blacklist.js | 20 +- src/meta/configs.js | 18 +- src/meta/css.js | 46 +-- src/meta/dependencies.js | 10 +- src/meta/errors.js | 14 +- src/meta/js.js | 44 +-- src/meta/logs.js | 8 +- src/meta/settings.js | 18 +- src/meta/sounds.js | 48 +-- src/meta/tags.js | 14 +- src/meta/templates.js | 36 +- src/meta/themes.js | 24 +- src/middleware/admin.js | 30 +- src/middleware/header.js | 38 +- src/middleware/headers.js | 4 +- src/middleware/index.js | 38 +- src/middleware/maintenance.js | 12 +- src/middleware/ratelimit.js | 2 +- src/middleware/render.js | 26 +- src/middleware/user.js | 24 +- src/navigation/admin.js | 18 +- src/navigation/index.js | 8 +- src/notifications.js | 150 ++++---- src/pagination.js | 8 +- src/password.js | 8 +- src/plugins.js | 114 +++--- src/plugins/hooks.js | 26 +- src/plugins/install.js | 52 +-- src/plugins/load.js | 54 +-- src/posts.js | 76 ++-- src/posts/bookmarks.js | 28 +- src/posts/category.js | 28 +- src/posts/create.js | 30 +- src/posts/delete.js | 62 ++-- src/posts/edit.js | 26 +- src/posts/flags.js | 100 ++--- src/posts/parse.js | 10 +- src/posts/recent.js | 22 +- src/posts/summary.js | 38 +- src/posts/tools.js | 10 +- src/posts/topics.js | 32 +- src/posts/user.js | 42 +-- src/posts/votes.js | 54 +-- src/privileges/categories.js | 154 ++++---- src/privileges/helpers.js | 30 +- src/privileges/posts.js | 66 ++-- src/privileges/topics.js | 78 ++-- src/privileges/users.js | 36 +- src/pubsub.js | 6 +- src/reset.js | 22 +- src/rewards/admin.js | 44 +-- src/rewards/index.js | 40 +- src/routes/admin.js | 2 +- src/routes/api.js | 2 +- src/routes/authentication.js | 18 +- src/routes/debug.js | 4 +- src/routes/feeds.js | 44 +-- src/routes/helpers.js | 2 +- src/routes/index.js | 4 +- src/routes/meta.js | 2 +- src/routes/plugins.js | 8 +- src/search.js | 102 +++--- src/sitemap.js | 28 +- src/social.js | 18 +- src/socket.io/admin.js | 66 ++-- src/socket.io/admin/categories.js | 36 +- src/socket.io/admin/groups.js | 8 +- src/socket.io/admin/navigation.js | 2 +- src/socket.io/admin/rewards.js | 4 +- src/socket.io/admin/rooms.js | 34 +- src/socket.io/admin/social.js | 2 +- src/socket.io/admin/tags.js | 6 +- src/socket.io/admin/user.js | 68 ++-- src/socket.io/blacklist.js | 6 +- src/socket.io/categories.js | 64 ++-- src/socket.io/groups.js | 82 ++--- src/socket.io/helpers.js | 40 +- src/socket.io/index.js | 2 +- src/socket.io/meta.js | 10 +- src/socket.io/modules.js | 56 +-- src/socket.io/notifications.js | 16 +- src/socket.io/posts.js | 28 +- src/socket.io/posts/bookmarks.js | 6 +- src/socket.io/posts/edit.js | 12 +- src/socket.io/posts/flag.js | 24 +- src/socket.io/posts/helpers.js | 12 +- src/socket.io/posts/move.js | 4 +- src/socket.io/posts/tools.js | 58 +-- src/socket.io/posts/votes.js | 30 +- src/socket.io/topics.js | 24 +- src/socket.io/topics/infinitescroll.js | 20 +- src/socket.io/topics/move.js | 20 +- src/socket.io/topics/tags.js | 12 +- src/socket.io/topics/tools.js | 32 +- src/socket.io/topics/unread.js | 38 +- src/socket.io/user.js | 66 ++-- src/socket.io/user/ban.js | 16 +- src/socket.io/user/picture.js | 22 +- src/socket.io/user/profile.js | 24 +- src/socket.io/user/search.js | 6 +- src/socket.io/user/status.js | 10 +- src/topics.js | 128 +++---- src/topics/create.js | 94 ++--- src/topics/data.js | 30 +- src/topics/delete.js | 90 ++--- src/topics/follow.js | 44 +-- src/topics/fork.js | 60 +-- src/topics/popular.js | 22 +- src/topics/posts.js | 130 +++---- src/topics/recent.js | 24 +- src/topics/suggested.js | 28 +- src/topics/tags.js | 146 ++++---- src/topics/teaser.js | 40 +- src/topics/thumb.js | 20 +- src/topics/tools.js | 36 +- src/topics/unread.js | 110 +++--- src/topics/user.js | 8 +- src/upgrade.js | 260 ++++++------- src/user.js | 104 +++--- src/user/admin.js | 28 +- src/user/approval.js | 68 ++-- src/user/auth.js | 38 +- src/user/categories.js | 18 +- src/user/create.js | 68 ++-- src/user/data.js | 56 +-- src/user/delete.js | 66 ++-- src/user/digest.js | 24 +- src/user/email.js | 40 +- src/user/follow.js | 16 +- src/user/info.js | 38 +- src/user/invite.js | 58 +-- src/user/jobs.js | 10 +- src/user/notifications.js | 82 ++--- src/user/password.js | 12 +- src/user/picture.js | 46 +-- src/user/posts.js | 34 +- src/user/profile.js | 52 +-- src/user/reset.js | 56 +-- src/user/search.js | 38 +- src/user/settings.js | 32 +- src/user/topics.js | 6 +- src/webserver.js | 32 +- src/widgets/admin.js | 20 +- src/widgets/index.js | 44 +-- test/categories.js | 62 ++-- test/database.js | 6 +- test/database/hash.js | 174 ++++----- test/database/keys.js | 70 ++-- test/database/list.js | 80 ++-- test/database/sets.js | 116 +++--- test/database/sorted.js | 344 +++++++++--------- test/groups.js | 160 ++++---- test/messaging.js | 34 +- test/mocks/databasemock.js | 8 +- test/notifications.js | 44 +-- test/posts.js | 50 +-- test/topics.js | 212 +++++------ test/translator.js | 78 ++-- test/user.js | 120 +++--- test/utils.js | 18 +- 385 files changed, 6621 insertions(+), 6622 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 6d13f18de6..9e8e4dd35b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -56,7 +56,6 @@ "indent": "off", "func-names": "off", "prefer-arrow-callback": "off", - "space-before-function-paren": "off", "object-curly-spacing": "off", "no-var": "off", "no-shadow": "off", diff --git a/Gruntfile.js b/Gruntfile.js index eb3cdc7417..9f1585f301 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -6,7 +6,7 @@ var fork = require('child_process').fork, incomplete = []; -module.exports = function(grunt) { +module.exports = function (grunt) { var args = []; if (!grunt.option('verbose')) { args.push('--log-level=info'); @@ -34,7 +34,7 @@ module.exports = function(grunt) { fromFile = ['clientLess', 'acpLess', 'js', 'tpl']; } - fromFile = fromFile.filter(function(ext) { + fromFile = fromFile.filter(function (ext) { return incomplete.indexOf(ext) === -1; }); @@ -44,7 +44,7 @@ module.exports = function(grunt) { worker.kill(); worker = fork('app.js', updateArgs, { env: env }); - worker.on('message', function() { + worker.on('message', function () { if (incomplete.length) { incomplete = []; diff --git a/app.js b/app.js index 8e19fb5184..82ffd2f7b1 100644 --- a/app.js +++ b/app.js @@ -36,7 +36,7 @@ global.env = process.env.NODE_ENV || 'production'; winston.remove(winston.transports.Console); winston.add(winston.transports.Console, { colorize: true, - timestamp: function() { + timestamp: function () { var date = new Date(); return date.getDate() + '/' + (date.getMonth() + 1) + ' ' + date.toTimeString().substr(0,5) + ' [' + global.process.pid + ']'; }, @@ -146,7 +146,7 @@ function start() { process.on('SIGTERM', shutdown); process.on('SIGINT', shutdown); process.on('SIGHUP', restart); - process.on('message', function(message) { + process.on('message', function (message) { if (typeof message !== 'object') { return; } @@ -173,7 +173,7 @@ function start() { } }); - process.on('uncaughtException', function(err) { + process.on('uncaughtException', function (err) { winston.error(err.stack); console.log(err.stack); @@ -184,10 +184,10 @@ function start() { async.waterfall([ async.apply(db.init), async.apply(db.checkCompatibility), - function(next) { + function (next) { require('./src/meta').configs.init(next); }, - function(next) { + function (next) { if (nconf.get('dep-check') === undefined || nconf.get('dep-check') !== false) { require('./src/meta').dependencies.check(next); } else { @@ -195,10 +195,10 @@ function start() { setImmediate(next); } }, - function(next) { + function (next) { require('./src/upgrade').check(next); }, - function(next) { + function (next) { var webserver = require('./src/webserver'); require('./src/socket.io').init(webserver.server); @@ -209,7 +209,7 @@ function start() { webserver.listen(); } - ], function(err) { + ], function (err) { if (err) { switch(err.message) { case 'schema-out-of-date': @@ -280,7 +280,7 @@ function setup() { } function upgrade() { - require('./src/database').init(function(err) { + require('./src/database').init(function (err) { if (err) { winston.error(err.stack); process.exit(); @@ -292,7 +292,7 @@ function upgrade() { } function activate() { - require('./src/database').init(function(err) { + require('./src/database').init(function (err) { if (err) { winston.error(err.stack); process.exit(1); @@ -308,7 +308,7 @@ function activate() { } function listPlugins() { - require('./src/database').init(function(err) { + require('./src/database').init(function (err) { if (err) { winston.error(err.stack); process.exit(1); @@ -316,7 +316,7 @@ function listPlugins() { var db = require('./src/database'); - db.getSortedSetRange('plugins:active', 0, -1, function(err, plugins) { + db.getSortedSetRange('plugins:active', 0, -1, function (err, plugins) { if (err) { winston.error(err.stack); process.exit(1); diff --git a/bcrypt.js b/bcrypt.js index ae81d09eb7..4040aa2a8f 100644 --- a/bcrypt.js +++ b/bcrypt.js @@ -5,7 +5,7 @@ var bcrypt = require('bcryptjs'), async = require('async'); -process.on('message', function(msg) { +process.on('message', function (msg) { if (msg.type === 'hash') { hashPassword(msg.password, msg.rounds); } else if (msg.type === 'compare') { @@ -15,10 +15,10 @@ process.on('message', function(msg) { function hashPassword(password, rounds) { async.waterfall([ - function(next) { + function (next) { bcrypt.genSalt(parseInt(rounds, 10), next); }, - function(salt, next) { + function (salt, next) { bcrypt.hash(password, salt, next); } ], done); diff --git a/install/databases.js b/install/databases.js index f270dbe21e..c314ad75ef 100644 --- a/install/databases.js +++ b/install/databases.js @@ -9,7 +9,7 @@ var questions = { mongo: require('../src/database/mongo').questions }; -module.exports = function(config, callback) { +module.exports = function (config, callback) { async.waterfall([ function (next) { process.stdout.write('\n'); diff --git a/install/web.js b/install/web.js index b60614de07..72284fea5f 100644 --- a/install/web.js +++ b/install/web.js @@ -15,7 +15,7 @@ var server; winston.add(winston.transports.File, { filename: 'logs/webinstall.log', colorize: true, - timestamp: function() { + timestamp: function () { var date = new Date(); return date.getDate() + '/' + (date.getMonth() + 1) + ' ' + date.toTimeString().substr(0,5) + ' [' + global.process.pid + ']'; }, @@ -30,7 +30,7 @@ var scripts = [ 'public/src/installer/install.js' ]; -web.install = function(port) { +web.install = function (port) { port = port || 4567; winston.info('Launching web installer on port', port); @@ -42,7 +42,7 @@ web.install = function(port) { extended: true })); - async.parallel([compileLess, compileJS], function() { + async.parallel([compileLess, compileJS], function () { setupRoutes(); launchExpress(port); }); @@ -50,7 +50,7 @@ web.install = function(port) { function launchExpress(port) { - server = app.listen(port, function() { + server = app.listen(port, function () { winston.info('Web installer listening on http://%s:%s', '0.0.0.0', port); }); } @@ -63,7 +63,7 @@ function setupRoutes() { function welcome(req, res) { var dbs = ['redis', 'mongo']; - var databases = dbs.map(function(el) { + var databases = dbs.map(function (el) { return { name: el, questions: require('../src/database/' + el).questions @@ -93,7 +93,7 @@ function install(req, res) { env: process.env }); - child.on('close', function(data) { + child.on('close', function (data) { if (data === 0) { res.locals.success = true; } else { @@ -129,12 +129,12 @@ function compileLess(callback) { return callback(false); } - fs.readFile(path.join(__dirname, '../public/less/install.less'), function(err, style) { + fs.readFile(path.join(__dirname, '../public/less/install.less'), function (err, style) { if (err) { return winston.error('Unable to read LESS install file: ', err); } - less.render(style.toString(), function(err, css) { + less.render(style.toString(), function (err, css) { if(err) { return winston.error('Unable to compile LESS: ', err); } @@ -151,7 +151,7 @@ function compileJS(callback) { } var scriptPath = path.join(__dirname, '..'); - var result = uglify.minify(scripts.map(function(script) { + var result = uglify.minify(scripts.map(function (script) { return path.join(scriptPath, script); })); diff --git a/loader.js b/loader.js index 8eee556852..02a668c174 100644 --- a/loader.js +++ b/loader.js @@ -33,9 +33,9 @@ var pidFilePath = __dirname + '/pidfile', templatesCompiled: false }; -Loader.init = function(callback) { +Loader.init = function (callback) { if (silent) { - console.log = function() { + console.log = function () { var args = Array.prototype.slice.call(arguments); output.write(args.join(' ') + '\n'); }; @@ -47,7 +47,7 @@ Loader.init = function(callback) { callback(); }; -Loader.displayStartupMessages = function(callback) { +Loader.displayStartupMessages = function (callback) { console.log(''); console.log('NodeBB v' + pkg.version + ' Copyright (C) 2013-2014 NodeBB Inc.'); console.log('This program comes with ABSOLUTELY NO WARRANTY.'); @@ -57,16 +57,16 @@ Loader.displayStartupMessages = function(callback) { callback(); }; -Loader.addWorkerEvents = function(worker) { +Loader.addWorkerEvents = function (worker) { - worker.on('exit', function(code, signal) { + worker.on('exit', function (code, signal) { if (code !== 0) { if (Loader.timesStarted < numProcs * 3) { Loader.timesStarted++; if (Loader.crashTimer) { clearTimeout(Loader.crashTimer); } - Loader.crashTimer = setTimeout(function() { + Loader.crashTimer = setTimeout(function () { Loader.timesStarted = 0; }, 10000); } else { @@ -83,7 +83,7 @@ Loader.addWorkerEvents = function(worker) { } }); - worker.on('message', function(message) { + worker.on('message', function (message) { if (message && typeof message === 'object' && message.action) { switch (message.action) { case 'ready': @@ -148,7 +148,7 @@ Loader.addWorkerEvents = function(worker) { }); }; -Loader.start = function(callback) { +Loader.start = function (callback) { numProcs = getPorts().length; console.log('Clustering enabled: Spinning up ' + numProcs + ' process(es).\n'); @@ -205,22 +205,22 @@ function getPorts() { return port; } -Loader.restart = function() { +Loader.restart = function () { killWorkers(); nconf.remove('file'); nconf.use('file', { file: path.join(__dirname, '/config.json') }); Loader.start(); }; -Loader.reload = function() { - workers.forEach(function(worker) { +Loader.reload = function () { + workers.forEach(function (worker) { worker.send({ action: 'reload' }); }); }; -Loader.stop = function() { +Loader.stop = function () { killWorkers(); // Clean up the pidfile @@ -228,15 +228,15 @@ Loader.stop = function() { }; function killWorkers() { - workers.forEach(function(worker) { + workers.forEach(function (worker) { worker.suicide = true; worker.kill(); }); } -Loader.notifyWorkers = function(msg, worker_pid) { +Loader.notifyWorkers = function (msg, worker_pid) { worker_pid = parseInt(worker_pid, 10); - workers.forEach(function(worker) { + workers.forEach(function (worker) { if (parseInt(worker.pid, 10) !== worker_pid) { try { worker.send(msg); @@ -247,7 +247,7 @@ Loader.notifyWorkers = function(msg, worker_pid) { }); }; -fs.open(path.join(__dirname, 'config.json'), 'r', function(err) { +fs.open(path.join(__dirname, 'config.json'), 'r', function (err) { if (!err) { if (nconf.get('daemon') !== 'false' && nconf.get('daemon') !== false) { if (file.existsSync(pidFilePath)) { @@ -272,7 +272,7 @@ fs.open(path.join(__dirname, 'config.json'), 'r', function(err) { Loader.init, Loader.displayStartupMessages, Loader.start - ], function(err) { + ], function (err) { if (err) { console.log('[loader] Error during startup: ' + err.message); } diff --git a/minifier.js b/minifier.js index 50106e2957..25c0177175 100644 --- a/minifier.js +++ b/minifier.js @@ -12,18 +12,18 @@ var Minifier = { /* Javascript */ Minifier.js.minify = function (scripts, minify, callback) { - scripts = scripts.filter(function(file) { + scripts = scripts.filter(function (file) { return file && file.endsWith('.js'); }); - async.filter(scripts, function(script, next) { - file.exists(script, function(exists) { + async.filter(scripts, function (script, next) { + file.exists(script, function (exists) { if (!exists) { console.warn('[minifier] file not found, ' + script); } next(exists); }); - }, function(scripts) { + }, function (scripts) { if (minify) { minifyScripts(scripts, callback); } else { @@ -32,10 +32,10 @@ Minifier.js.minify = function (scripts, minify, callback) { }); }; -process.on('message', function(payload) { +process.on('message', function (payload) { switch(payload.action) { case 'js': - Minifier.js.minify(payload.scripts, payload.minify, function(minified/*, sourceMap*/) { + Minifier.js.minify(payload.scripts, payload.minify, function (minified/*, sourceMap*/) { process.send({ type: 'end', // sourceMap: sourceMap, @@ -65,7 +65,7 @@ function minifyScripts(scripts, callback) { } function concatenateScripts(scripts, callback) { - async.map(scripts, fs.readFile, function(err, scripts) { + async.map(scripts, fs.readFile, function (err, scripts) { if (err) { process.send({ type: 'error', diff --git a/public/src/admin/admin.js b/public/src/admin/admin.js index 4351f4eae3..9d56403854 100644 --- a/public/src/admin/admin.js +++ b/public/src/admin/admin.js @@ -1,20 +1,20 @@ "use strict"; /*global config, componentHandler, socket, app, bootbox, Slideout, NProgress*/ -(function() { +(function () { var logoutTimer = 0; function startLogoutTimer() { if (logoutTimer) { clearTimeout(logoutTimer); } - logoutTimer = setTimeout(function() { - require(['translator'], function(translator) { - translator.translate('[[login:logged-out-due-to-inactivity]]', function(translated) { + logoutTimer = setTimeout(function () { + require(['translator'], function (translator) { + translator.translate('[[login:logged-out-due-to-inactivity]]', function (translated) { bootbox.alert({ closeButton: false, message: translated, - callback: function(){ + callback: function (){ window.location.reload(); } }); @@ -23,7 +23,7 @@ }, 3600000); } - $(window).on('action:ajaxify.end', function() { + $(window).on('action:ajaxify.end', function () { showCorrectNavTab(); startLogoutTimer(); }); @@ -35,11 +35,11 @@ } } - $(document).ready(function() { + $(document).ready(function () { setupKeybindings(); if(!/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) { - require(['admin/modules/search'], function(search) { + require(['admin/modules/search'], function (search) { search.init(); }); } @@ -51,7 +51,7 @@ setupNProgress(); }); - $(window).on('action:ajaxify.contentLoaded', function(ev, data) { + $(window).on('action:ajaxify.contentLoaded', function (ev, data) { selectMenuItem(data.url); setupRestartLinks(); @@ -59,28 +59,28 @@ }); function setupNProgress() { - $(window).on('action:ajaxify.start', function() { + $(window).on('action:ajaxify.start', function () { NProgress.set(0.7); }); - $(window).on('action:ajaxify.end', function() { + $(window).on('action:ajaxify.end', function () { NProgress.done(); }); } function setupKeybindings() { - require(['mousetrap'], function(mousetrap) { - mousetrap.bind('ctrl+shift+a r', function() { - require(['admin/modules/instance'], function(instance) { + require(['mousetrap'], function (mousetrap) { + mousetrap.bind('ctrl+shift+a r', function () { + require(['admin/modules/instance'], function (instance) { instance.reload(); }); }); - mousetrap.bind('ctrl+shift+a R', function() { + mousetrap.bind('ctrl+shift+a R', function () { socket.emit('admin.restart'); }); - mousetrap.bind('/', function() { + mousetrap.bind('/', function () { $('#acp-search input').focus(); return false; @@ -100,7 +100,7 @@ } $('#main-menu li').removeClass('active'); - $('#main-menu a').removeClass('active').each(function() { + $('#main-menu a').removeClass('active').each(function () { var menu = $(this), href = menu.attr('href'), isLink = menu.parent().attr('data-link') === '1'; @@ -115,7 +115,7 @@ }); var acpPath = url.replace('admin/', '').split('/'); - acpPath.forEach(function(path, i) { + acpPath.forEach(function (path, i) { acpPath[i] = path.charAt(0).toUpperCase() + path.slice(1); }); acpPath = acpPath.join(' > '); @@ -124,18 +124,18 @@ } function setupRestartLinks() { - $('.restart').off('click').on('click', function() { - bootbox.confirm('Are you sure you wish to restart NodeBB?', function(confirm) { + $('.restart').off('click').on('click', function () { + bootbox.confirm('Are you sure you wish to restart NodeBB?', function (confirm) { if (confirm) { - require(['admin/modules/instance'], function(instance) { + require(['admin/modules/instance'], function (instance) { instance.restart(); }); } }); }); - $('.reload').off('click').on('click', function() { - require(['admin/modules/instance'], function(instance) { + $('.reload').off('click').on('click', function () { + require(['admin/modules/instance'], function (instance) { instance.reload(); }); }); @@ -144,8 +144,8 @@ function launchSnackbar(params) { var message = (params.title ? "" + params.title + "" : '') + (params.message ? params.message : ''); - require(['translator'], function(translator) { - translator.translate(message, function(html) { + require(['translator'], function (translator) { + translator.translate(message, function (html) { var bar = $.snackbar({ content: html, timeout: 3000, @@ -167,15 +167,15 @@ 'tolerance': 70 }); - $('#mobile-menu').on('click', function() { + $('#mobile-menu').on('click', function () { slideout.toggle(); }); - $('#menu a').on('click', function() { + $('#menu a').on('click', function () { slideout.close(); }); - $(window).on('resize', function() { + $(window).on('resize', function () { slideout.close(); }); @@ -190,7 +190,7 @@ slideout.on('open', onOpeningMenu); slideout.on('translate', onOpeningMenu); - slideout.on('close', function() { + slideout.on('close', function () { $('#header').css({ 'top': '0px', 'position': 'fixed' diff --git a/public/src/admin/advanced/errors.js b/public/src/admin/advanced/errors.js index 3977778b5a..29ee7e362c 100644 --- a/public/src/admin/advanced/errors.js +++ b/public/src/admin/advanced/errors.js @@ -1,19 +1,19 @@ "use strict"; /*global config, define, app, socket, ajaxify, bootbox, templates, Chart, utils */ -define('admin/advanced/errors', ['Chart'], function(Chart) { +define('admin/advanced/errors', ['Chart'], function (Chart) { var Errors = {}; - Errors.init = function() { + Errors.init = function () { Errors.setupCharts(); $('[data-action="clear"]').on('click', Errors.clear404); }; - Errors.clear404 = function() { - bootbox.confirm('Are you sure you wish to clear the 404 error logs?', function(ok) { + Errors.clear404 = function () { + bootbox.confirm('Are you sure you wish to clear the 404 error logs?', function (ok) { if (ok) { - socket.emit('admin.errors.clear', {}, function(err) { + socket.emit('admin.errors.clear', {}, function (err) { if (err) { return app.alertError(err.message); } @@ -25,7 +25,7 @@ define('admin/advanced/errors', ['Chart'], function(Chart) { }); }; - Errors.setupCharts = function() { + Errors.setupCharts = function () { var notFoundCanvas = document.getElementById('not-found'), tooBusyCanvas = document.getElementById('toobusy'), dailyLabels = utils.getDaysArray(); diff --git a/public/src/admin/advanced/events.js b/public/src/admin/advanced/events.js index a952666786..b4f18414ea 100644 --- a/public/src/admin/advanced/events.js +++ b/public/src/admin/advanced/events.js @@ -3,13 +3,13 @@ /* global define, socket, app */ -define('admin/advanced/events', function() { +define('admin/advanced/events', function () { var Events = {}; - Events.init = function() { + Events.init = function () { - $('[data-action="clear"]').on('click', function() { - socket.emit('admin.deleteAllEvents', function(err) { + $('[data-action="clear"]').on('click', function () { + socket.emit('admin.deleteAllEvents', function (err) { if (err) { return app.alertError(err.message); } diff --git a/public/src/admin/advanced/logs.js b/public/src/admin/advanced/logs.js index 8411effabc..2ea10f1b36 100644 --- a/public/src/admin/advanced/logs.js +++ b/public/src/admin/advanced/logs.js @@ -1,22 +1,22 @@ "use strict"; /* global define, socket, app */ -define('admin/advanced/logs', function() { +define('admin/advanced/logs', function () { var Logs = {}; - Logs.init = function() { + Logs.init = function () { var logsEl = $('.logs pre'); logsEl.scrollTop(logsEl.prop('scrollHeight')); // Affix menu $('.affix').affix(); - $('.logs').find('button[data-action]').on('click', function(event) { + $('.logs').find('button[data-action]').on('click', function (event) { var btnEl = $(this), action = btnEl.attr('data-action'); switch(action) { case 'reload': - socket.emit('admin.logs.get', function(err, logs) { + socket.emit('admin.logs.get', function (err, logs) { if (!err) { logsEl.text(logs); logsEl.scrollTop(logsEl.prop('scrollHeight')); @@ -27,7 +27,7 @@ define('admin/advanced/logs', function() { break; case 'clear': - socket.emit('admin.logs.clear', function(err) { + socket.emit('admin.logs.clear', function (err) { if (!err) { app.alertSuccess('Logs Cleared!'); btnEl.prev().click(); diff --git a/public/src/admin/appearance/customise.js b/public/src/admin/appearance/customise.js index e76bb9d3e4..d8ad5e3ecb 100644 --- a/public/src/admin/appearance/customise.js +++ b/public/src/admin/appearance/customise.js @@ -1,11 +1,11 @@ "use strict"; /* global ace, define, app, socket */ -define('admin/appearance/customise', ['admin/settings'], function(Settings) { +define('admin/appearance/customise', ['admin/settings'], function (Settings) { var Customise = {}; - Customise.init = function() { - Settings.prepare(function() { + Customise.init = function () { + Settings.prepare(function () { $('#customCSS').text($('#customCSS-holder').val()); $('#customHTML').text($('#customHTML-holder').val()); @@ -15,7 +15,7 @@ define('admin/appearance/customise', ['admin/settings'], function(Settings) { customCSS.setTheme("ace/theme/twilight"); customCSS.getSession().setMode("ace/mode/css"); - customCSS.on('change', function(event) { + customCSS.on('change', function (event) { app.flags = app.flags || {}; app.flags._unsaved = true; $('#customCSS-holder').val(customCSS.getValue()); @@ -24,7 +24,7 @@ define('admin/appearance/customise', ['admin/settings'], function(Settings) { customHTML.setTheme("ace/theme/twilight"); customHTML.getSession().setMode("ace/mode/html"); - customHTML.on('change', function(event) { + customHTML.on('change', function (event) { app.flags = app.flags || {}; app.flags._unsaved = true; $('#customHTML-holder').val(customHTML.getValue()); diff --git a/public/src/admin/appearance/skins.js b/public/src/admin/appearance/skins.js index e489a453c5..9dc02a1efc 100644 --- a/public/src/admin/appearance/skins.js +++ b/public/src/admin/appearance/skins.js @@ -1,17 +1,17 @@ "use strict"; /* global define, app, socket, templates */ -define('admin/appearance/skins', function() { +define('admin/appearance/skins', function () { var Skins = {}; - Skins.init = function() { + Skins.init = function () { // Populate skins from Bootswatch API $.ajax({ method: 'get', url: 'https://bootswatch.com/api/3.json' }).done(Skins.render); - $('#skins').on('click', function(e){ + $('#skins').on('click', function (e){ var target = $(e.target); if (!target.attr('data-action')) { @@ -31,7 +31,7 @@ define('admin/appearance/skins', function() { type: themeType, id: themeId, src: cssSrc - }, function(err) { + }, function (err) { if (err) { return app.alertError(err.message); } @@ -49,11 +49,11 @@ define('admin/appearance/skins', function() { }); }; - Skins.render = function(bootswatch) { + Skins.render = function (bootswatch) { var themeContainer = $('#bootstrap_themes'); templates.parse('admin/partials/theme_list', { - themes: bootswatch.themes.map(function(theme) { + themes: bootswatch.themes.map(function (theme) { return { type: 'bootswatch', id: theme.name, @@ -66,13 +66,13 @@ define('admin/appearance/skins', function() { }; }), showRevert: true - }, function(html) { + }, function (html) { themeContainer.html(html); if (config['theme:src']) { var skin = config['theme:src'] .match(/latest\/(\S+)\/bootstrap.min.css/)[1] - .replace(/(^|\s)([a-z])/g , function(m,p1,p2){return p1 + p2.toUpperCase();}); + .replace(/(^|\s)([a-z])/g , function (m,p1,p2){return p1 + p2.toUpperCase();}); highlightSelectedTheme(skin); } @@ -82,7 +82,7 @@ define('admin/appearance/skins', function() { function highlightSelectedTheme(themeId) { $('[data-theme]') .removeClass('selected') - .find('[data-action="use"]').each(function() { + .find('[data-action="use"]').each(function () { if ($(this).parents('[data-theme]').attr('data-theme')) { $(this) .html('Select Skin') diff --git a/public/src/admin/appearance/themes.js b/public/src/admin/appearance/themes.js index 0d4e403fbd..41adcc1589 100644 --- a/public/src/admin/appearance/themes.js +++ b/public/src/admin/appearance/themes.js @@ -1,11 +1,11 @@ "use strict"; /* global define, app, socket, bootbox, templates, config */ -define('admin/appearance/themes', function() { +define('admin/appearance/themes', function () { var Themes = {}; - Themes.init = function() { - $('#installed_themes').on('click', function(e){ + Themes.init = function () { + $('#installed_themes').on('click', function (e){ var target = $(e.target), action = target.attr('data-action'); @@ -19,7 +19,7 @@ define('admin/appearance/themes', function() { type: themeType, id: themeId, src: cssSrc - }, function(err) { + }, function (err) { if (err) { return app.alertError(err.message); } @@ -31,7 +31,7 @@ define('admin/appearance/themes', function() { title: 'Theme Changed', message: 'Please restart your NodeBB to fully activate this theme', timeout: 5000, - clickfn: function() { + clickfn: function () { socket.emit('admin.restart'); } }); @@ -39,13 +39,13 @@ define('admin/appearance/themes', function() { } }); - $('#revert_theme').on('click', function() { - bootbox.confirm('Are you sure you wish to restore the default NodeBB theme?', function(confirm) { + $('#revert_theme').on('click', function () { + bootbox.confirm('Are you sure you wish to restore the default NodeBB theme?', function (confirm) { if (confirm) { socket.emit('admin.themes.set', { type: 'local', id: 'nodebb-theme-persona' - }, function(err) { + }, function (err) { if (err) { return app.alertError(err.message); } @@ -62,7 +62,7 @@ define('admin/appearance/themes', function() { }); }); - socket.emit('admin.themes.getInstalled', function(err, themes) { + socket.emit('admin.themes.getInstalled', function (err, themes) { if(err) { return app.alertError(err.message); } @@ -75,9 +75,9 @@ define('admin/appearance/themes', function() { } else { templates.parse('admin/partials/theme_list', { themes: themes - }, function(html) { - require(['translator'], function(translator) { - translator.translate(html, function(html) { + }, function (html) { + require(['translator'], function (translator) { + translator.translate(html, function (html) { instListEl.html(html); highlightSelectedTheme(config['theme:id']); }); diff --git a/public/src/admin/extend/plugins.js b/public/src/admin/extend/plugins.js index 3e12074e3a..bb89256959 100644 --- a/public/src/admin/extend/plugins.js +++ b/public/src/admin/extend/plugins.js @@ -1,9 +1,9 @@ "use strict"; /* global define, app, socket, bootbox */ -define('admin/extend/plugins', function() { +define('admin/extend/plugins', function () { var Plugins = {}; - Plugins.init = function() { + Plugins.init = function () { var pluginsList = $('.plugins'), numPlugins = pluginsList[0].querySelectorAll('li').length, pluginID; @@ -15,11 +15,11 @@ define('admin/extend/plugins', function() { $('#plugin-search').val(''); - pluginsList.on('click', 'button[data-action="toggleActive"]', function() { + pluginsList.on('click', 'button[data-action="toggleActive"]', function () { var pluginEl = $(this).parents('li'); pluginID = pluginEl.attr('data-plugin-id'); var btn = $('#' + pluginID + ' [data-action="toggleActive"]'); - socket.emit('admin.plugins.toggleActive', pluginID, function(err, status) { + socket.emit('admin.plugins.toggleActive', pluginID, function (err, status) { if (err) { return app.alertError(err); } @@ -37,8 +37,8 @@ define('admin/extend/plugins', function() { message: status.active ? 'Please restart your NodeBB to fully activate this plugin' : 'Plugin successfully deactivated', type: status.active ? 'warning' : 'success', timeout: 5000, - clickfn: function() { - require(['admin/modules/instance'], function(instance) { + clickfn: function () { + require(['admin/modules/instance'], function (instance) { instance.restart(); }); } @@ -46,7 +46,7 @@ define('admin/extend/plugins', function() { }); }); - pluginsList.on('click', 'button[data-action="toggleInstall"]', function() { + pluginsList.on('click', 'button[data-action="toggleInstall"]', function () { var btn = $(this); btn.attr('disabled', true); pluginID = $(this).parents('li').attr('data-plugin-id'); @@ -55,9 +55,9 @@ define('admin/extend/plugins', function() { return Plugins.toggleInstall(pluginID, $(this).parents('li').attr('data-version')); } - Plugins.suggest(pluginID, function(err, payload) { + Plugins.suggest(pluginID, function (err, payload) { if (err) { - bootbox.confirm('

NodeBB could not reach the package manager, proceed with installation of latest version?

Server returned (' + err.status + '): ' + err.responseText + '
', function(confirm) { + bootbox.confirm('

NodeBB could not reach the package manager, proceed with installation of latest version?

Server returned (' + err.status + '): ' + err.responseText + '
', function (confirm) { if (confirm) { Plugins.toggleInstall(pluginID, 'latest'); } else { @@ -67,11 +67,11 @@ define('admin/extend/plugins', function() { return; } - require(['semver'], function(semver) { + require(['semver'], function (semver) { if (payload.version !== 'latest') { Plugins.toggleInstall(pluginID, payload.version); } else if (payload.version === 'latest') { - confirmInstall(pluginID, function(confirm) { + confirmInstall(pluginID, function (confirm) { if (confirm) { Plugins.toggleInstall(pluginID, 'latest'); } else { @@ -85,21 +85,21 @@ define('admin/extend/plugins', function() { }); }); - pluginsList.on('click', 'button[data-action="upgrade"]', function() { + pluginsList.on('click', 'button[data-action="upgrade"]', function () { var btn = $(this); var parent = btn.parents('li'); pluginID = parent.attr('data-plugin-id'); - Plugins.suggest(pluginID, function(err, payload) { + Plugins.suggest(pluginID, function (err, payload) { if (err) { return bootbox.alert('

NodeBB could not reach the package manager, an upgrade is not suggested at this time.

'); } - require(['semver'], function(semver) { + require(['semver'], function (semver) { if (payload.version !== 'latest' && semver.gt(payload.version, parent.find('.currentVersion').text())) { upgrade(pluginID, btn, payload.version); } else if (payload.version === 'latest') { - confirmInstall(pluginID, function() { + confirmInstall(pluginID, function () { upgrade(pluginID, btn, payload.version); }); } else { @@ -109,22 +109,22 @@ define('admin/extend/plugins', function() { }); }); - $('#plugin-search').on('input propertychange', function() { + $('#plugin-search').on('input propertychange', function () { var term = $(this).val(); - $('.plugins li').each(function() { + $('.plugins li').each(function () { var pluginId = $(this).attr('data-plugin-id'); $(this).toggleClass('hide', pluginId && pluginId.indexOf(term) === -1); }); }); - $('#plugin-order').on('click', function() { + $('#plugin-order').on('click', function () { $('#order-active-plugins-modal').modal('show'); - socket.emit('admin.plugins.getActive', function(err, activePlugins) { + socket.emit('admin.plugins.getActive', function (err, activePlugins) { if (err) { return app.alertError(err); } var html = ''; - activePlugins.forEach(function(plugin) { + activePlugins.forEach(function (plugin) { html += '
  • ' + plugin + '
  • '; }); if (!activePlugins.length) { @@ -134,14 +134,14 @@ define('admin/extend/plugins', function() { }); }); - $('#save-plugin-order').on('click', function() { + $('#save-plugin-order').on('click', function () { var plugins = $('#order-active-plugins-modal .plugin-list').children(); var data = []; - plugins.each(function(index, el) { + plugins.each(function (index, el) { data.push({name: $(el).text(), order: index}); }); - socket.emit('admin.plugins.orderActivePlugins', data, function(err) { + socket.emit('admin.plugins.orderActivePlugins', data, function (err) { if (err) { return app.alertError(err.message); } @@ -158,7 +158,7 @@ define('admin/extend/plugins', function() { '

    No Compatibility Infomation Found

    This plugin did not specify a specific version for installation given your NodeBB version. Full compatibility cannot be guaranteed, and may cause your NodeBB to no longer start properly.

    ' + '

    In the event that NodeBB cannot boot properly:

    ' + '
    $ ./nodebb reset plugin="' + pluginID + '"
    ' + - '

    Continue installation of latest version of this plugin?

    ', function(confirm) { + '

    Continue installation of latest version of this plugin?

    ', function (confirm) { callback(confirm); }); } @@ -168,7 +168,7 @@ define('admin/extend/plugins', function() { socket.emit('admin.plugins.upgrade', { id: pluginID, version: version - }, function(err, isActive) { + }, function (err, isActive) { if (err) { return app.alertError(err.message); } @@ -183,8 +183,8 @@ define('admin/extend/plugins', function() { message: 'Please reload your NodeBB to fully upgrade this plugin', type: 'warning', timeout: 5000, - clickfn: function() { - require(['admin/modules/instance'], function(instance) { + clickfn: function () { + require(['admin/modules/instance'], function (instance) { instance.reload(); }); } @@ -193,7 +193,7 @@ define('admin/extend/plugins', function() { }); } - Plugins.toggleInstall = function(pluginID, version, callback) { + Plugins.toggleInstall = function (pluginID, version, callback) { var btn = $('li[data-plugin-id="' + pluginID + '"] button[data-action="toggleInstall"]'); var activateBtn = btn.siblings('[data-action="toggleActive"]'); btn.find('i').attr('class', 'fa fa-refresh fa-spin'); @@ -201,7 +201,7 @@ define('admin/extend/plugins', function() { socket.emit('admin.plugins.toggleInstall', { id: pluginID, version: version - }, function(err, pluginData) { + }, function (err, pluginData) { if (err) { btn.removeAttr('disabled'); return app.alertError(err.message); @@ -223,7 +223,7 @@ define('admin/extend/plugins', function() { }); }; - Plugins.suggest = function(pluginId, callback) { + Plugins.suggest = function (pluginId, callback) { var nbbVersion = app.config.version.match(/^\d\.\d\.\d/); $.ajax((app.config.registry || 'https://packages.nodebb.org') + '/api/v1/suggest', { type: 'GET', @@ -232,13 +232,13 @@ define('admin/extend/plugins', function() { version: nbbVersion[0] }, dataType: 'json' - }).done(function(payload) { + }).done(function (payload) { callback(undefined, payload); }).fail(callback); }; function populateUpgradeablePlugins() { - $('#installed ul li').each(function() { + $('#installed ul li').each(function () { if ($(this).children('[data-action="upgrade"]').length) { $('#upgrade ul').append($(this).clone(true)); } @@ -246,7 +246,7 @@ define('admin/extend/plugins', function() { } function populateActivePlugins() { - $('#installed ul li').each(function() { + $('#installed ul li').each(function () { if ($(this).hasClass('active')) { $('#active ul').append($(this).clone(true)); } else { diff --git a/public/src/admin/extend/rewards.js b/public/src/admin/extend/rewards.js index dd30a5cf00..939bdbb20d 100644 --- a/public/src/admin/extend/rewards.js +++ b/public/src/admin/extend/rewards.js @@ -1,7 +1,7 @@ "use strict"; /* global define, app, ajaxify, socket, templates, bootbox */ -define('admin/extend/rewards', function() { +define('admin/extend/rewards', function () { var rewards = {}; @@ -10,25 +10,25 @@ define('admin/extend/rewards', function() { conditions, conditionals; - rewards.init = function() { + rewards.init = function () { available = ajaxify.data.rewards; active = ajaxify.data.active; conditions = ajaxify.data.conditions; conditionals = ajaxify.data.conditionals; - $('[data-selected]').each(function() { + $('[data-selected]').each(function () { select($(this)); }); $('#active') - .on('change', '[data-selected]', function() { + .on('change', '[data-selected]', function () { update($(this)); }) - .on('click', '.delete', function() { + .on('click', '.delete', function () { var parent = $(this).parents('[data-id]'), id = parent.attr('data-id'); - socket.emit('admin.rewards.delete', {id: id}, function(err) { + socket.emit('admin.rewards.delete', {id: id}, function (err) { if (err) { app.alertError(err.message); } else { @@ -39,7 +39,7 @@ define('admin/extend/rewards', function() { parent.remove(); return false; }) - .on('click', '.toggle', function() { + .on('click', '.toggle', function () { var btn = $(this), disabled = btn.hasClass('btn-success'), id = $(this).parents('[data-id]').attr('data-id'); @@ -93,12 +93,12 @@ define('admin/extend/rewards', function() { return app.alertError('Illegal reward - no inputs found! ' + el.attr('data-selected')); } - inputs.forEach(function(input) { + inputs.forEach(function (input) { html += '