From 7cbcb5215180be9eac09ddb20bf848e064be8793 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Wed, 6 Oct 2021 17:59:38 +0000 Subject: [PATCH 001/140] chore: update changelog for v1.18.4 --- CHANGELOG.md | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 593cf81266..a505089cd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,79 @@ +#### v1.18.4 (2021-10-06) + +##### Chores + +* up persona (f4e62fb1) +* incrementing version number - v1.18.3 (57358743) +* update changelog for v1.18.3 (f066ddb8) +* **deps:** + * update dependency lint-staged to v11.2.0 (840b49b9) + * update commitlint monorepo to v13.2.0 (aa370310) + * update dependency mocha to v9.1.2 (6385b88e) + +##### Documentation Changes + +* added link to unofficial IRC channel (c5a48b44) + +##### New Features + +* use unread icon in mobile (27e53b42) +* cli user management commands (#9848) (d1ff3d62) +* #9855, allow uid for post queue notifications (5aea6c6a) +* add userData to static:user.delete (f24b630e) +* closes #9845, sort by views (6399b428) +* duplicate `requireEmailAddress` settings block to Settings > User (a9645475) +* mongodb driver 4.x (#9832) (07adb49e) +* a useless hover effect because raisins (1a61ffc5) + +##### Bug Fixes + +* **deps:** + * update dependency mongodb to v4.1.3 (b4fc2773) + * update dependency postcss to v8.3.9 (9455e5b2) + * update dependency autoprefixer to v10.3.7 (78895d05) + * update dependency nodebb-plugin-composer-default to v7.0.8 (9215c7d1) + * update dependency ioredis to v4.27.10 (4694382c) + * update dependency nodebb-theme-persona to v11.2.9 (346e0890) + * update dependency autoprefixer to v10.3.6 (058fdca4) + * update dependency yargs to v17.2.1 (d50dd801) + * update dependency postcss to v8.3.8 (193c92e3) + * update dependency passport to ^0.5.0 (daea8a86) + * update dependency connect-pg-simple to v7 (#9785) (054f3da6) + * update dependency yargs to v17.2.0 (c78309b5) +* #9866, fire vote hooks after reputation changes (#9867) (8ad9a103) +* #9865, don't display register messages after login (96f5312d) +* dont show decimails on auto approva minutes (a0df3890) +* #9864 (e954ca10) +* delete old topic tags (a70c69fa) +* switch inf. scroll to xhr (#9854) (4404e819) +* #9828, max-width (40915105) +* handle undefined returnTo on registerAbort (ac1b9692) +* lint (ff850b24) +* psql tests (123354ca) +* psql test (f8d4ec6c) +* possible test fix for subfolder redirect (3605ac81) +* missing relative path in test (4eacfef0) +* #9834, missing null email check on new registrations, added tests (58e0a366) +* crossorigin not showing up on manifest link tag (0faa4937) +* #9827, fix reward duplication (89af00d1) + +##### Performance Improvements + +* convert promise.all to single query (#9851) (ea04aede) + +##### Refactors + +* use utils.debounce (a7668a7f) +* remove async.waterfall from remaining upgrade scripts (6b34065f) + +##### Tests + +* dashboard (4f8647a5) +* add tests for admin privileges (9fe9ab08) +* add missing tests (34798325) +* remove debug log (8cb47548) +* no need to create fake interstitial as NodeBB comes with some by default (cb69934a) + #### v1.18.3 (2021-09-22) ##### Chores From 945c2b0b8a242db398b7c39200a3c361d284d102 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Wed, 6 Oct 2021 17:59:38 +0000 Subject: [PATCH 002/140] chore: incrementing version number - v1.18.4 (cherry picked from commit 8593ea87e9b5d60eccd6e101d86b4f4e3a5ef4b3) Signed-off-by: Misty (Bot) --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 4a78966b57..17fb479da7 100644 --- a/install/package.json +++ b/install/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "1.18.3", + "version": "1.18.4", "homepage": "http://www.nodebb.org", "repository": { "type": "git", From 21166069dc5ea1a77f7804e3690191aa1391388b Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Thu, 7 Oct 2021 09:06:41 +0000 Subject: [PATCH 003/140] Latest translations and fallbacks --- public/language/ko/admin/manage/privileges.json | 4 ++-- public/language/ko/error.json | 6 +++--- public/language/ko/global.json | 2 +- public/language/ko/modules.json | 2 +- public/language/ko/notifications.json | 2 +- public/language/ko/topic.json | 12 ++++++------ public/language/ko/user.json | 8 ++++---- 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/public/language/ko/admin/manage/privileges.json b/public/language/ko/admin/manage/privileges.json index 2e16cda8e3..2bba7566c4 100644 --- a/public/language/ko/admin/manage/privileges.json +++ b/public/language/ko/admin/manage/privileges.json @@ -57,7 +57,7 @@ "alert.confirm-copyToChildrenGroup": "Are you sure you wish to apply this group's set of %1 to all descendant (child) categories?", "alert.no-undo": "이 행동은 되돌릴 수 없습니다.", "alert.admin-warning": "관리자에게는 절대적인 권한이 부여됩니다.", - "alert.copyPrivilegesFrom-title": "Select a category to copy from", - "alert.copyPrivilegesFrom-warning": "This will copy %1 from the selected category.", + "alert.copyPrivilegesFrom-title": "복사할 카테고리 설정", + "alert.copyPrivilegesFrom-warning": "%1를 선택한 카테고리에서 복사합니다.", "alert.copyPrivilegesFromGroup-warning": "This will copy this group's set of %1 from the selected category." } \ No newline at end of file diff --git a/public/language/ko/error.json b/public/language/ko/error.json index 5b09333f7d..df2d9b2cf5 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -25,14 +25,14 @@ "invalid-event": "올바르지 않은 이벤트: %1", "local-login-disabled": "권한이 없는 계정에서의 로컬 로그인이 비활성화 되었습니다.", "csrf-invalid": "세션이 만료되어 로그인에 실패하였습니다. 다시 시도해주세요.", - "invalid-path": "Invalid path", - "folder-exists": "Folder exists", + "invalid-path": "올바르지 않은 경로입니다.", + "folder-exists": "폴더가 이미 존재합니다.", "invalid-pagination-value": "올바르지 않은 페이지 값입니다. 최소 %1에서 최대 2% 사이로 설정해야 합니다.", "username-taken": "이미 사용 중인 사용자명입니다.", "email-taken": "이미 사용 중인 이메일입니다.", "email-nochange": "입력한 전자 메일이 이미 등록되어 있는 전자 메일과 동일합니다.", "email-invited": "해당 이메일의 사용자는 이미 초대되었습니다.", - "email-not-confirmed": "Posting in some categories or topics is enabled once your email is confirmed, please click here to send a confirmation email.", + "email-not-confirmed": "이메일 인증이 완료된 후 카테고리나 화제에 새로운 포스트를 작성할 수 있습니다. 여기를 눌러 인증 메일을 다시 발송할 수 있습니다.", "email-not-confirmed-chat": "아직 이메일이 인증되지 않아 채팅 기능을 사용할 수 없습니다. 여기를 눌러 이메일 인증을 진행하세요.", "email-not-confirmed-email-sent": "이메일 인증이 완료되지 않았습니다. 수신함에서 인증 메일을 확인해주세요. 인증이 완료되기 전까지는 글을 작성하거나 채팅 참여가 불가능합니다.", "no-email-to-confirm": "계정에 전자 메일 설정이 없습니다. 계정 복구를 위해 이메일이 필요합니다. 이메일을 입력하려면 여기를 클릭하십시오.", diff --git a/public/language/ko/global.json b/public/language/ko/global.json index 6f78a5f9a5..1b22d7ce1d 100644 --- a/public/language/ko/global.json +++ b/public/language/ko/global.json @@ -70,7 +70,7 @@ "firstpost": "첫 포스트", "read_more": "더 보기", "more": "더 보기", - "none": "None", + "none": "없음", "posted_ago_by_guest": "비회원이 %1에 작성했습니다.", "posted_ago_by": "%2님이 %1에 작성했습니다.", "posted_ago": "%1에 작성되었습니다.", diff --git a/public/language/ko/modules.json b/public/language/ko/modules.json index 6fa30a1b5e..b82a889498 100644 --- a/public/language/ko/modules.json +++ b/public/language/ko/modules.json @@ -54,7 +54,7 @@ "composer.formatting.strikethrough": "취소선", "composer.formatting.code": "코드", "composer.formatting.link": "링크", - "composer.formatting.picture": "Image Link", + "composer.formatting.picture": "이미지 링크", "composer.upload-picture": "이미지 업로드", "composer.upload-file": "파일 업로드", "composer.zen_mode": "전체화면", diff --git a/public/language/ko/notifications.json b/public/language/ko/notifications.json index 1778a6e0e4..8fa50bb11f 100644 --- a/public/language/ko/notifications.json +++ b/public/language/ko/notifications.json @@ -14,7 +14,7 @@ "topics": "화제", "replies": "답글", "chat": "채팅", - "group-chat": "Group Chats", + "group-chat": "그룹 채팅", "follows": "팔로우", "upvote": "추천", "new-flags": "새로 들어온 신고", diff --git a/public/language/ko/topic.json b/public/language/ko/topic.json index 7b9c6331d4..15ceccc2cc 100644 --- a/public/language/ko/topic.json +++ b/public/language/ko/topic.json @@ -20,8 +20,8 @@ "login-to-view": "🔒 열람을 위해 로그인", "edit": "수정", "delete": "삭제", - "delete-event": "Delete Event", - "delete-event-confirm": "Are you sure you want to delete this event?", + "delete-event": "이벤트 삭제", + "delete-event-confirm": "이 이벤트를 삭제하시겠습니까?", "purge": "완전 삭제", "restore": "복원", "move": "이동", @@ -45,9 +45,9 @@ "unpinned-by": "상단 고정을 해제한 사용자:", "deleted-by": "삭제한 사용자:", "restored-by": "복원한 사용자:", - "moved-from-by": "Moved from %1 by", + "moved-from-by": "%1에서 이동됨 -", "queued-by": "게시 승인 대기 중 →", - "backlink": "Referenced by", + "backlink": "참고 -", "bookmark_instructions": "이 쓰레드에서 읽은 마지막 포스트로 이동하려면 여기를 클릭 하세요.", "flag-post": "해당 포스트 신고", "flag-user": "해당 유저 신고", @@ -159,7 +159,7 @@ "newest_to_oldest": "최신순", "most_votes": "투표순", "most_posts": "포스트순", - "most_views": "Most Views", + "most_views": "조회수순", "stale.title": "새로운 화제를 생성하시겠습니까?", "stale.warning": "현재 답글을 작성 중인 화제는 오래전에 작성 되었습니다. 새로 화제를 생성하고 이 게시물을 인용하시겠습니까?", "stale.create": "새로운 화제 작성", @@ -179,5 +179,5 @@ "timeago_earlier": "%1 이전", "first-post": "첫 포스트", "last-post": "마지막 포스트", - "post-quick-reply": "Post quick reply" + "post-quick-reply": "빠른 답글" } \ No newline at end of file diff --git a/public/language/ko/user.json b/public/language/ko/user.json index 68fc02c4c7..247e979ed1 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -98,7 +98,7 @@ "has_no_follower": "이 사용자는 팔로워가 없습니다 :(", "follows_no_one": "이 사용자는 아무도 팔로우하고 있지 않습니다 :(", "has_no_posts": "이 사용자가 작성한 포스트가 없습니다.", - "has_no_best_posts": "This user does not have any upvoted posts yet.", + "has_no_best_posts": "해당 유저는 아직까지 추천을 받은 포스트가 없습니다.", "has_no_topics": "이 사용자가 작성한 화제가 없습니다.", "has_no_watched_topics": "이 사용자가 관심 목록에 추가한 화제가 없습니다.", "has_no_ignored_topics": "이 사용자는 아직 무시 중인 화제가 없습니다.", @@ -182,7 +182,7 @@ "consent.export-uploads-success": "업로드한 컨텐츠를 내보내기 합니다. 완료되면 알림을 수신합니다.", "consent.export_posts": "포스트 내보내기 (.csv)", "consent.export-posts-success": "포스트를 내보내기 합니다. 완료되면 알림을 수신합니다.", - "emailUpdate.intro": "Please enter your email address below. This forum uses your email address for scheduled digest and notifications, as well as for account recovery in the event of a lost password.", - "emailUpdate.optional": "This field is optional. You are not obligated to provide your email address, but without a validated email, you will not be able to recover your account.", - "emailUpdate.change-instructions": "A confirmation email will be sent to the entered email address with a unique link. Accessing that link will confirm your ownership of the email address and it will become active on your account. At any time, you are able to update your email on file from within your account page." + "emailUpdate.intro": "아래에 이메일 주소를 입력하세요. 해당 포럼은 입력한 이메일 주소로 정기 알림 메일과 그 외의 알림을 전송하고, 계정 복구 작업에도 해당 이메일 주소를 사용합니다.", + "emailUpdate.optional": "해당 항목은 선택 입력 항목입니다. 이메일 주소를 반드시 입력할 필요는 없지만 유효한 이메일 주소를 입력하지 않을 경우 계정을 잃어버렸을 때 복구하지 못 할 수도 있습니다.", + "emailUpdate.change-instructions": "입력하신 이메일 주소로 가입 인증 메일이 발송되었습니다. 메일 내의 링크에 접속할 경우 메일 소유자를 확인하고 계정이 활성화됩니다. 활성화 후에도 계정 페이지에서 이메일 주소를 변경할 수 있습니다." } \ No newline at end of file From 1438f40984da530bb403f34bed3bcfc4d4d9c888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 7 Oct 2021 09:16:53 -0400 Subject: [PATCH 004/140] chore: up persona --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 17fb479da7..b4445ae0f9 100644 --- a/install/package.json +++ b/install/package.json @@ -93,7 +93,7 @@ "nodebb-plugin-spam-be-gone": "0.7.9", "nodebb-rewards-essentials": "0.1.5", "nodebb-theme-lavender": "5.2.1", - "nodebb-theme-persona": "11.2.10", + "nodebb-theme-persona": "11.2.11", "nodebb-theme-slick": "1.4.13", "nodebb-theme-vanilla": "12.1.3", "nodebb-widget-essentials": "5.0.4", From 8654a996d374f5284febb4b6b58c9679b75f2902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 7 Oct 2021 11:10:58 -0400 Subject: [PATCH 005/140] test: increase timeout --- test/controllers-admin.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/controllers-admin.js b/test/controllers-admin.js index 70538e522d..d91d75822c 100644 --- a/test/controllers-admin.js +++ b/test/controllers-admin.js @@ -737,6 +737,7 @@ describe('Admin Controllers', () => { }); it('should allow normal user access to admin pages', async () => { + this.timeout(50000); function makeRequest(url) { return new Promise((resolve, reject) => { request(url, { jar: userJar, json: true }, (err, res, body) => { From 63109c070527946db0c5c06b67fddee21101abc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 7 Oct 2021 11:24:12 -0400 Subject: [PATCH 006/140] test: possible fix to timeout --- test/controllers-admin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/controllers-admin.js b/test/controllers-admin.js index d91d75822c..467652d88a 100644 --- a/test/controllers-admin.js +++ b/test/controllers-admin.js @@ -736,7 +736,7 @@ describe('Admin Controllers', () => { }); }); - it('should allow normal user access to admin pages', async () => { + it('should allow normal user access to admin pages', async function () { this.timeout(50000); function makeRequest(url) { return new Promise((resolve, reject) => { From 543d85212b634764ed9352bd97e4ce66070028c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 7 Oct 2021 12:45:44 -0400 Subject: [PATCH 007/140] refactor: remove unused colorpicker --- public/src/admin/modules/colorpicker.js | 2 +- public/src/admin/settings/cookies.js | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/public/src/admin/modules/colorpicker.js b/public/src/admin/modules/colorpicker.js index 6000c416d6..933067faf7 100644 --- a/public/src/admin/modules/colorpicker.js +++ b/public/src/admin/modules/colorpicker.js @@ -1,6 +1,6 @@ 'use strict'; - +// TODO: no longer used remove in 1.19.0 define('admin/modules/colorpicker', function () { var colorpicker = {}; diff --git a/public/src/admin/settings/cookies.js b/public/src/admin/settings/cookies.js index 0a2e8c7243..ef663aff07 100644 --- a/public/src/admin/settings/cookies.js +++ b/public/src/admin/settings/cookies.js @@ -1,14 +1,9 @@ 'use strict'; - -define('admin/settings/cookies', [ - 'admin/modules/colorpicker', -], function (colorpicker) { +define('admin/settings/cookies', function () { var Module = {}; Module.init = function () { - colorpicker.enable($('[data-colorpicker="1"]')); - $('#delete-all-sessions').on('click', function () { socket.emit('admin.deleteAllSessions', function (err) { if (err) { From b0eb2aed0e934e835cedccda37a7a71d43fefa26 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 7 Oct 2021 17:06:36 +0000 Subject: [PATCH 008/140] fix(deps): update dependency jquery-ui to v1.13.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index b4445ae0f9..aeaa1458b6 100644 --- a/install/package.json +++ b/install/package.json @@ -67,7 +67,7 @@ "jquery-deserialize": "2.0.0", "jquery-form": "4.3.0", "jquery-serializeobject": "1.0.0", - "jquery-ui": "1.12.1", + "jquery-ui": "1.13.0", "jsesc": "3.0.2", "json2csv": "5.0.6", "jsonwebtoken": "^8.5.1", From 56d05b4e86d28a8434467eb787c6536e68112805 Mon Sep 17 00:00:00 2001 From: gasoved Date: Thu, 7 Oct 2021 21:53:51 +0300 Subject: [PATCH 009/140] feat: confirm before deleting all events (#9875) --- .../language/en-GB/admin/advanced/events.json | 1 + public/src/admin/advanced/events.js | 26 +++++++++++-------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/public/language/en-GB/admin/advanced/events.json b/public/language/en-GB/admin/advanced/events.json index 56d9457971..b2c2033fb5 100644 --- a/public/language/en-GB/admin/advanced/events.json +++ b/public/language/en-GB/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "There are no events", "control-panel": "Events Control Panel", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/src/admin/advanced/events.js b/public/src/admin/advanced/events.js index 147ad193e5..0ebc945a80 100644 --- a/public/src/admin/advanced/events.js +++ b/public/src/admin/advanced/events.js @@ -1,27 +1,31 @@ 'use strict'; -define('admin/advanced/events', function () { - var Events = {}; +define('admin/advanced/events', ['bootbox'], function (bootbox) { + const Events = {}; Events.init = function () { $('[data-action="clear"]').on('click', function () { - socket.emit('admin.deleteAllEvents', function (err) { - if (err) { - return app.alertError(err.message); + bootbox.confirm('[[admin/advanced/events:confirm-delete-all-events]]', (confirm) => { + if (confirm) { + socket.emit('admin.deleteAllEvents', function (err) { + if (err) { + return app.alertError(err.message); + } + $('.events-list').empty(); + }); } - $('.events-list').empty(); }); }); $('.delete-event').on('click', function () { - var parentEl = $(this).parents('[data-eid]'); - var eid = parentEl.attr('data-eid'); + const $parentEl = $(this).parents('[data-eid]'); + const eid = $parentEl.attr('data-eid'); socket.emit('admin.deleteEvents', [eid], function (err) { if (err) { return app.alertError(err.message); } - parentEl.remove(); + $parentEl.remove(); }); }); @@ -31,8 +35,8 @@ define('admin/advanced/events', function () { Events.refresh = function (event) { event.preventDefault(); - var formEl = $('#filters'); - ajaxify.go('admin/advanced/events?' + formEl.serialize()); + const $formEl = $('#filters'); + ajaxify.go('admin/advanced/events?' + $formEl.serialize()); }; return Events; From 7935bd9efbe572afd27285007515efba50ac7384 Mon Sep 17 00:00:00 2001 From: gasoved Date: Thu, 7 Oct 2021 21:59:03 +0300 Subject: [PATCH 010/140] fix: missing translations (#9876) --- public/language/en-GB/error.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/language/en-GB/error.json b/public/language/en-GB/error.json index 3b6f337165..77ef15c699 100644 --- a/public/language/en-GB/error.json +++ b/public/language/en-GB/error.json @@ -41,6 +41,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", @@ -120,6 +121,7 @@ "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "You can't ban other admins!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.", From 4f9717fb08cc0dd3d49e6a89e5ed16ebe4a6f2b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 7 Oct 2021 15:20:41 -0400 Subject: [PATCH 011/140] fix: escape thumbs, allow robots meta tag --- public/src/ajaxify.js | 2 +- src/topics/thumbs.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 26576dabbd..2ee4836fb6 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -223,7 +223,7 @@ ajaxify = window.ajaxify || {}; } function updateTags() { - var metaWhitelist = ['title', 'description', /og:.+/, /article:.+/].map(function (val) { + var metaWhitelist = ['title', 'description', /og:.+/, /article:.+/, 'robots'].map(function (val) { return new RegExp(val); }); var linkWhitelist = ['canonical', 'alternate', 'up']; diff --git a/src/topics/thumbs.js b/src/topics/thumbs.js index 48520d4f81..cd0a93f3cd 100644 --- a/src/topics/thumbs.js +++ b/src/topics/thumbs.js @@ -64,7 +64,8 @@ async function getThumbs(set) { if (cached !== undefined) { return cached.slice(); } - const thumbs = await db.getSortedSetRange(set, 0, -1); + let thumbs = await db.getSortedSetRange(set, 0, -1); + thumbs = thumbs.map(t => validator.escape(String(t))); cache.set(set, thumbs); return thumbs.slice(); } From 6c25b9dbaa974a23fa3613cd16743e0d792f1404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 7 Oct 2021 16:24:53 -0400 Subject: [PATCH 012/140] test: remove escape --- src/topics/thumbs.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/topics/thumbs.js b/src/topics/thumbs.js index cd0a93f3cd..48520d4f81 100644 --- a/src/topics/thumbs.js +++ b/src/topics/thumbs.js @@ -64,8 +64,7 @@ async function getThumbs(set) { if (cached !== undefined) { return cached.slice(); } - let thumbs = await db.getSortedSetRange(set, 0, -1); - thumbs = thumbs.map(t => validator.escape(String(t))); + const thumbs = await db.getSortedSetRange(set, 0, -1); cache.set(set, thumbs); return thumbs.slice(); } From 1958dffa04ba5c5032a838520248b4e2fdb26515 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Fri, 8 Oct 2021 09:07:02 +0000 Subject: [PATCH 013/140] Latest translations and fallbacks --- public/language/ar/admin/advanced/events.json | 1 + public/language/ar/error.json | 2 ++ public/language/bg/admin/advanced/events.json | 1 + public/language/bg/error.json | 2 ++ public/language/bn/admin/advanced/events.json | 1 + public/language/bn/error.json | 2 ++ public/language/cs/admin/advanced/events.json | 1 + public/language/cs/error.json | 2 ++ public/language/da/admin/advanced/events.json | 1 + public/language/da/error.json | 2 ++ public/language/de/admin/advanced/events.json | 1 + public/language/de/error.json | 2 ++ public/language/el/admin/advanced/events.json | 1 + public/language/el/error.json | 2 ++ public/language/en-US/admin/advanced/events.json | 1 + public/language/en-US/error.json | 2 ++ .../language/en-x-pirate/admin/advanced/events.json | 1 + public/language/en-x-pirate/error.json | 2 ++ public/language/es/admin/advanced/events.json | 1 + public/language/es/error.json | 2 ++ public/language/et/admin/advanced/events.json | 1 + public/language/et/error.json | 2 ++ public/language/fa-IR/admin/advanced/events.json | 1 + public/language/fa-IR/error.json | 2 ++ public/language/fi/admin/advanced/events.json | 1 + public/language/fi/error.json | 2 ++ public/language/fr/admin/advanced/events.json | 1 + public/language/fr/error.json | 2 ++ public/language/gl/admin/advanced/events.json | 1 + public/language/gl/error.json | 2 ++ public/language/he/admin/advanced/events.json | 1 + public/language/he/error.json | 2 ++ public/language/hr/admin/advanced/events.json | 1 + public/language/hr/error.json | 2 ++ public/language/hu/admin/advanced/events.json | 1 + public/language/hu/error.json | 2 ++ public/language/id/admin/advanced/events.json | 1 + public/language/id/error.json | 2 ++ public/language/it/admin/advanced/events.json | 1 + public/language/it/error.json | 2 ++ public/language/ja/admin/advanced/events.json | 1 + public/language/ja/error.json | 2 ++ public/language/ko/admin/advanced/events.json | 1 + public/language/ko/admin/manage/privileges.json | 12 ++++++------ public/language/ko/admin/manage/uploads.json | 4 ++-- public/language/ko/admin/manage/users.json | 2 +- public/language/ko/admin/settings/email.json | 4 ++-- public/language/ko/admin/settings/general.json | 8 ++++---- public/language/ko/admin/settings/notifications.json | 2 +- public/language/ko/admin/settings/post.json | 6 +++--- public/language/ko/email.json | 2 +- public/language/ko/error.json | 2 ++ public/language/ko/register.json | 6 +++--- public/language/ko/topic.json | 2 +- public/language/lt/admin/advanced/events.json | 1 + public/language/lt/error.json | 2 ++ public/language/lv/admin/advanced/events.json | 1 + public/language/lv/error.json | 2 ++ public/language/ms/admin/advanced/events.json | 1 + public/language/ms/error.json | 2 ++ public/language/nb/admin/advanced/events.json | 1 + public/language/nb/error.json | 2 ++ public/language/nl/admin/advanced/events.json | 1 + public/language/nl/error.json | 2 ++ public/language/pl/admin/advanced/events.json | 1 + public/language/pl/error.json | 2 ++ public/language/pt-BR/admin/advanced/events.json | 1 + public/language/pt-BR/error.json | 2 ++ public/language/pt-PT/admin/advanced/events.json | 1 + public/language/pt-PT/error.json | 2 ++ public/language/ro/admin/advanced/events.json | 1 + public/language/ro/error.json | 2 ++ public/language/ru/admin/advanced/events.json | 1 + public/language/ru/error.json | 2 ++ public/language/rw/admin/advanced/events.json | 1 + public/language/rw/error.json | 2 ++ public/language/sc/admin/advanced/events.json | 1 + public/language/sc/error.json | 2 ++ public/language/sk/admin/advanced/events.json | 1 + public/language/sk/error.json | 2 ++ public/language/sl/admin/advanced/events.json | 1 + public/language/sl/error.json | 2 ++ public/language/sr/admin/advanced/events.json | 1 + public/language/sr/error.json | 2 ++ public/language/sv/admin/advanced/events.json | 1 + public/language/sv/error.json | 2 ++ public/language/th/admin/advanced/events.json | 1 + public/language/th/error.json | 2 ++ public/language/tr/admin/advanced/events.json | 1 + public/language/tr/error.json | 2 ++ public/language/uk/admin/advanced/events.json | 1 + public/language/uk/error.json | 2 ++ public/language/vi/admin/advanced/events.json | 1 + public/language/vi/admin/settings/notifications.json | 2 +- public/language/vi/error.json | 2 ++ public/language/vi/modules.json | 2 +- public/language/zh-CN/admin/advanced/events.json | 1 + public/language/zh-CN/error.json | 2 ++ public/language/zh-TW/admin/advanced/events.json | 1 + public/language/zh-TW/error.json | 2 ++ 100 files changed, 158 insertions(+), 26 deletions(-) diff --git a/public/language/ar/admin/advanced/events.json b/public/language/ar/admin/advanced/events.json index ba5f150b4e..218d088830 100644 --- a/public/language/ar/admin/advanced/events.json +++ b/public/language/ar/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "لا توجد أحداث", "control-panel": "لوحة تحكم الأحداث", "delete-events": "حذف الاحداث", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "تصفية", "filters-apply": "تطبيق التصفية", "filter-type": "نوع الحدث", diff --git a/public/language/ar/error.json b/public/language/ar/error.json index 9776fd896a..a665488fc0 100644 --- a/public/language/ar/error.json +++ b/public/language/ar/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "لا يمكنك الدردشة حتى تقوم بتأكيد بريدك الإلكتروني، الرجاء إضغط هنا لتأكيد بريدك اﻹلكتروني.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "لم نستطع تفعيل بريدك الإلكتروني، المرجو المحاولة لاحقًا.", "confirm-email-already-sent": "لقد تم ارسال بريد التأكيد، الرجاء اﻹنتظار 1% دقائق لإعادة اﻹرسال", "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "لايمكن حظر مدبر نظام آخر.", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "رجاءًا ، أضف مدير أخر قبل حذف صلاحيات الإدارة من حسابك.", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "رجاءًا أزل صلاحيات الإدارة قبل حذف الحساب. ", diff --git a/public/language/bg/admin/advanced/events.json b/public/language/bg/admin/advanced/events.json index 3351345964..30175ef9a8 100644 --- a/public/language/bg/admin/advanced/events.json +++ b/public/language/bg/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Няма събития", "control-panel": "Контролен панел за събитията", "delete-events": "Изтриване на събитията", + "confirm-delete-all-events": "Наистина ли искате да изтриете всички събития в журнала?", "filters": "Филтри", "filters-apply": "Прилагане на филтрите", "filter-type": "Вид събитие", diff --git a/public/language/bg/error.json b/public/language/bg/error.json index f40a8ef492..bd812e7802 100644 --- a/public/language/bg/error.json +++ b/public/language/bg/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Няма да можете да пишете в разговори, докато е-пощата Ви не бъде потвърдена. Моля, натиснете тук, за да потвърдите е-пощата си.", "email-not-confirmed-email-sent": "Вашата е-поща все още не е потвърдена. Моля, проверете входящата си кутия за писмото за потвърждение. Няма да можете да публикувате съобщения или да пишете в разговори, докато е-пощата Ви не бъде потвърдена.", "no-email-to-confirm": "Нямате зададена е-поща. Тя е необходима за възстановяването на акаунта в случай на проблем. Натиснете тук, за да въведете е-поща.", + "user-doesnt-have-email": "Потребителят „%1“ няма зададена е-поща.", "email-confirm-failed": "Не успяхме да потвърдим е-пощата Ви. Моля, опитайте отново по-късно.", "confirm-email-already-sent": "Е-писмото за потвърждение вече е изпратено. Моля, почакайте още %1 минута/и, преди да изпратите ново.", "sendmail-not-found": "Изпълнимият файл на „sendmail“ не може да бъде намерен. Моля, уверете се, че е инсталиран и изпълним за потребителя, чрез който е пуснат NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "Вече имате отметка към тази публикация", "already-unbookmarked": "Вече сте премахнали отметката си от тази публикация", "cant-ban-other-admins": "Не можете да блокирате другите администратори!", + "cant-make-banned-users-admin": "Не можете да давате администраторски права на блокирани потребители.", "cant-remove-last-admin": "Вие сте единственият администратор. Добавете друг потребител като администратор, преди да премахнете себе си като администратор", "account-deletion-disabled": "Изтриването на акаунт е забранено", "cant-delete-admin": "Премахнете администраторските права от този акаунт, преди да го изтриете.", diff --git a/public/language/bn/admin/advanced/events.json b/public/language/bn/admin/advanced/events.json index 56d9457971..b2c2033fb5 100644 --- a/public/language/bn/admin/advanced/events.json +++ b/public/language/bn/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "There are no events", "control-panel": "Events Control Panel", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/bn/error.json b/public/language/bn/error.json index f7fcdc6f29..2ef1609ea2 100644 --- a/public/language/bn/error.json +++ b/public/language/bn/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "আপনি অন্য এ্যাডমিনদের নিষিদ্ধ করতে পারেন না!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.", diff --git a/public/language/cs/admin/advanced/events.json b/public/language/cs/admin/advanced/events.json index 49925c5035..327b32d858 100644 --- a/public/language/cs/admin/advanced/events.json +++ b/public/language/cs/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Žádné nové události", "control-panel": "Ovládací panel událostí", "delete-events": "Odstranit události", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filtry", "filters-apply": "Použít filtry", "filter-type": "Typ události", diff --git a/public/language/cs/error.json b/public/language/cs/error.json index 619fb91adf..1fba3a9e8a 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Nebude schopen konverzovat, dokud nebude váš e-mail potvrzen. Pro jeho potvrzení klikněte zde.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Nemohli jsme ověřit vaši e-mailovou adresu, zkuste to později.", "confirm-email-already-sent": "Potvrzovací e-mail byl již odeslán. Vyčkejte %1 minut/y, chcete-li odeslat další.", "sendmail-not-found": "Modul pro odeslání e-mailů nebyl nalezen. Zkontrolujte prosím, zda je nainstalován a spuštěn uživatelem, který spustil NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "Již jste tento příspěvek zazáložkoval", "already-unbookmarked": "Již jste u tohoto příspěvku odebral záložku", "cant-ban-other-admins": "Nemůžete zablokovat jiné správce.", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Jste jediným správcem. Před vlastním odebráním oprávnění správce nejdříve přidejte jiného uživatele jako správce", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Před odstraněním účtu mu nejprve odeberte oprávnění správce.", diff --git a/public/language/da/admin/advanced/events.json b/public/language/da/admin/advanced/events.json index fe72f82b6a..dcdb6608c1 100644 --- a/public/language/da/admin/advanced/events.json +++ b/public/language/da/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "There are no events", "control-panel": "Kontrol Panel for Begivenheder", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/da/error.json b/public/language/da/error.json index 58d887b026..e37b7a59c6 100644 --- a/public/language/da/error.json +++ b/public/language/da/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Du kan ikke chatte før din email er bekræftet, klik her for at bekræfte din email.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Vi kunne ikke bekræfte din email, prøv igen senere.", "confirm-email-already-sent": "Bekræftelses email er allerede afsendt, vent venligt %1 minut(ter) for at sende endnu en.", "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Du kan ikke udlukke andre administatrorer!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Du er den eneste administrator. Tilføj en anden bruger som administrator før du fjerner dig selv som administrator", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.", diff --git a/public/language/de/admin/advanced/events.json b/public/language/de/admin/advanced/events.json index 2a7607040e..8b2cc6bf9a 100644 --- a/public/language/de/admin/advanced/events.json +++ b/public/language/de/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Es gibt keine Ereignisse", "control-panel": "Ereignis-Steuerung", "delete-events": "Ereignisse löschen", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filter", "filters-apply": "Filter anwenden", "filter-type": "Ereignistyp", diff --git a/public/language/de/error.json b/public/language/de/error.json index 541af8c5ed..96e9ff7b4f 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Du kannst den Chat erst nutzen wenn deine E-Mail bestätigt wurde, bitte klicke hier, um deine E-Mail zu bestätigen.", "email-not-confirmed-email-sent": "Deine Email-Adresse wurde noch nicht bestätigt, bitte kontrolliere dein Postfach nach einer Bestätigungsmail. Du kannst keine Beiträge erstellen oder chatten bis deine Email-Adresse bestätigt wurde.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Wir konnten deine E-Mail-Adresse nicht bestätigen, bitte versuch es später noch einmal", "confirm-email-already-sent": "Die Bestätigungsmail wurde verschickt. Bitte warte %1 Minute(n), um eine weitere zu verschicken.", "sendmail-not-found": "Sendmail wurde nicht gefunden. Bitte stelle sicher, dass es installiert ist und durch den Benutzer unter dem NodeBB läuft ausgeführt werden kann.", @@ -103,6 +104,7 @@ "already-bookmarked": "Du hast diesen Beitrag bereits als Lesezeichen gespeichert", "already-unbookmarked": "Du hast diesen Beitrag bereits aus deinen Lesezeichen entfernt", "cant-ban-other-admins": "Du kannst andere Administratoren nicht sperren!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Du bist der einzige Administrator. Füge zuerst einen anderen Administrator hinzu, bevor du dich selbst als Administrator entfernst", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Bevor du versuchst dieses Konto zu löschen, entferne die zugehörigen Administratorrechte.", diff --git a/public/language/el/admin/advanced/events.json b/public/language/el/admin/advanced/events.json index 56d9457971..b2c2033fb5 100644 --- a/public/language/el/admin/advanced/events.json +++ b/public/language/el/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "There are no events", "control-panel": "Events Control Panel", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/el/error.json b/public/language/el/error.json index f34cf7d037..c3e7b62e21 100644 --- a/public/language/el/error.json +++ b/public/language/el/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Δεν μπορείς να αποκλείσεις άλλους διαχειριστές!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.", diff --git a/public/language/en-US/admin/advanced/events.json b/public/language/en-US/admin/advanced/events.json index 56d9457971..b2c2033fb5 100644 --- a/public/language/en-US/admin/advanced/events.json +++ b/public/language/en-US/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "There are no events", "control-panel": "Events Control Panel", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/en-US/error.json b/public/language/en-US/error.json index b806ec9367..55f49fe028 100644 --- a/public/language/en-US/error.json +++ b/public/language/en-US/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "You can't ban other admins!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.", diff --git a/public/language/en-x-pirate/admin/advanced/events.json b/public/language/en-x-pirate/admin/advanced/events.json index 56d9457971..b2c2033fb5 100644 --- a/public/language/en-x-pirate/admin/advanced/events.json +++ b/public/language/en-x-pirate/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "There are no events", "control-panel": "Events Control Panel", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/en-x-pirate/error.json b/public/language/en-x-pirate/error.json index b806ec9367..55f49fe028 100644 --- a/public/language/en-x-pirate/error.json +++ b/public/language/en-x-pirate/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "You can't ban other admins!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.", diff --git a/public/language/es/admin/advanced/events.json b/public/language/es/admin/advanced/events.json index 860f8f87a9..ec26f7c11c 100644 --- a/public/language/es/admin/advanced/events.json +++ b/public/language/es/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "No hay eventos", "control-panel": "Panel de control de eventos", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filtros", "filters-apply": "Aplicar filtros", "filter-type": "Tipo de evento", diff --git a/public/language/es/error.json b/public/language/es/error.json index af0ec0569b..dea34e793c 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "No puedes usar el chat hasta que confirmes tu dirección de correo electrónico, por favor haz click aquí para confirmar tu correo.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "No se ha podido confirmar su email, por favor inténtelo de nuevo más tarde.", "confirm-email-already-sent": "El email de confirmación ya ha sido enviado, por favor espera %1 minuto(s) para enviar otro.", "sendmail-not-found": "El ejecutable \"sendmail\" no ha sido encontrado, por favor asegúrate de que esta instalado en tu sistema y es accesible por el usuario que ejecuta NodeBB. ", @@ -103,6 +104,7 @@ "already-bookmarked": "Ya marcaste este mensaje", "already-unbookmarked": "Ya desmarcarste este mensaje", "cant-ban-other-admins": "¡No puedes expulsar a otros administradores!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Tu eres el unico administrador. Añade otro usuario como administrador antes de eliminarte a ti mismo.", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Quitar privilegios de administrador de ésta cuenta antes de intentar borrarla", diff --git a/public/language/et/admin/advanced/events.json b/public/language/et/admin/advanced/events.json index 39eaf199f0..2b0df63877 100644 --- a/public/language/et/admin/advanced/events.json +++ b/public/language/et/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Sündmused puuduvad", "control-panel": "Sündmuste kontrollpaneel", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/et/error.json b/public/language/et/error.json index ebf1ab7c31..2093bbfc20 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Sõnumeid ei ole võimalik enne saata kui sinu email on kinnitatud. Kinnitamiseks vajuta siia.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Meil ei õnnestunud sinu emaili kinnitada, proovi hiljem uuesti.", "confirm-email-already-sent": "Kinnituskiri on juba saadetud, palun oota %1 minut(it) uue kirja saatmiseks.", "sendmail-not-found": "Sendmail'i käivitatavat ei leitud, palun tee kindlaks, et see on installeeritud ja on käivitatav kasutaja poolt, kes käitab NodeBB't.", @@ -103,6 +104,7 @@ "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Sa ei saa bannida teisi administraatoreid!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Te olete ainus administraator. Lisage keegi teine administraatoriks, enne kui eemaldate endalt administraatori.", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Eemalda sellelt kasutajalt administraatori õigused enne selle kustutamist", diff --git a/public/language/fa-IR/admin/advanced/events.json b/public/language/fa-IR/admin/advanced/events.json index 007719946d..71fc64b667 100644 --- a/public/language/fa-IR/admin/advanced/events.json +++ b/public/language/fa-IR/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "رویدادی موجود نیست", "control-panel": "کنترل پنل رویداد ها", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/fa-IR/error.json b/public/language/fa-IR/error.json index f5385f82bd..769fec100a 100644 --- a/public/language/fa-IR/error.json +++ b/public/language/fa-IR/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "شما تا قبل از تایید ایمیل قادر به چت نیستید، لطفا برای تایید ایمیل خود اینجا کلیک کنید", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "سیستم موفق به تایید ایمیل شما نشد، لطفا بعدا دوباره سعی کنید", "confirm-email-already-sent": "ایمیل فعال‌سازی قبلا فرستاده شده، لطفا %1 دقیقه صبر کنید تا ایمیل دیگری فرستاده شود.", "sendmail-not-found": "اجازه ارسال رایانامه پیدا نشد، لطفا مطمئن شوید این قابلیت نصب شده و توسط کاربر مد نظر در نود‌بی‌بی قابل اجرا است.", @@ -103,6 +104,7 @@ "already-bookmarked": "شما قبلا این پست را نشانک کرده‌اید", "already-unbookmarked": "شما قبلا این پست را از نشانک در آوردید", "cant-ban-other-admins": "شما نمی‌توانید دیگر مدیران را محروم کنید!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "شما تنها مدیر می باشید . شما باید قبل از عزل خود از مدیریت یک کاربر دیگر را مدیر کنید", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "قبل از حذف این کاربر دسترسی های مدیریت را از وی بگیرید.", diff --git a/public/language/fi/admin/advanced/events.json b/public/language/fi/admin/advanced/events.json index a2a77c4021..472c08b024 100644 --- a/public/language/fi/admin/advanced/events.json +++ b/public/language/fi/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Ei tapahtumia.", "control-panel": "Tapahtumien hallintapaneeli", "delete-events": "Poista tapahtumia", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Suodattimet", "filters-apply": "Lisää suodattimia", "filter-type": "Tapahtuman tyyppi", diff --git a/public/language/fi/error.json b/public/language/fi/error.json index 711704df4f..baa398e678 100644 --- a/public/language/fi/error.json +++ b/public/language/fi/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Et voi keskustella ennen kuin sähköpostiosoitteesi on vahvistettu, ole hyvä ja paina tästä vahvistaaksesi sen.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Et voi estää muita ylläpitäjiä!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.", diff --git a/public/language/fr/admin/advanced/events.json b/public/language/fr/admin/advanced/events.json index 6e7c591e35..6c545d692b 100644 --- a/public/language/fr/admin/advanced/events.json +++ b/public/language/fr/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Il n'y a aucun évènement.", "control-panel": "Panneau de contrôle des évènements", "delete-events": "Supprimer les évènements", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filtres", "filters-apply": "Appliquer", "filter-type": "Évènements", diff --git a/public/language/fr/error.json b/public/language/fr/error.json index a3c870ca55..dd4d184824 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Il ne vous est pas possible d'utiliser le chat tant que votre adresse email n'a pas été vérifiée. Veuillez cliquer ici pour confirmer votre adresse email.", "email-not-confirmed-email-sent": "Votre email n'a pas encore été confirmé, veuillez vérifier votre boîte mail. Vous ne pourrez pas poster ou discuter avant que votre email ne soit confirmé.", "no-email-to-confirm": "Votre compte n'a pas d'adresse mail définie. Un mail est nécessaire pour la récupération du compte. Veuillez cliquer ici pour entrer un courriel.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Votre adresse email n'a pas pu être vérifiée. Veuillez ré-essayer plus tard.", "confirm-email-already-sent": "L'email de confirmation a déjà été envoyé. Veuillez attendre %1 minute(s) avant de redemander un nouvel envoi.", "sendmail-not-found": "L'application d'envoi de mail est introuvable, assurez-vous qu'elle est installée et que l'utilisateur ayant démarré NodeBB ait des droits suffisants.", @@ -103,6 +104,7 @@ "already-bookmarked": "Vous avez déjà mis un marque-page", "already-unbookmarked": "Vous avez déjà retiré un marque-page", "cant-ban-other-admins": "Vous ne pouvez pas bannir les autres administrateurs !", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Vous êtes le seul administrateur. Ajoutez un autre utilisateur en tant qu'administrateur avant de vous retirer.", "account-deletion-disabled": "La suppression du compte est désactivée", "cant-delete-admin": "Veuillez retirer les droits d'administration de ce compte avant de tenter de le supprimer.", diff --git a/public/language/gl/admin/advanced/events.json b/public/language/gl/admin/advanced/events.json index 56d9457971..b2c2033fb5 100644 --- a/public/language/gl/admin/advanced/events.json +++ b/public/language/gl/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "There are no events", "control-panel": "Events Control Panel", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/gl/error.json b/public/language/gl/error.json index 1c5bc502c1..441b6c3f00 100644 --- a/public/language/gl/error.json +++ b/public/language/gl/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Non podes charlar ata que confirmes o teu correo, por favor pica aquí para confirmalo.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Non podemos confirmar o teu enderezo, por favor téntao de novo máis tarde.", "confirm-email-already-sent": "O correo de confirmación foi enviado, agarda %1 minute(s) para enviar outro.", "sendmail-not-found": "Non se atopa o executable \"sendmail\", por favor, asegúrate de que está instalado no teu sistema e que é accesible polo usuario que executa NodeBB. ", @@ -103,6 +104,7 @@ "already-bookmarked": "Xa marcaches esta mensaxe", "already-unbookmarked": "Xa desmarcaches esta mensaxe", "cant-ban-other-admins": "Non podes botar outros administradores!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Eres o único administrador. Engade outros administradores antes de quitarte a ti mesmo como administrador.", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Retirar privilexios de administrador desta conta antes de intentar borrala", diff --git a/public/language/he/admin/advanced/events.json b/public/language/he/admin/advanced/events.json index 1e8a7c9a9f..4cad4d20e9 100644 --- a/public/language/he/admin/advanced/events.json +++ b/public/language/he/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "אין ארועים", "control-panel": "בקרת ארועים\n ", "delete-events": "מחיקת ארועים", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "מסננים", "filters-apply": "החל מסננים", "filter-type": "סוג אירוע", diff --git a/public/language/he/error.json b/public/language/he/error.json index b93f4c9a23..8582bd93aa 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "אין באפשרותך לשוחח עד שהדוא\"ל שלך יאושר, אנא לחץ כאן כדי לאשר את הדוא\"ל שלך.", "email-not-confirmed-email-sent": "האימייל שלך עדין לא אושר. אנא בדוק בתיבת הדואר בנוגע לאישור האימייל שנשלח לך על ידנו. לא תוכל לכתוב פוסטים ולהשתמש בצ'אט לפני אימות המייל שלך.", "no-email-to-confirm": "בחשבונך לא הוגדר אימייל. כתובת אימייל נחוץ לשחזור חשבון. אנא לחץ כאן כדי להכניס דוא\"ל.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "לא הצלחנו לאשר את הדוא\"ל שלך, תנסה שוב אחר כך", "confirm-email-already-sent": "מייל האישור כבר נשלח, אנא המתן %1 דקות כדי לשלוח מייל נוסף.", "sendmail-not-found": "תוכנת sendmail לא נמצאה, נא בדוק שהיא מותקת וניתנת להרצה על ידי המשתמש שמריץ את NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "כבר הוספת פוסט זה לרשימת המסומנים", "already-unbookmarked": "כבר הסרת פוסט זה מרשימת המסומנים", "cant-ban-other-admins": "אינך יכול לחסום מנהלים אחרים!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "אתה המנהל היחיד. הוסף משתמש אחר לניהול לפני שאתה מוריד את עצמך מניהול", "account-deletion-disabled": "מחיקת החשבון מושבתת", "cant-delete-admin": "משתמש זה מוגדר כמנהל. על מנת למחוק את המשתמש, עליך להסיר קודם את גישותיו.", diff --git a/public/language/hr/admin/advanced/events.json b/public/language/hr/admin/advanced/events.json index 3d741f3d17..f648110f4d 100644 --- a/public/language/hr/admin/advanced/events.json +++ b/public/language/hr/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Nema događaja", "control-panel": "Kontrolna ploča događanja", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/hr/error.json b/public/language/hr/error.json index a95f997f54..d6005b45f4 100644 --- a/public/language/hr/error.json +++ b/public/language/hr/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Ne možete razgovarati dok Vaš email nije potvrđen. Kliknite ovdje da biste potvrdili svoj email.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Nismo u mogućnosti potvrditi Vaš email, pokušajte ponovno kasnije.", "confirm-email-already-sent": "Potvrdni email je poslan, počekajte %1 minuta za ponovni pokušaj.", "sendmail-not-found": "Sendmail nije pronađen, provjerite da li je instaliran?", @@ -103,6 +104,7 @@ "already-bookmarked": "Već ste zabilježili ovu objavu", "already-unbookmarked": "Već ste odbilježili ovu objavu", "cant-ban-other-admins": "Nemožete blokirati ostale administratore!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Vi ste jedini administrator. Dodajte korisnika kao administratora prije nego sebe odjavite kao administratora.", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Ukloni administratorske privilegije sa ovog računa prije brisanja.", diff --git a/public/language/hu/admin/advanced/events.json b/public/language/hu/admin/advanced/events.json index 7dc7fb849b..b824e98cb9 100644 --- a/public/language/hu/admin/advanced/events.json +++ b/public/language/hu/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Nem voltak események", "control-panel": "Esemény vezérlőpult", "delete-events": "Események törlése", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Szűrők", "filters-apply": "Szűrők érvényesítése", "filter-type": "Esemény típus", diff --git a/public/language/hu/error.json b/public/language/hu/error.json index 20ecb8cf9a..7ecd919b5d 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Nem küldhetsz üzenetet amíg nem erősíted meg az email címed, kattints ide az email cím megerősítéséhez!", "email-not-confirmed-email-sent": "Az email címed még nem lett megerősítve, kérlek ellenőrizd az email fiókodba érkező leveleket. Amíg nincs az email címed megerősítve addig nem tudsz üzeneteket küldeni valamint bejegyzést közzé tenni.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Nem tudtuk ellenőrizni az e-mail címedet, kérlek próbálkozz később.", "confirm-email-already-sent": "A megerősítéshez szükséges email már el lett küldve, kérlek várj %1 percet az újraküldéshez.", "sendmail-not-found": "A levél küldés végrehajtása nem található, kérlek bizonyosodj meg róla, hogy telepítve van és végrehajtható a felhasználó által NodeBB-t futtatva.", @@ -103,6 +104,7 @@ "already-bookmarked": "Már elmentetted ezt a hozzászólást a könyvjelzők közé", "already-unbookmarked": "Már eltávolítottad ezt a hozzászólást a könyvjelzők közül", "cant-ban-other-admins": "Nem tilthatsz ki másik adminisztrátort!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Te vagy az egyedüli adminisztrátor. Adj hozzá egy másik felhasználót az adminisztrátori szerepkörhöz, hogy levehesd magadról az adminisztrátori rangot", "account-deletion-disabled": "Fiók törlése ki van kapcsolva", "cant-delete-admin": "Vedd el az adminisztrátori jogokat ettől a fióktól mielőtt törölni szeretnéd.", diff --git a/public/language/id/admin/advanced/events.json b/public/language/id/admin/advanced/events.json index 56d9457971..b2c2033fb5 100644 --- a/public/language/id/admin/advanced/events.json +++ b/public/language/id/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "There are no events", "control-panel": "Events Control Panel", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/id/error.json b/public/language/id/error.json index 3bc6e19b51..43206b24cc 100644 --- a/public/language/id/error.json +++ b/public/language/id/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Kamu tidak dapat ban admin lainnya!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.", diff --git a/public/language/it/admin/advanced/events.json b/public/language/it/admin/advanced/events.json index 062fb122e8..23c3050407 100644 --- a/public/language/it/admin/advanced/events.json +++ b/public/language/it/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Non ci sono eventi", "control-panel": "Pannello di controllo eventi", "delete-events": "Elimina eventi", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filtri", "filters-apply": "Applica filtri", "filter-type": "Tipo evento", diff --git a/public/language/it/error.json b/public/language/it/error.json index c4a2350d94..a0c3a177de 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Non puoi chattare finché non confermi la tua email, per favore clicca qui per confermare la tua email.", "email-not-confirmed-email-sent": "La tua email non è stata ancora confermata, controlla la tua casella di posta per l'email di conferma. Non potrai pubblicare post o chattare fino a quando la tua email non sarà confermata.", "no-email-to-confirm": "Il tuo account non ha un'email impostata. Un'email è necessaria per il recupero dell'account. Clicca qui per inserire un'email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Non abbiamo potuto confermare la tua email, per favore riprovaci più tardi.", "confirm-email-already-sent": "Email di conferma già inviata, per favore attendere %1 minuto(i) per inviarne un'altra.", "sendmail-not-found": "Impossibile trovare l'eseguibile di sendmail, per favore assicurati che sia installato ed eseguibile dall'utente che esegue NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "Hai già aggiunto questa discussione ai preferiti.", "already-unbookmarked": "Hai già rimosso questa discussione dai preferiti", "cant-ban-other-admins": "Non puoi bannare altri amministratori!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Sei l'unico Amministratore. Aggiungi un altro amministratore prima di rimuovere il tuo ruolo", "account-deletion-disabled": "L'eliminazione dell'account è disabilitata", "cant-delete-admin": "Togli i privilegi amministrativi da questo account prima di provare ad eliminarlo.", diff --git a/public/language/ja/admin/advanced/events.json b/public/language/ja/admin/advanced/events.json index 8c0dbd27a7..e149a72c5c 100644 --- a/public/language/ja/admin/advanced/events.json +++ b/public/language/ja/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "イベントがありません", "control-panel": "イベントのコントロールパネル", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/ja/error.json b/public/language/ja/error.json index a59597180b..533414bbb3 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "チャットを行うにはメールアドレスの確認を行う必要があります。メールアドレスを確認するためにはここをクリックしてください。", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "メールアドレスの確認が出来ませんでした。再度お試しください。", "confirm-email-already-sent": "確認のメールは既に送信されています。再度送信するには、%1分後に再度お試しください。", "sendmail-not-found": "Sendmailの実行ファイルが見つかりませんでした。インストールされ、ユーザーによってNodeBBが実行されていることを確認してください。", @@ -103,6 +104,7 @@ "already-bookmarked": "あなたは、この投稿をすでにブックマークしています", "already-unbookmarked": "あなたは、この投稿をすでにブックマークから外しています", "cant-ban-other-admins": "ほかの管理者を停止することはできません!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "あなたが唯一の管理者です。管理者としてあなた自身を削除する前に、管理者として別のユーザーを追加します。", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "削除する前に、このアカウントから管理者権限を削除してください。", diff --git a/public/language/ko/admin/advanced/events.json b/public/language/ko/admin/advanced/events.json index 4db7030eeb..3f96674ed5 100644 --- a/public/language/ko/admin/advanced/events.json +++ b/public/language/ko/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "이벤트가 없습니다", "control-panel": "이벤트 제어판", "delete-events": "이벤트 삭제", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "필터", "filters-apply": "필터 적용", "filter-type": "이벤트 유형", diff --git a/public/language/ko/admin/manage/privileges.json b/public/language/ko/admin/manage/privileges.json index 2bba7566c4..d01ba7c79e 100644 --- a/public/language/ko/admin/manage/privileges.json +++ b/public/language/ko/admin/manage/privileges.json @@ -51,13 +51,13 @@ "alert.saved": "변경된 권한이 적용되었습니다.", "alert.confirm-discard": "권한 변경을 취소하시겠습니까?", "alert.discarded": "권한 변경이 취소되었습니다.", - "alert.confirm-copyToAll": "Are you sure you wish to apply this set of %1 to all categories?", - "alert.confirm-copyToAllGroup": "Are you sure you wish to apply this group's set of %1 to all categories?", - "alert.confirm-copyToChildren": "Are you sure you wish to apply this set of %1 to all descendant (child) categories?", - "alert.confirm-copyToChildrenGroup": "Are you sure you wish to apply this group's set of %1 to all descendant (child) categories?", + "alert.confirm-copyToAll": "%1의 설정을 모든 카테고리에 적용하시겠습니까?", + "alert.confirm-copyToAllGroup": "%1 그룹의 설정을 모든 카테고리에 적용하시겠습니까?", + "alert.confirm-copyToChildren": "%1의 설정을 모든 하위 카테고리에 적용하시겠습니까?", + "alert.confirm-copyToChildrenGroup": "%1 그룹의 설정을 모든 하위 카테고리에 적용하시겠습니까?", "alert.no-undo": "이 행동은 되돌릴 수 없습니다.", "alert.admin-warning": "관리자에게는 절대적인 권한이 부여됩니다.", "alert.copyPrivilegesFrom-title": "복사할 카테고리 설정", - "alert.copyPrivilegesFrom-warning": "%1를 선택한 카테고리에서 복사합니다.", - "alert.copyPrivilegesFromGroup-warning": "This will copy this group's set of %1 from the selected category." + "alert.copyPrivilegesFrom-warning": "이 작업은 %1의 설정을 선택한 카테고리에서 복사합니다.", + "alert.copyPrivilegesFromGroup-warning": "이 작업은 %1 그룹의 설정을 선택한 카테고리에서 복사합니다." } \ No newline at end of file diff --git a/public/language/ko/admin/manage/uploads.json b/public/language/ko/admin/manage/uploads.json index e321e7f567..6a5fcf9282 100644 --- a/public/language/ko/admin/manage/uploads.json +++ b/public/language/ko/admin/manage/uploads.json @@ -6,6 +6,6 @@ "size/filecount": "크기 / 파일 수", "confirm-delete": "이 파일을 정말로 삭제하시겠습니까?", "filecount": "%1 파일", - "new-folder": "New Folder", - "name-new-folder": "Enter a name for new the folder" + "new-folder": "새로운 폴더", + "name-new-folder": "폴더의 이름을 입력해주세요." } \ No newline at end of file diff --git a/public/language/ko/admin/manage/users.json b/public/language/ko/admin/manage/users.json index 656d4f928d..72a99edeb8 100644 --- a/public/language/ko/admin/manage/users.json +++ b/public/language/ko/admin/manage/users.json @@ -1,6 +1,6 @@ { "users": "사용자", - "edit": "Actions", + "edit": "작업", "make-admin": "관리자 등록", "remove-admin": "관리자 해제", "validate-email": "이메일 인증", diff --git a/public/language/ko/admin/settings/email.json b/public/language/ko/admin/settings/email.json index 94e89462f5..27193384da 100644 --- a/public/language/ko/admin/settings/email.json +++ b/public/language/ko/admin/settings/email.json @@ -37,8 +37,8 @@ "subscriptions.hour": "포럼 메일 발송 시간", "subscriptions.hour-help": "정기 포럼 메일을 보낼 시간을 입력해주세요. (예: 0은 자정, 17은 오후 5시 입니다. 이 시간은 서버 시간 기준이며, 사용자의 시스템 시간과 일치하지 않을 수 있습니다.
서버 시간은 입니다.
다음 정기 포럼 메일은 에 발송 예정입니다.", "notifications.remove-images": "이메일 알림에서 이미지 제거", - "require-email-address": "Require new users to specify an email address", - "require-email-address-warning": "By default, users can opt-out of entering an email address. Enabling this option means they have to enter an email address in order to proceed with registration. It does not ensure user will enter a real email address, nor even an address they own.", + "require-email-address": "신규 사용자에게 이메일 주소 설정 요구", + "require-email-address-warning": "기본적으로 사용자들은 이메일 주소 입력을 거부할 수 있습니다. 이 설정을 활성화하면 사용자 등록 시 이메일 주소를 입력해야 진행할 수 있습니다. 하지만 해당 이메일 주소가 유효한 주소인지는 확인하지 않습니다.", "include-unverified-emails": "전자 메일을 명시적으로 확인하지 않은 수신자에게 전자 메일 보내기", "include-unverified-warning": "기본적으로 계정과 연결된 전자 메일이 있는 사용자는 이미 확인되었지만 그렇지 않은 경우가 있습니다(예: SSO 로그인, 약관으로부터 제외된 사용자 등). 사용자가 위험을 감수하고 이 설정을 사용하도록 설정합니다. – 확인되지 않은 주소로 이메일을 보내는 것은 지역별 스팸 방지법을 위반하는 것일 수 있습니다." } \ No newline at end of file diff --git a/public/language/ko/admin/settings/general.json b/public/language/ko/admin/settings/general.json index 8771eb6b3f..18fb9e3145 100644 --- a/public/language/ko/admin/settings/general.json +++ b/public/language/ko/admin/settings/general.json @@ -35,10 +35,10 @@ "maskable-icon.help": "권장 사항: 512x512, PNG 확장자만 가능, 지정되지 않을 경우 터치 아이콘 사용", "outgoing-links": "외부 링크", "outgoing-links.warning-page": "외부 링크 경고페이지 사용", - "search": "Search", - "search-default-in": "Search In", - "search-default-in-quick": "Quick Search In", - "search-default-sort-by": "Sort by", + "search": "검색", + "search-default-in": "범위 검색", + "search-default-in-quick": "빠른 범위 검색", + "search-default-sort-by": "분류", "outgoing-links.whitelist": "경고 창이 필요 없는 외부 링크 도메인 whitelist", "site-colors": "사이트 색상 설정", "theme-color": "테마 색상", diff --git a/public/language/ko/admin/settings/notifications.json b/public/language/ko/admin/settings/notifications.json index 54a7241021..c9a3ebb946 100644 --- a/public/language/ko/admin/settings/notifications.json +++ b/public/language/ko/admin/settings/notifications.json @@ -3,5 +3,5 @@ "welcome-notification": "환영 알림", "welcome-notification-link": "환영 알림 링크", "welcome-notification-uid": "환영 알림 사용자 (UID)", - "post-queue-notification-uid": "Post Queue User (UID)" + "post-queue-notification-uid": "게시 대기 중인 사용자 (UID)" } \ No newline at end of file diff --git a/public/language/ko/admin/settings/post.json b/public/language/ko/admin/settings/post.json index 475c087504..ef7b8ab1c6 100644 --- a/public/language/ko/admin/settings/post.json +++ b/public/language/ko/admin/settings/post.json @@ -56,9 +56,9 @@ "composer.show-help": "\"도움말\" 탭 표시", "composer.enable-plugin-help": "플러그인의 도움말 탭 내용 추가 허용", "composer.custom-help": "사용자 정의 \"도움말\" 텍스트", - "backlinks": "Backlinks", - "backlinks.enabled": "Enable topic backlinks", - "backlinks.help": "If a post references another topic, a link back to the post will be inserted into the referenced topic at that point in time.", + "backlinks": "역링크", + "backlinks.enabled": "화제 역링크 활성화", + "backlinks.help": "포스트가 다른 화제를 참조할 경우 참조한 화제에 해당 포스트의 역링크가 표시됩니다.", "ip-tracking": "IP 추적", "ip-tracking.each-post": "모든 포스트 IP 추적", "enable-post-history": "게시글 편집 기록 활성화" diff --git a/public/language/ko/email.json b/public/language/ko/email.json index 9c910ac944..c4a36ab099 100644 --- a/public/language/ko/email.json +++ b/public/language/ko/email.json @@ -7,7 +7,7 @@ "greeting_with_name": "안녕하세요 %1님", "email.verify-your-email.subject": "사용자의 이메일을 인증해주세요.", "email.verify.text1": "이메일 주소 변경 또는 확인을 요청했습니다.", - "email.verify.text2": "For security purposes, we only change or confirm the email address on file once its ownership has been confirmed via email. If you did not request this, no action is required on your part.", + "email.verify.text2": "보안을 위해 이메일이 인증되어야만 변경이 가능합니다. 요청을 하지 않은 경우 사용자 측에서 수행할 작업이 없습니다.", "email.verify.text3": "이 전자 메일 주소를 확인하면 현재 전자 메일 주소를 %1로 바꿉니다.", "welcome.text1": "%1님 가입해주셔서 감사합니다.", "welcome.text2": "계정을 활성화하려면 등록한 메일 주소의 인증이 필요합니다.", diff --git a/public/language/ko/error.json b/public/language/ko/error.json index df2d9b2cf5..9eab7dcfbf 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "아직 이메일이 인증되지 않아 채팅 기능을 사용할 수 없습니다. 여기를 눌러 이메일 인증을 진행하세요.", "email-not-confirmed-email-sent": "이메일 인증이 완료되지 않았습니다. 수신함에서 인증 메일을 확인해주세요. 인증이 완료되기 전까지는 글을 작성하거나 채팅 참여가 불가능합니다.", "no-email-to-confirm": "계정에 전자 메일 설정이 없습니다. 계정 복구를 위해 이메일이 필요합니다. 이메일을 입력하려면 여기를 클릭하십시오.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "이메일 인증이 실패하였습니다. 잠시 후에 다시 시도하세요.", "confirm-email-already-sent": "인증 메일이 이미 발송되었습니다. 다시 보내려면 %1분을 기다리세요.", "sendmail-not-found": "Sendmail 실행파일을 찾을 수 없었습니다. 관리자가 sendmail을 설치했고 실행이 가능한 상태인지 확인해 주시기 바랍니다.", @@ -103,6 +104,7 @@ "already-bookmarked": "이미 즐겨찾기에 추가한 포스트 입니다.", "already-unbookmarked": "이미 즐겨찾기를 해제한 포스트 입니다.", "cant-ban-other-admins": "다른 관리자를 차단할 수 없습니다!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "당신은 유일한 관리자입니다. 관리자를 그만두기 전에 다른 사용자를 관리자로 임명하세요.", "account-deletion-disabled": "계정 삭제 기능이 비활성화 상태입니다.", "cant-delete-admin": "해당 계정을 삭제하기 전에 관리자 권한을 해제해주십시오.", diff --git a/public/language/ko/register.json b/public/language/ko/register.json index 0c6547f61f..f9249dfbb5 100644 --- a/public/language/ko/register.json +++ b/public/language/ko/register.json @@ -20,9 +20,9 @@ "registration-added-to-queue": "회원가입이 요청되었습니다. 관리자의 승인 후 메일이 발송됩니다.", "registration-queue-average-time": "가입 승인에는 평균적으로 %1시간 %2분이 소요됩니다.", "registration-queue-auto-approve-time": "%1시간 내로 이 포럼에서 사용자의 계정이 완전히 활성화될 예정입니다.", - "interstitial.intro": "We'd like some additional information in order to update your account…", - "interstitial.intro-new": "We'd like some additional information before we can create your account…", - "interstitial.errors-found": "Please review the entered information:", + "interstitial.intro": "계정 정보를 수정하기 전 추가 정보가 필요합니다.", + "interstitial.intro-new": "계정을 생성하기 전 추가 정보가 필요합니다.", + "interstitial.errors-found": "입력한 정보를 다시 확인해주세요.", "gdpr_agree_data": "나는 이 웹사이트에서 개인 정보를 수집하고 처리하는데 동의합니다.", "gdpr_agree_email": "나는 이 웹사이트에서 포럼 메일 및 알림 메일을 수신하는데 동의합니다.", "gdpr_consent_denied": "사용자는 이 사이트가 사용자의 정보를 수집/처리하고 이메일을 보내는 것에 동의해야 합니다.", diff --git a/public/language/ko/topic.json b/public/language/ko/topic.json index 15ceccc2cc..eeadcc5374 100644 --- a/public/language/ko/topic.json +++ b/public/language/ko/topic.json @@ -47,7 +47,7 @@ "restored-by": "복원한 사용자:", "moved-from-by": "%1에서 이동됨 -", "queued-by": "게시 승인 대기 중 →", - "backlink": "참고 -", + "backlink": "참조 -", "bookmark_instructions": "이 쓰레드에서 읽은 마지막 포스트로 이동하려면 여기를 클릭 하세요.", "flag-post": "해당 포스트 신고", "flag-user": "해당 유저 신고", diff --git a/public/language/lt/admin/advanced/events.json b/public/language/lt/admin/advanced/events.json index 56d9457971..b2c2033fb5 100644 --- a/public/language/lt/admin/advanced/events.json +++ b/public/language/lt/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "There are no events", "control-panel": "Events Control Panel", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/lt/error.json b/public/language/lt/error.json index df9b8e9d42..96348d2cbe 100644 --- a/public/language/lt/error.json +++ b/public/language/lt/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Jūs negalite bendrauti, kol jūsų el.paštas nėra patvirtintas, prašome spausti čia kad aktyvuoti jūsų el.paštą", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Negalime patvirtinti jūsų el. adreso, prašom bandyti vėliau.", "confirm-email-already-sent": "Patvirtinimo laiškas išsiųstas, prašome palaukti %1 minute(s) kad išsiųstume kita", "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "Jūs jau turite žymekelį šiam įrašui", "already-unbookmarked": "Jūs jau nuėmėte žymeklį šiam įrašui", "cant-ban-other-admins": "Jūs negalite užblokuoti kitų administratorių!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Jūs esate vienintelis administratorius. Pridėkite kitą vartotoja kaip administratorių prieš pašalindamas save", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Pašalinkite administratoriaus teises šiai paskyrai prieš bandydami ją ištrinti.", diff --git a/public/language/lv/admin/advanced/events.json b/public/language/lv/admin/advanced/events.json index 5168d6544c..2836e7f88e 100644 --- a/public/language/lv/admin/advanced/events.json +++ b/public/language/lv/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Nav notikumu", "control-panel": "Notikumu vadības panelis", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/lv/error.json b/public/language/lv/error.json index b198b0273b..0438ecc513 100644 --- a/public/language/lv/error.json +++ b/public/language/lv/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Nevar sarunāties, kamēr Tava e-pasta adrese netiek apstiprināta, lūdzu, noklikšķini, lai apstiprinātu savu e-pasta adresi.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Mēs nevarējām apstiprināt Tavu e-pasta adresi, lūdzu, vēlāk mēģini vēlreiz.", "confirm-email-already-sent": "Apstiprinājuma e-pasts ir jau nosūtīts, lūdzu, uzgaidi %1 minūti(-es), lai nosūtītu vēl vienu.", "sendmail-not-found": "Sendmail programmu nevarēja atrast, lūdzu, pārliecinies, ka lietotājs, kas darbojas ar NodeBB, ir to instalējis un izdarījis palaižamu.", @@ -103,6 +104,7 @@ "already-bookmarked": "Tu jau esi atzīmējis šo rakstu ar grāmatzīmi", "already-unbookmarked": "Tu jau esi noņēmis grāmatzīmi no šī raksta", "cant-ban-other-admins": "Nevar bloķēt citus administratorus!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Tu esi vienīgais administrators. Pievieno vēl vienu lietotāju kā administratoru, pirms noņemi sevi kā administratoru", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Noņemi administratora tiesības no šī konta, pirms mēģināt to izdzēst.", diff --git a/public/language/ms/admin/advanced/events.json b/public/language/ms/admin/advanced/events.json index 56d9457971..b2c2033fb5 100644 --- a/public/language/ms/admin/advanced/events.json +++ b/public/language/ms/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "There are no events", "control-panel": "Events Control Panel", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/ms/error.json b/public/language/ms/error.json index f436510c21..b098e9be5a 100644 --- a/public/language/ms/error.json +++ b/public/language/ms/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Anda tidak dibenarkan sembang sehingga emel disahkan, sila sahkan emel anda.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Kami tidak dapat memastikan emel anda, sila cuba lagi nanti", "confirm-email-already-sent": "Pengesahan emel telah dihantar, sila tunggu %1 minit() untuk menghantar yang baru.", "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Anda tidak boleh haramkan admin / pentadbir!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Anda satu-satunya pentadbir. Tambah pentadbir lain sebelum membuang diri anda sebagai pentadbir", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.", diff --git a/public/language/nb/admin/advanced/events.json b/public/language/nb/admin/advanced/events.json index 56d9457971..b2c2033fb5 100644 --- a/public/language/nb/admin/advanced/events.json +++ b/public/language/nb/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "There are no events", "control-panel": "Events Control Panel", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/nb/error.json b/public/language/nb/error.json index b8ad0e3b4c..15aecf60bb 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Du kan ikke chatte før e-posten din er bekreftet, vennligst klikk her for å bekrefte e-postadressen.", "email-not-confirmed-email-sent": "Din e-post har enda ikke blitt bekreftet, vennligst sjekk innboksen din for bekreftelsesmailen. Du har ikke tilgang til å skrive innlegg eller chatte før e-posten din er bekreftet.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Vi kunne ikke bekrefte e-posten din, vennligst prøv igjen senere.", "confirm-email-already-sent": "E-post for bekreftelse er allerede sendt, vennligst vent %1 minutt(er) for å sende en til.", "sendmail-not-found": "Funksjonaliteten \"sendmail\" ble ikke funnet, vennligst sjekk at den er installert og kjørbar av brukeren som kjører NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "Du har allerede bokmerket dette innlegget", "already-unbookmarked": "Du har allerede fjernet bokmerket fra dette innlegget", "cant-ban-other-admins": "Du kan ikke utestenge andre administratorer!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Du er den eneste administratoren. Legg til en annen bruker som administrator før du fjerner deg selv.", "account-deletion-disabled": "Kontosletting er deaktivert", "cant-delete-admin": "Fjern administratorrettigheter fra denne kontoen før du prøver å slette den.", diff --git a/public/language/nl/admin/advanced/events.json b/public/language/nl/admin/advanced/events.json index 3ec8d7f418..79eb67d04a 100644 --- a/public/language/nl/admin/advanced/events.json +++ b/public/language/nl/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Er zijn geen events", "control-panel": "Events Controlepaneel", "delete-events": "Verwijder eventen", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/nl/error.json b/public/language/nl/error.json index 79b8e2d3d8..4a59172cd9 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Het gebruik van chatfunctionaliteit is pas toegestaan na validatie van het e-mailadres.", "email-not-confirmed-email-sent": "Je e-mailadres is nog niet bevestigd, kijk of je de bevestigingsmail hebt ontvangen. Tot je e-mailadres is bevestigd kun je geen berichten plaatsen of aan chats deelnemen.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "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.", "sendmail-not-found": "De sendmail executable kon niet worden gevonden, zorg ervoor dat deze is geïnstalleerd en dat de gebruiker die NodeBB draait deze kan uitvoeren.", @@ -103,6 +104,7 @@ "already-bookmarked": "Je hebt dit bericht al als favoriet toegevoegd", "already-unbookmarked": "Je hebt dit bericht al verwijderd uit je favorieten", "cant-ban-other-admins": "Het is niet toegestaan andere beheerders te verbannen!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Je bent de enige beheerder. Stel eerst een andere gebruiker als beheerder in voordat je jezelf geen beheerder meer maakt.", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Verwijder administratieve rechten van dit account voordat je probeert deze te verwijderen", diff --git a/public/language/pl/admin/advanced/events.json b/public/language/pl/admin/advanced/events.json index 02df129699..e89073f210 100644 --- a/public/language/pl/admin/advanced/events.json +++ b/public/language/pl/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Brak zdarzeń", "control-panel": "Panel zdarzeń", "delete-events": "Usuń zdarzenia", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filtry", "filters-apply": "Zatwierdź filtry", "filter-type": "Typ zdarzenia", diff --git a/public/language/pl/error.json b/public/language/pl/error.json index 80b378c88c..e43f252e9e 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Nie możesz prowadzić rozmów, dopóki twój email nie zostanie potwierdzony. Kliknij tutaj, aby potwierdzić swój email.", "email-not-confirmed-email-sent": "Twój e-mail nie został jeszcze potwierdzony, sprawdź swoją skrzynkę pocztową, aby znaleźć e-mail z potwierdzeniem. Nie będziesz mógł dodawać postów ani czatować, dopóki Twój adres e-mail nie zostanie potwierdzony.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Nie byliśmy w stanie potwierdzić Twojego adresu e-mail. Spróbuj później.", "confirm-email-already-sent": "Email potwierdzający został już wysłany, proszę odczekaj jeszcze %1 minut(y), aby wysłać kolejny.", "sendmail-not-found": "Program sendmail nie został znaleziony, proszę upewnij się, że jest zainstalowany i możliwy do uruchomienia przez użytkownika uruchamiającego NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "Już dodałeś ten post do zakładek", "already-unbookmarked": "Już usunąłeś ten post z zakładek", "cant-ban-other-admins": "Nie możesz zbanować innych adminów!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Jesteś jedynym administratorem. Dodaj innego użytkownika jako administratora przed usunięciem siebie z tej grupy", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Usuń uprawnienia administratora z tego konta przed próbą jego usunięcia.", diff --git a/public/language/pt-BR/admin/advanced/events.json b/public/language/pt-BR/admin/advanced/events.json index a03335b8ef..6a6aa9b69d 100644 --- a/public/language/pt-BR/admin/advanced/events.json +++ b/public/language/pt-BR/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Não há eventos", "control-panel": "Painel de Controle de Eventos", "delete-events": "Excluir Eventos", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filtros", "filters-apply": "Aplicar Filtros", "filter-type": "Tipo de Evento", diff --git a/public/language/pt-BR/error.json b/public/language/pt-BR/error.json index 42bd09c915..cf339b56fb 100644 --- a/public/language/pt-BR/error.json +++ b/public/language/pt-BR/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Você não está habilitado a conversar até que seu email seja confirmado, por favor clique aqui para confirmar seu email.", "email-not-confirmed-email-sent": "Seu e-mail ainda não foi confirmado, verifique sua caixa de entrada para o e-mail de confirmação. Você não poderá postar ou usar o chat até que seu e-mail seja confirmado.", "no-email-to-confirm": "Sua conta não tem um email definido. Um email é necessário para recuperação de conta. Clique aqui para definir um email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Nós não pudemos confirmar seu email, por gentileza tente novamente mais tarde.", "confirm-email-already-sent": "O email de confirmação já foi enviado, por favor aguarde %1 minuto(s) para enviar outro.", "sendmail-not-found": "O executável do sendmail não pôde ser encontrado. Por favor, certifique-se de que ele está instalado e que está autorizado a ser executado pelo usuário que roda o NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "Você já adicionou este post aos favoritos", "already-unbookmarked": "Você já removeu este post dos favoritos", "cant-ban-other-admins": "Você não pode banir outros administradores!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Você é o único administrador. Adicione outro usuário como administrador antes de remover a si mesmo como admin", "account-deletion-disabled": "A exclusão de conta está desabilitada", "cant-delete-admin": "Remova os privilégios de administrador dessa conta antes de tentar excluí-la.", diff --git a/public/language/pt-PT/admin/advanced/events.json b/public/language/pt-PT/admin/advanced/events.json index 567cd6d09b..3063f1dbc2 100644 --- a/public/language/pt-PT/admin/advanced/events.json +++ b/public/language/pt-PT/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Não existem eventos", "control-panel": "Painel de Controlo de Eventos", "delete-events": "Apagar Eventos", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filtros", "filters-apply": "Aplicar Filtros", "filter-type": "Tipo de Evento", diff --git a/public/language/pt-PT/error.json b/public/language/pt-PT/error.json index 3c960870db..7b9fb823cc 100644 --- a/public/language/pt-PT/error.json +++ b/public/language/pt-PT/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Não podes utilizar o chat enquanto não confirmares o teu e-mail, por favor clica aqui para confirmares o teu e-mail.", "email-not-confirmed-email-sent": "O teu e-mail ainda não foi confirmado, por favor verifica a tua caixa de entrada para obteres o e-mail de confirmação. Não poderás publicar ou conversar até que o teu e-mail seja confirmado.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Não conseguimos confirmar o teu e-mail, por favor tenta mais tarde.", "confirm-email-already-sent": "O e-mail de confirmação já foi enviado, por favor espera %1 minuto(s) para enviares outro.", "sendmail-not-found": "O executável sendmail não foi encontrado, por favor assegura-te que se encontra instalado e executável pelo utilizador a correr o NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "Já marcaste esta publicação", "already-unbookmarked": "Já desmarcaste esta publicação", "cant-ban-other-admins": "Não podes banir outros administradores!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "És o único administrador. Adicionar outro utilizador como administrador antes de te removeres como administrador.", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Remove os privilégios de administrador desta conta antes de tentares apagá-la.", diff --git a/public/language/ro/admin/advanced/events.json b/public/language/ro/admin/advanced/events.json index 56d9457971..b2c2033fb5 100644 --- a/public/language/ro/admin/advanced/events.json +++ b/public/language/ro/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "There are no events", "control-panel": "Events Control Panel", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/ro/error.json b/public/language/ro/error.json index ab5ba55acd..41ca4cd6dd 100644 --- a/public/language/ro/error.json +++ b/public/language/ro/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Nu vei putea trimite mesaje daca email-ul tau nu e confirmat, click aici sa il confirmi.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Mail-ul tau nu a putut fi confirmat, te rog incearca mai tarziu.", "confirm-email-already-sent": "Email-ul de confirmare ti-a fost trimis, asteapta te rog %1 minut(e) ca sa trimiti inca unul.", "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Nu poți bana alți administratori!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.", diff --git a/public/language/ru/admin/advanced/events.json b/public/language/ru/admin/advanced/events.json index ffa09e2b83..a1647e7c6b 100644 --- a/public/language/ru/admin/advanced/events.json +++ b/public/language/ru/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Нет событий", "control-panel": "Панель управления событиями", "delete-events": "Удалить события", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Фильтр", "filters-apply": "Применить фильтр", "filter-type": "Тип события", diff --git a/public/language/ru/error.json b/public/language/ru/error.json index 63b9b3f179..64d72ba958 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Вы не можете оставлять сообщения, пока ваша электронная почта не подтверждена. Отправить письмо с кодом подтверждения повторно.", "email-not-confirmed-email-sent": "Ваш адрес электронной почты ещё не подтверждён. Пожалуйста, проверьте ваш почтовый ящик и пройдите по ссылке в письме с кодом подтверждения. Пока ваш e-mail не подтверждён, вы не можете пользоваться чатом или публиковать сообщения.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "По техническим причинам мы не можем подтвердить ваш адрес электронной почты. Приносим вам наши извинения, пожалуйста, попробуйте позже.", "confirm-email-already-sent": "Сообщение для подтверждения регистрации уже выслано на ваш адрес электронной почты. Повторная отправка возможна через %1 мин.", "sendmail-not-found": "Не можем найти sendmail, убедитесь что он установлен и управляется NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "Вы уже добавили это сообщение в закладки", "already-unbookmarked": "Вы уже удалили это сообщение из закладок", "cant-ban-other-admins": "Вы не можете заблокировать других администраторов!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Вы единственный администратор. Чтобы отказаться от своих полномочий, пожалуйста, назначьте администратором другого участника.", "account-deletion-disabled": "Удаление аккаунта отключено", "cant-delete-admin": "Чтобы удалить эту учётную запись, сначала надо снять с неё полномочия администратора.", diff --git a/public/language/rw/admin/advanced/events.json b/public/language/rw/admin/advanced/events.json index 56d9457971..b2c2033fb5 100644 --- a/public/language/rw/admin/advanced/events.json +++ b/public/language/rw/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "There are no events", "control-panel": "Events Control Panel", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/rw/error.json b/public/language/rw/error.json index 7b9d56fc4e..616831f5cd 100644 --- a/public/language/rw/error.json +++ b/public/language/rw/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Ntabwo uremererwa kuganirira mu gikari kuko email yawe itari yemezwa. Kanda hano kugirango wemeze email yawe. ", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Ntabwo email yawe yabashije kwemezwa. Ongera ugerageze mu bundi buryo. ", "confirm-email-already-sent": "Email yo kwemeza yamaze koherezwa. Tegereza iminota (umunota) %1 mbere yo kohereza indi. ", "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Ntabwo wakwirukana abandi bayobozi!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Ni wowe muyobozi wenyine. Ongeramo undi muntu nk'umuyobozi mbere y'uko wikura ku buyobozi", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.", diff --git a/public/language/sc/admin/advanced/events.json b/public/language/sc/admin/advanced/events.json index 56d9457971..b2c2033fb5 100644 --- a/public/language/sc/admin/advanced/events.json +++ b/public/language/sc/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "There are no events", "control-panel": "Events Control Panel", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/sc/error.json b/public/language/sc/error.json index b806ec9367..55f49fe028 100644 --- a/public/language/sc/error.json +++ b/public/language/sc/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "We could not confirm your email, please try again later.", "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "You can't ban other admins!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.", diff --git a/public/language/sk/admin/advanced/events.json b/public/language/sk/admin/advanced/events.json index 4e1313ab92..7f68cdf8bf 100644 --- a/public/language/sk/admin/advanced/events.json +++ b/public/language/sk/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Žiadne nové udalosti", "control-panel": "Ovládací panel udalostí", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/sk/error.json b/public/language/sk/error.json index a8e8e29498..d757b9ca06 100644 --- a/public/language/sk/error.json +++ b/public/language/sk/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Nemôžete vytvoriť konverzáciu pokiaľ Váš e-mail nebude overený. Prosím kliknite sem, pre overenie Vášho e-mailu.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Momentálne nemôžeme overiť Váš e-mail, prosím zopakujte to neskôr.", "confirm-email-already-sent": "Overovací e-mail už bol odoslaný. Prosím počkajte %1 minút(y) k odoslaniu ďalšieho.", "sendmail-not-found": "Odoslaný spúšťač nebol nájdený, prosím uistite sa že je nainštalovaný a spustiteľný užívateľom používajúcim NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "Tento príspevok máte už medzi záložkami", "already-unbookmarked": "Tento príspevok už nemáte medzi záložkami", "cant-ban-other-admins": "Nemôžte zablokovať iných správcov.", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Momentálne ste jediný správca. Najskôr pridajte ďalšieho užívateľa za správcu predtým, ako zrušíte svoje výsady správcu", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Odobrať oprávnenie správcu z tohto účtu pred pokusom ho odstrániť.", diff --git a/public/language/sl/admin/advanced/events.json b/public/language/sl/admin/advanced/events.json index 2d24611e2b..1b5a03dc18 100644 --- a/public/language/sl/admin/advanced/events.json +++ b/public/language/sl/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Ni dogodkov", "control-panel": "Nadzorna plošča za dogodke", "delete-events": "Izbriši dogodke", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filtri", "filters-apply": "Uveljavi filtre", "filter-type": "Tip dogodka", diff --git a/public/language/sl/error.json b/public/language/sl/error.json index ff9b1be6a6..eaccb961dd 100644 --- a/public/language/sl/error.json +++ b/public/language/sl/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Ne morete klepetati, dokler ne potrdite svojega e-poštnega naslova. Prosimo, kliknite tu za potrditev e-poštnega naslova.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Potrditev vašega e-poštnega naslova ni uspela. Prosimo, poskusite ponovno pozneje.", "confirm-email-already-sent": "Potrditveno e-sporočilo je že bilo poslano. Prosimo, počakajte %1 min za ponovno pošiljanje.", "sendmail-not-found": "Ne najdem izvršljive datoteke za pošiljanje e-pošte. Prepričajte se, da je ta nameščena in izvršljiva prek uporabnika, ki izvaja NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "You have already bookmarked this post", "already-unbookmarked": "You have already unbookmarked this post", "cant-ban-other-admins": "Ne morete izločati drugih skrbnikov!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Ste edini skrbnik. Preden se odstranite, dodajte novega skrbnika.", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Pred brisanjem tega računa morate odstraniti skrbniške pravice.", diff --git a/public/language/sr/admin/advanced/events.json b/public/language/sr/admin/advanced/events.json index 56d9457971..b2c2033fb5 100644 --- a/public/language/sr/admin/advanced/events.json +++ b/public/language/sr/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "There are no events", "control-panel": "Events Control Panel", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/sr/error.json b/public/language/sr/error.json index b07e597d71..891461b2d3 100644 --- a/public/language/sr/error.json +++ b/public/language/sr/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Није вам дозвољено да ћаскате док не потврдите вашу е-пошту, кликните овде да то учините.", "email-not-confirmed-email-sent": "Ваша е-пошта још увек није потврђена, проверите ваше пријемно сандуче. Неће вам бити дозвољено да шаљете поруке или ћаскате док не потврдите е-пошту.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Потврда е-поште није успела, молимо вас да покушате касније.", "confirm-email-already-sent": "Е-порука за потврду је већ послата, молимо вас да сачекате %1 минут(а) да бисте послали други.", "sendmail-not-found": "Програм за слање поште није пронађен, проверите да ли је инсталиран и покренут од стране корисника NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "Већ сте додали ову поруку у обележиваче", "already-unbookmarked": "Већ сте одстранили ову поруку из обележивача", "cant-ban-other-admins": "Не можете забранити друге администраторе!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Ви сте једини администратор. Додајте другог корисника као администратора пре него што уклоните себе као администратора.", "account-deletion-disabled": "Брисање налога је онемогућено", "cant-delete-admin": "Уклоните администраторске привилегије овом налогу пре него што покушате да га избришете.", diff --git a/public/language/sv/admin/advanced/events.json b/public/language/sv/admin/advanced/events.json index 56d9457971..b2c2033fb5 100644 --- a/public/language/sv/admin/advanced/events.json +++ b/public/language/sv/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "There are no events", "control-panel": "Events Control Panel", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/sv/error.json b/public/language/sv/error.json index f109a020bf..5ca430b175 100644 --- a/public/language/sv/error.json +++ b/public/language/sv/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Du kan ej använda chatten förrän din epostadress har blivit bekräftad, var god klicka här för att bekräfta din epostadress.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Vi kunde ej bekräfta din epostadress, var god försök igen senare.", "confirm-email-already-sent": "Bekräftningsbrev redan skickat, var god vänta %1 minut(er) innan du skickar ett nytt.", "sendmail-not-found": "Kunde inte hitta Sendmail, vänligen se till att den är installerad och får köras av den användare som kör NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "Du har redan bokmärkt det här inlägget", "already-unbookmarked": "Du har redan tagit bort bokmärket för det här inlägget", "cant-ban-other-admins": "Du kan inte bannlysa andra administratörer!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Du är den enda administratören. Lägg till en annan användare som administratör innan du tar bort dig själv.", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Ta bort administratörsbehörighet från detta konto innan du försöker ta bort den.", diff --git a/public/language/th/admin/advanced/events.json b/public/language/th/admin/advanced/events.json index d37ba45659..1cd0c87bb1 100644 --- a/public/language/th/admin/advanced/events.json +++ b/public/language/th/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "ไม่มีอีเวนท์", "control-panel": "แผงควบคุมอีเวนท์", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/th/error.json b/public/language/th/error.json index e7537f01dd..7289c2f21d 100644 --- a/public/language/th/error.json +++ b/public/language/th/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "คุณไม่สามารถแชทได้จนกว่าอีเมล์ของคุณจะได้รับการยืนยัน กรุณาคลิกที่นี่เพื่อยืนยันอีกมเมล์ของคุณ", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "เราไม่สามารถยืนยันอีเมลของคุณ ณ ขณะนี้ กรุณาลองใหม่อีกครั้งภายหลัง", "confirm-email-already-sent": "อีเมล์ยืนยันตัวตนถูกส่งไปยังคุณเรียบร้อยแล้ว กรุณารอ %1 นาที(s) ก่อนการตัดสินใจส่งอีกครั้ง", "sendmail-not-found": "ไม่พบการประมวลผลสำหรับการส่งอีเมล์ กรุณาตรวจสอบให้แน่ใจว่าได้มีการติดตั้งโปรแกรมการประมวลผลแล้วโดยผู้ใช้ที่กำลังใช้ NodeBB", @@ -103,6 +104,7 @@ "already-bookmarked": "คุณได้ติดบุ๊กมาร์คของโพสต์นี้แล้ว", "already-unbookmarked": "คุณได้ลบบุ๊กมาร์คของโพสต์นี้แล้ว", "cant-ban-other-admins": "คุณแบนแอดมินไม่ได้!!!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "คุณเป็นแอดมินเพียงคนเดียว กรุณาเพิ่มผู้ใช้คนอื่นเป็นแอดมิน ก่อนการลบตัวเองออกจากแอดมิน", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "ลบสิทธิพิเศษของแอดมินจากบัญชีผู้ใช้นี้ ก่อนทำการลบ", diff --git a/public/language/tr/admin/advanced/events.json b/public/language/tr/admin/advanced/events.json index 6f42b7c4d2..aebc5bd0da 100644 --- a/public/language/tr/admin/advanced/events.json +++ b/public/language/tr/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Aktivite yok", "control-panel": "Aktivite Kontrol Paneli", "delete-events": "Aktiviteyi Sil", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filtreler", "filters-apply": "Filtreleri Uygula", "filter-type": "Aktivite türü", diff --git a/public/language/tr/error.json b/public/language/tr/error.json index 18fea0e934..16c0dbc55b 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "E-postanız onaylanana kadar sohbet edemezsiniz, onaylamak için lütfen buraya tıklayın.", "email-not-confirmed-email-sent": "E-posta adresiniz henüz onaylanmamış, lütfen onay e-postası için gelen kutunuzu kontrol ediniz. E-posta adresinizi onaylayana kadar foruma ileti gönderemeyeceksiniz veya sohbet edemeyeceksiniz!", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "E-posta adresinizi doğrulayamıyoruz. Lütfen daha sonra tekrar deneyin.", "confirm-email-already-sent": "E-posta onayı zaten gönderilmiş, yeni bir onay göndermek için lütfen %1 dakika bekleyin.", "sendmail-not-found": "Sendmail yürütülemedi, lüften indirildiğinden ve NodeBB kullanıcısı tarafından uygulanabilir olduğundan emin olun.", @@ -103,6 +104,7 @@ "already-bookmarked": "Bu iletiyi yer imine ekledin", "already-unbookmarked": "Bu iletiyi yer iminden çıkardın", "cant-ban-other-admins": "Başka yöneticileri yasaklayamazsınız!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Tek yönetici sizsiniz. Kendinizi adminlikten çıkarmadan önce başka bir kullanıcıyı admin olarak ekleyiniz", "account-deletion-disabled": "Hesap silme devre dışı bırakılmış", "cant-delete-admin": "Öncelikle yönetici izinlerini kaldırman gerekiyor.", diff --git a/public/language/uk/admin/advanced/events.json b/public/language/uk/admin/advanced/events.json index 5298722da0..997d177a47 100644 --- a/public/language/uk/admin/advanced/events.json +++ b/public/language/uk/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Подій немає", "control-panel": "Панель керування подіями", "delete-events": "Delete Events", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "Filters", "filters-apply": "Apply Filters", "filter-type": "Event Type", diff --git a/public/language/uk/error.json b/public/language/uk/error.json index c70a32ab1e..3f4df7de8f 100644 --- a/public/language/uk/error.json +++ b/public/language/uk/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Ви не можете користуватися чатом поки ваша електронна пошта не буде підтверджена, натисніть тут, щоб це зробити.", "email-not-confirmed-email-sent": "Ваша електронна адреса ще не була підтверджена, будь-ласка перевірте свою поштову скриньку. Ви не зможете постити або чатитись до того як ваш емейл підтверджено.", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "Ми не можемо підтвердити вашу електронну пошту, будь ласка, спробуйте пізніше.", "confirm-email-already-sent": "Підтвердження по електронній пошті вже було надіслано, зачекайте, будь ласка, %1 хвилин(и), щоб відправити ще одне. ", "sendmail-not-found": "Виконуваний файл sendmail не знайдено, переконайтесь, будь ласка, що його встановлено та що він виконується власником процесу NodeBB.", @@ -103,6 +104,7 @@ "already-bookmarked": "Ви вже додали цей пост собі в закладки", "already-unbookmarked": "Ви вже видалили цей пост із закладок", "cant-ban-other-admins": "Ви не можете банити інших адмінів!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "Ви єдиний адміністратор. Додайте іншого користувача в якості адміністратора перш ніж знімати з себе ці обов'язки.", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "Зніміть обов'язки адміністратора з цього акаунту перш ніж видаляти його.", diff --git a/public/language/vi/admin/advanced/events.json b/public/language/vi/admin/advanced/events.json index f51fd591d0..1ac68d471b 100644 --- a/public/language/vi/admin/advanced/events.json +++ b/public/language/vi/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "Không có sự kiện", "control-panel": "Bảng Điều Khiển Sự Kiện", "delete-events": "Xóa Sự Kiện", + "confirm-delete-all-events": "Bạn có chắc chắn muốn xóa tất cả các sự kiện đã ghi không?", "filters": "Bộ lọc", "filters-apply": "Áp Dụng Bộ Lọc", "filter-type": "Loại Sự Kiện", diff --git a/public/language/vi/admin/settings/notifications.json b/public/language/vi/admin/settings/notifications.json index 76e4a8a1dc..c7055b3c21 100644 --- a/public/language/vi/admin/settings/notifications.json +++ b/public/language/vi/admin/settings/notifications.json @@ -3,5 +3,5 @@ "welcome-notification": "Thông Báo Chào Mừng", "welcome-notification-link": "Liên Kết Thông Báo Chào Mừng", "welcome-notification-uid": "Thông Báo Chào Mừng Người Dùng (UID)", - "post-queue-notification-uid": "Post Queue User (UID)" + "post-queue-notification-uid": "Hàng Đợi Người Dùng Đăng Bài (UID)" } \ No newline at end of file diff --git a/public/language/vi/error.json b/public/language/vi/error.json index 48d63b3474..caf3958071 100644 --- a/public/language/vi/error.json +++ b/public/language/vi/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "Bạn không thể trò chuyện cho đến khi email của bạn được xác nhận, vui lòng nhấp vào đây để xác nhận email của bạn.", "email-not-confirmed-email-sent": "Email của bạn vẫn chưa được xác nhận, vui lòng kiểm tra hộp thư đến của bạn. Bạn sẽ không thể đăng hoặc trò chuyện cho đến khi email được xác nhận.", "no-email-to-confirm": "Tài khoản của bạn không có email. Email là cần thiết để khôi phục tài khoản. Vui lòng bấm vào đây để nhập email.", + "user-doesnt-have-email": "Người dùng \"%1\" chưa đặt email.", "email-confirm-failed": "Chúng tôi không thể xác nhận email của bạn, vui lòng thử lại sau.", "confirm-email-already-sent": "Email xác nhận đã được gửi, vui lòng chờ %1 phút để yêu cầu gửi lại.", "sendmail-not-found": "Không tìm thấy lệnh thực thi \"sendmail\", hãy chắc chắn nó đã được cài đặt và thực thi bởi người quản trị đang vận hành NodeBB", @@ -103,6 +104,7 @@ "already-bookmarked": "Bạn đã đánh dấu trang chủ đề này rồi", "already-unbookmarked": "Bạn đã hủy đánh dấu trang chủ đề này rồi", "cant-ban-other-admins": "Bạn không thể cấm quản trị viên khác!", + "cant-make-banned-users-admin": "Bạn không thể đặt người dùng bị cấm làm quản trị viên.", "cant-remove-last-admin": "Bạn là quản trị viên duy nhất. Hãy cho thành viên khác làm quản trị viên trước khi huỷ bỏ quyền quản trị của bạn.", "account-deletion-disabled": "Tính năng xóa tài khoản đã bị tắt", "cant-delete-admin": "Gỡ bỏ đặc quyền quản trị viên khỏi tài khoản này trước khi cố gắng xóa nó.", diff --git a/public/language/vi/modules.json b/public/language/vi/modules.json index 86b2e7342e..5f910b23b1 100644 --- a/public/language/vi/modules.json +++ b/public/language/vi/modules.json @@ -54,7 +54,7 @@ "composer.formatting.strikethrough": "Gạch ngang", "composer.formatting.code": "Mã", "composer.formatting.link": "Liên kết", - "composer.formatting.picture": "Image Link", + "composer.formatting.picture": "Liên Kết Ảnh", "composer.upload-picture": "Tải ảnh lên", "composer.upload-file": "Tải Lên Tệp", "composer.zen_mode": "Chế Độ Zen", diff --git a/public/language/zh-CN/admin/advanced/events.json b/public/language/zh-CN/admin/advanced/events.json index 48ba6e3a6f..e49a2510fe 100644 --- a/public/language/zh-CN/admin/advanced/events.json +++ b/public/language/zh-CN/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "暂无事件", "control-panel": "事件控制面板", "delete-events": "删除事件", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "过滤器", "filters-apply": "应用过滤器", "filter-type": "事件类型", diff --git a/public/language/zh-CN/error.json b/public/language/zh-CN/error.json index b4b57239ec..b1d890d5bf 100644 --- a/public/language/zh-CN/error.json +++ b/public/language/zh-CN/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "您的电子邮箱尚未确认,无法聊天,请点击这里确认您的电子邮箱。", "email-not-confirmed-email-sent": "您的电子邮件账户尚未确认,请检查您的收件箱。在电子邮件帐户被确认前您不能发帖和聊天。", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "我们无法确认您的电子邮箱,请重试", "confirm-email-already-sent": "确认邮件已发出,如需重新发送请等待 %1 分钟后再试。", "sendmail-not-found": "无法找到 sendmail 可执行程序,请确保 sendmail 已经安装并可被运行 NodeBB 的用户执行", @@ -103,6 +104,7 @@ "already-bookmarked": "您已将此贴存为了书签", "already-unbookmarked": "您已取消了此贴的书签", "cant-ban-other-admins": "您不能封禁其他管理员!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "您是唯一的管理员。在删除您的管理员权限前,请添加另一个管理员。", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "在删除该账号之前,请先移除其管理权限。", diff --git a/public/language/zh-TW/admin/advanced/events.json b/public/language/zh-TW/admin/advanced/events.json index d964ae59a8..5ecc44a954 100644 --- a/public/language/zh-TW/admin/advanced/events.json +++ b/public/language/zh-TW/admin/advanced/events.json @@ -3,6 +3,7 @@ "no-events": "暫無事件", "control-panel": "事件控制面板", "delete-events": "刪除事件", + "confirm-delete-all-events": "Are you sure you want to delete all logged events?", "filters": "過濾器", "filters-apply": "應用過濾器", "filter-type": "事件類型", diff --git a/public/language/zh-TW/error.json b/public/language/zh-TW/error.json index b44267318d..20482032e5 100644 --- a/public/language/zh-TW/error.json +++ b/public/language/zh-TW/error.json @@ -36,6 +36,7 @@ "email-not-confirmed-chat": "您的電子信箱尚未確認,無法聊天,請點擊這裡確認您的電子信箱。", "email-not-confirmed-email-sent": "您的電子信箱尚未確認,請檢查您的收件匣。在電子信箱被確認前您不能貼文和聊天。", "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery. Please click here to enter an email.", + "user-doesnt-have-email": "User \"%1\" does not have an email set.", "email-confirm-failed": "我們無法確認您的電子信箱,請重試", "confirm-email-already-sent": "確認郵件已發出,如需重新發送請等待 %1 分鐘後再試。", "sendmail-not-found": "無法找到 sendmail 可執行檔,請確保 sendmail 已經安裝並可被運行 NodeBB 的系統帳戶執行", @@ -103,6 +104,7 @@ "already-bookmarked": "您已將此貼文存為了書籤", "already-unbookmarked": "您已移除了此貼文的書籤", "cant-ban-other-admins": "您不能封鎖其他管理員!", + "cant-make-banned-users-admin": "You can't make banned users admin.", "cant-remove-last-admin": "您是唯一的管理員。在刪除您的管理員權限前,請增加另一個管理員。", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "在刪除該帳戶之前,請先移除其管理權限。", From 3acaac4c7c8d6420a75b5f73fa3964ed352f573f Mon Sep 17 00:00:00 2001 From: gasoved Date: Fri, 8 Oct 2021 17:36:51 +0300 Subject: [PATCH 014/140] fix: html attributes (#9877) * fix: some empty xml tag bodies * fix: missing/wrong attributing of label tags * fix: attribute fixes * fix: misassociated label * fix: missing alt attributes * fix: some more missing associated labels --- src/views/admin/advanced/events.tpl | 4 +- src/views/admin/development/logger.tpl | 4 +- src/views/admin/extend/rewards.tpl | 14 ++-- src/views/admin/manage/admins-mods.tpl | 6 +- src/views/admin/manage/group.tpl | 4 +- src/views/admin/manage/registration.tpl | 2 +- src/views/admin/manage/users.tpl | 6 +- .../partials/categories/select-category.tpl | 4 +- src/views/admin/partials/categories/users.tpl | 2 +- .../admin/partials/create_user_modal.tpl | 8 +- .../admin/partials/groups/memberlist.tpl | 2 +- .../groups/privileges-select-category.tpl | 4 +- .../admin/partials/privileges/category.tpl | 2 +- .../admin/partials/privileges/global.tpl | 2 +- src/views/admin/settings/advanced.tpl | 4 +- src/views/admin/settings/api.tpl | 2 +- src/views/admin/settings/chat.tpl | 24 +++--- src/views/admin/settings/email.tpl | 8 +- src/views/admin/settings/general.tpl | 54 ++++++------- src/views/admin/settings/group.tpl | 8 +- src/views/admin/settings/homepage.tpl | 12 +-- src/views/admin/settings/languages.tpl | 2 +- src/views/admin/settings/navigation.tpl | 24 +++--- src/views/admin/settings/post.tpl | 20 ++--- src/views/admin/settings/tags.tpl | 2 +- src/views/admin/settings/uploads.tpl | 30 ++++---- src/views/admin/settings/user.tpl | 76 +++++++++---------- src/views/admin/settings/web-crawler.tpl | 4 +- src/views/emails/digest.tpl | 2 +- src/views/install/index.tpl | 18 ++--- src/views/modals/crop_picture.tpl | 2 +- src/views/modals/topic-thumbs.tpl | 2 +- 32 files changed, 179 insertions(+), 179 deletions(-) diff --git a/src/views/admin/advanced/events.tpl b/src/views/admin/advanced/events.tpl index f7a4a94c3c..0456b4bcdd 100644 --- a/src/views/admin/advanced/events.tpl +++ b/src/views/admin/advanced/events.tpl @@ -15,7 +15,7 @@ {events.ip} - +
{events.user.icon:text}
@@ -38,7 +38,7 @@
- diff --git a/src/views/admin/development/logger.tpl b/src/views/admin/development/logger.tpl index dc8704a52b..01c9688718 100644 --- a/src/views/admin/development/logger.tpl +++ b/src/views/admin/development/logger.tpl @@ -26,8 +26,8 @@

- - + +
diff --git a/src/views/admin/extend/rewards.tpl b/src/views/admin/extend/rewards.tpl index 456ab7d379..78c11e1445 100644 --- a/src/views/admin/extend/rewards.tpl +++ b/src/views/admin/extend/rewards.tpl @@ -7,18 +7,18 @@
-
- {{{ each conditions }}} {{{ end }}}
-
+
- {{{ each conditionals }}} {{{ end }}} @@ -30,8 +30,8 @@
-
- @@ -50,7 +50,7 @@

- +
diff --git a/src/views/admin/manage/admins-mods.tpl b/src/views/admin/manage/admins-mods.tpl index e595f682db..cbe7198eae 100644 --- a/src/views/admin/manage/admins-mods.tpl +++ b/src/views/admin/manage/admins-mods.tpl @@ -4,7 +4,7 @@
- +
{admins.members.icon:text}
@@ -22,7 +22,7 @@
- +
{globalMods.members.icon:text}
@@ -47,7 +47,7 @@ {{{ each categoryMods.moderators }}}
{{{ if categoryMods.moderators.picture }}} - + {{{ else }}}
{categoryMods.moderators.icon:text}
{{{ end }}} diff --git a/src/views/admin/manage/group.tpl b/src/views/admin/manage/group.tpl index 0f63599a91..e3b9d3313f 100644 --- a/src/views/admin/manage/group.tpl +++ b/src/views/admin/manage/group.tpl @@ -133,11 +133,11 @@
diff --git a/src/views/admin/manage/registration.tpl b/src/views/admin/manage/registration.tpl index d4effc8c5d..e12f08d370 100644 --- a/src/views/admin/manage/registration.tpl +++ b/src/views/admin/manage/registration.tpl @@ -58,7 +58,7 @@ {{{ each users.ipMatch }}}
- +
{users.ipMatch.icon:text}
diff --git a/src/views/admin/manage/users.tpl b/src/views/admin/manage/users.tpl index 18005830c1..068ed4ea8f 100644 --- a/src/views/admin/manage/users.tpl +++ b/src/views/admin/manage/users.tpl @@ -55,13 +55,13 @@
diff --git a/src/views/admin/partials/categories/select-category.tpl b/src/views/admin/partials/categories/select-category.tpl index a0a28b6eed..643f561289 100644 --- a/src/views/admin/partials/categories/select-category.tpl +++ b/src/views/admin/partials/categories/select-category.tpl @@ -9,11 +9,11 @@
diff --git a/src/views/admin/partials/categories/users.tpl b/src/views/admin/partials/categories/users.tpl index 772053d5b0..67f272e6fd 100644 --- a/src/views/admin/partials/categories/users.tpl +++ b/src/views/admin/partials/categories/users.tpl @@ -17,6 +17,6 @@
  • Moderator
  • - {users.username} + {users.username} diff --git a/src/views/admin/partials/create_user_modal.tpl b/src/views/admin/partials/create_user_modal.tpl index ece62fc7f0..278e133165 100644 --- a/src/views/admin/partials/create_user_modal.tpl +++ b/src/views/admin/partials/create_user_modal.tpl @@ -1,21 +1,21 @@
    - +
    - +
    - +
    - +
    diff --git a/src/views/admin/partials/groups/memberlist.tpl b/src/views/admin/partials/groups/memberlist.tpl index c6aae28af7..5e8b0c049e 100644 --- a/src/views/admin/partials/groups/memberlist.tpl +++ b/src/views/admin/partials/groups/memberlist.tpl @@ -19,7 +19,7 @@ - +
    {group.members.icon:text}
    diff --git a/src/views/admin/partials/groups/privileges-select-category.tpl b/src/views/admin/partials/groups/privileges-select-category.tpl index 10570034a1..ee2dcf0ac8 100644 --- a/src/views/admin/partials/groups/privileges-select-category.tpl +++ b/src/views/admin/partials/groups/privileges-select-category.tpl @@ -7,11 +7,11 @@
    diff --git a/src/views/admin/partials/privileges/category.tpl b/src/views/admin/partials/privileges/category.tpl index c2c03c2bec..19a21a9032 100644 --- a/src/views/admin/partials/privileges/category.tpl +++ b/src/views/admin/partials/privileges/category.tpl @@ -107,7 +107,7 @@ - +
    {../icon:text}
    diff --git a/src/views/admin/partials/privileges/global.tpl b/src/views/admin/partials/privileges/global.tpl index b0a971e11b..28271a215d 100644 --- a/src/views/admin/partials/privileges/global.tpl +++ b/src/views/admin/partials/privileges/global.tpl @@ -81,7 +81,7 @@ - +
    {../icon:text}
    diff --git a/src/views/admin/settings/advanced.tpl b/src/views/admin/settings/advanced.tpl index eec61df531..b64a631f74 100644 --- a/src/views/admin/settings/advanced.tpl +++ b/src/views/admin/settings/advanced.tpl @@ -15,11 +15,11 @@

    - +
    - +
    diff --git a/src/views/admin/settings/api.tpl b/src/views/admin/settings/api.tpl index 0a6a989054..9ee1cd35f6 100644 --- a/src/views/admin/settings/api.tpl +++ b/src/views/admin/settings/api.tpl @@ -27,7 +27,7 @@
    [[admin/settings/api:tokens]]
    - +
      diff --git a/src/views/admin/settings/chat.tpl b/src/views/admin/settings/chat.tpl index d9ee142398..403c013d16 100644 --- a/src/views/admin/settings/chat.tpl +++ b/src/views/admin/settings/chat.tpl @@ -24,34 +24,34 @@
      - - + +
      - - + +
      - - + +
      - - + +
      - - + +
      - - + +
      diff --git a/src/views/admin/settings/email.tpl b/src/views/admin/settings/email.tpl index 9d33950d7a..e358692127 100644 --- a/src/views/admin/settings/email.tpl +++ b/src/views/admin/settings/email.tpl @@ -130,14 +130,14 @@
      - +

      [[admin/settings/email:smtp-transport.username-help]]

      - +
      @@ -146,7 +146,7 @@
      [[admin/settings/email:template]]
      -
      +
      diff --git a/src/views/admin/settings/general.tpl b/src/views/admin/settings/general.tpl index f2ece80c61..1453e047b5 100644 --- a/src/views/admin/settings/general.tpl +++ b/src/views/admin/settings/general.tpl @@ -6,8 +6,8 @@
      - - + + @@ -23,23 +23,23 @@
      - - + +

      [[admin/settings/general:browser-title-help]]

      - - + +

      [[admin/settings/general:title-layout-help]]

      - -
      + +
      -
      -
      +
      +
      @@ -52,7 +52,7 @@
      - +
      @@ -75,7 +75,7 @@
      - +
      @@ -92,7 +92,7 @@
      - +
      @@ -110,7 +110,7 @@
      - +
      @@ -120,11 +120,11 @@
      - +
      - +
      @@ -139,8 +139,8 @@
      [[admin/settings/general:search]]
      - - @@ -150,15 +150,15 @@
      - -
      - + + + - - + +

      [[admin/settings/general:background-color-help]]

      @@ -215,8 +215,8 @@
      [[admin/settings/general:topic-tools]]
      - - + +

      [[admin/settings/general:undo-timeout-help]]

      diff --git a/src/views/admin/settings/group.tpl b/src/views/admin/settings/group.tpl index cbfe08339c..8033448b01 100644 --- a/src/views/admin/settings/group.tpl +++ b/src/views/admin/settings/group.tpl @@ -29,11 +29,11 @@ [[admin/settings/group:allow-multiple-badges-help]]

      - - + + - - + +
      diff --git a/src/views/admin/settings/homepage.tpl b/src/views/admin/settings/homepage.tpl index 310185856b..625a59aa62 100644 --- a/src/views/admin/settings/homepage.tpl +++ b/src/views/admin/settings/homepage.tpl @@ -6,16 +6,16 @@

      - -
      @@ -26,8 +26,8 @@

      - - + +
      diff --git a/src/views/admin/settings/languages.tpl b/src/views/admin/settings/languages.tpl index 46033ef380..5f6bb114b1 100644 --- a/src/views/admin/settings/languages.tpl +++ b/src/views/admin/settings/languages.tpl @@ -9,7 +9,7 @@
      - + + +
      - - + +
      - - + +
      - - + +
      - - + +
      - - + +
      diff --git a/src/views/admin/settings/post.tpl b/src/views/admin/settings/post.tpl index b010065321..8e7029e906 100644 --- a/src/views/admin/settings/post.tpl +++ b/src/views/admin/settings/post.tpl @@ -5,16 +5,16 @@
      - -
      - - @@ -140,8 +140,8 @@
      - - @@ -186,8 +186,8 @@
      - - @@ -254,8 +254,8 @@
      - - + +
      diff --git a/src/views/admin/settings/tags.tpl b/src/views/admin/settings/tags.tpl index 81871bcd7c..ff10590ec4 100644 --- a/src/views/admin/settings/tags.tpl +++ b/src/views/admin/settings/tags.tpl @@ -12,7 +12,7 @@
      - +

      [[admin/settings/tags:system-tags-help]]

      diff --git a/src/views/admin/settings/uploads.tpl b/src/views/admin/settings/uploads.tpl index 2936f6abfb..36edc6ff8a 100644 --- a/src/views/admin/settings/uploads.tpl +++ b/src/views/admin/settings/uploads.tpl @@ -22,7 +22,7 @@
      - +

      [[admin/settings/uploads:private-uploads-extensions-help]]

      @@ -32,7 +32,7 @@
      - +

      [[admin/settings/uploads:resize-image-width-threshold-help]]

      @@ -42,7 +42,7 @@
      - +

      [[admin/settings/uploads:resize-image-width-help]]

      @@ -52,7 +52,7 @@
      - +

      [[admin/settings/uploads:resize-image-quality-help]]

      @@ -60,7 +60,7 @@
      - +

      [[admin/settings/uploads:max-file-size-help]]

      @@ -68,7 +68,7 @@
      - +

      [[admin/settings/uploads:reject-image-width-help]]

      @@ -76,7 +76,7 @@
      - +

      [[admin/settings/uploads:reject-image-height-help]]

      @@ -91,12 +91,12 @@
      - +
      - +

      [[admin/settings/uploads:allowed-file-extensions-help]]

      @@ -104,7 +104,7 @@
      -
      +
      @@ -148,7 +148,7 @@
      - +
      @@ -162,16 +162,16 @@
      - - + +

      [[admin/settings/uploads:max-profile-image-size-help]]

      - - + +

      [[admin/settings/uploads:max-cover-image-size-help]]

      diff --git a/src/views/admin/settings/user.tpl b/src/views/admin/settings/user.tpl index 63308932b6..417158331d 100644 --- a/src/views/admin/settings/user.tpl +++ b/src/views/admin/settings/user.tpl @@ -12,8 +12,8 @@
      - - @@ -117,8 +117,8 @@
      - - + +
      @@ -133,14 +133,14 @@
      - - + +
      - - + +
      @@ -150,8 +150,8 @@
      - - + +

      [[admin/settings/user:online-cutoff-help]]

      @@ -163,8 +163,8 @@
      - - @@ -175,8 +175,8 @@

      - - @@ -186,8 +186,8 @@

      - - + +

      [[admin/settings/user:registration-queue-auto-approve-time-help]]

      @@ -208,34 +208,34 @@

      [[admin/settings/email:require-email-address-warning]]

      - - + +

      [[admin/settings/user:max-invites-help]]

      - - + +

      [[admin/settings/user:invite-expiration-help]]

      - - + +
      - - + +
      - - + +
      - - @@ -244,12 +244,12 @@
      - - + +
      - - + +
      @@ -260,8 +260,8 @@
      - - + +
      @@ -315,8 +315,8 @@
      - - @@ -339,8 +339,8 @@
      - - diff --git a/src/views/admin/settings/web-crawler.tpl b/src/views/admin/settings/web-crawler.tpl index bc14fc72fd..bf818358e2 100644 --- a/src/views/admin/settings/web-crawler.tpl +++ b/src/views/admin/settings/web-crawler.tpl @@ -29,8 +29,8 @@
      - - + +

      diff --git a/src/views/emails/digest.tpl b/src/views/emails/digest.tpl index 1426807c2e..cb30a3afab 100644 --- a/src/views/emails/digest.tpl +++ b/src/views/emails/digest.tpl @@ -27,7 +27,7 @@ - +
      {notifications.user.icon:text}
      diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 5b84d66ee6..e022d64639 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -42,8 +42,8 @@
      - - + +
      @@ -58,28 +58,28 @@
      - +
      - +
      - +
      - +
      @@ -98,8 +98,8 @@
      - - @@ -140,7 +140,7 @@
      - +
      {{{ end }}} diff --git a/src/views/modals/crop_picture.tpl b/src/views/modals/crop_picture.tpl index c301436124..181302d756 100644 --- a/src/views/modals/crop_picture.tpl +++ b/src/views/modals/crop_picture.tpl @@ -12,7 +12,7 @@
      - +

      diff --git a/src/views/modals/topic-thumbs.tpl b/src/views/modals/topic-thumbs.tpl index 7c87b3e439..e7ecd24e13 100644 --- a/src/views/modals/topic-thumbs.tpl +++ b/src/views/modals/topic-thumbs.tpl @@ -5,7 +5,7 @@ {{{ each thumbs }}}
      - +

      From c1149d045c37e38bda08958a782b3f36f0f6a918 Mon Sep 17 00:00:00 2001 From: gasoved Date: Thu, 7 Oct 2021 18:39:02 +0300 Subject: [PATCH 015/140] fix: better nomenclature --- src/cli/user.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cli/user.js b/src/cli/user.js index e02622e263..eda3502133 100644 --- a/src/cli/user.js +++ b/src/cli/user.js @@ -36,7 +36,7 @@ module.exports = () => { .description('Delete user(s) and/or their content') .arguments('') .addOption( - new Option('-c, --content [operation]', 'Delete user content ([purge]), leave content ([account]), or delete content only ([content])') + new Option('-t, --type [operation]', 'Delete user content ([purge]), leave content ([account]), or delete content only ([content])') .choices(['purge', 'account', 'content']).default('purge') ) .action((...args) => execute(userCommands.deleteUser, args)); @@ -234,7 +234,7 @@ ${pwGenerated ? ` Generated password: ${password}` : ''}`); } } - async function deleteUser(uids, { content }) { + async function deleteUser(uids, { type }) { uids = argParsers.intArrayParse(uids, 'uids'); const userExists = await user.exists(uids); @@ -245,7 +245,7 @@ ${pwGenerated ? ` Generated password: ${password}` : ''}`); await db.initSessionStore(); const adminUid = await getAdminUidOrFail(); - switch (content) { + switch (type) { case 'purge': await Promise.all(uids.map(uid => user.delete(adminUid, uid))); winston.info(`[userCmd/delete] User(s) with their content has been deleted.`); From 3e69bcdf1f995b0123118285383c62ccf09b0e13 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 8 Oct 2021 11:32:47 -0400 Subject: [PATCH 016/140] fix: #9872 update app badge with notification count if applicable --- public/src/modules/notifications.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/src/modules/notifications.js b/public/src/modules/notifications.js index d2b578c19e..0d11293920 100644 --- a/public/src/modules/notifications.js +++ b/public/src/modules/notifications.js @@ -139,6 +139,10 @@ define('notifications', [ if (payload.updateFavicon) { Tinycon.setBubble(count > 99 ? '99+' : count); } + + if (navigator.setAppBadge) { // feature detection + navigator.setAppBadge(count); + } }; Notifications.markAllRead = function () { From 4b92df821b852724b4ac7c317f9e6d6ec20c2978 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 8 Oct 2021 16:46:48 +0000 Subject: [PATCH 017/140] chore(deps): update dependency eslint-config-nodebb to v0.0.3 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index aeaa1458b6..cf2125d507 100644 --- a/install/package.json +++ b/install/package.json @@ -146,7 +146,7 @@ "@commitlint/config-angular": "13.2.0", "coveralls": "3.1.1", "eslint": "7.32.0", - "eslint-config-nodebb": "0.0.2", + "eslint-config-nodebb": "0.0.3", "eslint-plugin-import": "2.24.2", "grunt": "1.4.1", "grunt-contrib-watch": "1.1.0", From 997fb2b348372e90daa8c76d52bba5a147ed3974 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Fri, 8 Oct 2021 15:16:17 -0400 Subject: [PATCH 018/140] refactor: remove unused code --- src/socket.io/index.js | 4 -- src/socket.io/single-host-cluster.js | 65 ---------------------------- 2 files changed, 69 deletions(-) delete mode 100644 src/socket.io/single-host-cluster.js diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 773f885791..4d88ed51ee 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -26,10 +26,6 @@ Sockets.init = async function (server) { }); if (nconf.get('isCluster')) { - // socket.io-adapter-cluster needs update - // if (nconf.get('singleHostCluster')) { - // io.adapter(require('./single-host-cluster')); - // } else if (nconf.get('redis')) { if (nconf.get('redis')) { const adapter = await require('../database/redis').socketAdapter(); io.adapter(adapter); diff --git a/src/socket.io/single-host-cluster.js b/src/socket.io/single-host-cluster.js deleted file mode 100644 index ca420997c5..0000000000 --- a/src/socket.io/single-host-cluster.js +++ /dev/null @@ -1,65 +0,0 @@ -'use strict'; - -const Client = { - sendMessage: function (channel, message) { - process.send({ - action: 'socket.io', - channel: channel, - message: message, - }); - }, - trigger: function (channel, message) { - Client.message.concat(Client.pmessage).forEach((callback) => { - setImmediate(() => { - callback.call(Client, channel, message); - }); - }); - }, - publish: function (channel, message) { - Client.sendMessage(channel, message); - }, - // we don't actually care about which channels we're subscribed to - subscribe: function () {}, - psubscribe: function () {}, - unsubscribe: function () {}, - unpsubscribe: function () {}, - message: [], - pmessage: [], - on: function (event, callback) { - if (event !== 'message' && event !== 'pmessage') { - return; - } - Client[event].push(callback); - }, - off: function (event, callback) { - if (event !== 'message' && event !== 'pmessage') { - return; - } - if (callback) { - Client[event] = Client[event].filter(c => c !== callback); - } else { - Client[event] = []; - } - }, -}; - -process.on('message', (message) => { - if (message && typeof message === 'object' && message.action === 'socket.io') { - Client.trigger(message.channel, message.message); - } -}); - -const adapter = require('socket.io-adapter-cluster')({ - client: Client, -}); -// Otherwise, every node thinks it is the master node and ignores messages -// because they are from "itself". -Object.defineProperty(adapter.prototype, 'id', { - get: function () { - return process.pid; - }, - set: function () { - // ignore - }, -}); -module.exports = adapter; From 94c4f87b2f0166239024fe76d04c4f50dbf91898 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 8 Oct 2021 15:24:30 -0400 Subject: [PATCH 019/140] docs: update verbiage re: login API route --- public/openapi/write/login.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/openapi/write/login.yaml b/public/openapi/write/login.yaml index 43ba2f8cb9..001cd5da01 100644 --- a/public/openapi/write/login.yaml +++ b/public/openapi/write/login.yaml @@ -4,6 +4,8 @@ post: summary: verify login credentials description: | This route accepts a username/password or email/password pair (dependent on forum settings), returning a standard user object if credentials are validated successfully. + This route also initializes a standard login session and returns a valid cookie that can be used in subsequent API calls as though it were a browser session. + **Note**: Cookie-based sessions require a CSRF token for non-`GET` routes. requestBody: content: application/json: From 227456fb1786cb23be635dada3c901a1be4cc3fe Mon Sep 17 00:00:00 2001 From: gasoved Date: Fri, 8 Oct 2021 22:25:36 +0300 Subject: [PATCH 020/140] fix: no global bootbox (#9879) * fix: require bootbox (easy ones) * fix: require bootbox (ugly ones) * fix(eslint): a lengthy line --- .jshintrc | 2 +- public/.jshintrc | 5 ++- public/src/admin/admin.js | 42 +++++++++++-------- public/src/admin/advanced/errors.js | 2 +- public/src/admin/appearance/themes.js | 2 +- public/src/admin/dashboard.js | 2 +- public/src/admin/extend/plugins.js | 3 +- public/src/admin/extend/widgets.js | 3 +- public/src/admin/manage/category.js | 3 +- public/src/admin/manage/digest.js | 2 +- public/src/admin/manage/group.js | 3 +- public/src/admin/manage/groups.js | 3 +- public/src/admin/manage/registration.js | 2 +- public/src/admin/manage/tags.js | 3 +- .../src/admin/modules/dashboard-line-graph.js | 2 +- public/src/ajaxify.js | 12 +++--- public/src/app.js | 42 +++++++++++-------- public/src/client/account/edit.js | 3 +- public/src/client/account/header.js | 3 +- public/src/client/chats.js | 7 +++- public/src/client/chats/messages.js | 2 +- public/src/client/flags/detail.js | 2 +- public/src/client/groups/details.js | 4 +- public/src/client/groups/list.js | 4 +- public/src/client/groups/memberlist.js | 2 +- public/src/client/ip-blacklist.js | 2 +- public/src/client/pagination.js | 2 +- public/src/client/register.js | 4 +- public/src/client/topic/threadTools.js | 3 +- public/src/client/topic/votes.js | 4 +- public/src/modules/accounts/delete.js | 2 +- public/src/modules/accounts/picture.js | 3 +- public/src/modules/iconSelect.js | 2 +- public/src/modules/settings/sorted-list.js | 3 +- public/src/sockets.js | 2 +- 35 files changed, 110 insertions(+), 77 deletions(-) diff --git a/.jshintrc b/.jshintrc index bbbcd96dc3..37c22ddcf9 100644 --- a/.jshintrc +++ b/.jshintrc @@ -4,7 +4,7 @@ "maxerr" : 50, // {int} Maximum error before stopping - "esversion": 6, + "esversion": 9, // Enforcing "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) diff --git a/public/.jshintrc b/public/.jshintrc index 0b65b2f3db..6e93972469 100644 --- a/public/.jshintrc +++ b/public/.jshintrc @@ -1,6 +1,8 @@ { "maxerr" : 50, // {int} Maximum error before stopping + "esversion": 9, + // Enforcing "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) "camelcase" : false, // true: Identifiers must be in camelCase @@ -42,7 +44,7 @@ "evil" : false, // true: Tolerate use of `eval` and `new Function()` "expr" : false, // true: Tolerate `ExpressionStatement` as Programs "funcscope" : false, // true: Tolerate defining variables inside control statements" - "globalstrict" : false, // true: Allow global "use strict" (also enables 'strict') + "globalstrict" : true, // true: Allow global "use strict" (also enables 'strict') "iterator" : false, // true: Tolerate using the `__iterator__` property "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block "laxbreak" : false, // true: Tolerate possibly unsafe line breakings @@ -66,7 +68,6 @@ "utils": true, "overrides": true, "componentHandler": true, - "bootbox": true, "templates": true, "Visibility": true, "Tinycon": true, diff --git a/public/src/admin/admin.js b/public/src/admin/admin.js index bdc6afb35f..ddcb52c284 100644 --- a/public/src/admin/admin.js +++ b/public/src/admin/admin.js @@ -20,12 +20,14 @@ } logoutTimer = setTimeout(function () { - bootbox.alert({ - closeButton: false, - message: logoutMessage, - callback: function () { - window.location.reload(); - }, + require(['bootbox'], function (bootbox) { + bootbox.alert({ + closeButton: false, + message: logoutMessage, + callback: function () { + window.location.reload(); + }, + }); }); }, 3600000); } @@ -141,22 +143,26 @@ function setupRestartLinks() { $('.rebuild-and-restart').off('click').on('click', function () { - bootbox.confirm('[[admin/admin:alert.confirm-rebuild-and-restart]]', function (confirm) { - if (confirm) { - require(['admin/modules/instance'], function (instance) { - instance.rebuildAndRestart(); - }); - } + require(['bootbox'], function (bootbox) { + bootbox.confirm('[[admin/admin:alert.confirm-rebuild-and-restart]]', function (confirm) { + if (confirm) { + require(['admin/modules/instance'], function (instance) { + instance.rebuildAndRestart(); + }); + } + }); }); }); $('.restart').off('click').on('click', function () { - bootbox.confirm('[[admin/admin:alert.confirm-restart]]', function (confirm) { - if (confirm) { - require(['admin/modules/instance'], function (instance) { - instance.restart(); - }); - } + require(['bootbox'], function (bootbox) { + bootbox.confirm('[[admin/admin:alert.confirm-restart]]', function (confirm) { + if (confirm) { + require(['admin/modules/instance'], function (instance) { + instance.restart(); + }); + } + }); }); }); } diff --git a/public/src/admin/advanced/errors.js b/public/src/admin/advanced/errors.js index 6356d5690b..2a776bc103 100644 --- a/public/src/admin/advanced/errors.js +++ b/public/src/admin/advanced/errors.js @@ -1,7 +1,7 @@ 'use strict'; -define('admin/advanced/errors', ['Chart'], function (Chart) { +define('admin/advanced/errors', ['bootbox', 'Chart'], function (bootbox, Chart) { var Errors = {}; Errors.init = function () { diff --git a/public/src/admin/appearance/themes.js b/public/src/admin/appearance/themes.js index 94510fd248..b0b60d9535 100644 --- a/public/src/admin/appearance/themes.js +++ b/public/src/admin/appearance/themes.js @@ -1,7 +1,7 @@ 'use strict'; -define('admin/appearance/themes', ['translator'], function (translator) { +define('admin/appearance/themes', ['bootbox', 'translator'], function (bootbox, translator) { var Themes = {}; Themes.init = function () { diff --git a/public/src/admin/dashboard.js b/public/src/admin/dashboard.js index 548e1fe996..7406170220 100644 --- a/public/src/admin/dashboard.js +++ b/public/src/admin/dashboard.js @@ -1,7 +1,7 @@ 'use strict'; -define('admin/dashboard', ['Chart', 'translator', 'benchpress'], function (Chart, translator, Benchpress) { +define('admin/dashboard', ['Chart', 'translator', 'benchpress', 'bootbox'], function (Chart, translator, Benchpress, bootbox) { var Admin = {}; var intervals = { rooms: false, diff --git a/public/src/admin/extend/plugins.js b/public/src/admin/extend/plugins.js index b51e8e4189..a81de5cb7a 100644 --- a/public/src/admin/extend/plugins.js +++ b/public/src/admin/extend/plugins.js @@ -4,8 +4,9 @@ define('admin/extend/plugins', [ 'translator', 'benchpress', + 'bootbox', 'jquery-ui/widgets/sortable', -], function (translator, Benchpress) { +], function (translator, Benchpress, bootbox) { var Plugins = {}; Plugins.init = function () { var pluginsList = $('.plugins'); diff --git a/public/src/admin/extend/widgets.js b/public/src/admin/extend/widgets.js index 5660cc8f05..31e051a09c 100644 --- a/public/src/admin/extend/widgets.js +++ b/public/src/admin/extend/widgets.js @@ -2,11 +2,12 @@ define('admin/extend/widgets', [ + 'bootbox', 'jquery-ui/widgets/sortable', 'jquery-ui/widgets/draggable', 'jquery-ui/widgets/droppable', 'jquery-ui/widgets/datepicker', -], function () { +], function (bootbox) { var Widgets = {}; Widgets.init = function () { diff --git a/public/src/admin/manage/category.js b/public/src/admin/manage/category.js index 1873d4de7a..336cdacb98 100644 --- a/public/src/admin/manage/category.js +++ b/public/src/admin/manage/category.js @@ -6,7 +6,8 @@ define('admin/manage/category', [ 'categorySelector', 'benchpress', 'api', -], function (uploader, iconSelect, categorySelector, Benchpress, api) { + 'bootbox', +], function (uploader, iconSelect, categorySelector, Benchpress, api, bootbox) { var Category = {}; var updateHash = {}; diff --git a/public/src/admin/manage/digest.js b/public/src/admin/manage/digest.js index 3b07918277..85876517dd 100644 --- a/public/src/admin/manage/digest.js +++ b/public/src/admin/manage/digest.js @@ -1,7 +1,7 @@ 'use strict'; -define('admin/manage/digest', function () { +define('admin/manage/digest', ['bootbox'], function (bootbox) { var Digest = {}; Digest.init = function () { diff --git a/public/src/admin/manage/group.js b/public/src/admin/manage/group.js index c7fb51d6ae..c873dc40b4 100644 --- a/public/src/admin/manage/group.js +++ b/public/src/admin/manage/group.js @@ -8,7 +8,8 @@ define('admin/manage/group', [ 'groupSearch', 'slugify', 'api', -], function (memberList, iconSelect, translator, categorySelector, groupSearch, slugify, api) { + 'bootbox', +], function (memberList, iconSelect, translator, categorySelector, groupSearch, slugify, api, bootbox) { var Groups = {}; Groups.init = function () { diff --git a/public/src/admin/manage/groups.js b/public/src/admin/manage/groups.js index 8a812e8897..9dbb204419 100644 --- a/public/src/admin/manage/groups.js +++ b/public/src/admin/manage/groups.js @@ -4,7 +4,8 @@ define('admin/manage/groups', [ 'categorySelector', 'slugify', 'api', -], function (categorySelector, slugify, api) { + 'bootbox', +], function (categorySelector, slugify, api, bootbox) { var Groups = {}; Groups.init = function () { diff --git a/public/src/admin/manage/registration.js b/public/src/admin/manage/registration.js index 08f8b6722b..1b0f80875b 100644 --- a/public/src/admin/manage/registration.js +++ b/public/src/admin/manage/registration.js @@ -1,7 +1,7 @@ 'use strict'; -define('admin/manage/registration', function () { +define('admin/manage/registration', ['bootbox'], function (bootbox) { var Registration = {}; Registration.init = function () { diff --git a/public/src/admin/manage/tags.js b/public/src/admin/manage/tags.js index 0fb7dbf39f..d2a4817158 100644 --- a/public/src/admin/manage/tags.js +++ b/public/src/admin/manage/tags.js @@ -2,9 +2,10 @@ define('admin/manage/tags', [ + 'bootbox', 'forum/infinitescroll', 'admin/modules/selectable', -], function (infinitescroll, selectable) { +], function (bootbox, infinitescroll, selectable) { var Tags = {}; Tags.init = function () { diff --git a/public/src/admin/modules/dashboard-line-graph.js b/public/src/admin/modules/dashboard-line-graph.js index ac53497ce7..246bbbe39d 100644 --- a/public/src/admin/modules/dashboard-line-graph.js +++ b/public/src/admin/modules/dashboard-line-graph.js @@ -1,6 +1,6 @@ 'use strict'; -define('admin/modules/dashboard-line-graph', ['Chart', 'translator', 'benchpress', 'api', 'hooks'], function (Chart, translator, Benchpress, api, hooks) { +define('admin/modules/dashboard-line-graph', ['Chart', 'translator', 'benchpress', 'api', 'hooks', 'bootbox'], function (Chart, translator, Benchpress, api, hooks, bootbox) { const Graph = { _current: null, }; diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 2ee4836fb6..bafdff456a 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -545,11 +545,13 @@ $(document).ready(function () { return; } - bootbox.confirm('[[global:unsaved-changes]]', function (navigate) { - if (navigate) { - app.flags._unsaved = false; - process.call(_self); - } + require(['bootbox'], function (bootbox) { + bootbox.confirm('[[global:unsaved-changes]]', function (navigate) { + if (navigate) { + app.flags._unsaved = false; + process.call(_self); + } + }); }); return e.preventDefault(); } diff --git a/public/src/app.js b/public/src/app.js index a4c97f5f9a..ad153ed5db 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -217,13 +217,15 @@ app.cacheBuster = null; app.handleInvalidSession = function () { socket.disconnect(); app.logout(false); - bootbox.alert({ - title: '[[error:invalid-session]]', - message: '[[error:invalid-session-text]]', - closeButton: false, - callback: function () { - window.location.reload(); - }, + require(['bootbox'], function (bootbox) { + bootbox.alert({ + title: '[[error:invalid-session]]', + message: '[[error:invalid-session-text]]', + closeButton: false, + callback: function () { + window.location.reload(); + }, + }); }); }; @@ -233,13 +235,15 @@ app.cacheBuster = null; } socket.disconnect(); - bootbox.alert({ - title: '[[error:session-mismatch]]', - message: '[[error:session-mismatch-text]]', - closeButton: false, - callback: function () { - window.location.reload(); - }, + require(['bootbox'], function (bootbox) { + bootbox.alert({ + title: '[[error:session-mismatch]]', + message: '[[error:session-mismatch-text]]', + closeButton: false, + callback: function () { + window.location.reload(); + }, + }); }); }; @@ -434,10 +438,12 @@ app.cacheBuster = null; if (!isDnD) { return createChat(); } - bootbox.confirm('[[modules:chat.confirm-chat-with-dnd-user]]', function (ok) { - if (ok) { - createChat(); - } + require(['bootbox'], function (bootbox) { + bootbox.confirm('[[modules:chat.confirm-chat-with-dnd-user]]', function (ok) { + if (ok) { + createChat(); + } + }); }); }); }; diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js index 5ccccd0730..dc22e3ca88 100644 --- a/public/src/client/account/edit.js +++ b/public/src/client/account/edit.js @@ -6,7 +6,8 @@ define('forum/account/edit', [ 'translator', 'api', 'hooks', -], function (header, picture, translator, api, hooks) { + 'bootbox', +], function (header, picture, translator, api, hooks, bootbox) { var AccountEdit = {}; AccountEdit.init = function () { diff --git a/public/src/client/account/header.js b/public/src/client/account/header.js index d7d04ebdd5..258e16246c 100644 --- a/public/src/client/account/header.js +++ b/public/src/client/account/header.js @@ -9,7 +9,8 @@ define('forum/account/header', [ 'benchpress', 'accounts/delete', 'api', -], function (coverPhoto, pictureCropper, components, translator, Benchpress, AccountsDelete, api) { + 'bootbox', +], function (coverPhoto, pictureCropper, components, translator, Benchpress, AccountsDelete, api, bootbox) { var AccountHeader = {}; var isAdminOrSelfOrGlobalMod; diff --git a/public/src/client/chats.js b/public/src/client/chats.js index de1f74763c..eedf23cfc0 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -11,7 +11,12 @@ define('forum/chats', [ 'benchpress', 'composer/autocomplete', 'hooks', -], function (components, translator, mousetrap, recentChats, search, messages, Benchpress, autocomplete, hooks) { + 'bootbox', +], function ( + components, translator, mousetrap, + recentChats, search, messages, Benchpress, + autocomplete, hooks, bootbox +) { var Chats = { initialised: false, }; diff --git a/public/src/client/chats/messages.js b/public/src/client/chats/messages.js index 29ab113e9b..7a743ce761 100644 --- a/public/src/client/chats/messages.js +++ b/public/src/client/chats/messages.js @@ -1,7 +1,7 @@ 'use strict'; -define('forum/chats/messages', ['components', 'translator', 'benchpress', 'hooks'], function (components, translator, Benchpress, hooks) { +define('forum/chats/messages', ['components', 'translator', 'benchpress', 'hooks', 'bootbox'], function (components, translator, Benchpress, hooks, bootbox) { var messages = {}; messages.sendMessage = function (roomId, inputEl) { diff --git a/public/src/client/flags/detail.js b/public/src/client/flags/detail.js index b43c7bcc5d..2dfb46eac8 100644 --- a/public/src/client/flags/detail.js +++ b/public/src/client/flags/detail.js @@ -1,6 +1,6 @@ 'use strict'; -define('forum/flags/detail', ['forum/flags/list', 'components', 'translator', 'benchpress', 'forum/account/header', 'accounts/delete', 'api'], function (FlagsList, components, translator, Benchpress, AccountHeader, AccountsDelete, api) { +define('forum/flags/detail', ['forum/flags/list', 'components', 'translator', 'benchpress', 'forum/account/header', 'accounts/delete', 'api', 'bootbox'], function (FlagsList, components, translator, Benchpress, AccountHeader, AccountsDelete, api, bootbox) { var Detail = {}; Detail.init = function () { diff --git a/public/src/client/groups/details.js b/public/src/client/groups/details.js index 531c62532e..73322e2d1d 100644 --- a/public/src/client/groups/details.js +++ b/public/src/client/groups/details.js @@ -10,6 +10,7 @@ define('forum/groups/details', [ 'api', 'slugify', 'categorySelector', + 'bootbox', ], function ( memberList, iconSelect, @@ -19,7 +20,8 @@ define('forum/groups/details', [ translator, api, slugify, - categorySelector + categorySelector, + bootbox ) { var Details = {}; var groupName; diff --git a/public/src/client/groups/list.js b/public/src/client/groups/list.js index abfae6716d..e0a8ed10d4 100644 --- a/public/src/client/groups/list.js +++ b/public/src/client/groups/list.js @@ -1,8 +1,8 @@ 'use strict'; define('forum/groups/list', [ - 'forum/infinitescroll', 'benchpress', 'api', -], function (infinitescroll, Benchpress, api) { + 'forum/infinitescroll', 'benchpress', 'api', 'bootbox', +], function (infinitescroll, Benchpress, api, bootbox) { var Groups = {}; Groups.init = function () { diff --git a/public/src/client/groups/memberlist.js b/public/src/client/groups/memberlist.js index 679f270cbc..70863999e7 100644 --- a/public/src/client/groups/memberlist.js +++ b/public/src/client/groups/memberlist.js @@ -1,6 +1,6 @@ 'use strict'; -define('forum/groups/memberlist', ['api'], function (api) { +define('forum/groups/memberlist', ['api', 'bootbox'], function (api, bootbox) { var MemberList = {}; var searchInterval; var groupName; diff --git a/public/src/client/ip-blacklist.js b/public/src/client/ip-blacklist.js index cf4a7c12b9..1d5cd4a16f 100644 --- a/public/src/client/ip-blacklist.js +++ b/public/src/client/ip-blacklist.js @@ -1,7 +1,7 @@ 'use strict'; -define('forum/ip-blacklist', ['Chart', 'benchpress'], function (Chart, Benchpress) { +define('forum/ip-blacklist', ['Chart', 'benchpress', 'bootbox'], function (Chart, Benchpress, bootbox) { var Blacklist = {}; Blacklist.init = function () { diff --git a/public/src/client/pagination.js b/public/src/client/pagination.js index 543f7534b7..69d0294573 100644 --- a/public/src/client/pagination.js +++ b/public/src/client/pagination.js @@ -1,7 +1,7 @@ 'use strict'; -define('forum/pagination', function () { +define('forum/pagination', ['bootbox'], function (bootbox) { var pagination = {}; pagination.init = function () { diff --git a/public/src/client/register.js b/public/src/client/register.js index 068ba9a6ed..e0bf74b86a 100644 --- a/public/src/client/register.js +++ b/public/src/client/register.js @@ -2,8 +2,8 @@ define('forum/register', [ - 'translator', 'zxcvbn', 'slugify', 'api', 'forum/login', 'jquery-form', -], function (translator, zxcvbn, slugify, api, Login) { + 'translator', 'zxcvbn', 'slugify', 'api', 'bootbox', 'forum/login', 'jquery-form', +], function (translator, zxcvbn, slugify, api, bootbox, Login) { var Register = {}; var validationError = false; var successIcon = ''; diff --git a/public/src/client/topic/threadTools.js b/public/src/client/topic/threadTools.js index 0dcf444c2a..d7276ced56 100644 --- a/public/src/client/topic/threadTools.js +++ b/public/src/client/topic/threadTools.js @@ -8,7 +8,8 @@ define('forum/topic/threadTools', [ 'forum/topic/posts', 'api', 'hooks', -], function (components, translator, handleBack, posts, api, hooks) { + 'bootbox', +], function (components, translator, handleBack, posts, api, hooks, bootbox) { var ThreadTools = {}; ThreadTools.init = function (tid, topicContainer) { diff --git a/public/src/client/topic/votes.js b/public/src/client/topic/votes.js index 797d27dee4..1a707e37cd 100644 --- a/public/src/client/topic/votes.js +++ b/public/src/client/topic/votes.js @@ -2,8 +2,8 @@ define('forum/topic/votes', [ - 'components', 'translator', 'benchpress', 'api', 'hooks', -], function (components, translator, Benchpress, api, hooks) { + 'components', 'translator', 'benchpress', 'api', 'hooks', 'bootbox', +], function (components, translator, Benchpress, api, hooks, bootbox) { var Votes = {}; Votes.addVoteHandler = function () { diff --git a/public/src/modules/accounts/delete.js b/public/src/modules/accounts/delete.js index 1b79634de0..831867fe3c 100644 --- a/public/src/modules/accounts/delete.js +++ b/public/src/modules/accounts/delete.js @@ -1,6 +1,6 @@ 'use strict'; -define('accounts/delete', ['api', 'bootbox'], function (api) { +define('accounts/delete', ['api', 'bootbox'], function (api, bootbox) { var Delete = {}; Delete.account = function (uid, callback) { diff --git a/public/src/modules/accounts/picture.js b/public/src/modules/accounts/picture.js index 3893f2e27a..7e853a9e8f 100644 --- a/public/src/modules/accounts/picture.js +++ b/public/src/modules/accounts/picture.js @@ -3,7 +3,8 @@ define('accounts/picture', [ 'pictureCropper', 'api', -], (pictureCropper, api) => { + 'bootbox', +], (pictureCropper, api, bootbox) => { const Picture = {}; Picture.openChangeModal = () => { diff --git a/public/src/modules/iconSelect.js b/public/src/modules/iconSelect.js index 17530cd05d..1b2ea1699a 100644 --- a/public/src/modules/iconSelect.js +++ b/public/src/modules/iconSelect.js @@ -1,7 +1,7 @@ 'use strict'; -define('iconSelect', ['benchpress'], function (Benchpress) { +define('iconSelect', ['benchpress', 'bootbox'], function (Benchpress, bootbox) { var iconSelect = {}; iconSelect.init = function (el, onModified) { diff --git a/public/src/modules/settings/sorted-list.js b/public/src/modules/settings/sorted-list.js index 806c6b148f..a33dec9b82 100644 --- a/public/src/modules/settings/sorted-list.js +++ b/public/src/modules/settings/sorted-list.js @@ -2,9 +2,10 @@ define('settings/sorted-list', [ 'benchpress', + 'bootbox', 'hooks', 'jquery-ui/widgets/sortable', -], function (benchpress, hooks) { +], function (benchpress, bootbox, hooks) { var SortedList; var Settings; diff --git a/public/src/sockets.js b/public/src/sockets.js index b3bc6795ee..31fa1e8958 100644 --- a/public/src/sockets.js +++ b/public/src/sockets.js @@ -212,7 +212,7 @@ socket = window.socket; } function onEventBanned(data) { - require(['translator'], function (translator) { + require(['bootbox', 'translator'], function (bootbox, translator) { var message = data.until ? translator.compile('error:user-banned-reason-until', (new Date(data.until).toLocaleString()), data.reason) : '[[error:user-banned-reason, ' + data.reason + ']]'; From 820f8cdf87b66dad8ca1bb297b855191fa6abbe8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 8 Oct 2021 20:44:53 +0000 Subject: [PATCH 021/140] fix(deps): update dependency nodebb-plugin-mentions to v2.14.1 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index cf2125d507..38f7c1cfad 100644 --- a/install/package.json +++ b/install/package.json @@ -89,7 +89,7 @@ "nodebb-plugin-emoji": "^3.5.0", "nodebb-plugin-emoji-android": "2.0.5", "nodebb-plugin-markdown": "8.14.3", - "nodebb-plugin-mentions": "2.13.11", + "nodebb-plugin-mentions": "2.14.1", "nodebb-plugin-spam-be-gone": "0.7.9", "nodebb-rewards-essentials": "0.1.5", "nodebb-theme-lavender": "5.2.1", From 022e8df03564139bb6883e6ef93f08fe7cd1b102 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 9 Oct 2021 04:12:18 +0000 Subject: [PATCH 022/140] chore(deps): update dependency lint-staged to v11.2.1 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 38f7c1cfad..c652162328 100644 --- a/install/package.json +++ b/install/package.json @@ -152,7 +152,7 @@ "grunt-contrib-watch": "1.1.0", "husky": "7.0.2", "jsdom": "17.0.0", - "lint-staged": "11.2.0", + "lint-staged": "11.2.1", "mocha": "9.1.2", "mocha-lcov-reporter": "1.3.0", "mockdate": "3.0.5", From 52c38a1dc8501c9401c26aed38d31230626e26c4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 9 Oct 2021 09:27:46 +0000 Subject: [PATCH 023/140] chore(deps): update dependency @commitlint/cli to v13.2.1 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index c652162328..cc3d84ec9c 100644 --- a/install/package.json +++ b/install/package.json @@ -142,7 +142,7 @@ }, "devDependencies": { "@apidevtools/swagger-parser": "10.0.3", - "@commitlint/cli": "13.2.0", + "@commitlint/cli": "13.2.1", "@commitlint/config-angular": "13.2.0", "coveralls": "3.1.1", "eslint": "7.32.0", From f96c8c4db03f21af900ba4ff0e60628c32333f87 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 9 Oct 2021 19:07:21 +0000 Subject: [PATCH 024/140] chore(deps): update dependency lint-staged to v11.2.2 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index cc3d84ec9c..30b99a3b9a 100644 --- a/install/package.json +++ b/install/package.json @@ -152,7 +152,7 @@ "grunt-contrib-watch": "1.1.0", "husky": "7.0.2", "jsdom": "17.0.0", - "lint-staged": "11.2.1", + "lint-staged": "11.2.2", "mocha": "9.1.2", "mocha-lcov-reporter": "1.3.0", "mockdate": "3.0.5", From 288b5456f73c1a3be4f8c44f72ebae48bb972340 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 10 Oct 2021 19:25:43 +0000 Subject: [PATCH 025/140] chore(deps): update dependency lint-staged to v11.2.3 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 30b99a3b9a..5aaf3c2aa4 100644 --- a/install/package.json +++ b/install/package.json @@ -152,7 +152,7 @@ "grunt-contrib-watch": "1.1.0", "husky": "7.0.2", "jsdom": "17.0.0", - "lint-staged": "11.2.2", + "lint-staged": "11.2.3", "mocha": "9.1.2", "mocha-lcov-reporter": "1.3.0", "mockdate": "3.0.5", From 6d2e0aa97074a46cd752041f6cc0e0b98eb4f24c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 11 Oct 2021 03:19:46 +0000 Subject: [PATCH 026/140] fix(deps): update dependency ioredis to v4.27.11 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 5aaf3c2aa4..c115753a6d 100644 --- a/install/package.json +++ b/install/package.json @@ -107,7 +107,7 @@ "postcss": "8.3.9", "postcss-clean": "1.2.0", "prompt": "^1.1.0", - "ioredis": "4.27.10", + "ioredis": "4.27.11", "request": "2.88.2", "request-promise-native": "^1.0.9", "requirejs": "2.3.6", From 7c4aebbdf0a7bc42bbe4ff8ae2994155a54f6a8d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 12 Oct 2021 07:31:10 +0000 Subject: [PATCH 027/140] chore(deps): update dependency eslint-plugin-import to v2.25.1 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index c115753a6d..33063ace09 100644 --- a/install/package.json +++ b/install/package.json @@ -147,7 +147,7 @@ "coveralls": "3.1.1", "eslint": "7.32.0", "eslint-config-nodebb": "0.0.3", - "eslint-plugin-import": "2.24.2", + "eslint-plugin-import": "2.25.1", "grunt": "1.4.1", "grunt-contrib-watch": "1.1.0", "husky": "7.0.2", From 4b8dcd4c2bfe4a41edfd251091f0ba9770547439 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 10 Oct 2021 20:49:21 +0000 Subject: [PATCH 028/140] chore(deps): update dependency jsdom to v18 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 33063ace09..34e4be371e 100644 --- a/install/package.json +++ b/install/package.json @@ -151,7 +151,7 @@ "grunt": "1.4.1", "grunt-contrib-watch": "1.1.0", "husky": "7.0.2", - "jsdom": "17.0.0", + "jsdom": "18.0.0", "lint-staged": "11.2.3", "mocha": "9.1.2", "mocha-lcov-reporter": "1.3.0", From eddb98681c8100ca978e8bb6062001b4e30b68d4 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 12 Oct 2021 10:13:53 -0400 Subject: [PATCH 029/140] fix: have renovate add `dependencies` label to its PRs --- renovate.json | 1 + 1 file changed, 1 insertion(+) diff --git a/renovate.json b/renovate.json index 2e0f3667f9..78aef7647d 100644 --- a/renovate.json +++ b/renovate.json @@ -2,6 +2,7 @@ "extends": [ "config:base" ], + "labels": ["dependencies"], "packageRules": [ { "updateTypes": ["minor", "patch", "pin", "digest"], From b0a24d6dd5c3631389ce03683ca725c1084aa934 Mon Sep 17 00:00:00 2001 From: gasoved Date: Tue, 12 Oct 2021 17:26:18 +0300 Subject: [PATCH 030/140] refactor: var to const and let (#9885) * refactor: var to const and let * fix: missed global bootbox usage * refactor: align with eslint expectations --- public/src/admin/admin.js | 18 +- public/src/admin/advanced/cache.js | 10 +- public/src/admin/advanced/errors.js | 10 +- public/src/admin/advanced/logs.js | 8 +- public/src/admin/appearance/customise.js | 8 +- public/src/admin/appearance/skins.js | 22 +-- public/src/admin/appearance/themes.js | 20 +-- public/src/admin/dashboard.js | 98 +++++------ public/src/admin/extend/plugins.js | 44 ++--- public/src/admin/extend/rewards.js | 46 ++--- public/src/admin/extend/widgets.js | 82 ++++----- public/src/admin/manage/admins-mods.js | 22 +-- public/src/admin/manage/categories.js | 60 +++---- public/src/admin/manage/category-analytics.js | 16 +- public/src/admin/manage/category.js | 50 +++--- public/src/admin/manage/digest.js | 8 +- public/src/admin/manage/group.js | 40 ++--- public/src/admin/manage/groups.js | 24 +-- public/src/admin/manage/registration.js | 28 ++-- public/src/admin/manage/tags.js | 18 +- public/src/admin/manage/uploads.js | 4 +- public/src/admin/manage/users.js | 86 +++++----- public/src/admin/modules/colorpicker.js | 4 +- .../src/admin/modules/dashboard-line-graph.js | 28 ++-- public/src/admin/modules/instance.js | 2 +- public/src/admin/modules/search.js | 34 ++-- public/src/admin/modules/selectable.js | 2 +- public/src/admin/settings.js | 44 ++--- public/src/admin/settings/api.js | 2 +- public/src/admin/settings/cookies.js | 2 +- public/src/admin/settings/email.js | 18 +- public/src/admin/settings/general.js | 2 +- public/src/admin/settings/homepage.js | 2 +- public/src/admin/settings/navigation.js | 40 ++--- public/src/admin/settings/notifications.js | 4 +- public/src/admin/settings/social.js | 4 +- public/src/ajaxify.js | 72 ++++---- public/src/app.js | 70 ++++---- public/src/client/account/best.js | 2 +- public/src/client/account/blocks.js | 6 +- public/src/client/account/bookmarks.js | 2 +- public/src/client/account/categories.js | 14 +- public/src/client/account/consent.js | 2 +- public/src/client/account/downvoted.js | 2 +- public/src/client/account/edit.js | 16 +- public/src/client/account/edit/email.js | 8 +- public/src/client/account/edit/password.js | 20 +-- public/src/client/account/edit/username.js | 8 +- public/src/client/account/followers.js | 2 +- public/src/client/account/following.js | 2 +- public/src/client/account/groups.js | 6 +- public/src/client/account/header.js | 12 +- public/src/client/account/ignored.js | 2 +- public/src/client/account/info.js | 8 +- public/src/client/account/posts.js | 8 +- public/src/client/account/profile.js | 2 +- public/src/client/account/sessions.js | 8 +- public/src/client/account/settings.js | 22 +-- public/src/client/account/topics.js | 8 +- public/src/client/account/uploads.js | 6 +- public/src/client/account/upvoted.js | 2 +- public/src/client/account/watched.js | 2 +- public/src/client/categories.js | 8 +- public/src/client/category.js | 14 +- public/src/client/category/tools.js | 36 ++-- public/src/client/chats.js | 88 +++++----- public/src/client/chats/messages.js | 24 +-- public/src/client/chats/recent.js | 8 +- public/src/client/chats/search.js | 10 +- public/src/client/compose.js | 4 +- public/src/client/flags/detail.js | 31 ++-- public/src/client/flags/list.js | 46 ++--- public/src/client/groups/details.js | 56 +++---- public/src/client/groups/list.js | 10 +- public/src/client/groups/memberlist.js | 26 +-- public/src/client/header/chat.js | 6 +- public/src/client/header/notifications.js | 8 +- public/src/client/infinitescroll.js | 44 ++--- public/src/client/ip-blacklist.js | 14 +- public/src/client/login.js | 18 +- public/src/client/notifications.js | 6 +- public/src/client/pagination.js | 6 +- public/src/client/popular.js | 2 +- public/src/client/post-queue.js | 28 ++-- public/src/client/recent.js | 2 +- public/src/client/register.js | 44 ++--- public/src/client/reset.js | 8 +- public/src/client/reset_code.js | 12 +- public/src/client/search.js | 28 ++-- public/src/client/tag.js | 2 +- public/src/client/tags.js | 2 +- public/src/client/top.js | 2 +- public/src/client/topic.js | 44 ++--- public/src/client/topic/change-owner.js | 8 +- public/src/client/topic/delete-posts.js | 10 +- public/src/client/topic/events.js | 40 ++--- public/src/client/topic/fork.js | 8 +- public/src/client/topic/images.js | 16 +- public/src/client/topic/merge.js | 20 +-- public/src/client/topic/move-post.js | 22 +-- public/src/client/topic/move.js | 12 +- public/src/client/topic/postTools.js | 108 ++++++------ public/src/client/topic/posts.js | 80 ++++----- public/src/client/topic/replies.js | 30 ++-- public/src/client/topic/threadTools.js | 28 ++-- public/src/client/topic/votes.js | 18 +- public/src/client/unread.js | 28 ++-- public/src/client/users.js | 20 +-- public/src/installer/install.js | 14 +- public/src/modules/accounts/delete.js | 2 +- public/src/modules/accounts/invite.js | 6 +- public/src/modules/accounts/picture.js | 8 +- public/src/modules/alerts.js | 10 +- public/src/modules/autocomplete.js | 10 +- public/src/modules/categoryFilter.js | 22 +-- public/src/modules/categorySearch.js | 12 +- public/src/modules/categorySelector.js | 14 +- public/src/modules/chat.js | 46 ++--- public/src/modules/components.js | 4 +- public/src/modules/coverPhoto.js | 6 +- public/src/modules/flags.js | 16 +- public/src/modules/groupSearch.js | 16 +- public/src/modules/handleBack.js | 22 +-- public/src/modules/helpers.js | 38 ++--- public/src/modules/iconSelect.js | 26 +-- public/src/modules/navigator.js | 158 +++++++++--------- public/src/modules/notifications.js | 30 ++-- public/src/modules/pictureCropper.js | 44 ++--- public/src/modules/postSelect.js | 12 +- public/src/modules/scrollStop.js | 8 +- public/src/modules/search.js | 32 ++-- public/src/modules/settings.js | 107 ++++++------ public/src/modules/settings/array.js | 39 +++-- public/src/modules/settings/checkbox.js | 7 +- public/src/modules/settings/key.js | 62 +++---- public/src/modules/settings/number.js | 2 +- public/src/modules/settings/object.js | 43 +++-- public/src/modules/settings/select.js | 17 +- public/src/modules/settings/sorted-list.js | 53 +++--- public/src/modules/settings/textarea.js | 7 +- public/src/modules/share.js | 8 +- public/src/modules/slugify.js | 16 +- public/src/modules/sort.js | 12 +- public/src/modules/storage.js | 4 +- public/src/modules/taskbar.js | 44 ++--- public/src/modules/topicList.js | 38 ++--- public/src/modules/topicSelect.js | 24 +-- public/src/modules/translator.js | 140 ++++++++-------- public/src/modules/uploader.js | 8 +- public/src/overrides.js | 34 ++-- public/src/sockets.js | 42 ++--- public/src/utils.js | 126 +++++++------- public/src/widgets.js | 8 +- src/socket.io/plugins.js | 2 +- 154 files changed, 1851 insertions(+), 1855 deletions(-) diff --git a/public/src/admin/admin.js b/public/src/admin/admin.js index ddcb52c284..ebb697f42d 100644 --- a/public/src/admin/admin.js +++ b/public/src/admin/admin.js @@ -1,8 +1,8 @@ 'use strict'; (function () { - var logoutTimer = 0; - var logoutMessage; + let logoutTimer = 0; + let logoutMessage; function startLogoutTimer() { if (app.config.adminReloginDuration <= 0) { return; @@ -94,11 +94,11 @@ } url = [config.relative_path, url].join('/'); - var fallback; + let fallback; $('#main-menu li').removeClass('active'); $('#main-menu a').removeClass('active').filter('[href="' + url + '"]').each(function () { - var menu = $(this); + const menu = $(this); if (menu.parent().attr('data-link')) { return; } @@ -109,13 +109,13 @@ fallback = menu.text(); }); - var mainTitle; - var pageTitle; + let mainTitle; + let pageTitle; if (/admin\/plugins\//.test(url)) { mainTitle = fallback; pageTitle = '[[admin/menu:section-plugins]] > ' + mainTitle; } else { - var matches = url.match(/admin\/(.+?)\/(.+?)$/); + const matches = url.match(/admin\/(.+?)\/(.+?)$/); if (matches) { mainTitle = '[[admin/menu:' + matches[1] + '/' + matches[2] + ']]'; pageTitle = '[[admin/menu:section-' + @@ -169,9 +169,9 @@ function configureSlidemenu() { require(['slideout'], function (Slideout) { - var env = utils.findBootstrapEnvironment(); + let env = utils.findBootstrapEnvironment(); - var slideout = new Slideout({ + const slideout = new Slideout({ panel: document.getElementById('panel'), menu: document.getElementById('menu'), padding: 256, diff --git a/public/src/admin/advanced/cache.js b/public/src/admin/advanced/cache.js index 7a97a09e8d..7bb1cbff7c 100644 --- a/public/src/admin/advanced/cache.js +++ b/public/src/admin/advanced/cache.js @@ -1,14 +1,14 @@ 'use strict'; define('admin/advanced/cache', function () { - var Cache = {}; + const Cache = {}; Cache.init = function () { require(['admin/settings'], function (Settings) { Settings.prepare(); }); $('.clear').on('click', function () { - var name = $(this).attr('data-name'); + const name = $(this).attr('data-name'); socket.emit('admin.cache.clear', { name: name }, function (err) { if (err) { return app.alertError(err.message); @@ -18,9 +18,9 @@ define('admin/advanced/cache', function () { }); $('.checkbox').on('change', function () { - var input = $(this).find('input'); - var flag = input.is(':checked'); - var name = $(this).attr('data-name'); + const input = $(this).find('input'); + const flag = input.is(':checked'); + const name = $(this).attr('data-name'); socket.emit('admin.cache.toggle', { name: name, enabled: flag }, function (err) { if (err) { return app.alertError(err.message); diff --git a/public/src/admin/advanced/errors.js b/public/src/admin/advanced/errors.js index 2a776bc103..ac9e7db071 100644 --- a/public/src/admin/advanced/errors.js +++ b/public/src/admin/advanced/errors.js @@ -2,7 +2,7 @@ define('admin/advanced/errors', ['bootbox', 'Chart'], function (bootbox, Chart) { - var Errors = {}; + const Errors = {}; Errors.init = function () { Errors.setupCharts(); @@ -26,9 +26,9 @@ define('admin/advanced/errors', ['bootbox', 'Chart'], function (bootbox, Chart) }; Errors.setupCharts = function () { - var notFoundCanvas = document.getElementById('not-found'); - var tooBusyCanvas = document.getElementById('toobusy'); - var dailyLabels = utils.getDaysArray(); + const notFoundCanvas = document.getElementById('not-found'); + const tooBusyCanvas = document.getElementById('toobusy'); + let dailyLabels = utils.getDaysArray(); dailyLabels = dailyLabels.slice(-7); @@ -36,7 +36,7 @@ define('admin/advanced/errors', ['bootbox', 'Chart'], function (bootbox, Chart) Chart.defaults.global.tooltips.enabled = false; } - var data = { + const data = { 'not-found': { labels: dailyLabels, datasets: [ diff --git a/public/src/admin/advanced/logs.js b/public/src/admin/advanced/logs.js index 42aebba080..6a236b49e3 100644 --- a/public/src/admin/advanced/logs.js +++ b/public/src/admin/advanced/logs.js @@ -2,17 +2,17 @@ define('admin/advanced/logs', function () { - var Logs = {}; + const Logs = {}; Logs.init = function () { - var logsEl = $('.logs pre'); + const logsEl = $('.logs pre'); logsEl.scrollTop(logsEl.prop('scrollHeight')); // Affix menu $('.affix').affix(); $('.logs').find('button[data-action]').on('click', function () { - var btnEl = $(this); - var action = btnEl.attr('data-action'); + const btnEl = $(this); + const action = btnEl.attr('data-action'); switch (action) { case 'reload': diff --git a/public/src/admin/appearance/customise.js b/public/src/admin/appearance/customise.js index 70393a50ae..d0a95050fd 100644 --- a/public/src/admin/appearance/customise.js +++ b/public/src/admin/appearance/customise.js @@ -1,7 +1,7 @@ 'use strict'; define('admin/appearance/customise', ['admin/settings', 'ace/ace'], function (Settings, ace) { - var Customise = {}; + const Customise = {}; Customise.init = function () { Settings.prepare(function () { @@ -9,9 +9,9 @@ define('admin/appearance/customise', ['admin/settings', 'ace/ace'], function (Se $('#customJS').text($('#customJS-holder').val()); $('#customHTML').text($('#customHTML-holder').val()); - var customCSS = ace.edit('customCSS'); - var customJS = ace.edit('customJS'); - var customHTML = ace.edit('customHTML'); + const customCSS = ace.edit('customCSS'); + const customJS = ace.edit('customJS'); + const customHTML = ace.edit('customHTML'); customCSS.setTheme('ace/theme/twilight'); customCSS.getSession().setMode('ace/mode/less'); diff --git a/public/src/admin/appearance/skins.js b/public/src/admin/appearance/skins.js index 157d227ba6..653742bd7d 100644 --- a/public/src/admin/appearance/skins.js +++ b/public/src/admin/appearance/skins.js @@ -2,7 +2,7 @@ define('admin/appearance/skins', ['translator'], function (translator) { - var Skins = {}; + const Skins = {}; Skins.init = function () { // Populate skins from Bootswatch API @@ -12,19 +12,19 @@ define('admin/appearance/skins', ['translator'], function (translator) { }).done(Skins.render); $('#skins').on('click', function (e) { - var target = $(e.target); + let target = $(e.target); if (!target.attr('data-action')) { target = target.parents('[data-action]'); } - var action = target.attr('data-action'); + const action = target.attr('data-action'); if (action && action === 'use') { - var parentEl = target.parents('[data-theme]'); - var themeType = parentEl.attr('data-type'); - var cssSrc = parentEl.attr('data-css'); - var themeId = parentEl.attr('data-theme'); + const parentEl = target.parents('[data-theme]'); + const themeType = parentEl.attr('data-type'); + const cssSrc = parentEl.attr('data-css'); + const themeId = parentEl.attr('data-theme'); socket.emit('admin.themes.set', { @@ -50,7 +50,7 @@ define('admin/appearance/skins', ['translator'], function (translator) { }; Skins.render = function (bootswatch) { - var themeContainer = $('#bootstrap_themes'); + const themeContainer = $('#bootstrap_themes'); app.parseAndTranslate('admin/partials/theme_list', { themes: bootswatch.themes.map(function (theme) { @@ -70,7 +70,7 @@ define('admin/appearance/skins', ['translator'], function (translator) { themeContainer.html(html); if (config['theme:src']) { - var skin = config['theme:src'] + const skin = config['theme:src'] .match(/latest\/(\S+)\/bootstrap.min.css/)[1] .replace(/(^|\s)([a-z])/g, function (m, p1, p2) { return p1 + p2.toUpperCase(); }); @@ -82,8 +82,8 @@ define('admin/appearance/skins', ['translator'], function (translator) { function highlightSelectedTheme(themeId) { translator.translate('[[admin/appearance/skins:select-skin]] || [[admin/appearance/skins:current-skin]]', function (text) { text = text.split(' || '); - var select = text[0]; - var current = text[1]; + const select = text[0]; + const current = text[1]; $('[data-theme]') .removeClass('selected') diff --git a/public/src/admin/appearance/themes.js b/public/src/admin/appearance/themes.js index b0b60d9535..7a27d94c9d 100644 --- a/public/src/admin/appearance/themes.js +++ b/public/src/admin/appearance/themes.js @@ -2,18 +2,18 @@ define('admin/appearance/themes', ['bootbox', 'translator'], function (bootbox, translator) { - var Themes = {}; + const Themes = {}; Themes.init = function () { $('#installed_themes').on('click', function (e) { - var target = $(e.target); - var action = target.attr('data-action'); + const target = $(e.target); + const action = target.attr('data-action'); if (action && action === 'use') { - var parentEl = target.parents('[data-theme]'); - var themeType = parentEl.attr('data-type'); - var cssSrc = parentEl.attr('data-css'); - var themeId = parentEl.attr('data-theme'); + const parentEl = target.parents('[data-theme]'); + const themeType = parentEl.attr('data-type'); + const cssSrc = parentEl.attr('data-css'); + const themeId = parentEl.attr('data-theme'); socket.emit('admin.themes.set', { type: themeType, @@ -70,7 +70,7 @@ define('admin/appearance/themes', ['bootbox', 'translator'], function (bootbox, return app.alertError(err.message); } - var instListEl = $('#installed_themes'); + const instListEl = $('#installed_themes'); if (!themes.length) { instListEl.append($('

    • ').addClass('no-themes').translateHtml('[[admin/appearance/themes:no-themes]]')); @@ -88,8 +88,8 @@ define('admin/appearance/themes', ['bootbox', 'translator'], function (bootbox, function highlightSelectedTheme(themeId) { translator.translate('[[admin/appearance/themes:select-theme]] || [[admin/appearance/themes:current-theme]]', function (text) { text = text.split(' || '); - var select = text[0]; - var current = text[1]; + const select = text[0]; + const current = text[1]; $('[data-theme]') .removeClass('selected') diff --git a/public/src/admin/dashboard.js b/public/src/admin/dashboard.js index 7406170220..2a50a09371 100644 --- a/public/src/admin/dashboard.js +++ b/public/src/admin/dashboard.js @@ -2,28 +2,28 @@ define('admin/dashboard', ['Chart', 'translator', 'benchpress', 'bootbox'], function (Chart, translator, Benchpress, bootbox) { - var Admin = {}; - var intervals = { + const Admin = {}; + const intervals = { rooms: false, graphs: false, }; - var isMobile = false; - var graphData = { + let isMobile = false; + const graphData = { rooms: {}, traffic: {}, }; - var currentGraph = { + const currentGraph = { units: 'hours', until: undefined, }; - var DEFAULTS = { + const DEFAULTS = { roomInterval: 10000, graphInterval: 15000, realtimeInterval: 1500, }; - var usedTopicColors = []; + const usedTopicColors = []; $(window).on('action:ajaxify.start', function () { clearInterval(intervals.rooms); @@ -62,7 +62,7 @@ define('admin/dashboard', ['Chart', 'translator', 'benchpress', 'bootbox'], func graphData.rooms = data; - var html = '
      ' + + const html = '
      ' + '' + data.onlineRegisteredCount + '' + '
      [[admin/dashboard:active-users.users]]
      ' + '
      ' + @@ -86,38 +86,38 @@ define('admin/dashboard', ['Chart', 'translator', 'benchpress', 'bootbox'], func $('#active-users').translateHtml(html); }; - var graphs = { + const graphs = { traffic: null, registered: null, presence: null, topics: null, }; - var topicColors = ['#bf616a', '#5B90BF', '#d08770', '#ebcb8b', '#a3be8c', '#96b5b4', '#8fa1b3', '#b48ead', '#ab7967', '#46BFBD']; + const topicColors = ['#bf616a', '#5B90BF', '#d08770', '#ebcb8b', '#a3be8c', '#96b5b4', '#8fa1b3', '#b48ead', '#ab7967', '#46BFBD']; /* eslint-disable */ // from chartjs.org function lighten(col, amt) { - var usePound = false; + let usePound = false; if (col[0] === '#') { col = col.slice(1); usePound = true; } - var num = parseInt(col, 16); + const num = parseInt(col, 16); - var r = (num >> 16) + amt; + let r = (num >> 16) + amt; if (r > 255) r = 255; else if (r < 0) r = 0; - var b = ((num >> 8) & 0x00FF) + amt; + let b = ((num >> 8) & 0x00FF) + amt; if (b > 255) b = 255; else if (b < 0) b = 0; - var g = (num & 0x0000FF) + amt; + let g = (num & 0x0000FF) + amt; if (g > 255) g = 255; else if (g < 0) g = 0; @@ -128,21 +128,21 @@ define('admin/dashboard', ['Chart', 'translator', 'benchpress', 'bootbox'], func function setupGraphs(callback) { callback = callback || function () {}; - var trafficCanvas = document.getElementById('analytics-traffic'); - var registeredCanvas = document.getElementById('analytics-registered'); - var presenceCanvas = document.getElementById('analytics-presence'); - var topicsCanvas = document.getElementById('analytics-topics'); - var trafficCtx = trafficCanvas.getContext('2d'); - var registeredCtx = registeredCanvas.getContext('2d'); - var presenceCtx = presenceCanvas.getContext('2d'); - var topicsCtx = topicsCanvas.getContext('2d'); - var trafficLabels = utils.getHoursArray(); + const trafficCanvas = document.getElementById('analytics-traffic'); + const registeredCanvas = document.getElementById('analytics-registered'); + const presenceCanvas = document.getElementById('analytics-presence'); + const topicsCanvas = document.getElementById('analytics-topics'); + const trafficCtx = trafficCanvas.getContext('2d'); + const registeredCtx = registeredCanvas.getContext('2d'); + const presenceCtx = presenceCanvas.getContext('2d'); + const topicsCtx = topicsCanvas.getContext('2d'); + const trafficLabels = utils.getHoursArray(); if (isMobile) { Chart.defaults.global.tooltips.enabled = false; } - var t = translator.Translator.create(); + const t = translator.Translator.create(); Promise.all([ t.translateKey('admin/dashboard:graphs.page-views', []), t.translateKey('admin/dashboard:graphs.page-views-registered', []), @@ -157,7 +157,7 @@ define('admin/dashboard', ['Chart', 'translator', 'benchpress', 'bootbox'], func t.translateKey('admin/dashboard:recent', []), t.translateKey('admin/dashboard:unread', []), ]).then(function (translations) { - var data = { + const data = { labels: trafficLabels, datasets: [ { @@ -323,8 +323,8 @@ define('admin/dashboard', ['Chart', 'translator', 'benchpress', 'bootbox'], func adjustPieCharts(); $('[data-action="updateGraph"]:not([data-units="custom"])').on('click', function () { - var until = new Date(); - var amount = $(this).attr('data-amount'); + let until = new Date(); + const amount = $(this).attr('data-amount'); if ($(this).attr('data-units') === 'days') { until.setHours(0, 0, 0, 0); } @@ -339,10 +339,10 @@ define('admin/dashboard', ['Chart', 'translator', 'benchpress', 'bootbox'], func }); $('[data-action="updateGraph"][data-units="custom"]').on('click', function () { - var targetEl = $(this); + const targetEl = $(this); Benchpress.render('admin/partials/pageviews-range-select', {}).then(function (html) { - var modal = bootbox.dialog({ + const modal = bootbox.dialog({ title: '[[admin/dashboard:page-views-custom]]', message: html, buttons: { @@ -353,10 +353,10 @@ define('admin/dashboard', ['Chart', 'translator', 'benchpress', 'bootbox'], func }, }, }).on('shown.bs.modal', function () { - var date = new Date(); - var today = date.toISOString().substr(0, 10); + const date = new Date(); + const today = date.toISOString().substr(0, 10); date.setDate(date.getDate() - 1); - var yesterday = date.toISOString().substr(0, 10); + const yesterday = date.toISOString().substr(0, 10); modal.find('#startRange').val(targetEl.attr('data-startRange') || yesterday); modal.find('#endRange').val(targetEl.attr('data-endRange') || today); @@ -364,8 +364,8 @@ define('admin/dashboard', ['Chart', 'translator', 'benchpress', 'bootbox'], func function submit() { // NEED TO ADD VALIDATION HERE FOR YYYY-MM-DD - var formData = modal.find('form').serializeObject(); - var validRegexp = /\d{4}-\d{2}-\d{2}/; + const formData = modal.find('form').serializeObject(); + const validRegexp = /\d{4}-\d{2}-\d{2}/; // Input validation if (!formData.startRange && !formData.endRange) { @@ -378,10 +378,10 @@ define('admin/dashboard', ['Chart', 'translator', 'benchpress', 'bootbox'], func return false; } - var until = new Date(formData.endRange); + let until = new Date(formData.endRange); until.setDate(until.getDate() + 1); until = until.getTime(); - var amount = (until - new Date(formData.startRange).getTime()) / (1000 * 60 * 60 * 24); + const amount = (until - new Date(formData.startRange).getTime()) / (1000 * 60 * 60 * 24); updateTrafficGraph('days', until, amount); @@ -401,7 +401,7 @@ define('admin/dashboard', ['Chart', 'translator', 'benchpress', 'bootbox'], func function adjustPieCharts() { $('.pie-chart.legend-up').each(function () { - var $this = $(this); + const $this = $(this); if ($this.width() < 320) { $this.addClass('compact'); @@ -459,8 +459,8 @@ define('admin/dashboard', ['Chart', 'translator', 'benchpress', 'bootbox'], func currentGraph.amount = amount; // Update the View as JSON button url - var apiEl = $('#view-as-json'); - var newHref = $.param({ + const apiEl = $('#view-as-json'); + const newHref = $.param({ units: units || 'hours', until: until, count: amount, @@ -517,10 +517,10 @@ define('admin/dashboard', ['Chart', 'translator', 'benchpress', 'bootbox'], func }); function buildTopicsLegend() { - var html = ''; + let html = ''; topics.forEach(function (t, i) { - var link = t.tid ? ' ' + t.title + '' : t.title; - var label = t.count === '0' ? t.title : link; + const link = t.tid ? ' ' + t.title + '' : t.title; + const label = t.count === '0' ? t.title : link; html += '
    • ' + '
      ' + @@ -536,7 +536,7 @@ define('admin/dashboard', ['Chart', 'translator', 'benchpress', 'bootbox'], func function setupRealtimeButton() { $('#toggle-realtime .fa').on('click', function () { - var $this = $(this); + const $this = $(this); if ($this.hasClass('fa-toggle-on')) { $this.removeClass('fa-toggle-on').addClass('fa-toggle-off'); $this.parent().find('strong').html('OFF'); @@ -565,11 +565,11 @@ define('admin/dashboard', ['Chart', 'translator', 'benchpress', 'bootbox'], func } function setupFullscreen() { - var container = document.getElementById('analytics-panel'); - var $container = $(container); - var btn = $container.find('.fa-expand'); - var fsMethod; - var exitMethod; + const container = document.getElementById('analytics-panel'); + const $container = $(container); + const btn = $container.find('.fa-expand'); + let fsMethod; + let exitMethod; if (container.requestFullscreen) { fsMethod = 'requestFullscreen'; diff --git a/public/src/admin/extend/plugins.js b/public/src/admin/extend/plugins.js index a81de5cb7a..36ff1fdb1d 100644 --- a/public/src/admin/extend/plugins.js +++ b/public/src/admin/extend/plugins.js @@ -7,11 +7,11 @@ define('admin/extend/plugins', [ 'bootbox', 'jquery-ui/widgets/sortable', ], function (translator, Benchpress, bootbox) { - var Plugins = {}; + const Plugins = {}; Plugins.init = function () { - var pluginsList = $('.plugins'); - var numPlugins = pluginsList[0].querySelectorAll('li').length; - var pluginID; + const pluginsList = $('.plugins'); + const numPlugins = pluginsList[0].querySelectorAll('li').length; + let pluginID; if (!numPlugins) { translator.translate('
    • [[admin/extend/plugins:none-found]]

    • ', function (html) { @@ -24,11 +24,11 @@ define('admin/extend/plugins', [ searchInputEl.value = ''; pluginsList.on('click', 'button[data-action="toggleActive"]', function () { - var pluginEl = $(this).parents('li'); + const pluginEl = $(this).parents('li'); pluginID = pluginEl.attr('data-plugin-id'); - var btn = $('[id="' + pluginID + '"] [data-action="toggleActive"]'); + const btn = $('[id="' + pluginID + '"] [data-action="toggleActive"]'); - var pluginData = ajaxify.data.installed[pluginEl.attr('data-plugin-index')]; + const pluginData = ajaxify.data.installed[pluginEl.attr('data-plugin-index')]; function toggleActivate() { socket.emit('admin.plugins.toggleActive', pluginID, function (err, status) { @@ -94,7 +94,7 @@ define('admin/extend/plugins', [ }); pluginsList.on('click', 'button[data-action="toggleInstall"]', function () { - var btn = $(this); + const btn = $(this); btn.attr('disabled', true); pluginID = $(this).parents('li').attr('data-plugin-id'); @@ -131,8 +131,8 @@ define('admin/extend/plugins', [ }); pluginsList.on('click', 'button[data-action="upgrade"]', function () { - var btn = $(this); - var parent = btn.parents('li'); + const btn = $(this); + const parent = btn.parents('li'); pluginID = parent.attr('data-plugin-id'); Plugins.suggest(pluginID, function (err, payload) { @@ -141,7 +141,7 @@ define('admin/extend/plugins', [ } require(['compare-versions'], function (compareVersions) { - var currentVersion = parent.find('.currentVersion').text(); + const currentVersion = parent.find('.currentVersion').text(); if (payload.version !== 'latest' && compareVersions.compare(payload.version, currentVersion, '>')) { upgrade(pluginID, btn, payload.version); } else if (payload.version === 'latest') { @@ -156,9 +156,9 @@ define('admin/extend/plugins', [ }); $(searchInputEl).on('input propertychange', function () { - var term = $(this).val(); + const term = $(this).val(); $('.plugins li').each(function () { - var pluginId = $(this).attr('data-plugin-id'); + const pluginId = $(this).attr('data-plugin-id'); $(this).toggleClass('hide', pluginId && pluginId.indexOf(term) === -1); }); }); @@ -179,7 +179,7 @@ define('admin/extend/plugins', [ if (err) { return app.alertError(err); } - var html = ''; + let html = ''; activePlugins.forEach(function (plugin) { html += '
    • ' + plugin + '
    • '; }); @@ -189,24 +189,24 @@ define('admin/extend/plugins', [ }); return; } - var list = $('#order-active-plugins-modal .plugin-list'); + const list = $('#order-active-plugins-modal .plugin-list'); list.html(html).sortable(); list.find('.fa-chevron-up').on('click', function () { - var item = $(this).parents('li'); + const item = $(this).parents('li'); item.prev().before(item); }); list.find('.fa-chevron-down').on('click', function () { - var item = $(this).parents('li'); + const item = $(this).parents('li'); item.next().after(item); }); }); }); $('#save-plugin-order').on('click', function () { - var plugins = $('#order-active-plugins-modal .plugin-list').children(); - var data = []; + const plugins = $('#order-active-plugins-modal .plugin-list').children(); + const data = []; plugins.each(function (index, el) { data.push({ name: $(el).text(), order: index }); }); @@ -252,7 +252,7 @@ define('admin/extend/plugins', [ if (err) { return app.alertError(err.message); } - var parent = btn.parents('li'); + const parent = btn.parents('li'); parent.find('.fa-exclamation-triangle').remove(); parent.find('.currentVersion').text(version); btn.remove(); @@ -274,7 +274,7 @@ define('admin/extend/plugins', [ } Plugins.toggleInstall = function (pluginID, version, callback) { - var btn = $('li[data-plugin-id="' + pluginID + '"] button[data-action="toggleInstall"]'); + const btn = $('li[data-plugin-id="' + pluginID + '"] button[data-action="toggleInstall"]'); btn.find('i').attr('class', 'fa fa-refresh fa-spin'); socket.emit('admin.plugins.toggleInstall', { @@ -303,7 +303,7 @@ define('admin/extend/plugins', [ }; Plugins.suggest = function (pluginId, callback) { - var nbbVersion = app.config.version.match(/^\d+\.\d+\.\d+/); + const nbbVersion = app.config.version.match(/^\d+\.\d+\.\d+/); $.ajax((app.config.registry || 'https://packages.nodebb.org') + '/api/v1/suggest', { type: 'GET', data: { diff --git a/public/src/admin/extend/rewards.js b/public/src/admin/extend/rewards.js index 93f6227ccd..2a07c4601f 100644 --- a/public/src/admin/extend/rewards.js +++ b/public/src/admin/extend/rewards.js @@ -2,13 +2,13 @@ define('admin/extend/rewards', [], function () { - var rewards = {}; + const rewards = {}; - var available; - var active; - var conditions; - var conditionals; + let available; + let active; + let conditions; + let conditionals; rewards.init = function () { available = ajaxify.data.rewards; @@ -25,8 +25,8 @@ define('admin/extend/rewards', [], function () { update($(this)); }) .on('click', '.delete', function () { - var parent = $(this).parents('[data-id]'); - var id = parent.attr('data-id'); + const parent = $(this).parents('[data-id]'); + const id = parent.attr('data-id'); socket.emit('admin.rewards.delete', { id: id }, function (err) { if (err) { @@ -40,8 +40,8 @@ define('admin/extend/rewards', [], function () { return false; }) .on('click', '.toggle', function () { - var btn = $(this); - var disabled = btn.hasClass('btn-success'); + const btn = $(this); + const disabled = btn.hasClass('btn-success'); btn.toggleClass('btn-warning').toggleClass('btn-success').translateHtml('[[admin/extend/rewards:' + (disabled ? 'disable' : 'enable') + ']]'); // send disable api call return false; @@ -72,12 +72,12 @@ define('admin/extend/rewards', [], function () { } function selectReward(el) { - var parent = el.parents('[data-rid]'); - var div = parent.find('.inputs'); - var inputs; - var html = ''; + const parent = el.parents('[data-rid]'); + const div = parent.find('.inputs'); + let inputs; + let html = ''; - for (var reward in available) { + for (const reward in available) { if (available.hasOwnProperty(reward)) { if (available[reward].rid === el.attr('data-selected')) { inputs = available[reward].inputs; @@ -112,10 +112,10 @@ define('admin/extend/rewards', [], function () { function populateInputs() { $('[data-rid]').each(function (i) { - var div = $(this).find('.inputs'); - var rewards = active[i].rewards; + const div = $(this).find('.inputs'); + const rewards = active[i].rewards; - for (var reward in rewards) { + for (const reward in rewards) { if (rewards.hasOwnProperty(reward)) { div.find('[name="' + reward + '"]').val(rewards[reward]); } @@ -124,9 +124,9 @@ define('admin/extend/rewards', [], function () { } function newReward() { - var ul = $('#active'); + const ul = $('#active'); - var data = { + const data = { active: [{ disabled: true, value: '', @@ -146,12 +146,12 @@ define('admin/extend/rewards', [], function () { } function saveRewards() { - var activeRewards = []; + const activeRewards = []; $('#active li').each(function () { - var data = { rewards: {} }; - var main = $(this).find('form.main').serializeArray(); - var rewards = $(this).find('form.rewards').serializeArray(); + const data = { rewards: {} }; + const main = $(this).find('form.main').serializeArray(); + const rewards = $(this).find('form.rewards').serializeArray(); main.forEach(function (obj) { data[obj.name] = obj.value; diff --git a/public/src/admin/extend/widgets.js b/public/src/admin/extend/widgets.js index 31e051a09c..aad32fe7e1 100644 --- a/public/src/admin/extend/widgets.js +++ b/public/src/admin/extend/widgets.js @@ -8,13 +8,13 @@ define('admin/extend/widgets', [ 'jquery-ui/widgets/droppable', 'jquery-ui/widgets/datepicker', ], function (bootbox) { - var Widgets = {}; + const Widgets = {}; Widgets.init = function () { $('#widgets .nav-pills .dropdown-menu a').on('click', function (ev) { - var $this = $(this); + const $this = $(this); $('#widgets .tab-pane').removeClass('active'); - var templateName = $this.attr('data-template'); + const templateName = $this.attr('data-template'); $('#widgets .tab-pane[data-template="' + templateName + '"]').addClass('active'); $('#widgets .selected-template').text(templateName); $('#widgets .nav-pills .dropdown').trigger('click'); @@ -47,7 +47,7 @@ define('admin/extend/widgets', [ $('#widgets .available-containers .containers > [data-container-html]') .draggable({ helper: function (e) { - var target = $(e.target); + let target = $(e.target); target = target.attr('data-container-html') ? target : target.parents('[data-container-html]'); return target.clone().addClass('block').width(target.width()).css('opacity', '0.5'); @@ -65,7 +65,7 @@ define('admin/extend/widgets', [ }, connectWith: 'div', }).on('click', '.delete-widget', function () { - var panel = $(this).parents('.widget-panel'); + const panel = $(this).parents('.widget-panel'); bootbox.confirm('[[admin/extend/widgets:alert.confirm-delete]]', function (confirm) { if (confirm) { @@ -81,20 +81,20 @@ define('admin/extend/widgets', [ $('#save').on('click', saveWidgets); function saveWidgets() { - var saveData = []; + const saveData = []; $('#widgets [data-template][data-location]').each(function (i, el) { el = $(el); - var template = el.attr('data-template'); - var location = el.attr('data-location'); - var area = el.children('.widget-area'); - var widgets = []; + const template = el.attr('data-template'); + const location = el.attr('data-location'); + const area = el.children('.widget-area'); + const widgets = []; area.find('.widget-panel[data-widget]').each(function () { - var widgetData = {}; - var data = $(this).find('form').serializeArray(); + const widgetData = {}; + const data = $(this).find('form').serializeArray(); - for (var d in data) { + for (const d in data) { if (data.hasOwnProperty(d)) { if (data[d].name) { if (widgetData[data[d].name]) { @@ -140,10 +140,10 @@ define('admin/extend/widgets', [ } $('.color-selector').on('click', '.btn', function () { - var btn = $(this); - var selector = btn.parents('.color-selector'); - var container = selector.parents('[data-container-html]'); - var classList = []; + const btn = $(this); + const selector = btn.parents('.color-selector'); + const container = selector.parents('[data-container-html]'); + const classList = []; selector.children().each(function () { classList.push($(this).attr('data-class')); @@ -159,7 +159,7 @@ define('admin/extend/widgets', [ } function createDatePicker(el) { - var currentYear = new Date().getFullYear(); + const currentYear = new Date().getFullYear(); el.find('.date-selector').datepicker({ changeMonth: true, changeYear: true, @@ -173,7 +173,7 @@ define('admin/extend/widgets', [ .droppable({ accept: '[data-container-html]', drop: function (event, ui) { - var el = $(this); + const el = $(this); el.find('.panel-body .container-html').val(ui.draggable.attr('data-container-html')); el.find('.panel-body').removeClass('hidden'); @@ -190,13 +190,13 @@ define('admin/extend/widgets', [ function loadWidgetData() { function populateWidget(widget, data) { if (data.title) { - var title = widget.find('.panel-heading strong'); + const title = widget.find('.panel-heading strong'); title.text(title.text() + ' - ' + data.title); } widget.find('input, textarea, select').each(function () { - var input = $(this); - var value = data[input.attr('name')]; + const input = $(this); + const value = data[input.attr('name')]; if (input.attr('type') === 'checkbox') { input.prop('checked', !!value).trigger('change'); @@ -209,17 +209,17 @@ define('admin/extend/widgets', [ } $.get(config.relative_path + '/api/admin/extend/widgets', function (data) { - var areas = data.areas; + const areas = data.areas; - for (var i = 0; i < areas.length; i += 1) { - var area = areas[i]; - var widgetArea = $('#widgets .area[data-template="' + area.template + '"][data-location="' + area.location + '"]').find('.widget-area'); + for (let i = 0; i < areas.length; i += 1) { + const area = areas[i]; + const widgetArea = $('#widgets .area[data-template="' + area.template + '"][data-location="' + area.location + '"]').find('.widget-area'); widgetArea.html(''); - for (var k = 0; k < area.data.length; k += 1) { - var widgetData = area.data[k]; - var widgetEl = $('.available-widgets [data-widget="' + widgetData.widget + '"]').clone(true).removeClass('hide'); + for (let k = 0; k < area.data.length; k += 1) { + const widgetData = area.data[k]; + const widgetEl = $('.available-widgets [data-widget="' + widgetData.widget + '"]').clone(true).removeClass('hide'); widgetArea.append(populateWidget(widgetEl, widgetData.data)); appendToggle(widgetEl); @@ -232,44 +232,44 @@ define('admin/extend/widgets', [ } function setupCloneButton() { - var clone = $('[component="clone"]'); - var cloneBtn = $('[component="clone/button"]'); + const clone = $('[component="clone"]'); + const cloneBtn = $('[component="clone/button"]'); clone.find('.dropdown-menu li').on('click', function () { - var template = $(this).find('a').text(); + const template = $(this).find('a').text(); cloneBtn.translateHtml('[[admin/extend/widgets:clone-from]] ' + template + ''); cloneBtn.attr('data-template', template); }); cloneBtn.on('click', function () { - var template = cloneBtn.attr('data-template'); + const template = cloneBtn.attr('data-template'); if (!template) { return app.alertError('[[admin/extend/widgets:error.select-clone]]'); } - var currentTemplate = $('#active-widgets .active.tab-pane[data-template] .area'); - var templateToClone = $('#active-widgets .tab-pane[data-template="' + template + '"] .area'); + const currentTemplate = $('#active-widgets .active.tab-pane[data-template] .area'); + const templateToClone = $('#active-widgets .tab-pane[data-template="' + template + '"] .area'); - var currentAreas = currentTemplate.map(function () { + const currentAreas = currentTemplate.map(function () { return $(this).attr('data-location'); }).get(); - var areasToClone = templateToClone.map(function () { - var location = $(this).attr('data-location'); + const areasToClone = templateToClone.map(function () { + const location = $(this).attr('data-location'); return currentAreas.indexOf(location) !== -1 ? location : undefined; }).get().filter(function (i) { return i; }); function clone(location) { $('#active-widgets .tab-pane[data-template="' + template + '"] [data-location="' + location + '"]').each(function () { $(this).find('[data-widget]').each(function () { - var widget = $(this).clone(true); + const widget = $(this).clone(true); $('#active-widgets .active.tab-pane[data-template]:not([data-template="global"]) [data-location="' + location + '"] .widget-area').append(widget); }); }); } - for (var i = 0, ii = areasToClone.length; i < ii; i++) { - var location = areasToClone[i]; + for (let i = 0, ii = areasToClone.length; i < ii; i++) { + const location = areasToClone[i]; clone(location); } diff --git a/public/src/admin/manage/admins-mods.js b/public/src/admin/manage/admins-mods.js index 2bceceb15e..0a8ec2dc62 100644 --- a/public/src/admin/manage/admins-mods.js +++ b/public/src/admin/manage/admins-mods.js @@ -3,7 +3,7 @@ define('admin/manage/admins-mods', [ 'autocomplete', 'api', 'bootbox', 'categorySelector', ], function (autocomplete, api, bootbox, categorySelector) { - var AdminsMods = {}; + const AdminsMods = {}; AdminsMods.init = function () { autocomplete.user($('#admin-search'), function (ev, ui) { @@ -25,8 +25,8 @@ define('admin/manage/admins-mods', [ }); $('.administrator-area').on('click', '.remove-user-icon', function () { - var userCard = $(this).parents('[data-uid]'); - var uid = userCard.attr('data-uid'); + const userCard = $(this).parents('[data-uid]'); + const uid = userCard.attr('data-uid'); if (parseInt(uid, 10) === parseInt(app.user.uid, 10)) { return app.alertError('[[admin/manage/users:alerts.no-remove-yourself-admin]]'); } @@ -60,8 +60,8 @@ define('admin/manage/admins-mods', [ }); $('.global-moderator-area').on('click', '.remove-user-icon', function () { - var userCard = $(this).parents('[data-uid]'); - var uid = userCard.attr('data-uid'); + const userCard = $(this).parents('[data-uid]'); + const uid = userCard.attr('data-uid'); bootbox.confirm('[[admin/manage/users:alerts.confirm-remove-global-mod]]', function (confirm) { if (confirm) { @@ -85,8 +85,8 @@ define('admin/manage/admins-mods', [ }); autocomplete.user($('.moderator-search'), function (ev, ui) { - var input = $(ev.target); - var cid = $(ev.target).attr('data-cid'); + const input = $(ev.target); + const cid = $(ev.target).attr('data-cid'); socket.emit('admin.categories.setPrivilege', { cid: cid, privilege: ajaxify.data.allPrivileges, @@ -111,10 +111,10 @@ define('admin/manage/admins-mods', [ }); $('.moderator-area').on('click', '.remove-user-icon', function () { - var moderatorArea = $(this).parents('[data-cid]'); - var cid = moderatorArea.attr('data-cid'); - var userCard = $(this).parents('[data-uid]'); - var uid = userCard.attr('data-uid'); + const moderatorArea = $(this).parents('[data-cid]'); + const cid = moderatorArea.attr('data-cid'); + const userCard = $(this).parents('[data-uid]'); + const uid = userCard.attr('data-uid'); bootbox.confirm('[[admin/manage/users:alerts.confirm-remove-moderator]]', function (confirm) { if (confirm) { diff --git a/public/src/admin/manage/categories.js b/public/src/admin/manage/categories.js index c6d1307a4d..c8a8a10bfd 100644 --- a/public/src/admin/manage/categories.js +++ b/public/src/admin/manage/categories.js @@ -8,9 +8,9 @@ define('admin/manage/categories', [ 'Sortable', 'bootbox', ], function (translator, Benchpress, categorySelector, api, Sortable, bootbox) { - var Categories = {}; - var newCategoryId = -1; - var sortables; + const Categories = {}; + let newCategoryId = -1; + let sortables; Categories.init = function () { categorySelector.init($('.category [component="category-selector"]'), { @@ -26,12 +26,12 @@ define('admin/manage/categories', [ // Enable/Disable toggle events $('.categories').on('click', '.category-tools [data-action="toggle"]', function () { - var $this = $(this); - var cid = $this.attr('data-disable-cid'); - var parentEl = $this.parents('li[data-cid="' + cid + '"]'); - var disabled = parentEl.hasClass('disabled'); - var childrenEls = parentEl.find('li[data-cid]'); - var childrenCids = childrenEls.map(function () { + const $this = $(this); + const cid = $this.attr('data-disable-cid'); + const parentEl = $this.parents('li[data-cid="' + cid + '"]'); + const disabled = parentEl.hasClass('disabled'); + const childrenEls = parentEl.find('li[data-cid]'); + const childrenCids = childrenEls.map(function () { return $(this).attr('data-cid'); }).get(); @@ -39,15 +39,15 @@ define('admin/manage/categories', [ }); $('.categories').on('click', '.toggle', function () { - var el = $(this); + const el = $(this); el.find('i').toggleClass('fa-minus').toggleClass('fa-plus'); el.closest('[data-cid]').find('> ul[data-cid]').toggleClass('hidden'); }); $('.categories').on('click', '.set-order', function () { - var cid = $(this).attr('data-cid'); - var order = $(this).attr('data-order'); - var modal = bootbox.dialog({ + const cid = $(this).attr('data-cid'); + const order = $(this).attr('data-order'); + const modal = bootbox.dialog({ title: '[[admin/manage/categories:set-order]]', message: '

      [[admin/manage/categories:set-order-help]]

      ', show: true, @@ -56,9 +56,9 @@ define('admin/manage/categories', [ label: '[[modules:bootbox.confirm]]', className: 'btn-primary', callback: function () { - var val = modal.find('input').val(); + const val = modal.find('input').val(); if (val && cid) { - var modified = {}; + const modified = {}; modified[cid] = { order: Math.max(1, parseInt(val, 10)) }; api.put('/categories/' + cid, modified[cid]).then(function () { ajaxify.refresh(); @@ -81,7 +81,7 @@ define('admin/manage/categories', [ }); function toggleAll(expand) { - var el = $('.categories .toggle'); + const el = $('.categories .toggle'); el.find('i').toggleClass('fa-minus', expand).toggleClass('fa-plus', !expand); el.closest('[data-cid]').find('> ul[data-cid]').toggleClass('hidden', !expand); } @@ -89,7 +89,7 @@ define('admin/manage/categories', [ Categories.throwCreateModal = function () { Benchpress.render('admin/partials/categories/create', {}).then(function (html) { - var modal = bootbox.dialog({ + const modal = bootbox.dialog({ title: '[[admin/manage/categories:alert.create]]', message: html, buttons: { @@ -100,7 +100,7 @@ define('admin/manage/categories', [ }, }, }); - var options = { + const options = { localCategories: [ { cid: 0, @@ -109,10 +109,10 @@ define('admin/manage/categories', [ }, ], }; - var parentSelector = categorySelector.init(modal.find('#parentCidGroup [component="category-selector"]'), options); - var cloneFromSelector = categorySelector.init(modal.find('#cloneFromCidGroup [component="category-selector"]'), options); + const parentSelector = categorySelector.init(modal.find('#parentCidGroup [component="category-selector"]'), options); + const cloneFromSelector = categorySelector.init(modal.find('#cloneFromCidGroup [component="category-selector"]'), options); function submit() { - var formData = modal.find('form').serializeObject(); + const formData = modal.find('form').serializeObject(); formData.description = ''; formData.icon = 'fa-comments'; formData.uid = app.user.uid; @@ -125,8 +125,8 @@ define('admin/manage/categories', [ } $('#cloneChildren').on('change', function () { - var check = $(this); - var parentSelect = modal.find('#parentCidGroup [component="category-selector"] .dropdown-toggle'); + const check = $(this); + const parentSelect = modal.find('#parentCidGroup [component="category-selector"] .dropdown-toggle'); if (check.prop('checked')) { parentSelect.attr('disabled', 'disabled'); @@ -159,7 +159,7 @@ define('admin/manage/categories', [ }; Categories.render = function (categories) { - var container = $('.categories'); + const container = $('.categories'); if (!categories || !categories.length) { translator.translate('[[admin/manage/categories:alert.none-active]]', function (text) { @@ -190,15 +190,15 @@ define('admin/manage/categories', [ } function itemDragDidEnd(e) { - var isCategoryUpdate = parseInt(newCategoryId, 10) !== -1; + const isCategoryUpdate = parseInt(newCategoryId, 10) !== -1; // Update needed? if ((e.newIndex != null && parseInt(e.oldIndex, 10) !== parseInt(e.newIndex, 10)) || isCategoryUpdate) { - var cid = e.item.dataset.cid; - var modified = {}; + const cid = e.item.dataset.cid; + const modified = {}; // on page 1 baseIndex is 0, on page n baseIndex is (n - 1) * ajaxify.data.categoriesPerPage // this makes sure order is correct when drag & drop is used on pages > 1 - var baseIndex = (ajaxify.data.pagination.currentPage - 1) * ajaxify.data.categoriesPerPage; + const baseIndex = (ajaxify.data.pagination.currentPage - 1) * ajaxify.data.categoriesPerPage; modified[cid] = { order: baseIndex + e.newIndex + 1, }; @@ -222,7 +222,7 @@ define('admin/manage/categories', [ */ function renderList(categories, container, parentId) { // Translate category names if needed - var count = 0; + let count = 0; categories.forEach(function (category, idx, parent) { translator.translate(category.name, function (translated) { if (category.name !== translated) { @@ -248,7 +248,7 @@ define('admin/manage/categories', [ container.append(html); // Handle and children categories in this level have - for (var x = 0, numCategories = categories.length; x < numCategories; x += 1) { + for (let x = 0, numCategories = categories.length; x < numCategories; x += 1) { renderList(categories[x].children, $('li[data-cid="' + categories[x].cid + '"]'), categories[x].cid); } diff --git a/public/src/admin/manage/category-analytics.js b/public/src/admin/manage/category-analytics.js index 089f34ae08..6a283ef43f 100644 --- a/public/src/admin/manage/category-analytics.js +++ b/public/src/admin/manage/category-analytics.js @@ -2,17 +2,17 @@ define('admin/manage/category-analytics', ['Chart'], function (Chart) { - var CategoryAnalytics = {}; + const CategoryAnalytics = {}; CategoryAnalytics.init = function () { - var hourlyCanvas = document.getElementById('pageviews:hourly'); - var dailyCanvas = document.getElementById('pageviews:daily'); - var topicsCanvas = document.getElementById('topics:daily'); - var postsCanvas = document.getElementById('posts:daily'); - var hourlyLabels = utils.getHoursArray().map(function (text, idx) { + const hourlyCanvas = document.getElementById('pageviews:hourly'); + const dailyCanvas = document.getElementById('pageviews:daily'); + const topicsCanvas = document.getElementById('topics:daily'); + const postsCanvas = document.getElementById('posts:daily'); + const hourlyLabels = utils.getHoursArray().map(function (text, idx) { return idx % 3 ? '' : text; }); - var dailyLabels = utils.getDaysArray().map(function (text, idx) { + const dailyLabels = utils.getDaysArray().map(function (text, idx) { return idx % 3 ? '' : text; }); @@ -20,7 +20,7 @@ define('admin/manage/category-analytics', ['Chart'], function (Chart) { Chart.defaults.global.tooltips.enabled = false; } - var data = { + const data = { 'pageviews:hourly': { labels: hourlyLabels, datasets: [ diff --git a/public/src/admin/manage/category.js b/public/src/admin/manage/category.js index 336cdacb98..10f665ecab 100644 --- a/public/src/admin/manage/category.js +++ b/public/src/admin/manage/category.js @@ -8,12 +8,12 @@ define('admin/manage/category', [ 'api', 'bootbox', ], function (uploader, iconSelect, categorySelector, Benchpress, api, bootbox) { - var Category = {}; - var updateHash = {}; + const Category = {}; + let updateHash = {}; Category.init = function () { $('#category-settings select').each(function () { - var $this = $(this); + const $this = $(this); $this.val($this.attr('data-value')); }); @@ -35,8 +35,8 @@ define('admin/manage/category', [ }); $('[data-name="bgColor"], [data-name="color"]').on('input', function () { - var $inputEl = $(this); - var previewEl = $inputEl.parents('[data-cid]').find('.category-preview'); + const $inputEl = $(this); + const previewEl = $inputEl.parents('[data-cid]').find('.category-preview'); if ($inputEl.attr('data-name') === 'bgColor') { previewEl.css('background-color', $inputEl.val()); } else if ($inputEl.attr('data-name') === 'color') { @@ -47,12 +47,12 @@ define('admin/manage/category', [ }); $('#save').on('click', function () { - var tags = $('#tag-whitelist').val() ? $('#tag-whitelist').val().split(',') : []; + const tags = $('#tag-whitelist').val() ? $('#tag-whitelist').val().split(',') : []; if (tags.length && tags.length < parseInt($('#cid-min-tags').val(), 10)) { return app.alertError('[[admin/manage/categories:alert.not-enough-whitelisted-tags]]'); } - var cid = ajaxify.data.category.cid; + const cid = ajaxify.data.category.cid; api.put('/categories/' + cid, updateHash).then((res) => { app.flags._unsaved = false; app.alert({ @@ -74,7 +74,7 @@ define('admin/manage/category', [ name: ajaxify.data.category.name, topic_count: ajaxify.data.category.topic_count, }).then(function (html) { - var modal = bootbox.dialog({ + const modal = bootbox.dialog({ title: '[[admin/manage/categories:purge]]', message: html, size: 'large', @@ -85,13 +85,13 @@ define('admin/manage/category', [ callback: function () { modal.find('.modal-footer button').prop('disabled', true); - var intervalId = setInterval(function () { + const intervalId = setInterval(function () { socket.emit('categories.getTopicCount', ajaxify.data.category.cid, function (err, count) { if (err) { return app.alertError(err); } - var percent = 0; + let percent = 0; if (ajaxify.data.category.topic_count > 0) { percent = Math.max(0, (1 - (count / ajaxify.data.category.topic_count))) * 100; } @@ -119,8 +119,8 @@ define('admin/manage/category', [ $('.copy-settings').on('click', function () { Benchpress.render('admin/partials/categories/copy-settings', {}).then(function (html) { - var selectedCid; - var modal = bootbox.dialog({ + let selectedCid; + const modal = bootbox.dialog({ title: '[[modules:composer.select_category]]', message: html, buttons: { @@ -165,8 +165,8 @@ define('admin/manage/category', [ }); $('.upload-button').on('click', function () { - var inputEl = $(this); - var cid = inputEl.attr('data-cid'); + const inputEl = $(this); + const cid = inputEl.attr('data-cid'); uploader.show({ title: '[[admin/manage/categories:alert.upload-image]]', @@ -174,7 +174,7 @@ define('admin/manage/category', [ params: { cid: cid }, }, function (imageUrlOnServer) { $('#category-image').val(imageUrlOnServer); - var previewBox = inputEl.parent().parent().siblings('.category-preview'); + const previewBox = inputEl.parent().parent().siblings('.category-preview'); previewBox.css('background', 'url(' + imageUrlOnServer + '?' + new Date().getTime() + ')'); modified($('#category-image')); @@ -189,8 +189,8 @@ define('admin/manage/category', [ $('.delete-image').on('click', function (e) { e.preventDefault(); - var inputEl = $('#category-image'); - var previewBox = $('.category-preview'); + const inputEl = $('#category-image'); + const previewBox = $('.category-preview'); inputEl.val(''); previewBox.css('background-image', ''); @@ -217,8 +217,8 @@ define('admin/manage/category', [ }).catch(app.alertError); }); $('button[data-action="toggle"]').on('click', function () { - var $this = $(this); - var disabled = $this.attr('data-disabled') === '1'; + const $this = $(this); + const disabled = $this.attr('data-disabled') === '1'; api.put('/categories/' + ajaxify.data.category.cid, { disabled: disabled ? 0 : 1, }).then(() => { @@ -230,14 +230,14 @@ define('admin/manage/category', [ }; function modified(el) { - var value; + let value; if ($(el).is(':checkbox')) { value = $(el).is(':checked') ? 1 : 0; } else { value = $(el).val(); } - var dataName = $(el).attr('data-name'); - var fields = dataName.match(/[^\][.]+/g); + const dataName = $(el).attr('data-name'); + const fields = dataName.match(/[^\][.]+/g); function setNestedFields(obj, index) { if (index === fields.length) { @@ -263,7 +263,7 @@ define('admin/manage/category', [ } function handleTags() { - var tagEl = $('#tag-whitelist'); + const tagEl = $('#tag-whitelist'); tagEl.tagsinput({ confirmKeys: [13, 44], trimValue: true, @@ -281,7 +281,7 @@ define('admin/manage/category', [ Category.launchParentSelector = function () { categorySelector.modal({ onSubmit: function (selectedCategory) { - var parentCid = selectedCategory.cid; + const parentCid = selectedCategory.cid; if (!parentCid) { return; } @@ -290,7 +290,7 @@ define('admin/manage/category', [ }).then(() => { api.get(`/categories/${parentCid}`, {}).then(function (parent) { if (parent && parent.icon && parent.name) { - var buttonHtml = ' ' + parent.name; + const buttonHtml = ' ' + parent.name; $('button[data-action="changeParent"]').html(buttonHtml).parent().removeClass('hide'); } }); diff --git a/public/src/admin/manage/digest.js b/public/src/admin/manage/digest.js index 85876517dd..86b19e6576 100644 --- a/public/src/admin/manage/digest.js +++ b/public/src/admin/manage/digest.js @@ -2,15 +2,15 @@ define('admin/manage/digest', ['bootbox'], function (bootbox) { - var Digest = {}; + const Digest = {}; Digest.init = function () { $('table').on('click', '[data-action]', function () { - var action = this.getAttribute('data-action'); - var uid = this.getAttribute('data-uid'); + const action = this.getAttribute('data-action'); + const uid = this.getAttribute('data-uid'); if (action.startsWith('resend-')) { - var interval = action.slice(7); + const interval = action.slice(7); bootbox.confirm('[[admin/manage/digest:resend-all-confirm]]', function (ok) { if (ok) { Digest.send(action, undefined, function (err) { diff --git a/public/src/admin/manage/group.js b/public/src/admin/manage/group.js index c873dc40b4..8e7ea9133e 100644 --- a/public/src/admin/manage/group.js +++ b/public/src/admin/manage/group.js @@ -10,17 +10,17 @@ define('admin/manage/group', [ 'api', 'bootbox', ], function (memberList, iconSelect, translator, categorySelector, groupSearch, slugify, api, bootbox) { - var Groups = {}; + const Groups = {}; Groups.init = function () { - var groupIcon = $('#group-icon'); - var changeGroupUserTitle = $('#change-group-user-title'); - var changeGroupLabelColor = $('#change-group-label-color'); - var changeGroupTextColor = $('#change-group-text-color'); - var groupLabelPreview = $('#group-label-preview'); - var groupLabelPreviewText = $('#group-label-preview-text'); + const groupIcon = $('#group-icon'); + const changeGroupUserTitle = $('#change-group-user-title'); + const changeGroupLabelColor = $('#change-group-label-color'); + const changeGroupTextColor = $('#change-group-text-color'); + const groupLabelPreview = $('#group-label-preview'); + const groupLabelPreviewText = $('#group-label-preview-text'); - var groupName = ajaxify.data.group.name; + const groupName = ajaxify.data.group.name; $('#group-selector').on('change', function () { ajaxify.go('admin/manage/groups/' + $(this).val() + window.location.hash); @@ -43,9 +43,9 @@ define('admin/manage/group', [ setupGroupMembersMenu(); $('#group-icon, #group-icon-label').on('click', function () { - var currentIcon = groupIcon.attr('value'); + const currentIcon = groupIcon.attr('value'); iconSelect.init(groupIcon, function () { - var newIcon = groupIcon.attr('value'); + let newIcon = groupIcon.attr('value'); if (newIcon === currentIcon) { return; } @@ -65,9 +65,9 @@ define('admin/manage/group', [ showLinks: true, }); - var cidSelector = categorySelector.init($('.member-post-cids-selector [component="category-selector"]'), { + const cidSelector = categorySelector.init($('.member-post-cids-selector [component="category-selector"]'), { onSelect: function (selectedCategory) { - var cids = ($('#memberPostCids').val() || '').split(',').map(cid => parseInt(cid, 10)); + let cids = ($('#memberPostCids').val() || '').split(',').map(cid => parseInt(cid, 10)); cids.push(selectedCategory.cid); cids = cids.filter((cid, index, array) => array.indexOf(cid) === index); $('#memberPostCids').val(cids.join(',')); @@ -97,7 +97,7 @@ define('admin/manage/group', [ disableJoinRequests: $('#group-disableJoinRequests').is(':checked'), disableLeave: $('#group-disableLeave').is(':checked'), }).then(() => { - var newName = $('#change-group-name').val(); + const newName = $('#change-group-name').val(); // If the group name changed, change url if (groupName !== newName) { @@ -112,12 +112,12 @@ define('admin/manage/group', [ function setupGroupMembersMenu() { $('[component="groups/members"]').on('click', '[data-action]', function () { - var btnEl = $(this); - var userRow = btnEl.parents('[data-uid]'); - var ownerFlagEl = userRow.find('.member-name .user-owner-icon'); - var isOwner = !ownerFlagEl.hasClass('invisible'); - var uid = userRow.attr('data-uid'); - var action = btnEl.attr('data-action'); + const btnEl = $(this); + const userRow = btnEl.parents('[data-uid]'); + const ownerFlagEl = userRow.find('.member-name .user-owner-icon'); + const isOwner = !ownerFlagEl.hasClass('invisible'); + const uid = userRow.attr('data-uid'); + const action = btnEl.attr('data-action'); switch (action) { case 'toggleOwnership': @@ -144,7 +144,7 @@ define('admin/manage/group', [ function navigateToCategory(cid) { if (cid) { - var url = 'admin/manage/privileges/' + cid + '?group=' + ajaxify.data.group.nameEncoded; + const url = 'admin/manage/privileges/' + cid + '?group=' + ajaxify.data.group.nameEncoded; if (app.flags && app.flags._unsaved === true) { translator.translate('[[global:unsaved-changes]]', function (text) { bootbox.confirm(text, function (navigate) { diff --git a/public/src/admin/manage/groups.js b/public/src/admin/manage/groups.js index 9dbb204419..10867bede5 100644 --- a/public/src/admin/manage/groups.js +++ b/public/src/admin/manage/groups.js @@ -6,13 +6,13 @@ define('admin/manage/groups', [ 'api', 'bootbox', ], function (categorySelector, slugify, api, bootbox) { - var Groups = {}; + const Groups = {}; Groups.init = function () { - var createModal = $('#create-modal'); - var createGroupName = $('#create-group-name'); - var createModalGo = $('#create-modal-go'); - var createModalError = $('#create-modal-error'); + const createModal = $('#create-modal'); + const createGroupName = $('#create-group-name'); + const createModalGo = $('#create-modal-go'); + const createModalError = $('#create-modal-error'); handleSearch(); @@ -30,7 +30,7 @@ define('admin/manage/groups', [ }); createModalGo.on('click', function () { - var submitObj = { + const submitObj = { name: createGroupName.val(), description: $('#create-group-desc').val(), private: $('#create-group-private').is(':checked') ? 1 : 0, @@ -53,9 +53,9 @@ define('admin/manage/groups', [ }); $('.groups-list').on('click', '[data-action]', function () { - var el = $(this); - var action = el.attr('data-action'); - var groupName = el.parents('tr[data-groupname]').attr('data-groupname'); + const el = $(this); + const action = el.attr('data-action'); + const groupName = el.parents('tr[data-groupname]').attr('data-groupname'); switch (action) { case 'delete': @@ -73,7 +73,7 @@ define('admin/manage/groups', [ function enableCategorySelectors() { $('.groups-list [component="category-selector"]').each(function () { - var nameEncoded = $(this).parents('[data-name-encoded]').attr('data-name-encoded'); + const nameEncoded = $(this).parents('[data-name-encoded]').attr('data-name-encoded'); categorySelector.init($(this), { onSelect: function (selectedCategory) { ajaxify.go('admin/manage/privileges/' + selectedCategory.cid + '?group=' + nameEncoded); @@ -84,14 +84,14 @@ define('admin/manage/groups', [ } function handleSearch() { - var queryEl = $('#group-search'); + const queryEl = $('#group-search'); function doSearch() { if (!queryEl.val()) { return ajaxify.refresh(); } $('.pagination').addClass('hide'); - var groupsEl = $('.groups-list'); + const groupsEl = $('.groups-list'); socket.emit('groups.search', { query: queryEl.val(), options: { diff --git a/public/src/admin/manage/registration.js b/public/src/admin/manage/registration.js index 1b0f80875b..90f0387f87 100644 --- a/public/src/admin/manage/registration.js +++ b/public/src/admin/manage/registration.js @@ -2,14 +2,14 @@ define('admin/manage/registration', ['bootbox'], function (bootbox) { - var Registration = {}; + const Registration = {}; Registration.init = function () { $('.users-list').on('click', '[data-action]', function () { - var parent = $(this).parents('[data-username]'); - var action = $(this).attr('data-action'); - var username = parent.attr('data-username'); - var method = action === 'accept' ? 'user.acceptRegistration' : 'user.rejectRegistration'; + const parent = $(this).parents('[data-username]'); + const action = $(this).attr('data-action'); + const username = parent.attr('data-username'); + const method = action === 'accept' ? 'user.acceptRegistration' : 'user.rejectRegistration'; socket.emit(method, { username: username }, function (err) { if (err) { @@ -21,16 +21,16 @@ define('admin/manage/registration', ['bootbox'], function (bootbox) { }); $('.invites-list').on('click', '[data-action]', function () { - var parent = $(this).parents('[data-invitation-mail][data-invited-by]'); - var email = parent.attr('data-invitation-mail'); - var invitedBy = parent.attr('data-invited-by'); - var action = $(this).attr('data-action'); - var method = 'user.deleteInvitation'; + const parent = $(this).parents('[data-invitation-mail][data-invited-by]'); + const email = parent.attr('data-invitation-mail'); + const invitedBy = parent.attr('data-invited-by'); + const action = $(this).attr('data-action'); + const method = 'user.deleteInvitation'; - var removeRow = function () { - var nextRow = parent.next(); - var thisRowinvitedBy = parent.find('.invited-by'); - var nextRowInvitedBy = nextRow.find('.invited-by'); + const removeRow = function () { + const nextRow = parent.next(); + const thisRowinvitedBy = parent.find('.invited-by'); + const nextRowInvitedBy = nextRow.find('.invited-by'); if (nextRowInvitedBy.html() !== undefined && nextRowInvitedBy.html().length < 2) { nextRowInvitedBy.html(thisRowinvitedBy.html()); } diff --git a/public/src/admin/manage/tags.js b/public/src/admin/manage/tags.js index d2a4817158..836c8f7be9 100644 --- a/public/src/admin/manage/tags.js +++ b/public/src/admin/manage/tags.js @@ -6,7 +6,7 @@ define('admin/manage/tags', [ 'forum/infinitescroll', 'admin/modules/selectable', ], function (bootbox, infinitescroll, selectable) { - var Tags = {}; + const Tags = {}; Tags.init = function () { selectable.enable('.tag-management', '.tag-row'); @@ -18,9 +18,9 @@ define('admin/manage/tags', [ }; function handleCreate() { - var createModal = $('#create-modal'); - var createTagName = $('#create-tag-name'); - var createModalGo = $('#create-modal-go'); + const createModal = $('#create-modal'); + const createTagName = $('#create-tag-name'); + const createModalGo = $('#create-modal-go'); createModal.on('keypress', function (e) { if (e.keyCode === 13) { @@ -74,12 +74,12 @@ define('admin/manage/tags', [ function handleRename() { $('#rename').on('click', function () { - var tagsToModify = $('.tag-row.ui-selected'); + const tagsToModify = $('.tag-row.ui-selected'); if (!tagsToModify.length) { return; } - var modal = bootbox.dialog({ + const modal = bootbox.dialog({ title: '[[admin/manage/tags:alerts.editing]]', message: $('.rename-modal').html(), buttons: { @@ -87,7 +87,7 @@ define('admin/manage/tags', [ label: 'Save', className: 'btn-primary save', callback: function () { - var data = []; + const data = []; tagsToModify.each(function (idx, tag) { tag = $(tag); data.push({ @@ -112,7 +112,7 @@ define('admin/manage/tags', [ function handleDeleteSelected() { $('#deleteSelected').on('click', function () { - var tagsToDelete = $('.tag-row.ui-selected'); + const tagsToDelete = $('.tag-row.ui-selected'); if (!tagsToDelete.length) { return; } @@ -121,7 +121,7 @@ define('admin/manage/tags', [ if (!confirm) { return; } - var tags = []; + const tags = []; tagsToDelete.each(function (index, el) { tags.push($(el).attr('data-tag')); }); diff --git a/public/src/admin/manage/uploads.js b/public/src/admin/manage/uploads.js index 6ed59d2f77..ef19b1aaf8 100644 --- a/public/src/admin/manage/uploads.js +++ b/public/src/admin/manage/uploads.js @@ -1,7 +1,7 @@ 'use strict'; define('admin/manage/uploads', ['api', 'bootbox', 'uploader'], function (api, bootbox, uploader) { - var Uploads = {}; + const Uploads = {}; Uploads.init = function () { $('#upload').on('click', function () { @@ -15,7 +15,7 @@ define('admin/manage/uploads', ['api', 'bootbox', 'uploader'], function (api, bo }); $('.delete').on('click', function () { - var file = $(this).parents('[data-path]'); + const file = $(this).parents('[data-path]'); bootbox.confirm('[[admin/manage/uploads:confirm-delete]]', function (ok) { if (!ok) { return; diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js index 41d9a1a86d..7c6543fa75 100644 --- a/public/src/admin/manage/users.js +++ b/public/src/admin/manage/users.js @@ -3,13 +3,13 @@ define('admin/manage/users', [ 'translator', 'benchpress', 'autocomplete', 'api', 'slugify', 'bootbox', 'accounts/invite', ], function (translator, Benchpress, autocomplete, api, slugify, bootbox, AccountInvite) { - var Users = {}; + const Users = {}; Users.init = function () { $('#results-per-page').val(ajaxify.data.resultsPerPage).on('change', function () { - var query = utils.params(); + const query = utils.params(); query.resultsPerPage = $('#results-per-page').val(); - var qs = buildSearchQuery(query); + const qs = buildSearchQuery(query); ajaxify.go(window.location.pathname + '?' + qs); }); @@ -42,7 +42,7 @@ define('admin/manage/users', [ }); function getSelectedUids() { - var uids = []; + const uids = []; $('.users-table [component="user/select/single"]').each(function () { if ($(this).is(':checked')) { @@ -99,7 +99,7 @@ define('admin/manage/users', [ }); $('.manage-groups').on('click', function () { - var uids = getSelectedUids(); + const uids = getSelectedUids(); if (!uids.length) { app.alertError('[[error:no-users-selected]]'); return false; @@ -109,14 +109,14 @@ define('admin/manage/users', [ return app.alertError(err); } Benchpress.render('admin/partials/manage_user_groups', data).then(function (html) { - var modal = bootbox.dialog({ + const modal = bootbox.dialog({ message: html, title: '[[admin/manage/users:manage-groups]]', onEscape: true, }); modal.on('shown.bs.modal', function () { autocomplete.group(modal.find('.group-search'), function (ev, ui) { - var uid = $(ev.target).attr('data-uid'); + const uid = $(ev.target).attr('data-uid'); api.put('/groups/' + ui.item.group.slug + '/membership/' + uid, undefined).then(() => { ui.item.group.nameEscaped = translator.escape(ui.item.group.displayName); app.parseAndTranslate('admin/partials/manage_user_groups', { users: [{ groups: [ui.item.group] }] }, function (html) { @@ -129,9 +129,9 @@ define('admin/manage/users', [ modal.modal('hide'); }); modal.on('click', '.remove-group-icon', function () { - var groupCard = $(this).parents('[data-group-name]'); - var groupName = groupCard.attr('data-group-name'); - var uid = $(this).parents('[data-uid]').attr('data-uid'); + const groupCard = $(this).parents('[data-group-name]'); + const groupName = groupCard.attr('data-group-name'); + const uid = $(this).parents('[data-uid]').attr('data-uid'); api.del('/groups/' + slugify(groupName) + '/membership/' + uid).then(() => { groupCard.remove(); }).catch(app.alertError); @@ -142,7 +142,7 @@ define('admin/manage/users', [ }); $('.ban-user').on('click', function () { - var uids = getSelectedUids(); + const uids = getSelectedUids(); if (!uids.length) { app.alertError('[[error:no-users-selected]]'); return false; // specifically to keep the menu open @@ -160,7 +160,7 @@ define('admin/manage/users', [ }); $('.ban-user-temporary').on('click', function () { - var uids = getSelectedUids(); + const uids = getSelectedUids(); if (!uids.length) { app.alertError('[[error:no-users-selected]]'); return false; // specifically to keep the menu open @@ -180,11 +180,11 @@ define('admin/manage/users', [ submit: { label: '[[admin/manage/users:alerts.button-ban-x, ' + uids.length + ']]', callback: function () { - var formData = $('.ban-modal form').serializeArray().reduce(function (data, cur) { + const formData = $('.ban-modal form').serializeArray().reduce(function (data, cur) { data[cur.name] = cur.value; return data; }, {}); - var until = formData.length > 0 ? ( + const until = formData.length > 0 ? ( Date.now() + (formData.length * 1000 * 60 * 60 * (parseInt(formData.unit, 10) ? 24 : 1)) ) : 0; @@ -204,7 +204,7 @@ define('admin/manage/users', [ }); $('.unban-user').on('click', function () { - var uids = getSelectedUids(); + const uids = getSelectedUids(); if (!uids.length) { app.alertError('[[error:no-users-selected]]'); return false; // specifically to keep the menu open @@ -218,7 +218,7 @@ define('admin/manage/users', [ }); $('.reset-lockout').on('click', function () { - var uids = getSelectedUids(); + const uids = getSelectedUids(); if (!uids.length) { return; } @@ -227,7 +227,7 @@ define('admin/manage/users', [ }); $('.validate-email').on('click', function () { - var uids = getSelectedUids(); + const uids = getSelectedUids(); if (!uids.length) { return; } @@ -249,7 +249,7 @@ define('admin/manage/users', [ }); $('.send-validation-email').on('click', function () { - var uids = getSelectedUids(); + const uids = getSelectedUids(); if (!uids.length) { return; } @@ -262,7 +262,7 @@ define('admin/manage/users', [ }); $('.password-reset-email').on('click', function () { - var uids = getSelectedUids(); + const uids = getSelectedUids(); if (!uids.length) { return; } @@ -275,7 +275,7 @@ define('admin/manage/users', [ }); $('.force-password-reset').on('click', function () { - var uids = getSelectedUids(); + const uids = getSelectedUids(); if (!uids.length) { return; } @@ -304,7 +304,7 @@ define('admin/manage/users', [ tableEl.addEventListener('change', (e) => { const subselector = e.target.closest('[component="user/select/single"]') || e.target.closest('[component="user/select/all"]'); if (subselector) { - var uids = getSelectedUids(); + const uids = getSelectedUids(); if (uids.length) { actionBtn.removeAttribute('disabled'); } else { @@ -314,7 +314,7 @@ define('admin/manage/users', [ }); function handleDelete(confirmMsg, path) { - var uids = getSelectedUids(); + const uids = getSelectedUids(); if (!uids.length) { return; } @@ -347,7 +347,7 @@ define('admin/manage/users', [ function handleUserCreate() { $('[data-action="create"]').on('click', function () { Benchpress.render('admin/partials/create_user_modal', {}).then(function (html) { - var modal = bootbox.dialog({ + const modal = bootbox.dialog({ message: html, title: '[[admin/manage/users:alerts.create]]', onEscape: true, @@ -375,19 +375,19 @@ define('admin/manage/users', [ } function createUser() { - var modal = this; - var username = document.getElementById('create-user-name').value; - var email = document.getElementById('create-user-email').value; - var password = document.getElementById('create-user-password').value; - var passwordAgain = document.getElementById('create-user-password-again').value; + const modal = this; + const username = document.getElementById('create-user-name').value; + const email = document.getElementById('create-user-email').value; + const password = document.getElementById('create-user-password').value; + const passwordAgain = document.getElementById('create-user-password-again').value; - var errorEl = $('#create-modal-error'); + const errorEl = $('#create-modal-error'); if (password !== passwordAgain) { return errorEl.translateHtml('[[admin/manage/users:alerts.error-x, [[admin/manage/users:alerts.error-passwords-different]]]]').removeClass('hide'); } - var user = { + const user = { username: username, email: email, password: password, @@ -425,12 +425,12 @@ define('admin/manage/users', [ } function loadSearchPage(query) { - var params = utils.params(); + const params = utils.params(); params.searchBy = query.searchBy; params.query = query.query; params.page = query.page; params.sortBy = params.sortBy || 'lastonline'; - var qs = decodeURIComponent($.param(params)); + const qs = decodeURIComponent($.param(params)); $.get(config.relative_path + '/api/admin/manage/users?' + qs, function (data) { renderSearchResults(data); const url = config.relative_path + '/admin/manage/users?' + qs; @@ -488,12 +488,12 @@ define('admin/manage/users', [ function handleSort() { $('.users-table thead th').on('click', function () { - var $this = $(this); - var sortBy = $this.attr('data-sort'); + const $this = $(this); + const sortBy = $this.attr('data-sort'); if (!sortBy) { return; } - var params = utils.params(); + const params = utils.params(); params.sortBy = sortBy; if (ajaxify.data.sortBy === sortBy) { params.sortDirection = ajaxify.data.reverse ? 'asc' : 'desc'; @@ -501,13 +501,13 @@ define('admin/manage/users', [ params.sortDirection = 'desc'; } - var qs = buildSearchQuery(params); + const qs = buildSearchQuery(params); ajaxify.go('admin/manage/users?' + qs); }); } function getFilters() { - var filters = []; + const filters = []; $('#filter-by').find('[data-filter-by]').each(function () { if ($(this).find('.fa-check').length) { filters.push($(this).attr('data-filter-by')); @@ -517,16 +517,16 @@ define('admin/manage/users', [ } function handleFilter() { - var currentFilters = getFilters(); + let currentFilters = getFilters(); $('#filter-by').on('click', 'li', function () { - var $this = $(this); + const $this = $(this); $this.find('i').toggleClass('fa-check', !$this.find('i').hasClass('fa-check')); return false; }); $('#filter-by').on('hidden.bs.dropdown', function () { - var filters = getFilters(); - var changed = filters.length !== currentFilters.length; + const filters = getFilters(); + let changed = filters.length !== currentFilters.length; if (filters.length === currentFilters.length) { filters.forEach(function (filter, i) { if (filter !== currentFilters[i]) { @@ -536,9 +536,9 @@ define('admin/manage/users', [ } currentFilters = getFilters(); if (changed) { - var params = utils.params(); + const params = utils.params(); params.filters = filters; - var qs = buildSearchQuery(params); + const qs = buildSearchQuery(params); ajaxify.go('admin/manage/users?' + qs); } }); diff --git a/public/src/admin/modules/colorpicker.js b/public/src/admin/modules/colorpicker.js index 933067faf7..3b64164647 100644 --- a/public/src/admin/modules/colorpicker.js +++ b/public/src/admin/modules/colorpicker.js @@ -2,11 +2,11 @@ // TODO: no longer used remove in 1.19.0 define('admin/modules/colorpicker', function () { - var colorpicker = {}; + const colorpicker = {}; colorpicker.enable = function (inputEl, callback) { (inputEl instanceof jQuery ? inputEl : $(inputEl)).each(function () { - var $this = $(this); + const $this = $(this); $this.ColorPicker({ color: $this.val() || '#000', diff --git a/public/src/admin/modules/dashboard-line-graph.js b/public/src/admin/modules/dashboard-line-graph.js index 246bbbe39d..38f75e62cc 100644 --- a/public/src/admin/modules/dashboard-line-graph.js +++ b/public/src/admin/modules/dashboard-line-graph.js @@ -18,7 +18,7 @@ define('admin/modules/dashboard-line-graph', ['Chart', 'translator', 'benchpress Graph.handleUpdateControls({ set }); - var t = translator.Translator.create(); + const t = translator.Translator.create(); return new Promise((resolve) => { t.translateKey(`admin/menu:${ajaxify.data.template.name.replace('admin/', '')}`, []).then((key) => { const data = { @@ -81,8 +81,8 @@ define('admin/modules/dashboard-line-graph', ['Chart', 'translator', 'benchpress Graph.handleUpdateControls = ({ set }) => { $('[data-action="updateGraph"]:not([data-units="custom"])').on('click', function () { - var until = new Date(); - var amount = $(this).attr('data-amount'); + let until = new Date(); + const amount = $(this).attr('data-amount'); if ($(this).attr('data-units') === 'days') { until.setHours(0, 0, 0, 0); } @@ -97,10 +97,10 @@ define('admin/modules/dashboard-line-graph', ['Chart', 'translator', 'benchpress }); $('[data-action="updateGraph"][data-units="custom"]').on('click', function () { - var targetEl = $(this); + const targetEl = $(this); Benchpress.render('admin/partials/pageviews-range-select', {}).then(function (html) { - var modal = bootbox.dialog({ + const modal = bootbox.dialog({ title: '[[admin/dashboard:page-views-custom]]', message: html, buttons: { @@ -111,10 +111,10 @@ define('admin/modules/dashboard-line-graph', ['Chart', 'translator', 'benchpress }, }, }).on('shown.bs.modal', function () { - var date = new Date(); - var today = date.toISOString().substr(0, 10); + const date = new Date(); + const today = date.toISOString().substr(0, 10); date.setDate(date.getDate() - 1); - var yesterday = date.toISOString().substr(0, 10); + const yesterday = date.toISOString().substr(0, 10); modal.find('#startRange').val(targetEl.attr('data-startRange') || yesterday); modal.find('#endRange').val(targetEl.attr('data-endRange') || today); @@ -122,8 +122,8 @@ define('admin/modules/dashboard-line-graph', ['Chart', 'translator', 'benchpress function submit() { // NEED TO ADD VALIDATION HERE FOR YYYY-MM-DD - var formData = modal.find('form').serializeObject(); - var validRegexp = /\d{4}-\d{2}-\d{2}/; + const formData = modal.find('form').serializeObject(); + const validRegexp = /\d{4}-\d{2}-\d{2}/; // Input validation if (!formData.startRange && !formData.endRange) { @@ -136,10 +136,10 @@ define('admin/modules/dashboard-line-graph', ['Chart', 'translator', 'benchpress return false; } - var until = new Date(formData.endRange); + let until = new Date(formData.endRange); until.setDate(until.getDate() + 1); until = until.getTime(); - var amount = (until - new Date(formData.startRange).getTime()) / (1000 * 60 * 60 * 24); + const amount = (until - new Date(formData.startRange).getTime()) / (1000 * 60 * 60 * 24); Graph.update(set, 'days', until, amount); @@ -175,8 +175,8 @@ define('admin/modules/dashboard-line-graph', ['Chart', 'translator', 'benchpress Graph._current.update(); // Update address bar and "View as JSON" button url - var apiEl = $('#view-as-json'); - var newHref = $.param({ + const apiEl = $('#view-as-json'); + const newHref = $.param({ units: units || 'hours', until: until, count: amount, diff --git a/public/src/admin/modules/instance.js b/public/src/admin/modules/instance.js index bdb2aad21b..996e381229 100644 --- a/public/src/admin/modules/instance.js +++ b/public/src/admin/modules/instance.js @@ -6,7 +6,7 @@ define('admin/modules/instance', [ // the client can't fetch the template file, resulting in an error config.relative_path + '/assets/templates/alert.js', ], function () { - var instance = {}; + const instance = {}; instance.rebuildAndRestart = function (callback) { app.alert({ diff --git a/public/src/admin/modules/search.js b/public/src/admin/modules/search.js index e2ea2a4c3d..1bb62ad2cc 100644 --- a/public/src/admin/modules/search.js +++ b/public/src/admin/modules/search.js @@ -1,18 +1,18 @@ 'use strict'; define('admin/modules/search', ['mousetrap'], function (mousetrap) { - var search = {}; + const search = {}; function find(dict, term) { - var html = dict.filter(function (elem) { + const html = dict.filter(function (elem) { return elem.translations.toLowerCase().includes(term); }).map(function (params) { - var namespace = params.namespace; - var translations = params.translations; - var title = params.title; - var escaped = utils.escapeRegexChars(term); + const namespace = params.namespace; + const translations = params.translations; + let title = params.title; + const escaped = utils.escapeRegexChars(term); - var results = translations + const results = translations // remove all lines without a match .replace(new RegExp('^(?:(?!' + escaped + ').)*$', 'gmi'), '') // remove lines that only match the title @@ -60,9 +60,9 @@ define('admin/modules/search', ['mousetrap'], function (mousetrap) { }; function setupACPSearch(dict) { - var dropdown = $('#acp-search .dropdown'); - var menu = $('#acp-search .dropdown-menu'); - var input = $('#acp-search input'); + const dropdown = $('#acp-search .dropdown'); + const menu = $('#acp-search .dropdown-menu'); + const input = $('#acp-search input'); if (!config.searchEnabled) { menu.addClass('search-disabled'); @@ -73,11 +73,11 @@ define('admin/modules/search', ['mousetrap'], function (mousetrap) { }); $('#acp-search').parents('form').on('submit', function (ev) { - var selected = menu.find('li.result > a.focus').attr('href'); + let selected = menu.find('li.result > a.focus').attr('href'); if (!selected.length) { selected = menu.find('li.result > a').first().attr('href'); } - var href = selected || config.relative_path + '/search?in=titlesposts&term=' + escape(input.val()); + const href = selected || config.relative_path + '/search?in=titlesposts&term=' + escape(input.val()); ajaxify.go(href.replace(/^\//, '')); @@ -96,7 +96,7 @@ define('admin/modules/search', ['mousetrap'], function (mousetrap) { }); mousetrap(input[0]).bind(['up', 'down'], function (ev, key) { - var next; + let next; if (key === 'up') { next = menu.find('li.result > a.focus').removeClass('focus').parent().prev('.result') .children(); @@ -122,10 +122,10 @@ define('admin/modules/search', ['mousetrap'], function (mousetrap) { ev.preventDefault(); }); - var prevValue; + let prevValue; input.on('keyup focus', function () { - var value = input.val().toLowerCase(); + const value = input.val().toLowerCase(); if (value === prevValue) { return; @@ -134,8 +134,8 @@ define('admin/modules/search', ['mousetrap'], function (mousetrap) { menu.children('.result').remove(); - var len = /\W/.test(value) ? 3 : value.length; - var results; + const len = /\W/.test(value) ? 3 : value.length; + let results; menu.toggleClass('state-start-typing', len === 0); menu.toggleClass('state-keep-typing', len > 0 && len < 3); diff --git a/public/src/admin/modules/selectable.js b/public/src/admin/modules/selectable.js index 34949a4e10..470462d558 100644 --- a/public/src/admin/modules/selectable.js +++ b/public/src/admin/modules/selectable.js @@ -4,7 +4,7 @@ define('admin/modules/selectable', [ 'jquery-ui/widgets/selectable', ], function () { - var selectable = {}; + const selectable = {}; selectable.enable = function (containerEl, targets) { $(containerEl).selectable({ diff --git a/public/src/admin/settings.js b/public/src/admin/settings.js index 5b5dee579e..c7166305a0 100644 --- a/public/src/admin/settings.js +++ b/public/src/admin/settings.js @@ -2,21 +2,21 @@ define('admin/settings', ['uploader', 'mousetrap', 'hooks'], function (uploader, mousetrap, hooks) { - var Settings = {}; + const Settings = {}; Settings.populateTOC = function () { - var headers = $('.settings-header'); + const headers = $('.settings-header'); if (headers.length > 1) { headers.each(function () { - var header = $(this).text(); - var anchor = header.toLowerCase().replace(/ /g, '-').trim(); + const header = $(this).text(); + const anchor = header.toLowerCase().replace(/ /g, '-').trim(); $(this).prepend(''); $('.section-content ul').append('
    • ' + header + '
    • '); }); - var scrollTo = $('a[name="' + window.location.hash.replace('#', '') + '"]'); + const scrollTo = $('a[name="' + window.location.hash.replace('#', '') + '"]'); if (scrollTo.length) { $('html, body').animate({ scrollTop: (scrollTo.offset().top) + 'px', @@ -29,28 +29,28 @@ define('admin/settings', ['uploader', 'mousetrap', 'hooks'], function (uploader, Settings.prepare = function (callback) { // Populate the fields on the page from the config - var fields = $('#content [data-field]'); - var numFields = fields.length; - var saveBtn = $('#save'); - var revertBtn = $('#revert'); - var x; - var key; - var inputType; - var field; + const fields = $('#content [data-field]'); + const numFields = fields.length; + const saveBtn = $('#save'); + const revertBtn = $('#revert'); + let x; + let key; + let inputType; + let field; // Handle unsaved changes fields.on('change', function () { app.flags = app.flags || {}; app.flags._unsaved = true; }); - var defaultInputs = ['text', 'hidden', 'password', 'textarea', 'number']; + const defaultInputs = ['text', 'hidden', 'password', 'textarea', 'number']; for (x = 0; x < numFields; x += 1) { field = fields.eq(x); key = field.attr('data-field'); inputType = field.attr('type'); if (app.config.hasOwnProperty(key)) { if (field.is('input') && inputType === 'checkbox') { - var checked = parseInt(app.config[key], 10) === 1; + const checked = parseInt(app.config[key], 10) === 1; field.prop('checked', checked); field.parents('.mdl-switch').toggleClass('is-checked', checked); } else if (field.is('textarea') || field.is('select') || (field.is('input') && defaultInputs.indexOf(inputType) !== -1)) { @@ -117,7 +117,7 @@ define('admin/settings', ['uploader', 'mousetrap', 'hooks'], function (uploader, function handleUploads() { $('#content input[data-action="upload"]').each(function () { - var uploadBtn = $(this); + const uploadBtn = $(this); uploadBtn.on('click', function () { uploader.show({ title: uploadBtn.attr('data-title'), @@ -146,13 +146,13 @@ define('admin/settings', ['uploader', 'mousetrap', 'hooks'], function (uploader, }; function saveFields(fields, callback) { - var data = {}; + const data = {}; fields.each(function () { - var field = $(this); - var key = field.attr('data-field'); - var value; - var inputType; + const field = $(this); + const key = field.attr('data-field'); + let value; + let inputType; if (field.is('input')) { inputType = field.attr('type'); @@ -181,7 +181,7 @@ define('admin/settings', ['uploader', 'mousetrap', 'hooks'], function (uploader, return callback(err); } - for (var field in data) { + for (const field in data) { if (data.hasOwnProperty(field)) { app.config[field] = data[field]; } diff --git a/public/src/admin/settings/api.js b/public/src/admin/settings/api.js index e2a755ee6c..6f70813a76 100644 --- a/public/src/admin/settings/api.js +++ b/public/src/admin/settings/api.js @@ -1,7 +1,7 @@ 'use strict'; define('admin/settings/api', ['settings'], function (settings) { - var ACP = {}; + const ACP = {}; ACP.init = function () { settings.load('core.api', $('.core-api-settings')); diff --git a/public/src/admin/settings/cookies.js b/public/src/admin/settings/cookies.js index ef663aff07..886fc7ad99 100644 --- a/public/src/admin/settings/cookies.js +++ b/public/src/admin/settings/cookies.js @@ -1,7 +1,7 @@ 'use strict'; define('admin/settings/cookies', function () { - var Module = {}; + const Module = {}; Module.init = function () { $('#delete-all-sessions').on('click', function () { diff --git a/public/src/admin/settings/email.js b/public/src/admin/settings/email.js index 8f2f7f46ed..83a6137e77 100644 --- a/public/src/admin/settings/email.js +++ b/public/src/admin/settings/email.js @@ -2,8 +2,8 @@ define('admin/settings/email', ['ace/ace', 'admin/settings'], function (ace) { - var module = {}; - var emailEditor; + const module = {}; + let emailEditor; module.init = function () { configureEmailTester(); @@ -40,14 +40,14 @@ define('admin/settings/email', ['ace/ace', 'admin/settings'], function (ace) { emailEditor.getSession().setMode('ace/mode/html'); emailEditor.on('change', function () { - var emailPath = $('#email-editor-selector').val(); - var original; + const emailPath = $('#email-editor-selector').val(); + let original; ajaxify.data.emails.forEach(function (email) { if (email.path === emailPath) { original = email.original; } }); - var newEmail = emailEditor.getValue(); + const newEmail = emailEditor.getValue(); $('#email-editor-holder').val(newEmail !== original ? newEmail : ''); }); @@ -75,7 +75,7 @@ define('admin/settings/email', ['ace/ace', 'admin/settings'], function (ace) { } function handleDigestHourChange() { - var hour = parseInt($('#digestHour').val(), 10); + let hour = parseInt($('#digestHour').val(), 10); if (isNaN(hour)) { hour = 17; @@ -88,8 +88,8 @@ define('admin/settings/email', ['ace/ace', 'admin/settings'], function (ace) { return app.alertError(err.message); } - var date = new Date(now.timestamp); - var offset = (new Date().getTimezoneOffset() - now.offset) / 60; + const date = new Date(now.timestamp); + const offset = (new Date().getTimezoneOffset() - now.offset) / 60; date.setHours(date.getHours() + offset); $('#serverTime').text(date.toLocaleTimeString()); @@ -106,7 +106,7 @@ define('admin/settings/email', ['ace/ace', 'admin/settings'], function (ace) { } function handleSmtpServiceChange() { - var isCustom = $('[id="email:smtpTransport:service"]').val() === 'nodebb-custom-smtp'; + const isCustom = $('[id="email:smtpTransport:service"]').val() === 'nodebb-custom-smtp'; $('[id="email:smtpTransport:custom-service"]')[isCustom ? 'slideDown' : 'slideUp'](isCustom); } diff --git a/public/src/admin/settings/general.js b/public/src/admin/settings/general.js index bf88ded896..805f9f1c8f 100644 --- a/public/src/admin/settings/general.js +++ b/public/src/admin/settings/general.js @@ -2,7 +2,7 @@ define('admin/settings/general', ['admin/settings'], function () { - var Module = {}; + const Module = {}; Module.init = function () { $('button[data-action="removeLogo"]').on('click', function () { diff --git a/public/src/admin/settings/homepage.js b/public/src/admin/settings/homepage.js index 87c845921e..96447d9bbb 100644 --- a/public/src/admin/settings/homepage.js +++ b/public/src/admin/settings/homepage.js @@ -10,7 +10,7 @@ define('admin/settings/homepage', ['admin/settings'], function () { } } - var Homepage = {}; + const Homepage = {}; Homepage.init = function () { $('[data-field="homePageRoute"]').on('change', toggleCustomRoute); diff --git a/public/src/admin/settings/navigation.js b/public/src/admin/settings/navigation.js index 563709ad0b..a2fef0a0d3 100644 --- a/public/src/admin/settings/navigation.js +++ b/public/src/admin/settings/navigation.js @@ -9,8 +9,8 @@ define('admin/settings/navigation', [ 'jquery-ui/widgets/droppable', 'jquery-ui/widgets/sortable', ], function (translator, iconSelect, Benchpress) { - var navigation = {}; - var available; + const navigation = {}; + let available; navigation.init = function () { available = ajaxify.data.available; @@ -27,10 +27,10 @@ define('admin/settings/navigation', [ }); $('#enabled').on('click', '.iconPicker', function () { - var iconEl = $(this).find('i'); + const iconEl = $(this).find('i'); iconSelect.init(iconEl, function (el) { - var newIconClass = el.attr('value'); - var index = iconEl.parents('[data-index]').attr('data-index'); + const newIconClass = el.attr('value'); + const index = iconEl.parents('[data-index]').attr('data-index'); $('#active-navigation [data-index="' + index + '"] i').attr('class', 'fa fa-fw ' + newIconClass); iconEl.siblings('[name="iconClass"]').val(newIconClass); iconEl.siblings('.change-icon-link').toggleClass('hidden', !!newIconClass); @@ -47,11 +47,11 @@ define('admin/settings/navigation', [ }; function onSelect() { - var clickedIndex = $(this).attr('data-index'); + const clickedIndex = $(this).attr('data-index'); $('#active-navigation li').removeClass('active'); $(this).addClass('active'); - var detailsForm = $('#enabled').children('[data-index="' + clickedIndex + '"]'); + const detailsForm = $('#enabled').children('[data-index="' + clickedIndex + '"]'); $('#enabled li').addClass('hidden'); if (detailsForm.length) { @@ -61,9 +61,9 @@ define('admin/settings/navigation', [ } function drop(ev, ui) { - var id = ui.helper.attr('data-id'); - var el = $('#active-navigation [data-id="' + id + '"]'); - var data = id === 'custom' ? { iconClass: 'fa-navicon', groups: available[0].groups } : available[id]; + const id = ui.helper.attr('data-id'); + const el = $('#active-navigation [data-id="' + id + '"]'); + const data = id === 'custom' ? { iconClass: 'fa-navicon', groups: available[0].groups } : available[id]; data.enabled = false; data.index = (parseInt($('#enabled').children().last().attr('data-index'), 10) || 0) + 1; @@ -87,18 +87,18 @@ define('admin/settings/navigation', [ } function save() { - var nav = []; + const nav = []; - var indices = []; + const indices = []; $('#active-navigation li').each(function () { indices.push($(this).attr('data-index')); }); indices.forEach(function (index) { - var el = $('#enabled').children('[data-index="' + index + '"]'); - var form = el.find('form').serializeArray(); - var data = {}; - var properties = {}; + const el = $('#enabled').children('[data-index="' + index + '"]'); + const form = el.find('form').serializeArray(); + const data = {}; + const properties = {}; form.forEach(function (input) { if (input.name.slice(0, 9) === 'property:' && input.value === 'on') { @@ -117,7 +117,7 @@ define('admin/settings/navigation', [ data.properties = {}; - for (var prop in properties) { + for (const prop in properties) { if (properties.hasOwnProperty(prop)) { data.properties[prop] = properties[prop]; } @@ -136,15 +136,15 @@ define('admin/settings/navigation', [ } function remove() { - var index = $(this).parents('[data-index]').attr('data-index'); + const index = $(this).parents('[data-index]').attr('data-index'); $('#active-navigation [data-index="' + index + '"]').remove(); $('#enabled [data-index="' + index + '"]').remove(); return false; } function toggle() { - var btn = $(this); - var disabled = btn.hasClass('btn-success'); + const btn = $(this); + const disabled = btn.hasClass('btn-success'); translator.translate(disabled ? '[[admin/settings/navigation:btn.disable]]' : '[[admin/settings/navigation:btn.enable]]', function (html) { btn.toggleClass('btn-warning').toggleClass('btn-success').html(html); btn.parents('li').find('[name="enabled"]').val(disabled ? 'on' : ''); diff --git a/public/src/admin/settings/notifications.js b/public/src/admin/settings/notifications.js index e58dc4c628..9235478482 100644 --- a/public/src/admin/settings/notifications.js +++ b/public/src/admin/settings/notifications.js @@ -3,10 +3,10 @@ define('admin/settings/notifications', [ 'autocomplete', ], function (autocomplete) { - var Notifications = {}; + const Notifications = {}; Notifications.init = function () { - var searchInput = $('[data-field="welcomeUid"]'); + const searchInput = $('[data-field="welcomeUid"]'); autocomplete.user(searchInput, function (event, selected) { setTimeout(function () { searchInput.val(selected.item.user.uid); diff --git a/public/src/admin/settings/social.js b/public/src/admin/settings/social.js index 294357eb84..32ff8d7840 100644 --- a/public/src/admin/settings/social.js +++ b/public/src/admin/settings/social.js @@ -2,11 +2,11 @@ define('admin/settings/social', [], function () { - var social = {}; + const social = {}; social.init = function () { $('#save').on('click', function () { - var networks = []; + const networks = []; $('#postSharingNetworks input[type="checkbox"]').each(function () { if ($(this).prop('checked')) { networks.push($(this).attr('id')); diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index bafdff456a..d42a0b89d1 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -4,16 +4,16 @@ ajaxify = window.ajaxify || {}; (function () { - var apiXHR = null; - var ajaxifyTimer; + let apiXHR = null; + let ajaxifyTimer; - var retry = true; - var previousBodyClass = ''; + let retry = true; + let previousBodyClass = ''; ajaxify.count = 0; ajaxify.currentPage = null; - var hooks; + let hooks; require(['hooks'], function (_hooks) { hooks = _hooks; }); @@ -89,7 +89,7 @@ ajaxify = window.ajaxify || {}; // this function is called just once from footer on page load ajaxify.coldLoad = function () { - var url = ajaxify.start(window.location.pathname.slice(1) + window.location.search + window.location.hash); + const url = ajaxify.start(window.location.pathname.slice(1) + window.location.search + window.location.hash); ajaxify.updateHistory(url, true); ajaxify.end(url, ajaxify.data.template.name); hooks.fire('action:ajaxify.coldLoad'); @@ -101,8 +101,8 @@ ajaxify = window.ajaxify || {}; ajaxify.handleRedirects = function (url) { url = ajaxify.removeRelativePath(url.replace(/^\/|\/$/g, '')).toLowerCase(); - var isClientToAdmin = url.startsWith('admin') && window.location.pathname.indexOf(config.relative_path + '/admin') !== 0; - var isAdminToClient = !url.startsWith('admin') && window.location.pathname.indexOf(config.relative_path + '/admin') === 0; + const isClientToAdmin = url.startsWith('admin') && window.location.pathname.indexOf(config.relative_path + '/admin') !== 0; + const isAdminToClient = !url.startsWith('admin') && window.location.pathname.indexOf(config.relative_path + '/admin') === 0; if (isClientToAdmin || isAdminToClient) { window.open(config.relative_path + '/' + url, '_top'); @@ -114,7 +114,7 @@ ajaxify = window.ajaxify || {}; ajaxify.start = function (url) { url = ajaxify.removeRelativePath(url.replace(/^\/|\/$/g, '')); - var payload = { + const payload = { url: url, }; @@ -135,11 +135,11 @@ ajaxify = window.ajaxify || {}; }; function onAjaxError(err, url, callback, quiet) { - var data = err.data; - var textStatus = err.textStatus; + const data = err.data; + const textStatus = err.textStatus; if (data) { - var status = parseInt(data.status, 10); + let status = parseInt(data.status, 10); if (status === 403 || status === 404 || status === 500 || status === 502 || status === 503) { if (status === 502 && retry) { retry = false; @@ -214,7 +214,7 @@ ajaxify = window.ajaxify || {}; // Allow translation strings in title on ajaxify (#5927) title = translator.unescape(title); - var data = { title: title }; + const data = { title: title }; hooks.fire('action:ajaxify.updateTitle', data); translator.translate(data.title, function (translated) { window.document.title = $('
      ').html(translated).text(); @@ -223,16 +223,16 @@ ajaxify = window.ajaxify || {}; } function updateTags() { - var metaWhitelist = ['title', 'description', /og:.+/, /article:.+/, 'robots'].map(function (val) { + const metaWhitelist = ['title', 'description', /og:.+/, /article:.+/, 'robots'].map(function (val) { return new RegExp(val); }); - var linkWhitelist = ['canonical', 'alternate', 'up']; + const linkWhitelist = ['canonical', 'alternate', 'up']; // Delete the old meta tags Array.prototype.slice .call(document.querySelectorAll('head meta')) .filter(function (el) { - var name = el.getAttribute('property') || el.getAttribute('name'); + const name = el.getAttribute('property') || el.getAttribute('name'); return metaWhitelist.some(function (exp) { return !!exp.test(name); }); @@ -244,7 +244,7 @@ ajaxify = window.ajaxify || {}; // Add new meta tags ajaxify.data._header.tags.meta .filter(function (tagObj) { - var name = tagObj.name || tagObj.property; + const name = tagObj.name || tagObj.property; return metaWhitelist.some(function (exp) { return !!exp.test(name); }); @@ -252,7 +252,7 @@ ajaxify = window.ajaxify || {}; if (tagObj.content) { tagObj.content = await translator.translate(tagObj.content); } - var metaEl = document.createElement('meta'); + const metaEl = document.createElement('meta'); Object.keys(tagObj).forEach(function (prop) { metaEl.setAttribute(prop, tagObj[prop]); }); @@ -264,7 +264,7 @@ ajaxify = window.ajaxify || {}; Array.prototype.slice .call(document.querySelectorAll('head link')) .filter(function (el) { - var name = el.getAttribute('rel'); + const name = el.getAttribute('rel'); return linkWhitelist.some(function (item) { return item === name; }); @@ -281,7 +281,7 @@ ajaxify = window.ajaxify || {}; }); }) .forEach(function (tagObj) { - var linkEl = document.createElement('link'); + const linkEl = document.createElement('link'); Object.keys(tagObj).forEach(function (prop) { linkEl.setAttribute(prop, tagObj[prop]); }); @@ -305,7 +305,7 @@ ajaxify = window.ajaxify || {}; }; ajaxify.parseData = function () { - var dataEl = $('#ajaxify-data'); + const dataEl = $('#ajaxify-data'); if (dataEl.length) { ajaxify.data = JSON.parse(dataEl.text()); dataEl.remove(); @@ -324,7 +324,7 @@ ajaxify = window.ajaxify || {}; }; ajaxify.loadScript = function (tpl_url, callback) { - var location = !app.inAdmin ? 'forum/' : ''; + let location = !app.inAdmin ? 'forum/' : ''; if (tpl_url.startsWith('admin')) { location = ''; @@ -338,7 +338,7 @@ ajaxify = window.ajaxify || {}; hooks.fire('action:script.load', data); hooks.fire('filter:script.load', data).then((data) => { // Require and parse modules - var outstanding = data.scripts.length; + let outstanding = data.scripts.length; data.scripts.map(function (script) { if (typeof script === 'function') { @@ -440,7 +440,7 @@ ajaxify = window.ajaxify || {}; }()); $(document).ready(function () { - var hooks; + let hooks; require(['hooks'], function (_hooks) { hooks = _hooks; }); @@ -466,26 +466,26 @@ $(document).ready(function () { // eslint-disable-next-line no-script-url return href === undefined || href === '' || href === 'javascript:;'; } - var location = document.location || window.location; - var rootUrl = location.protocol + '//' + (location.hostname || location.host) + (location.port ? ':' + location.port : ''); - var contentEl = document.getElementById('content'); + const location = document.location || window.location; + const rootUrl = location.protocol + '//' + (location.hostname || location.host) + (location.port ? ':' + location.port : ''); + const contentEl = document.getElementById('content'); // Enhancing all anchors to ajaxify... $(document.body).on('click', 'a', function (e) { - var _self = this; + const _self = this; if (this.target !== '' || (this.protocol !== 'http:' && this.protocol !== 'https:')) { return; } - var $this = $(this); - var href = $this.attr('href'); - var internalLink = utils.isInternalURI(this, window.location, config.relative_path); + const $this = $(this); + const href = $this.attr('href'); + const internalLink = utils.isInternalURI(this, window.location, config.relative_path); const rootAndPath = new RegExp(`^${rootUrl}${config.relative_path}/?`); - var process = function () { + const process = function () { if (!e.ctrlKey && !e.shiftKey && !e.metaKey && e.which === 1) { if (internalLink) { - var pathname = this.href.replace(rootAndPath, ''); + const pathname = this.href.replace(rootAndPath, ''); // Special handling for urls with hashes if (window.location.pathname === this.pathname && this.hash.length) { @@ -495,13 +495,13 @@ $(document).ready(function () { } } else if (window.location.pathname !== config.relative_path + '/outgoing') { if (config.openOutgoingLinksInNewTab && $.contains(contentEl, this)) { - var externalTab = window.open(); + const externalTab = window.open(); externalTab.opener = null; externalTab.location = this.href; e.preventDefault(); } else if (config.useOutgoingLinksPage) { - var safeUrls = config.outgoingLinksWhitelist.trim().split(/[\s,]+/g).filter(Boolean); - var href = this.href; + const safeUrls = config.outgoingLinksWhitelist.trim().split(/[\s,]+/g).filter(Boolean); + const href = this.href; if (!safeUrls.length || !safeUrls.some(function (url) { return href.indexOf(url) !== -1; })) { ajaxify.go('outgoing?url=' + encodeURIComponent(href)); e.preventDefault(); diff --git a/public/src/app.js b/public/src/app.js index ad153ed5db..0881a96839 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -10,15 +10,15 @@ app.flags = {}; app.cacheBuster = null; (function () { - var appLoaded = false; - var params = utils.params(); - var showWelcomeMessage = !!params.loggedin; - var registerMessage = params.register; - var isTouchDevice = utils.isTouchDevice(); + let appLoaded = false; + const params = utils.params(); + let showWelcomeMessage = !!params.loggedin; + let registerMessage = params.register; + const isTouchDevice = utils.isTouchDevice(); app.cacheBuster = config['cache-buster']; - var hooks; + let hooks; require(['hooks'], function (_hooks) { hooks = _hooks; }); @@ -46,10 +46,10 @@ app.cacheBuster = null; * e.g. New Topic/Reply, post tools */ if (document.body) { - var earlyQueue = []; // once we can ES6, use Set instead - var earlyClick = function (ev) { - var btnEl = ev.target.closest('button'); - var anchorEl = ev.target.closest('a'); + let earlyQueue = []; // once we can ES6, use Set instead + const earlyClick = function (ev) { + let btnEl = ev.target.closest('button'); + const anchorEl = ev.target.closest('a'); if (!btnEl && anchorEl && (anchorEl.getAttribute('data-ajaxify') === 'false' || anchorEl.href === '#')) { btnEl = anchorEl; } @@ -250,7 +250,7 @@ app.cacheBuster = null; app.enterRoom = function (room, callback) { callback = callback || function () { }; if (socket && app.user.uid && app.currentRoom !== room) { - var previousRoom = app.currentRoom; + const previousRoom = app.currentRoom; app.currentRoom = room; socket.emit('meta.rooms.enter', { enter: room, @@ -269,7 +269,7 @@ app.cacheBuster = null; if (!socket || config.maintenanceMode) { return; } - var previousRoom = app.currentRoom; + const previousRoom = app.currentRoom; app.currentRoom = ''; socket.emit('meta.rooms.leaveCurrent', function (err) { if (err) { @@ -329,7 +329,7 @@ app.cacheBuster = null; }; app.showMessages = function () { - var messages = { + const messages = { login: { format: 'alert', title: '[[global:welcome_back]] ' + app.user.username + '!', @@ -456,7 +456,7 @@ app.cacheBuster = null; }; function createHeaderTooltips() { - var env = utils.findBootstrapEnvironment(); + const env = utils.findBootstrapEnvironment(); if (env === 'xs' || env === 'sm' || isTouchDevice) { return; } @@ -488,17 +488,17 @@ app.cacheBuster = null; return; } /* eslint-disable-next-line */ - var searchOptions = Object.assign({ in: config.searchDefaultInQuick || 'titles' }, options.searchOptions); - var quickSearchResults = options.searchElements.resultEl; - var inputEl = options.searchElements.inputEl; - var oldValue = inputEl.val(); - var filterCategoryEl = quickSearchResults.find('.filter-category'); + const searchOptions = Object.assign({ in: config.searchDefaultInQuick || 'titles' }, options.searchOptions); + const quickSearchResults = options.searchElements.resultEl; + const inputEl = options.searchElements.inputEl; + let oldValue = inputEl.val(); + const filterCategoryEl = quickSearchResults.find('.filter-category'); function updateCategoryFilterName() { if (ajaxify.data.template.category) { require(['translator'], function (translator) { translator.translate('[[search:search-in-category, ' + ajaxify.data.name + ']]', function (translated) { - var name = $('
      ').html(translated).text(); + const name = $('
      ').html(translated).text(); filterCategoryEl.find('.name').text(name); }); }); @@ -530,8 +530,8 @@ app.cacheBuster = null; return quickSearchResults.addClass('hidden').find('.quick-search-results-container').html(''); } data.posts.forEach(function (p) { - var text = $('
      ' + p.content + '
      ').text(); - var start = Math.max(0, text.toLowerCase().indexOf(inputEl.val().toLowerCase()) - 40); + const text = $('
      ' + p.content + '
      ').text(); + const start = Math.max(0, text.toLowerCase().indexOf(inputEl.val().toLowerCase()) - 40); p.snippet = utils.escapeHTML((start > 0 ? '...' : '') + text.slice(start, start + 80) + (text.length - start > 80 ? '...' : '')); @@ -543,7 +543,7 @@ app.cacheBuster = null; quickSearchResults.toggleClass('hidden', !html.length || !inputEl.is(':focus')) .find('.quick-search-results-container') .html(html.length ? html : ''); - var highlightEls = quickSearchResults.find( + const highlightEls = quickSearchResults.find( '.quick-search-results .quick-search-title, .quick-search-results .snippet' ); search.highlightMatches(options.searchOptions.term, highlightEls); @@ -577,7 +577,7 @@ app.cacheBuster = null; doSearch(); }, 250)); - var mousedownOnResults = false; + let mousedownOnResults = false; quickSearchResults.on('mousedown', function () { $(window).one('mouseup', function () { quickSearchResults.addClass('hidden'); @@ -607,10 +607,10 @@ app.cacheBuster = null; app.handleSearch = function (searchOptions) { searchOptions = searchOptions || { in: config.searchDefaultInQuick || 'titles' }; - var searchButton = $('#search-button'); - var searchFields = $('#search-fields'); - var searchInput = $('#search-fields input'); - var quickSearchContainer = $('#quick-search-container'); + const searchButton = $('#search-button'); + const searchFields = $('#search-fields'); + const searchInput = $('#search-fields input'); + const quickSearchContainer = $('#quick-search-container'); $('#search-form .advanced-search-link').off('mousedown').on('mousedown', function () { ajaxify.go('/search'); @@ -622,7 +622,7 @@ app.cacheBuster = null; searchInput.off('blur').on('blur', dismissSearch); searchInput.off('focus'); - var searchElements = { + const searchElements = { inputEl: searchInput, resultEl: quickSearchContainer, }; @@ -657,9 +657,9 @@ app.cacheBuster = null; }); $('#search-form').off('submit').on('submit', function () { - var input = $(this).find('input'); + const input = $(this).find('input'); require(['search'], function (search) { - var data = search.getSearchPreferences(); + const data = search.getSearchPreferences(); data.term = input.val(); hooks.fire('action:search.submit', { searchOptions: data, @@ -681,7 +681,7 @@ app.cacheBuster = null; function handleStatusChange() { $('[component="header/usercontrol"] [data-status]').off('click').on('click', function (e) { - var status = $(this).attr('data-status'); + const status = $(this).attr('data-status'); socket.emit('user.setStatus', status, function (err) { if (err) { return app.alertError(err.message); @@ -758,7 +758,7 @@ app.cacheBuster = null; if (!showModal || !app.user.uid || parseInt(storage.getItem('email-confirm-dismiss'), 10) === 1) { return; } - var msg = { + const msg = { alert_id: 'email_confirm', type: 'warning', timeout: 0, @@ -837,8 +837,8 @@ app.cacheBuster = null; $(document.body).append(html); $(document.body).addClass('cookie-consent-open'); - var warningEl = $('.cookie-consent'); - var dismissEl = warningEl.find('button'); + const warningEl = $('.cookie-consent'); + const dismissEl = warningEl.find('button'); dismissEl.on('click', function () { // Save consent cookie and remove warning element storage.setItem('cookieconsent', '1'); diff --git a/public/src/client/account/best.js b/public/src/client/account/best.js index ebd61760bc..b8327a3e39 100644 --- a/public/src/client/account/best.js +++ b/public/src/client/account/best.js @@ -2,7 +2,7 @@ define('forum/account/best', ['forum/account/header', 'forum/account/posts'], function (header, posts) { - var Best = {}; + const Best = {}; Best.init = function () { header.init(); diff --git a/public/src/client/account/blocks.js b/public/src/client/account/blocks.js index 0469cf957d..98bd96a8ff 100644 --- a/public/src/client/account/blocks.js +++ b/public/src/client/account/blocks.js @@ -5,13 +5,13 @@ define('forum/account/blocks', [ 'api', 'hooks', ], function (header, api, hooks) { - var Blocks = {}; + const Blocks = {}; Blocks.init = function () { header.init(); $('#user-search').on('keyup', function () { - var username = this.value; + const username = this.value; api.get('/api/users', { query: username, @@ -36,7 +36,7 @@ define('forum/account/blocks', [ }); $('.block-edit').on('click', '[data-action="toggle"]', function () { - var uid = parseInt(this.getAttribute('data-uid'), 10); + const uid = parseInt(this.getAttribute('data-uid'), 10); socket.emit('user.toggleBlock', { blockeeUid: uid, blockerUid: ajaxify.data.uid, diff --git a/public/src/client/account/bookmarks.js b/public/src/client/account/bookmarks.js index 56f9983e9f..4959a24d73 100644 --- a/public/src/client/account/bookmarks.js +++ b/public/src/client/account/bookmarks.js @@ -2,7 +2,7 @@ define('forum/account/bookmarks', ['forum/account/header', 'forum/account/posts'], function (header, posts) { - var Bookmarks = {}; + const Bookmarks = {}; Bookmarks.init = function () { header.init(); diff --git a/public/src/client/account/categories.js b/public/src/client/account/categories.js index 1522af929a..49a52b68cd 100644 --- a/public/src/client/account/categories.js +++ b/public/src/client/account/categories.js @@ -2,7 +2,7 @@ define('forum/account/categories', ['forum/account/header'], function (header) { - var Categories = {}; + const Categories = {}; Categories.init = function () { header.init(); @@ -12,8 +12,8 @@ define('forum/account/categories', ['forum/account/header'], function (header) { }); $('[component="category/watch/all"]').find('[component="category/watching"], [component="category/ignoring"], [component="category/notwatching"]').on('click', function () { - var cids = []; - var state = $(this).attr('data-state'); + const cids = []; + const state = $(this).attr('data-state'); $('[data-parent-cid="0"]').each(function (index, el) { cids.push($(el).attr('data-cid')); }); @@ -28,10 +28,10 @@ define('forum/account/categories', ['forum/account/header'], function (header) { }; function handleIgnoreWatch(cid) { - var category = $('[data-cid="' + cid + '"]'); + const category = $('[data-cid="' + cid + '"]'); category.find('[component="category/watching"], [component="category/ignoring"], [component="category/notwatching"]').on('click', function () { - var $this = $(this); - var state = $this.attr('data-state'); + const $this = $(this); + const state = $this.attr('data-state'); socket.emit('categories.setWatchState', { cid: cid, state: state, uid: ajaxify.data.uid }, function (err, modified_cids) { if (err) { @@ -46,7 +46,7 @@ define('forum/account/categories', ['forum/account/header'], function (header) { function updateDropdowns(modified_cids, state) { modified_cids.forEach(function (cid) { - var category = $('[data-cid="' + cid + '"]'); + const category = $('[data-cid="' + cid + '"]'); category.find('[component="category/watching/menu"]').toggleClass('hidden', state !== 'watching'); category.find('[component="category/watching/check"]').toggleClass('fa-check', state === 'watching'); diff --git a/public/src/client/account/consent.js b/public/src/client/account/consent.js index f53bc365b0..01e97bb4cf 100644 --- a/public/src/client/account/consent.js +++ b/public/src/client/account/consent.js @@ -2,7 +2,7 @@ define('forum/account/consent', ['forum/account/header'], function (header) { - var Consent = {}; + const Consent = {}; Consent.init = function () { header.init(); diff --git a/public/src/client/account/downvoted.js b/public/src/client/account/downvoted.js index 86252758d8..4ebf742237 100644 --- a/public/src/client/account/downvoted.js +++ b/public/src/client/account/downvoted.js @@ -2,7 +2,7 @@ define('forum/account/downvoted', ['forum/account/header', 'forum/account/posts'], function (header, posts) { - var Downvoted = {}; + const Downvoted = {}; Downvoted.init = function () { header.init(); diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js index dc22e3ca88..6a001084fc 100644 --- a/public/src/client/account/edit.js +++ b/public/src/client/account/edit.js @@ -8,7 +8,7 @@ define('forum/account/edit', [ 'hooks', 'bootbox', ], function (header, picture, translator, api, hooks, bootbox) { - var AccountEdit = {}; + const AccountEdit = {}; AccountEdit.init = function () { header.init(); @@ -64,12 +64,12 @@ define('forum/account/edit', [ function handleAccountDelete() { $('#deleteAccountBtn').on('click', function () { translator.translate('[[user:delete_account_confirm]]', function (translated) { - var modal = bootbox.confirm(translated + '

      ', function (confirm) { + const modal = bootbox.confirm(translated + '

      ', function (confirm) { if (!confirm) { return; } - var confirmBtn = modal.find('.btn-primary'); + const confirmBtn = modal.find('.btn-primary'); confirmBtn.html(''); confirmBtn.prop('disabled', true); @@ -105,7 +105,7 @@ define('forum/account/edit', [ function handleEmailConfirm() { $('#confirm-email').on('click', function () { - var btn = $(this).attr('disabled', true); + const btn = $(this).attr('disabled', true); socket.emit('user.emailConfirm', {}, function (err) { btn.removeAttr('disabled'); if (err) { @@ -121,7 +121,7 @@ define('forum/account/edit', [ } function updateSignature() { - var el = $('#signature'); + const el = $('#signature'); $('#signatureCharCountLeft').html(getCharsLeft(el, ajaxify.data.maximumSignatureLength)); el.on('keyup change', function () { @@ -130,7 +130,7 @@ define('forum/account/edit', [ } function updateAboutMe() { - var el = $('#aboutme'); + const el = $('#aboutme'); $('#aboutMeCharCountLeft').html(getCharsLeft(el, ajaxify.data.maximumAboutMeLength)); el.on('keyup change', function () { @@ -140,11 +140,11 @@ define('forum/account/edit', [ function handleGroupSort() { function move(direction) { - var selected = $('#groupTitle').val(); + const selected = $('#groupTitle').val(); if (!ajaxify.data.allowMultipleBadges || (Array.isArray(selected) && selected.length > 1)) { return; } - var el = $('#groupTitle').find(':selected'); + const el = $('#groupTitle').find(':selected'); if (el.length && el.val()) { if (direction > 0) { el.insertAfter(el.next()); diff --git a/public/src/client/account/edit/email.js b/public/src/client/account/edit/email.js index 824b7aaf5e..96d40877ff 100644 --- a/public/src/client/account/edit/email.js +++ b/public/src/client/account/edit/email.js @@ -1,14 +1,14 @@ 'use strict'; define('forum/account/edit/email', ['forum/account/header', 'api'], function (header, api) { - var AccountEditEmail = {}; + const AccountEditEmail = {}; AccountEditEmail.init = function () { header.init(); $('#submitBtn').on('click', function () { - var curPasswordEl = $('#inputCurrentPassword'); - var userData = { + const curPasswordEl = $('#inputCurrentPassword'); + const userData = { uid: $('#inputUID').val(), email: $('#inputNewEmail').val(), password: curPasswordEl.val(), @@ -23,7 +23,7 @@ define('forum/account/edit/email', ['forum/account/header', 'api'], function (he return app.alertError('[[user:email_same_as_password]]'); } - var btn = $(this); + const btn = $(this); btn.addClass('disabled').find('i').removeClass('hide'); api.put('/users/' + userData.uid, userData).then((res) => { diff --git a/public/src/client/account/edit/password.js b/public/src/client/account/edit/password.js index 99b8cdde71..1e9257790a 100644 --- a/public/src/client/account/edit/password.js +++ b/public/src/client/account/edit/password.js @@ -3,7 +3,7 @@ define('forum/account/edit/password', [ 'forum/account/header', 'translator', 'zxcvbn', 'api', ], function (header, translator, zxcvbn, api) { - var AccountEditPassword = {}; + const AccountEditPassword = {}; AccountEditPassword.init = function () { header.init(); @@ -12,16 +12,16 @@ define('forum/account/edit/password', [ }; function handlePasswordChange() { - var currentPassword = $('#inputCurrentPassword'); - var password_notify = $('#password-notify'); - var password_confirm_notify = $('#password-confirm-notify'); - var password = $('#inputNewPassword'); - var password_confirm = $('#inputNewPasswordAgain'); - var passwordvalid = false; - var passwordsmatch = false; + const currentPassword = $('#inputCurrentPassword'); + const password_notify = $('#password-notify'); + const password_confirm_notify = $('#password-confirm-notify'); + const password = $('#inputNewPassword'); + const password_confirm = $('#inputNewPasswordAgain'); + let passwordvalid = false; + let passwordsmatch = false; function onPasswordChanged() { - var passwordStrength = zxcvbn(password.val()); + const passwordStrength = zxcvbn(password.val()); passwordvalid = false; if (password.val().length < ajaxify.data.minimumPasswordLength) { showError(password_notify, '[[reset_password:password_too_short]]'); @@ -65,7 +65,7 @@ define('forum/account/edit/password', [ onPasswordChanged(); onPasswordConfirmChanged(); - var btn = $(this); + const btn = $(this); if (passwordvalid && passwordsmatch) { btn.addClass('disabled').find('i').removeClass('hide'); api.put('/users/' + ajaxify.data.theirid + '/password', { diff --git a/public/src/client/account/edit/username.js b/public/src/client/account/edit/username.js index 487b7872ee..a854a4b520 100644 --- a/public/src/client/account/edit/username.js +++ b/public/src/client/account/edit/username.js @@ -3,13 +3,13 @@ define('forum/account/edit/username', [ 'forum/account/header', 'api', 'slugify', ], function (header, api, slugify) { - var AccountEditUsername = {}; + const AccountEditUsername = {}; AccountEditUsername.init = function () { header.init(); $('#submitBtn').on('click', function updateUsername() { - var userData = { + const userData = { uid: $('#inputUID').val(), username: $('#inputNewUsername').val(), password: $('#inputCurrentPassword').val(), @@ -23,11 +23,11 @@ define('forum/account/edit/username', [ return app.alertError('[[user:username_same_as_password]]'); } - var btn = $(this); + const btn = $(this); btn.addClass('disabled').find('i').removeClass('hide'); api.put('/users/' + userData.uid, userData).then((response) => { - var userslug = slugify(userData.username); + const userslug = slugify(userData.username); if (userData.username && userslug && parseInt(userData.uid, 10) === parseInt(app.user.uid, 10)) { $('[component="header/profilelink"]').attr('href', config.relative_path + '/user/' + userslug); $('[component="header/profilelink/edit"]').attr('href', config.relative_path + '/user/' + userslug + '/edit'); diff --git a/public/src/client/account/followers.js b/public/src/client/account/followers.js index bae7343262..89b67561d8 100644 --- a/public/src/client/account/followers.js +++ b/public/src/client/account/followers.js @@ -2,7 +2,7 @@ define('forum/account/followers', ['forum/account/header'], function (header) { - var Followers = {}; + const Followers = {}; Followers.init = function () { header.init(); diff --git a/public/src/client/account/following.js b/public/src/client/account/following.js index 5881ae1bec..8bc5c92614 100644 --- a/public/src/client/account/following.js +++ b/public/src/client/account/following.js @@ -2,7 +2,7 @@ define('forum/account/following', ['forum/account/header'], function (header) { - var Following = {}; + const Following = {}; Following.init = function () { header.init(); diff --git a/public/src/client/account/groups.js b/public/src/client/account/groups.js index ba3fb3ce7c..17c78b1aa4 100644 --- a/public/src/client/account/groups.js +++ b/public/src/client/account/groups.js @@ -2,15 +2,15 @@ define('forum/account/groups', ['forum/account/header'], function (header) { - var AccountTopics = {}; + const AccountTopics = {}; AccountTopics.init = function () { header.init(); - var groupsEl = $('#groups-list'); + const groupsEl = $('#groups-list'); groupsEl.on('click', '.list-cover', function () { - var groupSlug = $(this).parents('[data-slug]').attr('data-slug'); + const groupSlug = $(this).parents('[data-slug]').attr('data-slug'); ajaxify.go('groups/' + groupSlug); }); diff --git a/public/src/client/account/header.js b/public/src/client/account/header.js index 258e16246c..e46bded766 100644 --- a/public/src/client/account/header.js +++ b/public/src/client/account/header.js @@ -11,8 +11,8 @@ define('forum/account/header', [ 'api', 'bootbox', ], function (coverPhoto, pictureCropper, components, translator, Benchpress, AccountsDelete, api, bootbox) { - var AccountHeader = {}; - var isAdminOrSelfOrGlobalMod; + const AccountHeader = {}; + let isAdminOrSelfOrGlobalMod; AccountHeader.init = function () { isAdminOrSelfOrGlobalMod = ajaxify.data.isAdmin || ajaxify.data.isSelf || ajaxify.data.isGlobalModerator; @@ -78,7 +78,7 @@ define('forum/account/header', [ function selectActivePill() { $('.account-sub-links li').removeClass('active').each(function () { - var href = $(this).find('a').attr('href'); + const href = $(this).find('a').attr('href'); if (decodeURIComponent(href) === decodeURIComponent(window.location.pathname)) { $(this).addClass('active'); @@ -146,12 +146,12 @@ define('forum/account/header', [ submit: { label: '[[user:ban_account]]', callback: function () { - var formData = $('.ban-modal form').serializeArray().reduce(function (data, cur) { + const formData = $('.ban-modal form').serializeArray().reduce(function (data, cur) { data[cur.name] = cur.value; return data; }, {}); - var until = formData.length > 0 ? ( + const until = formData.length > 0 ? ( Date.now() + (formData.length * 1000 * 60 * 60 * (parseInt(formData.unit, 10) ? 24 : 1)) ) : 0; @@ -188,7 +188,7 @@ define('forum/account/header', [ } function toggleBlockAccount() { - var targetEl = this; + const targetEl = this; socket.emit('user.toggleBlock', { blockeeUid: ajaxify.data.uid, blockerUid: app.user.uid, diff --git a/public/src/client/account/ignored.js b/public/src/client/account/ignored.js index 0664325d8e..802985e141 100644 --- a/public/src/client/account/ignored.js +++ b/public/src/client/account/ignored.js @@ -1,7 +1,7 @@ 'use strict'; define('forum/account/ignored', ['forum/account/header', 'forum/account/topics'], function (header, topics) { - var AccountIgnored = {}; + const AccountIgnored = {}; AccountIgnored.init = function () { header.init(); diff --git a/public/src/client/account/info.js b/public/src/client/account/info.js index 05631ffa4f..9a653fb582 100644 --- a/public/src/client/account/info.js +++ b/public/src/client/account/info.js @@ -2,7 +2,7 @@ define('forum/account/info', ['forum/account/header', 'components', 'forum/account/sessions'], function (header, components, sessions) { - var Info = {}; + const Info = {}; Info.init = function () { header.init(); @@ -12,15 +12,15 @@ define('forum/account/info', ['forum/account/header', 'components', 'forum/accou function handleModerationNote() { $('[component="account/save-moderation-note"]').on('click', function () { - var note = $('[component="account/moderation-note"]').val(); + const note = $('[component="account/moderation-note"]').val(); socket.emit('user.setModerationNote', { uid: ajaxify.data.uid, note: note }, function (err) { if (err) { return app.alertError(err.message); } $('[component="account/moderation-note"]').val(''); app.alertSuccess('[[user:info.moderation-note.success]]'); - var timestamp = Date.now(); - var data = [{ + const timestamp = Date.now(); + const data = [{ note: utils.escapeHTML(note), user: app.user, timestamp: timestamp, diff --git a/public/src/client/account/posts.js b/public/src/client/account/posts.js index dbf1a6f7d8..27442e21a5 100644 --- a/public/src/client/account/posts.js +++ b/public/src/client/account/posts.js @@ -2,10 +2,10 @@ define('forum/account/posts', ['forum/account/header', 'forum/infinitescroll', 'hooks'], function (header, infinitescroll, hooks) { - var AccountPosts = {}; + const AccountPosts = {}; - var template; - var page = 1; + let template; + let page = 1; AccountPosts.init = function () { header.init(); @@ -27,7 +27,7 @@ define('forum/account/posts', ['forum/account/header', 'forum/infinitescroll', ' if (direction < 0) { return; } - var params = utils.params(); + const params = utils.params(); page += 1; params.page = page; diff --git a/public/src/client/account/profile.js b/public/src/client/account/profile.js index 421c108113..63024e4d04 100644 --- a/public/src/client/account/profile.js +++ b/public/src/client/account/profile.js @@ -5,7 +5,7 @@ define('forum/account/profile', [ 'forum/account/header', 'bootbox', ], function (header, bootbox) { - var Account = {}; + const Account = {}; Account.init = function () { header.init(); diff --git a/public/src/client/account/sessions.js b/public/src/client/account/sessions.js index f9dab2419f..13414bda6a 100644 --- a/public/src/client/account/sessions.js +++ b/public/src/client/account/sessions.js @@ -2,7 +2,7 @@ define('forum/account/sessions', ['forum/account/header', 'components', 'api'], function (header, components, api) { - var Sessions = {}; + const Sessions = {}; Sessions.init = function () { header.init(); @@ -11,8 +11,8 @@ define('forum/account/sessions', ['forum/account/header', 'components', 'api'], Sessions.prepareSessionRevocation = function () { components.get('user/sessions').on('click', '[data-action]', function () { - var parentEl = $(this).parents('[data-uuid]'); - var uuid = parentEl.attr('data-uuid'); + const parentEl = $(this).parents('[data-uuid]'); + const uuid = parentEl.attr('data-uuid'); if (uuid) { // This is done via DELETE because a user shouldn't be able to @@ -21,7 +21,7 @@ define('forum/account/sessions', ['forum/account/header', 'components', 'api'], parentEl.remove(); }).catch((err) => { try { - var errorObj = JSON.parse(err.responseText); + const errorObj = JSON.parse(err.responseText); if (errorObj.loggedIn === false) { window.location.href = config.relative_path + '/login?error=' + errorObj.title; } diff --git a/public/src/client/account/settings.js b/public/src/client/account/settings.js index 7994e552de..995fbbd4b6 100644 --- a/public/src/client/account/settings.js +++ b/public/src/client/account/settings.js @@ -2,7 +2,7 @@ define('forum/account/settings', ['forum/account/header', 'components', 'translator', 'api'], function (header, components, translator, api) { - var AccountSettings = {}; + const AccountSettings = {}; // If page skin is changed but not saved, switch the skin back $(window).on('action:ajaxify.start', function () { @@ -15,7 +15,7 @@ define('forum/account/settings', ['forum/account/header', 'components', 'transla header.init(); $('#submitBtn').on('click', function () { - var settings = loadSettings(); + const settings = loadSettings(); if (settings.homePageRoute === 'custom' && settings.homePageCustom) { $.get(config.relative_path + '/' + settings.homePageCustom, function () { @@ -42,11 +42,11 @@ define('forum/account/settings', ['forum/account/header', 'components', 'transla }; function loadSettings() { - var settings = {}; + const settings = {}; $('.account').find('input, textarea, select').each(function (id, input) { input = $(input); - var setting = input.attr('data-property'); + const setting = input.attr('data-property'); if (input.is('select')) { settings[setting] = input.val(); return; @@ -68,8 +68,8 @@ define('forum/account/settings', ['forum/account/header', 'components', 'transla function saveSettings(settings) { api.put(`/users/${ajaxify.data.uid}/settings`, { settings }).then((newSettings) => { app.alertSuccess('[[success:settings-saved]]'); - var languageChanged = false; - for (var key in newSettings) { + let languageChanged = false; + for (const key in newSettings) { if (newSettings.hasOwnProperty(key)) { if (key === 'userLang' && config.userLang !== newSettings.userLang) { languageChanged = true; @@ -82,7 +82,7 @@ define('forum/account/settings', ['forum/account/header', 'components', 'transla if (languageChanged && parseInt(app.user.uid, 10) === parseInt(ajaxify.data.theirid, 10)) { translator.translate('[[language:dir]]', config.userLang, function (translated) { - var htmlEl = $('html'); + const htmlEl = $('html'); htmlEl.attr('data-dir', translated); htmlEl.css('direction', translated); }); @@ -105,20 +105,20 @@ define('forum/account/settings', ['forum/account/header', 'components', 'transla } function reskin(skinName) { - var clientEl = Array.prototype.filter.call(document.querySelectorAll('link[rel="stylesheet"]'), function (el) { + const clientEl = Array.prototype.filter.call(document.querySelectorAll('link[rel="stylesheet"]'), function (el) { return el.href.indexOf(config.relative_path + '/assets/client') !== -1; })[0] || null; if (!clientEl) { return; } - var currentSkinClassName = $('body').attr('class').split(/\s+/).filter(function (className) { + const currentSkinClassName = $('body').attr('class').split(/\s+/).filter(function (className) { return className.startsWith('skin-'); }); if (!currentSkinClassName[0]) { return; } - var currentSkin = currentSkinClassName[0].slice(5); + let currentSkin = currentSkinClassName[0].slice(5); currentSkin = currentSkin !== 'noskin' ? currentSkin : ''; // Stop execution if skin didn't change @@ -126,7 +126,7 @@ define('forum/account/settings', ['forum/account/header', 'components', 'transla return; } - var linkEl = document.createElement('link'); + const linkEl = document.createElement('link'); linkEl.rel = 'stylesheet'; linkEl.type = 'text/css'; linkEl.href = config.relative_path + '/assets/client' + (skinName ? '-' + skinName : '') + '.css'; diff --git a/public/src/client/account/topics.js b/public/src/client/account/topics.js index de005271d9..cba3358275 100644 --- a/public/src/client/account/topics.js +++ b/public/src/client/account/topics.js @@ -6,10 +6,10 @@ define('forum/account/topics', [ 'forum/infinitescroll', 'hooks', ], function (header, infinitescroll, hooks) { - var AccountTopics = {}; + const AccountTopics = {}; - var template; - var page = 1; + let template; + let page = 1; AccountTopics.init = function () { header.init(); @@ -29,7 +29,7 @@ define('forum/account/topics', [ if (direction < 0) { return; } - var params = utils.params(); + const params = utils.params(); page += 1; params.page = page; diff --git a/public/src/client/account/uploads.js b/public/src/client/account/uploads.js index 222e30e9a0..51fdb8a614 100644 --- a/public/src/client/account/uploads.js +++ b/public/src/client/account/uploads.js @@ -1,14 +1,14 @@ 'use strict'; define('forum/account/uploads', ['forum/account/header'], function (header) { - var AccountUploads = {}; + const AccountUploads = {}; AccountUploads.init = function () { header.init(); $('[data-action="delete"]').on('click', function () { - var el = $(this).parents('[data-name]'); - var name = el.attr('data-name'); + const el = $(this).parents('[data-name]'); + const name = el.attr('data-name'); socket.emit('user.deleteUpload', { name: name, uid: ajaxify.data.uid }, function (err) { if (err) { diff --git a/public/src/client/account/upvoted.js b/public/src/client/account/upvoted.js index fb14f58111..274cdfb025 100644 --- a/public/src/client/account/upvoted.js +++ b/public/src/client/account/upvoted.js @@ -2,7 +2,7 @@ define('forum/account/upvoted', ['forum/account/header', 'forum/account/posts'], function (header, posts) { - var Upvoted = {}; + const Upvoted = {}; Upvoted.init = function () { header.init(); diff --git a/public/src/client/account/watched.js b/public/src/client/account/watched.js index a2c22f90f7..15861122c0 100644 --- a/public/src/client/account/watched.js +++ b/public/src/client/account/watched.js @@ -2,7 +2,7 @@ define('forum/account/watched', ['forum/account/header', 'forum/account/topics'], function (header, topics) { - var AccountWatched = {}; + const AccountWatched = {}; AccountWatched.init = function () { header.init(); diff --git a/public/src/client/categories.js b/public/src/client/categories.js index c7a05e7af5..44025e8b8c 100644 --- a/public/src/client/categories.js +++ b/public/src/client/categories.js @@ -2,7 +2,7 @@ define('forum/categories', ['components', 'categorySelector', 'hooks'], function (components, categorySelector, hooks) { - var categories = {}; + const categories = {}; $(window).on('action:ajaxify.start', function (ev, data) { if (ajaxify.currentPage !== data.url) { @@ -34,8 +34,8 @@ define('forum/categories', ['components', 'categorySelector', 'hooks'], function }; function renderNewPost(cid, post) { - var category = components.get('categories/category', 'cid', cid); - var numRecentReplies = category.attr('data-numRecentReplies'); + const category = components.get('categories/category', 'cid', cid); + const numRecentReplies = category.attr('data-numRecentReplies'); if (!numRecentReplies || !parseInt(numRecentReplies, 10)) { return; } @@ -43,7 +43,7 @@ define('forum/categories', ['components', 'categorySelector', 'hooks'], function return; } - var recentPosts = category.find('[component="category/posts"]'); + const recentPosts = category.find('[component="category/posts"]'); app.parseAndTranslate('partials/categories/lastpost', 'posts', { posts: [post] }, function (html) { html.find('.post-content img:not(.not-responsive)').addClass('img-responsive'); diff --git a/public/src/client/category.js b/public/src/client/category.js index 43c828a4af..92cb42e061 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -9,7 +9,7 @@ define('forum/category', [ 'categorySelector', 'hooks', ], function (infinitescroll, share, navigator, topicList, sort, categorySelector, hooks) { - var Category = {}; + const Category = {}; $(window).on('action:ajaxify.start', function (ev, data) { if (!String(data.url).startsWith('category/')) { @@ -18,7 +18,7 @@ define('forum/category', [ }); Category.init = function () { - var cid = ajaxify.data.cid; + const cid = ajaxify.data.cid; app.enterRoom('category_' + cid); @@ -55,7 +55,7 @@ define('forum/category', [ }; function handleScrollToTopicIndex() { - var topicIndex = ajaxify.data.topicIndex; + let topicIndex = ajaxify.data.topicIndex; if (topicIndex && utils.isNumber(topicIndex)) { topicIndex = Math.max(0, parseInt(topicIndex, 10)); if (topicIndex && window.location.search.indexOf('page=') === -1) { @@ -66,8 +66,8 @@ define('forum/category', [ function handleIgnoreWatch(cid) { $('[component="category/watching"], [component="category/ignoring"], [component="category/notwatching"]').on('click', function () { - var $this = $(this); - var state = $this.attr('data-state'); + const $this = $(this); + const state = $this.attr('data-state'); socket.emit('categories.setWatchState', { cid: cid, state: state }, function (err) { if (err) { @@ -90,7 +90,7 @@ define('forum/category', [ function handleLoadMoreSubcategories() { $('[component="category/load-more-subcategories"]').on('click', function () { - var btn = $(this); + const btn = $(this); socket.emit('categories.loadMoreSubCategories', { cid: ajaxify.data.cid, start: ajaxify.data.nextSubCategoryStart, @@ -138,7 +138,7 @@ define('forum/category', [ callback = callback || function () {}; hooks.fire('action:category.loading'); - var params = utils.params(); + const params = utils.params(); infinitescroll.loadMore('categories.loadMore', { cid: ajaxify.data.cid, after: after, diff --git a/public/src/client/category/tools.js b/public/src/client/category/tools.js index a46624536c..84e2829d0c 100644 --- a/public/src/client/category/tools.js +++ b/public/src/client/category/tools.js @@ -10,7 +10,7 @@ define('forum/category/tools', [ 'api', 'bootbox', ], function (topicSelect, threadTools, components, translator, api, bootbox) { - var CategoryTools = {}; + const CategoryTools = {}; CategoryTools.init = function () { topicSelect.init(updateDropdownOptions); @@ -54,7 +54,7 @@ define('forum/category/tools', [ // todo: should also use categoryCommand, but no write api call exists for this yet components.get('topic/mark-unread-for-all').on('click', function () { - var tids = topicSelect.getSelectedTids(); + const tids = topicSelect.getSelectedTids(); if (!tids.length) { return app.alertError('[[error:no-topics-selected]]'); } @@ -73,7 +73,7 @@ define('forum/category/tools', [ components.get('topic/move').on('click', function () { require(['forum/topic/move'], function (move) { - var tids = topicSelect.getSelectedTids(); + const tids = topicSelect.getSelectedTids(); if (!tids.length) { return app.alertError('[[error:no-topics-selected]]'); @@ -85,7 +85,7 @@ define('forum/category/tools', [ }); components.get('topic/move-all').on('click', function () { - var cid = ajaxify.data.cid; + const cid = ajaxify.data.cid; if (!ajaxify.data.template.category) { return app.alertError('[[error:invalid-data]]'); } @@ -101,7 +101,7 @@ define('forum/category/tools', [ }); components.get('topic/merge').on('click', function () { - var tids = topicSelect.getSelectedTids(); + const tids = topicSelect.getSelectedTids(); require(['forum/topic/merge'], function (merge) { merge.init(function () { if (tids.length) { @@ -185,11 +185,11 @@ define('forum/category/tools', [ } function updateDropdownOptions() { - var tids = topicSelect.getSelectedTids(); - var isAnyDeleted = isAny(isTopicDeleted, tids); - var areAllDeleted = areAll(isTopicDeleted, tids); - var isAnyPinned = isAny(isTopicPinned, tids); - var isAnyLocked = isAny(isTopicLocked, tids); + const tids = topicSelect.getSelectedTids(); + const isAnyDeleted = isAny(isTopicDeleted, tids); + const areAllDeleted = areAll(isTopicDeleted, tids); + const isAnyPinned = isAny(isTopicPinned, tids); + const isAnyLocked = isAny(isTopicLocked, tids); const isAnyScheduled = isAny(isTopicScheduled, tids); const areAllScheduled = areAll(isTopicScheduled, tids); @@ -207,7 +207,7 @@ define('forum/category/tools', [ } function isAny(method, tids) { - for (var i = 0; i < tids.length; i += 1) { + for (let i = 0; i < tids.length; i += 1) { if (method(tids[i])) { return true; } @@ -216,7 +216,7 @@ define('forum/category/tools', [ } function areAll(method, tids) { - for (var i = 0; i < tids.length; i += 1) { + for (let i = 0; i < tids.length; i += 1) { if (!method(tids[i])) { return false; } @@ -245,20 +245,20 @@ define('forum/category/tools', [ } function setDeleteState(data) { - var topic = getTopicEl(data.tid); + const topic = getTopicEl(data.tid); topic.toggleClass('deleted', data.isDeleted); topic.find('[component="topic/locked"]').toggleClass('hide', !data.isDeleted); } function setPinnedState(data) { - var topic = getTopicEl(data.tid); + const topic = getTopicEl(data.tid); topic.toggleClass('pinned', data.isPinned); topic.find('[component="topic/pinned"]').toggleClass('hide', !data.isPinned); ajaxify.refresh(); } function setLockedState(data) { - var topic = getTopicEl(data.tid); + const topic = getTopicEl(data.tid); topic.toggleClass('locked', data.isLocked); topic.find('[component="topic/locked"]').toggleClass('hide', !data.isLocked); } @@ -275,20 +275,20 @@ define('forum/category/tools', [ if (!ajaxify.data.topics || !ajaxify.data.template.category) { return; } - var numPinned = ajaxify.data.topics.filter(topic => topic.pinned).length; + const numPinned = ajaxify.data.topics.filter(topic => topic.pinned).length; if ((!app.user.isAdmin && !app.user.isMod) || numPinned < 2) { return; } app.loadJQueryUI(function () { - var topicListEl = $('[component="category"]').filter(function (i, e) { + const topicListEl = $('[component="category"]').filter(function (i, e) { return !$(e).parents('[widget-area],[data-widget-area]').length; }); topicListEl.sortable({ handle: '[component="topic/pinned"]', items: '[component="category/topic"].pinned', update: function (ev, ui) { - var baseIndex = parseInt(topicListEl.find('[component="category/topic"].pinned').first().attr('data-index'), 10); + const baseIndex = parseInt(topicListEl.find('[component="category/topic"].pinned').first().attr('data-index'), 10); socket.emit('topics.orderPinnedTopics', { tid: ui.item.attr('data-tid'), order: baseIndex + ui.item.index() - 1, diff --git a/public/src/client/chats.js b/public/src/client/chats.js index eedf23cfc0..45b958e4f1 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -17,14 +17,14 @@ define('forum/chats', [ recentChats, search, messages, Benchpress, autocomplete, hooks, bootbox ) { - var Chats = { + const Chats = { initialised: false, }; - var newMessage = false; + let newMessage = false; Chats.init = function () { - var env = utils.findBootstrapEnvironment(); + const env = utils.findBootstrapEnvironment(); if (!Chats.initialised) { Chats.addSocketListeners(); @@ -75,8 +75,8 @@ define('forum/chats', [ Chats.addIPHandler = function (container) { container.on('click', '.chat-ip-button', function () { - var ipEl = $(this).parent(); - var mid = ipEl.parents('[data-mid]').attr('data-mid'); + const ipEl = $(this).parent(); + const mid = ipEl.parents('[data-mid]').attr('data-mid'); socket.emit('modules.chats.getIP', mid, function (err, ip) { if (err) { return app.alertError(err); @@ -88,8 +88,8 @@ define('forum/chats', [ Chats.addPopoutHandler = function () { $('[data-action="pop-out"]').on('click', function () { - var text = components.get('chat/input').val(); - var roomId = ajaxify.data.roomId; + const text = components.get('chat/input').val(); + const roomId = ajaxify.data.roomId; if (app.previousUrl && app.previousUrl.match(/chats/)) { ajaxify.go('user/' + ajaxify.data.userslug + '/chats', function () { @@ -107,19 +107,19 @@ define('forum/chats', [ }; Chats.addScrollHandler = function (roomId, uid, el) { - var loading = false; + let loading = false; el.off('scroll').on('scroll', function () { messages.toggleScrollUpAlert(el); if (loading) { return; } - var top = (el[0].scrollHeight - el.height()) * 0.1; + const top = (el[0].scrollHeight - el.height()) * 0.1; if (el.scrollTop() >= top) { return; } loading = true; - var start = parseInt(el.children('[data-mid]').length, 10); + const start = parseInt(el.children('[data-mid]').length, 10); socket.emit('modules.chats.getMessages', { roomId: roomId, uid: uid, @@ -140,8 +140,8 @@ define('forum/chats', [ return; } messages.parseMessage(data, function (html) { - var currentScrollTop = el.scrollTop(); - var previousHeight = el[0].scrollHeight; + const currentScrollTop = el.scrollTop(); + const previousHeight = el[0].scrollHeight; html = $(html); el.prepend(html); html.find('.timeago').timeago(); @@ -162,7 +162,7 @@ define('forum/chats', [ }; Chats.addCharactersLeftHandler = function (parent) { - var element = parent.find('[component="chat/input"]'); + const element = parent.find('[component="chat/input"]'); element.on('change keyup paste', function () { messages.updateRemainingLength(parent); }); @@ -170,15 +170,15 @@ define('forum/chats', [ Chats.addActionHandlers = function (element, roomId) { element.on('click', '[data-action]', function () { - var messageId = $(this).parents('[data-mid]').attr('data-mid'); - var action = this.getAttribute('data-action'); + const messageId = $(this).parents('[data-mid]').attr('data-mid'); + const action = this.getAttribute('data-action'); switch (action) { - case 'edit': - var inputEl = $('[data-roomid="' + roomId + '"] [component="chat/input"]'); + case 'edit': { + const inputEl = $('[data-roomid="' + roomId + '"] [component="chat/input"]'); messages.prepEdit(inputEl, messageId, roomId); break; - + } case 'delete': messages.delete(messageId, roomId); break; @@ -192,16 +192,16 @@ define('forum/chats', [ Chats.addHotkeys = function () { mousetrap.bind('ctrl+up', function () { - var activeContact = $('.chats-list .bg-info'); - var prev = activeContact.prev(); + const activeContact = $('.chats-list .bg-info'); + const prev = activeContact.prev(); if (prev.length) { Chats.switchChat(prev.attr('data-roomid')); } }); mousetrap.bind('ctrl+down', function () { - var activeContact = $('.chats-list .bg-info'); - var next = activeContact.next(); + const activeContact = $('.chats-list .bg-info'); + const next = activeContact.next(); if (next.length) { Chats.switchChat(next.attr('data-roomid')); @@ -210,12 +210,12 @@ define('forum/chats', [ mousetrap.bind('up', function (e) { if (e.target === components.get('chat/input').get(0)) { // Retrieve message id from messages list - var message = components.get('chat/messages').find('.chat-message[data-self="1"]').last(); + const message = components.get('chat/messages').find('.chat-message[data-self="1"]').last(); if (!message.length) { return; } - var lastMid = message.attr('data-mid'); - var inputEl = components.get('chat/input'); + const lastMid = message.attr('data-mid'); + const inputEl = components.get('chat/input'); messages.prepEdit(inputEl, lastMid, ajaxify.data.roomId); } @@ -223,7 +223,7 @@ define('forum/chats', [ }; Chats.addMemberHandler = function (roomId, buttonEl) { - var modal; + let modal; buttonEl.on('click', function () { app.parseAndTranslate('partials/modals/manage_room', {}, function (html) { @@ -237,8 +237,8 @@ define('forum/chats', [ Chats.refreshParticipantsList(roomId, modal); Chats.addKickHandler(roomId, modal); - var searchInput = modal.find('input'); - var errorEl = modal.find('.text-danger'); + const searchInput = modal.find('input'); + const errorEl = modal.find('.text-danger'); require(['autocomplete', 'translator'], function (autocomplete, translator) { autocomplete.user(searchInput, function (event, selected) { errorEl.text(''); @@ -263,7 +263,7 @@ define('forum/chats', [ Chats.addKickHandler = function (roomId, modal) { modal.on('click', '[data-action="kick"]', function () { - var uid = parseInt(this.getAttribute('data-uid'), 10); + const uid = parseInt(this.getAttribute('data-uid'), 10); socket.emit('modules.chats.removeUserFromRoom', { roomId: roomId, @@ -292,7 +292,7 @@ define('forum/chats', [ } // Return user to chats page. If modal, close modal. - var modal = buttonEl.parents('.chat-modal'); + const modal = buttonEl.parents('.chat-modal'); if (modal.length) { require(['chat'], function (chatLib) { chatLib.close(modal); @@ -309,7 +309,7 @@ define('forum/chats', [ Chats.refreshParticipantsList = function (roomId, modal) { socket.emit('modules.chats.getUsersInRoom', { roomId: roomId }, function (err, users) { - var listEl = modal.find('.list-group'); + const listEl = modal.find('.list-group'); if (err) { return translator.translate('[[error:invalid-data]]', function (translated) { @@ -326,7 +326,7 @@ define('forum/chats', [ }; Chats.addRenameHandler = function (roomId, buttonEl, roomName) { - var modal; + let modal; buttonEl.on('click', function () { app.parseAndTranslate('partials/modals/rename_room', { @@ -378,7 +378,7 @@ define('forum/chats', [ return; } - var data = { + const data = { element: element, strategies: [], options: { @@ -398,7 +398,7 @@ define('forum/chats', [ }; Chats.leave = function (el) { - var roomId = el.attr('data-roomid'); + const roomId = el.attr('data-roomid'); socket.emit('modules.chats.leave', roomId, function (err) { if (err) { return app.alertError(err.message); @@ -409,7 +409,7 @@ define('forum/chats', [ el.remove(); } require(['chat'], function (chat) { - var modal = chat.getModal(roomId); + const modal = chat.getModal(roomId); if (modal.length) { chat.close(modal); } @@ -423,7 +423,7 @@ define('forum/chats', [ roomid = ''; } - var url = 'user/' + ajaxify.data.userslug + '/chats/' + roomid + window.location.search; + const url = 'user/' + ajaxify.data.userslug + '/chats/' + roomid + window.location.search; if (self.fetch) { fetch(config.relative_path + '/api/' + url, { credentials: 'include' }) .then(function (response) { @@ -475,12 +475,12 @@ define('forum/chats', [ messages.appendChatMessage($('.expanded-chat .chat-content'), data.message); } else if (ajaxify.data.template.chats) { - var roomEl = $('[data-roomid=' + data.roomId + ']'); + const roomEl = $('[data-roomid=' + data.roomId + ']'); if (roomEl.length > 0) { roomEl.addClass('unread'); } else { - var recentEl = components.get('chat/recent'); + const recentEl = components.get('chat/recent'); app.parseAndTranslate('partials/chats/recent_room', { rooms: { roomId: data.roomId, @@ -502,8 +502,8 @@ define('forum/chats', [ messages.addSocketListeners(); socket.on('event:chats.roomRename', function (data) { - var roomEl = components.get('chat/recent/room', data.roomId); - var titleEl = roomEl.find('[component="chat/title"]'); + const roomEl = components.get('chat/recent/room', data.roomId); + const titleEl = roomEl.find('[component="chat/title"]'); ajaxify.data.roomName = data.newName; titleEl.text(data.newName); @@ -511,10 +511,10 @@ define('forum/chats', [ }; Chats.resizeMainWindow = function () { - var viewportHeight = $(window).height(); - var mainWrapper = components.get('chat/main-wrapper'); - var navWrapper = components.get('chat/nav-wrapper'); - var fromTop = 0; + const viewportHeight = $(window).height(); + const mainWrapper = components.get('chat/main-wrapper'); + const navWrapper = components.get('chat/nav-wrapper'); + let fromTop = 0; if (mainWrapper.length && navWrapper.length) { fromTop = mainWrapper.offset().top || navWrapper.offset().top; } diff --git a/public/src/client/chats/messages.js b/public/src/client/chats/messages.js index 7a743ce761..5d43497014 100644 --- a/public/src/client/chats/messages.js +++ b/public/src/client/chats/messages.js @@ -2,11 +2,11 @@ define('forum/chats/messages', ['components', 'translator', 'benchpress', 'hooks', 'bootbox'], function (components, translator, Benchpress, hooks, bootbox) { - var messages = {}; + const messages = {}; messages.sendMessage = function (roomId, inputEl) { - var msg = inputEl.val(); - var mid = inputEl.attr('data-mid'); + const msg = inputEl.val(); + const mid = inputEl.attr('data-mid'); if (!msg.trim().length) { return; @@ -59,7 +59,7 @@ define('forum/chats/messages', ['components', 'translator', 'benchpress', 'hooks }; messages.updateRemainingLength = function (parent) { - var element = parent.find('[component="chat/input"]'); + const element = parent.find('[component="chat/input"]'); parent.find('[component="chat/message/length"]').text(element.val().length); parent.find('[component="chat/message/remaining"]').text(config.maximumChatMessageLength - element.val().length); hooks.fire('action:chat.updateRemainingLength', { @@ -68,8 +68,8 @@ define('forum/chats/messages', ['components', 'translator', 'benchpress', 'hooks }; messages.appendChatMessage = function (chatContentEl, data) { - var lastSpeaker = parseInt(chatContentEl.find('.chat-message').last().attr('data-uid'), 10); - var lasttimestamp = parseInt(chatContentEl.find('.chat-message').last().attr('data-timestamp'), 10); + const lastSpeaker = parseInt(chatContentEl.find('.chat-message').last().attr('data-uid'), 10); + const lasttimestamp = parseInt(chatContentEl.find('.chat-message').last().attr('data-timestamp'), 10); if (!Array.isArray(data)) { data.newSet = lastSpeaker !== parseInt(data.fromuid, 10) || parseInt(data.timestamp, 10) > parseInt(lasttimestamp, 10) + (1000 * 60 * 3); @@ -81,8 +81,8 @@ define('forum/chats/messages', ['components', 'translator', 'benchpress', 'hooks }; function onMessagesParsed(chatContentEl, html) { - var newMessage = $(html); - var isAtBottom = messages.isAtBottom(chatContentEl); + const newMessage = $(html); + const isAtBottom = messages.isAtBottom(chatContentEl); newMessage.appendTo(chatContentEl); newMessage.find('.timeago').timeago(); newMessage.find('img:not(.not-responsive)').addClass('img-responsive'); @@ -114,7 +114,7 @@ define('forum/chats/messages', ['components', 'translator', 'benchpress', 'hooks messages.isAtBottom = function (containerEl, threshold) { if (containerEl.length) { - var distanceToBottom = containerEl[0].scrollHeight - ( + const distanceToBottom = containerEl[0].scrollHeight - ( containerEl.outerHeight() + containerEl.scrollTop() ); return distanceToBottom < (threshold || 100); @@ -131,7 +131,7 @@ define('forum/chats/messages', ['components', 'translator', 'benchpress', 'hooks }; messages.toggleScrollUpAlert = function (containerEl) { - var isAtBottom = messages.isAtBottom(containerEl, 300); + const isAtBottom = messages.isAtBottom(containerEl, 300); containerEl.parent() .find('[component="chat/messages/scroll-up-alert"]') .toggleClass('hidden', isAtBottom); @@ -171,10 +171,10 @@ define('forum/chats/messages', ['components', 'translator', 'benchpress', 'hooks function onChatMessageEdited(data) { data.messages.forEach(function (message) { - var self = parseInt(message.fromuid, 10) === parseInt(app.user.uid, 10); + const self = parseInt(message.fromuid, 10) === parseInt(app.user.uid, 10); message.self = self ? 1 : 0; messages.parseMessage(message, function (html) { - var body = components.get('chat/message', message.messageId); + const body = components.get('chat/message', message.messageId); if (body.length) { body.replaceWith(html); components.get('chat/message', message.messageId).find('.timeago').timeago(); diff --git a/public/src/client/chats/recent.js b/public/src/client/chats/recent.js index 32156cfc8f..de69baf45e 100644 --- a/public/src/client/chats/recent.js +++ b/public/src/client/chats/recent.js @@ -2,7 +2,7 @@ define('forum/chats/recent', function () { - var recent = {}; + const recent = {}; recent.init = function () { require(['forum/chats'], function (Chats) { @@ -11,8 +11,8 @@ define('forum/chats/recent', function () { }); $('[component="chat/recent"]').on('scroll', function () { - var $this = $(this); - var bottom = ($this[0].scrollHeight - $this.height()) * 0.9; + const $this = $(this); + const bottom = ($this[0].scrollHeight - $this.height()) * 0.9; if ($this.scrollTop() > bottom) { loadMoreRecentChats(); } @@ -21,7 +21,7 @@ define('forum/chats/recent', function () { }; function loadMoreRecentChats() { - var recentChats = $('[component="chat/recent"]'); + const recentChats = $('[component="chat/recent"]'); if (recentChats.attr('loading')) { return; } diff --git a/public/src/client/chats/search.js b/public/src/client/chats/search.js index 0c83dd101f..82bfcba8cc 100644 --- a/public/src/client/chats/search.js +++ b/public/src/client/chats/search.js @@ -2,14 +2,14 @@ define('forum/chats/search', ['components', 'api'], function (components, api) { - var search = {}; + const search = {}; search.init = function () { components.get('chat/search').on('keyup', utils.debounce(doSearch, 250)); }; function doSearch() { - var username = components.get('chat/search').val(); + const username = components.get('chat/search').val(); if (!username) { return $('[component="chat/search/list"]').empty(); } @@ -23,7 +23,7 @@ define('forum/chats/search', ['components', 'api'], function (components, api) { } function displayResults(data) { - var chatsListEl = $('[component="chat/search/list"]'); + const chatsListEl = $('[component="chat/search/list"]'); chatsListEl.empty(); data.users = data.users.filter(function (user) { @@ -35,7 +35,7 @@ define('forum/chats/search', ['components', 'api'], function (components, api) { } data.users.forEach(function (userObj) { - var chatEl = displayUser(chatsListEl, userObj); + const chatEl = displayUser(chatsListEl, userObj); onUserClick(chatEl, userObj); }); @@ -50,7 +50,7 @@ define('forum/chats/search', ['components', 'api'], function (components, api) { ' ' + userObj.username; } - var chatEl = $('
    • ') + const chatEl = $('
    • ') .attr('data-uid', userObj.uid) .appendTo(chatsListEl); diff --git a/public/src/client/compose.js b/public/src/client/compose.js index a7890679a5..2c0267c374 100644 --- a/public/src/client/compose.js +++ b/public/src/client/compose.js @@ -2,10 +2,10 @@ define('forum/compose', ['hooks'], function (hooks) { - var Compose = {}; + const Compose = {}; Compose.init = function () { - var container = $('.composer'); + const container = $('.composer'); if (container.length) { hooks.fire('action:composer.enhance', { diff --git a/public/src/client/flags/detail.js b/public/src/client/flags/detail.js index 2dfb46eac8..81b1592a73 100644 --- a/public/src/client/flags/detail.js +++ b/public/src/client/flags/detail.js @@ -1,7 +1,7 @@ 'use strict'; define('forum/flags/detail', ['forum/flags/list', 'components', 'translator', 'benchpress', 'forum/account/header', 'accounts/delete', 'api', 'bootbox'], function (FlagsList, components, translator, Benchpress, AccountHeader, AccountsDelete, api, bootbox) { - var Detail = {}; + const Detail = {}; Detail.init = function () { // Update attributes @@ -9,9 +9,9 @@ define('forum/flags/detail', ['forum/flags/list', 'components', 'translator', 'b $('#assignee').val(ajaxify.data.assignee).removeAttr('disabled'); $('#content > div').on('click', '[data-action]', function () { - var action = this.getAttribute('data-action'); - var uid = $(this).parents('[data-uid]').attr('data-uid'); - var noteEl = document.getElementById('note'); + const action = this.getAttribute('data-action'); + const uid = $(this).parents('[data-uid]').attr('data-uid'); + const noteEl = document.getElementById('note'); switch (action) { case 'assign': @@ -45,8 +45,8 @@ define('forum/flags/detail', ['forum/flags/list', 'components', 'translator', 'b }).catch(app.alertError); break; - case 'delete-note': - var datetime = parseInt(this.closest('[data-datetime]').getAttribute('data-datetime'), 10); + case 'delete-note': { + const datetime = parseInt(this.closest('[data-datetime]').getAttribute('data-datetime'), 10); bootbox.confirm('[[flags:delete-note-confirm]]', function (ok) { if (ok) { api.delete(`/flags/${ajaxify.data.flagId}/notes/${datetime}`, {}).then((payload) => { @@ -57,7 +57,7 @@ define('forum/flags/detail', ['forum/flags/list', 'components', 'translator', 'b } }); break; - + } case 'chat': app.newChat(uid); break; @@ -90,15 +90,15 @@ define('forum/flags/detail', ['forum/flags/list', 'components', 'translator', 'b postAction('restore', ajaxify.data.target.pid, ajaxify.data.target.tid); break; - case 'prepare-edit': - var selectedNoteEl = this.closest('[data-index]'); - var index = selectedNoteEl.getAttribute('data-index'); - var textareaEl = document.getElementById('note'); + case 'prepare-edit': { + const selectedNoteEl = this.closest('[data-index]'); + const index = selectedNoteEl.getAttribute('data-index'); + const textareaEl = document.getElementById('note'); textareaEl.value = ajaxify.data.notes[index].content; textareaEl.setAttribute('data-datetime', ajaxify.data.notes[index].datetime); - var siblings = selectedNoteEl.parentElement.children; - for (var el in siblings) { + const siblings = selectedNoteEl.parentElement.children; + for (const el in siblings) { if (siblings.hasOwnProperty(el)) { siblings[el].classList.remove('editing'); } @@ -106,6 +106,7 @@ define('forum/flags/detail', ['forum/flags/list', 'components', 'translator', 'b selectedNoteEl.classList.add('editing'); textareaEl.focus(); break; + } } }); }; @@ -136,7 +137,7 @@ define('forum/flags/detail', ['forum/flags/list', 'components', 'translator', 'b Benchpress.render('flags/detail', { notes: notes, }, 'notes').then(function (html) { - var wrapperEl = components.get('flag/notes'); + const wrapperEl = components.get('flag/notes'); wrapperEl.empty(); wrapperEl.html(html); wrapperEl.find('span.timeago').timeago(); @@ -148,7 +149,7 @@ define('forum/flags/detail', ['forum/flags/list', 'components', 'translator', 'b app.parseAndTranslate('flags/detail', 'history', { history: history, }, function (html) { - var wrapperEl = components.get('flag/history'); + const wrapperEl = components.get('flag/history'); wrapperEl.empty(); wrapperEl.html(html); wrapperEl.find('span.timeago').timeago(); diff --git a/public/src/client/flags/list.js b/public/src/client/flags/list.js index a46dbade1c..2e3000c2d2 100644 --- a/public/src/client/flags/list.js +++ b/public/src/client/flags/list.js @@ -1,9 +1,9 @@ 'use strict'; define('forum/flags/list', ['components', 'Chart', 'categoryFilter', 'autocomplete', 'api'], function (components, Chart, categoryFilter, autocomplete, api) { - var Flags = {}; + const Flags = {}; - var selectedCids; + let selectedCids; Flags.init = function () { Flags.enableFilterForm(); @@ -30,7 +30,7 @@ define('forum/flags/list', ['components', 'Chart', 'categoryFilter', 'autocomple return; } - var flagId = this.getAttribute('data-flag-id'); + const flagId = this.getAttribute('data-flag-id'); ajaxify.go('flags/' + flagId); }); @@ -75,13 +75,13 @@ define('forum/flags/list', ['components', 'Chart', 'categoryFilter', 'autocomple }; Flags.enableCheckboxes = function () { - var flagsList = document.querySelector('[component="flags/list"]'); - var checkboxes = flagsList.querySelectorAll('[data-flag-id] input[type="checkbox"]'); - var bulkEl = document.querySelector('[component="flags/bulk-actions"] button'); - var lastClicked; + const flagsList = document.querySelector('[component="flags/list"]'); + const checkboxes = flagsList.querySelectorAll('[data-flag-id] input[type="checkbox"]'); + const bulkEl = document.querySelector('[component="flags/bulk-actions"] button'); + let lastClicked; document.querySelector('[data-action="toggle-all"]').addEventListener('click', function () { - var state = this.checked; + const state = this.checked; checkboxes.forEach(function (el) { el.checked = state; @@ -90,15 +90,15 @@ define('forum/flags/list', ['components', 'Chart', 'categoryFilter', 'autocomple }); flagsList.addEventListener('click', function (e) { - var subselector = e.target.closest('input[type="checkbox"]'); + const subselector = e.target.closest('input[type="checkbox"]'); if (subselector) { // Stop checkbox clicks from going into the flag details e.stopImmediatePropagation(); if (lastClicked && e.shiftKey && lastClicked !== subselector) { // Select all the checkboxes in between - var state = subselector.checked; - var started = false; + const state = subselector.checked; + let started = false; checkboxes.forEach(function (el) { if ([subselector, lastClicked].some(function (ref) { @@ -130,16 +130,16 @@ define('forum/flags/list', ['components', 'Chart', 'categoryFilter', 'autocomple Flags.handleBulkActions = function () { document.querySelector('[component="flags/bulk-actions"]').addEventListener('click', function (e) { - var subselector = e.target.closest('[data-action]'); + const subselector = e.target.closest('[data-action]'); if (subselector) { - var action = subselector.getAttribute('data-action'); - var flagIds = Flags.getSelected(); - var promises = []; + const action = subselector.getAttribute('data-action'); + const flagIds = Flags.getSelected(); + const promises = []; // TODO: this can be better done with flagIds.map to return promises flagIds.forEach(function (flagId) { promises.push(new Promise(function (resolve, reject) { - var handler = function (err) { + const handler = function (err) { if (err) { reject(err); } @@ -164,10 +164,10 @@ define('forum/flags/list', ['components', 'Chart', 'categoryFilter', 'autocomple }); Promise.allSettled(promises).then(function (results) { - var fulfilled = results.filter(function (res) { + const fulfilled = results.filter(function (res) { return res.status === 'fulfilled'; }).length; - var errors = results.filter(function (res) { + const errors = results.filter(function (res) { return res.status === 'rejected'; }); if (fulfilled) { @@ -184,8 +184,8 @@ define('forum/flags/list', ['components', 'Chart', 'categoryFilter', 'autocomple }; Flags.getSelected = function () { - var checkboxes = document.querySelectorAll('[component="flags/list"] [data-flag-id] input[type="checkbox"]'); - var payload = []; + const checkboxes = document.querySelectorAll('[component="flags/list"] [data-flag-id] input[type="checkbox"]'); + const payload = []; checkboxes.forEach(function (el) { if (el.checked) { payload.push(el.closest('[data-flag-id]').getAttribute('data-flag-id')); @@ -196,15 +196,15 @@ define('forum/flags/list', ['components', 'Chart', 'categoryFilter', 'autocomple }; Flags.handleGraphs = function () { - var dailyCanvas = document.getElementById('flags:daily'); - var dailyLabels = utils.getDaysArray().map(function (text, idx) { + const dailyCanvas = document.getElementById('flags:daily'); + const dailyLabels = utils.getDaysArray().map(function (text, idx) { return idx % 3 ? '' : text; }); if (utils.isMobile()) { Chart.defaults.global.tooltips.enabled = false; } - var data = { + const data = { 'flags:daily': { labels: dailyLabels, datasets: [ diff --git a/public/src/client/groups/details.js b/public/src/client/groups/details.js index 73322e2d1d..b0ed482c0c 100644 --- a/public/src/client/groups/details.js +++ b/public/src/client/groups/details.js @@ -23,11 +23,11 @@ define('forum/groups/details', [ categorySelector, bootbox ) { - var Details = {}; - var groupName; + const Details = {}; + let groupName; Details.init = function () { - var detailsPage = components.get('groups/container'); + const detailsPage = components.get('groups/container'); groupName = ajaxify.data.group.name; @@ -68,12 +68,12 @@ define('forum/groups/details', [ components.get('groups/activity').find('.content img:not(.not-responsive)').addClass('img-responsive'); detailsPage.on('click', '[data-action]', function () { - var btnEl = $(this); - var userRow = btnEl.parents('[data-uid]'); - var ownerFlagEl = userRow.find('.member-name > i'); - var isOwner = !ownerFlagEl.hasClass('invisible'); - var uid = userRow.attr('data-uid'); - var action = btnEl.attr('data-action'); + const btnEl = $(this); + const userRow = btnEl.parents('[data-uid]'); + const ownerFlagEl = userRow.find('.member-name > i'); + const isOwner = !ownerFlagEl.hasClass('invisible'); + const uid = userRow.attr('data-uid'); + const action = btnEl.attr('data-action'); switch (action) { case 'toggleOwnership': @@ -135,16 +135,16 @@ define('forum/groups/details', [ }; Details.prepareSettings = function () { - var settingsFormEl = components.get('groups/settings'); - var labelColorValueEl = settingsFormEl.find('[name="labelColor"]'); - var textColorValueEl = settingsFormEl.find('[name="textColor"]'); - var iconBtn = settingsFormEl.find('[data-action="icon-select"]'); - var previewEl = settingsFormEl.find('.label'); - var previewElText = settingsFormEl.find('.label-text'); - var previewIcon = previewEl.find('i'); - var userTitleEl = settingsFormEl.find('[name="userTitle"]'); - var userTitleEnabledEl = settingsFormEl.find('[name="userTitleEnabled"]'); - var iconValueEl = settingsFormEl.find('[name="icon"]'); + const settingsFormEl = components.get('groups/settings'); + const labelColorValueEl = settingsFormEl.find('[name="labelColor"]'); + const textColorValueEl = settingsFormEl.find('[name="textColor"]'); + const iconBtn = settingsFormEl.find('[data-action="icon-select"]'); + const previewEl = settingsFormEl.find('.label'); + const previewElText = settingsFormEl.find('.label-text'); + const previewIcon = previewEl.find('i'); + const userTitleEl = settingsFormEl.find('[name="userTitle"]'); + const userTitleEnabledEl = settingsFormEl.find('[name="userTitleEnabled"]'); + const iconValueEl = settingsFormEl.find('[name="icon"]'); labelColorValueEl.on('input', function () { previewEl.css('background-color', labelColorValueEl.val()); @@ -168,7 +168,7 @@ define('forum/groups/details', [ // Disable user title customisation options if the the user title itself is disabled userTitleEnabledEl.on('change', function () { - var customOpts = components.get('groups/userTitleOption'); + const customOpts = components.get('groups/userTitleOption'); if (this.checked) { customOpts.removeAttr('disabled'); @@ -179,9 +179,9 @@ define('forum/groups/details', [ } }); - var cidSelector = categorySelector.init($('.member-post-cids-selector [component="category-selector"]'), { + const cidSelector = categorySelector.init($('.member-post-cids-selector [component="category-selector"]'), { onSelect: function (selectedCategory) { - var cids = ($('#memberPostCids').val() || '').split(',').map(cid => parseInt(cid, 10)); + let cids = ($('#memberPostCids').val() || '').split(',').map(cid => parseInt(cid, 10)); cids.push(selectedCategory.cid); cids = cids.filter((cid, index, array) => array.indexOf(cid) === index); $('#memberPostCids').val(cids.join(',')); @@ -191,11 +191,11 @@ define('forum/groups/details', [ }; Details.update = function () { - var settingsFormEl = components.get('groups/settings'); - var checkboxes = settingsFormEl.find('input[type="checkbox"][name]'); + const settingsFormEl = components.get('groups/settings'); + const checkboxes = settingsFormEl.find('input[type="checkbox"][name]'); if (settingsFormEl.length) { - var settings = settingsFormEl.serializeObject(); + const settings = settingsFormEl.serializeObject(); // serializeObject doesnt return array for multi selects if only one item is selected if (!Array.isArray(settings.memberPostCids)) { @@ -212,7 +212,7 @@ define('forum/groups/details', [ api.put(`/groups/${ajaxify.data.group.slug}`, settings).then(() => { if (settings.name) { - var pathname = window.location.pathname; + let pathname = window.location.pathname; pathname = pathname.substr(1, pathname.lastIndexOf('/')); ajaxify.go(pathname + slugify(settings.name)); } else { @@ -244,7 +244,7 @@ define('forum/groups/details', [ return; } - var searchInput = $('[component="groups/members/invite"]'); + const searchInput = $('[component="groups/members/invite"]'); require(['autocomplete'], function (autocomplete) { autocomplete.user(searchInput, function (event, selected) { socket.emit('groups.issueInvite', { @@ -260,7 +260,7 @@ define('forum/groups/details', [ }); $('[component="groups/members/bulk-invite-button"]').on('click', function () { - var usernames = $('[component="groups/members/bulk-invite"]').val(); + const usernames = $('[component="groups/members/bulk-invite"]').val(); if (!usernames) { return false; } diff --git a/public/src/client/groups/list.js b/public/src/client/groups/list.js index e0a8ed10d4..d7645668e9 100644 --- a/public/src/client/groups/list.js +++ b/public/src/client/groups/list.js @@ -3,7 +3,7 @@ define('forum/groups/list', [ 'forum/infinitescroll', 'benchpress', 'api', 'bootbox', ], function (infinitescroll, Benchpress, api, bootbox) { - var Groups = {}; + const Groups = {}; Groups.init = function () { infinitescroll.init(Groups.loadMoreGroups); @@ -20,7 +20,7 @@ define('forum/groups/list', [ } }); }); - var params = utils.params(); + const params = utils.params(); $('#search-sort').val(params.sort || 'alpha'); // Group searching @@ -58,9 +58,9 @@ define('forum/groups/list', [ }; Groups.search = function () { - var groupsEl = $('#groups-list'); - var queryEl = $('#search-text'); - var sortEl = $('#search-sort'); + const groupsEl = $('#groups-list'); + const queryEl = $('#search-text'); + const sortEl = $('#search-sort'); socket.emit('groups.search', { query: queryEl.val(), diff --git a/public/src/client/groups/memberlist.js b/public/src/client/groups/memberlist.js index 70863999e7..61f2c53334 100644 --- a/public/src/client/groups/memberlist.js +++ b/public/src/client/groups/memberlist.js @@ -1,10 +1,10 @@ 'use strict'; define('forum/groups/memberlist', ['api', 'bootbox'], function (api, bootbox) { - var MemberList = {}; - var searchInterval; - var groupName; - var templateName; + const MemberList = {}; + let searchInterval; + let groupName; + let templateName; MemberList.init = function (_templateName) { templateName = _templateName || 'groups/details'; @@ -18,14 +18,14 @@ define('forum/groups/memberlist', ['api', 'bootbox'], function (api, bootbox) { function handleMemberAdd() { $('[component="groups/members/add"]').on('click', function () { app.parseAndTranslate('admin/partials/groups/add-members', {}, function (html) { - var foundUsers = []; - var modal = bootbox.dialog({ + const foundUsers = []; + const modal = bootbox.dialog({ title: '[[groups:details.add-member]]', message: html, buttons: { ok: { callback: function () { - var users = []; + const users = []; modal.find('[data-uid][data-selected]').each(function (index, el) { users.push(foundUsers[$(el).attr('data-uid')]); }); @@ -37,7 +37,7 @@ define('forum/groups/memberlist', ['api', 'bootbox'], function (api, bootbox) { }, }); modal.on('click', '[data-username]', function () { - var isSelected = $(this).attr('data-selected') === '1'; + const isSelected = $(this).attr('data-selected') === '1'; if (isSelected) { $(this).removeAttr('data-selected'); } else { @@ -75,7 +75,7 @@ define('forum/groups/memberlist', ['api', 'bootbox'], function (api, bootbox) { }); callback(); } - var uids = users.map(function (user) { return user.uid; }); + const uids = users.map(function (user) { return user.uid; }); if (groupName === 'administrators') { socket.emit('admin.user.makeAdmins', uids, function (err) { if (err) { @@ -90,7 +90,7 @@ define('forum/groups/memberlist', ['api', 'bootbox'], function (api, bootbox) { function handleMemberSearch() { $('[component="groups/members/search"]').on('keyup', function () { - var query = $(this).val(); + const query = $(this).val(); if (searchInterval) { clearInterval(searchInterval); searchInterval = 0; @@ -112,8 +112,8 @@ define('forum/groups/memberlist', ['api', 'bootbox'], function (api, bootbox) { function handleMemberInfiniteScroll() { $('[component="groups/members"] tbody').on('scroll', function () { - var $this = $(this); - var bottom = ($this[0].scrollHeight - $this.innerHeight()) * 0.9; + const $this = $(this); + const bottom = ($this[0].scrollHeight - $this.innerHeight()) * 0.9; if ($this.scrollTop() > bottom && !$('[component="groups/members/search"]').val()) { loadMoreMembers(); @@ -122,7 +122,7 @@ define('forum/groups/memberlist', ['api', 'bootbox'], function (api, bootbox) { } function loadMoreMembers() { - var members = $('[component="groups/members"]'); + const members = $('[component="groups/members"]'); if (members.attr('loading')) { return; } diff --git a/public/src/client/header/chat.js b/public/src/client/header/chat.js index 188bd4386d..8f87e2c513 100644 --- a/public/src/client/header/chat.js +++ b/public/src/client/header/chat.js @@ -1,11 +1,11 @@ 'use strict'; define('forum/header/chat', ['components'], function (components) { - var chat = {}; + const chat = {}; chat.prepareDOM = function () { - var chatsToggleEl = components.get('chat/dropdown'); - var chatsListEl = components.get('chat/list'); + const chatsToggleEl = components.get('chat/dropdown'); + const chatsListEl = components.get('chat/list'); chatsToggleEl.on('click', function () { if (chatsToggleEl.parent().hasClass('open')) { diff --git a/public/src/client/header/notifications.js b/public/src/client/header/notifications.js index b30535f0fd..024cc5960f 100644 --- a/public/src/client/header/notifications.js +++ b/public/src/client/header/notifications.js @@ -1,12 +1,12 @@ 'use strict'; define('forum/header/notifications', ['components'], function (components) { - var notifications = {}; + const notifications = {}; notifications.prepareDOM = function () { - var notifContainer = components.get('notifications'); - var notifTrigger = notifContainer.children('a'); - var notifList = components.get('notifications/list'); + const notifContainer = components.get('notifications'); + const notifTrigger = notifContainer.children('a'); + const notifList = components.get('notifications/list'); notifTrigger.on('click', function (e) { e.preventDefault(); diff --git a/public/src/client/infinitescroll.js b/public/src/client/infinitescroll.js index c8aebb413e..e734cf455e 100644 --- a/public/src/client/infinitescroll.js +++ b/public/src/client/infinitescroll.js @@ -2,12 +2,12 @@ define('forum/infinitescroll', ['hooks'], function (hooks) { - var scroll = {}; - var callback; - var previousScrollTop = 0; - var loadingMore = false; - var container; - var scrollTimeout = 0; + const scroll = {}; + let callback; + let previousScrollTop = 0; + let loadingMore = false; + let container; + let scrollTimeout = 0; scroll.init = function (el, cb) { const $body = $('body'); @@ -37,20 +37,20 @@ define('forum/infinitescroll', ['hooks'], function (hooks) { } function onScroll() { - var bsEnv = utils.findBootstrapEnvironment(); - var mobileComposerOpen = (bsEnv === 'xs' || bsEnv === 'sm') && $('html').hasClass('composing'); + const bsEnv = utils.findBootstrapEnvironment(); + const mobileComposerOpen = (bsEnv === 'xs' || bsEnv === 'sm') && $('html').hasClass('composing'); if (loadingMore || mobileComposerOpen) { return; } - var currentScrollTop = $(window).scrollTop(); - var wh = $(window).height(); - var viewportHeight = container.height() - wh; - var offsetTop = container.offset() ? container.offset().top : 0; - var scrollPercent = 100 * (currentScrollTop - offsetTop) / (viewportHeight <= 0 ? wh : viewportHeight); + const currentScrollTop = $(window).scrollTop(); + const wh = $(window).height(); + const viewportHeight = container.height() - wh; + const offsetTop = container.offset() ? container.offset().top : 0; + const scrollPercent = 100 * (currentScrollTop - offsetTop) / (viewportHeight <= 0 ? wh : viewportHeight); - var top = 15; - var bottom = 85; - var direction = currentScrollTop > previousScrollTop ? 1 : -1; + const top = 15; + const bottom = 85; + const direction = currentScrollTop > previousScrollTop ? 1 : -1; if (scrollPercent < top && currentScrollTop < previousScrollTop) { callback(direction); @@ -69,7 +69,7 @@ define('forum/infinitescroll', ['hooks'], function (hooks) { } loadingMore = true; - var hookData = { method: method, data: data }; + const hookData = { method: method, data: data }; hooks.fire('action:infinitescroll.loadmore', hookData); socket.emit(hookData.method, hookData.data, function (err, data) { @@ -88,8 +88,8 @@ define('forum/infinitescroll', ['hooks'], function (hooks) { return; } loadingMore = true; - var url = config.relative_path + '/api' + location.pathname.replace(new RegExp('^' + config.relative_path), ''); - var hookData = { url: url, data: data }; + const url = config.relative_path + '/api' + location.pathname.replace(new RegExp('^' + config.relative_path), ''); + const hookData = { url: url, data: data }; hooks.fire('action:infinitescroll.loadmore.xhr', hookData); $.get(url, data, function (data) { @@ -107,10 +107,10 @@ define('forum/infinitescroll', ['hooks'], function (hooks) { return; } - var removeCount = els.length - count; + const removeCount = els.length - count; if (direction > 0) { - var height = $(document).height(); - var scrollTop = $(window).scrollTop(); + const height = $(document).height(); + const scrollTop = $(window).scrollTop(); els.slice(0, removeCount).remove(); diff --git a/public/src/client/ip-blacklist.js b/public/src/client/ip-blacklist.js index 1d5cd4a16f..624fe70ee5 100644 --- a/public/src/client/ip-blacklist.js +++ b/public/src/client/ip-blacklist.js @@ -2,10 +2,10 @@ define('forum/ip-blacklist', ['Chart', 'benchpress', 'bootbox'], function (Chart, Benchpress, bootbox) { - var Blacklist = {}; + const Blacklist = {}; Blacklist.init = function () { - var blacklist = $('#blacklist-rules'); + const blacklist = $('#blacklist-rules'); blacklist.on('keyup', function () { $('#blacklist-rules-holder').val(blacklist.val()); @@ -42,12 +42,12 @@ define('forum/ip-blacklist', ['Chart', 'benchpress', 'bootbox'], function (Chart }; Blacklist.setupAnalytics = function () { - var hourlyCanvas = document.getElementById('blacklist:hourly'); - var dailyCanvas = document.getElementById('blacklist:daily'); - var hourlyLabels = utils.getHoursArray().map(function (text, idx) { + const hourlyCanvas = document.getElementById('blacklist:hourly'); + const dailyCanvas = document.getElementById('blacklist:daily'); + const hourlyLabels = utils.getHoursArray().map(function (text, idx) { return idx % 3 ? '' : text; }); - var dailyLabels = utils.getDaysArray().slice(-7).map(function (text, idx) { + const dailyLabels = utils.getDaysArray().slice(-7).map(function (text, idx) { return idx % 3 ? '' : text; }); @@ -55,7 +55,7 @@ define('forum/ip-blacklist', ['Chart', 'benchpress', 'bootbox'], function (Chart Chart.defaults.global.tooltips.enabled = false; } - var data = { + const data = { 'blacklist:hourly': { labels: hourlyLabels, datasets: [ diff --git a/public/src/client/login.js b/public/src/client/login.js index b839c00efb..9b130a4939 100644 --- a/public/src/client/login.js +++ b/public/src/client/login.js @@ -2,14 +2,14 @@ define('forum/login', ['hooks', 'translator', 'jquery-form'], function (hooks, translator) { - var Login = { + const Login = { _capsState: false, }; Login.init = function () { - var errorEl = $('#login-error-notify'); - var submitEl = $('#login'); - var formEl = $('#login-form'); + const errorEl = $('#login-error-notify'); + const submitEl = $('#login'); + const formEl = $('#login-form'); submitEl.on('click', function (e) { e.preventDefault(); @@ -36,17 +36,17 @@ define('forum/login', ['hooks', 'translator', 'jquery-form'], function (hooks, t }, success: function (data) { hooks.fire('action:app.loggedIn', data); - var pathname = utils.urlToLocation(data.next).pathname; - var params = utils.params({ url: data.next }); + const pathname = utils.urlToLocation(data.next).pathname; + const params = utils.params({ url: data.next }); params.loggedin = true; delete params.register; // clear register message incase it exists - var qs = decodeURIComponent($.param(params)); + const qs = decodeURIComponent($.param(params)); window.location.href = pathname + '?' + qs; }, error: function (data) { - var message = data.responseText; - var errInfo = data.responseJSON; + let message = data.responseText; + const errInfo = data.responseJSON; if (data.status === 403 && data.responseText === 'Forbidden') { window.location.href = config.relative_path + '/login?error=csrf-invalid'; } else if (errInfo && errInfo.hasOwnProperty('banned_until')) { diff --git a/public/src/client/notifications.js b/public/src/client/notifications.js index 97e7bb3129..e13da8f707 100644 --- a/public/src/client/notifications.js +++ b/public/src/client/notifications.js @@ -2,12 +2,12 @@ define('forum/notifications', ['components'], function (components) { - var Notifications = {}; + const Notifications = {}; Notifications.init = function () { - var listEl = $('.notifications-list'); + const listEl = $('.notifications-list'); listEl.on('click', '[component="notifications/item/link"]', function () { - var nid = $(this).parents('[data-nid]').attr('data-nid'); + const nid = $(this).parents('[data-nid]').attr('data-nid'); socket.emit('notifications.markRead', nid, function (err) { if (err) { return app.alertError(err); diff --git a/public/src/client/pagination.js b/public/src/client/pagination.js index 69d0294573..8055708a90 100644 --- a/public/src/client/pagination.js +++ b/public/src/client/pagination.js @@ -2,7 +2,7 @@ define('forum/pagination', ['bootbox'], function (bootbox) { - var pagination = {}; + const pagination = {}; pagination.init = function () { $('body').on('click', '[component="pagination/select-page"]', function () { @@ -20,10 +20,10 @@ define('forum/pagination', ['bootbox'], function (bootbox) { return; } - var query = utils.params(); + const query = utils.params(); query.page = page; - var url = window.location.pathname + '?' + $.param(query); + const url = window.location.pathname + '?' + $.param(query); ajaxify.go(url, callback); }; diff --git a/public/src/client/popular.js b/public/src/client/popular.js index df9a656411..0ce846b784 100644 --- a/public/src/client/popular.js +++ b/public/src/client/popular.js @@ -2,7 +2,7 @@ define('forum/popular', ['topicList'], function (topicList) { - var Popular = {}; + const Popular = {}; Popular.init = function () { app.enterRoom('popular_topics'); diff --git a/public/src/client/post-queue.js b/public/src/client/post-queue.js index 6551fb031b..37934b0ea8 100644 --- a/public/src/client/post-queue.js +++ b/public/src/client/post-queue.js @@ -4,7 +4,7 @@ define('forum/post-queue', [ 'categoryFilter', 'categorySelector', 'api', ], function (categoryFilter, categorySelector, api) { - var PostQueue = {}; + const PostQueue = {}; PostQueue.init = function () { $('[data-toggle="tooltip"]').tooltip(); @@ -14,10 +14,10 @@ define('forum/post-queue', [ }); $('.posts-list').on('click', '[data-action]', function () { - var parent = $(this).parents('[data-id]'); - var action = $(this).attr('data-action'); - var id = parent.attr('data-id'); - var listContainer = parent.get(0).parentNode; + const parent = $(this).parents('[data-id]'); + const action = $(this).attr('data-action'); + const id = parent.attr('data-id'); + const listContainer = parent.get(0).parentNode; if (!['accept', 'reject'].some(function (valid) { return action === valid; @@ -42,8 +42,8 @@ define('forum/post-queue', [ handleContentEdit('.topic-title', '.topic-title-editable', 'input'); $('.posts-list').on('click', '.topic-category[data-editable]', function () { - var $this = $(this); - var id = $this.parents('[data-id]').attr('data-id'); + const $this = $(this); + const id = $this.parents('[data-id]').attr('data-id'); categorySelector.modal({ onSubmit: function (selectedCategory) { Promise.all([ @@ -53,7 +53,7 @@ define('forum/post-queue', [ cid: selectedCategory.cid, }), ]).then(function (result) { - var category = result[0]; + const category = result[0]; app.parseAndTranslate('post-queue', 'posts', { posts: [{ category: category, @@ -79,8 +79,8 @@ define('forum/post-queue', [ function handleContentEdit(displayClass, editableClass, inputSelector) { $('.posts-list').on('click', displayClass, function () { - var el = $(this); - var inputEl = el.parent().find(editableClass); + const el = $(this); + const inputEl = el.parent().find(editableClass); if (inputEl.length) { el.addClass('hidden'); inputEl.removeClass('hidden').find(inputSelector).focus(); @@ -88,10 +88,10 @@ define('forum/post-queue', [ }); $('.posts-list').on('blur', editableClass + ' ' + inputSelector, function () { - var textarea = $(this); - var preview = textarea.parent().parent().find(displayClass); - var id = textarea.parents('[data-id]').attr('data-id'); - var titleEdit = displayClass === '.topic-title'; + const textarea = $(this); + const preview = textarea.parent().parent().find(displayClass); + const id = textarea.parents('[data-id]').attr('data-id'); + const titleEdit = displayClass === '.topic-title'; socket.emit('posts.editQueuedContent', { id: id, diff --git a/public/src/client/recent.js b/public/src/client/recent.js index 93e3593039..e54415d814 100644 --- a/public/src/client/recent.js +++ b/public/src/client/recent.js @@ -1,7 +1,7 @@ 'use strict'; define('forum/recent', ['topicList'], function (topicList) { - var Recent = {}; + const Recent = {}; Recent.init = function () { app.enterRoom('recent_topics'); diff --git a/public/src/client/register.js b/public/src/client/register.js index e0bf74b86a..758f402feb 100644 --- a/public/src/client/register.js +++ b/public/src/client/register.js @@ -4,21 +4,21 @@ define('forum/register', [ 'translator', 'zxcvbn', 'slugify', 'api', 'bootbox', 'forum/login', 'jquery-form', ], function (translator, zxcvbn, slugify, api, bootbox, Login) { - var Register = {}; - var validationError = false; - var successIcon = ''; + const Register = {}; + let validationError = false; + const successIcon = ''; Register.init = function () { - var username = $('#username'); - var password = $('#password'); - var password_confirm = $('#password-confirm'); - var register = $('#register'); + const username = $('#username'); + const password = $('#password'); + const password_confirm = $('#password-confirm'); + const register = $('#register'); handleLanguageOverride(); $('#content #noscript').val('false'); - var query = utils.params(); + const query = utils.params(); if (query.token) { $('#token').val(query.token); } @@ -57,8 +57,8 @@ define('forum/register', [ Login.capsLockCheck(document.querySelector('#password'), document.querySelector('#caps-lock-warning')); register.on('click', function (e) { - var registerBtn = $(this); - var errorEl = $('#register-error-notify'); + const registerBtn = $(this); + const errorEl = $('#register-error-notify'); errorEl.addClass('hidden'); e.preventDefault(); validateForm(function () { @@ -78,11 +78,11 @@ define('forum/register', [ return; } if (data.next) { - var pathname = utils.urlToLocation(data.next).pathname; + const pathname = utils.urlToLocation(data.next).pathname; - var params = utils.params({ url: data.next }); + const params = utils.params({ url: data.next }); params.registered = true; - var qs = decodeURIComponent($.param(params)); + const qs = decodeURIComponent($.param(params)); window.location.href = pathname + '?' + qs; } else if (data.message) { @@ -114,8 +114,8 @@ define('forum/register', [ function validateUsername(username, callback) { callback = callback || function () {}; - var username_notify = $('#username-notify'); - var userslug = slugify(username); + const username_notify = $('#username-notify'); + const userslug = slugify(username); if (username.length < ajaxify.data.minimumUsernameLength || userslug.length < ajaxify.data.minimumUsernameLength) { showError(username_notify, '[[error:username-too-short]]'); } else if (username.length > ajaxify.data.maximumUsernameLength) { @@ -139,9 +139,9 @@ define('forum/register', [ } function validatePassword(password, password_confirm) { - var password_notify = $('#password-notify'); - var password_confirm_notify = $('#password-confirm-notify'); - var passwordStrength = zxcvbn(password); + const password_notify = $('#password-notify'); + const password_confirm_notify = $('#password-confirm-notify'); + const passwordStrength = zxcvbn(password); if (password.length < ajaxify.data.minimumPasswordLength) { showError(password_notify, '[[reset_password:password_too_short]]'); @@ -163,8 +163,8 @@ define('forum/register', [ } function validatePasswordConfirm(password, password_confirm) { - var password_notify = $('#password-notify'); - var password_confirm_notify = $('#password-confirm-notify'); + const password_notify = $('#password-notify'); + const password_confirm_notify = $('#password-confirm-notify'); if (!password || password_notify.hasClass('alert-error')) { return; @@ -200,8 +200,8 @@ define('forum/register', [ function handleLanguageOverride() { if (!app.user.uid && config.defaultLang !== config.userLang) { - var formEl = $('[component="register/local"]'); - var langEl = $(''); + const formEl = $('[component="register/local"]'); + const langEl = $(''); formEl.append(langEl); } diff --git a/public/src/client/reset.js b/public/src/client/reset.js index 06bda6307a..0c2f4d6066 100644 --- a/public/src/client/reset.js +++ b/public/src/client/reset.js @@ -2,12 +2,12 @@ define('forum/reset', function () { - var ResetPassword = {}; + const ResetPassword = {}; ResetPassword.init = function () { - var inputEl = $('#email'); - var errorEl = $('#error'); - var successEl = $('#success'); + const inputEl = $('#email'); + const errorEl = $('#error'); + const successEl = $('#success'); $('#reset').on('click', function () { if (inputEl.val() && inputEl.val().indexOf('@') !== -1) { diff --git a/public/src/client/reset_code.js b/public/src/client/reset_code.js index 5a27b16978..16333e8c3f 100644 --- a/public/src/client/reset_code.js +++ b/public/src/client/reset_code.js @@ -2,17 +2,17 @@ define('forum/reset_code', ['zxcvbn'], function (zxcvbn) { - var ResetCode = {}; + const ResetCode = {}; ResetCode.init = function () { - var reset_code = ajaxify.data.code; + const reset_code = ajaxify.data.code; - var resetEl = $('#reset'); - var password = $('#password'); - var repeat = $('#repeat'); + const resetEl = $('#reset'); + const password = $('#password'); + const repeat = $('#repeat'); resetEl.on('click', function () { - var strength = zxcvbn(password.val()); + const strength = zxcvbn(password.val()); if (password.val().length < ajaxify.data.minimumPasswordLength) { $('#notice').removeClass('hidden'); $('#notice strong').translateText('[[reset_password:password_too_short]]'); diff --git a/public/src/client/search.js b/public/src/client/search.js index 9412acc6d8..ac0d1ccfb1 100644 --- a/public/src/client/search.js +++ b/public/src/client/search.js @@ -7,12 +7,12 @@ define('forum/search', [ 'storage', 'hooks', ], function (searchModule, autocomplete, storage, hooks) { - var Search = {}; + const Search = {}; Search.init = function () { - var searchQuery = $('#results').attr('data-search-query'); + const searchQuery = $('#results').attr('data-search-query'); - var searchIn = $('#search-in'); + const searchIn = $('#search-in'); searchIn.on('change', function () { updateFormItemVisiblity(searchIn.val()); @@ -36,8 +36,8 @@ define('forum/search', [ }; function getSearchDataFromDOM() { - var form = $('#advanced-search'); - var searchData = { + const form = $('#advanced-search'); + const searchData = { in: $('#search-in').val(), }; searchData.term = $('#search-input').val(); @@ -65,17 +65,17 @@ define('forum/search', [ } function updateFormItemVisiblity(searchIn) { - var hide = searchIn.indexOf('posts') === -1 && searchIn.indexOf('titles') === -1; + const hide = searchIn.indexOf('posts') === -1 && searchIn.indexOf('titles') === -1; $('.post-search-item').toggleClass('hide', hide); } function fillOutForm() { - var params = utils.params({ + const params = utils.params({ disableToType: true, }); - var searchData = searchModule.getSearchPreferences(); - var formData = utils.merge(searchData, params); + const searchData = searchModule.getSearchPreferences(); + const formData = utils.merge(searchData, params); if (formData) { if (ajaxify.data.term) { @@ -127,8 +127,8 @@ define('forum/search', [ $('#post-sort-direction').val(formData.sortDirection || 'desc'); if (formData.showAs) { - var isTopic = formData.showAs === 'topics'; - var isPost = formData.showAs === 'posts'; + const isTopic = formData.showAs === 'topics'; + const isPost = formData.showAs === 'posts'; $('#show-as-topics').prop('checked', isTopic).parent().toggleClass('active', isTopic); $('#show-as-posts').prop('checked', isPost).parent().toggleClass('active', isPost); } @@ -148,7 +148,7 @@ define('forum/search', [ $('#clear-preferences').on('click', function () { storage.removeItem('search-preferences'); - var query = $('#search-input').val(); + const query = $('#search-input').val(); $('#advanced-search')[0].reset(); $('#search-input').val(query); app.alertSuccess('[[search:search-preferences-cleared]]'); @@ -157,7 +157,7 @@ define('forum/search', [ } function enableAutoComplete() { - var userEl = $('#posted-by-user'); + const userEl = $('#posted-by-user'); userEl.tagsinput({ confirmKeys: [13, 44], trimValue: true, @@ -166,7 +166,7 @@ define('forum/search', [ autocomplete.user(userEl.siblings('.bootstrap-tagsinput').find('input')); } - var tagEl = $('#has-tags'); + const tagEl = $('#has-tags'); tagEl.tagsinput({ confirmKeys: [13, 44], trimValue: true, diff --git a/public/src/client/tag.js b/public/src/client/tag.js index ce45a94aae..4d4a048a2c 100644 --- a/public/src/client/tag.js +++ b/public/src/client/tag.js @@ -1,7 +1,7 @@ 'use strict'; define('forum/tag', ['topicList', 'forum/infinitescroll'], function (topicList) { - var Tag = {}; + const Tag = {}; Tag.init = function () { app.enterRoom('tags'); diff --git a/public/src/client/tags.js b/public/src/client/tags.js index bde065269e..b5f88d05b0 100644 --- a/public/src/client/tags.js +++ b/public/src/client/tags.js @@ -2,7 +2,7 @@ define('forum/tags', ['forum/infinitescroll'], function (infinitescroll) { - var Tags = {}; + const Tags = {}; Tags.init = function () { app.enterRoom('tags'); diff --git a/public/src/client/top.js b/public/src/client/top.js index 9ad2e7b886..b2eb44e99f 100644 --- a/public/src/client/top.js +++ b/public/src/client/top.js @@ -1,7 +1,7 @@ 'use strict'; define('forum/top', ['topicList'], function (topicList) { - var Top = {}; + const Top = {}; Top.init = function () { app.enterRoom('top_topics'); diff --git a/public/src/client/topic.js b/public/src/client/topic.js index adf46848e5..edba451ae9 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -18,8 +18,8 @@ define('forum/topic', [ events, posts, images, navigator, sort, components, storage, hooks ) { - var Topic = {}; - var currentUrl = ''; + const Topic = {}; + let currentUrl = ''; $(window).on('action:ajaxify.start', function (ev, data) { if (Topic.replaceURLTimeout) { @@ -42,7 +42,7 @@ define('forum/topic', [ }); Topic.init = function () { - var tid = ajaxify.data.tid; + const tid = ajaxify.data.tid; currentUrl = ajaxify.currentPage; hooks.fire('action:topic.loading'); @@ -95,8 +95,8 @@ define('forum/topic', [ if (config.topicSearchEnabled) { require(['mousetrap'], function (mousetrap) { mousetrap.bind(['command+f', 'ctrl+f'], function (e) { - var match = ajaxify.currentPage.match(/^topic\/([\d]+)/); - var tid; + const match = ajaxify.currentPage.match(/^topic\/([\d]+)/); + let tid; if (match) { e.preventDefault(); tid = match[1]; @@ -124,13 +124,13 @@ define('forum/topic', [ function handleBookmark(tid) { if (window.location.hash) { - var el = $(utils.escapeHTML(window.location.hash)); + const el = $(utils.escapeHTML(window.location.hash)); if (el.length) { return navigator.scrollToElement(el, true, 0); } } - var bookmark = ajaxify.data.bookmark || storage.getItem('topic:' + tid + ':bookmark'); - var postIndex = ajaxify.data.postIndex; + const bookmark = ajaxify.data.bookmark || storage.getItem('topic:' + tid + ':bookmark'); + const postIndex = ajaxify.data.postIndex; if (postIndex > 1) { if (components.get('post/anchor', postIndex - 1).length) { @@ -160,19 +160,19 @@ define('forum/topic', [ function addBlockQuoteHandler() { components.get('topic').on('click', 'blockquote .toggle', function () { - var blockQuote = $(this).parent('blockquote'); - var toggle = $(this); + const blockQuote = $(this).parent('blockquote'); + const toggle = $(this); blockQuote.toggleClass('uncollapsed'); - var collapsed = !blockQuote.hasClass('uncollapsed'); + const collapsed = !blockQuote.hasClass('uncollapsed'); toggle.toggleClass('fa-angle-down', collapsed).toggleClass('fa-angle-up', !collapsed); }); } function addParentHandler() { components.get('topic').on('click', '[component="post/parent"]', function (e) { - var toPid = $(this).attr('data-topid'); + const toPid = $(this).attr('data-topid'); - var toPost = $('[component="topic"]>[component="post"][data-pid="' + toPid + '"]'); + const toPost = $('[component="topic"]>[component="post"][data-pid="' + toPid + '"]'); if (toPost.length) { e.preventDefault(); navigator.scrollToIndex(toPost.attr('data-index'), true); @@ -183,18 +183,18 @@ define('forum/topic', [ function addDropupHandler() { // Locate all dropdowns - var target = $('#content .dropdown-menu').parent(); + const target = $('#content .dropdown-menu').parent(); // Toggle dropup if past 50% of screen $(target).on('show.bs.dropdown', function () { - var dropUp = this.getBoundingClientRect().top > ($(window).height() / 2); + const dropUp = this.getBoundingClientRect().top > ($(window).height() / 2); $(this).toggleClass('dropup', dropUp); }); } function addRepliesHandler() { $('[component="topic"]').on('click', '[component="post/reply-count"]', function () { - var btn = $(this); + const btn = $(this); require(['forum/topic/replies'], function (replies) { replies.init(btn); }); @@ -202,7 +202,7 @@ define('forum/topic', [ } function updateTopicTitle() { - var span = components.get('navbar/title').find('span'); + const span = components.get('navbar/title').find('span'); if ($(window).scrollTop() > 50 && span.hasClass('hidden')) { span.html(ajaxify.data.title).removeClass('hidden'); } else if ($(window).scrollTop() <= 50 && !span.hasClass('hidden')) { @@ -214,7 +214,7 @@ define('forum/topic', [ } Topic.navigatorCallback = function (index, elementCount) { - var path = ajaxify.removeRelativePath(window.location.pathname.slice(1)); + const path = ajaxify.removeRelativePath(window.location.pathname.slice(1)); if (!path.startsWith('topic')) { return; } @@ -223,7 +223,7 @@ define('forum/topic', [ return; } - var newUrl = 'topic/' + ajaxify.data.slug + (index > 1 ? ('/' + index) : ''); + const newUrl = 'topic/' + ajaxify.data.slug + (index > 1 ? ('/' + index) : ''); if (newUrl !== currentUrl) { if (Topic.replaceURLTimeout) { clearTimeout(Topic.replaceURLTimeout); @@ -239,7 +239,7 @@ define('forum/topic', [ Topic.replaceURLTimeout = 0; if (ajaxify.data.updateUrlWithPostIndex && history.replaceState) { - var search = window.location.search || ''; + let search = window.location.search || ''; if (!config.usePagination) { search = (search && !/^\?page=\d+$/.test(search) ? search : ''); } @@ -253,8 +253,8 @@ define('forum/topic', [ }; function updateUserBookmark(index) { - var bookmarkKey = 'topic:' + ajaxify.data.tid + ':bookmark'; - var currentBookmark = ajaxify.data.bookmark || storage.getItem(bookmarkKey); + const bookmarkKey = 'topic:' + ajaxify.data.tid + ':bookmark'; + const currentBookmark = ajaxify.data.bookmark || storage.getItem(bookmarkKey); if (config.topicPostSort === 'newest_to_oldest') { index = Math.max(1, ajaxify.data.postcount - index + 2); } diff --git a/public/src/client/topic/change-owner.js b/public/src/client/topic/change-owner.js index 04fda698f5..f11a75099c 100644 --- a/public/src/client/topic/change-owner.js +++ b/public/src/client/topic/change-owner.js @@ -6,11 +6,11 @@ define('forum/topic/change-owner', [ 'postSelect', 'autocomplete', ], function (components, postSelect, autocomplete) { - var ChangeOwner = {}; + const ChangeOwner = {}; - var modal; - var commit; - var toUid = 0; + let modal; + let commit; + let toUid = 0; ChangeOwner.init = function (postEl) { if (modal) { return; diff --git a/public/src/client/topic/delete-posts.js b/public/src/client/topic/delete-posts.js index 76cd4ed9c2..b08697c18a 100644 --- a/public/src/client/topic/delete-posts.js +++ b/public/src/client/topic/delete-posts.js @@ -2,11 +2,11 @@ define('forum/topic/delete-posts', ['components', 'postSelect'], function (components, postSelect) { - var DeletePosts = {}; - var modal; - var deleteBtn; - var purgeBtn; - var tid; + const DeletePosts = {}; + let modal; + let deleteBtn; + let purgeBtn; + let tid; DeletePosts.init = function () { tid = ajaxify.data.tid; diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index e3ae6d82f1..fe08787232 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -12,9 +12,9 @@ define('forum/topic/events', [ 'benchpress', 'hooks', ], function (postTools, threadTools, posts, images, components, translator, Benchpress, hooks) { - var Events = {}; + const Events = {}; - var events = { + const events = { 'event:user_status_change': onUserStatusChange, 'event:voted': updatePostVotesAndUserReputation, 'event:bookmarked': updateBookmarkCount, @@ -50,7 +50,7 @@ define('forum/topic/events', [ Events.init = function () { Events.removeListeners(); - for (var eventName in events) { + for (const eventName in events) { if (events.hasOwnProperty(eventName)) { socket.on(eventName, events[eventName]); } @@ -58,7 +58,7 @@ define('forum/topic/events', [ }; Events.removeListeners = function () { - for (var eventName in events) { + for (const eventName in events) { if (events.hasOwnProperty(eventName)) { socket.removeListener(eventName, events[eventName]); } @@ -70,10 +70,10 @@ define('forum/topic/events', [ } function updatePostVotesAndUserReputation(data) { - var votes = $('[data-pid="' + data.post.pid + '"] [component="post/vote-count"]').filter(function (index, el) { + const votes = $('[data-pid="' + data.post.pid + '"] [component="post/vote-count"]').filter(function (index, el) { return parseInt($(el).closest('[data-pid]').attr('data-pid'), 10) === parseInt(data.post.pid, 10); }); - var reputationElements = $('.reputation[data-uid="' + data.post.uid + '"]'); + const reputationElements = $('.reputation[data-uid="' + data.post.uid + '"]'); votes.html(data.post.votes).attr('data-votes', data.post.votes); reputationElements.html(data.user.reputation).attr('data-reputation', data.user.reputation); } @@ -104,16 +104,16 @@ define('forum/topic/events', [ if (!data || !data.post || parseInt(data.post.tid, 10) !== parseInt(ajaxify.data.tid, 10)) { return; } - var editedPostEl = components.get('post/content', data.post.pid).filter(function (index, el) { + const editedPostEl = components.get('post/content', data.post.pid).filter(function (index, el) { return parseInt($(el).closest('[data-pid]').attr('data-pid'), 10) === parseInt(data.post.pid, 10); }); - var editorEl = $('[data-pid="' + data.post.pid + '"] [component="post/editor"]').filter(function (index, el) { + const editorEl = $('[data-pid="' + data.post.pid + '"] [component="post/editor"]').filter(function (index, el) { return parseInt($(el).closest('[data-pid]').attr('data-pid'), 10) === parseInt(data.post.pid, 10); }); - var topicTitle = components.get('topic/title'); - var navbarTitle = components.get('navbar/title').find('span'); - var breadCrumb = components.get('breadcrumb/current'); + const topicTitle = components.get('topic/title'); + const navbarTitle = components.get('navbar/title').find('span'); + const breadCrumb = components.get('breadcrumb/current'); if (data.topic.rescheduled) { return ajaxify.go('topic/' + data.topic.slug, null, true); @@ -121,7 +121,7 @@ define('forum/topic/events', [ if (topicTitle.length && data.topic.title && data.topic.renamed) { ajaxify.data.title = data.topic.title; - var newUrl = 'topic/' + data.topic.slug + (window.location.search ? window.location.search : ''); + const newUrl = 'topic/' + data.topic.slug + (window.location.search ? window.location.search : ''); history.replaceState({ url: newUrl }, null, window.location.protocol + '//' + window.location.host + config.relative_path + '/' + newUrl); topicTitle.fadeOut(250, function () { @@ -143,7 +143,7 @@ define('forum/topic/events', [ posts.addBlockquoteEllipses(editedPostEl.parent()); editedPostEl.fadeIn(250); - var editData = { + const editData = { editor: data.editor, editedISO: utils.toISOString(data.post.edited), }; @@ -160,7 +160,7 @@ define('forum/topic/events', [ if (data.topic.tags && tagsUpdated(data.topic.tags)) { Benchpress.render('partials/topic/tags', { tags: data.topic.tags }).then(function (html) { - var tags = $('.tags'); + const tags = $('.tags'); tags.fadeOut(250, function () { tags.html(html).fadeIn(250); @@ -176,7 +176,7 @@ define('forum/topic/events', [ return true; } - for (var i = 0; i < tags.length; i += 1) { + for (let i = 0; i < tags.length; i += 1) { if (!$('.tags .tag-item[data-tag="' + tags[i].value + '"]').length) { return true; } @@ -200,14 +200,14 @@ define('forum/topic/events', [ } function togglePostDeleteState(data) { - var postEl = components.get('post', 'pid', data.pid); + const postEl = components.get('post', 'pid', data.pid); if (!postEl.length) { return; } postEl.toggleClass('deleted'); - var isDeleted = postEl.hasClass('deleted'); + const isDeleted = postEl.hasClass('deleted'); postTools.toggle(data.pid, isDeleted); if (!ajaxify.data.privileges.isAdminOrMod && parseInt(data.uid, 10) !== parseInt(app.user.uid, 10)) { @@ -221,7 +221,7 @@ define('forum/topic/events', [ } function togglePostBookmark(data) { - var el = $('[data-pid="' + data.post.pid + '"] [component="post/bookmark"]').filter(function (index, el) { + const el = $('[data-pid="' + data.post.pid + '"] [component="post/bookmark"]').filter(function (index, el) { return parseInt($(el).closest('[data-pid]').attr('data-pid'), 10) === parseInt(data.post.pid, 10); }); if (!el.length) { @@ -235,7 +235,7 @@ define('forum/topic/events', [ } function togglePostVote(data) { - var post = $('[data-pid="' + data.post.pid + '"]'); + const post = $('[data-pid="' + data.post.pid + '"]'); post.find('[component="post/upvote"]').filter(function (index, el) { return parseInt($(el).closest('[data-pid]').attr('data-pid'), 10) === parseInt(data.post.pid, 10); }).toggleClass('upvoted', data.upvote); @@ -245,7 +245,7 @@ define('forum/topic/events', [ } function onNewNotification(data) { - var tid = ajaxify.data.tid; + const tid = ajaxify.data.tid; if (data && data.tid && parseInt(data.tid, 10) === parseInt(tid, 10)) { socket.emit('topics.markTopicNotificationsRead', [tid]); } diff --git a/public/src/client/topic/fork.js b/public/src/client/topic/fork.js index 3b540e58e7..ba4e220d2c 100644 --- a/public/src/client/topic/fork.js +++ b/public/src/client/topic/fork.js @@ -2,10 +2,10 @@ define('forum/topic/fork', ['components', 'postSelect'], function (components, postSelect) { - var Fork = {}; - var forkModal; - var forkCommit; - var fromTid; + const Fork = {}; + let forkModal; + let forkCommit; + let fromTid; Fork.init = function () { fromTid = ajaxify.data.tid; diff --git a/public/src/client/topic/images.js b/public/src/client/topic/images.js index c1dc5866db..a04b22a9e9 100644 --- a/public/src/client/topic/images.js +++ b/public/src/client/topic/images.js @@ -2,14 +2,14 @@ define('forum/topic/images', [], function () { - var Images = {}; + const Images = {}; Images.wrapImagesInLinks = function (posts) { posts.find('[component="post/content"] img:not(.emoji)').each(function () { - var $this = $(this); - var src = $this.attr('src') || ''; - var alt = $this.attr('alt') || ''; - var suffixRegex = /-resized(\.[\w]+)?$/; + const $this = $(this); + let src = $this.attr('src') || ''; + const alt = $this.attr('alt') || ''; + const suffixRegex = /-resized(\.[\w]+)?$/; if (src === 'about:blank') { return; @@ -18,9 +18,9 @@ define('forum/topic/images', [], function () { if (utils.isRelativeUrl(src) && suffixRegex.test(src)) { src = src.replace(suffixRegex, '$1'); } - var srcExt = src.split('.').slice(1).pop(); - var altFilename = alt.split('/').pop(); - var altExt = altFilename.split('.').slice(1).pop(); + const srcExt = src.split('.').slice(1).pop(); + const altFilename = alt.split('/').pop(); + const altExt = altFilename.split('.').slice(1).pop(); if (!$this.parent().is('a')) { $this.wrap(' 1) { message = '[[topic:topic_move_multiple_success, ' + selectedCategory.name + ']]'; } else if (!Move.tids) { message = '[[topic:topic_move_all_success, ' + selectedCategory.name + ']]'; } - var data = { + const data = { tids: Move.tids ? Move.tids.slice() : null, cid: selectedCategory.cid, currentCid: Move.currentCid, diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 793153325c..5d259257df 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -11,9 +11,9 @@ define('forum/topic/postTools', [ 'bootbox', 'hooks', ], function (share, navigator, components, translator, votes, api, bootbox, hooks) { - var PostTools = {}; + const PostTools = {}; - var staleReplyAnyway = false; + let staleReplyAnyway = false; PostTools.init = function (tid) { staleReplyAnyway = false; @@ -31,14 +31,14 @@ define('forum/topic/postTools', [ function renderMenu() { $('[component="topic"]').on('show.bs.dropdown', '.moderator-tools', function () { - var $this = $(this); - var dropdownMenu = $this.find('.dropdown-menu'); + const $this = $(this); + const dropdownMenu = $this.find('.dropdown-menu'); if (dropdownMenu.html()) { return; } - var postEl = $this.parents('[data-pid]'); - var pid = postEl.attr('data-pid'); - var index = parseInt(postEl.attr('data-index'), 10); + const postEl = $this.parents('[data-pid]'); + const pid = postEl.attr('data-pid'); + const index = parseInt(postEl.attr('data-index'), 10); socket.emit('posts.loadPostTools', { pid: pid, cid: ajaxify.data.cid }, function (err, data) { if (err) { @@ -58,7 +58,7 @@ define('forum/topic/postTools', [ } PostTools.toggle = function (pid, isDeleted) { - var postEl = components.get('post', 'pid', pid); + const postEl = components.get('post', 'pid', pid); postEl.find('[component="post/quote"], [component="post/bookmark"], [component="post/reply"], [component="post/flag"], [component="user/chat"]') .toggleClass('hidden', isDeleted); @@ -75,14 +75,14 @@ define('forum/topic/postTools', [ }; PostTools.updatePostCount = function (postCount) { - var postCountEl = components.get('topic/post-count'); + const postCountEl = components.get('topic/post-count'); postCountEl.html(postCount).attr('title', postCount); utils.makeNumbersHumanReadable(postCountEl); navigator.setCount(postCount); }; function addPostHandlers(tid) { - var postContainer = components.get('topic'); + const postContainer = components.get('topic'); postContainer.on('click', '[component="post/quote"]', function () { onQuoteClicked($(this), tid); @@ -123,7 +123,7 @@ define('forum/topic/postTools', [ }); postContainer.on('click', '[component="post/flag"]', function () { - var pid = getData($(this), 'data-pid'); + const pid = getData($(this), 'data-pid'); require(['flags'], function (flags) { flags.showFlagModal({ type: 'post', @@ -133,7 +133,7 @@ define('forum/topic/postTools', [ }); postContainer.on('click', '[component="post/flagUser"]', function () { - var uid = getData($(this), 'data-uid'); + const uid = getData($(this), 'data-uid'); require(['flags'], function (flags) { flags.showFlagModal({ type: 'user', @@ -143,17 +143,17 @@ define('forum/topic/postTools', [ }); postContainer.on('click', '[component="post/flagResolve"]', function () { - var flagId = $(this).attr('data-flagId'); + const flagId = $(this).attr('data-flagId'); require(['flags'], function (flags) { flags.resolve(flagId); }); }); postContainer.on('click', '[component="post/edit"]', function () { - var btn = $(this); + const btn = $(this); - var timestamp = parseInt(getData(btn, 'data-timestamp'), 10); - var postEditDuration = parseInt(ajaxify.data.postEditDuration, 10); + const timestamp = parseInt(getData(btn, 'data-timestamp'), 10); + const postEditDuration = parseInt(ajaxify.data.postEditDuration, 10); if (checkDuration(postEditDuration, timestamp, 'post-edit-duration-expired')) { hooks.fire('action:composer.post.edit', { @@ -164,7 +164,7 @@ define('forum/topic/postTools', [ if (config.enablePostHistory && ajaxify.data.privileges['posts:history']) { postContainer.on('click', '[component="post/view-history"], [component="post/edit-indicator"]', function () { - var btn = $(this); + const btn = $(this); require(['forum/topic/diffs'], function (diffs) { diffs.open(getData(btn, 'data-pid')); }); @@ -172,9 +172,9 @@ define('forum/topic/postTools', [ } postContainer.on('click', '[component="post/delete"]', function () { - var btn = $(this); - var timestamp = parseInt(getData(btn, 'data-timestamp'), 10); - var postDeleteDuration = parseInt(ajaxify.data.postDeleteDuration, 10); + const btn = $(this); + const timestamp = parseInt(getData(btn, 'data-timestamp'), 10); + const postDeleteDuration = parseInt(ajaxify.data.postDeleteDuration, 10); if (checkDuration(postDeleteDuration, timestamp, 'post-delete-duration-expired')) { togglePostDelete($(this)); } @@ -182,11 +182,11 @@ define('forum/topic/postTools', [ function checkDuration(duration, postTimestamp, languageKey) { if (!ajaxify.data.privileges.isAdminOrMod && duration && Date.now() - postTimestamp > duration * 1000) { - var numDays = Math.floor(duration / 86400); - var numHours = Math.floor((duration % 86400) / 3600); - var numMinutes = Math.floor(((duration % 86400) % 3600) / 60); - var numSeconds = ((duration % 86400) % 3600) % 60; - var msg = '[[error:' + languageKey + ', ' + duration + ']]'; + const numDays = Math.floor(duration / 86400); + const numHours = Math.floor((duration % 86400) / 3600); + const numMinutes = Math.floor(((duration % 86400) % 3600) / 60); + const numSeconds = ((duration % 86400) % 3600) % 60; + let msg = '[[error:' + languageKey + ', ' + duration + ']]'; if (numDays) { if (numHours) { msg = '[[error:' + languageKey + '-days-hours, ' + numDays + ', ' + numHours + ']]'; @@ -221,21 +221,21 @@ define('forum/topic/postTools', [ }); postContainer.on('click', '[component="post/move"]', function () { - var btn = $(this); + const btn = $(this); require(['forum/topic/move-post'], function (movePost) { movePost.init(btn.parents('[data-pid]')); }); }); postContainer.on('click', '[component="post/change-owner"]', function () { - var btn = $(this); + const btn = $(this); require(['forum/topic/change-owner'], function (changeOwner) { changeOwner.init(btn.parents('[data-pid]')); }); }); postContainer.on('click', '[component="post/ban-ip"]', function () { - var ip = $(this).attr('data-ip'); + const ip = $(this).attr('data-ip'); socket.emit('blacklist.addRule', ip, function (err) { if (err) { return app.alertError(err.message); @@ -250,16 +250,16 @@ define('forum/topic/postTools', [ } function onReplyClicked(button, tid) { - var selectedNode = getSelectedNode(); + const selectedNode = getSelectedNode(); showStaleWarning(function () { - var username = getUserSlug(button); + let username = getUserSlug(button); if (getData(button, 'data-uid') === '0' || !getData(button, 'data-userslug')) { username = ''; } - var toPid = button.is('[component="post/reply"]') ? getData(button, 'data-pid') : null; - var isQuoteToPid = !toPid || !selectedNode.pid || toPid === selectedNode.pid; + const toPid = button.is('[component="post/reply"]') ? getData(button, 'data-pid') : null; + const isQuoteToPid = !toPid || !selectedNode.pid || toPid === selectedNode.pid; if (selectedNode.text && isQuoteToPid) { username = username || selectedNode.username; @@ -283,11 +283,11 @@ define('forum/topic/postTools', [ } function onQuoteClicked(button, tid) { - var selectedNode = getSelectedNode(); + const selectedNode = getSelectedNode(); showStaleWarning(function () { - var username = getUserSlug(button); - var toPid = getData(button, 'data-pid'); + const username = getUserSlug(button); + const toPid = getData(button, 'data-pid'); function quote(text) { hooks.fire('action:composer.addQuote', { @@ -313,12 +313,12 @@ define('forum/topic/postTools', [ } function getSelectedNode() { - var selectedText = ''; - var selectedPid; - var username = ''; - var selection = window.getSelection ? window.getSelection() : document.selection.createRange(); - var postContents = $('[component="post"] [component="post/content"]'); - var content; + let selectedText = ''; + let selectedPid; + let username = ''; + const selection = window.getSelection ? window.getSelection() : document.selection.createRange(); + const postContents = $('[component="post"] [component="post/content"]'); + let content; postContents.each(function (index, el) { if (selection && selection.containsNode && el && selection.containsNode(el, true)) { content = el; @@ -326,9 +326,9 @@ define('forum/topic/postTools', [ }); if (content) { - var bounds = document.createRange(); + const bounds = document.createRange(); bounds.selectNodeContents(content); - var range = selection.getRangeAt(0).cloneRange(); + const range = selection.getRangeAt(0).cloneRange(); if (range.compareBoundaryPoints(Range.START_TO_START, bounds) < 0) { range.setStart(bounds.startContainer, bounds.startOffset); } @@ -337,7 +337,7 @@ define('forum/topic/postTools', [ } bounds.detach(); selectedText = range.toString(); - var postEl = $(content).parents('[component="post"]'); + const postEl = $(content).parents('[component="post"]'); selectedPid = postEl.attr('data-pid'); username = getUserSlug($(content)); range.detach(); @@ -346,13 +346,13 @@ define('forum/topic/postTools', [ } function bookmarkPost(button, pid) { - var method = button.attr('data-bookmarked') === 'false' ? 'put' : 'del'; + const method = button.attr('data-bookmarked') === 'false' ? 'put' : 'del'; api[method](`/posts/${pid}/bookmark`, undefined, function (err) { if (err) { return app.alertError(err); } - var type = method === 'put' ? 'bookmark' : 'unbookmark'; + const type = method === 'put' ? 'bookmark' : 'unbookmark'; hooks.fire(`action:post.${type}`, { pid: pid }); }); return false; @@ -363,8 +363,8 @@ define('forum/topic/postTools', [ } function getUserSlug(button) { - var slug = ''; - var post = button.parents('[data-pid]'); + let slug = ''; + const post = button.parents('[data-pid]'); if (button.attr('component') === 'topic/reply') { return slug; @@ -388,9 +388,9 @@ define('forum/topic/postTools', [ } function togglePostDelete(button) { - var pid = getData(button, 'data-pid'); - var postEl = components.get('post', 'pid', pid); - var action = !postEl.hasClass('deleted') ? 'delete' : 'restore'; + const pid = getData(button, 'data-pid'); + const postEl = components.get('post', 'pid', pid); + const action = !postEl.hasClass('deleted') ? 'delete' : 'restore'; postAction(action, pid); } @@ -417,7 +417,7 @@ define('forum/topic/postTools', [ } function openChat(button) { - var post = button.parents('[data-pid]'); + const post = button.parents('[data-pid]'); app.newChat(post.attr('data-uid')); button.parents('.btn-group').find('.dropdown-toggle').click(); @@ -425,12 +425,12 @@ define('forum/topic/postTools', [ } function showStaleWarning(callback) { - var staleThreshold = Math.min(Date.now() - (1000 * 60 * 60 * 24 * ajaxify.data.topicStaleDays), 8640000000000000); + const staleThreshold = Math.min(Date.now() - (1000 * 60 * 60 * 24 * ajaxify.data.topicStaleDays), 8640000000000000); if (staleReplyAnyway || ajaxify.data.lastposttime >= staleThreshold) { return callback(); } - var warning = bootbox.dialog({ + const warning = bootbox.dialog({ title: '[[topic:stale.title]]', message: '[[topic:stale.warning]]', buttons: { diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 7545e2199e..0914497bb2 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -12,7 +12,7 @@ define('forum/topic/posts', [ 'hooks', 'helpers', ], function (pagination, infinitescroll, postTools, images, navigator, components, translator, hooks, helpers) { - var Posts = { }; + const Posts = { }; Posts.onNewPost = function (data) { if ( @@ -68,8 +68,8 @@ define('forum/topic/posts', [ }; function updatePostCounts(posts) { - for (var i = 0; i < posts.length; i += 1) { - var cmp = components.get('user/postcount', posts[i].uid); + for (let i = 0; i < posts.length; i += 1) { + const cmp = components.get('user/postcount', posts[i].uid); cmp.html(parseInt(cmp.attr('data-postcount'), 10) + 1); utils.addCommasToNumbers(cmp); } @@ -79,7 +79,7 @@ define('forum/topic/posts', [ if (config.topicPostSort === 'newest_to_oldest') { posts[0].index = 1; components.get('post').not('[data-index=0]').each(function () { - var newIndex = parseInt($(this).attr('data-index'), 10) + 1; + const newIndex = parseInt($(this).attr('data-index'), 10) + 1; $(this).attr('data-index', newIndex); }); } @@ -90,18 +90,18 @@ define('forum/topic/posts', [ scrollToPostIfSelf(data.posts[0]); } - var posts = data.posts; + const posts = data.posts; ajaxify.data.pagination.pageCount = Math.max(1, Math.ceil(posts[0].topic.postcount / config.postsPerPage)); - var direction = config.topicPostSort === 'oldest_to_newest' || config.topicPostSort === 'most_votes' ? 1 : -1; + const direction = config.topicPostSort === 'oldest_to_newest' || config.topicPostSort === 'most_votes' ? 1 : -1; - var isPostVisible = ( + const isPostVisible = ( ajaxify.data.pagination.currentPage === ajaxify.data.pagination.pageCount && direction === 1 ) || (ajaxify.data.pagination.currentPage === 1 && direction === -1); if (isPostVisible) { - var repliesSelector = $('[component="post"]:not([data-index=0]), [component="topic/event"]'); + const repliesSelector = $('[component="post"]:not([data-index=0]), [component="topic/event"]'); createNewPosts(data, repliesSelector, direction, false, scrollToPost); } else if (ajaxify.data.scrollToMyPost && parseInt(posts[0].uid, 10) === parseInt(app.user.uid, 10)) { // https://github.com/NodeBB/NodeBB/issues/5004#issuecomment-247157441 @@ -122,9 +122,9 @@ define('forum/topic/posts', [ } function onNewPostInfiniteScroll(data) { - var direction = (config.topicPostSort === 'oldest_to_newest' || config.topicPostSort === 'most_votes') ? 1 : -1; + const direction = (config.topicPostSort === 'oldest_to_newest' || config.topicPostSort === 'most_votes') ? 1 : -1; - var isPreviousPostAdded = $('[component="post"][data-index="' + (data.posts[0].index - 1) + '"]').length; + const isPreviousPostAdded = $('[component="post"][data-index="' + (data.posts[0].index - 1) + '"]').length; if (!isPreviousPostAdded && (!data.posts[0].selfPost || !ajaxify.data.scrollToMyPost)) { return; } @@ -132,7 +132,7 @@ define('forum/topic/posts', [ if (!isPreviousPostAdded && data.posts[0].selfPost) { return ajaxify.go('post/' + data.posts[0].pid); } - var repliesSelector = $('[component="post"]:not([data-index=0]), [component="topic/event"]'); + const repliesSelector = $('[component="post"]:not([data-index=0]), [component="topic/event"]'); createNewPosts(data, repliesSelector, direction, false, function (html) { if (html) { html.addClass('new'); @@ -154,10 +154,10 @@ define('forum/topic/posts', [ } function removeAlreadyAddedPosts() { - var newPosts = $('[component="post"].new'); + const newPosts = $('[component="post"].new'); if (newPosts.length === data.posts.length) { - var allSamePids = true; + let allSamePids = true; newPosts.each(function (index, el) { if (parseInt($(el).attr('data-pid'), 10) !== parseInt(data.posts[index].pid, 10)) { allSamePids = false; @@ -175,7 +175,7 @@ define('forum/topic/posts', [ if (newPosts.length && data.posts.length > 1) { data.posts.forEach(function (post) { - var p = components.get('post', 'pid', post.pid); + const p = components.get('post', 'pid', post.pid); if (p.hasClass('new')) { p.remove(); } @@ -193,8 +193,8 @@ define('forum/topic/posts', [ return callback(); } - var after; - var before; + let after; + let before; if (direction > 0 && repliesSelector.length) { after = repliesSelector.last(); @@ -206,7 +206,7 @@ define('forum/topic/posts', [ app.parseAndTranslate('topic', 'posts', Object.assign({}, ajaxify.data, data), function (html) { html = html.filter(function () { - var pid = $(this).attr('data-pid'); + const pid = $(this).attr('data-pid'); return pid && $('[component="post"][data-pid="' + pid + '"]').length === 0; }); @@ -214,8 +214,8 @@ define('forum/topic/posts', [ html.insertAfter(after); } else if (before) { // Save document height and position for future reference (about 5 lines down) - var height = $(document).height(); - var scrollTop = $(window).scrollTop(); + const height = $(document).height(); + const scrollTop = $(window).scrollTop(); html.insertBefore(before); @@ -242,16 +242,16 @@ define('forum/topic/posts', [ return; } - var replies = components.get('topic').find(components.get('post').not('[data-index=0]').not('.new')); - var afterEl = direction > 0 ? replies.last() : replies.first(); - var after = parseInt(afterEl.attr('data-index'), 10) || 0; + const replies = components.get('topic').find(components.get('post').not('[data-index=0]').not('.new')); + const afterEl = direction > 0 ? replies.last() : replies.first(); + const after = parseInt(afterEl.attr('data-index'), 10) || 0; - var tid = ajaxify.data.tid; + const tid = ajaxify.data.tid; if (!utils.isNumber(tid) || !utils.isNumber(after) || (direction < 0 && components.get('post', 'index', 0).length)) { return; } - var indicatorEl = $('.loading-indicator'); + const indicatorEl = $('.loading-indicator'); if (!indicatorEl.is(':animated')) { indicatorEl.fadeIn(); } @@ -266,7 +266,7 @@ define('forum/topic/posts', [ indicatorEl.fadeOut(); if (data && data.posts && data.posts.length) { - var repliesSelector = $('[component="post"]:not([data-index=0]):not(.new), [component="topic/event"]'); + const repliesSelector = $('[component="post"]:not([data-index=0]):not(.new), [component="topic/event"]'); createNewPosts(data, repliesSelector, direction, true, done); } else { navigator.update(); @@ -294,15 +294,15 @@ define('forum/topic/posts', [ }; function addNecroPostMessage(callback) { - var necroThreshold = ajaxify.data.necroThreshold * 24 * 60 * 60 * 1000; + const necroThreshold = ajaxify.data.necroThreshold * 24 * 60 * 60 * 1000; if (!necroThreshold || (config.topicPostSort !== 'newest_to_oldest' && config.topicPostSort !== 'oldest_to_newest')) { return callback && callback(); } - var postEls = $('[component="post"]').toArray(); + const postEls = $('[component="post"]').toArray(); Promise.all(postEls.map(function (post) { post = $(post); - var prev = post.prev('[component="post"]'); + const prev = post.prev('[component="post"]'); if (post.is(':has(.necro-post)') || !prev.length) { return; } @@ -310,20 +310,20 @@ define('forum/topic/posts', [ return; } - var diff = post.attr('data-timestamp') - prev.attr('data-timestamp'); + const diff = post.attr('data-timestamp') - prev.attr('data-timestamp'); return new Promise(function (resolve) { if (Math.abs(diff) >= necroThreshold) { - var suffixAgo = $.timeago.settings.strings.suffixAgo; - var prefixAgo = $.timeago.settings.strings.prefixAgo; - var suffixFromNow = $.timeago.settings.strings.suffixFromNow; - var prefixFromNow = $.timeago.settings.strings.prefixFromNow; + const suffixAgo = $.timeago.settings.strings.suffixAgo; + const prefixAgo = $.timeago.settings.strings.prefixAgo; + const suffixFromNow = $.timeago.settings.strings.suffixFromNow; + const prefixFromNow = $.timeago.settings.strings.prefixFromNow; $.timeago.settings.strings.suffixAgo = ''; $.timeago.settings.strings.prefixAgo = ''; $.timeago.settings.strings.suffixFromNow = ''; $.timeago.settings.strings.prefixFromNow = ''; - var translationText = (diff > 0 ? '[[topic:timeago_later,' : '[[topic:timeago_earlier,') + $.timeago.inWords(diff) + ']]'; + const translationText = (diff > 0 ? '[[topic:timeago_later,' : '[[topic:timeago_earlier,') + $.timeago.inWords(diff) + ']]'; $.timeago.settings.strings.suffixAgo = suffixAgo; $.timeago.settings.strings.prefixAgo = prefixAgo; @@ -350,7 +350,7 @@ define('forum/topic/posts', [ } // Replace all requests for uploaded images/files with a login link - var loginEl = document.createElement('a'); + const loginEl = document.createElement('a'); loginEl.className = 'login-required'; loginEl.href = config.relative_path + '/login'; @@ -378,9 +378,9 @@ define('forum/topic/posts', [ }; Posts.showBottomPostBar = function () { - var mainPost = components.get('post', 'index', 0); - var placeHolder = $('.post-bar-placeholder'); - var posts = $('[component="post"]'); + const mainPost = components.get('post', 'index', 0); + const placeHolder = $('.post-bar-placeholder'); + const posts = $('[component="post"]'); if (!!mainPost.length && posts.length > 1 && $('.post-bar').length < 2 && placeHolder.length) { $('.post-bar').clone().insertAfter(placeHolder); placeHolder.remove(); @@ -398,9 +398,9 @@ define('forum/topic/posts', [ } Posts.addBlockquoteEllipses = function (posts) { - var blockquotes = posts.find('[component="post/content"] > blockquote > blockquote'); + const blockquotes = posts.find('[component="post/content"] > blockquote > blockquote'); blockquotes.each(function () { - var $this = $(this); + const $this = $(this); if ($this.find(':hidden:not(br)').length && !$this.find('.toggle').length) { $this.append(''); } diff --git a/public/src/client/topic/replies.js b/public/src/client/topic/replies.js index bc017d25f6..51a4064f0b 100644 --- a/public/src/client/topic/replies.js +++ b/public/src/client/topic/replies.js @@ -2,14 +2,14 @@ define('forum/topic/replies', ['navigator', 'components', 'forum/topic/posts', 'hooks'], function (navigator, components, posts, hooks) { - var Replies = {}; + const Replies = {}; Replies.init = function (button) { - var post = button.closest('[data-pid]'); - var pid = post.data('pid'); - var open = button.find('[component="post/replies/open"]'); - var loading = button.find('[component="post/replies/loading"]'); - var close = button.find('[component="post/replies/close"]'); + const post = button.closest('[data-pid]'); + const pid = post.data('pid'); + const open = button.find('[component="post/replies/open"]'); + const loading = button.find('[component="post/replies/loading"]'); + const close = button.find('[component="post/replies/close"]'); if (open.is(':not(.hidden)') && loading.is('.hidden')) { open.addClass('hidden'); @@ -25,7 +25,7 @@ define('forum/topic/replies', ['navigator', 'components', 'forum/topic/posts', ' close.removeClass('hidden'); posts.modifyPostsByPrivileges(data); - var tplData = { + const tplData = { posts: data, privileges: ajaxify.data.privileges, 'downvote:disabled': ajaxify.data['downvote:disabled'], @@ -34,7 +34,7 @@ define('forum/topic/replies', ['navigator', 'components', 'forum/topic/posts', ' hideReplies: config.hasOwnProperty('showNestedReplies') ? !config.showNestedReplies : true, }; app.parseAndTranslate('topic', 'posts', tplData, function (html) { - var repliesEl = $('
      ', { component: 'post/replies' }).html(html).hide(); + const repliesEl = $('
      ', { component: 'post/replies' }).html(html).hide(); if (button.attr('data-target-component')) { post.find('[component="' + button.attr('data-target-component') + '"]').html(repliesEl); } else { @@ -57,14 +57,14 @@ define('forum/topic/replies', ['navigator', 'components', 'forum/topic/posts', ' }; Replies.onNewPost = function (data) { - var post = data.posts[0]; + const post = data.posts[0]; if (!post) { return; } incrementCount(post, 1); data.hideReplies = config.hasOwnProperty('showNestedReplies') ? !config.showNestedReplies : true; app.parseAndTranslate('topic', 'posts', data, function (html) { - var replies = $('[component="post"][data-pid="' + post.toPid + '"] [component="post/replies"]').first(); + const replies = $('[component="post"][data-pid="' + post.toPid + '"] [component="post/replies"]').first(); if (replies.length) { if (config.topicPostSort === 'newest_to_oldest') { replies.prepend(html); @@ -81,11 +81,11 @@ define('forum/topic/replies', ['navigator', 'components', 'forum/topic/posts', ' }; function incrementCount(post, inc) { - var replyCount = $('[component="post"][data-pid="' + post.toPid + '"]').find('[component="post/reply-count"]').first(); - var countEl = replyCount.find('[component="post/reply-count/text"]'); - var avatars = replyCount.find('[component="post/reply-count/avatars"]'); - var count = Math.max(0, parseInt(countEl.attr('data-replies'), 10) + inc); - var timestamp = replyCount.find('.timeago').attr('title', post.timestampISO); + const replyCount = $('[component="post"][data-pid="' + post.toPid + '"]').find('[component="post/reply-count"]').first(); + const countEl = replyCount.find('[component="post/reply-count/text"]'); + const avatars = replyCount.find('[component="post/reply-count/avatars"]'); + const count = Math.max(0, parseInt(countEl.attr('data-replies'), 10) + inc); + const timestamp = replyCount.find('.timeago').attr('title', post.timestampISO); countEl.attr('data-replies', count); replyCount.toggleClass('hidden', count <= 0); diff --git a/public/src/client/topic/threadTools.js b/public/src/client/topic/threadTools.js index d7276ced56..a393b00b1d 100644 --- a/public/src/client/topic/threadTools.js +++ b/public/src/client/topic/threadTools.js @@ -10,7 +10,7 @@ define('forum/topic/threadTools', [ 'hooks', 'bootbox', ], function (components, translator, handleBack, posts, api, hooks, bootbox) { - var ThreadTools = {}; + const ThreadTools = {}; ThreadTools.init = function (tid, topicContainer) { renderMenu(topicContainer); @@ -86,7 +86,7 @@ define('forum/topic/threadTools', [ }); topicContainer.on('click', '[component="topic/mark-unread-for-all"]', function () { - var btn = $(this); + const btn = $(this); socket.emit('topics.markAsUnreadForAll', [tid], function (err) { if (err) { return app.alertError(err.message); @@ -135,7 +135,7 @@ define('forum/topic/threadTools', [ function changeWatching(type, state = 1) { const method = state ? 'put' : 'del'; api[method](`/topics/${tid}/${type}`, {}, () => { - var message = ''; + let message = ''; if (type === 'follow') { message = state ? '[[topic:following_topic.message]]' : '[[topic:not_following_topic.message]]'; } else if (type === 'ignore') { @@ -173,8 +173,8 @@ define('forum/topic/threadTools', [ function renderMenu(container) { container.on('show.bs.dropdown', '.thread-tools', function () { - var $this = $(this); - var dropdownMenu = $this.find('.dropdown-menu'); + const $this = $(this); + const dropdownMenu = $this.find('.dropdown-menu'); if (dropdownMenu.html()) { return; } @@ -265,17 +265,17 @@ define('forum/topic/threadTools', [ }; ThreadTools.setLockedState = function (data) { - var threadEl = components.get('topic'); + const threadEl = components.get('topic'); if (parseInt(data.tid, 10) !== parseInt(threadEl.attr('data-tid'), 10)) { return; } - var isLocked = data.isLocked && !ajaxify.data.privileges.isAdminOrMod; + const isLocked = data.isLocked && !ajaxify.data.privileges.isAdminOrMod; components.get('topic/lock').toggleClass('hidden', data.isLocked).parent().attr('hidden', data.isLocked ? '' : null); components.get('topic/unlock').toggleClass('hidden', !data.isLocked).parent().attr('hidden', !data.isLocked ? '' : null); - var hideReply = !!((data.isLocked || ajaxify.data.deleted) && !ajaxify.data.privileges.isAdminOrMod); + const hideReply = !!((data.isLocked || ajaxify.data.deleted) && !ajaxify.data.privileges.isAdminOrMod); components.get('topic/reply/container').toggleClass('hidden', hideReply); components.get('topic/reply/locked').toggleClass('hidden', ajaxify.data.privileges.isAdminOrMod || !data.isLocked || ajaxify.data.deleted); @@ -293,7 +293,7 @@ define('forum/topic/threadTools', [ }; ThreadTools.setDeleteState = function (data) { - var threadEl = components.get('topic'); + const threadEl = components.get('topic'); if (parseInt(data.tid, 10) !== parseInt(threadEl.attr('data-tid'), 10)) { return; } @@ -313,7 +313,7 @@ define('forum/topic/threadTools', [ html.find('.timeago').timeago(); }); } - var hideReply = data.isDelete && !ajaxify.data.privileges.isAdminOrMod; + const hideReply = data.isDelete && !ajaxify.data.privileges.isAdminOrMod; components.get('topic/reply/container').toggleClass('hidden', hideReply); components.get('topic/reply/locked').toggleClass('hidden', ajaxify.data.privileges.isAdminOrMod || !ajaxify.data.locked || data.isDelete); @@ -327,14 +327,14 @@ define('forum/topic/threadTools', [ ThreadTools.setPinnedState = function (data) { - var threadEl = components.get('topic'); + const threadEl = components.get('topic'); if (parseInt(data.tid, 10) !== parseInt(threadEl.attr('data-tid'), 10)) { return; } components.get('topic/pin').toggleClass('hidden', data.pinned).parent().attr('hidden', data.pinned ? '' : null); components.get('topic/unpin').toggleClass('hidden', !data.pinned).parent().attr('hidden', !data.pinned ? '' : null); - var icon = $('.topic-header [component="topic/pinned"]'); + const icon = $('.topic-header [component="topic/pinned"]'); icon.toggleClass('hidden', !data.pinned); if (data.pinned) { icon.translateAttr('title', ( @@ -349,7 +349,7 @@ define('forum/topic/threadTools', [ }; function setFollowState(state) { - var titles = { + const titles = { follow: '[[topic:watching]]', unfollow: '[[topic:not-watching]]', ignore: '[[topic:ignoring]]', @@ -360,7 +360,7 @@ define('forum/topic/threadTools', [ .tooltip('fixTitle'); }); - var menu = components.get('topic/following/menu'); + let menu = components.get('topic/following/menu'); menu.toggleClass('hidden', state !== 'follow'); components.get('topic/following/check').toggleClass('fa-check', state === 'follow'); diff --git a/public/src/client/topic/votes.js b/public/src/client/topic/votes.js index 1a707e37cd..8c895e6ccb 100644 --- a/public/src/client/topic/votes.js +++ b/public/src/client/topic/votes.js @@ -4,7 +4,7 @@ define('forum/topic/votes', [ 'components', 'translator', 'benchpress', 'api', 'hooks', 'bootbox', ], function (components, translator, Benchpress, api, hooks, bootbox) { - var Votes = {}; + const Votes = {}; Votes.addVoteHandler = function () { components.get('topic').on('mouseenter', '[data-pid] [component="post/vote-count"]', loadDataAndCreateTooltip); @@ -13,10 +13,10 @@ define('forum/topic/votes', [ function loadDataAndCreateTooltip(e) { e.stopPropagation(); - var $this = $(this); - var el = $this.parent(); + const $this = $(this); + const el = $this.parent(); el.find('.tooltip').css('display', 'none'); - var pid = el.parents('[data-pid]').attr('data-pid'); + const pid = el.parents('[data-pid]').attr('data-pid'); socket.emit('posts.getUpvoters', [pid], function (err, data) { if (err) { @@ -35,7 +35,7 @@ define('forum/topic/votes', [ el.attr('title', title).tooltip('fixTitle').tooltip('show'); el.parent().find('.tooltip').css('display', ''); } - var usernames = data.usernames + let usernames = data.usernames .filter(name => name !== '[[global:former_user]]'); if (!usernames.length) { return; @@ -54,11 +54,11 @@ define('forum/topic/votes', [ Votes.toggleVote = function (button, className, delta) { - var post = button.closest('[data-pid]'); - var currentState = post.find(className).length; + const post = button.closest('[data-pid]'); + const currentState = post.find(className).length; const method = currentState ? 'del' : 'put'; - var pid = post.attr('data-pid'); + const pid = post.attr('data-pid'); api[method](`/posts/${pid}/vote`, { delta: delta, }, function (err) { @@ -92,7 +92,7 @@ define('forum/topic/votes', [ } app.parseAndTranslate('partials/modals/votes_modal', data, function (html) { - var dialog = bootbox.dialog({ + const dialog = bootbox.dialog({ title: '[[global:voters]]', message: html, className: 'vote-modal', diff --git a/public/src/client/unread.js b/public/src/client/unread.js index 6af50e0472..43983abbac 100644 --- a/public/src/client/unread.js +++ b/public/src/client/unread.js @@ -4,9 +4,9 @@ define('forum/unread', [ 'topicSelect', 'components', 'topicList', 'categorySelector', ], function (topicSelect, components, topicList, categorySelector) { - var Unread = {}; + const Unread = {}; - var watchStates = { + const watchStates = { ignoring: 1, notwatching: 2, watching: 3, @@ -39,7 +39,7 @@ define('forum/unread', [ } function markSelectedRead() { - var tids = topicSelect.getSelectedTids(); + const tids = topicSelect.getSelectedTids(); if (!tids.length) { return; } @@ -54,13 +54,13 @@ define('forum/unread', [ function markCategoryRead(cid) { function getCategoryTids(cid) { - var tids = []; + const tids = []; components.get('category/topic', 'cid', cid).each(function () { tids.push($(this).attr('data-tid')); }); return tids; } - var tids = getCategoryTids(cid); + const tids = getCategoryTids(cid); socket.emit('topics.markCategoryTopicsRead', cid, function (err) { if (err) { @@ -71,7 +71,7 @@ define('forum/unread', [ }); } - var selector = categorySelector.init($('[component="category-selector"]'), { + const selector = categorySelector.init($('[component="category-selector"]'), { onSelect: function (category) { selector.selectCategory(0); if (category.cid === 'all') { @@ -110,7 +110,7 @@ define('forum/unread', [ } function removeTids(tids) { - for (var i = 0; i < tids.length; i += 1) { + for (let i = 0; i < tids.length; i += 1) { components.get('category/topic', 'tid', tids[i]).remove(); } } @@ -126,18 +126,18 @@ define('forum/unread', [ } Unread.initUnreadTopics = function () { - var unreadTopics = app.user.unreadData; + const unreadTopics = app.user.unreadData; function onNewPost(data) { if (data && data.posts && data.posts.length && unreadTopics) { - var post = data.posts[0]; + const post = data.posts[0]; if (parseInt(post.uid, 10) === parseInt(app.user.uid, 10) || (!post.topic.isFollowing && post.categoryWatchState !== watchStates.watching) ) { return; } - var tid = post.topic.tid; + const tid = post.topic.tid; if (!unreadTopics[''][tid] || !unreadTopics.new[tid] || !unreadTopics.watched[tid] || !unreadTopics.unreplied[tid]) { markTopicsUnread(tid); @@ -147,12 +147,12 @@ define('forum/unread', [ increaseUnreadCount(''); unreadTopics[''][tid] = true; } - var isNewTopic = post.isMain && parseInt(post.uid, 10) !== parseInt(app.user.uid, 10); + const isNewTopic = post.isMain && parseInt(post.uid, 10) !== parseInt(app.user.uid, 10); if (isNewTopic && !unreadTopics.new[tid]) { increaseUnreadCount('new'); unreadTopics.new[tid] = true; } - var isUnreplied = parseInt(post.topic.postcount, 10) <= 1; + const isUnreplied = parseInt(post.topic.postcount, 10) <= 1; if (isUnreplied && !unreadTopics.unreplied[tid]) { increaseUnreadCount('unreplied'); unreadTopics.unreplied[tid] = true; @@ -166,8 +166,8 @@ define('forum/unread', [ } function increaseUnreadCount(filter) { - var unreadUrl = '/unread' + (filter ? '?filter=' + filter : ''); - var newCount = 1 + parseInt($('a[href="' + config.relative_path + unreadUrl + '"].navigation-link i').attr('data-content'), 10); + const unreadUrl = '/unread' + (filter ? '?filter=' + filter : ''); + const newCount = 1 + parseInt($('a[href="' + config.relative_path + unreadUrl + '"].navigation-link i').attr('data-content'), 10); updateUnreadTopicCount(unreadUrl, newCount); } diff --git a/public/src/client/users.js b/public/src/client/users.js index 794cf04e90..2b732c7632 100644 --- a/public/src/client/users.js +++ b/public/src/client/users.js @@ -4,14 +4,14 @@ define('forum/users', [ 'translator', 'benchpress', 'api', 'accounts/invite', ], function (translator, Benchpress, api, AccountInvite) { - var Users = {}; + const Users = {}; - var searchResultCount = 0; + let searchResultCount = 0; Users.init = function () { app.enterRoom('user_list'); - var section = utils.params().section ? ('?section=' + utils.params().section) : ''; + const section = utils.params().section ? ('?section=' + utils.params().section) : ''; $('.nav-pills li').removeClass('active').find('a[href="' + window.location.pathname + section + '"]').parent() .addClass('active'); @@ -34,10 +34,10 @@ define('forum/users', [ return; } $('[component="user/search/icon"]').removeClass('fa-search').addClass('fa-spinner fa-spin'); - var username = $('#search-user').val(); - var activeSection = getActiveSection(); + const username = $('#search-user').val(); + const activeSection = getActiveSection(); - var query = { + const query = { section: activeSection, page: 1, }; @@ -48,7 +48,7 @@ define('forum/users', [ query.query = username; query.sortBy = getSortBy(); - var filters = []; + const filters = []; if ($('.search .online-only').is(':checked') || (activeSection === 'online')) { filters.push('online'); } @@ -66,8 +66,8 @@ define('forum/users', [ } function getSortBy() { - var sortBy; - var activeSection = getActiveSection(); + let sortBy; + const activeSection = getActiveSection(); if (activeSection === 'sort-posts') { sortBy = 'postcount'; } else if (activeSection === 'sort-reputation') { @@ -103,7 +103,7 @@ define('forum/users', [ } function onUserStatusChange(data) { - var section = getActiveSection(); + const section = getActiveSection(); if ((section.startsWith('online') || section.startsWith('users'))) { updateUser(data); diff --git a/public/src/installer/install.js b/public/src/installer/install.js index a4ac88a763..48b1d1eba7 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -25,12 +25,12 @@ $('document').ready(function () { function setupInputs() { $('form').on('focus', '.form-control', function () { - var parent = $(this).parents('.input-row'); + const parent = $(this).parents('.input-row'); $('.input-row.active').removeClass('active'); parent.addClass('active').removeClass('error'); - var help = parent.find('.help-text'); + const help = parent.find('.help-text'); help.html(help.attr('data-help')); }); @@ -56,9 +56,9 @@ $('document').ready(function () { } function activate(type, el) { - var field = el.val(); - var parent = el.parents('.input-row'); - var help = parent.children('.help-text'); + const field = el.val(); + const parent = el.parents('.input-row'); + const help = parent.children('.help-text'); function validateUsername(field) { if (!utils.isUserNameValid(field) || !slugify(field)) { @@ -123,8 +123,8 @@ $('document').ready(function () { function launchForum() { $('#launch .working').removeClass('hide'); $.post('/launch', function () { - var successCount = 0; - var url = $('#launch').attr('data-url'); + let successCount = 0; + const url = $('#launch').attr('data-url'); setInterval(function () { $.get(url + '/admin').done(function () { if (successCount >= 5) { diff --git a/public/src/modules/accounts/delete.js b/public/src/modules/accounts/delete.js index 831867fe3c..cff044cfae 100644 --- a/public/src/modules/accounts/delete.js +++ b/public/src/modules/accounts/delete.js @@ -1,7 +1,7 @@ 'use strict'; define('accounts/delete', ['api', 'bootbox'], function (api, bootbox) { - var Delete = {}; + const Delete = {}; Delete.account = function (uid, callback) { executeAction( diff --git a/public/src/modules/accounts/invite.js b/public/src/modules/accounts/invite.js index 621c84bcba..937ab6401f 100644 --- a/public/src/modules/accounts/invite.js +++ b/public/src/modules/accounts/invite.js @@ -36,10 +36,10 @@ define('accounts/invite', ['api', 'benchpress', 'bootbox'], function (api, Bench }; Invite.send = function () { - var $emails = $('#invite-modal-emails'); - var $groups = $('#invite-modal-groups'); + const $emails = $('#invite-modal-emails'); + const $groups = $('#invite-modal-groups'); - var data = { + const data = { emails: $emails.val() .split(',') .map(m => m.trim()) diff --git a/public/src/modules/accounts/picture.js b/public/src/modules/accounts/picture.js index 7e853a9e8f..7b62c96867 100644 --- a/public/src/modules/accounts/picture.js +++ b/public/src/modules/accounts/picture.js @@ -16,7 +16,7 @@ define('accounts/picture', [ } // boolean to signify whether an uploaded picture is present in the pictures list - var uploaded = pictures.reduce(function (memo, cur) { + const uploaded = pictures.reduce(function (memo, cur) { return memo || cur.type === 'uploaded'; }, false); @@ -35,7 +35,7 @@ define('accounts/picture', [ 'icon:bgColor': ajaxify.data['icon:bgColor'], }, }, function (html) { - var modal = bootbox.dialog({ + const modal = bootbox.dialog({ className: 'picture-switcher', title: '[[user:change_picture]]', message: html, @@ -88,7 +88,7 @@ define('accounts/picture', [ } function saveSelection() { - var type = modal.find('.list-group-item.active').attr('data-type'); + const type = modal.find('.list-group-item.active').attr('data-type'); const iconBgColor = document.querySelector('.modal.picture-switcher input[type="radio"]:checked').value || 'transparent'; changeUserPicture(type, iconBgColor).then(() => { @@ -174,7 +174,7 @@ define('accounts/picture', [ uploadModal.modal('show'); uploadModal.find('.upload-btn').on('click', function () { - var url = uploadModal.find('#uploadFromUrl').val(); + const url = uploadModal.find('#uploadFromUrl').val(); if (!url) { return false; } diff --git a/public/src/modules/alerts.js b/public/src/modules/alerts.js index d9cffeb114..5bbd40bf3c 100644 --- a/public/src/modules/alerts.js +++ b/public/src/modules/alerts.js @@ -2,7 +2,7 @@ define('alerts', ['translator', 'components', 'hooks'], function (translator, components, hooks) { - var module = {}; + const module = {}; module.alert = function (params) { params.alert_id = 'alert_button_' + (params.alert_id ? params.alert_id : new Date().getTime()); @@ -10,7 +10,7 @@ define('alerts', ['translator', 'components', 'hooks'], function (translator, co params.message = params.message ? params.message.trim() : ''; params.type = params.type || 'info'; - var alert = $('#' + params.alert_id); + const alert = $('#' + params.alert_id); if (alert.length) { updateAlert(alert, params); } else { @@ -20,7 +20,7 @@ define('alerts', ['translator', 'components', 'hooks'], function (translator, co function createNew(params) { app.parseAndTranslate('alert', params, function (html) { - var alert = $('#' + params.alert_id); + let alert = $('#' + params.alert_id); if (alert.length) { return updateAlert(alert, params); } @@ -98,9 +98,9 @@ define('alerts', ['translator', 'components', 'hooks'], function (translator, co } function startTimeout(alert, params) { - var timeout = params.timeout; + const timeout = params.timeout; - var timeoutId = setTimeout(function () { + const timeoutId = setTimeout(function () { fadeOut(alert); if (typeof params.timeoutfn === 'function') { diff --git a/public/src/modules/autocomplete.js b/public/src/modules/autocomplete.js index 7aa1d7744e..3fb216edb7 100644 --- a/public/src/modules/autocomplete.js +++ b/public/src/modules/autocomplete.js @@ -3,7 +3,7 @@ define('autocomplete', ['api'], function (api) { - var module = {}; + const module = {}; module.user = function (input, params, onselect) { if (typeof params === 'function') { @@ -29,8 +29,8 @@ define('autocomplete', ['api'], function (api) { } if (result && result.users) { - var names = result.users.map(function (user) { - var username = $('
      ').html(user.username).text(); + const names = result.users.map(function (user) { + const username = $('
      ').html(user.username).text(); return user && { label: username, value: username, @@ -75,7 +75,7 @@ define('autocomplete', ['api'], function (api) { return app.alertError(err.message); } if (results && results.length) { - var names = results.map(function (group) { + const names = results.map(function (group) { return group && { label: group.name, value: group.name, @@ -121,7 +121,7 @@ define('autocomplete', ['api'], function (api) { function handleOnSelect(input, onselect, event, ui) { onselect = onselect || function () { }; - var e = jQuery.Event('keypress'); + const e = jQuery.Event('keypress'); e.which = 13; e.keyCode = 13; setTimeout(function () { diff --git a/public/src/modules/categoryFilter.js b/public/src/modules/categoryFilter.js index 25b9a80a96..b1593a5dec 100644 --- a/public/src/modules/categoryFilter.js +++ b/public/src/modules/categoryFilter.js @@ -1,7 +1,7 @@ 'use strict'; define('categoryFilter', ['categorySearch', 'api', 'hooks'], function (categorySearch, api, hooks) { - var categoryFilter = {}; + const categoryFilter = {}; categoryFilter.init = function (el, options) { if (!el || !el.length) { @@ -15,8 +15,8 @@ define('categoryFilter', ['categorySearch', 'api', 'hooks'], function (categoryS categorySearch.init(el, options); - var selectedCids = []; - var initialCids = []; + let selectedCids = []; + let initialCids = []; if (Array.isArray(options.selectedCids)) { selectedCids = options.selectedCids.map(cid => parseInt(cid, 10)); } else if (Array.isArray(ajaxify.data.selectedCids)) { @@ -25,7 +25,7 @@ define('categoryFilter', ['categorySearch', 'api', 'hooks'], function (categoryS initialCids = selectedCids.slice(); el.on('hidden.bs.dropdown', function () { - var changed = initialCids.length !== selectedCids.length; + let changed = initialCids.length !== selectedCids.length; initialCids.forEach(function (cid, index) { if (cid !== selectedCids[index]) { changed = true; @@ -39,8 +39,8 @@ define('categoryFilter', ['categorySearch', 'api', 'hooks'], function (categoryS return; } if (changed) { - var url = window.location.pathname; - var currentParams = utils.params(); + let url = window.location.pathname; + const currentParams = utils.params(); if (selectedCids.length) { currentParams.cid = selectedCids; url += '?' + decodeURIComponent($.param(currentParams)); @@ -50,14 +50,14 @@ define('categoryFilter', ['categorySearch', 'api', 'hooks'], function (categoryS }); el.on('click', '[component="category/list"] [data-cid]', function () { - var listEl = el.find('[component="category/list"]'); - var categoryEl = $(this); - var link = categoryEl.find('a').attr('href'); + const listEl = el.find('[component="category/list"]'); + const categoryEl = $(this); + const link = categoryEl.find('a').attr('href'); if (link && link !== '#' && link.length) { return; } - var cid = parseInt(categoryEl.attr('data-cid'), 10); - var icon = categoryEl.find('[component="category/select/icon"]'); + const cid = parseInt(categoryEl.attr('data-cid'), 10); + const icon = categoryEl.find('[component="category/select/icon"]'); if (selectedCids.includes(cid)) { selectedCids.splice(selectedCids.indexOf(cid), 1); diff --git a/public/src/modules/categorySearch.js b/public/src/modules/categorySearch.js index cf9a42bad4..f6453da65a 100644 --- a/public/src/modules/categorySearch.js +++ b/public/src/modules/categorySearch.js @@ -1,26 +1,26 @@ 'use strict'; define('categorySearch', function () { - var categorySearch = {}; + const categorySearch = {}; categorySearch.init = function (el, options) { - var categoriesList = null; + let categoriesList = null; options = options || {}; options.privilege = options.privilege || 'topics:read'; options.states = options.states || ['watching', 'notwatching', 'ignoring']; - var localCategories = []; + let localCategories = []; if (Array.isArray(options.localCategories)) { localCategories = options.localCategories.map(c => ({ ...c })); } options.selectedCids = options.selectedCids || ajaxify.data.selectedCids || []; - var searchEl = el.find('[component="category-selector-search"]'); + const searchEl = el.find('[component="category-selector-search"]'); if (!searchEl.length) { return; } - var toggleVisibility = searchEl.parent('[component="category/dropdown"]').length > 0 || + const toggleVisibility = searchEl.parent('[component="category/dropdown"]').length > 0 || searchEl.parent('[component="category-selector"]').length > 0; el.on('show.bs.dropdown', function () { @@ -30,7 +30,7 @@ define('categorySearch', function () { } function doSearch() { - var val = searchEl.find('input').val(); + const val = searchEl.find('input').val(); if (val.length > 1 || (!val && !categoriesList)) { loadList(val, function (categories) { categoriesList = categoriesList || categories; diff --git a/public/src/modules/categorySelector.js b/public/src/modules/categorySelector.js index 0ac9da7229..c0a36931a3 100644 --- a/public/src/modules/categorySelector.js +++ b/public/src/modules/categorySelector.js @@ -3,14 +3,14 @@ define('categorySelector', [ 'categorySearch', 'bootbox', 'hooks', ], function (categorySearch, bootbox, hooks) { - var categorySelector = {}; + const categorySelector = {}; categorySelector.init = function (el, options) { if (!el || !el.length) { return; } options = options || {}; - var onSelect = options.onSelect || function () {}; + const onSelect = options.onSelect || function () {}; options.states = options.states || ['watching', 'notwatching', 'ignoring']; options.template = 'partials/category-selector'; @@ -18,12 +18,12 @@ define('categorySelector', [ categorySearch.init(el, options); - var selector = { + const selector = { el: el, selectedCategory: null, }; el.on('click', '[data-cid]', function () { - var categoryEl = $(this); + const categoryEl = $(this); if (categoryEl.hasClass('disabled')) { return false; } @@ -32,7 +32,7 @@ define('categorySelector', [ }); const defaultSelectHtml = selector.el.find('[component="category-selector-selected"]').html(); selector.selectCategory = function (cid) { - var categoryEl = selector.el.find('[data-cid="' + cid + '"]'); + const categoryEl = selector.el.find('[data-cid="' + cid + '"]'); selector.selectedCategory = { cid: cid, name: categoryEl.attr('data-name'), @@ -62,7 +62,7 @@ define('categorySelector', [ options.onSelect = options.onSelect || function () {}; options.onSubmit = options.onSubmit || function () {}; app.parseAndTranslate('admin/partials/categories/select-category', { message: options.message }, function (html) { - var modal = bootbox.dialog({ + const modal = bootbox.dialog({ title: options.title || '[[modules:composer.select_category]]', message: html, buttons: { @@ -74,7 +74,7 @@ define('categorySelector', [ }, }); - var selector = categorySelector.init(modal.find('[component="category-selector"]'), options); + const selector = categorySelector.init(modal.find('[component="category-selector"]'), options); function submit(ev) { ev.preventDefault(); if (selector.selectedCategory) { diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index ff703a85a9..94e4764ec8 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -6,8 +6,8 @@ define('chat', [ 'translator', 'hooks', ], function (components, taskbar, translator, hooks) { - var module = {}; - var newMessage = false; + const module = {}; + let newMessage = false; module.loadChatsDropdown = function (chatsListEl) { socket.emit('modules.chats.getRecentChats', { @@ -18,12 +18,12 @@ define('chat', [ return app.alertError(err.message); } - var rooms = data.rooms.filter(function (room) { + const rooms = data.rooms.filter(function (room) { return room.teaser; }); translator.toggleTimeagoShorthand(function () { - for (var i = 0; i < rooms.length; i += 1) { + for (let i = 0; i < rooms.length; i += 1) { rooms[i].teaser.timeago = $.timeago(new Date(parseInt(rooms[i].teaser.timestamp, 10))); } translator.toggleTimeagoShorthand(); @@ -35,7 +35,7 @@ define('chat', [ if ($(ev.target).parents('.user-link').length) { return; } - var roomId = $(this).attr('data-roomid'); + const roomId = $(this).attr('data-roomid'); if (!ajaxify.currentPage.match(/^chats\//)) { app.openChat(roomId); } else { @@ -57,7 +57,7 @@ define('chat', [ module.onChatMessageReceived = function (data) { - var isSelf = data.self === 1; + const isSelf = data.self === 1; data.message.self = data.self; newMessage = data.self === 0; @@ -83,9 +83,9 @@ define('chat', [ }; function addMessageToModal(data) { - var modal = module.getModal(data.roomId); - var username = data.message.fromUser.username; - var isSelf = data.self === 1; + const modal = module.getModal(data.roomId); + const username = data.message.fromUser.username; + const isSelf = data.self === 1; require(['forum/chats/messages'], function (ChatsMessages) { // don't add if already added if (!modal.find('[data-mid="' + data.message.messageId + '"]').length) { @@ -113,13 +113,13 @@ define('chat', [ } module.onUserStatusChange = function (data) { - var modal = module.getModal(data.uid); + const modal = module.getModal(data.uid); app.updateUserStatus(modal.find('[component="user/status"]'), data.status); }; module.onRoomRename = function (data) { - var newTitle = $('
      ').html(data.newName).text(); - var modal = module.getModal(data.roomId); + const newTitle = $('
      ').html(data.newName).text(); + const modal = module.getModal(data.roomId); modal.find('[component="chat/room/name"]').text(newTitle); taskbar.update('chat', modal.attr('data-uuid'), { title: newTitle, @@ -144,8 +144,8 @@ define('chat', [ if (module.modalExists(data.roomId)) { return callback(module.getModal(data.roomId)); } - var uuid = utils.generateUUID(); - var dragged = false; + const uuid = utils.generateUUID(); + let dragged = false; chatModal.attr('id', 'chat-modal-' + data.roomId); chatModal.attr('data-roomid', data.roomId); @@ -190,7 +190,7 @@ define('chat', [ }); function gotoChats() { - var text = components.get('chat/input').val(); + const text = components.get('chat/input').val(); $(window).one('action:ajaxify.end', function () { components.get('chat/input').val(text); }); @@ -202,7 +202,7 @@ define('chat', [ chatModal.find('.modal-header').on('dblclick', gotoChats); chatModal.find('button[data-action="maximize"]').on('click', gotoChats); chatModal.find('button[data-action="minimize"]').on('click', function () { - var uuid = chatModal.attr('data-uuid'); + const uuid = chatModal.attr('data-uuid'); module.minimize(uuid); }); @@ -265,7 +265,7 @@ define('chat', [ }; module.close = function (chatModal) { - var uuid = chatModal.attr('data-uuid'); + const uuid = chatModal.attr('data-uuid'); clearInterval(chatModal.attr('intervalId')); chatModal.attr('intervalId', 0); chatModal.remove(); @@ -284,12 +284,12 @@ define('chat', [ // TODO: see taskbar.js:44 module.closeByUUID = function (uuid) { - var chatModal = $('.chat-modal[data-uuid="' + uuid + '"]'); + const chatModal = $('.chat-modal[data-uuid="' + uuid + '"]'); module.close(chatModal); }; module.center = function (chatModal) { - var hideAfter = false; + let hideAfter = false; if (chatModal.hasClass('hide')) { chatModal.removeClass('hide'); hideAfter = true; @@ -305,14 +305,14 @@ define('chat', [ module.load = function (uuid) { require(['forum/chats/messages'], function (ChatsMessages) { - var chatModal = $('.chat-modal[data-uuid="' + uuid + '"]'); + const chatModal = $('.chat-modal[data-uuid="' + uuid + '"]'); chatModal.removeClass('hide'); taskbar.updateActive(uuid); ChatsMessages.scrollToBottom(chatModal.find('.chat-content')); module.focusInput(chatModal); socket.emit('modules.chats.markRead', chatModal.attr('data-roomid')); - var env = utils.findBootstrapEnvironment(); + const env = utils.findBootstrapEnvironment(); if (env === 'xs' || env === 'sm') { module.enableMobileBehaviour(chatModal); } @@ -322,7 +322,7 @@ define('chat', [ module.enableMobileBehaviour = function (modalEl) { app.toggleNavbar(false); modalEl.attr('data-mobile', '1'); - var messagesEl = modalEl.find('.modal-body'); + const messagesEl = modalEl.find('.modal-body'); messagesEl.css('height', module.calculateChatListHeight(modalEl)); function resize() { messagesEl.css('height', module.calculateChatListHeight(modalEl)); @@ -348,7 +348,7 @@ define('chat', [ }; module.minimize = function (uuid) { - var chatModal = $('.chat-modal[data-uuid="' + uuid + '"]'); + const chatModal = $('.chat-modal[data-uuid="' + uuid + '"]'); chatModal.addClass('hide'); taskbar.minimize('chat', uuid); clearInterval(chatModal.attr('intervalId')); diff --git a/public/src/modules/components.js b/public/src/modules/components.js index 618ee81ee8..2ebd952f91 100644 --- a/public/src/modules/components.js +++ b/public/src/modules/components.js @@ -1,7 +1,7 @@ 'use strict'; define('components', function () { - var components = {}; + const components = {}; components.core = { 'topic/teaser': function (tid) { @@ -61,7 +61,7 @@ define('components', function () { }; components.get = function () { - var args = Array.prototype.slice.call(arguments, 1); + const args = Array.prototype.slice.call(arguments, 1); if (components.core[arguments[0]] && args.length) { return components.core[arguments[0]].apply(this, args); diff --git a/public/src/modules/coverPhoto.js b/public/src/modules/coverPhoto.js index 8cae013101..7c1a1e21e6 100644 --- a/public/src/modules/coverPhoto.js +++ b/public/src/modules/coverPhoto.js @@ -4,7 +4,7 @@ define('coverPhoto', [ 'vendor/jquery/draggable-background/backgroundDraggable', ], function () { - var coverPhoto = { + const coverPhoto = { coverEl: null, saveFn: null, }; @@ -37,8 +37,8 @@ define('coverPhoto', [ e.stopPropagation(); e.preventDefault(); - var files = e.originalEvent.dataTransfer.files; - var reader = new FileReader(); + const files = e.originalEvent.dataTransfer.files; + const reader = new FileReader(); if (files.length && files[0].type.match('image.*')) { reader.onload = function (e) { diff --git a/public/src/modules/flags.js b/public/src/modules/flags.js index fb6a171d9a..0e9fa13928 100644 --- a/public/src/modules/flags.js +++ b/public/src/modules/flags.js @@ -2,10 +2,10 @@ define('flags', ['hooks', 'components', 'api'], function (hooks, components, api) { - var Flag = {}; - var flagModal; - var flagCommit; - var flagReason; + const Flag = {}; + let flagModal; + let flagCommit; + let flagReason; Flag.showFlagModal = function (data) { app.parseAndTranslate('partials/modals/flag_modal', data, function (html) { @@ -30,8 +30,8 @@ define('flags', ['hooks', 'components', 'api'], function (hooks, components, api }); flagCommit.on('click', function () { - var selected = $('input[name="flag-reason"]:checked'); - var reason = selected.val(); + const selected = $('input[name="flag-reason"]:checked'); + let reason = selected.val(); if (selected.attr('id') === 'flag-reason-other') { reason = flagReason.val(); } @@ -66,7 +66,7 @@ define('flags', ['hooks', 'components', 'api'], function (hooks, components, api if (!type || !id || !reason) { return; } - var data = { type: type, id: id, reason: reason }; + const data = { type: type, id: id, reason: reason }; api.post('/flags', data, function (err, flagId) { if (err) { return app.alertError(err.message); @@ -75,7 +75,7 @@ define('flags', ['hooks', 'components', 'api'], function (hooks, components, api flagModal.modal('hide'); app.alertSuccess('[[flags:modal-submit-success]]'); if (type === 'post') { - var postEl = components.get('post', 'pid', id); + const postEl = components.get('post', 'pid', id); postEl.find('[component="post/flag"]').addClass('hidden').parent().attr('hidden', ''); postEl.find('[component="post/already-flagged"]').removeClass('hidden').parent().attr('hidden', null); } diff --git a/public/src/modules/groupSearch.js b/public/src/modules/groupSearch.js index 6a650ac2b0..b77e559757 100644 --- a/public/src/modules/groupSearch.js +++ b/public/src/modules/groupSearch.js @@ -1,26 +1,26 @@ 'use strict'; define('groupSearch', function () { - var groupSearch = {}; + const groupSearch = {}; groupSearch.init = function (el) { if (utils.isTouchDevice()) { return; } - var searchEl = el.find('[component="group-selector-search"]'); + const searchEl = el.find('[component="group-selector-search"]'); if (!searchEl.length) { return; } - var toggleVisibility = searchEl.parent('[component="group-selector"]').length > 0; + const toggleVisibility = searchEl.parent('[component="group-selector"]').length > 0; - var groupEls = el.find('[component="group-list"] [data-name]'); + const groupEls = el.find('[component="group-list"] [data-name]'); el.on('show.bs.dropdown', function () { function updateList() { - var val = searchEl.find('input').val().toLowerCase(); - var noMatch = true; + const val = searchEl.find('input').val().toLowerCase(); + let noMatch = true; groupEls.each(function () { - var liEl = $(this); - var isMatch = liEl.attr('data-name').toLowerCase().indexOf(val) !== -1; + const liEl = $(this); + const isMatch = liEl.attr('data-name').toLowerCase().indexOf(val) !== -1; if (noMatch && isMatch) { noMatch = false; } diff --git a/public/src/modules/handleBack.js b/public/src/modules/handleBack.js index e16546b705..2df8baceda 100644 --- a/public/src/modules/handleBack.js +++ b/public/src/modules/handleBack.js @@ -6,8 +6,8 @@ define('handleBack', [ 'navigator', 'forum/pagination', ], function (components, storage, navigator, pagination) { - var handleBack = {}; - var loadTopicsMethod; + const handleBack = {}; + let loadTopicsMethod; handleBack.init = function (_loadTopicsMethod) { loadTopicsMethod = _loadTopicsMethod; @@ -19,8 +19,8 @@ define('handleBack', [ function saveClickedIndex() { $('[component="category"]').on('click', '[component="topic/header"]', function () { - var clickedIndex = $(this).parents('[data-index]').attr('data-index'); - var windowScrollTop = $(window).scrollTop(); + const clickedIndex = $(this).parents('[data-index]').attr('data-index'); + const windowScrollTop = $(window).scrollTop(); $('[component="category/topic"]').each(function (index, el) { if ($(el).offset().top - windowScrollTop > 0) { storage.setItem('category:bookmark', $(el).attr('data-index')); @@ -33,15 +33,15 @@ define('handleBack', [ } function onBackClicked(isMarkedUnread) { - var highlightUnread = isMarkedUnread && ajaxify.data.template.unread; + const highlightUnread = isMarkedUnread && ajaxify.data.template.unread; if ( ajaxify.data.template.category || ajaxify.data.template.recent || ajaxify.data.template.popular || highlightUnread ) { - var bookmarkIndex = storage.getItem('category:bookmark'); - var clickedIndex = storage.getItem('category:bookmark:clicked'); + let bookmarkIndex = storage.getItem('category:bookmark'); + let clickedIndex = storage.getItem('category:bookmark:clicked'); storage.removeItem('category:bookmark'); storage.removeItem('category:bookmark:clicked'); @@ -53,7 +53,7 @@ define('handleBack', [ clickedIndex = Math.max(0, parseInt(clickedIndex, 10) || 0); if (config.usePagination) { - var page = Math.ceil((parseInt(bookmarkIndex, 10) + 1) / config.topicsPerPage); + const page = Math.ceil((parseInt(bookmarkIndex, 10) + 1) / config.topicsPerPage); if (parseInt(page, 10) !== ajaxify.data.pagination.currentPage) { pagination.loadPage(page, function () { handleBack.scrollToTopic(bookmarkIndex, clickedIndex); @@ -76,7 +76,7 @@ define('handleBack', [ } handleBack.highlightTopic = function (topicIndex) { - var highlight = components.get('category/topic', 'index', topicIndex); + const highlight = components.get('category/topic', 'index', topicIndex); if (highlight.length && !highlight.hasClass('highlight')) { highlight.addClass('highlight'); @@ -91,10 +91,10 @@ define('handleBack', [ return; } - var scrollTo = components.get('category/topic', 'index', bookmarkIndex); + const scrollTo = components.get('category/topic', 'index', bookmarkIndex); if (scrollTo.length) { - var offset = storage.getItem('category:bookmark:offset'); + const offset = storage.getItem('category:bookmark:offset'); storage.removeItem('category:bookmark:offset'); $(window).scrollTop(scrollTo.offset().top - offset); handleBack.highlightTopic(clickedIndex); diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index d34266b093..b1778c92b1 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -2,7 +2,7 @@ (function (factory) { if (typeof module === 'object' && module.exports) { - var relative_path = require('nconf').get('relative_path'); + const relative_path = require('nconf').get('relative_path'); module.exports = factory(require('../utils'), require('benchpressjs'), relative_path); } else if (typeof define === 'function' && define.amd) { define('helpers', ['benchpress'], function (Benchpress) { @@ -13,7 +13,7 @@ Benchpress.setGlobal('true', true); Benchpress.setGlobal('false', false); - var helpers = { + const helpers = { displayMenuItem, buildMetaTag, buildLinkTag, @@ -41,7 +41,7 @@ } function displayMenuItem(data, index) { - var item = data.navigation[index]; + const item = data.navigation[index]; if (!item) { return false; } @@ -62,9 +62,9 @@ } function buildMetaTag(tag) { - var name = tag.name ? 'name="' + tag.name + '" ' : ''; - var property = tag.property ? 'property="' + tag.property + '" ' : ''; - var content = tag.content ? 'content="' + tag.content.replace(/\n/g, ' ') + '" ' : ''; + const name = tag.name ? 'name="' + tag.name + '" ' : ''; + const property = tag.property ? 'property="' + tag.property + '" ' : ''; + const content = tag.content ? 'content="' + tag.content.replace(/\n/g, ' ') + '" ' : ''; return '\n\t'; } @@ -94,7 +94,7 @@ if (!category) { return ''; } - var style = []; + const style = []; if (category.bgColor) { style.push('background-color: ' + category.bgColor); @@ -115,13 +115,13 @@ } function generateChildrenCategories(category) { - var html = ''; + let html = ''; if (!category || !category.children || !category.children.length) { return html; } category.children.forEach(function (child) { if (child && !child.isSection) { - var link = child.link ? child.link : (relative_path + '/category/' + child.slug); + const link = child.link ? child.link : (relative_path + '/category/' + child.slug); html += '' + '