diff --git a/package.json b/package.json index d6d4dc3e14..54b85b380a 100644 --- a/package.json +++ b/package.json @@ -40,13 +40,13 @@ "nconf": "~0.7.1", "nodebb-plugin-dbsearch": "^0.1.0", "nodebb-plugin-emoji-extended": "^0.4.1-4", - "nodebb-plugin-markdown": "^0.8.0", + "nodebb-plugin-markdown": "^1.0.0", "nodebb-plugin-mentions": "^0.9.0", "nodebb-plugin-soundpack-default": "~0.1.1", "nodebb-plugin-spam-be-gone": "^0.4.0", - "nodebb-theme-lavender": "^1.0.4", - "nodebb-theme-vanilla": "^1.0.5", - "nodebb-widget-essentials": "~0.2.11", + "nodebb-theme-lavender": "^1.0.6", + "nodebb-theme-vanilla": "^1.0.14", + "nodebb-widget-essentials": "~0.2.12", "nodebb-rewards-essentials": "^0.0.1", "npm": "^2.1.4", "passport": "^0.2.1", diff --git a/public/language/ar/category.json b/public/language/ar/category.json index 27dad61d69..b4f3a40f7a 100644 --- a/public/language/ar/category.json +++ b/public/language/ar/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "موضوع جديد", + "guest-login-post": "Log in to post", "no_topics": "لا توجد مواضيع في هذه الفئةلم لا تحاول إنشاء موضوع؟
", "browsing": "تصفح", "no_replies": "لم يرد أحد", diff --git a/public/language/ar/topic.json b/public/language/ar/topic.json index 256a6d2b0c..c63f32e61c 100644 --- a/public/language/ar/topic.json +++ b/public/language/ar/topic.json @@ -12,6 +12,7 @@ "notify_me": "تلق تنبيهات بالردود الجديدة في هذا الموضوع", "quote": "اقتبس", "reply": "رد", + "guest-login-reply": "Log in to reply", "edit": "تعديل", "delete": "حذف", "purge": "تطهير", diff --git a/public/language/bn/category.json b/public/language/bn/category.json index 82626ebe86..b706e85080 100644 --- a/public/language/bn/category.json +++ b/public/language/bn/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "নতুন টপিক", + "guest-login-post": "Log in to post", "no_topics": "এই বিভাগে কোন টপিক নেই!
আপনি চাইলে একটি পোষ্ট করতে পারেন।", "browsing": "ব্রাউজিং", "no_replies": "কোন রিপ্লাই নেই", diff --git a/public/language/bn/topic.json b/public/language/bn/topic.json index e7a0b35aa0..3b0835cf2e 100644 --- a/public/language/bn/topic.json +++ b/public/language/bn/topic.json @@ -12,6 +12,7 @@ "notify_me": "এই টপিকে নতুন উত্তর আসলে জানুন", "quote": "উদ্ধৃতি", "reply": "উত্তর", + "guest-login-reply": "Log in to reply", "edit": "সম্পাদণা", "delete": "মুছে ফেলুন", "purge": "পার্জ", diff --git a/public/language/cs/category.json b/public/language/cs/category.json index 92d0e10df2..0d598e974a 100644 --- a/public/language/cs/category.json +++ b/public/language/cs/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Nové téma", + "guest-login-post": "Log in to post", "no_topics": "V této kategorii zatím nejsou žádné příspěvky.
Můžeš být první!", "browsing": "prohlíží", "no_replies": "Nikdo ještě neodpověděl", diff --git a/public/language/cs/topic.json b/public/language/cs/topic.json index 9b18a9ba03..4f20b6e6db 100644 --- a/public/language/cs/topic.json +++ b/public/language/cs/topic.json @@ -12,6 +12,7 @@ "notify_me": "Sledovat toto téma", "quote": "Citovat", "reply": "Odpovědět", + "guest-login-reply": "Log in to reply", "edit": "Upravit", "delete": "Smazat", "purge": "Purge", diff --git a/public/language/de/category.json b/public/language/de/category.json index e3d45d3af8..8635b5738c 100644 --- a/public/language/de/category.json +++ b/public/language/de/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Neues Thema", + "guest-login-post": "Log in to post", "no_topics": "Es gibt noch keine Themen in dieser Kategorie.
Warum beginnst du nicht eins?", "browsing": "Aktiv", "no_replies": "Niemand hat geantwortet", diff --git a/public/language/de/topic.json b/public/language/de/topic.json index e2e47d83c1..1ef0d0741b 100644 --- a/public/language/de/topic.json +++ b/public/language/de/topic.json @@ -12,6 +12,7 @@ "notify_me": "Erhalte eine Benachrichtigung bei neuen Antworten zu diesem Thema.", "quote": "zitieren", "reply": "antworten", + "guest-login-reply": "Log in to reply", "edit": "bearbeiten", "delete": "löschen", "purge": "bereinigen", diff --git a/public/language/el/category.json b/public/language/el/category.json index 34cf7d16c3..73f3b51724 100644 --- a/public/language/el/category.json +++ b/public/language/el/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Νέο Θέμα", + "guest-login-post": "Log in to post", "no_topics": "Δεν υπάρχουν θέματα σε αυτή την κατηγορία.
Γιατί δεν δοκιμάζεις να δημοσιεύσεις ένα εσύ;", "browsing": "περιηγούνται", "no_replies": "Κανείς δεν έχει απαντήσει", diff --git a/public/language/el/topic.json b/public/language/el/topic.json index c8df981fa3..5e93f49db9 100644 --- a/public/language/el/topic.json +++ b/public/language/el/topic.json @@ -12,6 +12,7 @@ "notify_me": "Να ειδοποιούμαι για νέες απαντήσεις σε αυτό το θέμα", "quote": "Παράθεση", "reply": "Απάντηση", + "guest-login-reply": "Log in to reply", "edit": "Επεξεργασία", "delete": "Διαγραφή", "purge": "Εκκαθάριση", diff --git a/public/language/en@pirate/category.json b/public/language/en@pirate/category.json index 74b946d216..c2c0b64832 100644 --- a/public/language/en@pirate/category.json +++ b/public/language/en@pirate/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "New Topic", + "guest-login-post": "Log in to post", "no_topics": "Thar be no topics in 'tis category.
Why don't ye give a go' postin' one?", "browsing": "browsin'", "no_replies": "No one has replied to ye message", diff --git a/public/language/en@pirate/topic.json b/public/language/en@pirate/topic.json index eb06a391c8..88cd2e2328 100644 --- a/public/language/en@pirate/topic.json +++ b/public/language/en@pirate/topic.json @@ -12,6 +12,7 @@ "notify_me": "Be notified of new replies in this topic", "quote": "Quote", "reply": "Reply", + "guest-login-reply": "Log in to reply", "edit": "Edit", "delete": "Delete", "purge": "Purge", diff --git a/public/language/en_GB/category.json b/public/language/en_GB/category.json index 22d72c3064..3e131894bd 100644 --- a/public/language/en_GB/category.json +++ b/public/language/en_GB/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "New Topic", + "guest-login-post": "Log in to post", "no_topics": "There are no topics in this category.
Why don't you try posting one?", "browsing": "browsing", diff --git a/public/language/en_GB/topic.json b/public/language/en_GB/topic.json index 5fc5863225..1bfdbb25ea 100644 --- a/public/language/en_GB/topic.json +++ b/public/language/en_GB/topic.json @@ -15,6 +15,7 @@ "notify_me": "Be notified of new replies in this topic", "quote": "Quote", "reply": "Reply", + "guest-login-reply": "Log in to reply", "edit": "Edit", "delete": "Delete", "purge": "Purge", diff --git a/public/language/en_US/category.json b/public/language/en_US/category.json index 93272e1a06..8245a2c365 100644 --- a/public/language/en_US/category.json +++ b/public/language/en_US/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "New Topic", + "guest-login-post": "Log in to post", "no_topics": "There are no topics in this category.
Why don't you try posting one?", "browsing": "browsing", "no_replies": "No one has replied", diff --git a/public/language/en_US/topic.json b/public/language/en_US/topic.json index 6a2e3d93c7..750ce2694a 100644 --- a/public/language/en_US/topic.json +++ b/public/language/en_US/topic.json @@ -12,6 +12,7 @@ "notify_me": "Be notified of new replies in this topic", "quote": "Quote", "reply": "Reply", + "guest-login-reply": "Log in to reply", "edit": "Edit", "delete": "Delete", "purge": "Purge", diff --git a/public/language/es/category.json b/public/language/es/category.json index 2bc1d330df..ec2fdadcdc 100644 --- a/public/language/es/category.json +++ b/public/language/es/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Nuevo tema", + "guest-login-post": "Log in to post", "no_topics": "No hay temas en esta categoría.
¿Por que no te animas y publicas uno?", "browsing": "viendo ahora", "no_replies": "Nadie ha respondido aún", diff --git a/public/language/es/topic.json b/public/language/es/topic.json index f1a3f4221c..576220f99d 100644 --- a/public/language/es/topic.json +++ b/public/language/es/topic.json @@ -12,6 +12,7 @@ "notify_me": "Serás notificado cuando haya nuevas respuestas en este tema", "quote": "Citar", "reply": "Responder", + "guest-login-reply": "Log in to reply", "edit": "Editar", "delete": "Borrar", "purge": "Purgar", diff --git a/public/language/et/category.json b/public/language/et/category.json index 1c825ed2fe..d3c0f6e6bd 100644 --- a/public/language/et/category.json +++ b/public/language/et/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Uus teema", + "guest-login-post": "Log in to post", "no_topics": "Kahjuks ei leidu siin kategoorias ühtegi teemat.
Soovid postitada?", "browsing": "vaatab", "no_replies": "Keegi pole vastanud", diff --git a/public/language/et/topic.json b/public/language/et/topic.json index 2fdc0d8bf0..8992993fb9 100644 --- a/public/language/et/topic.json +++ b/public/language/et/topic.json @@ -12,6 +12,7 @@ "notify_me": "Saa teateid uutest postitustest selles teemas", "quote": "Tsiteeri", "reply": "Vasta", + "guest-login-reply": "Log in to reply", "edit": "Muuda", "delete": "Kustuta", "purge": "Kustuta", diff --git a/public/language/fa_IR/category.json b/public/language/fa_IR/category.json index c1c61a1a9f..b5b2749c70 100644 --- a/public/language/fa_IR/category.json +++ b/public/language/fa_IR/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "جستار تازه", + "guest-login-post": "Log in to post", "no_topics": "هیچ جستاری در این دسته نیست.
چرا شما یکی نفرستید؟", "browsing": "بیننده‌ها", "no_replies": "هیچ کسی پاسخ نداده است.", diff --git a/public/language/fa_IR/topic.json b/public/language/fa_IR/topic.json index 793af1e7cb..f523bee5b6 100644 --- a/public/language/fa_IR/topic.json +++ b/public/language/fa_IR/topic.json @@ -12,6 +12,7 @@ "notify_me": "از پاسخ‌های تازه در جستار آگاه شوید", "quote": "نقل قول", "reply": "پاسخ", + "guest-login-reply": "Log in to reply", "edit": "ویرایش", "delete": "Delete", "purge": "پاک کردن", diff --git a/public/language/fi/category.json b/public/language/fi/category.json index f3ae42f69f..3b098b3cfe 100644 --- a/public/language/fi/category.json +++ b/public/language/fi/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Uusi aihe", + "guest-login-post": "Log in to post", "no_topics": "Tällä aihealueella ei ole yhtään aihetta.
Miksi et aloittaisi uutta?", "browsing": "selaamassa", "no_replies": "Kukaan ei ole vastannut", diff --git a/public/language/fi/topic.json b/public/language/fi/topic.json index 194d414e56..eef05da8ee 100644 --- a/public/language/fi/topic.json +++ b/public/language/fi/topic.json @@ -12,6 +12,7 @@ "notify_me": "Ilmoita, kun tähän keskusteluun tulee uusia viestejä", "quote": "Lainaa", "reply": "Vastaa", + "guest-login-reply": "Log in to reply", "edit": "Muokkaa", "delete": "Poista", "purge": "Purge", diff --git a/public/language/fr/category.json b/public/language/fr/category.json index 63450150f5..758bd68885 100644 --- a/public/language/fr/category.json +++ b/public/language/fr/category.json @@ -1,5 +1,6 @@ { - "new_topic_button": "Nouveau Sujet", + "new_topic_button": "Nouveau sujet", + "guest-login-post": "Log in to post", "no_topics": "Il n'y a aucun sujet dans cette catégorie.
Pourquoi ne pas en créer un ?", "browsing": "parcouru par", "no_replies": "Personne n'a répondu", diff --git a/public/language/fr/topic.json b/public/language/fr/topic.json index 135efce878..b9368f16eb 100644 --- a/public/language/fr/topic.json +++ b/public/language/fr/topic.json @@ -12,7 +12,8 @@ "notify_me": "Être notifié des réponses dans ce sujet", "quote": "Citer", "reply": "Répondre", - "edit": "Editer", + "guest-login-reply": "Log in to reply", + "edit": "Éditer", "delete": "Supprimer", "purge": "Supprimer définitivement", "restore": "Restaurer", @@ -39,7 +40,7 @@ "share_this_post": "Partager ce message", "thread_tools.title": "Outils pour sujets", "thread_tools.markAsUnreadForAll": "Marquer comme non lu", - "thread_tools.pin": "Epingler le sujet", + "thread_tools.pin": "Épingler le sujet", "thread_tools.unpin": "Désépingler le sujet", "thread_tools.lock": "Verrouiller le sujet", "thread_tools.unlock": "Déverouiller le sujet", @@ -60,9 +61,9 @@ "disabled_categories_note": "Les catégories désactivées sont grisées", "confirm_move": "Déplacer", "confirm_fork": "Scinder", - "favourite": "Favoris", + "favourite": "Favori", "favourites": "Favoris", - "favourites.has_no_favourites": "Vous n'avez aucun favoris, mettez des messages en favoris pour les voir ici !", + "favourites.has_no_favourites": "Vous n'avez aucun favori, mettez des messages en favoris pour les voir ici !", "loading_more_posts": "Charger plus de messages", "move_topic": "Déplacer le sujet", "move_topics": "Déplacer des sujets", diff --git a/public/language/he/category.json b/public/language/he/category.json index 86292076b6..66e87dd4e3 100644 --- a/public/language/he/category.json +++ b/public/language/he/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "נושא חדש", + "guest-login-post": "Log in to post", "no_topics": "קטגוריה זו ריקה מנושאים.
למה שלא תנסה להוסיף נושא חדש?", "browsing": "צופים בנושא זה כעת", "no_replies": "אין תגובות", diff --git a/public/language/he/topic.json b/public/language/he/topic.json index e16ebc08cf..3ff27d0a8a 100644 --- a/public/language/he/topic.json +++ b/public/language/he/topic.json @@ -12,6 +12,7 @@ "notify_me": "קבל התראה כאשר יש תגובות חדשות בנושא זה", "quote": "ציטוט", "reply": "תגובה", + "guest-login-reply": "Log in to reply", "edit": "עריכה", "delete": "מחק", "purge": "מחק הכל", diff --git a/public/language/hu/category.json b/public/language/hu/category.json index 6ea4699a4c..b36e9fc37a 100644 --- a/public/language/hu/category.json +++ b/public/language/hu/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Új témakör", + "guest-login-post": "Log in to post", "no_topics": "Nincs nyitva egy téma sem ebben a kategóriában.Hozzunk létre egyet.", "browsing": "böngészés", "no_replies": "Nem érkezett válasz", diff --git a/public/language/hu/topic.json b/public/language/hu/topic.json index 0de62def8d..30bf3ab2f8 100644 --- a/public/language/hu/topic.json +++ b/public/language/hu/topic.json @@ -12,6 +12,7 @@ "notify_me": "Értesítést kérek az új hozzászólásokról ebben a topikban", "quote": "Idéz", "reply": "Válasz", + "guest-login-reply": "Log in to reply", "edit": "Szerkeszt", "delete": "Töröl", "purge": "Purge", diff --git a/public/language/id/category.json b/public/language/id/category.json index 89be56e6ff..7b0ff0f6eb 100644 --- a/public/language/id/category.json +++ b/public/language/id/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Topik Baru", + "guest-login-post": "Log in to post", "no_topics": "Tidak ada topik dikategori ini
Mengapa anda tidak mencoba membuat yang baru?", "browsing": "penjelajahan", "no_replies": "Belum ada orang yang menjawab", diff --git a/public/language/id/topic.json b/public/language/id/topic.json index cd8f9052b2..c47b9612be 100644 --- a/public/language/id/topic.json +++ b/public/language/id/topic.json @@ -12,6 +12,7 @@ "notify_me": "Beritahukan balasan baru untuk topik ini", "quote": "Kutip", "reply": "Balas", + "guest-login-reply": "Log in to reply", "edit": "Ubah", "delete": "Hapus", "purge": "Musnahkan", diff --git a/public/language/it/category.json b/public/language/it/category.json index b88bdd54e0..3e018bf12f 100644 --- a/public/language/it/category.json +++ b/public/language/it/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Nuova Discussione", + "guest-login-post": "Log in to post", "no_topics": "Non ci sono discussioni in questa categoria.
Perché non ne inizi una?", "browsing": "visualizzando", "no_replies": "Nessuno ha risposto", diff --git a/public/language/it/topic.json b/public/language/it/topic.json index ba1beedc77..1cc385c23f 100644 --- a/public/language/it/topic.json +++ b/public/language/it/topic.json @@ -12,6 +12,7 @@ "notify_me": "Ricevi notifiche di nuove risposte in questa discussione", "quote": "Cita", "reply": "Rispondi", + "guest-login-reply": "Log in to reply", "edit": "Modifica", "delete": "Cancella", "purge": "Svuota", diff --git a/public/language/ja/category.json b/public/language/ja/category.json index c5ffc01c13..6fbd386dac 100644 --- a/public/language/ja/category.json +++ b/public/language/ja/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "新規スレッド", + "guest-login-post": "Log in to post", "no_topics": "まだスレッドはありません.
一番目のスレッドを書いてみないか?", "browsing": "閲覧中", "no_replies": "返事はまだありません", diff --git a/public/language/ja/topic.json b/public/language/ja/topic.json index fd6c7d911b..680b10b702 100644 --- a/public/language/ja/topic.json +++ b/public/language/ja/topic.json @@ -12,6 +12,7 @@ "notify_me": "このスレッドに新しいポストが投稿された際に通知する", "quote": "引用", "reply": "返答", + "guest-login-reply": "Log in to reply", "edit": "編集", "delete": "削除", "purge": "Purge", diff --git a/public/language/ko/category.json b/public/language/ko/category.json index 1ceaddb7ac..3518e3a3d1 100644 --- a/public/language/ko/category.json +++ b/public/language/ko/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "새 주제 생성", + "guest-login-post": "Log in to post", "no_topics": "이 카테고리에는 생성된 주제가 없습니다.
먼저 주제를 생성해 보세요.", "browsing": "이 주제를 읽고 있는 사용자", "no_replies": "답글이 없습니다.", diff --git a/public/language/ko/topic.json b/public/language/ko/topic.json index ed806c5882..56714d7a0a 100644 --- a/public/language/ko/topic.json +++ b/public/language/ko/topic.json @@ -12,6 +12,7 @@ "notify_me": "이 주제의 새 답글 알리기", "quote": "인용", "reply": "답글", + "guest-login-reply": "Log in to reply", "edit": "수정", "delete": "삭제", "purge": "폐기", diff --git a/public/language/lt/category.json b/public/language/lt/category.json index 1c9dd0899b..149a102553 100644 --- a/public/language/lt/category.json +++ b/public/language/lt/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Nauja tema", + "guest-login-post": "Log in to post", "no_topics": "Šioje kategorijoje temų nėra.
Kodėl gi jums nesukūrus naujos?", "browsing": "naršo", "no_replies": "Niekas dar neatsakė", diff --git a/public/language/lt/topic.json b/public/language/lt/topic.json index 2df888e5b7..5138bc2766 100644 --- a/public/language/lt/topic.json +++ b/public/language/lt/topic.json @@ -12,6 +12,7 @@ "notify_me": "Gauti pranešimus apie naujus atsakymus šioje temoje", "quote": "Cituoti", "reply": "Atsakyti", + "guest-login-reply": "Log in to reply", "edit": "Redaguoti", "delete": "Ištrinti", "purge": "Išvalyti", diff --git a/public/language/ms/category.json b/public/language/ms/category.json index db2dc8d039..cc483ad763 100644 --- a/public/language/ms/category.json +++ b/public/language/ms/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "\nTopik Baru", + "guest-login-post": "Log in to post", "no_topics": "Tiada topik dalam kategori ini.
Cuba menghantar topik yang baru?", "browsing": "melihat", "no_replies": "Tiada jawapan", diff --git a/public/language/ms/topic.json b/public/language/ms/topic.json index 04be14258d..e173c79263 100644 --- a/public/language/ms/topic.json +++ b/public/language/ms/topic.json @@ -12,6 +12,7 @@ "notify_me": "Kekal dimaklumkan berkenaan respon dalam topik ini", "quote": "Petikan", "reply": "Balas", + "guest-login-reply": "Log in to reply", "edit": "Edit", "delete": "Padamkan", "purge": "Purge", diff --git a/public/language/nb/category.json b/public/language/nb/category.json index 7de0fb5cde..75f38d0df0 100644 --- a/public/language/nb/category.json +++ b/public/language/nb/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Nytt emne", + "guest-login-post": "Log in to post", "no_topics": "Det er ingen emner i denne kategorien
Hvorfor ikke lage ett?", "browsing": "leser", "no_replies": "Ingen har svart", diff --git a/public/language/nb/topic.json b/public/language/nb/topic.json index 49096d9f6f..8a599b7942 100644 --- a/public/language/nb/topic.json +++ b/public/language/nb/topic.json @@ -12,6 +12,7 @@ "notify_me": "Bli varslet om nye svar i dette emnet", "quote": "Siter", "reply": "Svar", + "guest-login-reply": "Log in to reply", "edit": "Endre", "delete": "Slett", "purge": "Tøm", diff --git a/public/language/nl/category.json b/public/language/nl/category.json index 45dbbf4d4d..bee6530395 100644 --- a/public/language/nl/category.json +++ b/public/language/nl/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Nieuw onderwerp", + "guest-login-post": "Log in to post", "no_topics": "Er zijn geen onderwerpen in deze categorie.
Waarom maak je er niet een aan?", "browsing": "verkennen", "no_replies": "Niemand heeft gereageerd", diff --git a/public/language/nl/topic.json b/public/language/nl/topic.json index 8ab45e30d3..5f9250bea4 100644 --- a/public/language/nl/topic.json +++ b/public/language/nl/topic.json @@ -12,6 +12,7 @@ "notify_me": "Krijg notificaties van nieuwe reacties op dit onderwerp", "quote": "Citeren", "reply": "Reageren", + "guest-login-reply": "Log in to reply", "edit": "Aanpassen", "delete": "Verwijderen", "purge": "weggooien", diff --git a/public/language/pl/category.json b/public/language/pl/category.json index fe8b77fe54..09164c69bb 100644 --- a/public/language/pl/category.json +++ b/public/language/pl/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Nowy wątek", + "guest-login-post": "Log in to post", "no_topics": "W tej kategorii nie ma jeszcze żadnych wątków.
Dlaczego ty nie utworzysz jakiegoś?", "browsing": "przegląda", "no_replies": "Nikt jeszcze nie odpowiedział", diff --git a/public/language/pl/topic.json b/public/language/pl/topic.json index 354da37ef3..e9941d4abf 100644 --- a/public/language/pl/topic.json +++ b/public/language/pl/topic.json @@ -12,6 +12,7 @@ "notify_me": "Powiadamiaj mnie o nowych odpowiedziach w tym wątku", "quote": "Cytuj", "reply": "Odpowiedz", + "guest-login-reply": "Log in to reply", "edit": "Edytuj", "delete": "Usuń", "purge": "Wymaż", diff --git a/public/language/pt_BR/category.json b/public/language/pt_BR/category.json index 42b2b4017f..a781984e16 100644 --- a/public/language/pt_BR/category.json +++ b/public/language/pt_BR/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Novo Tópico", + "guest-login-post": "Log in to post", "no_topics": "Não tem nenhum tópico nesta categoria.
Por que você não tenta postar o algum?", "browsing": "navegando", "no_replies": "Ninguém respondeu", diff --git a/public/language/pt_BR/topic.json b/public/language/pt_BR/topic.json index df49f8cb20..a99468a79f 100644 --- a/public/language/pt_BR/topic.json +++ b/public/language/pt_BR/topic.json @@ -12,6 +12,7 @@ "notify_me": "Seja notificado de novas respostas nesse tópico", "quote": "Citar", "reply": "Responder", + "guest-login-reply": "Log in to reply", "edit": "Editar", "delete": "Deletar", "purge": "Expurgar", diff --git a/public/language/ro/category.json b/public/language/ro/category.json index 7ff3d49fe6..733f5de0d7 100644 --- a/public/language/ro/category.json +++ b/public/language/ro/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Subiect Nou", + "guest-login-post": "Log in to post", "no_topics": "Nu există nici un subiect de discuție în această categorie.
De ce nu încerci să postezi tu unul?", "browsing": "navighează", "no_replies": "Nu a răspuns nimeni", diff --git a/public/language/ro/topic.json b/public/language/ro/topic.json index 49803e1823..590dfed6d5 100644 --- a/public/language/ro/topic.json +++ b/public/language/ro/topic.json @@ -12,6 +12,7 @@ "notify_me": "Notică-mă de noi răspunsuri în acest subiect", "quote": "Citează", "reply": "Răspunde", + "guest-login-reply": "Log in to reply", "edit": "Editează", "delete": "Șterge", "purge": "Curăță", diff --git a/public/language/ru/category.json b/public/language/ru/category.json index f80eccd5ba..8a97af5a0d 100644 --- a/public/language/ru/category.json +++ b/public/language/ru/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Создать тему", + "guest-login-post": "Log in to post", "no_topics": "В этой категории еще нет тем.
Почему бы вам не создать первую?", "browsing": "просматривают", "no_replies": "Нет ответов", diff --git a/public/language/ru/topic.json b/public/language/ru/topic.json index 644b66d9ae..ec980e67a7 100644 --- a/public/language/ru/topic.json +++ b/public/language/ru/topic.json @@ -7,11 +7,12 @@ "post_is_deleted": "Этот пост удален!", "profile": "Профиль", "posted_by": "Создано %1", - "posted_by_guest": "Опубликовано Гостем", + "posted_by_guest": "Опубликовано гостем", "chat": "Чат", "notify_me": "Сообщать мне об ответах в этой теме", "quote": "Цитировать", "reply": "Ответить", + "guest-login-reply": "Log in to reply", "edit": "Редактировать", "delete": "Удалить", "purge": "Очистить", @@ -39,60 +40,60 @@ "share_this_post": "Поделиться этим Постом", "thread_tools.title": "Опции темы", "thread_tools.markAsUnreadForAll": "Отметить как непрочитанные", - "thread_tools.pin": "Прикрепить Тему", - "thread_tools.unpin": "Открепить Тему", - "thread_tools.lock": "Закрыть Тему", - "thread_tools.unlock": "Открыть Тему", - "thread_tools.move": "Переместить Тему", - "thread_tools.move_all": "Переместить Все", - "thread_tools.fork": "Ответвить Тему", - "thread_tools.delete": "Удалить Тему", + "thread_tools.pin": "Прикрепить тему", + "thread_tools.unpin": "Открепить тему", + "thread_tools.lock": "Закрыть тему", + "thread_tools.unlock": "Открыть тему", + "thread_tools.move": "Переместить тему", + "thread_tools.move_all": "Переместить все", + "thread_tools.fork": "Ответвить тему", + "thread_tools.delete": "Удалить тему", "thread_tools.delete_confirm": "Вы уверены, что хотите удалить тему?", - "thread_tools.restore": "Восстановить Тему", + "thread_tools.restore": "Восстановить тему", "thread_tools.restore_confirm": "Вы уверены, что хотите восстановить тему?", - "thread_tools.purge": "Очистить Тему", + "thread_tools.purge": "Очистить тему", "thread_tools.purge_confirm": "Вы уверены, что хотите очистить эту тему?", "topic_move_success": "Эта тема успешно перемещена в %1", "post_delete_confirm": "Вы уверены, что хотите удалить этот пост?", "post_restore_confirm": "Вы уверены, что хотите восстановить этот пост?", "post_purge_confirm": "Вы уверены, что хотите очистить эту запись?", - "load_categories": "Загружаем Категории", - "disabled_categories_note": "Отключенные категории затемненны", + "load_categories": "Загружаем категории", + "disabled_categories_note": "Отключенные категории затемнены", "confirm_move": "Перенести", "confirm_fork": "Ответвление", "favourite": "Избранное", "favourites": "Избранные", - "favourites.has_no_favourites": "У вас нет избранного, добавьте несколько сообщений в избранное чтобы увидеть их здесь!", + "favourites.has_no_favourites": "У вас нет избранного, добавьте несколько сообщений в избранное, чтобы увидеть их здесь", "loading_more_posts": "Загружаем еще сообщения", "move_topic": "Перенести тему", - "move_topics": "Больше Тем", + "move_topics": "Перенести темы", "move_post": "Перенести сообщение", - "post_moved": "Пост перемещен!", - "fork_topic": "Ответвить Тему", + "post_moved": "Пост перенесен", + "fork_topic": "Ответвить тему", "topic_will_be_moved_to": "Эта тема будет перенесена в категорию", "fork_topic_instruction": "Отметьте сообщения для ответвления", "fork_no_pids": "Сообщения не отмечены!", "fork_success": "Готово! Нажмите для перехода в отделённую тему.", "composer.title_placeholder": "Введите название темы...", - "composer.handle_placeholder": "Name", + "composer.handle_placeholder": "Название", "composer.discard": "Отменить", "composer.submit": "Подтвердить", "composer.replying_to": "Ответ %1", - "composer.new_topic": "Создать Тему", + "composer.new_topic": "Создать тему", "composer.uploading": "загрузка...", "composer.thumb_url_label": "Вставьте URL картинки с иконкой темы.", "composer.thumb_title": "Добавить иконку к этой теме", "composer.thumb_url_placeholder": "http://example.com/thumb.png", "composer.thumb_file_label": "Или загрузите файл", "composer.thumb_remove": "Очистить поля", - "composer.drag_and_drop_images": "Перетащите Изображения Сюда", + "composer.drag_and_drop_images": "Перетащите изображения сюда", "more_users_and_guests": "еще %1 пользователя(ей) и %2 гостя(ей)", "more_users": "еще %1 пользователя(ей)", "more_guests": "еще %1 гостя(ей)", "users_and_others": "%1 и %2 других", "sort_by": "Сортировать", - "oldest_to_newest": "От Старых к Новым", - "newest_to_oldest": "От Новых к Старым", + "oldest_to_newest": "От старых к новым", + "newest_to_oldest": "От новых к старым", "most_votes": "По голосам", - "most_posts": "Most posts" + "most_posts": "По количеству ответов" } \ No newline at end of file diff --git a/public/language/sc/category.json b/public/language/sc/category.json index 35e7f7b522..306f0e2d04 100644 --- a/public/language/sc/category.json +++ b/public/language/sc/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Arresonada Noa", + "guest-login-post": "Log in to post", "no_topics": "Non bi sunt arresonadas in custa creze.
Pro ite non nde pones una?", "browsing": "navighende", "no_replies": "Perunu at rispostu", diff --git a/public/language/sc/topic.json b/public/language/sc/topic.json index e08b8e84ba..c0ce4121ff 100644 --- a/public/language/sc/topic.json +++ b/public/language/sc/topic.json @@ -12,6 +12,7 @@ "notify_me": "Imbia·mi notìficas pro is rispostas noas a custa arresonada", "quote": "Mèntova", "reply": "Risponde", + "guest-login-reply": "Log in to reply", "edit": "Acontza", "delete": "Contzella", "purge": "Purge", diff --git a/public/language/sk/category.json b/public/language/sk/category.json index 9ce9439a2e..62ef9414d6 100644 --- a/public/language/sk/category.json +++ b/public/language/sk/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Nová téma", + "guest-login-post": "Log in to post", "no_topics": "V tejto kategórií zatiaľ nie sú žiadne príspevky.
Môžeš byť prvý!", "browsing": "prehliada", "no_replies": "Nikdo ešte neodpovedal", diff --git a/public/language/sk/topic.json b/public/language/sk/topic.json index 05ee94f28e..007cf0f22a 100644 --- a/public/language/sk/topic.json +++ b/public/language/sk/topic.json @@ -12,6 +12,7 @@ "notify_me": "Sledovať túto tému", "quote": "Citovať", "reply": "Odpovedať", + "guest-login-reply": "Log in to reply", "edit": "Upraviť", "delete": "Zmazať", "purge": "Purge", diff --git a/public/language/sv/category.json b/public/language/sv/category.json index 635f2c0ac4..41b49a95db 100644 --- a/public/language/sv/category.json +++ b/public/language/sv/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Nytt ämne", + "guest-login-post": "Log in to post", "no_topics": "Det finns inga ämnen i denna kategori.
Varför skapar inte du ett ämne?", "browsing": "läser", "no_replies": "Ingen har svarat", diff --git a/public/language/sv/topic.json b/public/language/sv/topic.json index 9d41afee2b..40b81f0ec4 100644 --- a/public/language/sv/topic.json +++ b/public/language/sv/topic.json @@ -12,6 +12,7 @@ "notify_me": "Få notiser om nya svar i detta ämne", "quote": "Citera", "reply": "Svara", + "guest-login-reply": "Log in to reply", "edit": "Ändra", "delete": "Ta bort", "purge": "Rensa", diff --git a/public/language/th/category.json b/public/language/th/category.json index 31246e2a05..387458a0dd 100644 --- a/public/language/th/category.json +++ b/public/language/th/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "กระทู้", + "guest-login-post": "Log in to post", "no_topics": "ยังไม่มีกระทู้ในหมวดนี้
โพสต์กระทู้แรก?", "browsing": "เรียกดู", "no_replies": "ยังไม่มีใครตอบ", diff --git a/public/language/th/topic.json b/public/language/th/topic.json index c7c9f4e944..652ebe5db5 100644 --- a/public/language/th/topic.json +++ b/public/language/th/topic.json @@ -12,6 +12,7 @@ "notify_me": "แจ้งเตือนเมื่อการตอบใหม่ในกระทู้นี้", "quote": "คำอ้างอิง", "reply": "ตอบ", + "guest-login-reply": "Log in to reply", "edit": "แก้ไข", "delete": "ลบ", "purge": "Purge", diff --git a/public/language/tr/category.json b/public/language/tr/category.json index ba1c4f34ef..34ac645f32 100644 --- a/public/language/tr/category.json +++ b/public/language/tr/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Yeni Başlık", + "guest-login-post": "Log in to post", "no_topics": " Bu kategoride hiç konu yok.
Yeni bir konu açmak istemez misiniz?", "browsing": "gözden geçiriliyor", "no_replies": "Kimse yanıtlamadı", diff --git a/public/language/tr/topic.json b/public/language/tr/topic.json index 6cd2424e0f..fa76fb4ee6 100644 --- a/public/language/tr/topic.json +++ b/public/language/tr/topic.json @@ -12,6 +12,7 @@ "notify_me": "Bu konudaki cevaplardan haberdar ol", "quote": "Alıntı", "reply": "Cevap", + "guest-login-reply": "Log in to reply", "edit": "Düzenle", "delete": "Sil", "purge": "Temizle", diff --git a/public/language/vi/category.json b/public/language/vi/category.json index 6d2efb5e1b..e536a54efb 100644 --- a/public/language/vi/category.json +++ b/public/language/vi/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "Chủ đề mới", + "guest-login-post": "Log in to post", "no_topics": "Không có bài viết trong danh mục này.
Hãy đăng một bài viết mới.", "browsing": "đang xem", "no_replies": "Chưa có bình luận nào", diff --git a/public/language/vi/topic.json b/public/language/vi/topic.json index 2c23893104..8c9f8cdfce 100644 --- a/public/language/vi/topic.json +++ b/public/language/vi/topic.json @@ -12,6 +12,7 @@ "notify_me": "Được thông báo khi có trả lời mới trong chủ đề này", "quote": "Trích dẫn", "reply": "Trả lời", + "guest-login-reply": "Log in to reply", "edit": "Chỉnh sửa", "delete": "Xóa", "purge": "Xóa hẳn", diff --git a/public/language/zh_CN/category.json b/public/language/zh_CN/category.json index 933e12e3e1..21ea5d5acf 100644 --- a/public/language/zh_CN/category.json +++ b/public/language/zh_CN/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "新主题", + "guest-login-post": "Log in to post", "no_topics": "此版块还没有任何内容。
赶紧来发帖吧!", "browsing": "正在浏览", "no_replies": "尚无回复", diff --git a/public/language/zh_CN/topic.json b/public/language/zh_CN/topic.json index 0cd68a3250..bd20fbdabc 100644 --- a/public/language/zh_CN/topic.json +++ b/public/language/zh_CN/topic.json @@ -12,6 +12,7 @@ "notify_me": "此主题有新回复时通知我", "quote": "引用", "reply": "回复", + "guest-login-reply": "Log in to reply", "edit": "编辑", "delete": "删除", "purge": "清除", diff --git a/public/language/zh_TW/category.json b/public/language/zh_TW/category.json index cb21821aab..055d4a70d3 100644 --- a/public/language/zh_TW/category.json +++ b/public/language/zh_TW/category.json @@ -1,5 +1,6 @@ { "new_topic_button": "新主題", + "guest-login-post": "Log in to post", "no_topics": "這個版面還沒有任何內容。
趕緊來發文章吧!", "browsing": "正在瀏覽", "no_replies": "還沒有回覆", diff --git a/public/language/zh_TW/topic.json b/public/language/zh_TW/topic.json index 04787766fa..41edd8828f 100644 --- a/public/language/zh_TW/topic.json +++ b/public/language/zh_TW/topic.json @@ -12,6 +12,7 @@ "notify_me": "該主題有新回覆時通知我", "quote": "引用", "reply": "回覆", + "guest-login-reply": "Log in to reply", "edit": "編輯", "delete": "刪除", "purge": "清除", diff --git a/public/less/admin/admin.less b/public/less/admin/admin.less index c304ddd774..1e4a10643d 100644 --- a/public/less/admin/admin.less +++ b/public/less/admin/admin.less @@ -184,15 +184,18 @@ .box-header-font } - #user_dropdown { - padding: 6px; - - img { - width: 30px; - height: 30px; - vertical-align: -88%; - margin-right: 5px; - } + #user_label { + a { + padding-top: 13px; + padding-bottom: 13px; + + img { + width: 24px; + height: 24px; + border-radius: 50%; + border: 1px solid #454; + } + } } .icon-container { @@ -214,24 +217,39 @@ } } - .navbar { - padding: 0 5px; - - .nav-home a, .nav-home a:hover { - width: 30px; - height: 30px; - padding: 5px; - text-align: center; - margin-top: 10px; - background: #DDD; - - i { - color: black; - font-size: 17px; - } - } - - } + .navbar-static-top, .navbar-fixed-top { + box-shadow: 0px -3px 12px rgba(0, 0, 0, 0.5); + } + + .navbar-header > .navbar-toggle { + margin-right: 8px; + } + + .navbar-nav { + margin-top: 0; + margin-bottom: 0; + + >li { + >a { + padding-top: 15px; + padding-bottom: 15px; + } + + >a:hover, >a:focus { + color: @gray-dark; + background-color: @gray-light; + } + + >#reconnect { + color: @gray-light; + } + + >#reconnect:focus, >#reconnect:hover { + color: @gray-light; + background-color: transparent; + } + } + } #acp-search { input { diff --git a/public/src/admin/manage/flags.js b/public/src/admin/manage/flags.js index c6dc4b11af..880094af20 100644 --- a/public/src/admin/manage/flags.js +++ b/public/src/admin/manage/flags.js @@ -1,12 +1,21 @@ "use strict"; /*global define, socket, app, admin, utils, bootbox, RELATIVE_PATH*/ -define('admin/manage/flags', ['forum/infinitescroll', 'admin/modules/selectable'], function(infinitescroll, selectable) { +define('admin/manage/flags', [ + 'forum/infinitescroll', + 'admin/modules/selectable', + 'autocomplete' +], function(infinitescroll, selectable, autocomplete) { + var Flags = {}; Flags.init = function() { $('.post-container .content img').addClass('img-responsive'); + var params = utils.params(); + $('#flag-sort-by').val(params.sortBy); + autocomplete.user($('#byUsername')); + handleDismiss(); handleDismissAll(); handleDelete(); @@ -69,8 +78,15 @@ define('admin/manage/flags', ['forum/infinitescroll', 'admin/modules/selectable' if (direction < 0 && !$('.flags').length) { return; } + var params = utils.params(); + var sortBy = params.sortBy || 'count'; + var byUsername = params.byUsername || ''; - infinitescroll.loadMore('admin.getMoreFlags', $('[data-next]').attr('data-next'), function(data, done) { + infinitescroll.loadMore('admin.getMoreFlags', { + byUsername: byUsername, + sortBy: sortBy, + after: $('[data-next]').attr('data-next') + }, function(data, done) { if (data.posts && data.posts.length) { infinitescroll.parseAndTranslate('admin/manage/flags', 'posts', {posts: data.posts}, function(html) { $('[data-next]').attr('data-next', data.next); diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js index dad64e35af..d9eb888985 100644 --- a/public/src/admin/manage/users.js +++ b/public/src/admin/manage/users.js @@ -214,7 +214,7 @@ define('admin/manage/users', ['admin/modules/selectable'], function(selectable) } $('#create-modal').modal('hide'); $('#create-modal').on('hidden.bs.modal', function() { - ajaxify.go('admin/users'); + ajaxify.refresh(); }); app.alertSuccess('User created!'); }); diff --git a/public/src/client/category.js b/public/src/client/category.js index b9ab5bc800..2dccb5f85d 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -339,7 +339,7 @@ define('forum/category', [ infinitescroll.loadMore('categories.loadMore', { cid: ajaxify.variables.get('category_id'), after: after, - author: utils.getQueryParams().author + author: utils.params().author }, function (data, done) { if (data.topics && data.topics.length) { diff --git a/public/src/client/search.js b/public/src/client/search.js index 95f49b60f8..56bdaf6dca 100644 --- a/public/src/client/search.js +++ b/public/src/client/search.js @@ -2,7 +2,7 @@ /* globals app, define, utils, socket*/ -define('forum/search', ['search'], function(searchModule) { +define('forum/search', ['search', 'autocomplete'], function(searchModule, autocomplete) { var Search = {}; Search.init = function() { @@ -80,8 +80,8 @@ define('forum/search', ['search'], function(searchModule) { $('#posted-by-user').val(params.by); } - if ((params['categories[]'] || params.categories)) { - $('#posted-in-categories').val(params['categories[]'] || params.categories); + if (params.categories) { + $('#posted-in-categories').val(params.categories); } if (params.searchChildren) { @@ -156,25 +156,7 @@ define('forum/search', ['search'], function(searchModule) { } function enableAutoComplete() { - var input = $('#posted-by-user'); - input.autocomplete({ - delay: 100, - source: function(request, response) { - socket.emit('user.search', {query: request.term}, function(err, result) { - if (err) { - return app.alertError(err.message); - } - - if (result && result.users) { - var names = result.users.map(function(user) { - return user && user.username; - }); - response(names); - } - $('.ui-autocomplete a').attr('data-ajaxify', 'false'); - }); - } - }); + autocomplete.user($('#posted-by-user')); } return Search; diff --git a/public/src/modules/autocomplete.js b/public/src/modules/autocomplete.js new file mode 100644 index 0000000000..d8b2311b98 --- /dev/null +++ b/public/src/modules/autocomplete.js @@ -0,0 +1,31 @@ + +'use strict'; + +/* globals define, socket, app */ + +define('autocomplete', function() { + var module = {}; + + module.user = function (input) { + input.autocomplete({ + delay: 100, + source: function(request, response) { + socket.emit('user.search', {query: request.term}, function(err, result) { + if (err) { + return app.alertError(err.message); + } + + if (result && result.users) { + var names = result.users.map(function(user) { + return user && user.username; + }); + response(names); + } + $('.ui-autocomplete a').attr('data-ajaxify', 'false'); + }); + } + }); + }; + + return module; +}); diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 29154d1523..84c4c4e9dd 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -16,11 +16,17 @@ define('composer', [ var composer = { active: undefined, posts: {}, - bsEnvironment: undefined + bsEnvironment: undefined, + formatting: [] }; $(window).off('resize', onWindowResize).on('resize', onWindowResize); + // Query server for formatting options + socket.emit('modules.composer.getFormattingOptions', function(err, options) { + composer.formatting = options; + }); + function onWindowResize() { if (composer.active !== undefined) { resize.reposition($('#cmp-uuid-' + composer.active)); @@ -232,7 +238,8 @@ define('composer', [ maximumTagLength: config.maximumTagLength, isTopic: isTopic, showHandleInput: (app.user.uid === 0 || (isEditing && isGuestPost && app.user.isAdmin)) && config.allowGuestHandles, - handle: composer.posts[post_uuid] ? composer.posts[post_uuid].handle || '' : undefined + handle: composer.posts[post_uuid] ? composer.posts[post_uuid].handle || '' : undefined, + formatting: composer.formatting }; parseAndTranslate(template, data, function(composerTemplate) { diff --git a/public/src/modules/composer/formatting.js b/public/src/modules/composer/formatting.js index f29e287a7f..03fb05730e 100644 --- a/public/src/modules/composer/formatting.js +++ b/public/src/modules/composer/formatting.js @@ -7,61 +7,15 @@ define('composer/formatting', ['composer/controls', 'composer/preview'], functio var formatting = {}; var formattingDispatchTable = { - 'fa fa-bold': function(textarea, selectionStart, selectionEnd){ - if(selectionStart === selectionEnd){ - controls.insertIntoTextarea(textarea, '**bolded text**'); - controls.updateTextareaSelection(textarea, selectionStart + 2, selectionStart + 13); - } else { - controls.wrapSelectionInTextareaWith(textarea, '**'); - controls.updateTextareaSelection(textarea, selectionStart + 2, selectionEnd + 2); - } - }, - - 'fa fa-italic': function(textarea, selectionStart, selectionEnd){ - if(selectionStart === selectionEnd){ - controls.insertIntoTextarea(textarea, "*italicised text*"); - controls.updateTextareaSelection(textarea, selectionStart + 1, selectionStart + 16); - } else { - controls.wrapSelectionInTextareaWith(textarea, '*'); - controls.updateTextareaSelection(textarea, selectionStart + 1, selectionEnd + 1); - } - }, - - 'fa fa-list': function(textarea, selectionStart, selectionEnd){ - if(selectionStart === selectionEnd){ - controls.insertIntoTextarea(textarea, "\n* list item"); - - // Highlight "list item" - controls.updateTextareaSelection(textarea, selectionStart + 3, selectionStart + 12); - } else { - controls.wrapSelectionInTextareaWith(textarea, '\n* ', ''); - controls.updateTextareaSelection(textarea, selectionStart + 3, selectionEnd + 3); - } - }, - - 'fa fa-link': function(textarea, selectionStart, selectionEnd){ - if(selectionStart === selectionEnd){ - controls.insertIntoTextarea(textarea, "[link text](link url)"); - - // Highlight "link url" - controls.updateTextareaSelection(textarea, selectionStart + 12, selectionEnd + 20); - } else { - controls.wrapSelectionInTextareaWith(textarea, '[', '](link url)'); - - // Highlight "link url" - controls.updateTextareaSelection(textarea, selectionEnd + 3, selectionEnd + 11); - } - }, - - 'fa fa-picture-o': function(){ + 'picture-o': function(){ $('#files').click(); }, - 'fa fa-upload': function(){ + upload: function(){ $('#files').click(); }, - 'fa fa-tags': function() { + tags: function() { $('.tags-container').toggleClass('hidden'); } }; @@ -69,27 +23,32 @@ define('composer/formatting', ['composer/controls', 'composer/preview'], functio var customButtons = []; formatting.addComposerButtons = function() { - for (var button in customButtons) { - if (customButtons.hasOwnProperty(button)) { - $('.formatting-bar .btn-group form').before(''); - } + for(var x=0,numButtons=customButtons.length;x'); } - } + }; formatting.addButton = function(iconClass, onClick) { - formattingDispatchTable[iconClass] = onClick; + var name = iconClass.replace('fa fa-', ''); + + formattingDispatchTable[name] = onClick; customButtons.push({ + name: name, iconClass: iconClass }); - } + }; + + formatting.addButtonDispatch = function(name, onClick) { + formattingDispatchTable[name] = onClick; + }; formatting.addHandler = function(postContainer) { postContainer.on('click', '.formatting-bar span', function () { - var iconClass = $(this).find('i').attr('class'); - var textarea = $(this).parents('.composer').find('textarea')[0]; + var format = $(this).attr('data-format'), + textarea = $(this).parents('.composer').find('textarea')[0]; - if(formattingDispatchTable.hasOwnProperty(iconClass)){ - formattingDispatchTable[iconClass](textarea, textarea.selectionStart, textarea.selectionEnd); + if(formattingDispatchTable.hasOwnProperty(format)){ + formattingDispatchTable[format](textarea, textarea.selectionStart, textarea.selectionEnd); preview.render(postContainer); } }); diff --git a/public/src/utils.js b/public/src/utils.js index 9c46e3fb6a..f345ab2a22 100644 --- a/public/src/utils.js +++ b/public/src/utils.js @@ -270,9 +270,12 @@ value = options.skipToType[key] ? decodeURI(val[1]) : utils.toType(decodeURI(val[1])); if (key) { + if (key.substr(-2, 2) === '[]') { + key = key.slice(0, -2); + } if (!hash[key]) { hash[key] = value; - } else { + } else { if (!$.isArray(hash[key])) { hash[key] = [hash[key]]; } @@ -293,24 +296,6 @@ return a; }, - getQueryParams: function() { - var search = window.location.search.slice(1), - data = {}; - - search = search.split('&'); - for(var x=0,numParams=search.length,temp;x parseInt(meta.config.maximumFileSize, 10) * 1024) { return callback(new Error('[[error:file-too-big, ' + meta.config.maximumFileSize + ']]')); } + + var filename = uploadedFile.name || 'upload'; - var filename = 'upload-' + utils.generateUUID() + path.extname(uploadedFile.name); + filename = Date.now() + '-' + validator.escape(filename).substr(0, 255); file.saveFileToLocal(filename, 'files', uploadedFile.path, function(err, upload) { if (err) { return callback(err); diff --git a/src/groups.js b/src/groups.js index 6cd0963525..1eae52699b 100644 --- a/src/groups.js +++ b/src/groups.js @@ -825,40 +825,58 @@ var async = require('async'), ], callback); }; + Groups.getGroupsData = function(groupNames, callback) { + if (!Array.isArray(groupNames) || !groupNames.length) { + return callback(null, []); + } + var keys = groupNames.map(function(groupName) { + return 'group:' + groupName; + }); + + db.getObjects(keys, function(err, groupData) { + if (err) { + return callback(err); + } + groupData = groupData.map(function(group) { + if (group) { + group.labelColor = group.labelColor || '#000000'; + group.createtimeISO = utils.toISOString(group.createtime); + group.hidden = parseInt(group.hidden, 10) === 1; + + if (!group['cover:url']) { + group['cover:url'] = nconf.get('relative_path') + '/images/cover-default.png'; + group['cover:position'] = '50% 50%'; + } + } + return group; + }); + + plugins.fireHook('filter:groups.get', {groups: groupData}, function(err, data) { + callback(err, data ? data.groups : null); + }); + }); + }; + Groups.getUserGroups = function(uids, callback) { db.getSortedSetRevRange('groups:createtime', 0, -1, function(err, groupNames) { if (err) { return callback(err); } - var groupKeys = groupNames.filter(function(groupName) { + groupNames = groupNames.filter(function(groupName) { return groupName !== 'registered-users' && groupName.indexOf(':privileges:') === -1; - }).map(function(groupName) { - return 'group:' + groupName; }); - db.getObjects(groupKeys, function(err, groupData) { + Groups.getGroupsData(groupNames, function(err, groupData) { if (err) { return callback(err); } groupData = groupData.filter(function(group) { - return parseInt(group.hidden, 10) !== 1 && !!group.userTitle; - }).map(function(group) { - group.createtimeISO = utils.toISOString(group.createtime); - return group; + return group && parseInt(group.hidden, 10) !== 1 && !!group.userTitle; }); - var groupSets = groupData.map(function(group) { - group.labelColor = group.labelColor || '#000000'; - group.createtimeISO = utils.toISOString(group.createtime); - - if (!group['cover:url']) { - group['cover:url'] = nconf.get('relative_path') + '/images/cover-default.png'; - group['cover:position'] = '50% 50%'; - } - return 'group:' + group.name + ':members'; }); diff --git a/src/messaging.js b/src/messaging.js index 339ec7798c..86ecf7014d 100644 --- a/src/messaging.js +++ b/src/messaging.js @@ -320,33 +320,34 @@ var db = require('./database'), }; function sendNotifications(fromuid, touid, messageObj, callback) { - if (!websockets.isUserOnline(touid)) { - notifications.create({ - bodyShort: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]', - bodyLong: messageObj.content, - path: nconf.get('relative_path') + '/chats/' + utils.slugify(messageObj.fromUser.username), - nid: 'chat_' + fromuid + '_' + touid, - from: fromuid - }, function(err, notification) { - if (!err && notification) { - notifications.push(notification, [touid], callback); - } - }); - - user.getSettings(messageObj.toUser.uid, function(err, settings) { - if (settings.sendChatNotifications && !parseInt(meta.config.disableEmailSubscriptions, 10)) { - emailer.send('notif_chat', touid, { - subject: '[[email:notif.chat.subject, ' + messageObj.fromUser.username + ']]', - username: messageObj.toUser.username, - summary: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]', - message: messageObj, - site_title: meta.config.title || 'NodeBB', - url: nconf.get('url'), - fromUserslug: utils.slugify(messageObj.fromUser.username) - }); - } - }); + if (websockets.isUserOnline(touid)) { + return callback(); } + + notifications.create({ + bodyShort: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]', + bodyLong: messageObj.content, + nid: 'chat_' + fromuid + '_' + touid, + from: fromuid + }, function(err, notification) { + if (!err && notification) { + notifications.push(notification, [touid], callback); + } + }); + + user.getSettings(messageObj.toUser.uid, function(err, settings) { + if (settings.sendChatNotifications && !parseInt(meta.config.disableEmailSubscriptions, 10)) { + emailer.send('notif_chat', touid, { + subject: '[[email:notif.chat.subject, ' + messageObj.fromUser.username + ']]', + username: messageObj.toUser.username, + summary: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]', + message: messageObj, + site_title: meta.config.title || 'NodeBB', + url: nconf.get('url'), + fromUserslug: utils.slugify(messageObj.fromUser.username) + }); + } + }); } }(exports)); diff --git a/src/notifications.js b/src/notifications.js index 0008fb1f69..5beed15f9c 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -55,11 +55,12 @@ var async = require('async'), } if (notification.from && !notification.image) { - User.getUserField(notification.from, 'picture', function(err, picture) { + User.getUserFields(notification.from, ['username', 'userslug', 'picture'], function(err, userData) { if (err) { return next(err); } - notification.image = picture; + notification.image = userData.picture; + notification.user = userData; next(null, notification); }); return; diff --git a/src/posts/delete.js b/src/posts/delete.js index cc1a8c8b5b..f3fab5bd87 100644 --- a/src/posts/delete.js +++ b/src/posts/delete.js @@ -29,7 +29,7 @@ module.exports = function(Posts) { removeFromCategoryRecentPosts(pid, postData.tid, next); }, function(next) { - db.sortedSetRemove('posts:flagged', pid, next); + Posts.dismissFlags(pid, next); } ], function(err) { callback(err, postData); @@ -125,6 +125,9 @@ module.exports = function(Posts) { }, function(next) { db.sortedSetsRemove(['posts:pid', 'posts:flagged'], pid, next); + }, + function(next) { + Posts.dismissFlags(pid, next); } ], function(err) { if (err) { diff --git a/src/posts/flags.js b/src/posts/flags.js index c3b591b001..388b707d3d 100644 --- a/src/posts/flags.js +++ b/src/posts/flags.js @@ -3,22 +3,52 @@ 'use strict'; var async = require('async'), - db = require('../database'); + db = require('../database'), + user = require('../user'); module.exports = function(Posts) { - Posts.flag = function(pid, callback) { - Posts.exists(pid, function(err, exists) { - if (err || !exists) { + + Posts.flag = function(post, uid, callback) { + async.parallel({ + hasFlagged: async.apply(hasFlagged, post.pid, uid), + exists: async.apply(Posts.exists, post.pid) + }, function(err, results) { + if (err || !results.exists) { return callback(err || new Error('[[error:no-post]]')); } + if (results.hasFlagged) { + return callback(new Error('[[error:already-flagged]]')); + } + var now = Date.now(); + async.parallel([ function(next) { - db.sortedSetAdd('posts:flagged', Date.now(), pid, next); + db.sortedSetAdd('posts:flagged', now, post.pid, next); + }, + function(next) { + db.sortedSetIncrBy('posts:flags:count', 1, post.pid, next); + }, + function(next) { + db.incrObjectField('post:' + post.pid, 'flags', next); + }, + function(next) { + db.sortedSetAdd('pid:' + post.pid + ':flag:uids', now, uid, next); }, function(next) { - db.incrObjectField('post:' + pid, 'flags', next); + if (parseInt(post.uid, 10)) { + db.sortedSetAdd('uid:' + post.uid + ':flag:pids', now, post.pid, next); + } else { + next(); + } + }, + function(next) { + if (parseInt(post.uid, 10)) { + db.setAdd('uid:' + post.uid + ':flagged_by', uid, next); + } else { + next(); + } } ], function(err, results) { callback(err); @@ -26,14 +56,31 @@ module.exports = function(Posts) { }); }; + function hasFlagged(pid, uid, callback) { + db.isSortedSetMember('pid:' + pid + ':flag:uids', uid, callback); + } + Posts.dismissFlag = function(pid, callback) { async.parallel([ function(next) { - db.sortedSetRemove('posts:flagged', pid, next); + db.getObjectField('post:' + pid, 'uid', function(err, uid) { + if (err) { + return next(err); + } + + db.sortedSetsRemove([ + 'posts:flagged', + 'posts:flags:count', + 'uid:' + uid + ':flag:pids' + ], pid, next); + }); }, function(next) { db.deleteObjectField('post:' + pid, 'flags', next); - } + }, + function(next) { + db.delete('pid:' + pid + ':flag:uids', next); + } ], function(err, results) { callback(err); }); @@ -43,8 +90,8 @@ module.exports = function(Posts) { db.delete('posts:flagged', callback); }; - Posts.getFlags = function(uid, start, end, callback) { - db.getSortedSetRevRange('posts:flagged', start, end, function(err, pids) { + Posts.getFlags = function(set, uid, start, end, callback) { + db.getSortedSetRevRange(set, start, end, function(err, pids) { if (err) { return callback(err); } @@ -52,4 +99,29 @@ module.exports = function(Posts) { Posts.getPostSummaryByPids(pids, uid, {stripTags: false, extraFields: ['flags']}, callback); }); }; + + Posts.getUserFlags = function(byUsername, sortBy, callerUID, start, end, callback) { + async.waterfall([ + function(next) { + user.getUidByUsername(byUsername, next); + }, + function(uid, next) { + if (!uid) { + return next(null, []); + } + db.getSortedSetRevRange('uid:' + uid + ':flag:pids', 0, -1, next); + }, + function(pids, next) { + Posts.getPostSummaryByPids(pids, callerUID, {stripTags: false, extraFields: ['flags']}, next); + }, + function(posts, next) { + if (sortBy === 'count') { + posts.sort(function(a, b) { + return b.flags - a.flags; + }); + } + next(null, posts.slice(start, end)); + } + ], callback); + }; }; diff --git a/src/search.js b/src/search.js index 5cab307a98..190a764bf2 100644 --- a/src/search.js +++ b/src/search.js @@ -365,47 +365,31 @@ function sortPosts(posts, data) { if (isNumeric) { if (data.sortDirection === 'desc') { - sortDescendingNumeric(posts, fields); + posts.sort(function(p1, p2) { + return p2[fields[0]][fields[1]] - p1[fields[0]][fields[1]]; + }); } else { - sortAscendingNumeric(posts, fields); + posts.sort(function(p1, p2) { + return p1[fields[0]][fields[1]] - p2[fields[0]][fields[1]]; + }); } } else { if (data.sortDirection === 'desc') { - sortDescendingAlpha(posts, fields); + posts.sort(function(p1, p2) { + if (p1[fields[0]][fields[1]] < p2[fields[0]][fields[1]]) return -1; + if (p1[fields[0]][fields[1]] > p2[fields[0]][fields[1]]) return 1; + return 0; + }); } else { - sortAscendingAlpha(posts, fields); + posts.sort(function(p1, p2) { + if (p1[fields[0]][fields[1]] > p2[fields[0]][fields[1]]) return -1; + if (p1[fields[0]][fields[1]] < p2[fields[0]][fields[1]]) return 1; + return 0; + }); } } } -function sortAscendingNumeric(posts, fields) { - posts.sort(function(p1, p2) { - return p1[fields[0]][fields[1]] - p2[fields[0]][fields[1]]; - }); -} - -function sortDescendingNumeric(posts, fields) { - posts.sort(function(p1, p2) { - return p2[fields[0]][fields[1]] - p1[fields[0]][fields[1]]; - }); -} - -function sortAscendingAlpha(posts, fields) { - posts.sort(function(p1, p2) { - if (p1[fields[0]][fields[1]] > p2[fields[0]][fields[1]]) return -1; - if (p1[fields[0]][fields[1]] < p2[fields[0]][fields[1]]) return 1; - return 0; - }); -} - -function sortDescendingAlpha(posts, fields) { - posts.sort(function(p1, p2) { - if (p1[fields[0]][fields[1]] < p2[fields[0]][fields[1]]) return -1; - if (p1[fields[0]][fields[1]] > p2[fields[0]][fields[1]]) return 1; - return 0; - }); -} - function getSearchCategories(data, callback) { if (!Array.isArray(data.categories) || !data.categories.length || data.categories.indexOf('all') !== -1) { return callback(null, []); diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index 49b3744dbb..542c1d2751 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -312,14 +312,24 @@ SocketAdmin.dismissAllFlags = function(socket, data, callback) { posts.dismissAllFlags(callback); }; -SocketAdmin.getMoreFlags = function(socket, after, callback) { - if (!parseInt(after, 10)) { +SocketAdmin.getMoreFlags = function(socket, data, callback) { + if (!data || !parseInt(data.after, 10)) { return callback('[[error:invalid-data]]'); } - after = parseInt(after, 10); - posts.getFlags(socket.uid, after, after + 19, function(err, posts) { - callback(err, {posts: posts, next: after + 20}); - }); + var sortBy = data.sortBy || 'count'; + var byUsername = data.byUsername || ''; + var start = parseInt(data.after, 10); + var end = start + 19; + if (byUsername) { + posts.getUserFlags(byUsername, sortBy, socket.uid, start, end, function(err, posts) { + callback(err, {posts: posts, next: end + 1}); + }); + } else { + var set = sortBy === 'count' ? 'posts:flags:count' : 'posts:flagged'; + posts.getFlags(set, socket.uid, start, end, function(err, posts) { + callback(err, {posts: posts, next: end + 1}); + }); + } }; SocketAdmin.takeHeapSnapshot = function(socket, data, callback) { diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index 00fdeaf433..306d26d579 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -114,6 +114,16 @@ SocketModules.composer.stopNotifyTyping = function(socket, data) { server.in('topic_' + data.tid).emit('event:topic.stopNotifyTyping', data); }; +SocketModules.composer.getFormattingOptions = function(socket, data, callback) { + plugins.fireHook('filter:composer.formatting', { + options: [ + // { className: 'fa fa-bold' } Just an example of what needs to be set via plugins + ] + }, function(err, payload) { + callback(err, payload.options); + }); +}; + /* Chat */ SocketModules.chats.get = function(socket, data, callback) { diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index a2de8ca5d6..0b5ab9b418 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -422,14 +422,14 @@ SocketPosts.flag = function(socket, pid, callback) { return next(new Error('[[error:not-enough-reputation-to-flag]]')); } userName = userData.username; - posts.getPostFields(pid, ['tid', 'uid', 'content', 'deleted'], next); + posts.getPostFields(pid, ['pid', 'tid', 'uid', 'content', 'deleted'], next); }, function(postData, next) { if (parseInt(postData.deleted, 10) === 1) { return next(new Error('[[error:post-deleted]]')); } post = postData; - posts.flag(pid, next); + posts.flag(post, socket.uid, next); }, function(next) { topics.getTopicFields(post.tid, ['title', 'cid'], next); @@ -462,14 +462,7 @@ SocketPosts.flag = function(socket, pid, callback) { } notifications.push(notification, results.admins.concat(results.moderators), next); }); - }, - function(next) { - if (!parseInt(post.uid, 10)) { - return next(); - } - - db.setAdd('uid:' + post.uid + ':flagged_by', socket.uid, next); - } + } ], callback); }; diff --git a/src/socket.io/user.js b/src/socket.io/user.js index fd23405758..15aa0e2ba6 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -294,7 +294,6 @@ SocketUser.follow = function(socket, data, callback) { notifications.create({ bodyShort: '[[notifications:user_started_following_you, ' + userData.username + ']]', - path: nconf.get('relative_path') + '/user/' + userData.userslug, nid: 'follow:' + data.uid + ':uid:' + socket.uid, from: socket.uid }, function(err, notification) { diff --git a/src/upgrade.js b/src/upgrade.js index 977854ab01..117b79848e 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -250,11 +250,24 @@ Upgrade.upgrade = function(callback) { }, next); } - Groups.list({showSystemGroups: true}, function(err, groups) { + async.waterfall([ + async.apply(db.getSetMembers, 'groups'), + function(groups, next) { + async.filter(groups, function(group, next) { + db.getObjectField('group:' + group, 'hidden', function(err, hidden) { + next(!parseInt(hidden, 10)); + }, next); + }, function(groups) { + next(null, groups); + }); + } + ], function(err, groups) { if (err) { return next(err); } + groups.push('administrators', 'registered-users'); + async.eachLimit(cids, 50, function(cid, next) { upgradePrivileges(cid, groups, next); }, next); @@ -445,7 +458,7 @@ Upgrade.upgrade = function(callback) { if (setting.dailyDigestFreq !== 'off') { db.sortedSetAdd('digest:' + setting.dailyDigestFreq + ':uids', now, setting.uid, next); } else { - next(false); + setImmediate(next); } }, function(err) { if (err) { diff --git a/src/user/delete.js b/src/user/delete.js index 3440e810a4..1c1e9c2974 100644 --- a/src/user/delete.js +++ b/src/user/delete.js @@ -80,7 +80,7 @@ module.exports = function(User) { 'uid:' + uid + ':topics', 'uid:' + uid + ':posts', 'uid:' + uid + ':chats', 'uid:' + uid + ':chats:unread', 'uid:' + uid + ':upvote', 'uid:' + uid + ':downvote', - 'uid:' + uid + ':ignored:cids' + 'uid:' + uid + ':ignored:cids', 'uid:' + uid + ':flag:pids' ]; db.deleteAll(keys, next); }, diff --git a/src/user/notifications.js b/src/user/notifications.js index 523b9e4903..706c227097 100644 --- a/src/user/notifications.js +++ b/src/user/notifications.js @@ -124,6 +124,13 @@ var async = require('async'), } notification.path = pidToPaths[notification.pid] || notification.path || ''; + + if (notification.nid.startsWith('chat')) { + notification.path = nconf.get('relative_path') + '/chats/' + notification.user.userslug; + } else if (notification.nid.startsWith('follow')) { + notification.path = nconf.get('relative_path') + '/user/' + notification.user.userslug; + } + notification.datetimeISO = utils.toISOString(notification.datetime); return notification; }); diff --git a/src/views/admin/header.tpl b/src/views/admin/header.tpl index 9bd680936a..7a5d658eb2 100644 --- a/src/views/admin/header.tpl +++ b/src/views/admin/header.tpl @@ -56,46 +56,55 @@ - +