From b7490e894f7b48c2a5bf96476ab2b326ebac1aae Mon Sep 17 00:00:00 2001 From: Krzysztof Kotlarek Date: Mon, 30 Nov 2020 11:41:32 +1100 Subject: [PATCH 001/393] FIX: don't error-index category job when missing category When the category is missing we should not throw an error but just finish the job. --- app/jobs/regular/index_category_for_search.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/jobs/regular/index_category_for_search.rb b/app/jobs/regular/index_category_for_search.rb index 396e95320f..50e3970daa 100644 --- a/app/jobs/regular/index_category_for_search.rb +++ b/app/jobs/regular/index_category_for_search.rb @@ -3,7 +3,7 @@ class Jobs::IndexCategoryForSearch < Jobs::Base def execute(args) category = Category.find_by(id: args[:category_id]) - raise Discourse::InvalidParameters.new(:category_id) if category.blank? + return if category.blank? SearchIndexer.index(category, force: args[:force] || false) end From d7bd9aa3d05719775834e587b86b1739ab11ddb4 Mon Sep 17 00:00:00 2001 From: Discourse Translator Bot Date: Tue, 1 Dec 2020 14:34:25 +0100 Subject: [PATCH 002/393] Update translations (#11385) --- config/locales/client.de.yml | 4 +++ config/locales/client.es.yml | 14 +++++--- config/locales/client.he.yml | 4 +++ config/locales/client.it.yml | 3 ++ config/locales/client.ko.yml | 19 +++++++++++ config/locales/client.nl.yml | 28 ++++++++++++++++ config/locales/client.pl_PL.yml | 4 +++ config/locales/client.ru.yml | 17 ++++++---- config/locales/client.sl.yml | 11 +++++++ config/locales/client.sv.yml | 4 +++ config/locales/client.vi.yml | 3 ++ config/locales/client.zh_CN.yml | 5 +++ config/locales/server.de.yml | 3 +- config/locales/server.he.yml | 1 + config/locales/server.it.yml | 32 +++++++++++++------ config/locales/server.ko.yml | 8 +++++ config/locales/server.nl.yml | 15 +++++++++ config/locales/server.pl_PL.yml | 1 + config/locales/server.ru.yml | 1 + config/locales/server.sl.yml | 1 + config/locales/server.sv.yml | 1 + config/locales/server.zh_CN.yml | 1 + .../config/locales/client.he.yml | 8 ++--- 23 files changed, 163 insertions(+), 25 deletions(-) diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml index f6b21fa085..d5e7c25f51 100644 --- a/config/locales/client.de.yml +++ b/config/locales/client.de.yml @@ -3480,6 +3480,10 @@ de: sync_sso: Synchronisieren Sie einen Benutzer mit SSO. show: Informationen über einen Benutzer abrufen. check_emails: Benutzer-E-Mails auflisten. + update: Benutzerprofil Informationen aktualisieren. + log_out: Alle Sitzungen für einen Benutzer abmelden. + anonymize: Benutzerkonten anonymisieren. + delete: Benutzerkonten löschen. email: receive_emails: Kombiniere diesen Bereich mit dem E-Mail-Empfänger, um eingehende E-Mails zu verarbeiten. web_hooks: diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml index 7eaba19b22..656b12340c 100644 --- a/config/locales/client.es.yml +++ b/config/locales/client.es.yml @@ -143,10 +143,10 @@ es: enabled: "archivado %{when}" disabled: "desarchivado %{when}" pinned: - enabled: "destacado %{when}" - disabled: "sin destacar %{when}" + enabled: "fijado %{when}" + disabled: "desfijado %{when}" pinned_globally: - enabled: "destacado globalmente %{when}" + enabled: "fijado globalmente %{when}" disabled: "sin destacar %{when}" visible: enabled: "listado %{when}" @@ -956,7 +956,7 @@ es: ignored_users: "Ignorados" ignored_users_instructions: "Omitir todas las publicaciones, notificaciones y mensajes personales de estos usuarios." tracked_topics_link: "Mostrar" - automatically_unpin_topics: "Dejar de destacar temas automáticamente cuando los leo por completo." + automatically_unpin_topics: "Desfijar temas automáticamente cuando los leo por completo." apps: "Aplicaciones" revoke_access: "Revocar acceso" undo_revoke_access: "Deshacer revocación de acceso" @@ -1627,6 +1627,9 @@ es: topic_count: one: "%{count} tema en esta categoría" other: "%{count} temas en esta categoría" + plus_subcategories_title: + one: "%{name} y una subcategoría" + other: "%{name} y %{count} subcategorías" select_kit: default_header_text: Seleccionar... no_content: No se encontraron coincidencias @@ -3475,6 +3478,9 @@ es: sync_sso: Sincronizar usuario usando SSO. show: Obtener información sobre un usuario. check_emails: Obtener una lista de los correos electrónicos del usuario. + update: Actualizar información del perfil de usuario. + anonymize: Anonimizar cuentas de usuario. + delete: Eliminar cuentas de usuario. web_hooks: title: "Webhooks" none: "Ahora mismo no hay webhooks." diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml index 8868553991..40656145c2 100644 --- a/config/locales/client.he.yml +++ b/config/locales/client.he.yml @@ -3752,6 +3752,10 @@ he: sync_sso: סנכרון משתמש באמצעות SSO. show: קבלת מידע על משתמש. check_emails: הצגת כתובות הדוא״ל של המשתמשים. + update: עדכון פרטי פרופיל המשתמש. + log_out: להוציא משתמש מכל ההפעלות שלו. + anonymize: הפיכת חשבונות משתמשים לאלמוניים. + delete: מחיקת חשבונות משתמשים. email: receive_emails: לשלב את התחום הזה עם מקבל הודעות הדוא״ל כדי לעבד הודעות דוא״ל נכנסות. web_hooks: diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml index 6254698808..fcefdba708 100644 --- a/config/locales/client.it.yml +++ b/config/locales/client.it.yml @@ -3463,6 +3463,9 @@ it: sync_sso: Sincronizza un utente usando SSO. show: Ottieni informazioni su un utente. check_emails: Elenca le email degli utenti. + update: Aggiorna le informazioni del profilo utente. + anonymize: Anonimizza gli account utente. + delete: Elimina account utente. email: receive_emails: Combina questo ambito con il destinatario della posta per elaborare le email in arrivo. web_hooks: diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index da3e1d0518..0e18e9e13e 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -1572,6 +1572,10 @@ ko: category_row: topic_count: other: "이 카테고리에는 %{count}개의 글이 있습니다" + plus_subcategories_title: + other: "%{name} 및 %{count}개의 하위 카테고리" + plus_subcategories: + other: "+ %{count}개의 하위 카테고리" select_kit: default_header_text: 선택... no_content: 일치하는 항목을 찾을 수 없음 @@ -2624,6 +2628,17 @@ ko: change_in_category_topic: "설명 편집" already_used: "이 색은 다른 카테고리에서 사용되고 있습니다." security: "보안" + security_add_group: "그룹 추가" + permissions: + group: "그룹" + see: "보기" + reply: "댓글" + create: "만들기" + no_groups_selected: "접근 권한이 부여된 그룹이 없습니다. 이 카테고리는 관리자만 볼 수 있습니다." + everyone_has_access: "이 카테고리는 공개이며, 누구나 볼 수 있고, 댓글을 작성 하고, 글을 쓸 수 있습니다. 사용 권한을 제한하려면 \"everyone\" 그룹에 부여된 사용 권한 중 하나 이상을 제거해야 합니다." + toggle_reply: "토글 댓글 권한" + toggle_full: "토글 생성 권한" + inherited: "이 권한은 \"everyone\" 으로부터 상속됩니다." special_warning: "경고: 이 카테고리는 사전 생성된 카테고리이기 때문에 보안 설정 변경이 불가합니다. 이 카테고리를 사용하고 싶지 않다면, 수정하지말고 삭제하세요." uncategorized_security_warning: "이 카테고리는 특별합니다. 카테고리가없는 주제의 보관 영역으로 사용됩니다. 보안 설정을 가질 수 없습니다." uncategorized_general_warning: '이 카테고리는 특별합니다. 카테고리를 선택하지 않은 새 주제의 기본 카테고리로 사용됩니다. 이 동작을 방지하고 범주를 강제로 선택 하려면 여기에서 설정을 비활성화하십시오 . 이름이나 설명을 변경하려면 사용자 정의 / 텍스트 내용으로 이동하십시오 .' @@ -3340,6 +3355,10 @@ ko: sync_sso: SSO를 사용하여 사용자를 동기화합니다. show: 사용자에 대한 정보를 얻습니다. check_emails: 사용자 이메일을 나열합니다. + update: 사용자 프로필 정보를 업데이트합니다. + log_out: 사용자의 모든 세션을 로그 아웃합니다. + anonymize: 사용자 계정을 익명화합니다. + delete: 사용자 계정을 삭제합니다. web_hooks: title: "Webhook" none: "현재 webhook이 없습니다." diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml index a63bee3892..ac11c4362c 100644 --- a/config/locales/client.nl.yml +++ b/config/locales/client.nl.yml @@ -1296,6 +1296,7 @@ nl: link_redemption_stats: "Inwisselingen" link_groups: Groepen link_expires_at: Verloopt + create: "Uitnodigen" copy_link: "Koppeling tonen" generate_link: "Uitnodigingskoppeling maken" link_generated: "Hier is uw uitnodigingskoppeling!" @@ -1626,6 +1627,12 @@ nl: topic_count: one: "%{count} topic in deze categorie" other: "%{count} topics in deze categorie" + plus_subcategories_title: + one: "%{name} en één subcategorie" + other: "%{name} en %{count} subcategorieën" + plus_subcategories: + one: "+ %{count} subcategorie" + other: "+ %{count} subcategorieën" select_kit: default_header_text: Selecteren... no_content: Geen overeenkomsten gevonden @@ -2541,6 +2548,7 @@ nl: no_save_draft: "Nee, concept opslaan" yes_value: "Ja, bewerking negeren" abandon: + title: "Concept afbreken" confirm: "Weet u zeker dat u uw bericht wilt afbreken?" no_value: "Nee, behouden" no_save_draft: "Nee, concept opslaan" @@ -2727,6 +2735,17 @@ nl: change_in_category_topic: "Omschrijving wijzigen" already_used: "Deze kleur is al in gebruik door een andere categorie" security: "Beveiliging" + security_add_group: "Een groep toevoegen" + permissions: + group: "Groep" + see: "Bekijken" + reply: "Antwoorden" + create: "Aanmaken" + no_groups_selected: "Er is geen toegang tot groepen verleend; deze categorie is alleen zichtbaar voor stafleden." + everyone_has_access: "Deze categorie is openbaar; iedereen kan berichten zien, beantwoorden en aanmaken. Verwijder een of meer van de verleende toestemmingen voor de groep 'iedereen' om toestemmingen te beperken." + toggle_reply: "Toestemming Antwoorden in-/uitschakelen" + toggle_full: "Toestemming Aanmaken in-/uitschakelen" + inherited: "Deze toestemming is overgenomen van 'iedereen'" special_warning: "Waarschuwing: deze categorie is een vooraf geseede categorie, en de beveiligingsinstellingen kunnen niet worden bewerkt. Als u deze categorie niet wenst te gebruiken, verwijder deze dan in plaats van het doel ervan te wijzigen." uncategorized_security_warning: "Deze categorie is bijzonder. Hij is bedoeld als wachtruimte voor topics die geen categorie hebben, en kan geen beveiligingsinstellingen bevatten." uncategorized_general_warning: 'Deze categorie is bijzonder. Hij is bedoeld als de standaardcategorie voor nieuwe topics die geen selecteerde categorie hebben. Als u dit gedrag wilt voorkomen en categorieselectie wilt afdwingen, schakel de instelling dan hier uit. Als u de naam of omschrijving wilt wijzigen, ga dan naar Aanpassen / Tekstinhoud.' @@ -3465,6 +3484,12 @@ nl: sync_sso: Een gebruiker synchroniseren via SSO. show: Informatie over een gebruiker verkrijgen. check_emails: E-mailadressen van gebruiker weergeven. + update: Gebruikersprofielgegevens bijwerken. + log_out: Alle sessies voor een gebruiker afmelden. + anonymize: Gebruikersaccounts anonimiseren. + delete: Gebruikersaccounts verwijderen. + email: + receive_emails: Deze scope met de e-mailontvanger combineren om inkomende e-mails te verwerken. web_hooks: title: "Webhooks" none: "Er zijn op dit moment geen webhooks." @@ -3704,6 +3729,7 @@ nl: is_default: "Thema is standaard ingeschakeld" user_selectable: "Thema kan door gebruikers worden geselecteerd" color_scheme_user_selectable: "Kleurenschema kan door gebruikers worden geselecteerd" + auto_update: "Automatisch bijwerken wanneer Discourse wordt bijgewerkt" color_scheme: "Kleurenpalet" default_light_scheme: "Licht (standaard)" color_scheme_select: "Kleuren die door thema worden gebruikt selecteren" @@ -3777,6 +3803,7 @@ nl: check_for_updates: "Controleren op updates" updating: "Bijwerken..." up_to_date: "Thema is up-to-date, laatst gecontroleerd:" + has_overwritten_history: "De huidige themaversie bestaat niet meer, omdat de Git-geschiedenis door een afgedwongen push is overschreven." add: "Toevoegen" theme_settings: "Thema-instellingen" no_settings: "Dit thema heeft geen instellingen." @@ -4470,6 +4497,7 @@ nl: more_than_50_results: "Er zijn meer dan 50 resultaten. Verfijn uw zoekopdracht." settings: show_overriden: "Alleen aangepaste tonen" + history: "Wijzigingsoverzicht bekijken" reset: "terugzetten" none: "geen" site_settings: diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml index 0979416c04..ce6b8c3cae 100644 --- a/config/locales/client.pl_PL.yml +++ b/config/locales/client.pl_PL.yml @@ -3751,6 +3751,10 @@ pl_PL: sync_sso: Synchronizuj użytkownika za pomocą logowania SSO. show: Uzyskaj informacje o użytkowniku. check_emails: Lista adresów e-mail użytkowników. + update: Zaktualizuj informacje o profilu użytkownika. + log_out: Wyloguj wszystkie sesje użytkownika. + anonymize: Anonimizuj konta użytkowników. + delete: Usuń konta użytkowników. email: receive_emails: Połącz ten zakres z odbiorcą poczty w celu przetwarzania przychodzących wiadomości e-mail. web_hooks: diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml index 31f9ce813a..4418520ea5 100644 --- a/config/locales/client.ru.yml +++ b/config/locales/client.ru.yml @@ -193,12 +193,12 @@ ru: enabled: "Закрепил тему глобально %{when}" disabled: "Открепил тему глобально %{when}" visible: - enabled: "Включил в списки %{when}" - disabled: "Исключил из списков %{when}" + enabled: "Включил отображение темы %{when}" + disabled: "Выключил отображение темы %{when}" banner: enabled: "Создал объявление %{when}. Оно будет отображаться вверху каждой страницы пока пользователь не закроет его." disabled: "Удалил объявление %{when}. Оно больше не будет отображаться в верхней части каждой страницы." - forwarded: "переадресовал вышеуказанное письмо" + forwarded: "Переадресовал вышеуказанное письмо" topic_admin_menu: "Действия администратора над темой" wizard_required: "Добро пожаловать в ваш новый Discourse! Начните с мастера настройки ✨" emails_are_disabled: "Все исходящие письма были глобально отключены администратором. Уведомления любого вида не будут отправляться на почту." @@ -1400,6 +1400,7 @@ ru: max_redemptions_allowed_label: "Сколько человек могут зарегистрироваться по этой ссылке?" expires_at: "Когда истечёт срок действия этой ссылки?" bulk_invite: + none: "Нет приглашений для отображения на этой странице." text: "Массовое приглашение" success: "Файл успешно загружен, вы получите сообщение, когда процесс будет завершён." error: "Извините, но файл должен быть в формате CSV." @@ -2205,7 +2206,7 @@ ru: top: "Нет обсуждаемых тем." educate: new: '

Здесь появятся ваши новые темы. По умолчанию темы считаются новыми, и они обозначаются индикатором , если темы были созданы за последние 2 дня.

Посетите раздел ''Уведомления'' на страниценастроек, если вы хотите изменить этот период.

' - unread: '

Ваши непрочитанные темы скоро появятся тут.

По умолчанию темы получают счётчик 1, если:

Вы можете изменить настройки уведомлений в нижней части каждой темы.

При необходимости вы можете изменить стандартные параметры уведомлений в настройках профиля пользователя.

' + unread: '

Ваши непрочитанные темы скоро появятся тут.

По умолчанию темы получают счётчик 1, если:

Вы можете изменить настройки уведомлений в нижней части каждой темы.

При необходимости вы можете изменить стандартные параметры уведомлений в настройках профиля пользователя.

' bottom: latest: "Обновлённых тем больше нет." posted: "Новых тем больше нет." @@ -2460,8 +2461,8 @@ ru: unpin: "Открепить тему..." unarchive: "Разархивировать тему" archive: "Архивировать тему" - invisible: "Исключить из списков" - visible: "Включить в списки" + invisible: "Скрыть тему" + visible: "Показать тему" reset_read: "Сбросить счётчики" make_public: "Превратить в публичную тему" make_private: "Превратить в личное сообщение" @@ -3751,6 +3752,10 @@ ru: sync_sso: Синхронизация пользователя с использованием SSO. show: Получение информации о пользователе. check_emails: Список электронных писем пользователя. + update: Обновление информации в профиле пользователя. + log_out: Завершить все сессии пользователя. + anonymize: Анонимизация учетных записей пользователей. + delete: Удаление учетных записей пользователей. email: receive_emails: Объединение этой области действия с получателем почты для обработки входящих писем. web_hooks: diff --git a/config/locales/client.sl.yml b/config/locales/client.sl.yml index 1eeec351f9..ad4e106b70 100644 --- a/config/locales/client.sl.yml +++ b/config/locales/client.sl.yml @@ -2744,6 +2744,17 @@ sl: change_in_category_topic: "Uredi opis" already_used: "Ta barva je že uporabljena na drugi kategoriji." security: "Varnost" + security_add_group: "Dodaj skupino" + permissions: + group: "Skupina" + see: "Glej" + reply: "Odgovori" + create: "Ustvari" + no_groups_selected: "Dostop ni bil odobren nobeni skupini; ta kategorija bo vidna samo osebju." + everyone_has_access: "Ta kategorija je javna, vsi lahko vidijo, odgovarjajo in ustvarjajo objave. Če želite omejiti dovoljenja, odstranite eno ali več dovoljenj, dodeljenih skupini »vsi«." + toggle_reply: "Preklopi dovoljenje za odgovor" + toggle_full: "Preklopi dovoljenje za ustvarjanje" + inherited: "To dovoljenje je podedovano od \"vsi\"" special_warning: "Ta kategorija je prednastavljena, zato varnostnih nastavitev ni mogoče urejati. Če ne želite uporabljati te kategorije jo raje izbrišite kot uporabljajte v drug namen." uncategorized_security_warning: "Ta kategorija je posebna. Namenjena je za shranjevanje tem, ki nimajo kategorije. Zato ne more imeti varnostnih nastavitev." uncategorized_general_warning: 'Ta kategorija je posebna. Uporabi se kot privzeta kategorija za teme brez kategorije. Če hočete onemogočiti takšen način in hočete obvezno izbiro kategorije, potem onemogočite nastavitev tukaj. Če hočete spremeniti ime ali opis, pojdite Prilagodi / Vsebina besedila.' diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml index 65e8026417..12775ffc97 100644 --- a/config/locales/client.sv.yml +++ b/config/locales/client.sv.yml @@ -3484,6 +3484,10 @@ sv: sync_sso: Synkronisera en användare genom SSO. show: Erhåll information om en användare. check_emails: Lista användares e-post. + update: Uppdatera information om användarprofil. + log_out: Logga ut alla sessioner för en användare. + anonymize: Anonymisera användarkonton. + delete: Ta bort användarkonton. email: receive_emails: Kombinera detta omfång med e-postmottagaren för att bearbeta inkommande e-post. web_hooks: diff --git a/config/locales/client.vi.yml b/config/locales/client.vi.yml index e4e5cbea3c..536f1b07ce 100644 --- a/config/locales/client.vi.yml +++ b/config/locales/client.vi.yml @@ -3352,6 +3352,9 @@ vi: sync_sso: Đồng bộ hóa người dùng bằng SSO. show: Nhận thông tin về người dùng. check_emails: Liệt kê các email của người dùng. + update: Cập nhật thông tin hồ sơ người dùng. + anonymize: Ẩn danh tài khoản người dùng. + delete: Xóa tài khoản người dùng. web_hooks: title: "Webhooks" none: "Không có webhook nào ngay bây giờ." diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml index edc7797b09..c3ccf16682 100644 --- a/config/locales/client.zh_CN.yml +++ b/config/locales/client.zh_CN.yml @@ -3350,6 +3350,10 @@ zh_CN: sync_sso: 使用 SSO 同步用户。 show: 获取有关用户的信息。 check_emails: 列出用户电子邮件。 + update: 更新用户个人资料信息。 + log_out: 注销用户的所有会话。 + anonymize: 匿名用户帐户。 + delete: 删除用户帐户。 email: receive_emails: 将此范围与邮件收件人结合起来处理传入的电子邮件。 web_hooks: @@ -3663,6 +3667,7 @@ zh_CN: check_for_updates: "检查更新" updating: "更新…" up_to_date: "主题已经是最新版本,上次检查:" + has_overwritten_history: "当前主题版本不再存在,因为 Git 历史记录已被强制推送覆盖。" add: "添加" theme_settings: "主题设置" no_settings: "这个主题内没有设置" diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index 15ffbd28f3..bd41192715 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -260,6 +260,7 @@ de: email_template_cant_be_modified: "Diese E-Mail-Vorlag kann nicht bearbeitet werden." invalid_whisper_access: "Enweder ist Flüstern nicht aktiviert oder du hast keinen Zugang zu Flüster-Beiträgen" not_in_group: + title_topic: "Um dieses Thema zu sehen, musst du die Mitgliedschaft der Gruppe '%{group}' beantragen." title_category: "Du musst in einer Gruppe sein um diese Kategorie zu sehen." request_membership: "Mitgliedschaft anfordern" join_group: "Gruppe beitreten" @@ -1461,7 +1462,7 @@ de: ga_version: "Zu verwendende Version von Google Universal Analytics: v3 (analyse.js), v4 (gtag)" ga_universal_tracking_code: "Google Universal Analytics Tracking-Code-ID, z. B.: UA-12345678-9; siehe https://google.com/analytics" ga_universal_domain_name: "Google Universal Analytics Domainname, z. B.: mysite.com; siehe https://google.com/analytics" - ga_universal_auto_link_domains: "Aktiviere die domänenübergreifende Verfolgung von Google Universal Analytics. Bei ausgehenden Links zu diesen Domänen wird die Client-ID hinzugefügt. Siehe Googles Cross-Domain-Tracking-Handbuch." + ga_universal_auto_link_domains: "Aktiviere die domänenübergreifende Verfolgung von Google Universal Analytics. Bei ausgehenden Links zu diesen Domänen wird die Client-ID hinzugefügt. Siehe Googles Cross-Domain-Tracking-Handbuch." gtm_container_id: "Google Tag Manager Container-ID. z.B.: GTM-ABCDEF.
Hinweis: Skripte von Drittanbietern, die von GTM geladen werden, müssten in der 'content security policy script src' Liste erlaubt werden." enable_escaped_fragments: "Als Fallback die Ajax-Crawling-API von Google verwenden, wenn keine Suchmaschine deaktiviert wurde. Siehe https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" moderators_manage_categories_and_groups: "Moderatoren erlauben, Kategorien und Gruppen zu verwalten" diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index 9b0711f7bc..d3dd1736d2 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -272,6 +272,7 @@ he: email_template_cant_be_modified: "לא ניתן לערוך את תבנית הדוא״ל הזו" invalid_whisper_access: "או שלחישות אינן פעילות או שאין לך גישה ליצור פוסטים של לחישות" not_in_group: + title_topic: "עליך לבקש חברות בקבוצה ‚%{group}’ כדי לצפות בנושא הזה." title_category: "עליך להיות בקבוצה כדי לצפות בקטגוריה זו." request_membership: "בקשת חברות" join_group: "הצטרפות לקבוצה" diff --git a/config/locales/server.it.yml b/config/locales/server.it.yml index 7da8f3d359..ba8b5e8d04 100644 --- a/config/locales/server.it.yml +++ b/config/locales/server.it.yml @@ -200,6 +200,9 @@ it: onebox: invalid_address: "Purtroppo è stato impossibile creare un'anteprima per questa pagina, perché non è stato trovato il server '%{hostname}'. Nel tuo post apparirà solo un link senza anteprima. :cry:" error_response: "Purtroppo è stato impossibile creare un'anteprima per questa pagina, perché il server ha dato un codice d'errore %{status_code}. Nel tuo post apparirà solo un link senza anteprima. :cry:" + missing_data: + one: "Siamo spiacenti, non è stato possibile generare un'anteprima per questa pagina web perché non è stato trovato il seguente tag oEmbed / OpenGraph: %{missing_attributes}" + other: "Siamo spiacenti, non è stato possibile generare un'anteprima per questa pagina web, perché i seguenti tag oEmbed / OpenGraph non sono stati trovati: %{missing_attributes}" word_connector: comma: ", " invite: @@ -257,6 +260,7 @@ it: email_template_cant_be_modified: "Questo modello di email non può essere modificato." invalid_whisper_access: "I sussurri non sono abilitati oppure non hai i permessi per creare sussurri" not_in_group: + title_topic: "Devi richiedere l'iscrizione al gruppo \"%{group}\" per visualizzare questo argomento." title_category: "Devi essere in un gruppo per vedere questa categoria." request_membership: "Richiedi di Iscrizione" join_group: "Unisciti al Gruppo" @@ -868,6 +872,7 @@ it: others: "Nessuna attività." no_bookmarks: self: "Non hai aggiunto messaggi nei segnalibri. I segnalibri ti consentono di accedere velocemente a specifici messaggi." + search: "Nessun segnalibro trovato con la query di ricerca fornita." others: "Nessun segnalibro." no_likes_given: self: "Non hai messo \"Mi piace\" ad alcun messaggio." @@ -1307,14 +1312,14 @@ it: dashboard: rails_env_warning: "Il tuo server è in modalità %{env}." host_names_warning: "Il tuo file config/database.yml usa l'hostname di default: localhost. Aggiornalo con l'hostname del tuo sito." - sidekiq_warning: 'Sidekiq non è in esecuzione. Molte attività, come l''invio di email, sono eseguite in maniera asincrona da sidekiq. Assicurati che almeno un processo sidekiq sia in esecuzione. Leggi altro su Sidekiq qui.' + sidekiq_warning: 'Sidekiq non è in esecuzione. Molte attività, come l''invio di email, sono eseguite in maniera asincrona da sidekiq. Assicurati che almeno un processo sidekiq sia in esecuzione. Leggi altro su Sidekiq.' queue_size_warning: "Il numero di job in coda è %{queue_size}, il che è alto. Ciò potrebbe indicare un problema con i processi Sidekiq, oppure devi aggiungere altri worker Sidekiq." memory_warning: "Il tuo server gira con meno di 1 GB di memoria. Si raccomanda almeno 1 GB di memoria." - google_oauth2_config_warning: 'Il server è configurato per permettere l''iscrizione e il login con Google Oauth2 (enable_google_oauth2_logins), ma il client id e il client secret non sono impostati. Vai nelle Impostazioni del sito e aggiornale. Per ulteriori informazioni segui questa guida.' - facebook_config_warning: 'Il server è configurato per consentire l''iscrizione e il login con Facebook (enable_facebook_logins), ma l''app id e l''app secret non sono impostati. Vai nelle Impostazioni del sito e aggiornale. Vedi questa guida per saperne di più .' - twitter_config_warning: 'Il server è configurato per consentire la registrazione e l''accesso con Twitter (enable_twitter_logins), ma la chiave e i valori segreti non sono impostati. Vai alle Impostazioni del Sito e aggiorna le impostazioni. Vedi questa guida per saperne di più.' - github_config_warning: 'Il server è configurato per consentire la registrazione e l''accesso con GitHub (enable_github_logins), ma l''id client e i valori segreti non sono impostati. Vai alle Impostazioni del Sito e aggiorna le impostazioni. Vedi questa guida per saperne di più.' - s3_config_warning: 'Il server è configurato per caricare file su S3, ma almeno una delle seguenti impostazioni non è impostata: s3_access_key_id, s3_secret_access_key, s3_use_iam_profile o s3_upload_bucket. Vai a Impostazioni sito e aggiorna le impostazioni. Vedi "How to set up image uploads to S3?" per saperne di più' + google_oauth2_config_warning: 'Il server è configurato per permettere la registrazione e l''accesso con Google Oauth2 (enable_google_oauth2_logins), ma l''id e il secret del client non sono impostati. Vai nelle Impostazioni del sito e aggiornale. Per ulteriori informazioni segui questa guida.' + facebook_config_warning: 'Il server è configurato per consentire la registrazione e l''accesso con Facebook (enable_facebook_logins), ma l''id e il secret dell''app non sono impostati. Vai nelle Impostazioni del sito e aggiornale. Vedi questa guida per saperne di più .' + twitter_config_warning: 'Il server è configurato per consentire la registrazione e l''accesso con Twitter (enable_twitter_logins), ma la chiave e il secret non sono impostati. Vai alle Impostazioni del sito e aggiorna le impostazioni. Vedi questa guida per saperne di più.' + github_config_warning: 'Il server è configurato per consentire la registrazione e l''accesso con GitHub (enable_github_logins), ma l''id e il secret del client non sono impostati. Vai alle Impostazioni del sito e aggiorna le impostazioni. Vedi questa guida per saperne di più.' + s3_config_warning: 'Il server è configurato per caricare file su S3, ma almeno una delle seguenti impostazioni non è impostata: s3_access_key_id, s3_secret_access_key, s3_use_iam_profile o s3_upload_bucket. Vai alle Impostazioni sito e aggiorna le impostazioni. Vedi "How to set up image uploads to S3?" per saperne di più' s3_backup_config_warning: 'Il server è configurato per caricare i backup su S3, ma almeno una delle seguenti impostazioni non è impostata: s3_access_key_id, s3_secret_access_key, s3_use_iam_profile o s3_backup_bucket. Vai a Impostazioni sito e aggiorna le impostazioni. Vedi ""How to set up image uploads to S3?" per saperne di più' image_magick_warning: 'Il server è configurato per creare miniature di immagini di grandi dimensioni, ma ImageMagick non è installato. Installa ImageMagick usando il tuo gestore di pacchetti preferito o scarica l''ultima versione .' failing_emails_warning: 'Ci sono %{num_failed_jobs} job di posta elettronica che sono falliti. Controlla il tuo app.yml e assicurati che le impostazioni del server di posta siano corrette. Vedi i job falliti in Sidekiq .' @@ -1402,6 +1407,7 @@ it: enable_inline_onebox_on_all_domains: "Ignora l'impostazione del sito inline_onebox_domain_allowlist e consenti onebox in linea per tutti i domini." force_custom_user_agent_hosts: "Host per i quali utilizzare l'user agent onebox personalizzato su tutte le richieste. (Particolarmente utile per gli host che limitano l'accesso da parte dell'user agent)." max_oneboxes_per_post: "Numero massimo di oneboxe in un messaggio." + facebook_app_access_token: "Un token generato dall' ID e dal secret della tua app Facebook. Utilizzato per generare onebox di Instagram." logo: "L'immagine del logo in alto a sinistra del tuo sito. Utilizzare un'immagine rettangolare ampia con un'altezza di 120 e un rapporto di forma superiore a 3: 1. Se lasciato vuoto, verrà mostrato il testo del titolo del sito." logo_small: "La piccola immagine del logo in alto a sinistra del tuo sito, vista quando scorri verso il basso. Usa un'immagine quadrata di 120 × 120. Se lasciato vuoto, verrà mostrato un simbolo Home." digest_logo: "L'immagine del logo alternativo utilizzata nella parte superiore del riepilogo dell'email del tuo sito. Usa un'immagine a rettangolo largo. Non usare un'immagine SVG. Se lasciato vuoto, verrà utilizzata l'immagine dall'impostazione `logo`." @@ -1430,6 +1436,7 @@ it: enable_personal_messages: "Autorizza gli utenti con livello di esperienza 1 (configurabile attraverso \"min livello di esperienza per l'invio di messaggi\") a creare e rispondere ai messaggi. Nota che lo staff può inviare messaggi in ogni caso." enable_system_message_replies: "Consente agli utenti di rispondere ai messaggi di sistema, anche se i messaggi personali sono disabilitati" enable_long_polling: "Il message bus per le notifiche può usare il long polling" + enable_chunked_encoding: "Abilita le risposte di codifica in blocchi dal server. Questa funzione funziona sulla maggior parte delle configurazioni, tuttavia alcuni proxy possono eseguire il buffer, provocando un ritardo nelle risposte" long_polling_base_url: "URL di base usato per il long polling (quando una CDN serve contenuto dinamico, bisogna impostarlo come origin pull) es. http://origin.site.com" long_polling_interval: "Tempo di attesa prima che il server risponda ai client che non ci sono dati da trasmettere (solo per utenti autenticati)" polling_interval: "Se non si esegue il long polling, quanto spesso i client autenticati devono fare poll in millisecondi" @@ -1457,9 +1464,14 @@ it: post_undo_action_window_mins: "Numero di minuti durante i quali gli utenti possono annullare le loro azioni recenti su un messaggio (segnalazioni, Mi piace, ecc.)." must_approve_users: "Lo staff deve approvare tutti i nuovi account utente prima che essi possano accedere al sito." invite_code: "L'utente deve digitare questo codice per consentire la registrazione dell'account, ignorato quando vuoto (senza distinzione tra maiuscole e minuscole)" + approve_suspect_users: "Aggiungi utenti sospetti alla coda di revisione. Gli utenti sospetti hanno inserito una biografia o un sito web ma non hanno attività di lettura." pending_users_reminder_delay: "Notifica i moderatori se nuovi utenti sono in attesa di approvazione per più di queste ore. Imposta a -1 per disabilitare le notifiche." + persistent_sessions: "Gli utenti rimarranno connessi alla chiusura del browser" maximum_session_age: "L'utente resterà connesso per n ore dall'ultima visita" ga_version: "Versione di Google Universal Analytics da usare: v3 (analytics.js), v4 (gtag)" + ga_universal_tracking_code: "ID del codice di monitoraggio di Google Universal Analytics, ad esempio: UA-12345678-9; vedi https://google.com/analytics" + ga_universal_domain_name: "Nome del dominio di Google Universal Analytics, ad esempio: mysite.com; vedi https://google.com/analytics" + ga_universal_auto_link_domains: "Abilita il monitoraggio tra domini di Google Universal Analytics. I collegamenti in uscita a questi domini avranno l'ID del client aggiunto. Vedi Impostare il monitoraggio interdominio." enable_escaped_fragments: "Tornare all'API Ajax-Crawling di Google se non viene rilevato alcun webcrawler. Vedi https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" moderators_manage_categories_and_groups: "Permetti ai moderatori di gestire categorie e gruppi" cors_origins: "Origini permesse per richieste cross-origin (CORS). Ogni origine deve includere http:// o https://. La variabile d'ambiente DISCOURSE_ENABLE_CORS deve essere impostata come true per abilitare CORS." @@ -1498,7 +1510,7 @@ it: allow_index_in_robots_txt: "Specifica in robots.txt che questo sito permette l'indicizzazione da parte dei motori di ricerca. In casi eccezionali puoi permanentemente ignorare robots.txt." hide_email_address_taken: "Durante l'iscrizione e nel modulo per la password dimenticata, non informare gli utenti che già esiste un account con un dato indirizzo email." log_out_strict: "Quando ci si disconnette, esci da TUTTE le sessioni dell'utente su tutti i dispositivi" - version_checks: "Controlla in Pinga Discourse la presenza di aggiornamenti della versione e mostra i nuovi messaggi nel Cruscotto / admin" + version_checks: "Controlla in Discourse Hub la presenza di aggiornamenti della versione e mostra i messaggi della nuova versione nel cruscotto / di amministrazione" new_version_emails: "Invia un'email all'indirizzo contact_email quando è disponibile una nuova versione di Discourse." invite_expiry_days: "Per quanti giorni le chiavi per inviti utente sono valide" invite_only: "Tutti i nuovi utenti devono essere invitati esplicitamente da utenti o dallo Staff. La registrazione pubblica è disabilitata." @@ -1546,7 +1558,7 @@ it: twitter_consumer_secret: "Consumer secret per l'autenticazione Twitter, registrato su https://developer.twitter.com/apps" enable_facebook_logins: "Abilita l'autenticazione di Facebook, richiede facebook_app_id e facebook_app_secret. Vedi Configurazione dell'accesso a Facebook per Discourse ." facebook_app_id: "Id dell'app per l'autenticazione e la condivisione di Facebook, registrata su https://developers.facebook.com/apps" - facebook_app_secret: "App secret per l'autenticazione di Facebook, registrato su https://developers.facebook.com/apps" + facebook_app_secret: "Secret per l'autenticazione dell'app di Facebook, registrato su https://developers.facebook.com/apps" enable_github_logins: "Abilita l'autenticazione GitHub, richiede github_client_id e github_client_secret. Vedi Configuring GitHub login for Discourse." github_client_id: "Client id per l'autenticazione di GitHub, registrato su https://github.com/settings/developers" github_client_secret: "Client secret per l'autenticazione di GitHub, registrato su https://github.com/settings/developers" @@ -2010,7 +2022,7 @@ it: timeout_expired: "Il tempo di connessione dell'account è scaduto, prova a connetterti di nuovo." no_email: "Nessun indirizzo email è stato fornito. Si prega di contattare l'amministratore del sito." email_error: "Non è possibile registrare un account con l'indirizzo email %{email}. Si prega di contattare l'amministratore del sito." - missing_secret: "L'autenticazione SSO è fallita a causa di un segreto mancante. Contatta gli amministratori del sito per risolvere il problema." + missing_secret: "L'autenticazione SSO è fallita a causa di un secret mancante. Contatta gli amministratori del sito per risolvere il problema." original_poster: "Autore iniziale" most_posts: "Maggioranza Messaggi" most_recent_poster: "Autore più recente" @@ -3874,7 +3886,7 @@ it: post_count: "I primi messaggi di ogni utente devono essere approvati dallo staff. Vedi 'approve_post_count'." trust_level: "Le risposte degli utenti con un basso Livello di Esperienza devono essere approvate dallo Staff. Vedi `approve_unless_trust_level`." new_topics_unless_trust_level: "Gli Argomenti di utenti con basso Livello Esperienza devono essere approvati dallo staff. Vedi `approve_new_topics_unless_trust_level`." - fast_typer: "Il nuovo utente ha digitato il suo primo post in modo sospettosamente rapido, sembrerebbe un comportamento di bot o spammer. Vedi `min_first_post_typing_time`." + fast_typer: "Il nuovo utente ha digitato il suo primo messaggio in modo sospettosamente rapido, sembrerebbe il comportamento di un bot o di uno spammer. Vedi `min_first_post_typing_time`." auto_silence_regexp: "Nuovo utente il cui primo post corrisponde all'impostazione `auto_silence_first_post_regex`." watched_word: "Questo post include una parola monitorata. Guarda il tuo elenco di parole monitorate ." staged: "Nuovi argomenti e post per gli Utenti Temporanei devono essere approvati dallo staff. Vedi `approve_unless_staged`." diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml index e0f31e01c1..4231902892 100644 --- a/config/locales/server.ko.yml +++ b/config/locales/server.ko.yml @@ -190,6 +190,13 @@ ko: cannot_enable_s3_uploads_when_s3_enabled_globally: "S3 업로드가 이미 전체적으로 활성화되어 있으므로이 사이트 수준을 활성화하면 S3 업로드를 활성화 할 수 없습니다." cors_origins_should_not_have_trailing_slash: "CORS 원점에 후행 슬래시 (/) 를 추가해서는 안됩니다." conflicting_google_user_id: '이 계정의 Google 계정 ID가 변경되었습니다. 보안상의 이유로 직원의 개입이 필요합니다. 직원에게 연락하여
https://meta.discourse.org/t/76575' + onebox: + invalid_address: "죄송합니다. '%{hostname}'서버를 찾을 수 없어 웹 페이지에 대한 미리보기를 생성 할 수 없습니다. 미리보기 대신 게시물에 링크만 표시됩니다. :cry:" + error_response: "죄송합니다. 웹 서버에서 오류 코드 %{status_code} 를 반환했기 때문에 웹 페이지에 대한 미리보기를 생성 할 수 없습니다. 미리보기 대신 게시물에 링크만 표시됩니다. :cry:" + missing_data: + other: "죄송합니다. 다음 oEmbed / OpenGraph 태그를 찾을 수 없어 웹 페이지에 대한 미리보기를 생성 할 수 없습니다: %{missing_attributes}" + word_connector: + comma: ", " invite: expired: "초대 토큰이 만료되었습니다. 관리자에게 문의하십시오." not_found: "초대 토큰이 유효하지 않습니다. 직원에게 문의 하십시오." @@ -245,6 +252,7 @@ ko: email_template_cant_be_modified: "이 이메일 템플릿은 수정할 수 없습니다" invalid_whisper_access: "속삭임이 활성화되어 있지 않거나 속삭임 게시물을 작성할 수있는 권한이 없습니다" not_in_group: + title_topic: "이 항목을 보려면 '%{group}' 그룹의 가입을 요청해야 합니다." title_category: "이 카테고리를 보려면 그룹에 속해 있어야합니다." request_membership: "회원 신청" join_group: "그룹 참여하기" diff --git a/config/locales/server.nl.yml b/config/locales/server.nl.yml index 0e4faff060..8104f21a0c 100644 --- a/config/locales/server.nl.yml +++ b/config/locales/server.nl.yml @@ -39,6 +39,7 @@ nl: title: "Discourse" topics: "Topics" posts: "berichten" + views: "weergaven" loading: "Laden" powered_by_html: 'Mogelijk gemaakt door Discourse, best bekeken met JavaScript ingeschakeld' sign_up: "Registreren" @@ -191,6 +192,14 @@ nl: cannot_enable_s3_uploads_when_s3_enabled_globally: "U kunt geen S3-uploads inschakelen, omdat S3-uploads al globaal zijn ingeschakeld, en inschakelen hiervan op websiteniveau kan kritieke problemen met uploads veroorzaken" cors_origins_should_not_have_trailing_slash: "U dient geen schuine streep (/) toe te voegen aan CORS-domeinen." conflicting_google_user_id: 'De Google-account-ID voor deze account is gewijzigd; om beveiligingsredenen is stafinterventie vereist. Neem contact op met een staflid en wijs hem of haar op
https://meta.discourse.org/t/76575' + onebox: + invalid_address: "Sorry, we konden geen voorbeeld voor deze webpagina genereren, omdat de server '%{hostname}' niet kon worden gevonden. In plaats van een voorbeeld verschijnt alleen een koppeling in uw bericht. :cry:" + error_response: "Sorry, we konden geen voorbeeld voor deze webpagina genereren, omdat de webserver een foutcode %{status_code} heeft geretourneerd. In plaats van een voorbeeld verschijnt alleen een koppeling in uw bericht. :cry:" + missing_data: + one: "Sorry, we konden geen voorbeeld voor deze webpagina genereren, omdat de volgende tag oEmbed / OpenGraph niet kon worden gevonden: %{missing_attributes}" + other: "Sorry, we konden geen voorbeeld voor deze webpagina genereren, omdat de volgende tags oEmbed / OpenGraph niet konden worden gevonden: %{missing_attributes}" + word_connector: + comma: ", " invite: expired: "Uw uitnodigingstoken is verlopen. Neem contact op met een staflid." not_found: "Uw uitnodigingstoken is ongeldig. Neem contact op met een staflid." @@ -846,6 +855,7 @@ nl: others: "Geen activiteit." no_bookmarks: self: "U hebt geen bladwijzers voor berichten; via bladwijzers kunt u snel bepaalde berichten raadplegen." + search: "Geen bladwijzers gevonden met de opgegeven zoekopdracht." others: "Geen bladwijzers." no_likes_given: self: "U hebt geen berichten geliket." @@ -1377,6 +1387,7 @@ nl: enable_inline_onebox_on_all_domains: "Website-instelling inline_onebox_domain_allowlist negeren en inline onebox op alle domeinen toestaan." force_custom_user_agent_hosts: "Hosts waarvoor bij alle aanvragen de aangepaste onebox-useragent wordt gebruikt. (Met name handig voor hosts die toegang beperken via de useragent)." max_oneboxes_per_post: "Maximale aantal oneboxes in een bericht." + facebook_app_access_token: "Een token, gegenereerd op basis van uw Facebook-app-ID en -geheim. Gebruikt om Instagram-oneboxes te genereren." logo: "De logoafbeelding links bovenaan op uw website. Gebruik een brede rechthoekige afbeelding met een hoogte van 120 en een hoogte-breedteverhouding groter dan 3:1. Bij leeg laten wordt de titeltekst van de website getoond." logo_small: "De kleine logoafbeelding links bovenaan op uw website, zichtbaar bij omlaag scrollen. Gebruik een vierkante afbeelding van 120 × 120. Bij leeg laten wordt een startpaginasymbool getoond." digest_logo: "De alternatieve logoafbeelding bovenaan de e-mailsamenvatting van uw website. Gebruik een brede rechthoekige afbeelding. Gebruik geen SVG-afbeelding. Bij leeg laten wordt de afbeelding van de instelling `logo` gebruikt." @@ -1632,7 +1643,11 @@ nl: min_trust_to_send_messages: "Het minimale vertrouwensniveau dat nodig is om nieuwe persoonlijke berichten te maken." min_trust_to_flag_posts: "Het minimale vertrouwensniveau dat nodig is om berichten te markeren" min_trust_to_post_links: "Het minimale vertrouwensniveau dat nodig is om koppelingen in berichten op te nemen" + min_trust_to_post_embedded_media: "Het minimale vertrouwensniveau dat nodig is om media-items in een bericht in te bedden" + min_trust_level_to_allow_profile_background: "Het minimale vertrouwensniveau dat nodig is om een profielachtergrond te uploaden" + min_trust_level_to_allow_user_card_background: "Het minimale vertrouwensniveau dat nodig is om een gebruikerskaartachtergrond te uploaden" min_trust_level_to_allow_invite: "Het minimale vertrouwensniveau dat nodig is om gebruikers uit te nodigen" + min_trust_level_to_allow_ignore: "Het minimale vertrouwensniveau dat nodig is om gebruikers te negeren" newuser_max_links: "Hoeveel koppelingen een nieuwe gebruiker aan een bericht kan toevoegen." newuser_max_attachments: "Hoeveel bijlagen een nieuwe gebruiker aan een bericht kan toevoegen." newuser_max_mentions_per_post: "Maximale aantal @naam-vermeldingen dat een nieuwe gebruiker in een bericht kan gebruiken." diff --git a/config/locales/server.pl_PL.yml b/config/locales/server.pl_PL.yml index eaa43a2555..42541f146b 100644 --- a/config/locales/server.pl_PL.yml +++ b/config/locales/server.pl_PL.yml @@ -272,6 +272,7 @@ pl_PL: email_template_cant_be_modified: "Ten szablon e-mail nie może być zmodyfikowany" invalid_whisper_access: "Albo szepty nie są włączone, albo nie masz dostępu do tworzenia wpisów szeptanych" not_in_group: + title_topic: "Aby wyświetlić ten temat, musisz poprosić o członkostwo w grupie '%{group}'." title_category: "Musisz być w grupie, aby zobaczyć tę kategorię." request_membership: "Poproś o członkostwo" join_group: "Dołącz do grupy" diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml index 1ad86cef96..d4c3272191 100644 --- a/config/locales/server.ru.yml +++ b/config/locales/server.ru.yml @@ -272,6 +272,7 @@ ru: email_template_cant_be_modified: "Этот почтовый шаблон не может быть изменён" invalid_whisper_access: "Либо скрытые сообщения не разрешены, либо у вас нет прав на создание скрытых сообщений" not_in_group: + title_topic: "Вам нужно запросить членство в группе%{group}, чтобы увидеть эту тему." title_category: "Вы должны быть членом группы, чтобы видеть этот раздел" request_membership: "Запрос на включение в группу" join_group: "Присоединиться к группе" diff --git a/config/locales/server.sl.yml b/config/locales/server.sl.yml index ab5560ae95..7c39ca07ad 100644 --- a/config/locales/server.sl.yml +++ b/config/locales/server.sl.yml @@ -713,6 +713,7 @@ sl: out_of_date_themes: "Posodobitve so na voljo za naslednje prilagoditve:" site_settings: avatar_sizes: "Seznam samodejno ustvarjenih velikosti avatarjev." + min_trust_level_to_allow_ignore: "Najmanjša raven zaupanja, potrebna za prezrtje uporabnikov" search: within_post: "#%{post_number} od %{username}" types: diff --git a/config/locales/server.sv.yml b/config/locales/server.sv.yml index 451f42d1ae..5738422193 100644 --- a/config/locales/server.sv.yml +++ b/config/locales/server.sv.yml @@ -260,6 +260,7 @@ sv: email_template_cant_be_modified: "Den här e-postmallen kan inte ändras" invalid_whisper_access: "Antingen är viskningar inte aktiverade eller så har du inte behörighet för att skapa viskningsinlägg" not_in_group: + title_topic: "Du måste begära medlemskap i gruppen '%{group}' för att se detta ämne." title_category: "Du måste vara i en grupp för att se denna kategori." request_membership: "Begär medlemskap" join_group: "Gå med i grupp" diff --git a/config/locales/server.zh_CN.yml b/config/locales/server.zh_CN.yml index 17e5786ecc..bc2d8aa25f 100644 --- a/config/locales/server.zh_CN.yml +++ b/config/locales/server.zh_CN.yml @@ -254,6 +254,7 @@ zh_CN: email_template_cant_be_modified: "该邮件模板不能被修改" invalid_whisper_access: "没有启用密语或者是你无权创建密语帖子" not_in_group: + title_topic: "你需要请求加入 `%{group}` 群组才能查看此主题。" title_category: "你必须在群组中才能看到这个分类。" request_membership: "申请会员" join_group: "加入群组" diff --git a/plugins/discourse-presence/config/locales/client.he.yml b/plugins/discourse-presence/config/locales/client.he.yml index 4cb45f8c2a..12e89ebdfe 100644 --- a/plugins/discourse-presence/config/locales/client.he.yml +++ b/plugins/discourse-presence/config/locales/client.he.yml @@ -18,7 +18,7 @@ he: many: "מתבצעות עריכות" other: "מתבצעות עריכות" replying_to_topic: - one: "תגובה" - two: "תגובה" - many: "תגובה" - other: "תגובה" + one: "תגובה מוקלדת" + two: "תגובות מוקלדות" + many: "תגובה מוקלדת" + other: "תגובות מוקלדות" From d1d87b6fa3f8279bb35d264c997d37a185aa75d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Tue, 1 Dec 2020 18:20:43 +0100 Subject: [PATCH 003/393] FIX: show/hide ignored users preferences (#11386) * FIX: show/hide ignored users preferences based on the current user trust level and the appropriate site setting. * Allow us to await the `updateCurrentUser` call Co-authored-by: Robin Ward --- .../app/controllers/preferences/users.js | 12 ++++++--- .../tests/acceptance/preferences-test.js | 27 +++++++++++++++++++ .../discourse/tests/helpers/qunit-helpers.js | 6 +++-- config/site_settings.yml | 1 + 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/users.js b/app/assets/javascripts/discourse/app/controllers/preferences/users.js index f4b1173c02..c7311d5630 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/users.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/users.js @@ -1,5 +1,5 @@ import { makeArray } from "discourse-common/lib/helpers"; -import { alias, gte, or, and } from "@ember/object/computed"; +import { alias, or, and } from "@ember/object/computed"; import { action, computed } from "@ember/object"; import Controller from "@ember/controller"; import { popupAjaxError } from "discourse/lib/ajax-error"; @@ -7,8 +7,14 @@ import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend({ ignoredUsernames: alias("model.ignored_usernames"), - userIsMemberOrAbove: gte("model.trust_level", 2), - ignoredEnabled: or("userIsMemberOrAbove", "model.staff"), + + @discourseComputed("model.trust_level") + userCanIgnore(trustLevel) { + return trustLevel >= this.siteSettings.min_trust_level_to_allow_ignore; + }, + + ignoredEnabled: or("userCanIgnore", "model.staff"), + allowPmUsersEnabled: and( "model.user_option.enable_allowed_pm_users", "model.user_option.allow_private_messages" diff --git a/app/assets/javascripts/discourse/tests/acceptance/preferences-test.js b/app/assets/javascripts/discourse/tests/acceptance/preferences-test.js index 5b3cc7cb4e..2a3ca2dcc2 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/preferences-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/preferences-test.js @@ -479,3 +479,30 @@ acceptance( }); } ); + +acceptance("Ignored users", function (needs) { + needs.user(); + needs.settings({ min_trust_level_to_allow_ignore: 1 }); + + test("when trust level < min level to ignore", async function (assert) { + await visit(`/u/eviltrout/preferences/users`); + await updateCurrentUser({ trust_level: 0, moderator: false, admin: false }); + + assert.ok( + !exists(".user-ignore"), + "it does not show the list of ignored users" + ); + }); + + test("when trust level >= min level to ignore", async function (assert) { + await visit(`/u/eviltrout/preferences/users`); + await updateCurrentUser({ trust_level: 1 }); + assert.ok(exists(".user-ignore"), "it shows the list of ignored users"); + }); + + test("staff can always see ignored users", async function (assert) { + await visit(`/u/eviltrout/preferences/users`); + await updateCurrentUser({ moderator: true }); + assert.ok(exists(".user-ignore"), "it shows the list of ignored users"); + }); +}); diff --git a/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js b/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js index d84e32a5eb..6ac0547949 100644 --- a/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js +++ b/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js @@ -1,6 +1,6 @@ import { Promise } from "rsvp"; import { isEmpty } from "@ember/utils"; -import { later } from "@ember/runloop"; +import { run, later } from "@ember/runloop"; import sessionFixtures from "discourse/tests/fixtures/session-fixtures"; import HeaderComponent from "discourse/components/site-header"; import { forceMobile, resetMobile } from "discourse/lib/mobile"; @@ -44,7 +44,9 @@ export function currentUser() { } export function updateCurrentUser(properties) { - User.current().setProperties(properties); + run(() => { + User.current().setProperties(properties); + }); } // Note: do not use this in acceptance tests. Use `loggedIn: true` instead diff --git a/config/site_settings.yml b/config/site_settings.yml index 192200d10f..4bea11f1b5 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -1422,6 +1422,7 @@ trust: min_trust_level_to_allow_ignore: default: 2 enum: "TrustLevelSetting" + client: true allow_flagging_staff: true send_tl1_welcome_message: true send_tl2_promotion_message: true From bbe5d8d5cf1220165842985c0e2cd4c454d501cd Mon Sep 17 00:00:00 2001 From: Roman Rizzi Date: Tue, 1 Dec 2020 15:31:26 -0300 Subject: [PATCH 004/393] DEV: Sort imports alphabetically (#11382) --- .eslintrc | 3 +- .../admin/addon/components/ace-editor.js | 2 +- .../addon/components/admin-backups-logs.js | 8 +- .../addon/components/admin-report-chart.js | 4 +- .../addon/components/admin-report-counts.js | 2 +- .../components/admin-report-stacked-chart.js | 4 +- .../components/admin-report-storage-stats.js | 6 +- .../components/admin-report-table-cell.js | 4 +- .../components/admin-report-table-header.js | 2 +- .../addon/components/admin-report-table.js | 4 +- .../admin/addon/components/admin-report.js | 20 +-- .../addon/components/admin-theme-editor.js | 4 +- .../addon/components/admin-user-field-item.js | 18 +-- .../addon/components/admin-watched-word.js | 4 +- .../admin-web-hook-event-chooser.js | 6 +- .../addon/components/admin-web-hook-event.js | 10 +- .../addon/components/admin-web-hook-status.js | 2 +- .../admin/addon/components/color-input.js | 6 +- .../addon/components/email-styles-editor.js | 4 +- .../admin/addon/components/embeddable-host.js | 14 +-- .../addon/components/embedding-setting.js | 2 +- .../addon/components/highlighted-code.js | 2 +- .../admin/addon/components/ip-lookup.js | 14 +-- .../addon/components/penalty-post-action.js | 4 +- .../admin/addon/components/permalink-form.js | 8 +- .../addon/components/report-filters/bool.js | 2 +- .../components/report-filters/category.js | 2 +- .../addon/components/report-filters/group.js | 2 +- .../addon/components/resumable-upload.js | 6 +- .../components/screened-ip-address-form.js | 6 +- .../addon/components/secret-value-list.js | 2 +- .../admin/addon/components/simple-list.js | 2 +- .../admin/addon/components/site-setting.js | 4 +- .../addon/components/site-settings/bool.js | 2 +- .../components/site-settings/category-list.js | 2 +- .../addon/components/site-settings/color.js | 2 +- .../components/site-settings/group-list.js | 2 +- .../components/site-settings/tag-list.js | 2 +- .../addon/components/site-text-summary.js | 2 +- .../addon/components/suspension-details.js | 4 +- .../admin/addon/components/tags-uploader.js | 4 +- .../addon/components/theme-setting-editor.js | 2 +- .../theme-setting-relatives-selector.js | 2 +- .../addon/components/theme-translation.js | 4 +- .../addon/components/themes-list-item.js | 8 +- .../admin/addon/components/themes-list.js | 4 +- .../admin/addon/components/value-list.js | 2 +- .../addon/components/watched-word-form.js | 14 +-- .../addon/components/watched-word-uploader.js | 6 +- .../addon/controllers/admin-api-keys-index.js | 2 +- .../addon/controllers/admin-api-keys-new.js | 4 +- .../addon/controllers/admin-api-keys-show.js | 4 +- .../addon/controllers/admin-backups-index.js | 8 +- .../addon/controllers/admin-backups-logs.js | 2 +- .../admin/addon/controllers/admin-backups.js | 2 +- .../addon/controllers/admin-badges-award.js | 4 +- .../addon/controllers/admin-badges-show.js | 14 +-- .../admin/addon/controllers/admin-badges.js | 2 +- .../admin-customize-colors-show.js | 4 +- .../controllers/admin-customize-colors.js | 6 +- .../admin-customize-email-style-edit.js | 4 +- .../admin-customize-email-templates-edit.js | 8 +- .../admin-customize-email-templates.js | 4 +- .../controllers/admin-customize-robots-txt.js | 2 +- .../admin-customize-themes-edit.js | 4 +- .../admin-customize-themes-show.js | 16 +-- .../controllers/admin-customize-themes.js | 2 +- .../controllers/admin-dashboard-general.js | 10 +- .../controllers/admin-dashboard-moderation.js | 4 +- .../controllers/admin-dashboard-reports.js | 4 +- .../addon/controllers/admin-dashboard.js | 6 +- .../addon/controllers/admin-email-bounced.js | 2 +- .../addon/controllers/admin-email-index.js | 6 +- .../controllers/admin-email-preview-digest.js | 4 +- .../addon/controllers/admin-email-received.js | 6 +- .../addon/controllers/admin-email-rejected.js | 6 +- .../addon/controllers/admin-email-sent.js | 2 +- .../addon/controllers/admin-email-skipped.js | 2 +- .../addon/controllers/admin-embedding.js | 2 +- .../admin/addon/controllers/admin-emojis.js | 4 +- .../controllers/admin-logs-screened-emails.js | 2 +- .../admin-logs-screened-ip-addresses.js | 12 +- .../controllers/admin-logs-screened-urls.js | 2 +- .../admin-logs-staff-action-logs.js | 4 +- .../addon/controllers/admin-permalinks.js | 8 +- .../admin/addon/controllers/admin-plugins.js | 2 +- .../addon/controllers/admin-reports-show.js | 2 +- .../controllers/admin-search-logs-index.js | 2 +- .../controllers/admin-search-logs-term.js | 2 +- .../admin-site-settings-category.js | 2 +- .../addon/controllers/admin-site-settings.js | 10 +- .../addon/controllers/admin-site-text-edit.js | 8 +- .../controllers/admin-site-text-index.js | 2 +- .../addon/controllers/admin-user-badges.js | 10 +- .../addon/controllers/admin-user-fields.js | 4 +- .../addon/controllers/admin-user-index.js | 18 +-- .../controllers/admin-users-list-show.js | 8 +- .../controllers/admin-watched-words-action.js | 12 +- .../addon/controllers/admin-watched-words.js | 10 +- .../admin-web-hooks-show-events.js | 4 +- .../addon/controllers/admin-web-hooks-show.js | 14 +-- .../addon/controllers/admin-web-hooks.js | 4 +- .../admin/addon/controllers/admin.js | 4 +- .../controllers/modals/admin-add-upload.js | 8 +- .../controllers/modals/admin-badge-preview.js | 2 +- .../modals/admin-edit-badge-groupings.js | 8 +- .../modals/admin-incoming-email.js | 4 +- .../controllers/modals/admin-install-theme.js | 10 +- .../modals/admin-merge-users-confirmation.js | 6 +- .../modals/admin-merge-users-prompt.js | 4 +- .../addon/controllers/modals/admin-reseed.js | 2 +- .../controllers/modals/admin-silence-user.js | 4 +- .../controllers/modals/admin-suspend-user.js | 4 +- .../modals/admin-uploaded-image-list.js | 2 +- .../modals/admin-watched-word-test.js | 2 +- .../admin/addon/helpers/check-icon.js | 2 +- .../admin/addon/helpers/disposition-icon.js | 2 +- .../admin/addon/helpers/post-action-title.js | 2 +- .../admin/addon/helpers/preserve-newlines.js | 2 +- .../admin/addon/mixins/penalty-controller.js | 6 +- .../admin/addon/mixins/period-computation.js | 2 +- .../admin/addon/mixins/setting-component.js | 12 +- .../admin/addon/mixins/setting-object.js | 4 +- .../admin/addon/models/admin-dashboard.js | 2 +- .../admin/addon/models/admin-user.js | 18 +-- .../javascripts/admin/addon/models/api-key.js | 2 +- .../admin/addon/models/backup-status.js | 2 +- .../javascripts/admin/addon/models/backup.js | 8 +- .../admin/addon/models/color-scheme-color.js | 4 +- .../admin/addon/models/color-scheme.js | 8 +- .../admin/addon/models/email-log.js | 4 +- .../admin/addon/models/email-preview.js | 2 +- .../admin/addon/models/email-settings.js | 2 +- .../admin/addon/models/email-template.js | 2 +- .../admin/addon/models/flag-type.js | 2 +- .../admin/addon/models/incoming-email.js | 2 +- .../admin/addon/models/permalink.js | 6 +- .../javascripts/admin/addon/models/report.js | 20 +-- .../admin/addon/models/screened-email.js | 6 +- .../admin/addon/models/screened-ip-address.js | 4 +- .../admin/addon/models/screened-url.js | 6 +- .../admin/addon/models/site-setting.js | 6 +- .../admin/addon/models/site-text.js | 2 +- .../admin/addon/models/staff-action-log.js | 8 +- .../admin/addon/models/theme-settings.js | 2 +- .../javascripts/admin/addon/models/theme.js | 6 +- .../admin/addon/models/tl3-requirements.js | 2 +- .../admin/addon/models/version-check.js | 4 +- .../admin/addon/models/watched-word.js | 2 +- .../admin/addon/models/web-hook.js | 6 +- .../admin/addon/routes/admin-backups-index.js | 2 +- .../admin/addon/routes/admin-backups-logs.js | 2 +- .../admin/addon/routes/admin-backups.js | 14 +-- .../admin/addon/routes/admin-badges-show.js | 6 +- .../admin/addon/routes/admin-badges.js | 6 +- .../addon/routes/admin-customize-colors.js | 2 +- .../routes/admin-customize-themes-show.js | 2 +- .../admin/addon/routes/admin-email-bounced.js | 2 +- .../routes/admin-email-preview-digest.js | 2 +- .../addon/routes/admin-email-rejected.js | 2 +- .../admin/addon/routes/admin-emojis.js | 2 +- .../routes/admin-logs-staff-action-logs.js | 2 +- .../addon/routes/admin-search-logs-index.js | 2 +- .../addon/routes/admin-search-logs-term.js | 2 +- .../routes/admin-site-settings-category.js | 4 +- .../addon/routes/admin-site-text-index.js | 2 +- .../admin/addon/routes/admin-user-badges.js | 2 +- .../admin/addon/routes/admin-user.js | 4 +- .../admin/addon/routes/admin-users-list.js | 2 +- .../routes/admin-watched-words-action.js | 4 +- .../routes/admin-web-hooks-show-events.js | 2 +- .../addon/routes/admin-web-hooks-show.js | 2 +- .../javascripts/admin/addon/routes/admin.js | 2 +- .../admin/addon/services/admin-tools.js | 14 +-- .../components/group-list-setting-test.js | 4 +- .../components/themes-list-item-test.js | 6 +- .../components/themes-list-test.js | 6 +- .../admin-customize-themes-show-test.js | 4 +- .../admin-customize-themes-test.js | 4 +- .../controllers/admin-user-badges-test.js | 4 +- .../tests/admin/unit/models/theme-test.js | 2 +- .../discourse-common/addon/helpers/d-icon.js | 2 +- .../discourse-common/addon/helpers/fa-icon.js | 4 +- .../discourse-common/addon/helpers/get-url.js | 4 +- .../addon/helpers/html-safe.js | 2 +- .../discourse-common/addon/lib/get-owner.js | 2 +- .../discourse-common/addon/lib/helpers.js | 2 +- .../addon/lib/icon-library.js | 2 +- .../discourse-common/addon/resolver.js | 4 +- .../addon/utils/decorators.js | 6 +- .../app/adapters/post-reply-history.js | 2 +- .../discourse/app/adapters/post-reply.js | 2 +- .../discourse/app/adapters/post.js | 2 +- .../discourse/app/adapters/topic-list.js | 6 +- .../discourse/app/adapters/topic.js | 2 +- app/assets/javascripts/discourse/app/app.js | 2 +- .../app/components/about-page-users.js | 6 +- .../components/add-category-tag-classes.js | 2 +- .../app/components/auth-token-dropdown.js | 2 +- .../discourse/app/components/avatar-flair.js | 2 +- .../app/components/avatar-uploader.js | 2 +- .../discourse/app/components/backup-codes.js | 4 +- .../app/components/backup-uploader.js | 8 +- .../discourse/app/components/badge-button.js | 4 +- .../discourse/app/components/badge-card.js | 4 +- .../app/components/badge-selector.js | 6 +- .../discourse/app/components/badge-title.js | 2 +- .../app/components/basic-topic-list.js | 2 +- .../components/bookmark-actions-dropdown.js | 4 +- .../discourse/app/components/bookmark-list.js | 12 +- .../discourse/app/components/bread-crumbs.js | 4 +- .../app/components/bulk-select-button.js | 2 +- .../app/components/categories-boxes-topic.js | 2 +- .../categories-boxes-with-topics.js | 4 +- .../app/components/categories-boxes.js | 4 +- .../app/components/categories-only.js | 2 +- .../app/components/category-permission-row.js | 6 +- .../components/category-read-only-banner.js | 2 +- .../discourse/app/components/cdn-img.js | 4 +- .../app/components/choose-message.js | 6 +- .../discourse/app/components/choose-topic.js | 6 +- .../app/components/color-picker-choice.js | 2 +- .../app/components/composer-action-title.js | 14 +-- .../discourse/app/components/composer-body.js | 14 +-- .../app/components/composer-editor.js | 64 +++++----- .../app/components/composer-message.js | 2 +- .../app/components/composer-messages.js | 8 +- .../app/components/composer-title.js | 10 +- .../app/components/composer-toggles.js | 2 +- .../app/components/composer-user-selector.js | 6 +- .../components/conditional-loading-section.js | 2 +- .../components/conditional-loading-spinner.js | 2 +- .../discourse/app/components/count-i18n.js | 2 +- .../app/components/create-topics-notice.js | 4 +- .../discourse/app/components/csv-uploader.js | 6 +- .../discourse/app/components/d-button.js | 8 +- .../discourse/app/components/d-document.js | 8 +- .../discourse/app/components/d-editor.js | 47 ++++--- .../discourse/app/components/d-modal-body.js | 2 +- .../discourse/app/components/d-modal.js | 4 +- .../discourse/app/components/d-navigation.js | 6 +- .../discourse/app/components/date-input.js | 10 +- .../discourse/app/components/date-picker.js | 6 +- .../app/components/date-time-input.js | 2 +- .../components/desktop-notification-config.js | 14 +-- .../app/components/discourse-banner.js | 2 +- .../app/components/discourse-linked-text.js | 2 +- .../app/components/discourse-tag-bound.js | 4 +- .../app/components/discourse-topic.js | 8 +- .../app/components/discovery-topics-list.js | 2 +- .../app/components/edit-category-general.js | 12 +- .../app/components/edit-category-panel.js | 2 +- .../app/components/edit-category-security.js | 2 +- .../app/components/edit-category-settings.js | 12 +- .../app/components/edit-category-tab.js | 10 +- .../app/components/edit-category-tags.js | 2 +- .../edit-category-topic-template.js | 2 +- .../app/components/edit-topic-timer-form.js | 16 +-- .../app/components/email-dropdown.js | 4 +- .../discourse/app/components/emoji-picker.js | 18 +-- .../app/components/emoji-uploader.js | 6 +- .../app/components/expanding-text-area.js | 4 +- .../app/components/flag-action-type.js | 6 +- .../app/components/flag-selection.js | 2 +- .../discourse/app/components/flat-button.js | 2 +- .../discourse/app/components/footer-nav.js | 6 +- .../app/components/future-date-input.js | 8 +- .../discourse/app/components/global-notice.js | 10 +- .../discourse/app/components/google-search.js | 6 +- .../app/components/group-card-contents.js | 8 +- .../app/components/group-flair-inputs.js | 16 +-- .../components/group-manage-logs-filter.js | 2 +- .../components/group-manage-save-button.js | 4 +- .../app/components/group-member-dropdown.js | 2 +- .../app/components/group-membership-button.js | 6 +- .../discourse/app/components/group-post.js | 4 +- .../app/components/group-selector.js | 8 +- .../groups-form-interaction-fields.js | 4 +- .../groups-form-membership-fields.js | 4 +- .../components/groups-form-profile-fields.js | 10 +- .../discourse/app/components/groups-info.js | 2 +- .../app/components/highlight-search.js | 2 +- .../app/components/highlight-text.js | 2 +- .../app/components/ignored-user-list.js | 2 +- .../app/components/image-uploader.js | 10 +- .../app/components/images-uploader.js | 4 +- .../app/components/invite-link-panel.js | 6 +- .../discourse/app/components/invite-panel.js | 10 +- .../app/components/latest-topic-list-item.js | 4 +- .../discourse/app/components/link-to-input.js | 2 +- .../app/components/links-redirect.js | 2 +- .../discourse/app/components/login-buttons.js | 2 +- .../discourse/app/components/login-modal.js | 2 +- .../discourse/app/components/mobile-nav.js | 4 +- .../discourse/app/components/modal-tab.js | 4 +- .../discourse/app/components/mount-widget.js | 6 +- .../discourse/app/components/nav-item.js | 6 +- .../app/components/navigation-bar.js | 6 +- .../app/components/navigation-item.js | 2 +- .../components/notification-consent-banner.js | 2 +- .../app/components/plugin-connector.js | 6 +- .../discourse/app/components/plugin-outlet.js | 10 +- .../app/components/popup-input-tip.js | 2 +- .../app/components/preference-checkbox.js | 2 +- .../app/components/pwa-install-banner.js | 2 +- .../discourse/app/components/quote-button.js | 18 +-- .../discourse/app/components/radio-button.js | 2 +- .../app/components/related-messages.js | 4 +- .../components/reviewable-bundled-action.js | 2 +- .../components/reviewable-claimed-topic.js | 4 +- .../reviewable-conversation-post.js | 2 +- .../app/components/reviewable-flagged-post.js | 4 +- .../app/components/reviewable-histories.js | 2 +- .../app/components/reviewable-item.js | 18 +-- .../app/components/reviewable-score.js | 2 +- .../discourse/app/components/save-controls.js | 2 +- .../app/components/scroll-tracker.js | 2 +- .../app/components/scrolling-post-stream.js | 2 +- .../app/components/search-advanced-options.js | 4 +- .../app/components/search-text-field.js | 2 +- .../app/components/second-factor-form.js | 4 +- .../app/components/second-factor-input.js | 2 +- .../discourse/app/components/share-panel.js | 10 +- .../discourse/app/components/share-popup.js | 14 +-- .../app/components/shared-draft-controls.js | 4 +- .../discourse/app/components/signup-cta.js | 2 +- .../discourse/app/components/site-header.js | 10 +- .../app/components/slow-mode-info.js | 6 +- .../app/components/suggested-topics.js | 8 +- .../app/components/table-header-toggle.js | 2 +- .../discourse/app/components/tag-drop-link.js | 2 +- .../app/components/tag-groups-form.js | 10 +- .../discourse/app/components/tag-info.js | 10 +- .../discourse/app/components/tag-list.js | 4 +- .../app/components/tags-admin-dropdown.js | 2 +- .../discourse/app/components/text-field.js | 4 +- .../discourse/app/components/time-input.js | 4 +- .../app/components/top-period-buttons.js | 2 +- .../app/components/topic-entrance.js | 6 +- .../app/components/topic-footer-buttons.js | 4 +- .../app/components/topic-list-item.js | 8 +- .../discourse/app/components/topic-list.js | 4 +- .../app/components/topic-navigation.js | 12 +- .../app/components/topic-post-badges.js | 2 +- .../app/components/topic-progress.js | 4 +- .../discourse/app/components/topic-status.js | 2 +- .../app/components/topic-timeline.js | 4 +- .../app/components/topic-timer-info.js | 8 +- .../discourse/app/components/user-badge.js | 2 +- .../app/components/user-card-contents.js | 14 +-- .../discourse/app/components/user-field.js | 2 +- .../app/components/user-flag-percentage.js | 2 +- .../discourse/app/components/user-info.js | 4 +- .../discourse/app/components/user-link.js | 2 +- .../discourse/app/components/user-selector.js | 6 +- .../discourse/app/components/user-stat.js | 2 +- .../app/components/user-stream-item.js | 4 +- .../discourse/app/components/user-stream.js | 14 +-- .../user-summary-category-search.js | 2 +- .../components/user-summary-topics-list.js | 2 +- .../discourse/app/controllers/about.js | 2 +- .../controllers/account-created-edit-email.js | 2 +- .../app/controllers/activation-edit.js | 4 +- .../discourse/app/controllers/application.js | 4 +- .../controllers/associate-account-confirm.js | 2 +- .../discourse/app/controllers/auth-token.js | 2 +- .../app/controllers/avatar-selector.js | 2 +- .../discourse/app/controllers/badges/index.js | 2 +- .../discourse/app/controllers/badges/show.js | 8 +- .../discourse/app/controllers/bookmark.js | 20 +-- .../controllers/bulk-notification-level.js | 2 +- .../discourse/app/controllers/change-owner.js | 10 +- .../app/controllers/change-post-notice.js | 8 +- .../app/controllers/change-timestamp.js | 8 +- .../discourse/app/controllers/composer.js | 48 ++++---- .../controllers/convert-to-public-topic.js | 2 +- .../app/controllers/create-account.js | 34 ++--- .../app/controllers/delete-topic-confirm.js | 4 +- .../discourse/app/controllers/discovery.js | 4 +- .../app/controllers/discovery/categories.js | 6 +- .../app/controllers/discovery/topics.js | 24 ++-- .../app/controllers/edit-category-tabs.js | 10 +- .../app/controllers/edit-slow-mode.js | 14 +-- .../app/controllers/edit-topic-timer.js | 8 +- .../discourse/app/controllers/email-login.js | 8 +- .../discourse/app/controllers/exception.js | 8 +- .../controllers/feature-topic-on-profile.js | 2 +- .../app/controllers/feature-topic.js | 10 +- .../discourse/app/controllers/flag.js | 16 +-- .../app/controllers/forgot-password.js | 10 +- .../app/controllers/full-page-search.js | 18 +-- .../discourse/app/controllers/grant-badge.js | 10 +- .../app/controllers/group-activity-posts.js | 2 +- .../app/controllers/group-activity.js | 2 +- .../app/controllers/group-add-members.js | 8 +- .../discourse/app/controllers/group-index.js | 6 +- .../controllers/group-manage-categories.js | 2 +- .../app/controllers/group-manage-tags.js | 2 +- .../discourse/app/controllers/group-manage.js | 2 +- .../app/controllers/group-messages.js | 2 +- .../app/controllers/group-requests.js | 2 +- .../discourse/app/controllers/group.js | 12 +- .../discourse/app/controllers/groups-index.js | 8 +- .../discourse/app/controllers/groups-new.js | 4 +- .../discourse/app/controllers/history.js | 20 +-- .../ignore-duration-with-username.js | 4 +- .../app/controllers/ignore-duration.js | 2 +- .../app/controllers/insert-hyperlink.js | 4 +- .../discourse/app/controllers/invites-show.js | 22 ++-- .../discourse/app/controllers/jump-to-post.js | 4 +- .../controllers/keyboard-shortcuts-help.js | 2 +- .../discourse/app/controllers/login.js | 36 +++--- .../app/controllers/move-to-topic.js | 12 +- .../app/controllers/navigation/categories.js | 2 +- .../app/controllers/navigation/category.js | 4 +- .../app/controllers/navigation/default.js | 2 +- .../app/controllers/password-reset.js | 10 +- .../discourse/app/controllers/preferences.js | 2 +- .../app/controllers/preferences/account.js | 24 ++-- .../app/controllers/preferences/categories.js | 2 +- .../app/controllers/preferences/email.js | 6 +- .../app/controllers/preferences/emails.js | 4 +- .../app/controllers/preferences/interface.js | 22 ++-- .../controllers/preferences/notifications.js | 2 +- .../app/controllers/preferences/profile.js | 16 +-- .../controllers/preferences/second-factor.js | 18 +-- .../app/controllers/preferences/tags.js | 2 +- .../app/controllers/preferences/username.js | 14 +-- .../app/controllers/preferences/users.js | 6 +- .../discourse/app/controllers/publish-page.js | 4 +- .../discourse/app/controllers/raw-email.js | 4 +- .../discourse/app/controllers/rename-tag.js | 4 +- .../app/controllers/reorder-categories.js | 16 +-- .../request-group-membership-form.js | 8 +- .../discourse/app/controllers/review-index.js | 2 +- .../app/controllers/review-settings.js | 6 +- .../second-factor-add-security-key.js | 8 +- .../app/controllers/second-factor-add-totp.js | 2 +- .../controllers/second-factor-backup-edit.js | 6 +- .../discourse/app/controllers/static.js | 4 +- .../discourse/app/controllers/tag-show.js | 8 +- .../discourse/app/controllers/tags-index.js | 8 +- .../app/controllers/topic-bulk-actions.js | 6 +- .../discourse/app/controllers/topic.js | 40 +++--- .../app/controllers/upload-selector.js | 10 +- .../controllers/user-activity-bookmarks.js | 4 +- .../app/controllers/user-activity.js | 6 +- .../discourse/app/controllers/user-badges.js | 2 +- .../discourse/app/controllers/user-card.js | 2 +- .../app/controllers/user-invited-show.js | 8 +- .../app/controllers/user-notifications.js | 2 +- .../app/controllers/user-private-messages.js | 8 +- .../discourse/app/controllers/user-summary.js | 4 +- .../app/controllers/user-topics-list.js | 2 +- .../discourse/app/controllers/user.js | 10 +- .../discourse/app/controllers/users.js | 4 +- .../discourse/app/helpers/application.js | 8 +- .../app/helpers/bound-avatar-template.js | 4 +- .../discourse/app/helpers/bound-avatar.js | 8 +- .../app/helpers/bound-category-link.js | 2 +- .../discourse/app/helpers/category-link.js | 10 +- .../discourse/app/helpers/cold-age-class.js | 2 +- .../discourse/app/helpers/dash-if-empty.js | 2 +- .../discourse/app/helpers/dir-span.js | 4 +- .../discourse/app/helpers/discourse-tag.js | 2 +- .../discourse/app/helpers/discourse-tags.js | 2 +- .../discourse/app/helpers/editable-value.js | 2 +- .../discourse/app/helpers/format-age.js | 2 +- .../discourse/app/helpers/format-date.js | 2 +- .../discourse/app/helpers/format-username.js | 2 +- .../discourse/app/helpers/icon-or-image.js | 4 +- .../discourse/app/helpers/inline-date.js | 2 +- .../javascripts/discourse/app/helpers/node.js | 2 +- .../app/helpers/raw-plugin-outlet.js | 2 +- .../javascripts/discourse/app/helpers/raw.js | 2 +- .../discourse/app/helpers/replace-emoji.js | 2 +- .../helpers/reviewable-history-description.js | 2 +- .../app/helpers/reviewable-status.js | 14 +-- .../discourse/app/helpers/theme-helpers.js | 2 +- .../app/helpers/topic-featured-link.js | 2 +- .../discourse/app/helpers/topic-link.js | 2 +- .../discourse/app/helpers/user-avatar.js | 6 +- .../discourse/app/helpers/user-status.js | 4 +- .../app/initializers/asset-version.js | 2 +- .../app/initializers/auto-load-modules.js | 4 +- .../app/initializers/click-interceptor.js | 2 +- .../app/initializers/copy-codeblocks.js | 6 +- .../discourse/app/initializers/d-popover.js | 4 +- .../app/initializers/enable-emoji.js | 4 +- .../app/initializers/live-development.js | 4 +- .../discourse/app/initializers/logout.js | 2 +- .../discourse/app/initializers/message-bus.js | 8 +- .../app/initializers/page-tracking.js | 6 +- .../app/initializers/post-decorations.js | 2 +- .../subscribe-user-notifications.js | 6 +- .../app/initializers/topic-footer-buttons.js | 4 +- .../app/initializers/webview-background.js | 2 +- .../javascripts/discourse/app/lib/ajax.js | 10 +- .../discourse/app/lib/autocomplete.js | 6 +- .../discourse/app/lib/category-hashtags.js | 2 +- .../discourse/app/lib/category-tag-search.js | 10 +- .../discourse/app/lib/click-track.js | 14 +-- .../discourse/app/lib/color-scheme-picker.js | 2 +- .../javascripts/discourse/app/lib/computed.js | 2 +- .../app/lib/desktop-notifications.js | 6 +- .../discourse/app/lib/export-csv.js | 2 +- .../javascripts/discourse/app/lib/eyeline.js | 2 +- .../discourse/app/lib/formatter.js | 2 +- .../discourse/app/lib/highlight-syntax.js | 2 +- .../discourse/app/lib/keyboard-shortcuts.js | 12 +- .../javascripts/discourse/app/lib/lightbox.js | 6 +- .../discourse/app/lib/link-hashtags.js | 4 +- .../discourse/app/lib/link-mentions.js | 4 +- .../discourse/app/lib/load-oneboxes.js | 2 +- .../discourse/app/lib/load-script.js | 4 +- .../javascripts/discourse/app/lib/lock-on.js | 2 +- .../javascripts/discourse/app/lib/logout.js | 2 +- .../discourse/app/lib/plugin-api.js | 116 +++++++++--------- .../discourse/app/lib/plugin-connectors.js | 2 +- .../discourse/app/lib/push-notifications.js | 2 +- .../discourse/app/lib/put-cursor-at-end.js | 2 +- .../app/lib/register-topic-footer-button.js | 2 +- .../discourse/app/lib/render-tag.js | 2 +- .../app/lib/render-topic-featured-link.js | 2 +- .../discourse/app/lib/reports-loader.js | 2 +- .../discourse/app/lib/safari-hacks.js | 6 +- .../discourse/app/lib/screen-track.js | 2 +- .../javascripts/discourse/app/lib/search.js | 24 ++-- .../discourse/app/lib/static-route-builder.js | 6 +- .../javascripts/discourse/app/lib/text.js | 14 +-- .../discourse/app/lib/theme-selector.js | 2 +- .../javascripts/discourse/app/lib/uploads.js | 2 +- .../javascripts/discourse/app/lib/url.js | 14 +-- .../discourse/app/lib/user-search.js | 10 +- .../discourse/app/lib/utilities.js | 10 +- .../discourse/app/mapping-router.js | 6 +- .../app/mixins/add-archetype-class.js | 2 +- .../discourse/app/mixins/buffered-content.js | 2 +- .../app/mixins/bulk-topic-selection.js | 6 +- .../discourse/app/mixins/can-check-emails.js | 2 +- .../app/mixins/card-contents-base.js | 4 +- .../discourse/app/mixins/cleans-up.js | 2 +- .../discourse/app/mixins/docking.js | 2 +- .../discourse/app/mixins/filter-mode.js | 2 +- .../app/mixins/grant-badge-controller.js | 6 +- .../discourse/app/mixins/load-more.js | 2 +- .../app/mixins/mobile-scroll-direction.js | 2 +- .../app/mixins/modal-functionality.js | 2 +- .../discourse/app/mixins/name-validation.js | 8 +- .../app/mixins/password-validation.js | 8 +- .../discourse/app/mixins/scroll-top.js | 4 +- .../discourse/app/mixins/scrolling.js | 4 +- .../discourse/app/mixins/upload.js | 8 +- .../app/mixins/user-fields-validation.js | 6 +- .../app/mixins/username-validation.js | 12 +- .../discourse/app/models/action-summary.js | 4 +- .../discourse/app/models/archetype.js | 2 +- .../discourse/app/models/badge-grouping.js | 2 +- .../javascripts/discourse/app/models/badge.js | 12 +- .../discourse/app/models/bookmark.js | 16 +-- .../discourse/app/models/category-list.js | 8 +- .../discourse/app/models/category.js | 10 +- .../discourse/app/models/composer.js | 22 ++-- .../javascripts/discourse/app/models/draft.js | 2 +- .../discourse/app/models/group-history.js | 2 +- .../javascripts/discourse/app/models/group.js | 10 +- .../discourse/app/models/invite.js | 6 +- .../discourse/app/models/live-post-counts.js | 2 +- .../discourse/app/models/login-method.js | 8 +- .../discourse/app/models/nav-item.js | 14 +-- .../discourse/app/models/permission-type.js | 2 +- .../discourse/app/models/post-action-type.js | 2 +- .../discourse/app/models/post-stream.js | 16 +-- .../javascripts/discourse/app/models/post.js | 24 ++-- .../javascripts/discourse/app/models/rest.js | 4 +- .../discourse/app/models/result-set.js | 2 +- .../app/models/reviewable-history.js | 2 +- .../discourse/app/models/reviewable.js | 8 +- .../javascripts/discourse/app/models/site.js | 10 +- .../discourse/app/models/static-page.js | 2 +- .../javascripts/discourse/app/models/store.js | 10 +- .../discourse/app/models/tag-group.js | 4 +- .../javascripts/discourse/app/models/tag.js | 2 +- .../discourse/app/models/topic-details.js | 12 +- .../discourse/app/models/topic-list.js | 12 +- .../discourse/app/models/topic-timer.js | 2 +- .../app/models/topic-tracking-state.js | 8 +- .../javascripts/discourse/app/models/topic.js | 32 ++--- .../discourse/app/models/user-action-stat.js | 2 +- .../discourse/app/models/user-action.js | 6 +- .../discourse/app/models/user-badge.js | 6 +- .../discourse/app/models/user-draft.js | 12 +- .../app/models/user-drafts-stream.js | 16 +-- .../discourse/app/models/user-posts-stream.js | 10 +- .../discourse/app/models/user-stream.js | 8 +- .../javascripts/discourse/app/models/user.js | 62 +++++----- .../pre-initializers/discourse-bootstrap.js | 18 +-- .../dynamic-route-builders.js | 8 +- .../inject-discourse-objects.js | 16 +-- .../raw-views/list/post-count-or-badges.js | 4 +- .../app/raw-views/list/posts-count-column.js | 2 +- .../app/raw-views/list/visited-line.js | 2 +- .../app/raw-views/topic-list-header-column.js | 2 +- .../discourse/app/raw-views/topic-status.js | 2 +- .../javascripts/discourse/app/routes/about.js | 2 +- .../discourse/app/routes/account-created.js | 2 +- .../discourse/app/routes/application.js | 24 ++-- .../discourse/app/routes/associate-account.js | 4 +- .../discourse/app/routes/badges-index.js | 4 +- .../discourse/app/routes/badges-show.js | 4 +- .../app/routes/build-category-route.js | 22 ++-- .../routes/build-private-messages-route.js | 2 +- .../discourse/app/routes/build-topic-route.js | 14 +-- .../discourse/app/routes/discourse.js | 2 +- .../app/routes/discovery-categories.js | 18 +-- .../discourse/app/routes/discovery.js | 2 +- .../discourse/app/routes/edit-category.js | 4 +- .../app/routes/edit-child-category.js | 4 +- .../discourse/app/routes/email-login.js | 2 +- .../discourse/app/routes/forgot-password.js | 4 +- .../discourse/app/routes/full-page-search.js | 10 +- .../app/routes/group-activity-posts.js | 2 +- .../app/routes/group-activity-topics.js | 2 +- .../discourse/app/routes/group-index.js | 4 +- .../app/routes/group-manage-categories.js | 2 +- .../app/routes/group-manage-interaction.js | 2 +- .../discourse/app/routes/group-manage-logs.js | 2 +- .../app/routes/group-manage-membership.js | 2 +- .../app/routes/group-manage-profile.js | 2 +- .../discourse/app/routes/group-manage-tags.js | 2 +- .../discourse/app/routes/group-manage.js | 2 +- .../discourse/app/routes/group-messages.js | 2 +- .../discourse/app/routes/group-permissions.js | 2 +- .../discourse/app/routes/group-requests.js | 2 +- .../discourse/app/routes/groups-index.js | 2 +- .../discourse/app/routes/groups-new.js | 2 +- .../discourse/app/routes/invites-show.js | 2 +- .../javascripts/discourse/app/routes/login.js | 2 +- .../discourse/app/routes/new-category.js | 4 +- .../discourse/app/routes/new-message.js | 6 +- .../discourse/app/routes/new-topic.js | 4 +- .../discourse/app/routes/password-reset.js | 4 +- .../app/routes/preferences-account.js | 4 +- .../discourse/app/routes/review.js | 2 +- .../discourse/app/routes/signup.js | 2 +- .../discourse/app/routes/tag-groups-new.js | 2 +- .../discourse/app/routes/tag-groups.js | 2 +- .../discourse/app/routes/tag-show.js | 14 +-- .../discourse/app/routes/tags-index.js | 2 +- .../app/routes/topic-by-slug-or-id.js | 2 +- .../discourse/app/routes/topic-from-params.js | 4 +- .../javascripts/discourse/app/routes/topic.js | 6 +- .../discourse/app/routes/unknown.js | 4 +- .../app/routes/user-activity-likes-given.js | 2 +- .../app/routes/user-activity-pending.js | 2 +- .../app/routes/user-activity-replies.js | 2 +- .../app/routes/user-activity-topics.js | 2 +- .../discourse/app/routes/user-badges.js | 2 +- .../discourse/app/routes/user-invited-show.js | 2 +- .../app/routes/user-notifications-edits.js | 2 +- .../user-notifications-likes-received.js | 2 +- .../app/routes/user-notifications-mentions.js | 2 +- .../routes/user-notifications-responses.js | 2 +- .../app/routes/user-private-messages-tags.js | 4 +- .../app/routes/user-private-messages.js | 2 +- .../javascripts/discourse/app/routes/user.js | 2 +- .../javascripts/discourse/app/routes/users.js | 2 +- .../discourse/app/services/app-events.js | 2 +- .../discourse/app/services/logs-notice.js | 10 +- .../discourse/app/services/theme-settings.js | 2 +- .../discourse/app/widgets/actions-summary.js | 6 +- .../discourse/app/widgets/avatar-flair.js | 2 +- .../bookmark-reminder-notification-item.js | 2 +- .../discourse/app/widgets/button.js | 4 +- .../app/widgets/component-connector.js | 2 +- .../discourse/app/widgets/connector.js | 2 +- .../app/widgets/custom-notification-item.js | 2 +- .../discourse/app/widgets/decorator-helper.js | 2 +- .../app/widgets/default-notification-item.js | 22 ++-- .../discourse/app/widgets/embedded-post.js | 4 +- .../discourse/app/widgets/emoji.js | 4 +- .../discourse/app/widgets/footer-nav.js | 2 +- ...group-message-summary-notification-item.js | 2 +- .../app/widgets/hamburger-categories.js | 4 +- .../discourse/app/widgets/hamburger-menu.js | 14 +-- .../app/widgets/header-topic-info.js | 10 +- .../discourse/app/widgets/header.js | 22 ++-- .../discourse/app/widgets/home-logo.js | 6 +- .../invitee-accepted-notification-item.js | 2 +- .../liked-consolidated-notification-item.js | 6 +- .../app/widgets/liked-notification-item.js | 2 +- .../javascripts/discourse/app/widgets/link.js | 12 +- ...ship-request-accepted-notification-item.js | 2 +- ...-request-consolidated-notification-item.js | 2 +- .../discourse/app/widgets/menu-panel.js | 2 +- .../discourse/app/widgets/post-admin-menu.js | 2 +- .../discourse/app/widgets/post-cooked.js | 6 +- .../app/widgets/post-edits-indicator.js | 2 +- .../discourse/app/widgets/post-links.js | 2 +- .../discourse/app/widgets/post-menu.js | 10 +- .../app/widgets/post-small-action.js | 10 +- .../discourse/app/widgets/post-stream.js | 6 +- .../javascripts/discourse/app/widgets/post.js | 32 ++--- .../discourse/app/widgets/poster-name.js | 8 +- .../app/widgets/private-message-map.js | 12 +- .../app/widgets/quick-access-bookmarks.js | 2 +- .../app/widgets/quick-access-item.js | 4 +- .../app/widgets/quick-access-notifications.js | 2 +- .../app/widgets/quick-access-panel.js | 2 +- .../app/widgets/quick-access-profile.js | 2 +- .../app/widgets/search-menu-controls.js | 6 +- .../app/widgets/search-menu-results.js | 6 +- .../discourse/app/widgets/search-menu.js | 14 +-- .../discourse/app/widgets/topic-admin-menu.js | 2 +- .../discourse/app/widgets/topic-map.js | 4 +- .../discourse/app/widgets/topic-status.js | 8 +- .../discourse/app/widgets/topic-timeline.js | 14 +-- .../discourse/app/widgets/user-menu.js | 2 +- .../app/widgets/user-notifications-large.js | 2 +- .../discourse/app/widgets/widget-dropdown.js | 2 +- .../discourse/app/widgets/widget.js | 24 ++-- .../discourse/tests/acceptance/about-test.js | 4 +- .../tests/acceptance/account-created-test.js | 8 +- .../tests/acceptance/admin-emails-test.js | 4 +- .../acceptance/admin-search-log-term-test.js | 4 +- .../acceptance/admin-search-logs-test.js | 2 +- .../acceptance/admin-site-settings-test.js | 18 +-- .../tests/acceptance/admin-site-text-test.js | 6 +- .../acceptance/admin-suspend-user-test.js | 8 +- .../acceptance/admin-user-badges-test.js | 4 +- .../acceptance/admin-user-emails-test.js | 4 +- .../tests/acceptance/admin-user-index-test.js | 4 +- .../tests/acceptance/admin-users-list-test.js | 6 +- .../acceptance/admin-watched-words-test.js | 6 +- .../tests/acceptance/auth-complete-test.js | 4 +- .../discourse/tests/acceptance/badges-test.js | 6 +- .../tests/acceptance/bookmarks-test.js | 10 +- .../tests/acceptance/category-banner-test.js | 4 +- .../tests/acceptance/category-chooser-test.js | 4 +- .../acceptance/category-edit-security-test.js | 6 +- .../tests/acceptance/category-edit-test.js | 8 +- .../tests/acceptance/category-new-test.js | 8 +- .../tests/acceptance/click-track-test.js | 4 +- .../tests/acceptance/composer-actions-test.js | 16 +-- .../acceptance/composer-attachment-test.js | 2 +- .../acceptance/composer-edit-conflict-test.js | 4 +- .../acceptance/composer-hyperlink-test.js | 4 +- .../tests/acceptance/composer-onebox-test.js | 2 +- .../tests/acceptance/composer-tags-test.js | 6 +- .../tests/acceptance/composer-test.js | 18 +-- .../acceptance/composer-topic-links-test.js | 4 +- .../acceptance/composer-uncategorized-test.js | 6 +- .../create-account-external-test.js | 4 +- .../create-account-user-fields-test.js | 4 +- .../tests/acceptance/custom-html-set-test.js | 10 +- .../acceptance/custom-html-template-test.js | 6 +- .../tests/acceptance/dashboard-test.js | 6 +- .../tests/acceptance/email-notice-test.js | 6 +- .../tests/acceptance/emoji-picker-test.js | 4 +- .../discourse/tests/acceptance/emoji-test.js | 2 +- .../tests/acceptance/encoded-category-test.js | 6 +- .../acceptance/enforce-second-factor-test.js | 6 +- .../tests/acceptance/flag-post-test.js | 6 +- .../tests/acceptance/forgot-password-test.js | 6 +- .../tests/acceptance/group-index-test.js | 8 +- .../group-manage-categories-test.js | 6 +- .../group-manage-interaction-test.js | 6 +- .../acceptance/group-manage-logs-test.js | 2 +- .../group-manage-membership-test.js | 6 +- .../acceptance/group-manage-profile-test.js | 6 +- .../acceptance/group-manage-tags-test.js | 6 +- .../tests/acceptance/group-requests-test.js | 2 +- .../discourse/tests/acceptance/group-test.js | 4 +- .../tests/acceptance/groups-index-test.js | 8 +- .../tests/acceptance/groups-new-test.js | 4 +- .../tests/acceptance/hamburger-menu-test.js | 6 +- .../tests/acceptance/hashtags-test.js | 2 +- .../tests/acceptance/invite-accept-test.js | 6 +- .../invite-show-user-fields-test.js | 6 +- .../tests/acceptance/jump-to-test.js | 4 +- .../acceptance/keyboard-shortcuts-test.js | 4 +- .../tests/acceptance/login-redirect-test.js | 4 +- .../tests/acceptance/login-required-test.js | 4 +- ...email-and-hide-email-address-taken-test.js | 4 +- ...in-with-email-and-no-social-logins-test.js | 4 +- .../login-with-email-disabled-test.js | 2 +- .../tests/acceptance/login-with-email-test.js | 8 +- .../tests/acceptance/mobile-discovery-test.js | 4 +- .../tests/acceptance/mobile-sign-in-test.js | 2 +- .../tests/acceptance/mobile-users-test.js | 4 +- .../discourse/tests/acceptance/modal-test.js | 10 +- .../tests/acceptance/new-message-test.js | 6 +- .../tests/acceptance/new-topic-test.js | 8 +- .../acceptance/notifications-filter-test.js | 6 +- .../tests/acceptance/page-publishing-test.js | 2 +- .../tests/acceptance/password-reset-test.js | 10 +- .../tests/acceptance/personal-message-test.js | 8 +- .../plugin-keyboard-shortcut-test.js | 8 +- .../plugin-outlet-connector-class-test.js | 8 +- .../plugin-outlet-decorator-test.js | 10 +- .../plugin-outlet-multi-template-test.js | 6 +- .../plugin-outlet-single-template-test.js | 6 +- .../tests/acceptance/post-admin-menu-test.js | 4 +- .../tests/acceptance/preferences-test.js | 24 ++-- .../acceptance/raw-plugin-outlet-test.js | 8 +- .../tests/acceptance/redirect-to-top-test.js | 4 +- .../tests/acceptance/reports-test.js | 4 +- .../discourse/tests/acceptance/review-test.js | 6 +- .../tests/acceptance/search-full-test.js | 18 +-- .../tests/acceptance/search-mobile-test.js | 4 +- .../discourse/tests/acceptance/search-test.js | 10 +- .../share-and-invite-desktop-test.js | 4 +- .../share-and-invite-mobile-test.js | 6 +- .../tests/acceptance/shared-drafts-test.js | 4 +- .../tests/acceptance/sign-in-test.js | 4 +- .../discourse/tests/acceptance/static-test.js | 4 +- .../tests/acceptance/tag-groups-test.js | 4 +- .../acceptance/tags-intersection-test.js | 2 +- .../discourse/tests/acceptance/tags-test.js | 8 +- .../tests/acceptance/topic-admin-menu-test.js | 2 +- .../tests/acceptance/topic-anonymous-test.js | 6 +- .../tests/acceptance/topic-discovery-test.js | 10 +- .../tests/acceptance/topic-edit-timer-test.js | 2 +- .../topic-footer-buttons-mobile-test.js | 10 +- .../acceptance/topic-list-tracker-test.js | 6 +- .../tests/acceptance/topic-move-posts-test.js | 4 +- .../topic-notifications-button-test.js | 6 +- .../acceptance/topic-quote-button-test.js | 8 +- .../discourse/tests/acceptance/topic-test.js | 10 +- .../tests/acceptance/unknown-test.js | 4 +- .../tests/acceptance/user-anonymous-test.js | 4 +- .../tests/acceptance/user-bookmarks-test.js | 10 +- .../tests/acceptance/user-card-test.js | 6 +- .../acceptance/user-drafts-stream-test.js | 4 +- .../user-preferences-interface-test.js | 14 +-- .../discourse/tests/acceptance/user-test.js | 4 +- .../discourse/tests/acceptance/users-test.js | 4 +- .../discourse/tests/helpers/component-test.js | 10 +- .../tests/helpers/create-pretender.js | 2 +- .../discourse/tests/helpers/create-store.js | 4 +- .../discourse/tests/helpers/qunit-helpers.js | 52 ++++---- .../tests/helpers/select-kit-helper.js | 6 +- .../discourse/tests/helpers/widget-test.js | 4 +- .../integration/components/ace-editor-test.js | 6 +- .../components/admin-report-test.js | 8 +- .../components/badge-title-test.js | 6 +- .../integration/components/cook-text-test.js | 8 +- .../integration/components/d-button-test.js | 6 +- .../integration/components/d-editor-test.js | 20 +-- .../integration/components/d-icon-test.js | 6 +- .../integration/components/date-input-test.js | 6 +- .../components/date-time-input-range-test.js | 6 +- .../components/date-time-input-test.js | 6 +- .../components/highlighted-code-test.js | 6 +- .../components/html-safe-helper-test.js | 2 +- .../components/iframed-html-test.js | 6 +- .../components/image-uploader-test.js | 6 +- .../integration/components/load-more-test.js | 4 +- .../components/secret-value-list-test.js | 8 +- .../components/select-kit/api-test.js | 10 +- .../select-kit/category-chooser-test.js | 6 +- .../select-kit/category-drop-test.js | 18 +-- .../components/select-kit/combo-box-test.js | 4 +- .../select-kit/dropdown-select-box-test.js | 2 +- .../select-kit/list-setting-test.js | 2 +- .../select-kit/mini-tag-chooser-test.js | 8 +- .../select-kit/multi-select-test.js | 2 +- .../select-kit/notifications-button-test.js | 2 +- .../select-kit/pinned-options-test.js | 4 +- .../select-kit/single-select-test.js | 4 +- .../components/select-kit/tag-drop-test.js | 4 +- .../topic-notifications-button-test.js | 6 +- .../topic-notifications-options-test.js | 6 +- .../select-kit/user-chooser-test.js | 2 +- .../components/simple-list-test.js | 8 +- .../integration/components/text-field-test.js | 8 +- .../integration/components/time-input-test.js | 4 +- .../components/user-selector-test.js | 6 +- .../integration/components/value-list-test.js | 8 +- .../widgets/actions-summary-test.js | 6 +- .../integration/widgets/avatar-flair-test.js | 6 +- .../tests/integration/widgets/button-test.js | 6 +- .../widgets/default-notification-item-test.js | 6 +- .../widgets/hamburger-menu-test.js | 6 +- .../tests/integration/widgets/header-test.js | 6 +- .../integration/widgets/home-logo-test.js | 6 +- .../integration/widgets/post-links-test.js | 6 +- .../integration/widgets/post-menu-test.js | 6 +- .../integration/widgets/post-stream-test.js | 8 +- .../tests/integration/widgets/post-test.js | 8 +- .../integration/widgets/poster-name-test.js | 6 +- .../widgets/quick-access-item-test.js | 6 +- .../widgets/small-user-list-test.js | 6 +- .../widgets/topic-admin-menu-test.js | 4 +- .../widgets/topic-participant-test.js | 2 +- .../integration/widgets/topic-status-test.js | 6 +- .../integration/widgets/user-menu-test.js | 10 +- .../widgets/widget-dropdown-test.js | 6 +- .../tests/integration/widgets/widget-test.js | 14 +-- .../discourse/tests/setup-tests.js | 46 +++---- .../group-membership-button-test.js | 2 +- .../unit/controllers/avatar-selector-test.js | 2 +- .../tests/unit/controllers/bookmark-test.js | 8 +- .../unit/controllers/create-account-test.js | 2 +- .../controllers/preferences-account-test.js | 2 +- .../controllers/reorder-categories-test.js | 4 +- .../tests/unit/controllers/topic-test.js | 10 +- .../tests/unit/ember/resolver-test.js | 4 +- .../tests/unit/lib/allow-lister-test.js | 2 +- .../discourse/tests/unit/lib/bookmark-test.js | 6 +- .../tests/unit/lib/break-string-test.js | 2 +- .../tests/unit/lib/category-badge-test.js | 6 +- .../unit/lib/click-track-edit-history-test.js | 8 +- .../unit/lib/click-track-profile-page-test.js | 8 +- .../tests/unit/lib/click-track-test.js | 10 +- .../discourse/tests/unit/lib/computed-test.js | 18 +-- .../tests/unit/lib/emoji-store-test.js | 2 +- .../discourse/tests/unit/lib/emoji-test.js | 8 +- .../tests/unit/lib/formatter-test.js | 10 +- .../discourse/tests/unit/lib/get-url-test.js | 8 +- .../tests/unit/lib/highlight-search-test.js | 2 +- .../discourse/tests/unit/lib/i18n-test.js | 2 +- .../tests/unit/lib/icon-library-test.js | 4 +- .../tests/unit/lib/key-value-store-test.js | 2 +- .../tests/unit/lib/keyboard-shortcuts-test.js | 4 +- .../tests/unit/lib/link-mentions-test.js | 2 +- .../tests/unit/lib/load-script-test.js | 4 +- .../discourse/tests/unit/lib/oneboxer-test.js | 6 +- .../tests/unit/lib/parse-bbcode-tag-test.js | 2 +- .../tests/unit/lib/preload-store-test.js | 2 +- .../tests/unit/lib/pretty-text-test.js | 10 +- .../tests/unit/lib/sanitizer-test.js | 2 +- .../tests/unit/lib/screen-track-test.js | 2 +- .../discourse/tests/unit/lib/search-test.js | 6 +- .../discourse/tests/unit/lib/sharing-test.js | 2 +- .../tests/unit/lib/text-direction-test.js | 4 +- .../tests/unit/lib/to-markdown-test.js | 2 +- .../tests/unit/lib/upload-short-url-test.js | 6 +- .../discourse/tests/unit/lib/uploads-test.js | 26 ++-- .../discourse/tests/unit/lib/url-test.js | 10 +- .../tests/unit/lib/user-search-test.js | 6 +- .../tests/unit/lib/utilities-test.js | 24 ++-- .../discourse/tests/unit/localization-test.js | 2 +- .../mixins/grant-badge-controller-test.js | 4 +- .../tests/unit/mixins/setting-object-test.js | 2 +- .../tests/unit/mixins/singleton-test.js | 2 +- .../discourse/tests/unit/models/badge-test.js | 2 +- .../tests/unit/models/category-test.js | 6 +- .../tests/unit/models/composer-test.js | 18 +-- .../tests/unit/models/email-log-test.js | 2 +- .../discourse/tests/unit/models/group-test.js | 2 +- .../tests/unit/models/invite-test.js | 2 +- .../tests/unit/models/nav-item-test.js | 8 +- .../tests/unit/models/post-stream-test.js | 8 +- .../discourse/tests/unit/models/post-test.js | 2 +- .../tests/unit/models/report-test.js | 2 +- .../tests/unit/models/rest-model-test.js | 8 +- .../tests/unit/models/result-set-test.js | 2 +- .../tests/unit/models/session-test.js | 2 +- .../discourse/tests/unit/models/site-test.js | 4 +- .../unit/models/staff-action-log-test.js | 2 +- .../tests/unit/models/topic-details-test.js | 4 +- .../discourse/tests/unit/models/topic-test.js | 6 +- .../unit/models/topic-tracking-state-test.js | 6 +- .../tests/unit/models/user-action-test.js | 2 +- .../tests/unit/models/user-badge-test.js | 2 +- .../tests/unit/models/user-drafts-test.js | 4 +- .../tests/unit/models/user-stream-test.js | 4 +- .../discourse/tests/unit/models/user-test.js | 8 +- .../unit/services/document-title-test.js | 4 +- .../tests/unit/services/store-test.js | 2 +- .../tests/unit/utils/decorators-test.js | 4 +- .../javascripts/pretty-text/addon/emoji.js | 8 +- .../addon/engines/discourse-markdown-it.js | 4 +- .../javascripts/pretty-text/addon/oneboxer.js | 12 +- .../pretty-text/addon/upload-short-url.js | 2 +- .../pretty-text/addon/white-lister.js | 2 +- .../engines/discourse-markdown/onebox.js | 2 +- .../components/categories-admin-dropdown.js | 2 +- .../addon/components/category-chooser.js | 10 +- .../addon/components/category-drop.js | 10 +- .../category-drop/category-drop-header.js | 4 +- .../category-notifications-button.js | 2 +- .../addon/components/category-row.js | 10 +- .../addon/components/category-selector.js | 12 +- .../addon/components/color-palettes.js | 2 +- .../color-palettes/color-palettes-row.js | 2 +- .../components/combo-box/combo-box-header.js | 2 +- .../addon/components/composer-actions.js | 14 +-- .../addon/components/create-color-row.js | 2 +- .../dropdown-select-box-header.js | 2 +- .../dropdown-select-box-row.js | 2 +- .../components/future-date-input-selector.js | 6 +- .../future-date-input-selector/mixin.js | 2 +- .../addon/components/group-dropdown.js | 4 +- .../components/group-members-dropdown.js | 4 +- .../addon/components/icon-picker.js | 8 +- .../addon/components/list-setting.js | 4 +- .../addon/components/mini-tag-chooser.js | 8 +- .../mini-tag-chooser/selected-collection.js | 2 +- .../addon/components/multi-select.js | 4 +- .../multi-select/multi-select-filter.js | 4 +- .../multi-select/multi-select-header.js | 2 +- .../addon/components/notifications-button.js | 4 +- .../notifications-button-row.js | 6 +- .../addon/components/notifications-filter.js | 2 +- .../period-chooser/period-chooser-row.js | 2 +- .../addon/components/pinned-button.js | 2 +- .../addon/components/pinned-options.js | 4 +- .../select-kit/addon/components/select-kit.js | 36 +++--- .../components/select-kit/select-kit-body.js | 2 +- .../select-kit/select-kit-filter.js | 8 +- .../select-kit/select-kit-header.js | 4 +- .../components/select-kit/select-kit-row.js | 8 +- .../addon/components/selected-name.js | 4 +- .../addon/components/tag-chooser.js | 2 +- .../select-kit/addon/components/tag-drop.js | 6 +- .../addon/components/tag-group-chooser.js | 2 +- .../components/toolbar-popup-menu-options.js | 2 +- .../components/topic-notifications-button.js | 2 +- .../components/topic-notifications-options.js | 2 +- .../addon/components/user-chooser.js | 8 +- .../components/user-notifications-dropdown.js | 4 +- .../select-kit/addon/mixins/tags.js | 10 +- .../wizard/components/font-preview.js | 6 +- .../wizard/components/homepage-preview.js | 4 +- .../components/image-preview-favicon.js | 2 +- .../components/image-preview-large-icon.js | 2 +- .../components/image-preview-logo-small.js | 2 +- .../wizard/components/image-preview-logo.js | 2 +- .../wizard/components/invite-list.js | 2 +- .../wizard/components/radio-button.js | 4 +- .../wizard/components/theme-preview.js | 8 +- .../wizard/components/wizard-field-image.js | 10 +- .../wizard/components/wizard-field.js | 2 +- .../wizard/components/wizard-step.js | 8 +- app/assets/javascripts/wizard/lib/ajax.js | 4 +- app/assets/javascripts/wizard/lib/preview.js | 4 +- app/assets/javascripts/wizard/models/step.js | 2 +- .../javascripts/wizard/models/wizard.js | 2 +- .../wizard/test/acceptance/wizard-test.js | 4 +- .../test/components/invite-list-test.js | 2 +- .../wizard/test/helpers/start-app.js | 2 +- .../wizard/test/models/wizard-field-test.js | 2 +- .../acceptance/details-button-test.js.es6 | 2 +- .../discourse-local-dates-create-form.js.es6 | 20 +-- .../initializers/discourse-local-dates.js.es6 | 4 +- .../javascripts/lib/local-date-builder.js.es6 | 2 +- .../lib/local-date-builder-test.js.es6 | 2 +- .../initializers/new-user-narrative.js.es6 | 2 +- .../composer-presence-display.js.es6 | 20 +-- .../components/topic-presence-display.js.es6 | 4 +- .../javascripts/discourse/lib/presence.js.es6 | 2 +- .../services/presence-manager.js.es6 | 2 +- .../components/poll-breakdown-chart.js.es6 | 8 +- .../components/poll-breakdown-option.js.es6 | 6 +- .../controllers/poll-breakdown.js.es6 | 14 +-- .../controllers/poll-ui-builder.js.es6 | 4 +- .../initializers/add-poll-ui-builder.js.es6 | 4 +- .../initializers/extend-for-poll.js.es6 | 2 +- .../javascripts/widgets/discourse-poll.js.es6 | 18 +-- .../poll-builder-disabled-test.js.es6 | 4 +- .../poll-builder-enabled-test.js.es6 | 6 +- .../acceptance/poll-pie-chart-test.js.es6 | 2 +- .../acceptance/poll-quote-test.js.es6 | 2 +- .../polls-bar-chart-test-desktop.js.es6 | 2 +- .../polls-bar-chart-test-mobile.js.es6 | 2 +- ...iscourse-poll-standard-results-test.js.es6 | 2 +- .../widgets/discourse-poll-test.js.es6 | 4 +- .../discourse/routes/styleguide-show.js.es6 | 2 +- 1070 files changed, 3158 insertions(+), 3158 deletions(-) diff --git a/.eslintrc b/.eslintrc index 58952b4eb3..320310db8d 100644 --- a/.eslintrc +++ b/.eslintrc @@ -2,7 +2,8 @@ "extends": "eslint-config-discourse", "rules": { "discourse-ember/global-ember": 2, - "no-duplicate-imports": 2 + "no-duplicate-imports": 2, + "sort-imports": 2 }, "globals": { "moduleFor": "off", diff --git a/app/assets/javascripts/admin/addon/components/ace-editor.js b/app/assets/javascripts/admin/addon/components/ace-editor.js index 41c22eff56..4f70345003 100644 --- a/app/assets/javascripts/admin/addon/components/ace-editor.js +++ b/app/assets/javascripts/admin/addon/components/ace-editor.js @@ -1,6 +1,6 @@ import Component from "@ember/component"; -import loadScript from "discourse/lib/load-script"; import getURL from "discourse-common/lib/get-url"; +import loadScript from "discourse/lib/load-script"; import { observes } from "discourse-common/utils/decorators"; import { on } from "@ember/object/evented"; diff --git a/app/assets/javascripts/admin/addon/components/admin-backups-logs.js b/app/assets/javascripts/admin/addon/components/admin-backups-logs.js index 1bb36931a0..2531919aa2 100644 --- a/app/assets/javascripts/admin/addon/components/admin-backups-logs.js +++ b/app/assets/javascripts/admin/addon/components/admin-backups-logs.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; -import { scheduleOnce } from "@ember/runloop"; -import Component from "@ember/component"; -import discourseDebounce from "discourse/lib/debounce"; import { observes, on } from "discourse-common/utils/decorators"; +import Component from "@ember/component"; +import I18n from "I18n"; +import discourseDebounce from "discourse/lib/debounce"; +import { scheduleOnce } from "@ember/runloop"; export default Component.extend({ classNames: ["admin-backups-logs"], diff --git a/app/assets/javascripts/admin/addon/components/admin-report-chart.js b/app/assets/javascripts/admin/addon/components/admin-report-chart.js index 20a190d9d2..40f927f55d 100644 --- a/app/assets/javascripts/admin/addon/components/admin-report-chart.js +++ b/app/assets/javascripts/admin/addon/components/admin-report-chart.js @@ -1,8 +1,8 @@ -import { makeArray } from "discourse-common/lib/helpers"; import { debounce, schedule } from "@ember/runloop"; import Component from "@ember/component"; -import { number } from "discourse/lib/formatter"; import loadScript from "discourse/lib/load-script"; +import { makeArray } from "discourse-common/lib/helpers"; +import { number } from "discourse/lib/formatter"; export default Component.extend({ classNames: ["admin-report-chart"], diff --git a/app/assets/javascripts/admin/addon/components/admin-report-counts.js b/app/assets/javascripts/admin/addon/components/admin-report-counts.js index 6d3c0b398b..03c690dbbd 100644 --- a/app/assets/javascripts/admin/addon/components/admin-report-counts.js +++ b/app/assets/javascripts/admin/addon/components/admin-report-counts.js @@ -1,5 +1,5 @@ -import { match } from "@ember/object/computed"; import Component from "@ember/component"; +import { match } from "@ember/object/computed"; export default Component.extend({ allTime: true, tagName: "tr", diff --git a/app/assets/javascripts/admin/addon/components/admin-report-stacked-chart.js b/app/assets/javascripts/admin/addon/components/admin-report-stacked-chart.js index 3519e6a163..b07a8261c8 100644 --- a/app/assets/javascripts/admin/addon/components/admin-report-stacked-chart.js +++ b/app/assets/javascripts/admin/addon/components/admin-report-stacked-chart.js @@ -1,8 +1,8 @@ -import { makeArray } from "discourse-common/lib/helpers"; import { debounce, schedule } from "@ember/runloop"; import Component from "@ember/component"; -import { number } from "discourse/lib/formatter"; import loadScript from "discourse/lib/load-script"; +import { makeArray } from "discourse-common/lib/helpers"; +import { number } from "discourse/lib/formatter"; export default Component.extend({ classNames: ["admin-report-chart", "admin-report-stacked-chart"], diff --git a/app/assets/javascripts/admin/addon/components/admin-report-storage-stats.js b/app/assets/javascripts/admin/addon/components/admin-report-storage-stats.js index b41304ec34..e12bc6432f 100644 --- a/app/assets/javascripts/admin/addon/components/admin-report-storage-stats.js +++ b/app/assets/javascripts/admin/addon/components/admin-report-storage-stats.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { alias } from "@ember/object/computed"; import Component from "@ember/component"; +import I18n from "I18n"; +import { alias } from "@ember/object/computed"; +import discourseComputed from "discourse-common/utils/decorators"; import { setting } from "discourse/lib/computed"; export default Component.extend({ diff --git a/app/assets/javascripts/admin/addon/components/admin-report-table-cell.js b/app/assets/javascripts/admin/addon/components/admin-report-table-cell.js index 967370ab8e..aadf6e0f73 100644 --- a/app/assets/javascripts/admin/addon/components/admin-report-table-cell.js +++ b/app/assets/javascripts/admin/addon/components/admin-report-table-cell.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { alias } from "@ember/object/computed"; import Component from "@ember/component"; +import { alias } from "@ember/object/computed"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "td", diff --git a/app/assets/javascripts/admin/addon/components/admin-report-table-header.js b/app/assets/javascripts/admin/addon/components/admin-report-table-header.js index f7c91dcab6..5c7cdf1e4c 100644 --- a/app/assets/javascripts/admin/addon/components/admin-report-table-header.js +++ b/app/assets/javascripts/admin/addon/components/admin-report-table-header.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "th", diff --git a/app/assets/javascripts/admin/addon/components/admin-report-table.js b/app/assets/javascripts/admin/addon/components/admin-report-table.js index b44ea784dd..a237e93ee4 100644 --- a/app/assets/javascripts/admin/addon/components/admin-report-table.js +++ b/app/assets/javascripts/admin/addon/components/admin-report-table.js @@ -1,7 +1,7 @@ +import Component from "@ember/component"; +import { alias } from "@ember/object/computed"; import discourseComputed from "discourse-common/utils/decorators"; import { makeArray } from "discourse-common/lib/helpers"; -import { alias } from "@ember/object/computed"; -import Component from "@ember/component"; const PAGES_LIMIT = 8; diff --git a/app/assets/javascripts/admin/addon/components/admin-report.js b/app/assets/javascripts/admin/addon/components/admin-report.js index eb9b06f703..31fc2c2973 100644 --- a/app/assets/javascripts/admin/addon/components/admin-report.js +++ b/app/assets/javascripts/admin/addon/components/admin-report.js @@ -1,16 +1,16 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { makeArray } from "discourse-common/lib/helpers"; -import { alias, or, and, equal, notEmpty } from "@ember/object/computed"; -import EmberObject, { computed, action } from "@ember/object"; -import { next } from "@ember/runloop"; -import Component from "@ember/component"; -import ReportLoader from "discourse/lib/reports-loader"; -import { exportEntity } from "discourse/lib/export-csv"; -import { outputExportResult } from "discourse/lib/export-result"; +import EmberObject, { action, computed } from "@ember/object"; import Report, { SCHEMA_VERSION } from "admin/models/report"; +import { alias, and, equal, notEmpty, or } from "@ember/object/computed"; +import Component from "@ember/component"; +import I18n from "I18n"; +import ReportLoader from "discourse/lib/reports-loader"; +import discourseComputed from "discourse-common/utils/decorators"; +import { exportEntity } from "discourse/lib/export-csv"; import { isPresent } from "@ember/utils"; import { isTesting } from "discourse-common/config/environment"; +import { makeArray } from "discourse-common/lib/helpers"; +import { next } from "@ember/runloop"; +import { outputExportResult } from "discourse/lib/export-result"; const TABLE_OPTIONS = { perPage: 8, diff --git a/app/assets/javascripts/admin/addon/components/admin-theme-editor.js b/app/assets/javascripts/admin/addon/components/admin-theme-editor.js index c453c877d6..ac073c4b55 100644 --- a/app/assets/javascripts/admin/addon/components/admin-theme-editor.js +++ b/app/assets/javascripts/admin/addon/components/admin-theme-editor.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; -import { next } from "@ember/runloop"; import Component from "@ember/component"; +import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; import { fmt } from "discourse/lib/computed"; +import { next } from "@ember/runloop"; export default Component.extend({ @discourseComputed("theme.targets", "onlyOverridden", "showAdvanced") diff --git a/app/assets/javascripts/admin/addon/components/admin-user-field-item.js b/app/assets/javascripts/admin/addon/components/admin-user-field-item.js index 17634d5c49..c9642e3c94 100644 --- a/app/assets/javascripts/admin/addon/components/admin-user-field-item.js +++ b/app/assets/javascripts/admin/addon/components/admin-user-field-item.js @@ -1,16 +1,16 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import { empty } from "@ember/object/computed"; -import { scheduleOnce } from "@ember/runloop"; -import Component from "@ember/component"; -import UserField from "admin/models/user-field"; -import { bufferedProperty } from "discourse/mixins/buffered-content"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import { propertyEqual, i18n } from "discourse/lib/computed"; import discourseComputed, { observes, on, } from "discourse-common/utils/decorators"; +import { i18n, propertyEqual } from "discourse/lib/computed"; +import Component from "@ember/component"; +import I18n from "I18n"; +import UserField from "admin/models/user-field"; +import { bufferedProperty } from "discourse/mixins/buffered-content"; +import { empty } from "@ember/object/computed"; +import { isEmpty } from "@ember/utils"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import { scheduleOnce } from "@ember/runloop"; export default Component.extend(bufferedProperty("userField"), { editing: empty("userField.id"), diff --git a/app/assets/javascripts/admin/addon/components/admin-watched-word.js b/app/assets/javascripts/admin/addon/components/admin-watched-word.js index 061c83d56a..266b02b3c6 100644 --- a/app/assets/javascripts/admin/addon/components/admin-watched-word.js +++ b/app/assets/javascripts/admin/addon/components/admin-watched-word.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; import Component from "@ember/component"; -import { iconHTML } from "discourse-common/lib/icon-library"; +import I18n from "I18n"; import bootbox from "bootbox"; +import { iconHTML } from "discourse-common/lib/icon-library"; export default Component.extend({ classNames: ["watched-word"], diff --git a/app/assets/javascripts/admin/addon/components/admin-web-hook-event-chooser.js b/app/assets/javascripts/admin/addon/components/admin-web-hook-event-chooser.js index 98e39518bf..1c8e59fd27 100644 --- a/app/assets/javascripts/admin/addon/components/admin-web-hook-event-chooser.js +++ b/app/assets/javascripts/admin/addon/components/admin-web-hook-event-chooser.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { alias } from "@ember/object/computed"; import Component from "@ember/component"; +import I18n from "I18n"; +import { alias } from "@ember/object/computed"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ classNames: ["hook-event"], diff --git a/app/assets/javascripts/admin/addon/components/admin-web-hook-event.js b/app/assets/javascripts/admin/addon/components/admin-web-hook-event.js index 75f1326a48..fbcf1594e0 100644 --- a/app/assets/javascripts/admin/addon/components/admin-web-hook-event.js +++ b/app/assets/javascripts/admin/addon/components/admin-web-hook-event.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import Component from "@ember/component"; -import { ajax } from "discourse/lib/ajax"; -import { popupAjaxError } from "discourse/lib/ajax-error"; import { ensureJSON, plainJSON, prettyJSON } from "discourse/lib/formatter"; +import Component from "@ember/component"; +import I18n from "I18n"; +import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Component.extend({ tagName: "li", diff --git a/app/assets/javascripts/admin/addon/components/admin-web-hook-status.js b/app/assets/javascripts/admin/addon/components/admin-web-hook-status.js index 818970f125..a80a769e94 100644 --- a/app/assets/javascripts/admin/addon/components/admin-web-hook-status.js +++ b/app/assets/javascripts/admin/addon/components/admin-web-hook-status.js @@ -1,6 +1,6 @@ +import Component from "@ember/component"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; -import Component from "@ember/component"; import { iconHTML } from "discourse-common/lib/icon-library"; export default Component.extend({ diff --git a/app/assets/javascripts/admin/addon/components/color-input.js b/app/assets/javascripts/admin/addon/components/color-input.js index 3d7dad5e00..c563fedc94 100644 --- a/app/assets/javascripts/admin/addon/components/color-input.js +++ b/app/assets/javascripts/admin/addon/components/color-input.js @@ -1,8 +1,8 @@ -import { schedule } from "@ember/runloop"; -import Component from "@ember/component"; -import { computed, action } from "@ember/object"; +import { action, computed } from "@ember/object"; import loadScript, { loadCSS } from "discourse/lib/load-script"; +import Component from "@ember/component"; import { observes } from "discourse-common/utils/decorators"; +import { schedule } from "@ember/runloop"; /** An input field for a color. diff --git a/app/assets/javascripts/admin/addon/components/email-styles-editor.js b/app/assets/javascripts/admin/addon/components/email-styles-editor.js index c40f8a543e..6f7cf6d021 100644 --- a/app/assets/javascripts/admin/addon/components/email-styles-editor.js +++ b/app/assets/javascripts/admin/addon/components/email-styles-editor.js @@ -1,8 +1,8 @@ +import Component from "@ember/component"; import I18n from "I18n"; +import bootbox from "bootbox"; import discourseComputed from "discourse-common/utils/decorators"; import { reads } from "@ember/object/computed"; -import Component from "@ember/component"; -import bootbox from "bootbox"; export default Component.extend({ editorId: reads("fieldName"), diff --git a/app/assets/javascripts/admin/addon/components/embeddable-host.js b/app/assets/javascripts/admin/addon/components/embeddable-host.js index 9846c9fc7b..a3213e7c94 100644 --- a/app/assets/javascripts/admin/addon/components/embeddable-host.js +++ b/app/assets/javascripts/admin/addon/components/embeddable-host.js @@ -1,16 +1,16 @@ -import I18n from "I18n"; import discourseComputed, { - on, observes, + on, } from "discourse-common/utils/decorators"; +import Category from "discourse/models/category"; +import Component from "@ember/component"; +import I18n from "I18n"; +import bootbox from "bootbox"; +import { bufferedProperty } from "discourse/mixins/buffered-content"; import { isEmpty } from "@ember/utils"; import { or } from "@ember/object/computed"; -import { schedule } from "@ember/runloop"; -import Component from "@ember/component"; -import { bufferedProperty } from "discourse/mixins/buffered-content"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import Category from "discourse/models/category"; -import bootbox from "bootbox"; +import { schedule } from "@ember/runloop"; export default Component.extend(bufferedProperty("host"), { editToggled: false, diff --git a/app/assets/javascripts/admin/addon/components/embedding-setting.js b/app/assets/javascripts/admin/addon/components/embedding-setting.js index 8c1a187ac6..7b8417aa06 100644 --- a/app/assets/javascripts/admin/addon/components/embedding-setting.js +++ b/app/assets/javascripts/admin/addon/components/embedding-setting.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ classNames: ["embed-setting"], diff --git a/app/assets/javascripts/admin/addon/components/highlighted-code.js b/app/assets/javascripts/admin/addon/components/highlighted-code.js index f5486db8d9..21cfaf6b15 100644 --- a/app/assets/javascripts/admin/addon/components/highlighted-code.js +++ b/app/assets/javascripts/admin/addon/components/highlighted-code.js @@ -1,5 +1,5 @@ +import { observes, on } from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import { on, observes } from "discourse-common/utils/decorators"; import highlightSyntax from "discourse/lib/highlight-syntax"; export default Component.extend({ diff --git a/app/assets/javascripts/admin/addon/components/ip-lookup.js b/app/assets/javascripts/admin/addon/components/ip-lookup.js index db19cb25c3..99929048a4 100644 --- a/app/assets/javascripts/admin/addon/components/ip-lookup.js +++ b/app/assets/javascripts/admin/addon/components/ip-lookup.js @@ -1,12 +1,12 @@ -import I18n from "I18n"; -import EmberObject from "@ember/object"; -import { later } from "@ember/runloop"; -import Component from "@ember/component"; -import discourseComputed from "discourse-common/utils/decorators"; -import { ajax } from "discourse/lib/ajax"; import AdminUser from "admin/models/admin-user"; -import copyText from "discourse/lib/copy-text"; +import Component from "@ember/component"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; +import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; +import copyText from "discourse/lib/copy-text"; +import discourseComputed from "discourse-common/utils/decorators"; +import { later } from "@ember/runloop"; export default Component.extend({ classNames: ["ip-lookup"], diff --git a/app/assets/javascripts/admin/addon/components/penalty-post-action.js b/app/assets/javascripts/admin/addon/components/penalty-post-action.js index 4a46bbbea7..e010272447 100644 --- a/app/assets/javascripts/admin/addon/components/penalty-post-action.js +++ b/app/assets/javascripts/admin/addon/components/penalty-post-action.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; import discourseComputed, { afterRender, } from "discourse-common/utils/decorators"; -import { equal } from "@ember/object/computed"; import Component from "@ember/component"; +import I18n from "I18n"; +import { equal } from "@ember/object/computed"; const ACTIONS = ["delete", "delete_replies", "edit", "none"]; diff --git a/app/assets/javascripts/admin/addon/components/permalink-form.js b/app/assets/javascripts/admin/addon/components/permalink-form.js index b7238f5700..a5a8a95e35 100644 --- a/app/assets/javascripts/admin/addon/components/permalink-form.js +++ b/app/assets/javascripts/admin/addon/components/permalink-form.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import { schedule } from "@ember/runloop"; import Component from "@ember/component"; -import discourseComputed from "discourse-common/utils/decorators"; -import { fmt } from "discourse/lib/computed"; +import I18n from "I18n"; import Permalink from "admin/models/permalink"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; +import { fmt } from "discourse/lib/computed"; +import { schedule } from "@ember/runloop"; export default Component.extend({ classNames: ["permalink-form"], diff --git a/app/assets/javascripts/admin/addon/components/report-filters/bool.js b/app/assets/javascripts/admin/addon/components/report-filters/bool.js index 0a752c54e2..544709791c 100644 --- a/app/assets/javascripts/admin/addon/components/report-filters/bool.js +++ b/app/assets/javascripts/admin/addon/components/report-filters/bool.js @@ -1,5 +1,5 @@ -import { action } from "@ember/object"; import FilterComponent from "admin/components/report-filters/filter"; +import { action } from "@ember/object"; export default FilterComponent.extend({ checked: false, diff --git a/app/assets/javascripts/admin/addon/components/report-filters/category.js b/app/assets/javascripts/admin/addon/components/report-filters/category.js index 4cbe965193..877c3aee7a 100644 --- a/app/assets/javascripts/admin/addon/components/report-filters/category.js +++ b/app/assets/javascripts/admin/addon/components/report-filters/category.js @@ -1,6 +1,6 @@ +import FilterComponent from "admin/components/report-filters/filter"; import { action } from "@ember/object"; import { readOnly } from "@ember/object/computed"; -import FilterComponent from "admin/components/report-filters/filter"; export default FilterComponent.extend({ category: readOnly("filter.default"), diff --git a/app/assets/javascripts/admin/addon/components/report-filters/group.js b/app/assets/javascripts/admin/addon/components/report-filters/group.js index 5cf379332b..30dd4c7b1b 100644 --- a/app/assets/javascripts/admin/addon/components/report-filters/group.js +++ b/app/assets/javascripts/admin/addon/components/report-filters/group.js @@ -1,5 +1,5 @@ -import { computed } from "@ember/object"; import FilterComponent from "admin/components/report-filters/filter"; +import { computed } from "@ember/object"; export default FilterComponent.extend({ classNames: ["group-filter"], diff --git a/app/assets/javascripts/admin/addon/components/resumable-upload.js b/app/assets/javascripts/admin/addon/components/resumable-upload.js index 0afa189a1d..8e3ce18e8c 100644 --- a/app/assets/javascripts/admin/addon/components/resumable-upload.js +++ b/app/assets/javascripts/admin/addon/components/resumable-upload.js @@ -1,9 +1,9 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; +import discourseComputed, { on } from "discourse-common/utils/decorators"; import { later, schedule } from "@ember/runloop"; import Component from "@ember/component"; +import I18n from "I18n"; +import getURL from "discourse-common/lib/get-url"; import { iconHTML } from "discourse-common/lib/icon-library"; -import discourseComputed, { on } from "discourse-common/utils/decorators"; /*global Resumable:true */ diff --git a/app/assets/javascripts/admin/addon/components/screened-ip-address-form.js b/app/assets/javascripts/admin/addon/components/screened-ip-address-form.js index e738c81b85..40dd71ad9a 100644 --- a/app/assets/javascripts/admin/addon/components/screened-ip-address-form.js +++ b/app/assets/javascripts/admin/addon/components/screened-ip-address-form.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; import discourseComputed, { on } from "discourse-common/utils/decorators"; -import { schedule } from "@ember/runloop"; import Component from "@ember/component"; -import bootbox from "bootbox"; +import I18n from "I18n"; import ScreenedIpAddress from "admin/models/screened-ip-address"; +import bootbox from "bootbox"; +import { schedule } from "@ember/runloop"; /** A form to create an IP address that will be blocked or allowed. diff --git a/app/assets/javascripts/admin/addon/components/secret-value-list.js b/app/assets/javascripts/admin/addon/components/secret-value-list.js index 9b59c26d3a..5ad0e5b3ce 100644 --- a/app/assets/javascripts/admin/addon/components/secret-value-list.js +++ b/app/assets/javascripts/admin/addon/components/secret-value-list.js @@ -1,6 +1,6 @@ +import Component from "@ember/component"; import I18n from "I18n"; import { isEmpty } from "@ember/utils"; -import Component from "@ember/component"; import { on } from "discourse-common/utils/decorators"; import { set } from "@ember/object"; diff --git a/app/assets/javascripts/admin/addon/components/simple-list.js b/app/assets/javascripts/admin/addon/components/simple-list.js index f3db4c5973..96136c98e2 100644 --- a/app/assets/javascripts/admin/addon/components/simple-list.js +++ b/app/assets/javascripts/admin/addon/components/simple-list.js @@ -1,6 +1,6 @@ -import { empty } from "@ember/object/computed"; import Component from "@ember/component"; import { action } from "@ember/object"; +import { empty } from "@ember/object/computed"; import { on } from "discourse-common/utils/decorators"; export default Component.extend({ diff --git a/app/assets/javascripts/admin/addon/components/site-setting.js b/app/assets/javascripts/admin/addon/components/site-setting.js index 695ddac781..888daa3117 100644 --- a/app/assets/javascripts/admin/addon/components/site-setting.js +++ b/app/assets/javascripts/admin/addon/components/site-setting.js @@ -1,7 +1,7 @@ -import Component from "@ember/component"; import BufferedContent from "discourse/mixins/buffered-content"; -import SiteSetting from "admin/models/site-setting"; +import Component from "@ember/component"; import SettingComponent from "admin/mixins/setting-component"; +import SiteSetting from "admin/models/site-setting"; import { readOnly } from "@ember/object/computed"; export default Component.extend(BufferedContent, SettingComponent, { diff --git a/app/assets/javascripts/admin/addon/components/site-settings/bool.js b/app/assets/javascripts/admin/addon/components/site-settings/bool.js index a565648c6d..70d7c59ae0 100644 --- a/app/assets/javascripts/admin/addon/components/site-settings/bool.js +++ b/app/assets/javascripts/admin/addon/components/site-settings/bool.js @@ -1,6 +1,6 @@ +import Component from "@ember/component"; import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; -import Component from "@ember/component"; export default Component.extend({ @discourseComputed("value") diff --git a/app/assets/javascripts/admin/addon/components/site-settings/category-list.js b/app/assets/javascripts/admin/addon/components/site-settings/category-list.js index 0369756c08..9dc792e6de 100644 --- a/app/assets/javascripts/admin/addon/components/site-settings/category-list.js +++ b/app/assets/javascripts/admin/addon/components/site-settings/category-list.js @@ -1,5 +1,5 @@ -import Component from "@ember/component"; import Category from "discourse/models/category"; +import Component from "@ember/component"; import { computed } from "@ember/object"; export default Component.extend({ diff --git a/app/assets/javascripts/admin/addon/components/site-settings/color.js b/app/assets/javascripts/admin/addon/components/site-settings/color.js index 7e5e71effc..8d098cb7d8 100644 --- a/app/assets/javascripts/admin/addon/components/site-settings/color.js +++ b/app/assets/javascripts/admin/addon/components/site-settings/color.js @@ -1,5 +1,5 @@ +import { action, computed } from "@ember/object"; import Component from "@ember/component"; -import { computed, action } from "@ember/object"; function RGBToHex(rgb) { // Choose correct separator diff --git a/app/assets/javascripts/admin/addon/components/site-settings/group-list.js b/app/assets/javascripts/admin/addon/components/site-settings/group-list.js index f7ea894503..ad9dbbfd1c 100644 --- a/app/assets/javascripts/admin/addon/components/site-settings/group-list.js +++ b/app/assets/javascripts/admin/addon/components/site-settings/group-list.js @@ -1,5 +1,5 @@ -import { computed } from "@ember/object"; import Component from "@ember/component"; +import { computed } from "@ember/object"; export default Component.extend({ tokenSeparator: "|", diff --git a/app/assets/javascripts/admin/addon/components/site-settings/tag-list.js b/app/assets/javascripts/admin/addon/components/site-settings/tag-list.js index e5723668d7..d679063df1 100644 --- a/app/assets/javascripts/admin/addon/components/site-settings/tag-list.js +++ b/app/assets/javascripts/admin/addon/components/site-settings/tag-list.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; import { action } from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ @discourseComputed("value") diff --git a/app/assets/javascripts/admin/addon/components/site-text-summary.js b/app/assets/javascripts/admin/addon/components/site-text-summary.js index abe4f5fa63..071091f12b 100644 --- a/app/assets/javascripts/admin/addon/components/site-text-summary.js +++ b/app/assets/javascripts/admin/addon/components/site-text-summary.js @@ -1,6 +1,6 @@ import Component from "@ember/component"; -import { on } from "discourse-common/utils/decorators"; import highlightHTML from "discourse/lib/highlight-html"; +import { on } from "discourse-common/utils/decorators"; export default Component.extend({ classNames: ["site-text"], diff --git a/app/assets/javascripts/admin/addon/components/suspension-details.js b/app/assets/javascripts/admin/addon/components/suspension-details.js index f9edc0e225..e99a7e1c5b 100644 --- a/app/assets/javascripts/admin/addon/components/suspension-details.js +++ b/app/assets/javascripts/admin/addon/components/suspension-details.js @@ -1,8 +1,8 @@ import Component from "@ember/component"; -import discourseComputed from "discourse-common/utils/decorators"; import I18n from "I18n"; -import { equal } from "@ember/object/computed"; import { action } from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; +import { equal } from "@ember/object/computed"; const CUSTOM_REASON_KEY = "custom"; diff --git a/app/assets/javascripts/admin/addon/components/tags-uploader.js b/app/assets/javascripts/admin/addon/components/tags-uploader.js index 3c547adf8d..1dc3bfc467 100644 --- a/app/assets/javascripts/admin/addon/components/tags-uploader.js +++ b/app/assets/javascripts/admin/addon/components/tags-uploader.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; -import { alias } from "@ember/object/computed"; import Component from "@ember/component"; +import I18n from "I18n"; import UploadMixin from "discourse/mixins/upload"; +import { alias } from "@ember/object/computed"; import bootbox from "bootbox"; export default Component.extend(UploadMixin, { diff --git a/app/assets/javascripts/admin/addon/components/theme-setting-editor.js b/app/assets/javascripts/admin/addon/components/theme-setting-editor.js index cf87683ff7..8ceaf32bbb 100644 --- a/app/assets/javascripts/admin/addon/components/theme-setting-editor.js +++ b/app/assets/javascripts/admin/addon/components/theme-setting-editor.js @@ -1,5 +1,5 @@ -import Component from "@ember/component"; import BufferedContent from "discourse/mixins/buffered-content"; +import Component from "@ember/component"; import SettingComponent from "admin/mixins/setting-component"; import { ajax } from "discourse/lib/ajax"; import { url } from "discourse/lib/computed"; diff --git a/app/assets/javascripts/admin/addon/components/theme-setting-relatives-selector.js b/app/assets/javascripts/admin/addon/components/theme-setting-relatives-selector.js index b23760f665..4f02a14768 100644 --- a/app/assets/javascripts/admin/addon/components/theme-setting-relatives-selector.js +++ b/app/assets/javascripts/admin/addon/components/theme-setting-relatives-selector.js @@ -1,5 +1,5 @@ -import Component from "@ember/component"; import BufferedContent from "discourse/mixins/buffered-content"; +import Component from "@ember/component"; import SettingComponent from "admin/mixins/setting-component"; export default Component.extend(BufferedContent, SettingComponent, { diff --git a/app/assets/javascripts/admin/addon/components/theme-translation.js b/app/assets/javascripts/admin/addon/components/theme-translation.js index 6174aeb4eb..7a598db1c8 100644 --- a/app/assets/javascripts/admin/addon/components/theme-translation.js +++ b/app/assets/javascripts/admin/addon/components/theme-translation.js @@ -1,7 +1,7 @@ -import { alias } from "@ember/object/computed"; -import Component from "@ember/component"; import BufferedContent from "discourse/mixins/buffered-content"; +import Component from "@ember/component"; import SettingComponent from "admin/mixins/setting-component"; +import { alias } from "@ember/object/computed"; export default Component.extend(BufferedContent, SettingComponent, { layoutName: "admin/templates/components/site-setting", diff --git a/app/assets/javascripts/admin/addon/components/themes-list-item.js b/app/assets/javascripts/admin/addon/components/themes-list-item.js index d8af9eabc7..edc1783535 100644 --- a/app/assets/javascripts/admin/addon/components/themes-list-item.js +++ b/app/assets/javascripts/admin/addon/components/themes-list-item.js @@ -1,10 +1,10 @@ -import { gt, and } from "@ember/object/computed"; -import { schedule } from "@ember/runloop"; -import Component from "@ember/component"; +import { and, gt } from "@ember/object/computed"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; -import { iconHTML } from "discourse-common/lib/icon-library"; +import Component from "@ember/component"; import { escape } from "pretty-text/sanitizer"; +import { iconHTML } from "discourse-common/lib/icon-library"; import { isTesting } from "discourse-common/config/environment"; +import { schedule } from "@ember/runloop"; const MAX_COMPONENTS = 4; diff --git a/app/assets/javascripts/admin/addon/components/themes-list.js b/app/assets/javascripts/admin/addon/components/themes-list.js index cdad5e454a..715ca9ccee 100644 --- a/app/assets/javascripts/admin/addon/components/themes-list.js +++ b/app/assets/javascripts/admin/addon/components/themes-list.js @@ -1,6 +1,6 @@ -import { gt, equal } from "@ember/object/computed"; +import { COMPONENTS, THEMES } from "admin/models/theme"; +import { equal, gt } from "@ember/object/computed"; import Component from "@ember/component"; -import { THEMES, COMPONENTS } from "admin/models/theme"; import discourseComputed from "discourse-common/utils/decorators"; import { inject as service } from "@ember/service"; diff --git a/app/assets/javascripts/admin/addon/components/value-list.js b/app/assets/javascripts/admin/addon/components/value-list.js index 9951eee3f4..aa89de7f38 100644 --- a/app/assets/javascripts/admin/addon/components/value-list.js +++ b/app/assets/javascripts/admin/addon/components/value-list.js @@ -1,7 +1,7 @@ import discourseComputed, { on } from "discourse-common/utils/decorators"; -import { makeArray } from "discourse-common/lib/helpers"; import { empty, reads } from "@ember/object/computed"; import Component from "@ember/component"; +import { makeArray } from "discourse-common/lib/helpers"; export default Component.extend({ classNameBindings: [":value-list"], diff --git a/app/assets/javascripts/admin/addon/components/watched-word-form.js b/app/assets/javascripts/admin/addon/components/watched-word-form.js index 5dc9d7b8e6..788103f793 100644 --- a/app/assets/javascripts/admin/addon/components/watched-word-form.js +++ b/app/assets/javascripts/admin/addon/components/watched-word-form.js @@ -1,13 +1,13 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import { schedule } from "@ember/runloop"; +import discourseComputed, { + observes, + on, +} from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import I18n from "I18n"; import WatchedWord from "admin/models/watched-word"; import bootbox from "bootbox"; -import discourseComputed, { - on, - observes, -} from "discourse-common/utils/decorators"; +import { isEmpty } from "@ember/utils"; +import { schedule } from "@ember/runloop"; export default Component.extend({ classNames: ["watched-word-form"], diff --git a/app/assets/javascripts/admin/addon/components/watched-word-uploader.js b/app/assets/javascripts/admin/addon/components/watched-word-uploader.js index 800c0d4988..00c8ce4d99 100644 --- a/app/assets/javascripts/admin/addon/components/watched-word-uploader.js +++ b/app/assets/javascripts/admin/addon/components/watched-word-uploader.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { alias } from "@ember/object/computed"; import Component from "@ember/component"; +import I18n from "I18n"; import UploadMixin from "discourse/mixins/upload"; +import { alias } from "@ember/object/computed"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend(UploadMixin, { type: "txt", diff --git a/app/assets/javascripts/admin/addon/controllers/admin-api-keys-index.js b/app/assets/javascripts/admin/addon/controllers/admin-api-keys-index.js index 880a2c6435..5b4ee4ee0a 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-api-keys-index.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-api-keys-index.js @@ -1,5 +1,5 @@ -import { popupAjaxError } from "discourse/lib/ajax-error"; import Controller from "@ember/controller"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ actions: { diff --git a/app/assets/javascripts/admin/addon/controllers/admin-api-keys-new.js b/app/assets/javascripts/admin/addon/controllers/admin-api-keys-new.js index 06e495109c..8d56042a67 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-api-keys-new.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-api-keys-new.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; -import { isBlank } from "@ember/utils"; import Controller from "@ember/controller"; +import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; +import { isBlank } from "@ember/utils"; import { popupAjaxError } from "discourse/lib/ajax-error"; import showModal from "discourse/lib/show-modal"; diff --git a/app/assets/javascripts/admin/addon/controllers/admin-api-keys-show.js b/app/assets/javascripts/admin/addon/controllers/admin-api-keys-show.js index 11251a45e6..28a883d985 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-api-keys-show.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-api-keys-show.js @@ -1,8 +1,8 @@ -import { bufferedProperty } from "discourse/mixins/buffered-content"; import Controller from "@ember/controller"; +import { bufferedProperty } from "discourse/mixins/buffered-content"; +import { empty } from "@ember/object/computed"; import { isEmpty } from "@ember/utils"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import { empty } from "@ember/object/computed"; import showModal from "discourse/lib/show-modal"; export default Controller.extend(bufferedProperty("model"), { diff --git a/app/assets/javascripts/admin/addon/controllers/admin-backups-index.js b/app/assets/javascripts/admin/addon/controllers/admin-backups-index.js index c32e70f633..c53adeecf9 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-backups-index.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-backups-index.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import { alias, equal } from "@ember/object/computed"; import Controller, { inject as controller } from "@ember/controller"; +import { alias, equal } from "@ember/object/computed"; +import { i18n, setting } from "discourse/lib/computed"; +import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; -import discourseComputed from "discourse-common/utils/decorators"; -import { setting, i18n } from "discourse/lib/computed"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend({ adminBackups: controller(), diff --git a/app/assets/javascripts/admin/addon/controllers/admin-backups-logs.js b/app/assets/javascripts/admin/addon/controllers/admin-backups-logs.js index 8c70f05439..e8a1694e2c 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-backups-logs.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-backups-logs.js @@ -1,5 +1,5 @@ -import { alias } from "@ember/object/computed"; import Controller, { inject as controller } from "@ember/controller"; +import { alias } from "@ember/object/computed"; export default Controller.extend({ adminBackups: controller(), diff --git a/app/assets/javascripts/admin/addon/controllers/admin-backups.js b/app/assets/javascripts/admin/addon/controllers/admin-backups.js index 83a93d8898..77dfbc3132 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-backups.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-backups.js @@ -1,4 +1,4 @@ -import { not, and } from "@ember/object/computed"; +import { and, not } from "@ember/object/computed"; import Controller from "@ember/controller"; export default Controller.extend({ noOperationIsRunning: not("model.isOperationRunning"), diff --git a/app/assets/javascripts/admin/addon/controllers/admin-badges-award.js b/app/assets/javascripts/admin/addon/controllers/admin-badges-award.js index f3ef51d701..218b3cb0e0 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-badges-award.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-badges-award.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; import Controller from "@ember/controller"; +import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; -import { popupAjaxError } from "discourse/lib/ajax-error"; import bootbox from "bootbox"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ saving: false, diff --git a/app/assets/javascripts/admin/addon/controllers/admin-badges-show.js b/app/assets/javascripts/admin/addon/controllers/admin-badges-show.js index 3fec918ba9..23341f0d27 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-badges-show.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-badges-show.js @@ -1,12 +1,12 @@ -import I18n from "I18n"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; -import { reads } from "@ember/object/computed"; import Controller, { inject as controller } from "@ember/controller"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import { bufferedProperty } from "discourse/mixins/buffered-content"; -import { propertyNotEqual } from "discourse/lib/computed"; -import { run } from "@ember/runloop"; +import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import I18n from "I18n"; import bootbox from "bootbox"; +import { bufferedProperty } from "discourse/mixins/buffered-content"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import { propertyNotEqual } from "discourse/lib/computed"; +import { reads } from "@ember/object/computed"; +import { run } from "@ember/runloop"; export default Controller.extend(bufferedProperty("model"), { adminBadges: controller(), diff --git a/app/assets/javascripts/admin/addon/controllers/admin-badges.js b/app/assets/javascripts/admin/addon/controllers/admin-badges.js index 433c49bac5..11d78fc4cc 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-badges.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-badges.js @@ -1,6 +1,6 @@ import Controller from "@ember/controller"; -import { inject as service } from "@ember/service"; import discourseComputed from "discourse-common/utils/decorators"; +import { inject as service } from "@ember/service"; export default Controller.extend({ routing: service("-routing"), diff --git a/app/assets/javascripts/admin/addon/controllers/admin-customize-colors-show.js b/app/assets/javascripts/admin/addon/controllers/admin-customize-colors-show.js index 5fa6218839..37394fd17f 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-customize-colors-show.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-customize-colors-show.js @@ -1,8 +1,8 @@ +import Controller from "@ember/controller"; import I18n from "I18n"; +import bootbox from "bootbox"; import discourseComputed from "discourse-common/utils/decorators"; import { later } from "@ember/runloop"; -import Controller from "@ember/controller"; -import bootbox from "bootbox"; export default Controller.extend({ @discourseComputed("model.colors", "onlyOverridden") diff --git a/app/assets/javascripts/admin/addon/controllers/admin-customize-colors.js b/app/assets/javascripts/admin/addon/controllers/admin-customize-colors.js index 01898b161a..7f06b1f3f0 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-customize-colors.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-customize-colors.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; -import EmberObject from "@ember/object"; import Controller from "@ember/controller"; -import showModal from "discourse/lib/show-modal"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; +import showModal from "discourse/lib/show-modal"; export default Controller.extend({ @discourseComputed("model.@each.id") diff --git a/app/assets/javascripts/admin/addon/controllers/admin-customize-email-style-edit.js b/app/assets/javascripts/admin/addon/controllers/admin-customize-email-style-edit.js index f1190600e8..79813399b2 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-customize-email-style-edit.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-customize-email-style-edit.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; +import I18n from "I18n"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend({ @discourseComputed("model.isSaving") diff --git a/app/assets/javascripts/admin/addon/controllers/admin-customize-email-templates-edit.js b/app/assets/javascripts/admin/addon/controllers/admin-customize-email-templates-edit.js index f5f7a563ef..d20f812ca3 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-customize-email-templates-edit.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-customize-email-templates-edit.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import Controller, { inject as controller } from "@ember/controller"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import { bufferedProperty } from "discourse/mixins/buffered-content"; +import I18n from "I18n"; import { action } from "@ember/object"; import bootbox from "bootbox"; +import { bufferedProperty } from "discourse/mixins/buffered-content"; +import discourseComputed from "discourse-common/utils/decorators"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend(bufferedProperty("emailTemplate"), { adminCustomizeEmailTemplates: controller(), diff --git a/app/assets/javascripts/admin/addon/controllers/admin-customize-email-templates.js b/app/assets/javascripts/admin/addon/controllers/admin-customize-email-templates.js index 415cf1d157..a3d7f360e0 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-customize-email-templates.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-customize-email-templates.js @@ -1,6 +1,6 @@ -import { sort } from "@ember/object/computed"; -import { action } from "@ember/object"; import Controller from "@ember/controller"; +import { action } from "@ember/object"; +import { sort } from "@ember/object/computed"; export default Controller.extend({ sortedTemplates: sort("emailTemplates", "titleSorting"), diff --git a/app/assets/javascripts/admin/addon/controllers/admin-customize-robots-txt.js b/app/assets/javascripts/admin/addon/controllers/admin-customize-robots-txt.js index 7da0720744..a178f2c999 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-customize-robots-txt.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-customize-robots-txt.js @@ -1,7 +1,7 @@ -import { not } from "@ember/object/computed"; import Controller from "@ember/controller"; import { ajax } from "discourse/lib/ajax"; import { bufferedProperty } from "discourse/mixins/buffered-content"; +import { not } from "@ember/object/computed"; import { propertyEqual } from "discourse/lib/computed"; export default Controller.extend(bufferedProperty("model"), { diff --git a/app/assets/javascripts/admin/addon/controllers/admin-customize-themes-edit.js b/app/assets/javascripts/admin/addon/controllers/admin-customize-themes-edit.js index 889d90a921..b69b57510c 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-customize-themes-edit.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-customize-themes-edit.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; import Controller from "@ember/controller"; -import { url } from "discourse/lib/computed"; +import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; +import { url } from "discourse/lib/computed"; export default Controller.extend({ section: null, diff --git a/app/assets/javascripts/admin/addon/controllers/admin-customize-themes-show.js b/app/assets/javascripts/admin/addon/controllers/admin-customize-themes-show.js index 9e9afda71d..ba3a2d323c 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-customize-themes-show.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-customize-themes-show.js @@ -1,21 +1,21 @@ -import I18n from "I18n"; -import { makeArray } from "discourse-common/lib/helpers"; +import { COMPONENTS, THEMES } from "admin/models/theme"; import { empty, filterBy, - match, mapBy, + match, notEmpty, } from "@ember/object/computed"; import Controller from "@ember/controller"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; +import ThemeSettings from "admin/models/theme-settings"; +import bootbox from "bootbox"; import discourseComputed from "discourse-common/utils/decorators"; -import { url } from "discourse/lib/computed"; +import { makeArray } from "discourse-common/lib/helpers"; import { popupAjaxError } from "discourse/lib/ajax-error"; import showModal from "discourse/lib/show-modal"; -import ThemeSettings from "admin/models/theme-settings"; -import { THEMES, COMPONENTS } from "admin/models/theme"; -import EmberObject from "@ember/object"; -import bootbox from "bootbox"; +import { url } from "discourse/lib/computed"; const THEME_UPLOAD_VAR = 2; diff --git a/app/assets/javascripts/admin/addon/controllers/admin-customize-themes.js b/app/assets/javascripts/admin/addon/controllers/admin-customize-themes.js index 3ffe9301f1..17dda66040 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-customize-themes.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-customize-themes.js @@ -1,6 +1,6 @@ import Controller from "@ember/controller"; -import discourseComputed from "discourse-common/utils/decorators"; import { THEMES } from "admin/models/theme"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend({ currentTab: THEMES, diff --git a/app/assets/javascripts/admin/addon/controllers/admin-dashboard-general.js b/app/assets/javascripts/admin/addon/controllers/admin-dashboard-general.js index fe97fb0855..a831b686bc 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-dashboard-general.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-dashboard-general.js @@ -1,13 +1,13 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { makeArray } from "discourse-common/lib/helpers"; import Controller, { inject } from "@ember/controller"; -import { setting } from "discourse/lib/computed"; import AdminDashboard from "admin/models/admin-dashboard"; -import Report from "admin/models/report"; +import I18n from "I18n"; import PeriodComputationMixin from "admin/mixins/period-computation"; +import Report from "admin/models/report"; import { computed } from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; import getURL from "discourse-common/lib/get-url"; +import { makeArray } from "discourse-common/lib/helpers"; +import { setting } from "discourse/lib/computed"; function staticReport(reportType) { return computed("reports.[]", function () { diff --git a/app/assets/javascripts/admin/addon/controllers/admin-dashboard-moderation.js b/app/assets/javascripts/admin/addon/controllers/admin-dashboard-moderation.js index 6781c50bde..16e632d6e2 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-dashboard-moderation.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-dashboard-moderation.js @@ -1,8 +1,8 @@ -import getURL from "discourse-common/lib/get-url"; -import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; import PeriodComputationMixin from "admin/mixins/period-computation"; import { computed } from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; +import getURL from "discourse-common/lib/get-url"; export default Controller.extend(PeriodComputationMixin, { @discourseComputed diff --git a/app/assets/javascripts/admin/addon/controllers/admin-dashboard-reports.js b/app/assets/javascripts/admin/addon/controllers/admin-dashboard-reports.js index 966304a0e5..445eb667d8 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-dashboard-reports.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-dashboard-reports.js @@ -1,7 +1,7 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { debounce } from "@ember/runloop"; import Controller from "@ember/controller"; import { INPUT_DELAY } from "discourse-common/config/environment"; +import { debounce } from "@ember/runloop"; +import discourseComputed from "discourse-common/utils/decorators"; const { get } = Ember; diff --git a/app/assets/javascripts/admin/addon/controllers/admin-dashboard.js b/app/assets/javascripts/admin/addon/controllers/admin-dashboard.js index 29e1ad0c5a..89955953fb 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-dashboard.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-dashboard.js @@ -1,9 +1,9 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Controller, { inject } from "@ember/controller"; -import { setting } from "discourse/lib/computed"; -import { computed } from "@ember/object"; import AdminDashboard from "admin/models/admin-dashboard"; import VersionCheck from "admin/models/version-check"; +import { computed } from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; +import { setting } from "discourse/lib/computed"; const PROBLEMS_CHECK_MINUTES = 1; diff --git a/app/assets/javascripts/admin/addon/controllers/admin-email-bounced.js b/app/assets/javascripts/admin/addon/controllers/admin-email-bounced.js index 07721cdff0..874b7147fb 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-email-bounced.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-email-bounced.js @@ -1,7 +1,7 @@ import AdminEmailLogsController from "admin/controllers/admin-email-logs"; +import { INPUT_DELAY } from "discourse-common/config/environment"; import discourseDebounce from "discourse/lib/debounce"; import { observes } from "discourse-common/utils/decorators"; -import { INPUT_DELAY } from "discourse-common/config/environment"; export default AdminEmailLogsController.extend({ @observes("filter.{status,user,address,type}") diff --git a/app/assets/javascripts/admin/addon/controllers/admin-email-index.js b/app/assets/javascripts/admin/addon/controllers/admin-email-index.js index f356731e6d..18bfd4a8c4 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-email-index.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-email-index.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; -import { empty } from "@ember/object/computed"; import Controller from "@ember/controller"; +import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; -import { observes } from "discourse-common/utils/decorators"; import bootbox from "bootbox"; +import { empty } from "@ember/object/computed"; +import { observes } from "discourse-common/utils/decorators"; export default Controller.extend({ /** diff --git a/app/assets/javascripts/admin/addon/controllers/admin-email-preview-digest.js b/app/assets/javascripts/admin/addon/controllers/admin-email-preview-digest.js index 4b6ba80ce6..4210f9cff2 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-email-preview-digest.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-email-preview-digest.js @@ -1,8 +1,8 @@ -import { empty, or, notEmpty } from "@ember/object/computed"; +import { empty, notEmpty, or } from "@ember/object/computed"; import Controller from "@ember/controller"; import EmailPreview from "admin/models/email-preview"; -import { popupAjaxError } from "discourse/lib/ajax-error"; import bootbox from "bootbox"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ username: null, diff --git a/app/assets/javascripts/admin/addon/controllers/admin-email-received.js b/app/assets/javascripts/admin/addon/controllers/admin-email-received.js index ab02337866..8b977c4d50 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-email-received.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-email-received.js @@ -1,8 +1,8 @@ import AdminEmailLogsController from "admin/controllers/admin-email-logs"; -import discourseDebounce from "discourse/lib/debounce"; -import IncomingEmail from "admin/models/incoming-email"; -import { observes } from "discourse-common/utils/decorators"; import { INPUT_DELAY } from "discourse-common/config/environment"; +import IncomingEmail from "admin/models/incoming-email"; +import discourseDebounce from "discourse/lib/debounce"; +import { observes } from "discourse-common/utils/decorators"; export default AdminEmailLogsController.extend({ @observes("filter.{status,from,to,subject}") diff --git a/app/assets/javascripts/admin/addon/controllers/admin-email-rejected.js b/app/assets/javascripts/admin/addon/controllers/admin-email-rejected.js index 2c160648c6..5be59e6ab8 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-email-rejected.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-email-rejected.js @@ -1,8 +1,8 @@ import AdminEmailLogsController from "admin/controllers/admin-email-logs"; -import discourseDebounce from "discourse/lib/debounce"; -import IncomingEmail from "admin/models/incoming-email"; -import { observes } from "discourse-common/utils/decorators"; import { INPUT_DELAY } from "discourse-common/config/environment"; +import IncomingEmail from "admin/models/incoming-email"; +import discourseDebounce from "discourse/lib/debounce"; +import { observes } from "discourse-common/utils/decorators"; export default AdminEmailLogsController.extend({ @observes("filter.{status,from,to,subject,error}") diff --git a/app/assets/javascripts/admin/addon/controllers/admin-email-sent.js b/app/assets/javascripts/admin/addon/controllers/admin-email-sent.js index 2c7890cde8..660f681c62 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-email-sent.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-email-sent.js @@ -1,7 +1,7 @@ import AdminEmailLogsController from "admin/controllers/admin-email-logs"; +import { INPUT_DELAY } from "discourse-common/config/environment"; import discourseDebounce from "discourse/lib/debounce"; import { observes } from "discourse-common/utils/decorators"; -import { INPUT_DELAY } from "discourse-common/config/environment"; export default AdminEmailLogsController.extend({ @observes("filter.{status,user,address,type,reply_key}") diff --git a/app/assets/javascripts/admin/addon/controllers/admin-email-skipped.js b/app/assets/javascripts/admin/addon/controllers/admin-email-skipped.js index 07721cdff0..874b7147fb 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-email-skipped.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-email-skipped.js @@ -1,7 +1,7 @@ import AdminEmailLogsController from "admin/controllers/admin-email-logs"; +import { INPUT_DELAY } from "discourse-common/config/environment"; import discourseDebounce from "discourse/lib/debounce"; import { observes } from "discourse-common/utils/decorators"; -import { INPUT_DELAY } from "discourse-common/config/environment"; export default AdminEmailLogsController.extend({ @observes("filter.{status,user,address,type}") diff --git a/app/assets/javascripts/admin/addon/controllers/admin-embedding.js b/app/assets/javascripts/admin/addon/controllers/admin-embedding.js index df7f856ed5..147d4dd35a 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-embedding.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-embedding.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; +import discourseComputed from "discourse-common/utils/decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ diff --git a/app/assets/javascripts/admin/addon/controllers/admin-emojis.js b/app/assets/javascripts/admin/addon/controllers/admin-emojis.js index 4019cb188e..94e284c0c9 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-emojis.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-emojis.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; -import { sort } from "@ember/object/computed"; import EmberObject, { action, computed } from "@ember/object"; import Controller from "@ember/controller"; +import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; +import { sort } from "@ember/object/computed"; const ALL_FILTER = "all"; diff --git a/app/assets/javascripts/admin/addon/controllers/admin-logs-screened-emails.js b/app/assets/javascripts/admin/addon/controllers/admin-logs-screened-emails.js index 134968eb10..ed3cd6489d 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-logs-screened-emails.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-logs-screened-emails.js @@ -1,7 +1,7 @@ import Controller from "@ember/controller"; +import ScreenedEmail from "admin/models/screened-email"; import { exportEntity } from "discourse/lib/export-csv"; import { outputExportResult } from "discourse/lib/export-result"; -import ScreenedEmail from "admin/models/screened-email"; export default Controller.extend({ loading: false, diff --git a/app/assets/javascripts/admin/addon/controllers/admin-logs-screened-ip-addresses.js b/app/assets/javascripts/admin/addon/controllers/admin-logs-screened-ip-addresses.js index 68ac649425..32ed7ad944 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-logs-screened-ip-addresses.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-logs-screened-ip-addresses.js @@ -1,12 +1,12 @@ -import I18n from "I18n"; import Controller from "@ember/controller"; -import discourseDebounce from "discourse/lib/debounce"; -import { outputExportResult } from "discourse/lib/export-result"; -import { exportEntity } from "discourse/lib/export-csv"; -import ScreenedIpAddress from "admin/models/screened-ip-address"; -import { observes } from "discourse-common/utils/decorators"; +import I18n from "I18n"; import { INPUT_DELAY } from "discourse-common/config/environment"; +import ScreenedIpAddress from "admin/models/screened-ip-address"; import bootbox from "bootbox"; +import discourseDebounce from "discourse/lib/debounce"; +import { exportEntity } from "discourse/lib/export-csv"; +import { observes } from "discourse-common/utils/decorators"; +import { outputExportResult } from "discourse/lib/export-result"; export default Controller.extend({ loading: false, diff --git a/app/assets/javascripts/admin/addon/controllers/admin-logs-screened-urls.js b/app/assets/javascripts/admin/addon/controllers/admin-logs-screened-urls.js index 90d008bb86..86621f5968 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-logs-screened-urls.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-logs-screened-urls.js @@ -1,7 +1,7 @@ import Controller from "@ember/controller"; +import ScreenedUrl from "admin/models/screened-url"; import { exportEntity } from "discourse/lib/export-csv"; import { outputExportResult } from "discourse/lib/export-result"; -import ScreenedUrl from "admin/models/screened-url"; export default Controller.extend({ loading: false, diff --git a/app/assets/javascripts/admin/addon/controllers/admin-logs-staff-action-logs.js b/app/assets/javascripts/admin/addon/controllers/admin-logs-staff-action-logs.js index 70496049d1..2758a10aa1 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-logs-staff-action-logs.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-logs-staff-action-logs.js @@ -1,10 +1,10 @@ import Controller from "@ember/controller"; import EmberObject from "@ember/object"; -import { scheduleOnce } from "@ember/runloop"; +import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; import { exportEntity } from "discourse/lib/export-csv"; import { outputExportResult } from "discourse/lib/export-result"; -import I18n from "I18n"; +import { scheduleOnce } from "@ember/runloop"; export default Controller.extend({ queryParams: ["filters"], diff --git a/app/assets/javascripts/admin/addon/controllers/admin-permalinks.js b/app/assets/javascripts/admin/addon/controllers/admin-permalinks.js index 729cdab0c8..2aaf42ff3e 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-permalinks.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-permalinks.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; import Controller from "@ember/controller"; -import discourseDebounce from "discourse/lib/debounce"; -import Permalink from "admin/models/permalink"; -import { observes } from "discourse-common/utils/decorators"; +import I18n from "I18n"; import { INPUT_DELAY } from "discourse-common/config/environment"; +import Permalink from "admin/models/permalink"; import bootbox from "bootbox"; +import discourseDebounce from "discourse/lib/debounce"; +import { observes } from "discourse-common/utils/decorators"; export default Controller.extend({ loading: false, diff --git a/app/assets/javascripts/admin/addon/controllers/admin-plugins.js b/app/assets/javascripts/admin/addon/controllers/admin-plugins.js index 955aaba5c3..d19c5584aa 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-plugins.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-plugins.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend({ @discourseComputed diff --git a/app/assets/javascripts/admin/addon/controllers/admin-reports-show.js b/app/assets/javascripts/admin/addon/controllers/admin-reports-show.js index c20dfc1c2e..64a2c5de93 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-reports-show.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-reports-show.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend({ queryParams: ["start_date", "end_date", "filters", "chart_grouping"], diff --git a/app/assets/javascripts/admin/addon/controllers/admin-search-logs-index.js b/app/assets/javascripts/admin/addon/controllers/admin-search-logs-index.js index 2e2bcb4f73..bf110796f2 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-search-logs-index.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-search-logs-index.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import Controller from "@ember/controller"; +import I18n from "I18n"; export const DEFAULT_PERIOD = "yearly"; export default Controller.extend({ diff --git a/app/assets/javascripts/admin/addon/controllers/admin-search-logs-term.js b/app/assets/javascripts/admin/addon/controllers/admin-search-logs-term.js index 8ee5dd5df1..2d4f22211b 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-search-logs-term.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-search-logs-term.js @@ -1,6 +1,6 @@ -import I18n from "I18n"; import Controller from "@ember/controller"; import { DEFAULT_PERIOD } from "admin/controllers/admin-search-logs-index"; +import I18n from "I18n"; export default Controller.extend({ loading: false, diff --git a/app/assets/javascripts/admin/addon/controllers/admin-site-settings-category.js b/app/assets/javascripts/admin/addon/controllers/admin-site-settings-category.js index 5a12f1d717..2727c56010 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-site-settings-category.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-site-settings-category.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Controller, { inject as controller } from "@ember/controller"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend({ adminSiteSettings: controller(), diff --git a/app/assets/javascripts/admin/addon/controllers/admin-site-settings.js b/app/assets/javascripts/admin/addon/controllers/admin-site-settings.js index 02e7ab8f07..7dea3a237c 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-site-settings.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-site-settings.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import { alias } from "@ember/object/computed"; import Controller from "@ember/controller"; -import discourseDebounce from "discourse/lib/debounce"; -import { observes } from "discourse-common/utils/decorators"; +import I18n from "I18n"; import { INPUT_DELAY } from "discourse-common/config/environment"; +import { alias } from "@ember/object/computed"; +import discourseDebounce from "discourse/lib/debounce"; +import { isEmpty } from "@ember/utils"; +import { observes } from "discourse-common/utils/decorators"; export default Controller.extend({ filter: null, diff --git a/app/assets/javascripts/admin/addon/controllers/admin-site-text-edit.js b/app/assets/javascripts/admin/addon/controllers/admin-site-text-edit.js index b33bbe3968..99e1c19af3 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-site-text-edit.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-site-text-edit.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import { bufferedProperty } from "discourse/mixins/buffered-content"; +import I18n from "I18n"; import bootbox from "bootbox"; +import { bufferedProperty } from "discourse/mixins/buffered-content"; +import discourseComputed from "discourse-common/utils/decorators"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend(bufferedProperty("siteText"), { saved: false, diff --git a/app/assets/javascripts/admin/addon/controllers/admin-site-text-index.js b/app/assets/javascripts/admin/addon/controllers/admin-site-text-index.js index e46096c751..fb1a238c3e 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-site-text-index.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-site-text-index.js @@ -1,5 +1,5 @@ -import { debounce } from "@ember/runloop"; import Controller from "@ember/controller"; +import { debounce } from "@ember/runloop"; let lastSearch; export default Controller.extend({ diff --git a/app/assets/javascripts/admin/addon/controllers/admin-user-badges.js b/app/assets/javascripts/admin/addon/controllers/admin-user-badges.js index 6951a7b562..2c5212e4ba 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-user-badges.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-user-badges.js @@ -1,11 +1,11 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { alias, sort } from "@ember/object/computed"; -import { next } from "@ember/runloop"; import Controller, { inject as controller } from "@ember/controller"; +import { alias, sort } from "@ember/object/computed"; import GrantBadgeController from "discourse/mixins/grant-badge-controller"; -import { popupAjaxError } from "discourse/lib/ajax-error"; +import I18n from "I18n"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; +import { next } from "@ember/runloop"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend(GrantBadgeController, { adminUser: controller(), diff --git a/app/assets/javascripts/admin/addon/controllers/admin-user-fields.js b/app/assets/javascripts/admin/addon/controllers/admin-user-fields.js index 913ed729a7..9b37e931da 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-user-fields.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-user-fields.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; import { gte, sort } from "@ember/object/computed"; import Controller from "@ember/controller"; -import { popupAjaxError } from "discourse/lib/ajax-error"; +import I18n from "I18n"; import bootbox from "bootbox"; +import { popupAjaxError } from "discourse/lib/ajax-error"; const MAX_FIELDS = 30; diff --git a/app/assets/javascripts/admin/addon/controllers/admin-user-index.js b/app/assets/javascripts/admin/addon/controllers/admin-user-index.js index 2bed595b3f..4912c3a397 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-user-index.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-user-index.js @@ -1,16 +1,16 @@ -import I18n from "I18n"; -import { notEmpty, and } from "@ember/object/computed"; -import { inject as service } from "@ember/service"; -import Controller from "@ember/controller"; -import { ajax } from "discourse/lib/ajax"; +import { and, notEmpty } from "@ember/object/computed"; +import { fmt, propertyNotEqual, setting } from "discourse/lib/computed"; import CanCheckEmails from "discourse/mixins/can-check-emails"; -import { propertyNotEqual, setting, fmt } from "discourse/lib/computed"; -import { userPath } from "discourse/lib/url"; -import { popupAjaxError } from "discourse/lib/ajax-error"; +import Controller from "@ember/controller"; +import I18n from "I18n"; +import { ajax } from "discourse/lib/ajax"; +import bootbox from "bootbox"; import discourseComputed from "discourse-common/utils/decorators"; import { htmlSafe } from "@ember/template"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import { inject as service } from "@ember/service"; import showModal from "discourse/lib/show-modal"; -import bootbox from "bootbox"; +import { userPath } from "discourse/lib/url"; export default Controller.extend(CanCheckEmails, { adminTools: service(), diff --git a/app/assets/javascripts/admin/addon/controllers/admin-users-list-show.js b/app/assets/javascripts/admin/addon/controllers/admin-users-list-show.js index fd20b6c308..0c2952e929 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-users-list-show.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-users-list-show.js @@ -1,11 +1,11 @@ -import I18n from "I18n"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; -import Controller from "@ember/controller"; -import discourseDebounce from "discourse/lib/debounce"; -import { i18n } from "discourse/lib/computed"; import AdminUser from "admin/models/admin-user"; import CanCheckEmails from "discourse/mixins/can-check-emails"; +import Controller from "@ember/controller"; +import I18n from "I18n"; import { INPUT_DELAY } from "discourse-common/config/environment"; +import discourseDebounce from "discourse/lib/debounce"; +import { i18n } from "discourse/lib/computed"; export default Controller.extend(CanCheckEmails, { model: null, diff --git a/app/assets/javascripts/admin/addon/controllers/admin-watched-words-action.js b/app/assets/javascripts/admin/addon/controllers/admin-watched-words-action.js index 6a9b78bf29..1daa8a6ec3 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-watched-words-action.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-watched-words-action.js @@ -1,13 +1,13 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { or } from "@ember/object/computed"; -import { schedule } from "@ember/runloop"; import Controller, { inject as controller } from "@ember/controller"; +import I18n from "I18n"; import WatchedWord from "admin/models/watched-word"; import { ajax } from "discourse/lib/ajax"; -import { fmt } from "discourse/lib/computed"; -import showModal from "discourse/lib/show-modal"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; +import { fmt } from "discourse/lib/computed"; +import { or } from "@ember/object/computed"; +import { schedule } from "@ember/runloop"; +import showModal from "discourse/lib/show-modal"; export default Controller.extend({ adminWatchedWords: controller(), diff --git a/app/assets/javascripts/admin/addon/controllers/admin-watched-words.js b/app/assets/javascripts/admin/addon/controllers/admin-watched-words.js index 151fc82c33..3ed8bee62f 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-watched-words.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-watched-words.js @@ -1,10 +1,10 @@ -import { isEmpty } from "@ember/utils"; -import { alias } from "@ember/object/computed"; -import EmberObject from "@ember/object"; import Controller from "@ember/controller"; -import discourseDebounce from "discourse/lib/debounce"; -import { observes } from "discourse-common/utils/decorators"; +import EmberObject from "@ember/object"; import { INPUT_DELAY } from "discourse-common/config/environment"; +import { alias } from "@ember/object/computed"; +import discourseDebounce from "discourse/lib/debounce"; +import { isEmpty } from "@ember/utils"; +import { observes } from "discourse-common/utils/decorators"; export default Controller.extend({ filter: null, diff --git a/app/assets/javascripts/admin/addon/controllers/admin-web-hooks-show-events.js b/app/assets/javascripts/admin/addon/controllers/admin-web-hooks-show-events.js index 49c87926d2..cdb4c9b615 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-web-hooks-show-events.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-web-hooks-show-events.js @@ -1,7 +1,7 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { alias } from "@ember/object/computed"; import Controller from "@ember/controller"; import { ajax } from "discourse/lib/ajax"; +import { alias } from "@ember/object/computed"; +import discourseComputed from "discourse-common/utils/decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ diff --git a/app/assets/javascripts/admin/addon/controllers/admin-web-hooks-show.js b/app/assets/javascripts/admin/addon/controllers/admin-web-hooks-show.js index f2e9f2178d..26b5fb20d0 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-web-hooks-show.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-web-hooks-show.js @@ -1,13 +1,13 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { isEmpty } from "@ember/utils"; -import { alias } from "@ember/object/computed"; import Controller, { inject as controller } from "@ember/controller"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import { extractDomainFromUrl } from "discourse/lib/utilities"; import EmberObject from "@ember/object"; -import { isAbsoluteURL } from "discourse-common/lib/get-url"; +import I18n from "I18n"; +import { alias } from "@ember/object/computed"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; +import { extractDomainFromUrl } from "discourse/lib/utilities"; +import { isAbsoluteURL } from "discourse-common/lib/get-url"; +import { isEmpty } from "@ember/utils"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ adminWebHooks: controller(), diff --git a/app/assets/javascripts/admin/addon/controllers/admin-web-hooks.js b/app/assets/javascripts/admin/addon/controllers/admin-web-hooks.js index cc13ea9e9d..6e1acf97dc 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-web-hooks.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-web-hooks.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; import Controller from "@ember/controller"; -import { popupAjaxError } from "discourse/lib/ajax-error"; +import I18n from "I18n"; import bootbox from "bootbox"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ actions: { diff --git a/app/assets/javascripts/admin/addon/controllers/admin.js b/app/assets/javascripts/admin/addon/controllers/admin.js index 4c51eb38b7..03838b789c 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin.js +++ b/app/assets/javascripts/admin/addon/controllers/admin.js @@ -1,7 +1,7 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { inject as service } from "@ember/service"; import Controller from "@ember/controller"; import { dasherize } from "@ember/string"; +import discourseComputed from "discourse-common/utils/decorators"; +import { inject as service } from "@ember/service"; export default Controller.extend({ router: service(), diff --git a/app/assets/javascripts/admin/addon/controllers/modals/admin-add-upload.js b/app/assets/javascripts/admin/addon/controllers/modals/admin-add-upload.js index 12b2be4f4a..876ac3ae9a 100644 --- a/app/assets/javascripts/admin/addon/controllers/modals/admin-add-upload.js +++ b/app/assets/javascripts/admin/addon/controllers/modals/admin-add-upload.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import { and, not } from "@ember/object/computed"; import Controller, { inject as controller } from "@ember/controller"; +import { and, not } from "@ember/object/computed"; +import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import I18n from "I18n"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { ajax } from "discourse/lib/ajax"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import { isEmpty } from "@ember/utils"; import { popupAjaxError } from "discourse/lib/ajax-error"; const THEME_FIELD_VARIABLE_TYPE_IDS = [2, 3, 4]; diff --git a/app/assets/javascripts/admin/addon/controllers/modals/admin-badge-preview.js b/app/assets/javascripts/admin/addon/controllers/modals/admin-badge-preview.js index 90af87cb73..322436303f 100644 --- a/app/assets/javascripts/admin/addon/controllers/modals/admin-badge-preview.js +++ b/app/assets/javascripts/admin/addon/controllers/modals/admin-badge-preview.js @@ -1,6 +1,6 @@ -import I18n from "I18n"; import { alias, map } from "@ember/object/computed"; import Controller from "@ember/controller"; +import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; import { escapeExpression } from "discourse/lib/utilities"; diff --git a/app/assets/javascripts/admin/addon/controllers/modals/admin-edit-badge-groupings.js b/app/assets/javascripts/admin/addon/controllers/modals/admin-edit-badge-groupings.js index cedbf43632..aa7d5665fa 100644 --- a/app/assets/javascripts/admin/addon/controllers/modals/admin-edit-badge-groupings.js +++ b/app/assets/javascripts/admin/addon/controllers/modals/admin-edit-badge-groupings.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import Controller from "@ember/controller"; import { A } from "@ember/array"; -import { ajax } from "discourse/lib/ajax"; +import Controller from "@ember/controller"; +import I18n from "I18n"; import ModalFunctionality from "discourse/mixins/modal-functionality"; -import { observes } from "discourse-common/utils/decorators"; +import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; +import { observes } from "discourse-common/utils/decorators"; export default Controller.extend(ModalFunctionality, { @observes("model") diff --git a/app/assets/javascripts/admin/addon/controllers/modals/admin-incoming-email.js b/app/assets/javascripts/admin/addon/controllers/modals/admin-incoming-email.js index 45df8e4628..6055baa1fe 100644 --- a/app/assets/javascripts/admin/addon/controllers/modals/admin-incoming-email.js +++ b/app/assets/javascripts/admin/addon/controllers/modals/admin-incoming-email.js @@ -1,7 +1,7 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; import IncomingEmail from "admin/models/incoming-email"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; +import discourseComputed from "discourse-common/utils/decorators"; import { longDate } from "discourse/lib/formatter"; import { popupAjaxError } from "discourse/lib/ajax-error"; diff --git a/app/assets/javascripts/admin/addon/controllers/modals/admin-install-theme.js b/app/assets/javascripts/admin/addon/controllers/modals/admin-install-theme.js index 4bdb6ca85c..79f47dfc69 100644 --- a/app/assets/javascripts/admin/addon/controllers/modals/admin-install-theme.js +++ b/app/assets/javascripts/admin/addon/controllers/modals/admin-install-theme.js @@ -1,12 +1,12 @@ -import I18n from "I18n"; -import { equal, match, alias } from "@ember/object/computed"; +import { COMPONENTS, THEMES } from "admin/models/theme"; import Controller, { inject as controller } from "@ember/controller"; +import { alias, equal, match } from "@ember/object/computed"; +import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import I18n from "I18n"; import ModalFunctionality from "discourse/mixins/modal-functionality"; +import { POPULAR_THEMES } from "discourse-common/helpers/popular-themes"; import { ajax } from "discourse/lib/ajax"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; -import { THEMES, COMPONENTS } from "admin/models/theme"; -import { POPULAR_THEMES } from "discourse-common/helpers/popular-themes"; import { set } from "@ember/object"; const MIN_NAME_LENGTH = 4; diff --git a/app/assets/javascripts/admin/addon/controllers/modals/admin-merge-users-confirmation.js b/app/assets/javascripts/admin/addon/controllers/modals/admin-merge-users-confirmation.js index f2233c07a3..48be2946bc 100644 --- a/app/assets/javascripts/admin/addon/controllers/modals/admin-merge-users-confirmation.js +++ b/app/assets/javascripts/admin/addon/controllers/modals/admin-merge-users-confirmation.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; import Controller, { inject as controller } from "@ember/controller"; +import I18n from "I18n"; import ModalFunctionality from "discourse/mixins/modal-functionality"; -import discourseComputed from "discourse-common/utils/decorators"; -import { alias } from "@ember/object/computed"; import { action } from "@ember/object"; +import { alias } from "@ember/object/computed"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend(ModalFunctionality, { adminUserIndex: controller(), diff --git a/app/assets/javascripts/admin/addon/controllers/modals/admin-merge-users-prompt.js b/app/assets/javascripts/admin/addon/controllers/modals/admin-merge-users-prompt.js index baaf7cef7a..2a088dff31 100644 --- a/app/assets/javascripts/admin/addon/controllers/modals/admin-merge-users-prompt.js +++ b/app/assets/javascripts/admin/addon/controllers/modals/admin-merge-users-prompt.js @@ -1,8 +1,8 @@ import Controller, { inject as controller } from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; -import discourseComputed from "discourse-common/utils/decorators"; -import { alias } from "@ember/object/computed"; import { action } from "@ember/object"; +import { alias } from "@ember/object/computed"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend(ModalFunctionality, { adminUserIndex: controller(), diff --git a/app/assets/javascripts/admin/addon/controllers/modals/admin-reseed.js b/app/assets/javascripts/admin/addon/controllers/modals/admin-reseed.js index b29a800aa0..672f6d8db3 100644 --- a/app/assets/javascripts/admin/addon/controllers/modals/admin-reseed.js +++ b/app/assets/javascripts/admin/addon/controllers/modals/admin-reseed.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import Controller from "@ember/controller"; +import I18n from "I18n"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; diff --git a/app/assets/javascripts/admin/addon/controllers/modals/admin-silence-user.js b/app/assets/javascripts/admin/addon/controllers/modals/admin-silence-user.js index e379b903c2..b76565f815 100644 --- a/app/assets/javascripts/admin/addon/controllers/modals/admin-silence-user.js +++ b/app/assets/javascripts/admin/addon/controllers/modals/admin-silence-user.js @@ -1,7 +1,7 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { isEmpty } from "@ember/utils"; import Controller from "@ember/controller"; import PenaltyController from "admin/mixins/penalty-controller"; +import discourseComputed from "discourse-common/utils/decorators"; +import { isEmpty } from "@ember/utils"; export default Controller.extend(PenaltyController, { silenceUntil: null, diff --git a/app/assets/javascripts/admin/addon/controllers/modals/admin-suspend-user.js b/app/assets/javascripts/admin/addon/controllers/modals/admin-suspend-user.js index 4997f62947..2712b57cf2 100644 --- a/app/assets/javascripts/admin/addon/controllers/modals/admin-suspend-user.js +++ b/app/assets/javascripts/admin/addon/controllers/modals/admin-suspend-user.js @@ -1,7 +1,7 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { isEmpty } from "@ember/utils"; import Controller from "@ember/controller"; import PenaltyController from "admin/mixins/penalty-controller"; +import discourseComputed from "discourse-common/utils/decorators"; +import { isEmpty } from "@ember/utils"; export default Controller.extend(PenaltyController, { suspendUntil: null, diff --git a/app/assets/javascripts/admin/addon/controllers/modals/admin-uploaded-image-list.js b/app/assets/javascripts/admin/addon/controllers/modals/admin-uploaded-image-list.js index 0aeffaad59..7ab4cb6984 100644 --- a/app/assets/javascripts/admin/addon/controllers/modals/admin-uploaded-image-list.js +++ b/app/assets/javascripts/admin/addon/controllers/modals/admin-uploaded-image-list.js @@ -1,5 +1,5 @@ +import { observes, on } from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; -import { on, observes } from "discourse-common/utils/decorators"; import ModalFunctionality from "discourse/mixins/modal-functionality"; export default Controller.extend(ModalFunctionality, { diff --git a/app/assets/javascripts/admin/addon/controllers/modals/admin-watched-word-test.js b/app/assets/javascripts/admin/addon/controllers/modals/admin-watched-word-test.js index b088cccb75..215cc08a6d 100644 --- a/app/assets/javascripts/admin/addon/controllers/modals/admin-watched-word-test.js +++ b/app/assets/javascripts/admin/addon/controllers/modals/admin-watched-word-test.js @@ -1,6 +1,6 @@ import Controller from "@ember/controller"; -import discourseComputed from "discourse-common/utils/decorators"; import ModalFunctionality from "discourse/mixins/modal-functionality"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend(ModalFunctionality, { @discourseComputed("value", "model.compiledRegularExpression") diff --git a/app/assets/javascripts/admin/addon/helpers/check-icon.js b/app/assets/javascripts/admin/addon/helpers/check-icon.js index 51fb238550..14ae3e649c 100644 --- a/app/assets/javascripts/admin/addon/helpers/check-icon.js +++ b/app/assets/javascripts/admin/addon/helpers/check-icon.js @@ -1,6 +1,6 @@ +import { htmlSafe } from "@ember/template"; import { registerUnbound } from "discourse-common/lib/helpers"; import { renderIcon } from "discourse-common/lib/icon-library"; -import { htmlSafe } from "@ember/template"; registerUnbound("check-icon", function (value) { let icon = value ? "check" : "times"; diff --git a/app/assets/javascripts/admin/addon/helpers/disposition-icon.js b/app/assets/javascripts/admin/addon/helpers/disposition-icon.js index 03960ff289..5dbd069cf3 100644 --- a/app/assets/javascripts/admin/addon/helpers/disposition-icon.js +++ b/app/assets/javascripts/admin/addon/helpers/disposition-icon.js @@ -1,5 +1,5 @@ -import { iconHTML } from "discourse-common/lib/icon-library"; import Helper from "@ember/component/helper"; +import { iconHTML } from "discourse-common/lib/icon-library"; export default Helper.extend({ compute([disposition]) { diff --git a/app/assets/javascripts/admin/addon/helpers/post-action-title.js b/app/assets/javascripts/admin/addon/helpers/post-action-title.js index 2d8e3c3fe8..9a1d213d93 100644 --- a/app/assets/javascripts/admin/addon/helpers/post-action-title.js +++ b/app/assets/javascripts/admin/addon/helpers/post-action-title.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import Helper from "@ember/component/helper"; +import I18n from "I18n"; function postActionTitle([id, nameKey]) { let title = I18n.t(`admin.flags.short_names.${nameKey}`, { diff --git a/app/assets/javascripts/admin/addon/helpers/preserve-newlines.js b/app/assets/javascripts/admin/addon/helpers/preserve-newlines.js index 16639f30cc..3d7f2e019e 100644 --- a/app/assets/javascripts/admin/addon/helpers/preserve-newlines.js +++ b/app/assets/javascripts/admin/addon/helpers/preserve-newlines.js @@ -1,5 +1,5 @@ -import { htmlHelper } from "discourse-common/lib/helpers"; import { escapeExpression } from "discourse/lib/utilities"; +import { htmlHelper } from "discourse-common/lib/helpers"; export default htmlHelper((str) => escapeExpression(str).replace(/\n/g, "
") diff --git a/app/assets/javascripts/admin/addon/mixins/penalty-controller.js b/app/assets/javascripts/admin/addon/mixins/penalty-controller.js index 250d60664f..55514dfe48 100644 --- a/app/assets/javascripts/admin/addon/mixins/penalty-controller.js +++ b/app/assets/javascripts/admin/addon/mixins/penalty-controller.js @@ -1,10 +1,10 @@ import I18n from "I18n"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; -import { extractError } from "discourse/lib/ajax-error"; import Mixin from "@ember/object/mixin"; -import { next } from "@ember/runloop"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; import { Promise } from "rsvp"; import bootbox from "bootbox"; +import { extractError } from "discourse/lib/ajax-error"; +import { next } from "@ember/runloop"; export default Mixin.create(ModalFunctionality, { errorMessage: null, diff --git a/app/assets/javascripts/admin/addon/mixins/period-computation.js b/app/assets/javascripts/admin/addon/mixins/period-computation.js index 7b8afe796a..b46503e73c 100644 --- a/app/assets/javascripts/admin/addon/mixins/period-computation.js +++ b/app/assets/javascripts/admin/addon/mixins/period-computation.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; import DiscourseURL from "discourse/lib/url"; import Mixin from "@ember/object/mixin"; +import discourseComputed from "discourse-common/utils/decorators"; export default Mixin.create({ queryParams: ["period"], diff --git a/app/assets/javascripts/admin/addon/mixins/setting-component.js b/app/assets/javascripts/admin/addon/mixins/setting-component.js index c7d42df43a..d96bd40c22 100644 --- a/app/assets/javascripts/admin/addon/mixins/setting-component.js +++ b/app/assets/javascripts/admin/addon/mixins/setting-component.js @@ -1,14 +1,14 @@ -import I18n from "I18n"; -import { warn } from "@ember/debug"; -import discourseComputed from "discourse-common/utils/decorators"; import { alias, oneWay } from "@ember/object/computed"; -import { categoryLinkHTML } from "discourse/helpers/category-link"; -import { on } from "@ember/object/evented"; +import I18n from "I18n"; import Mixin from "@ember/object/mixin"; -import showModal from "discourse/lib/show-modal"; import { Promise } from "rsvp"; import { ajax } from "discourse/lib/ajax"; +import { categoryLinkHTML } from "discourse/helpers/category-link"; +import discourseComputed from "discourse-common/utils/decorators"; import { htmlSafe } from "@ember/template"; +import { on } from "@ember/object/evented"; +import showModal from "discourse/lib/show-modal"; +import { warn } from "@ember/debug"; const CUSTOM_TYPES = [ "bool", diff --git a/app/assets/javascripts/admin/addon/mixins/setting-object.js b/app/assets/javascripts/admin/addon/mixins/setting-object.js index 5a40360b08..29dbb0d967 100644 --- a/app/assets/javascripts/admin/addon/mixins/setting-object.js +++ b/app/assets/javascripts/admin/addon/mixins/setting-object.js @@ -1,7 +1,7 @@ import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { computed } from "@ember/object"; import Mixin from "@ember/object/mixin"; +import { computed } from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; import { isPresent } from "@ember/utils"; export default Mixin.create({ diff --git a/app/assets/javascripts/admin/addon/models/admin-dashboard.js b/app/assets/javascripts/admin/addon/models/admin-dashboard.js index dec30faf2d..400ebe161b 100644 --- a/app/assets/javascripts/admin/addon/models/admin-dashboard.js +++ b/app/assets/javascripts/admin/addon/models/admin-dashboard.js @@ -1,5 +1,5 @@ -import { ajax } from "discourse/lib/ajax"; import EmberObject from "@ember/object"; +import { ajax } from "discourse/lib/ajax"; const GENERAL_ATTRIBUTES = [ "updated_at", diff --git a/app/assets/javascripts/admin/addon/models/admin-user.js b/app/assets/javascripts/admin/addon/models/admin-user.js index 0bc1132623..3f40cb7474 100644 --- a/app/assets/javascripts/admin/addon/models/admin-user.js +++ b/app/assets/javascripts/admin/addon/models/admin-user.js @@ -1,16 +1,16 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { filter, or, gt, lt, not } from "@ember/object/computed"; -import { iconHTML } from "discourse-common/lib/icon-library"; -import { ajax } from "discourse/lib/ajax"; -import { propertyNotEqual } from "discourse/lib/computed"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import Group from "discourse/models/group"; import DiscourseURL, { userPath } from "discourse/lib/url"; +import { filter, gt, lt, not, or } from "@ember/object/computed"; +import Group from "discourse/models/group"; +import I18n from "I18n"; import { Promise } from "rsvp"; import User from "discourse/models/user"; +import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; +import getURL from "discourse-common/lib/get-url"; +import { iconHTML } from "discourse-common/lib/icon-library"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import { propertyNotEqual } from "discourse/lib/computed"; const wrapAdmin = (user) => (user ? AdminUser.create(user) : null); diff --git a/app/assets/javascripts/admin/addon/models/api-key.js b/app/assets/javascripts/admin/addon/models/api-key.js index adf186d454..be5475a4ab 100644 --- a/app/assets/javascripts/admin/addon/models/api-key.js +++ b/app/assets/javascripts/admin/addon/models/api-key.js @@ -1,8 +1,8 @@ -import discourseComputed from "discourse-common/utils/decorators"; import AdminUser from "admin/models/admin-user"; import RestModel from "discourse/models/rest"; import { ajax } from "discourse/lib/ajax"; import { computed } from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; import { fmt } from "discourse/lib/computed"; const ApiKey = RestModel.extend({ diff --git a/app/assets/javascripts/admin/addon/models/backup-status.js b/app/assets/javascripts/admin/addon/models/backup-status.js index 474c3c1688..dffad0d060 100644 --- a/app/assets/javascripts/admin/addon/models/backup-status.js +++ b/app/assets/javascripts/admin/addon/models/backup-status.js @@ -1,6 +1,6 @@ +import EmberObject from "@ember/object"; import discourseComputed from "discourse-common/utils/decorators"; import { not } from "@ember/object/computed"; -import EmberObject from "@ember/object"; export default EmberObject.extend({ restoreDisabled: not("restoreEnabled"), diff --git a/app/assets/javascripts/admin/addon/models/backup.js b/app/assets/javascripts/admin/addon/models/backup.js index 4112b06f2b..2d2b88152c 100644 --- a/app/assets/javascripts/admin/addon/models/backup.js +++ b/app/assets/javascripts/admin/addon/models/backup.js @@ -1,10 +1,10 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import { ajax } from "discourse/lib/ajax"; -import { extractError } from "discourse/lib/ajax-error"; import EmberObject from "@ember/object"; +import I18n from "I18n"; import MessageBus from "message-bus-client"; +import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; +import { extractError } from "discourse/lib/ajax-error"; +import getURL from "discourse-common/lib/get-url"; const Backup = EmberObject.extend({ destroy() { diff --git a/app/assets/javascripts/admin/addon/models/color-scheme-color.js b/app/assets/javascripts/admin/addon/models/color-scheme-color.js index f5427d542c..49cb552a92 100644 --- a/app/assets/javascripts/admin/addon/models/color-scheme-color.js +++ b/app/assets/javascripts/admin/addon/models/color-scheme-color.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; import discourseComputed, { observes, on, } from "discourse-common/utils/decorators"; -import { propertyNotEqual } from "discourse/lib/computed"; import EmberObject from "@ember/object"; +import I18n from "I18n"; +import { propertyNotEqual } from "discourse/lib/computed"; const ColorSchemeColor = EmberObject.extend({ @on("init") diff --git a/app/assets/javascripts/admin/addon/models/color-scheme.js b/app/assets/javascripts/admin/addon/models/color-scheme.js index 4bce289ba7..e1b73ad14e 100644 --- a/app/assets/javascripts/admin/addon/models/color-scheme.js +++ b/app/assets/javascripts/admin/addon/models/color-scheme.js @@ -1,11 +1,11 @@ -import I18n from "I18n"; import { A } from "@ember/array"; import ArrayProxy from "@ember/array/proxy"; -import discourseComputed from "discourse-common/utils/decorators"; -import { not } from "@ember/object/computed"; -import { ajax } from "discourse/lib/ajax"; import ColorSchemeColor from "admin/models/color-scheme-color"; import EmberObject from "@ember/object"; +import I18n from "I18n"; +import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; +import { not } from "@ember/object/computed"; const ColorScheme = EmberObject.extend({ init() { diff --git a/app/assets/javascripts/admin/addon/models/email-log.js b/app/assets/javascripts/admin/addon/models/email-log.js index 18406ceb7a..6565611974 100644 --- a/app/assets/javascripts/admin/addon/models/email-log.js +++ b/app/assets/javascripts/admin/addon/models/email-log.js @@ -1,7 +1,7 @@ -import getURL from "discourse-common/lib/get-url"; -import { ajax } from "discourse/lib/ajax"; import AdminUser from "admin/models/admin-user"; import EmberObject from "@ember/object"; +import { ajax } from "discourse/lib/ajax"; +import getURL from "discourse-common/lib/get-url"; const EmailLog = EmberObject.extend({}); diff --git a/app/assets/javascripts/admin/addon/models/email-preview.js b/app/assets/javascripts/admin/addon/models/email-preview.js index 893fb5b4fb..96ffe2f949 100644 --- a/app/assets/javascripts/admin/addon/models/email-preview.js +++ b/app/assets/javascripts/admin/addon/models/email-preview.js @@ -1,5 +1,5 @@ -import { ajax } from "discourse/lib/ajax"; import EmberObject from "@ember/object"; +import { ajax } from "discourse/lib/ajax"; const EmailPreview = EmberObject.extend({}); diff --git a/app/assets/javascripts/admin/addon/models/email-settings.js b/app/assets/javascripts/admin/addon/models/email-settings.js index 52ac14acec..f959df408f 100644 --- a/app/assets/javascripts/admin/addon/models/email-settings.js +++ b/app/assets/javascripts/admin/addon/models/email-settings.js @@ -1,5 +1,5 @@ -import { ajax } from "discourse/lib/ajax"; import EmberObject from "@ember/object"; +import { ajax } from "discourse/lib/ajax"; const EmailSettings = EmberObject.extend({}); diff --git a/app/assets/javascripts/admin/addon/models/email-template.js b/app/assets/javascripts/admin/addon/models/email-template.js index b58da0457f..4be7d9fff9 100644 --- a/app/assets/javascripts/admin/addon/models/email-template.js +++ b/app/assets/javascripts/admin/addon/models/email-template.js @@ -1,5 +1,5 @@ -import { ajax } from "discourse/lib/ajax"; import RestModel from "discourse/models/rest"; +import { ajax } from "discourse/lib/ajax"; const { getProperties } = Ember; export default RestModel.extend({ diff --git a/app/assets/javascripts/admin/addon/models/flag-type.js b/app/assets/javascripts/admin/addon/models/flag-type.js index 607cb755d8..5859584ce7 100644 --- a/app/assets/javascripts/admin/addon/models/flag-type.js +++ b/app/assets/javascripts/admin/addon/models/flag-type.js @@ -1,6 +1,6 @@ import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import RestModel from "discourse/models/rest"; +import discourseComputed from "discourse-common/utils/decorators"; export default RestModel.extend({ @discourseComputed("id") diff --git a/app/assets/javascripts/admin/addon/models/incoming-email.js b/app/assets/javascripts/admin/addon/models/incoming-email.js index 42eb995f85..8489ae8dd3 100644 --- a/app/assets/javascripts/admin/addon/models/incoming-email.js +++ b/app/assets/javascripts/admin/addon/models/incoming-email.js @@ -1,6 +1,6 @@ -import { ajax } from "discourse/lib/ajax"; import AdminUser from "admin/models/admin-user"; import EmberObject from "@ember/object"; +import { ajax } from "discourse/lib/ajax"; const IncomingEmail = EmberObject.extend({}); diff --git a/app/assets/javascripts/admin/addon/models/permalink.js b/app/assets/javascripts/admin/addon/models/permalink.js index de61b27fd4..a2e8445b08 100644 --- a/app/assets/javascripts/admin/addon/models/permalink.js +++ b/app/assets/javascripts/admin/addon/models/permalink.js @@ -1,8 +1,8 @@ +import Category from "discourse/models/category"; +import DiscourseURL from "discourse/lib/url"; +import EmberObject from "@ember/object"; import { ajax } from "discourse/lib/ajax"; import discourseComputed from "discourse-common/utils/decorators"; -import DiscourseURL from "discourse/lib/url"; -import Category from "discourse/models/category"; -import EmberObject from "@ember/object"; const Permalink = EmberObject.extend({ save: function () { diff --git a/app/assets/javascripts/admin/addon/models/report.js b/app/assets/javascripts/admin/addon/models/report.js index a7b3d5786d..baa0aba16f 100644 --- a/app/assets/javascripts/admin/addon/models/report.js +++ b/app/assets/javascripts/admin/addon/models/report.js @@ -1,19 +1,19 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { makeArray } from "discourse-common/lib/helpers"; -import { isEmpty } from "@ember/utils"; -import EmberObject from "@ember/object"; -import { ajax } from "discourse/lib/ajax"; -import round from "discourse/lib/round"; +import { durationTiny, number } from "discourse/lib/formatter"; import { + escapeExpression, fillMissingDates, formatUsername, toNumber, - escapeExpression, } from "discourse/lib/utilities"; -import { number, durationTiny } from "discourse/lib/formatter"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; +import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; +import getURL from "discourse-common/lib/get-url"; +import { isEmpty } from "@ember/utils"; +import { makeArray } from "discourse-common/lib/helpers"; import { renderAvatar } from "discourse/helpers/user-avatar"; +import round from "discourse/lib/round"; // Change this line each time report format change // and you want to ensure cache is reset diff --git a/app/assets/javascripts/admin/addon/models/screened-email.js b/app/assets/javascripts/admin/addon/models/screened-email.js index 4e902488d1..857cca0d63 100644 --- a/app/assets/javascripts/admin/addon/models/screened-email.js +++ b/app/assets/javascripts/admin/addon/models/screened-email.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { ajax } from "discourse/lib/ajax"; import EmberObject from "@ember/object"; +import I18n from "I18n"; +import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; const ScreenedEmail = EmberObject.extend({ @discourseComputed("action") diff --git a/app/assets/javascripts/admin/addon/models/screened-ip-address.js b/app/assets/javascripts/admin/addon/models/screened-ip-address.js index 33e2b44317..a7d29aab31 100644 --- a/app/assets/javascripts/admin/addon/models/screened-ip-address.js +++ b/app/assets/javascripts/admin/addon/models/screened-ip-address.js @@ -1,8 +1,8 @@ +import EmberObject from "@ember/object"; import I18n from "I18n"; +import { ajax } from "discourse/lib/ajax"; import discourseComputed from "discourse-common/utils/decorators"; import { equal } from "@ember/object/computed"; -import { ajax } from "discourse/lib/ajax"; -import EmberObject from "@ember/object"; const ScreenedIpAddress = EmberObject.extend({ @discourseComputed("action_name") diff --git a/app/assets/javascripts/admin/addon/models/screened-url.js b/app/assets/javascripts/admin/addon/models/screened-url.js index a7bc7cfa6f..f3769c7d2f 100644 --- a/app/assets/javascripts/admin/addon/models/screened-url.js +++ b/app/assets/javascripts/admin/addon/models/screened-url.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { ajax } from "discourse/lib/ajax"; import EmberObject from "@ember/object"; +import I18n from "I18n"; +import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; const ScreenedUrl = EmberObject.extend({ @discourseComputed("action") diff --git a/app/assets/javascripts/admin/addon/models/site-setting.js b/app/assets/javascripts/admin/addon/models/site-setting.js index 350281e616..49ed58366e 100644 --- a/app/assets/javascripts/admin/addon/models/site-setting.js +++ b/app/assets/javascripts/admin/addon/models/site-setting.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; -import { ajax } from "discourse/lib/ajax"; -import Setting from "admin/mixins/setting-object"; import EmberObject from "@ember/object"; +import I18n from "I18n"; +import Setting from "admin/mixins/setting-object"; +import { ajax } from "discourse/lib/ajax"; import discourseComputed from "discourse-common/utils/decorators"; const SiteSetting = EmberObject.extend(Setting, { diff --git a/app/assets/javascripts/admin/addon/models/site-text.js b/app/assets/javascripts/admin/addon/models/site-text.js index 7dcd614402..d6c4c4d130 100644 --- a/app/assets/javascripts/admin/addon/models/site-text.js +++ b/app/assets/javascripts/admin/addon/models/site-text.js @@ -1,5 +1,5 @@ -import { ajax } from "discourse/lib/ajax"; import RestModel from "discourse/models/rest"; +import { ajax } from "discourse/lib/ajax"; const { getProperties } = Ember; export default RestModel.extend({ diff --git a/app/assets/javascripts/admin/addon/models/staff-action-log.js b/app/assets/javascripts/admin/addon/models/staff-action-log.js index 09d84b6791..70d86c41e7 100644 --- a/app/assets/javascripts/admin/addon/models/staff-action-log.js +++ b/app/assets/javascripts/admin/addon/models/staff-action-log.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { ajax } from "discourse/lib/ajax"; import AdminUser from "admin/models/admin-user"; -import { escapeExpression } from "discourse/lib/utilities"; +import I18n from "I18n"; import RestModel from "discourse/models/rest"; +import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; +import { escapeExpression } from "discourse/lib/utilities"; function format(label, value, escape = true) { return value diff --git a/app/assets/javascripts/admin/addon/models/theme-settings.js b/app/assets/javascripts/admin/addon/models/theme-settings.js index a823592ad2..d91c3e583e 100644 --- a/app/assets/javascripts/admin/addon/models/theme-settings.js +++ b/app/assets/javascripts/admin/addon/models/theme-settings.js @@ -1,4 +1,4 @@ -import Setting from "admin/mixins/setting-object"; import EmberObject from "@ember/object"; +import Setting from "admin/mixins/setting-object"; export default EmberObject.extend(Setting, {}); diff --git a/app/assets/javascripts/admin/addon/models/theme.js b/app/assets/javascripts/admin/addon/models/theme.js index 10c78c5b82..9783b07e00 100644 --- a/app/assets/javascripts/admin/addon/models/theme.js +++ b/app/assets/javascripts/admin/addon/models/theme.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; -import { get } from "@ember/object"; +import { gt, or } from "@ember/object/computed"; import { isBlank, isEmpty } from "@ember/utils"; -import { or, gt } from "@ember/object/computed"; +import I18n from "I18n"; import RestModel from "discourse/models/rest"; import discourseComputed from "discourse-common/utils/decorators"; +import { get } from "@ember/object"; import { popupAjaxError } from "discourse/lib/ajax-error"; const THEME_UPLOAD_VAR = 2; diff --git a/app/assets/javascripts/admin/addon/models/tl3-requirements.js b/app/assets/javascripts/admin/addon/models/tl3-requirements.js index a6b31363b9..920d6e5f66 100644 --- a/app/assets/javascripts/admin/addon/models/tl3-requirements.js +++ b/app/assets/javascripts/admin/addon/models/tl3-requirements.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import EmberObject from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; export default EmberObject.extend({ @discourseComputed("days_visited", "time_period") diff --git a/app/assets/javascripts/admin/addon/models/version-check.js b/app/assets/javascripts/admin/addon/models/version-check.js index 53882d6eca..4f939064af 100644 --- a/app/assets/javascripts/admin/addon/models/version-check.js +++ b/app/assets/javascripts/admin/addon/models/version-check.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { ajax } from "discourse/lib/ajax"; import EmberObject from "@ember/object"; +import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; const VersionCheck = EmberObject.extend({ @discourseComputed("updated_at") diff --git a/app/assets/javascripts/admin/addon/models/watched-word.js b/app/assets/javascripts/admin/addon/models/watched-word.js index 938b25f7bc..741d037249 100644 --- a/app/assets/javascripts/admin/addon/models/watched-word.js +++ b/app/assets/javascripts/admin/addon/models/watched-word.js @@ -1,6 +1,6 @@ +import EmberObject from "@ember/object"; import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; -import EmberObject from "@ember/object"; const WatchedWord = EmberObject.extend({ save() { diff --git a/app/assets/javascripts/admin/addon/models/web-hook.js b/app/assets/javascripts/admin/addon/models/web-hook.js index 677d76aa88..8dd568a9fb 100644 --- a/app/assets/javascripts/admin/addon/models/web-hook.js +++ b/app/assets/javascripts/admin/addon/models/web-hook.js @@ -1,9 +1,9 @@ -import { isEmpty } from "@ember/utils"; -import RestModel from "discourse/models/rest"; +import discourseComputed, { observes } from "discourse-common/utils/decorators"; import Category from "discourse/models/category"; import Group from "discourse/models/group"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import RestModel from "discourse/models/rest"; import Site from "discourse/models/site"; +import { isEmpty } from "@ember/utils"; export default RestModel.extend({ content_type: 1, // json diff --git a/app/assets/javascripts/admin/addon/routes/admin-backups-index.js b/app/assets/javascripts/admin/addon/routes/admin-backups-index.js index aee755b705..08f68952d0 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-backups-index.js +++ b/app/assets/javascripts/admin/addon/routes/admin-backups-index.js @@ -1,5 +1,5 @@ -import Route from "@ember/routing/route"; import Backup from "admin/models/backup"; +import Route from "@ember/routing/route"; export default Route.extend({ activate() { diff --git a/app/assets/javascripts/admin/addon/routes/admin-backups-logs.js b/app/assets/javascripts/admin/addon/routes/admin-backups-logs.js index e2e3a933c8..8de1ef5240 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-backups-logs.js +++ b/app/assets/javascripts/admin/addon/routes/admin-backups-logs.js @@ -1,6 +1,6 @@ import EmberObject from "@ember/object"; -import Route from "@ember/routing/route"; import PreloadStore from "discourse/lib/preload-store"; +import Route from "@ember/routing/route"; export default Route.extend({ // since the logs are pushed via the message bus diff --git a/app/assets/javascripts/admin/addon/routes/admin-backups.js b/app/assets/javascripts/admin/addon/routes/admin-backups.js index 41c6cb0f8b..1e26c0221d 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-backups.js +++ b/app/assets/javascripts/admin/addon/routes/admin-backups.js @@ -1,14 +1,14 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import EmberObject from "@ember/object"; -import DiscourseRoute from "discourse/routes/discourse"; -import { ajax } from "discourse/lib/ajax"; -import showModal from "discourse/lib/show-modal"; -import BackupStatus from "admin/models/backup-status"; import Backup from "admin/models/backup"; +import BackupStatus from "admin/models/backup-status"; +import DiscourseRoute from "discourse/routes/discourse"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; import PreloadStore from "discourse/lib/preload-store"; import User from "discourse/models/user"; +import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; +import getURL from "discourse-common/lib/get-url"; +import showModal from "discourse/lib/show-modal"; const LOG_CHANNEL = "/admin/backups/logs"; diff --git a/app/assets/javascripts/admin/addon/routes/admin-badges-show.js b/app/assets/javascripts/admin/addon/routes/admin-badges-show.js index c95cae8afa..a370cd32d8 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-badges-show.js +++ b/app/assets/javascripts/admin/addon/routes/admin-badges-show.js @@ -1,10 +1,10 @@ +import Badge from "discourse/models/badge"; import I18n from "I18n"; -import { get } from "@ember/object"; import Route from "@ember/routing/route"; import { ajax } from "discourse/lib/ajax"; -import Badge from "discourse/models/badge"; -import showModal from "discourse/lib/show-modal"; import bootbox from "bootbox"; +import { get } from "@ember/object"; +import showModal from "discourse/lib/show-modal"; export default Route.extend({ serialize(m) { diff --git a/app/assets/javascripts/admin/addon/routes/admin-badges.js b/app/assets/javascripts/admin/addon/routes/admin-badges.js index 59bc0944cb..ac4b9e9b53 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-badges.js +++ b/app/assets/javascripts/admin/addon/routes/admin-badges.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; -import DiscourseRoute from "discourse/routes/discourse"; -import { ajax } from "discourse/lib/ajax"; import Badge from "discourse/models/badge"; import BadgeGrouping from "discourse/models/badge-grouping"; +import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; +import { ajax } from "discourse/lib/ajax"; export default DiscourseRoute.extend({ _json: null, diff --git a/app/assets/javascripts/admin/addon/routes/admin-customize-colors.js b/app/assets/javascripts/admin/addon/routes/admin-customize-colors.js index b2d4f2c16b..cf2dc3d18d 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-customize-colors.js +++ b/app/assets/javascripts/admin/addon/routes/admin-customize-colors.js @@ -1,5 +1,5 @@ -import Route from "@ember/routing/route"; import ColorScheme from "admin/models/color-scheme"; +import Route from "@ember/routing/route"; export default Route.extend({ model() { diff --git a/app/assets/javascripts/admin/addon/routes/admin-customize-themes-show.js b/app/assets/javascripts/admin/addon/routes/admin-customize-themes-show.js index feaf0ef7ae..6311e6100e 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-customize-themes-show.js +++ b/app/assets/javascripts/admin/addon/routes/admin-customize-themes-show.js @@ -1,7 +1,7 @@ +import { COMPONENTS, THEMES } from "admin/models/theme"; import I18n from "I18n"; import Route from "@ember/routing/route"; import { scrollTop } from "discourse/mixins/scroll-top"; -import { THEMES, COMPONENTS } from "admin/models/theme"; export default Route.extend({ serialize(model) { diff --git a/app/assets/javascripts/admin/addon/routes/admin-email-bounced.js b/app/assets/javascripts/admin/addon/routes/admin-email-bounced.js index 041b25fc05..d89010c9ef 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-email-bounced.js +++ b/app/assets/javascripts/admin/addon/routes/admin-email-bounced.js @@ -1,5 +1,5 @@ -import showModal from "discourse/lib/show-modal"; import AdminEmailLogs from "admin/routes/admin-email-logs"; +import showModal from "discourse/lib/show-modal"; export default AdminEmailLogs.extend({ status: "bounced", diff --git a/app/assets/javascripts/admin/addon/routes/admin-email-preview-digest.js b/app/assets/javascripts/admin/addon/routes/admin-email-preview-digest.js index 03d72f0f82..730bcd0e7e 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-email-preview-digest.js +++ b/app/assets/javascripts/admin/addon/routes/admin-email-preview-digest.js @@ -1,5 +1,5 @@ -import DiscourseRoute from "discourse/routes/discourse"; import EmailPreview, { oneWeekAgo } from "admin/models/email-preview"; +import DiscourseRoute from "discourse/routes/discourse"; export default DiscourseRoute.extend({ model() { diff --git a/app/assets/javascripts/admin/addon/routes/admin-email-rejected.js b/app/assets/javascripts/admin/addon/routes/admin-email-rejected.js index e5d4501549..ce45fa8962 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-email-rejected.js +++ b/app/assets/javascripts/admin/addon/routes/admin-email-rejected.js @@ -1,5 +1,5 @@ -import showModal from "discourse/lib/show-modal"; import AdminEmailIncomings from "admin/routes/admin-email-incomings"; +import showModal from "discourse/lib/show-modal"; export default AdminEmailIncomings.extend({ status: "rejected", diff --git a/app/assets/javascripts/admin/addon/routes/admin-emojis.js b/app/assets/javascripts/admin/addon/routes/admin-emojis.js index 5db8760a51..5047bd6f82 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-emojis.js +++ b/app/assets/javascripts/admin/addon/routes/admin-emojis.js @@ -1,5 +1,5 @@ -import EmberObject from "@ember/object"; import DiscourseRoute from "discourse/routes/discourse"; +import EmberObject from "@ember/object"; import { ajax } from "discourse/lib/ajax"; export default DiscourseRoute.extend({ diff --git a/app/assets/javascripts/admin/addon/routes/admin-logs-staff-action-logs.js b/app/assets/javascripts/admin/addon/routes/admin-logs-staff-action-logs.js index a3c3f196e0..68657da533 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-logs-staff-action-logs.js +++ b/app/assets/javascripts/admin/addon/routes/admin-logs-staff-action-logs.js @@ -1,6 +1,6 @@ import DiscourseRoute from "discourse/routes/discourse"; -import showModal from "discourse/lib/show-modal"; import EmberObject from "@ember/object"; +import showModal from "discourse/lib/show-modal"; export default DiscourseRoute.extend({ queryParams: { diff --git a/app/assets/javascripts/admin/addon/routes/admin-search-logs-index.js b/app/assets/javascripts/admin/addon/routes/admin-search-logs-index.js index c688b8ebba..c04f3b22b8 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-search-logs-index.js +++ b/app/assets/javascripts/admin/addon/routes/admin-search-logs-index.js @@ -1,5 +1,5 @@ -import EmberObject from "@ember/object"; import DiscourseRoute from "discourse/routes/discourse"; +import EmberObject from "@ember/object"; import { ajax } from "discourse/lib/ajax"; export default DiscourseRoute.extend({ diff --git a/app/assets/javascripts/admin/addon/routes/admin-search-logs-term.js b/app/assets/javascripts/admin/addon/routes/admin-search-logs-term.js index 989d258384..b9613fe04f 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-search-logs-term.js +++ b/app/assets/javascripts/admin/addon/routes/admin-search-logs-term.js @@ -1,5 +1,5 @@ -import EmberObject from "@ember/object"; import DiscourseRoute from "discourse/routes/discourse"; +import EmberObject from "@ember/object"; import { ajax } from "discourse/lib/ajax"; import { fillMissingDates } from "discourse/lib/utilities"; import { translateResults } from "discourse/lib/search"; diff --git a/app/assets/javascripts/admin/addon/routes/admin-site-settings-category.js b/app/assets/javascripts/admin/addon/routes/admin-site-settings-category.js index be2a2180d2..aab0b337db 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-site-settings-category.js +++ b/app/assets/javascripts/admin/addon/routes/admin-site-settings-category.js @@ -1,6 +1,6 @@ -import I18n from "I18n"; -import EmberObject from "@ember/object"; import DiscourseRoute from "discourse/routes/discourse"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; export default DiscourseRoute.extend({ model(params) { diff --git a/app/assets/javascripts/admin/addon/routes/admin-site-text-index.js b/app/assets/javascripts/admin/addon/routes/admin-site-text-index.js index 036438235d..85dfe8e8c1 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-site-text-index.js +++ b/app/assets/javascripts/admin/addon/routes/admin-site-text-index.js @@ -1,6 +1,6 @@ import Route from "@ember/routing/route"; -import showModal from "discourse/lib/show-modal"; import { getProperties } from "@ember/object"; +import showModal from "discourse/lib/show-modal"; export default Route.extend({ queryParams: { diff --git a/app/assets/javascripts/admin/addon/routes/admin-user-badges.js b/app/assets/javascripts/admin/addon/routes/admin-user-badges.js index f15649f92d..f9549e39e6 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-user-badges.js +++ b/app/assets/javascripts/admin/addon/routes/admin-user-badges.js @@ -1,6 +1,6 @@ +import Badge from "discourse/models/badge"; import DiscourseRoute from "discourse/routes/discourse"; import UserBadge from "discourse/models/user-badge"; -import Badge from "discourse/models/badge"; export default DiscourseRoute.extend({ model() { diff --git a/app/assets/javascripts/admin/addon/routes/admin-user.js b/app/assets/javascripts/admin/addon/routes/admin-user.js index 90436dabd4..d9627ba571 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-user.js +++ b/app/assets/javascripts/admin/addon/routes/admin-user.js @@ -1,6 +1,6 @@ -import { get } from "@ember/object"; -import DiscourseRoute from "discourse/routes/discourse"; import AdminUser from "admin/models/admin-user"; +import DiscourseRoute from "discourse/routes/discourse"; +import { get } from "@ember/object"; export default DiscourseRoute.extend({ serialize(model) { diff --git a/app/assets/javascripts/admin/addon/routes/admin-users-list.js b/app/assets/javascripts/admin/addon/routes/admin-users-list.js index db8106a8ed..4630c8efc8 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-users-list.js +++ b/app/assets/javascripts/admin/addon/routes/admin-users-list.js @@ -1,7 +1,7 @@ +import AdminUser from "admin/models/admin-user"; import DiscourseRoute from "discourse/routes/discourse"; import { exportEntity } from "discourse/lib/export-csv"; import { outputExportResult } from "discourse/lib/export-result"; -import AdminUser from "admin/models/admin-user"; export default DiscourseRoute.extend({ actions: { diff --git a/app/assets/javascripts/admin/addon/routes/admin-watched-words-action.js b/app/assets/javascripts/admin/addon/routes/admin-watched-words-action.js index 3c770f7e09..fe1ce75ab7 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-watched-words-action.js +++ b/app/assets/javascripts/admin/addon/routes/admin-watched-words-action.js @@ -1,6 +1,6 @@ -import I18n from "I18n"; -import EmberObject from "@ember/object"; import DiscourseRoute from "discourse/routes/discourse"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; export default DiscourseRoute.extend({ model(params) { diff --git a/app/assets/javascripts/admin/addon/routes/admin-web-hooks-show-events.js b/app/assets/javascripts/admin/addon/routes/admin-web-hooks-show-events.js index b07b390d40..1b7923224b 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-web-hooks-show-events.js +++ b/app/assets/javascripts/admin/addon/routes/admin-web-hooks-show-events.js @@ -1,5 +1,5 @@ -import { get } from "@ember/object"; import DiscourseRoute from "discourse/routes/discourse"; +import { get } from "@ember/object"; export default DiscourseRoute.extend({ model(params) { diff --git a/app/assets/javascripts/admin/addon/routes/admin-web-hooks-show.js b/app/assets/javascripts/admin/addon/routes/admin-web-hooks-show.js index a5eb3dd873..6d7c64f955 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-web-hooks-show.js +++ b/app/assets/javascripts/admin/addon/routes/admin-web-hooks-show.js @@ -1,5 +1,5 @@ -import { get } from "@ember/object"; import DiscourseRoute from "discourse/routes/discourse"; +import { get } from "@ember/object"; export default DiscourseRoute.extend({ serialize(model) { diff --git a/app/assets/javascripts/admin/addon/routes/admin.js b/app/assets/javascripts/admin/addon/routes/admin.js index c84051d171..e0949ba414 100644 --- a/app/assets/javascripts/admin/addon/routes/admin.js +++ b/app/assets/javascripts/admin/addon/routes/admin.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ titleToken() { diff --git a/app/assets/javascripts/admin/addon/services/admin-tools.js b/app/assets/javascripts/admin/addon/services/admin-tools.js index fc02b998fe..16294be1b3 100644 --- a/app/assets/javascripts/admin/addon/services/admin-tools.js +++ b/app/assets/javascripts/admin/addon/services/admin-tools.js @@ -1,16 +1,16 @@ -import I18n from "I18n"; +import AdminUser from "admin/models/admin-user"; // A service that can act as a bridge between the front end Discourse application // and the admin application. Use this if you need front end code to access admin // modules. Inject it optionally, and if it exists go to town! -import AdminUser from "admin/models/admin-user"; -import { iconHTML } from "discourse-common/lib/icon-library"; -import { ajax } from "discourse/lib/ajax"; -import showModal from "discourse/lib/show-modal"; -import { getOwner } from "discourse-common/lib/get-owner"; -import Service from "@ember/service"; +import I18n from "I18n"; import { Promise } from "rsvp"; +import Service from "@ember/service"; +import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; +import { getOwner } from "discourse-common/lib/get-owner"; +import { iconHTML } from "discourse-common/lib/icon-library"; +import showModal from "discourse/lib/show-modal"; export default Service.extend({ init() { diff --git a/app/assets/javascripts/admin/tests/admin/integration/components/group-list-setting-test.js b/app/assets/javascripts/admin/tests/admin/integration/components/group-list-setting-test.js index 4df70d2c89..025f868e98 100644 --- a/app/assets/javascripts/admin/tests/admin/integration/components/group-list-setting-test.js +++ b/app/assets/javascripts/admin/tests/admin/integration/components/group-list-setting-test.js @@ -1,7 +1,7 @@ -import { moduleForComponent } from "ember-qunit"; import EmberObject from "@ember/object"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; import componentTest from "discourse/tests/helpers/component-test"; +import { moduleForComponent } from "ember-qunit"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; moduleForComponent("group-list", { integration: true }); diff --git a/app/assets/javascripts/admin/tests/admin/integration/components/themes-list-item-test.js b/app/assets/javascripts/admin/tests/admin/integration/components/themes-list-item-test.js index ff2356ba6e..0fe76fe463 100644 --- a/app/assets/javascripts/admin/tests/admin/integration/components/themes-list-item-test.js +++ b/app/assets/javascripts/admin/tests/admin/integration/components/themes-list-item-test.js @@ -1,8 +1,8 @@ -import { queryAll } from "discourse/tests/helpers/qunit-helpers"; -import { moduleForComponent } from "ember-qunit"; import I18n from "I18n"; -import componentTest from "discourse/tests/helpers/component-test"; import Theme from "admin/models/theme"; +import componentTest from "discourse/tests/helpers/component-test"; +import { moduleForComponent } from "ember-qunit"; +import { queryAll } from "discourse/tests/helpers/qunit-helpers"; moduleForComponent("themes-list-item", { integration: true }); diff --git a/app/assets/javascripts/admin/tests/admin/integration/components/themes-list-test.js b/app/assets/javascripts/admin/tests/admin/integration/components/themes-list-test.js index 0eaa6ebd79..cd6ab79551 100644 --- a/app/assets/javascripts/admin/tests/admin/integration/components/themes-list-test.js +++ b/app/assets/javascripts/admin/tests/admin/integration/components/themes-list-test.js @@ -1,8 +1,8 @@ -import { queryAll } from "discourse/tests/helpers/qunit-helpers"; -import { moduleForComponent } from "ember-qunit"; +import Theme, { COMPONENTS, THEMES } from "admin/models/theme"; import I18n from "I18n"; import componentTest from "discourse/tests/helpers/component-test"; -import Theme, { THEMES, COMPONENTS } from "admin/models/theme"; +import { moduleForComponent } from "ember-qunit"; +import { queryAll } from "discourse/tests/helpers/qunit-helpers"; moduleForComponent("themes-list", { integration: true }); diff --git a/app/assets/javascripts/admin/tests/admin/unit/controllers/admin-customize-themes-show-test.js b/app/assets/javascripts/admin/tests/admin/unit/controllers/admin-customize-themes-show-test.js index 318f55fdc0..b3a6c02b85 100644 --- a/app/assets/javascripts/admin/tests/admin/unit/controllers/admin-customize-themes-show-test.js +++ b/app/assets/javascripts/admin/tests/admin/unit/controllers/admin-customize-themes-show-test.js @@ -1,7 +1,7 @@ +import Theme from "admin/models/theme"; +import { mapRoutes } from "discourse/mapping-router"; import { moduleFor } from "ember-qunit"; import { test } from "qunit"; -import { mapRoutes } from "discourse/mapping-router"; -import Theme from "admin/models/theme"; moduleFor("controller:admin-customize-themes-show", { beforeEach() { diff --git a/app/assets/javascripts/admin/tests/admin/unit/controllers/admin-customize-themes-test.js b/app/assets/javascripts/admin/tests/admin/unit/controllers/admin-customize-themes-test.js index 06eec98328..ada14f06fc 100644 --- a/app/assets/javascripts/admin/tests/admin/unit/controllers/admin-customize-themes-test.js +++ b/app/assets/javascripts/admin/tests/admin/unit/controllers/admin-customize-themes-test.js @@ -1,7 +1,7 @@ +import Theme from "admin/models/theme"; +import { mapRoutes } from "discourse/mapping-router"; import { moduleFor } from "ember-qunit"; import { test } from "qunit"; -import { mapRoutes } from "discourse/mapping-router"; -import Theme from "admin/models/theme"; moduleFor("controller:admin-customize-themes", { beforeEach() { diff --git a/app/assets/javascripts/admin/tests/admin/unit/controllers/admin-user-badges-test.js b/app/assets/javascripts/admin/tests/admin/unit/controllers/admin-user-badges-test.js index b377f7f31d..b4ba5a360b 100644 --- a/app/assets/javascripts/admin/tests/admin/unit/controllers/admin-user-badges-test.js +++ b/app/assets/javascripts/admin/tests/admin/unit/controllers/admin-user-badges-test.js @@ -1,7 +1,7 @@ -import { moduleFor } from "ember-qunit"; -import { test } from "qunit"; import Badge from "discourse/models/badge"; import { mapRoutes } from "discourse/mapping-router"; +import { moduleFor } from "ember-qunit"; +import { test } from "qunit"; moduleFor("controller:admin-user-badges", { beforeEach() { diff --git a/app/assets/javascripts/admin/tests/admin/unit/models/theme-test.js b/app/assets/javascripts/admin/tests/admin/unit/models/theme-test.js index 05f4dea5c1..058db72921 100644 --- a/app/assets/javascripts/admin/tests/admin/unit/models/theme-test.js +++ b/app/assets/javascripts/admin/tests/admin/unit/models/theme-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import Theme from "admin/models/theme"; module("model:theme"); diff --git a/app/assets/javascripts/discourse-common/addon/helpers/d-icon.js b/app/assets/javascripts/discourse-common/addon/helpers/d-icon.js index 9d4e387df6..ec759798b2 100644 --- a/app/assets/javascripts/discourse-common/addon/helpers/d-icon.js +++ b/app/assets/javascripts/discourse-common/addon/helpers/d-icon.js @@ -1,6 +1,6 @@ +import { htmlSafe } from "@ember/template"; import { registerUnbound } from "discourse-common/lib/helpers"; import { renderIcon } from "discourse-common/lib/icon-library"; -import { htmlSafe } from "@ember/template"; registerUnbound("d-icon", function (id, params) { return htmlSafe(renderIcon("string", id, params)); diff --git a/app/assets/javascripts/discourse-common/addon/helpers/fa-icon.js b/app/assets/javascripts/discourse-common/addon/helpers/fa-icon.js index 04d701153b..7df981e96f 100644 --- a/app/assets/javascripts/discourse-common/addon/helpers/fa-icon.js +++ b/app/assets/javascripts/discourse-common/addon/helpers/fa-icon.js @@ -1,7 +1,7 @@ -import { registerUnbound } from "discourse-common/lib/helpers"; -import { renderIcon } from "discourse-common/lib/icon-library"; import deprecated from "discourse-common/lib/deprecated"; import { htmlSafe } from "@ember/template"; +import { registerUnbound } from "discourse-common/lib/helpers"; +import { renderIcon } from "discourse-common/lib/icon-library"; export function iconHTML(id, params) { return renderIcon("string", id, params); diff --git a/app/assets/javascripts/discourse-common/addon/helpers/get-url.js b/app/assets/javascripts/discourse-common/addon/helpers/get-url.js index e1821eeea2..14d907ec36 100644 --- a/app/assets/javascripts/discourse-common/addon/helpers/get-url.js +++ b/app/assets/javascripts/discourse-common/addon/helpers/get-url.js @@ -1,6 +1,6 @@ -import { registerUnbound } from "discourse-common/lib/helpers"; -import getUrl from "discourse-common/lib/get-url"; import deprecated from "discourse-common/lib/deprecated"; +import getUrl from "discourse-common/lib/get-url"; +import { registerUnbound } from "discourse-common/lib/helpers"; registerUnbound("get-url", (value) => getUrl(value)); registerUnbound("base-url", () => { diff --git a/app/assets/javascripts/discourse-common/addon/helpers/html-safe.js b/app/assets/javascripts/discourse-common/addon/helpers/html-safe.js index 355dbfb35a..11809ba8b8 100644 --- a/app/assets/javascripts/discourse-common/addon/helpers/html-safe.js +++ b/app/assets/javascripts/discourse-common/addon/helpers/html-safe.js @@ -1,5 +1,5 @@ -import { registerUnbound } from "discourse-common/lib/helpers"; import { htmlSafe } from "@ember/template"; +import { registerUnbound } from "discourse-common/lib/helpers"; registerUnbound("html-safe", function (string) { return htmlSafe(string); diff --git a/app/assets/javascripts/discourse-common/addon/lib/get-owner.js b/app/assets/javascripts/discourse-common/addon/lib/get-owner.js index f26a3bd758..94a12c2358 100644 --- a/app/assets/javascripts/discourse-common/addon/lib/get-owner.js +++ b/app/assets/javascripts/discourse-common/addon/lib/get-owner.js @@ -1,5 +1,5 @@ -import deprecated from "discourse-common/lib/deprecated"; import { getOwner as emberGetOwner, setOwner } from "@ember/application"; +import deprecated from "discourse-common/lib/deprecated"; let _default = {}; diff --git a/app/assets/javascripts/discourse-common/addon/lib/helpers.js b/app/assets/javascripts/discourse-common/addon/lib/helpers.js index 76de9ae2f4..e9af233da8 100644 --- a/app/assets/javascripts/discourse-common/addon/lib/helpers.js +++ b/app/assets/javascripts/discourse-common/addon/lib/helpers.js @@ -1,6 +1,6 @@ -import { get } from "@ember/object"; import Helper from "@ember/component/helper"; import RawHandlebars from "discourse-common/lib/raw-handlebars"; +import { get } from "@ember/object"; import { htmlSafe } from "@ember/template"; export function makeArray(obj) { diff --git a/app/assets/javascripts/discourse-common/addon/lib/icon-library.js b/app/assets/javascripts/discourse-common/addon/lib/icon-library.js index 38d13285a8..5f26ea7708 100644 --- a/app/assets/javascripts/discourse-common/addon/lib/icon-library.js +++ b/app/assets/javascripts/discourse-common/addon/lib/icon-library.js @@ -1,6 +1,6 @@ import I18n from "I18n"; -import { h } from "virtual-dom"; import attributeHook from "discourse-common/lib/attribute-hook"; +import { h } from "virtual-dom"; import { isDevelopment } from "discourse-common/config/environment"; const SVG_NAMESPACE = "http://www.w3.org/2000/svg"; diff --git a/app/assets/javascripts/discourse-common/addon/resolver.js b/app/assets/javascripts/discourse-common/addon/resolver.js index 4fcc1966d1..ac6b668030 100644 --- a/app/assets/javascripts/discourse-common/addon/resolver.js +++ b/app/assets/javascripts/discourse-common/addon/resolver.js @@ -1,7 +1,7 @@ +import { classify, dasherize } from "@ember/string"; +import deprecated from "discourse-common/lib/deprecated"; import { findHelper } from "discourse-common/lib/helpers"; import { get } from "@ember/object"; -import deprecated from "discourse-common/lib/deprecated"; -import { classify, dasherize } from "@ember/string"; const _options = {}; diff --git a/app/assets/javascripts/discourse-common/addon/utils/decorators.js b/app/assets/javascripts/discourse-common/addon/utils/decorators.js index 98742a8791..c7f3729d8e 100644 --- a/app/assets/javascripts/discourse-common/addon/utils/decorators.js +++ b/app/assets/javascripts/discourse-common/addon/utils/decorators.js @@ -1,9 +1,9 @@ +import { bind as emberBind, next, schedule } from "@ember/runloop"; +import decoratorAlias from "discourse-common/utils/decorator-alias"; +import extractValue from "discourse-common/utils/extract-value"; import handleDescriptor from "discourse-common/utils/handle-descriptor"; import isDescriptor from "discourse-common/utils/is-descriptor"; -import extractValue from "discourse-common/utils/extract-value"; -import decoratorAlias from "discourse-common/utils/decorator-alias"; import macroAlias from "discourse-common/utils/macro-alias"; -import { schedule, next, bind as emberBind } from "@ember/runloop"; export default function discourseComputedDecorator(...params) { // determine if user called as @discourseComputed('blah', 'blah') or @discourseComputed diff --git a/app/assets/javascripts/discourse/app/adapters/post-reply-history.js b/app/assets/javascripts/discourse/app/adapters/post-reply-history.js index 0116f32744..e8d58d969a 100644 --- a/app/assets/javascripts/discourse/app/adapters/post-reply-history.js +++ b/app/assets/javascripts/discourse/app/adapters/post-reply-history.js @@ -1,5 +1,5 @@ -import { ajax } from "discourse/lib/ajax"; import RestAdapter from "discourse/adapters/rest"; +import { ajax } from "discourse/lib/ajax"; export default RestAdapter.extend({ find(store, type, findArgs) { diff --git a/app/assets/javascripts/discourse/app/adapters/post-reply.js b/app/assets/javascripts/discourse/app/adapters/post-reply.js index 7f12465127..4d6871e2de 100644 --- a/app/assets/javascripts/discourse/app/adapters/post-reply.js +++ b/app/assets/javascripts/discourse/app/adapters/post-reply.js @@ -1,5 +1,5 @@ -import { ajax } from "discourse/lib/ajax"; import RestAdapter from "discourse/adapters/rest"; +import { ajax } from "discourse/lib/ajax"; export default RestAdapter.extend({ find(store, type, findArgs) { diff --git a/app/assets/javascripts/discourse/app/adapters/post.js b/app/assets/javascripts/discourse/app/adapters/post.js index 4318cc0d07..3a203510f4 100644 --- a/app/assets/javascripts/discourse/app/adapters/post.js +++ b/app/assets/javascripts/discourse/app/adapters/post.js @@ -1,5 +1,5 @@ -import { ajax } from "discourse/lib/ajax"; import RestAdapter, { Result } from "discourse/adapters/rest"; +import { ajax } from "discourse/lib/ajax"; import { underscore } from "@ember/string"; export default RestAdapter.extend({ diff --git a/app/assets/javascripts/discourse/app/adapters/topic-list.js b/app/assets/javascripts/discourse/app/adapters/topic-list.js index cc36b230f5..fb6a0c80d5 100644 --- a/app/assets/javascripts/discourse/app/adapters/topic-list.js +++ b/app/assets/javascripts/discourse/app/adapters/topic-list.js @@ -1,7 +1,7 @@ -import getURL from "discourse-common/lib/get-url"; -import { ajax } from "discourse/lib/ajax"; -import RestAdapter from "discourse/adapters/rest"; import PreloadStore from "discourse/lib/preload-store"; +import RestAdapter from "discourse/adapters/rest"; +import { ajax } from "discourse/lib/ajax"; +import getURL from "discourse-common/lib/get-url"; export function finderFor(filter, params) { return function () { diff --git a/app/assets/javascripts/discourse/app/adapters/topic.js b/app/assets/javascripts/discourse/app/adapters/topic.js index 5c22b1c17f..ee68791717 100644 --- a/app/assets/javascripts/discourse/app/adapters/topic.js +++ b/app/assets/javascripts/discourse/app/adapters/topic.js @@ -1,5 +1,5 @@ -import { ajax } from "discourse/lib/ajax"; import RestAdapter from "discourse/adapters/rest"; +import { ajax } from "discourse/lib/ajax"; export default RestAdapter.extend({ find(store, type, findArgs) { diff --git a/app/assets/javascripts/discourse/app/app.js b/app/assets/javascripts/discourse/app/app.js index e303100c63..093dfe5eea 100644 --- a/app/assets/javascripts/discourse/app/app.js +++ b/app/assets/javascripts/discourse/app/app.js @@ -1,6 +1,6 @@ import Application from "@ember/application"; -import { buildResolver } from "discourse-common/resolver"; import Mousetrap from "mousetrap"; +import { buildResolver } from "discourse-common/resolver"; const _pluginCallbacks = []; diff --git a/app/assets/javascripts/discourse/app/components/about-page-users.js b/app/assets/javascripts/discourse/app/components/about-page-users.js index 482daa80da..f0412f4f24 100644 --- a/app/assets/javascripts/discourse/app/components/about-page-users.js +++ b/app/assets/javascripts/discourse/app/components/about-page-users.js @@ -1,10 +1,10 @@ import Component from "@ember/component"; -import { userPath } from "discourse/lib/url"; +import { computed } from "@ember/object"; import { formatUsername } from "discourse/lib/utilities"; import { normalize } from "discourse/components/user-info"; -import { renderAvatar } from "discourse/helpers/user-avatar"; -import { computed } from "@ember/object"; import { prioritizeNameInUx } from "discourse/lib/settings"; +import { renderAvatar } from "discourse/helpers/user-avatar"; +import { userPath } from "discourse/lib/url"; export default Component.extend({ usersTemplates: computed("users.[]", function () { diff --git a/app/assets/javascripts/discourse/app/components/add-category-tag-classes.js b/app/assets/javascripts/discourse/app/components/add-category-tag-classes.js index 5120b18735..8e8dd86683 100644 --- a/app/assets/javascripts/discourse/app/components/add-category-tag-classes.js +++ b/app/assets/javascripts/discourse/app/components/add-category-tag-classes.js @@ -1,6 +1,6 @@ -import { scheduleOnce } from "@ember/runloop"; import Component from "@ember/component"; import { observes } from "discourse-common/utils/decorators"; +import { scheduleOnce } from "@ember/runloop"; export default Component.extend({ _slug: null, diff --git a/app/assets/javascripts/discourse/app/components/auth-token-dropdown.js b/app/assets/javascripts/discourse/app/components/auth-token-dropdown.js index 131593ebc7..6c020a3d16 100644 --- a/app/assets/javascripts/discourse/app/components/auth-token-dropdown.js +++ b/app/assets/javascripts/discourse/app/components/auth-token-dropdown.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; +import I18n from "I18n"; import { computed } from "@ember/object"; export default DropdownSelectBoxComponent.extend({ diff --git a/app/assets/javascripts/discourse/app/components/avatar-flair.js b/app/assets/javascripts/discourse/app/components/avatar-flair.js index 7789e18bbf..8e6331d330 100644 --- a/app/assets/javascripts/discourse/app/components/avatar-flair.js +++ b/app/assets/javascripts/discourse/app/components/avatar-flair.js @@ -1,5 +1,5 @@ -import { observes } from "discourse-common/utils/decorators"; import MountWidget from "discourse/components/mount-widget"; +import { observes } from "discourse-common/utils/decorators"; export default MountWidget.extend({ widget: "avatar-flair", diff --git a/app/assets/javascripts/discourse/app/components/avatar-uploader.js b/app/assets/javascripts/discourse/app/components/avatar-uploader.js index 4b59d96c47..0620aa0d9f 100644 --- a/app/assets/javascripts/discourse/app/components/avatar-uploader.js +++ b/app/assets/javascripts/discourse/app/components/avatar-uploader.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; import UploadMixin from "discourse/mixins/upload"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend(UploadMixin, { type: "avatar", diff --git a/app/assets/javascripts/discourse/app/components/backup-codes.js b/app/assets/javascripts/discourse/app/components/backup-codes.js index 1b74cf1462..e66fe6de63 100644 --- a/app/assets/javascripts/discourse/app/components/backup-codes.js +++ b/app/assets/javascripts/discourse/app/components/backup-codes.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; +import { slugify, toAsciiPrintable } from "discourse/lib/utilities"; import Component from "@ember/component"; -import { toAsciiPrintable, slugify } from "discourse/lib/utilities"; +import discourseComputed from "discourse-common/utils/decorators"; // https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding function b64EncodeUnicode(str) { diff --git a/app/assets/javascripts/discourse/app/components/backup-uploader.js b/app/assets/javascripts/discourse/app/components/backup-uploader.js index bc2f5ceb14..69e9ba6db0 100644 --- a/app/assets/javascripts/discourse/app/components/backup-uploader.js +++ b/app/assets/javascripts/discourse/app/components/backup-uploader.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import { ajax } from "discourse/lib/ajax"; -import { popupAjaxError } from "discourse/lib/ajax-error"; +import I18n from "I18n"; import UploadMixin from "discourse/mixins/upload"; +import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; import { on } from "@ember/object/evented"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Component.extend(UploadMixin, { tagName: "span", diff --git a/app/assets/javascripts/discourse/app/components/badge-button.js b/app/assets/javascripts/discourse/app/components/badge-button.js index b9acaee6e3..26c378678d 100644 --- a/app/assets/javascripts/discourse/app/components/badge-button.js +++ b/app/assets/javascripts/discourse/app/components/badge-button.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { alias } from "@ember/object/computed"; import Component from "@ember/component"; +import { alias } from "@ember/object/computed"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "span", diff --git a/app/assets/javascripts/discourse/app/components/badge-card.js b/app/assets/javascripts/discourse/app/components/badge-card.js index 60a25847b4..c4ee8a933c 100644 --- a/app/assets/javascripts/discourse/app/components/badge-card.js +++ b/app/assets/javascripts/discourse/app/components/badge-card.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; +import { emojiUnescape, sanitize } from "discourse/lib/text"; import Component from "@ember/component"; -import { sanitize, emojiUnescape } from "discourse/lib/text"; +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/badge-selector.js b/app/assets/javascripts/discourse/app/components/badge-selector.js index bf97777dc1..b8530f1300 100644 --- a/app/assets/javascripts/discourse/app/components/badge-selector.js +++ b/app/assets/javascripts/discourse/app/components/badge-selector.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; -import Component from "@ember/component"; import discourseComputed, { - on, observes, + on, } from "discourse-common/utils/decorators"; +import Component from "@ember/component"; +import I18n from "I18n"; import { findRawTemplate } from "discourse-common/lib/raw-templates"; const { makeArray } = Ember; diff --git a/app/assets/javascripts/discourse/app/components/badge-title.js b/app/assets/javascripts/discourse/app/components/badge-title.js index 6034ce986b..0dbdd75722 100644 --- a/app/assets/javascripts/discourse/app/components/badge-title.js +++ b/app/assets/javascripts/discourse/app/components/badge-title.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import Component from "@ember/component"; +import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; diff --git a/app/assets/javascripts/discourse/app/components/basic-topic-list.js b/app/assets/javascripts/discourse/app/components/basic-topic-list.js index f28d8bbbff..0445741f0b 100644 --- a/app/assets/javascripts/discourse/app/components/basic-topic-list.js +++ b/app/assets/javascripts/discourse/app/components/basic-topic-list.js @@ -1,5 +1,5 @@ -import discourseComputed, { observes } from "discourse-common/utils/decorators"; import { alias, not } from "@ember/object/computed"; +import discourseComputed, { observes } from "discourse-common/utils/decorators"; import Component from "@ember/component"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/bookmark-actions-dropdown.js b/app/assets/javascripts/discourse/app/components/bookmark-actions-dropdown.js index 21fe283f69..a8aaf74991 100644 --- a/app/assets/javascripts/discourse/app/components/bookmark-actions-dropdown.js +++ b/app/assets/javascripts/discourse/app/components/bookmark-actions-dropdown.js @@ -1,6 +1,6 @@ -import I18n from "I18n"; -import { computed, action } from "@ember/object"; +import { action, computed } from "@ember/object"; import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; +import I18n from "I18n"; export default DropdownSelectBoxComponent.extend({ classNames: ["bookmark-actions-dropdown"], diff --git a/app/assets/javascripts/discourse/app/components/bookmark-list.js b/app/assets/javascripts/discourse/app/components/bookmark-list.js index 546b9bf5e3..784f25d831 100644 --- a/app/assets/javascripts/discourse/app/components/bookmark-list.js +++ b/app/assets/javascripts/discourse/app/components/bookmark-list.js @@ -1,13 +1,13 @@ -import Component from "@ember/component"; -import { Promise } from "rsvp"; -import I18n from "I18n"; -import { action } from "@ember/object"; -import showModal from "discourse/lib/show-modal"; import { - shouldOpenInNewTab, openLinkInNewTab, + shouldOpenInNewTab, } from "discourse/lib/click-track"; +import Component from "@ember/component"; +import I18n from "I18n"; +import { Promise } from "rsvp"; +import { action } from "@ember/object"; import bootbox from "bootbox"; +import showModal from "discourse/lib/show-modal"; export default Component.extend({ classNames: ["bookmark-list-wrapper"], diff --git a/app/assets/javascripts/discourse/app/components/bread-crumbs.js b/app/assets/javascripts/discourse/app/components/bread-crumbs.js index eaff3112b7..a93c9e9a3b 100644 --- a/app/assets/javascripts/discourse/app/components/bread-crumbs.js +++ b/app/assets/javascripts/discourse/app/components/bread-crumbs.js @@ -1,7 +1,7 @@ -import { filter } from "@ember/object/computed"; import Component from "@ember/component"; -import discourseComputed from "discourse-common/utils/decorators"; import deprecated from "discourse-common/lib/deprecated"; +import discourseComputed from "discourse-common/utils/decorators"; +import { filter } from "@ember/object/computed"; // A breadcrumb including category drop downs export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/bulk-select-button.js b/app/assets/javascripts/discourse/app/components/bulk-select-button.js index 80353b4317..f0dc4c48c7 100644 --- a/app/assets/javascripts/discourse/app/components/bulk-select-button.js +++ b/app/assets/javascripts/discourse/app/components/bulk-select-button.js @@ -1,5 +1,5 @@ -import { schedule } from "@ember/runloop"; import Component from "@ember/component"; +import { schedule } from "@ember/runloop"; import showModal from "discourse/lib/show-modal"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/categories-boxes-topic.js b/app/assets/javascripts/discourse/app/components/categories-boxes-topic.js index e7c48f4032..2fa8609125 100644 --- a/app/assets/javascripts/discourse/app/components/categories-boxes-topic.js +++ b/app/assets/javascripts/discourse/app/components/categories-boxes-topic.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "li", diff --git a/app/assets/javascripts/discourse/app/components/categories-boxes-with-topics.js b/app/assets/javascripts/discourse/app/components/categories-boxes-with-topics.js index e4399e8bfc..5aac7408ce 100644 --- a/app/assets/javascripts/discourse/app/components/categories-boxes-with-topics.js +++ b/app/assets/javascripts/discourse/app/components/categories-boxes-with-topics.js @@ -1,7 +1,7 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { isEmpty } from "@ember/utils"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; import { equal } from "@ember/object/computed"; +import { isEmpty } from "@ember/utils"; export default Component.extend({ tagName: "section", diff --git a/app/assets/javascripts/discourse/app/components/categories-boxes.js b/app/assets/javascripts/discourse/app/components/categories-boxes.js index 12be7c835d..25918dbc3a 100644 --- a/app/assets/javascripts/discourse/app/components/categories-boxes.js +++ b/app/assets/javascripts/discourse/app/components/categories-boxes.js @@ -1,7 +1,7 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { isEmpty } from "@ember/utils"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; import { equal } from "@ember/object/computed"; +import { isEmpty } from "@ember/utils"; export default Component.extend({ tagName: "section", diff --git a/app/assets/javascripts/discourse/app/components/categories-only.js b/app/assets/javascripts/discourse/app/components/categories-only.js index 9be4c383a5..002ddf82e3 100644 --- a/app/assets/javascripts/discourse/app/components/categories-only.js +++ b/app/assets/javascripts/discourse/app/components/categories-only.js @@ -1,7 +1,7 @@ import Component from "@ember/component"; +import { action } from "@ember/object"; import discourseComputed from "discourse-common/utils/decorators"; import { equal } from "@ember/object/computed"; -import { action } from "@ember/object"; export default Component.extend({ tagName: "", diff --git a/app/assets/javascripts/discourse/app/components/category-permission-row.js b/app/assets/javascripts/discourse/app/components/category-permission-row.js index 881f33a9ba..7b745eb9ae 100644 --- a/app/assets/javascripts/discourse/app/components/category-permission-row.js +++ b/app/assets/javascripts/discourse/app/components/category-permission-row.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; -import Component from "@ember/component"; +import { alias, equal } from "@ember/object/computed"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import Component from "@ember/component"; +import I18n from "I18n"; import PermissionType from "discourse/models/permission-type"; -import { equal, alias } from "@ember/object/computed"; const EVERYONE = "everyone"; diff --git a/app/assets/javascripts/discourse/app/components/category-read-only-banner.js b/app/assets/javascripts/discourse/app/components/category-read-only-banner.js index e299da8b54..d8371808f2 100644 --- a/app/assets/javascripts/discourse/app/components/category-read-only-banner.js +++ b/app/assets/javascripts/discourse/app/components/category-read-only-banner.js @@ -1,6 +1,6 @@ import Component from "@ember/component"; -import discourseComputed from "discourse-common/utils/decorators"; import { and } from "@ember/object/computed"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ @discourseComputed diff --git a/app/assets/javascripts/discourse/app/components/cdn-img.js b/app/assets/javascripts/discourse/app/components/cdn-img.js index 385a2c98bc..218ad3653d 100644 --- a/app/assets/javascripts/discourse/app/components/cdn-img.js +++ b/app/assets/javascripts/discourse/app/components/cdn-img.js @@ -1,6 +1,6 @@ -import { getURLWithCDN } from "discourse-common/lib/get-url"; -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; +import { getURLWithCDN } from "discourse-common/lib/get-url"; import { htmlSafe } from "@ember/template"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/choose-message.js b/app/assets/javascripts/discourse/app/components/choose-message.js index 3665923f9e..22833e61f5 100644 --- a/app/assets/javascripts/discourse/app/components/choose-message.js +++ b/app/assets/javascripts/discourse/app/components/choose-message.js @@ -1,10 +1,10 @@ +import Component from "@ember/component"; +import discourseDebounce from "discourse/lib/debounce"; import { get } from "@ember/object"; import { isEmpty } from "@ember/utils"; import { next } from "@ember/runloop"; -import Component from "@ember/component"; -import discourseDebounce from "discourse/lib/debounce"; -import { searchForTerm } from "discourse/lib/search"; import { observes } from "discourse-common/utils/decorators"; +import { searchForTerm } from "discourse/lib/search"; export default Component.extend({ loading: null, diff --git a/app/assets/javascripts/discourse/app/components/choose-topic.js b/app/assets/javascripts/discourse/app/components/choose-topic.js index 84070125c2..01352333ae 100644 --- a/app/assets/javascripts/discourse/app/components/choose-topic.js +++ b/app/assets/javascripts/discourse/app/components/choose-topic.js @@ -1,9 +1,9 @@ -import { isEmpty } from "@ember/utils"; -import { next } from "@ember/runloop"; +import discourseComputed, { observes } from "discourse-common/utils/decorators"; import Component from "@ember/component"; import discourseDebounce from "discourse/lib/debounce"; +import { isEmpty } from "@ember/utils"; +import { next } from "@ember/runloop"; import { searchForTerm } from "discourse/lib/search"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; export default Component.extend({ loading: null, diff --git a/app/assets/javascripts/discourse/app/components/color-picker-choice.js b/app/assets/javascripts/discourse/app/components/color-picker-choice.js index 4d7c617e1a..96c26dddaa 100644 --- a/app/assets/javascripts/discourse/app/components/color-picker-choice.js +++ b/app/assets/javascripts/discourse/app/components/color-picker-choice.js @@ -1,6 +1,6 @@ +import Component from "@ember/component"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; -import Component from "@ember/component"; export default Component.extend({ tagName: "button", diff --git a/app/assets/javascripts/discourse/app/components/composer-action-title.js b/app/assets/javascripts/discourse/app/components/composer-action-title.js index 11ec4c28b3..851738c158 100644 --- a/app/assets/javascripts/discourse/app/components/composer-action-title.js +++ b/app/assets/javascripts/discourse/app/components/composer-action-title.js @@ -1,15 +1,15 @@ -import I18n from "I18n"; -import { alias } from "@ember/object/computed"; -import Component from "@ember/component"; -import discourseComputed from "discourse-common/utils/decorators"; import { - PRIVATE_MESSAGE, - CREATE_TOPIC, CREATE_SHARED_DRAFT, - REPLY, + CREATE_TOPIC, EDIT, EDIT_SHARED_DRAFT, + PRIVATE_MESSAGE, + REPLY, } from "discourse/models/composer"; +import Component from "@ember/component"; +import I18n from "I18n"; +import { alias } from "@ember/object/computed"; +import discourseComputed from "discourse-common/utils/decorators"; import { iconHTML } from "discourse-common/lib/icon-library"; const TITLES = { diff --git a/app/assets/javascripts/discourse/app/components/composer-body.js b/app/assets/javascripts/discourse/app/components/composer-body.js index b6b60aa5f3..7708f8287c 100644 --- a/app/assets/javascripts/discourse/app/components/composer-body.js +++ b/app/assets/javascripts/discourse/app/components/composer-body.js @@ -1,19 +1,19 @@ import { - run, cancel, - schedule, - later, debounce, + later, + run, + schedule, throttle, } from "@ember/runloop"; -import Component from "@ember/component"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import Component from "@ember/component"; import Composer from "discourse/models/composer"; -import afterTransition from "discourse/lib/after-transition"; -import positioningWorkaround from "discourse/lib/safari-hacks"; -import { headerHeight } from "discourse/components/site-header"; import KeyEnterEscape from "discourse/mixins/key-enter-escape"; +import afterTransition from "discourse/lib/after-transition"; +import { headerHeight } from "discourse/components/site-header"; import { iOSWithVisualViewport } from "discourse/lib/utilities"; +import positioningWorkaround from "discourse/lib/safari-hacks"; const START_EVENTS = "touchstart mousedown"; const DRAG_EVENTS = "touchmove mousemove"; diff --git a/app/assets/javascripts/discourse/app/components/composer-editor.js b/app/assets/javascripts/discourse/app/components/composer-editor.js index ed64d0f2c9..bc90e6bf8c 100644 --- a/app/assets/javascripts/discourse/app/components/composer-editor.js +++ b/app/assets/javascripts/discourse/app/components/composer-editor.js @@ -1,47 +1,47 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import { run, debounce, later, next, schedule, throttle } from "@ember/runloop"; -import Component from "@ember/component"; -import userSearch from "discourse/lib/user-search"; +import { + authorizesOneOrMoreImageExtensions, + displayErrorForUpload, + getUploadMarkdown, + validateUploadedFiles, +} from "discourse/lib/uploads"; +import { + cacheShortUploadUrl, + resolveAllShortUrls, +} from "pretty-text/upload-short-url"; +import { + caretPosition, + clipboardHelpers, + formatUsername, + inCodeBlock, + tinyAvatar, +} from "discourse/lib/utilities"; +import { debounce, later, next, run, schedule, throttle } from "@ember/runloop"; import discourseComputed, { observes, on, } from "discourse-common/utils/decorators"; import { - linkSeenMentions, - fetchUnseenMentions, -} from "discourse/lib/link-mentions"; -import { - linkSeenHashtags, fetchUnseenHashtags, + linkSeenHashtags, } from "discourse/lib/link-hashtags"; +import { + fetchUnseenMentions, + linkSeenMentions, +} from "discourse/lib/link-mentions"; +import Component from "@ember/component"; import Composer from "discourse/models/composer"; -import { ajax } from "discourse/lib/ajax"; import EmberObject from "@ember/object"; -import { findRawTemplate } from "discourse-common/lib/raw-templates"; -import { iconHTML } from "discourse-common/lib/icon-library"; -import { - tinyAvatar, - formatUsername, - clipboardHelpers, - caretPosition, - inCodeBlock, -} from "discourse/lib/utilities"; -import putCursorAtEnd from "discourse/lib/put-cursor-at-end"; -import { - validateUploadedFiles, - authorizesOneOrMoreImageExtensions, - getUploadMarkdown, - displayErrorForUpload, -} from "discourse/lib/uploads"; +import I18n from "I18n"; +import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; - -import { - cacheShortUploadUrl, - resolveAllShortUrls, -} from "pretty-text/upload-short-url"; +import { findRawTemplate } from "discourse-common/lib/raw-templates"; +import getURL from "discourse-common/lib/get-url"; +import { iconHTML } from "discourse-common/lib/icon-library"; import { isTesting } from "discourse-common/config/environment"; + import { loadOneboxes } from "discourse/lib/load-oneboxes"; +import putCursorAtEnd from "discourse/lib/put-cursor-at-end"; +import userSearch from "discourse/lib/user-search"; const REBUILD_SCROLL_MAP_EVENTS = ["composer:resized", "composer:typed-reply"]; diff --git a/app/assets/javascripts/discourse/app/components/composer-message.js b/app/assets/javascripts/discourse/app/components/composer-message.js index 21b68a0fae..2fd8055775 100644 --- a/app/assets/javascripts/discourse/app/components/composer-message.js +++ b/app/assets/javascripts/discourse/app/components/composer-message.js @@ -1,6 +1,6 @@ +import Component from "@ember/component"; import deprecated from "discourse-common/lib/deprecated"; import discourseComputed from "discourse-common/utils/decorators"; -import Component from "@ember/component"; import { getOwner } from "discourse-common/lib/get-owner"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/composer-messages.js b/app/assets/javascripts/discourse/app/components/composer-messages.js index 3273da6b16..a2ae8b9e41 100644 --- a/app/assets/javascripts/discourse/app/components/composer-messages.js +++ b/app/assets/javascripts/discourse/app/components/composer-messages.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; -import { not } from "@ember/object/computed"; -import EmberObject from "@ember/object"; -import { scheduleOnce } from "@ember/runloop"; import Component from "@ember/component"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; import LinkLookup from "discourse/lib/link-lookup"; +import { not } from "@ember/object/computed"; +import { scheduleOnce } from "@ember/runloop"; let _messagesCache = {}; diff --git a/app/assets/javascripts/discourse/app/components/composer-title.js b/app/assets/javascripts/discourse/app/components/composer-title.js index 06e132bae8..25895f9ea3 100644 --- a/app/assets/javascripts/discourse/app/components/composer-title.js +++ b/app/assets/javascripts/discourse/app/components/composer-title.js @@ -1,13 +1,13 @@ -import I18n from "I18n"; import { alias, or } from "@ember/object/computed"; import { debounce, next, schedule } from "@ember/runloop"; -import Component from "@ember/component"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; -import { load } from "pretty-text/oneboxer"; -import { lookupCache } from "pretty-text/oneboxer-cache"; +import Component from "@ember/component"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; import { isTesting } from "discourse-common/config/environment"; -import EmberObject from "@ember/object"; +import { load } from "pretty-text/oneboxer"; +import { lookupCache } from "pretty-text/oneboxer-cache"; import putCursorAtEnd from "discourse/lib/put-cursor-at-end"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/composer-toggles.js b/app/assets/javascripts/discourse/app/components/composer-toggles.js index 16b1773bb1..b60019c52c 100644 --- a/app/assets/javascripts/discourse/app/components/composer-toggles.js +++ b/app/assets/javascripts/discourse/app/components/composer-toggles.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "", diff --git a/app/assets/javascripts/discourse/app/components/composer-user-selector.js b/app/assets/javascripts/discourse/app/components/composer-user-selector.js index 2f6f81e675..dc0bc42cfe 100644 --- a/app/assets/javascripts/discourse/app/components/composer-user-selector.js +++ b/app/assets/javascripts/discourse/app/components/composer-user-selector.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; -import { schedule } from "@ember/runloop"; -import Component from "@ember/component"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import Component from "@ember/component"; +import I18n from "I18n"; import putCursorAtEnd from "discourse/lib/put-cursor-at-end"; +import { schedule } from "@ember/runloop"; export default Component.extend({ showSelector: true, diff --git a/app/assets/javascripts/discourse/app/components/conditional-loading-section.js b/app/assets/javascripts/discourse/app/components/conditional-loading-section.js index d4249354cc..c3dc936c49 100644 --- a/app/assets/javascripts/discourse/app/components/conditional-loading-section.js +++ b/app/assets/javascripts/discourse/app/components/conditional-loading-section.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import Component from "@ember/component"; +import I18n from "I18n"; export default Component.extend({ classNames: ["conditional-loading-section"], diff --git a/app/assets/javascripts/discourse/app/components/conditional-loading-spinner.js b/app/assets/javascripts/discourse/app/components/conditional-loading-spinner.js index f581c30a57..22ebf1ddaa 100644 --- a/app/assets/javascripts/discourse/app/components/conditional-loading-spinner.js +++ b/app/assets/javascripts/discourse/app/components/conditional-loading-spinner.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ classNameBindings: [ diff --git a/app/assets/javascripts/discourse/app/components/count-i18n.js b/app/assets/javascripts/discourse/app/components/count-i18n.js index 7c3ed90373..1d5a1fa228 100644 --- a/app/assets/javascripts/discourse/app/components/count-i18n.js +++ b/app/assets/javascripts/discourse/app/components/count-i18n.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import Component from "@ember/component"; +import I18n from "I18n"; export default Component.extend({ tagName: "span", diff --git a/app/assets/javascripts/discourse/app/components/create-topics-notice.js b/app/assets/javascripts/discourse/app/components/create-topics-notice.js index 54c1057afb..0dbd17ef3a 100644 --- a/app/assets/javascripts/discourse/app/components/create-topics-notice.js +++ b/app/assets/javascripts/discourse/app/components/create-topics-notice.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; -import { alias } from "@ember/object/computed"; import Component from "@ember/component"; +import I18n from "I18n"; import LivePostCounts from "discourse/models/live-post-counts"; +import { alias } from "@ember/object/computed"; import { htmlSafe } from "@ember/template"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/csv-uploader.js b/app/assets/javascripts/discourse/app/components/csv-uploader.js index fcc98c0847..9ab2c015b9 100644 --- a/app/assets/javascripts/discourse/app/components/csv-uploader.js +++ b/app/assets/javascripts/discourse/app/components/csv-uploader.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import I18n from "I18n"; import UploadMixin from "discourse/mixins/upload"; -import { on } from "@ember/object/evented"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; +import { on } from "@ember/object/evented"; export default Component.extend(UploadMixin, { type: "csv", diff --git a/app/assets/javascripts/discourse/app/components/d-button.js b/app/assets/javascripts/discourse/app/components/d-button.js index 20f76b8ccb..0581c2663f 100644 --- a/app/assets/javascripts/discourse/app/components/d-button.js +++ b/app/assets/javascripts/discourse/app/components/d-button.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; -import { notEmpty, empty, equal } from "@ember/object/computed"; -import { computed } from "@ember/object"; +import { empty, equal, notEmpty } from "@ember/object/computed"; import Component from "@ember/component"; -import discourseComputed from "discourse-common/utils/decorators"; import DiscourseURL from "discourse/lib/url"; +import I18n from "I18n"; +import { computed } from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "button", diff --git a/app/assets/javascripts/discourse/app/components/d-document.js b/app/assets/javascripts/discourse/app/components/d-document.js index bd66be79a4..8cb0675945 100644 --- a/app/assets/javascripts/discourse/app/components/d-document.js +++ b/app/assets/javascripts/discourse/app/components/d-document.js @@ -1,10 +1,10 @@ import Component from "@ember/component"; -import { inject as service } from "@ember/service"; -import { bind } from "discourse-common/utils/decorators"; -import logout from "discourse/lib/logout"; import I18n from "I18n"; -import { setLogoffCallback } from "discourse/lib/ajax"; +import { bind } from "discourse-common/utils/decorators"; import bootbox from "bootbox"; +import logout from "discourse/lib/logout"; +import { inject as service } from "@ember/service"; +import { setLogoffCallback } from "discourse/lib/ajax"; export default Component.extend({ tagName: "", diff --git a/app/assets/javascripts/discourse/app/components/d-editor.js b/app/assets/javascripts/discourse/app/components/d-editor.js index 2ac5201c80..976acf965f 100644 --- a/app/assets/javascripts/discourse/app/components/d-editor.js +++ b/app/assets/javascripts/discourse/app/components/d-editor.js @@ -1,36 +1,35 @@ -import I18n from "I18n"; -import { debounce, later, next, schedule, scheduleOnce } from "@ember/runloop"; -import { inject as service } from "@ember/service"; -import Component from "@ember/component"; -import Mousetrap from "mousetrap"; - -import discourseComputed, { - on, - observes, -} from "discourse-common/utils/decorators"; -import { categoryHashtagTriggerRule } from "discourse/lib/category-hashtags"; -import { search as searchCategoryTag } from "discourse/lib/category-tag-search"; -import { getRegister } from "discourse-common/lib/get-owner"; -import { findRawTemplate } from "discourse-common/lib/raw-templates"; -import { siteDir } from "discourse/lib/text-direction"; import { - determinePostReplaceSelection, - clipboardHelpers, - safariHacksDisabled, caretPosition, + clipboardHelpers, + determinePostReplaceSelection, inCodeBlock, + safariHacksDisabled, } from "discourse/lib/utilities"; -import toMarkdown from "discourse/lib/to-markdown"; -import deprecated from "discourse-common/lib/deprecated"; -import { wantsNewWindow } from "discourse/lib/intercept-click"; -import { translations } from "pretty-text/emoji/data"; +import { debounce, later, next, schedule, scheduleOnce } from "@ember/runloop"; +import discourseComputed, { + observes, + on, +} from "discourse-common/utils/decorators"; import { emojiSearch, isSkinTonableEmoji } from "pretty-text/emoji"; import { emojiUrlFor, generateCookFunction } from "discourse/lib/text"; -import showModal from "discourse/lib/show-modal"; +import Component from "@ember/component"; +import I18n from "I18n"; +import Mousetrap from "mousetrap"; import { Promise } from "rsvp"; -import { isTesting } from "discourse-common/config/environment"; import { SKIP } from "discourse/lib/autocomplete"; +import { categoryHashtagTriggerRule } from "discourse/lib/category-hashtags"; +import deprecated from "discourse-common/lib/deprecated"; +import { findRawTemplate } from "discourse-common/lib/raw-templates"; +import { getRegister } from "discourse-common/lib/get-owner"; import { isEmpty } from "@ember/utils"; +import { isTesting } from "discourse-common/config/environment"; +import { search as searchCategoryTag } from "discourse/lib/category-tag-search"; +import { inject as service } from "@ember/service"; +import showModal from "discourse/lib/show-modal"; +import { siteDir } from "discourse/lib/text-direction"; +import toMarkdown from "discourse/lib/to-markdown"; +import { translations } from "pretty-text/emoji/data"; +import { wantsNewWindow } from "discourse/lib/intercept-click"; // Our head can be a static string or a function that returns a string // based on input (like for numbered lists). diff --git a/app/assets/javascripts/discourse/app/components/d-modal-body.js b/app/assets/javascripts/discourse/app/components/d-modal-body.js index 3b519a8db6..a156c7ec93 100644 --- a/app/assets/javascripts/discourse/app/components/d-modal-body.js +++ b/app/assets/javascripts/discourse/app/components/d-modal-body.js @@ -1,5 +1,5 @@ -import { scheduleOnce } from "@ember/runloop"; import Component from "@ember/component"; +import { scheduleOnce } from "@ember/runloop"; export default Component.extend({ classNames: ["modal-body"], fixed: false, diff --git a/app/assets/javascripts/discourse/app/components/d-modal.js b/app/assets/javascripts/discourse/app/components/d-modal.js index 63e9e755df..2ef23e5a17 100644 --- a/app/assets/javascripts/discourse/app/components/d-modal.js +++ b/app/assets/javascripts/discourse/app/components/d-modal.js @@ -1,8 +1,8 @@ -import afterTransition from "discourse/lib/after-transition"; +import Component from "@ember/component"; import I18n from "I18n"; +import afterTransition from "discourse/lib/after-transition"; import { next } from "@ember/runloop"; import { on } from "discourse-common/utils/decorators"; -import Component from "@ember/component"; export default Component.extend({ classNameBindings: [ diff --git a/app/assets/javascripts/discourse/app/components/d-navigation.js b/app/assets/javascripts/discourse/app/components/d-navigation.js index 824ece2590..31af03343a 100644 --- a/app/assets/javascripts/discourse/app/components/d-navigation.js +++ b/app/assets/javascripts/discourse/app/components/d-navigation.js @@ -1,9 +1,9 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import NavItem from "discourse/models/nav-item"; -import { inject as service } from "@ember/service"; import Component from "@ember/component"; import FilterModeMixin from "discourse/mixins/filter-mode"; +import NavItem from "discourse/models/nav-item"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; +import { inject as service } from "@ember/service"; export default Component.extend(FilterModeMixin, { router: service(), diff --git a/app/assets/javascripts/discourse/app/components/date-input.js b/app/assets/javascripts/discourse/app/components/date-input.js index 7c8cd58989..694337f102 100644 --- a/app/assets/javascripts/discourse/app/components/date-input.js +++ b/app/assets/javascripts/discourse/app/components/date-input.js @@ -1,11 +1,11 @@ -import { Promise } from "rsvp"; -import I18n from "I18n"; -import { schedule } from "@ember/runloop"; -import { action } from "@ember/object"; +import discourseComputed, { on } from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import I18n from "I18n"; +import { Promise } from "rsvp"; +import { action } from "@ember/object"; /* global Pikaday:true */ import loadScript from "discourse/lib/load-script"; -import discourseComputed, { on } from "discourse-common/utils/decorators"; +import { schedule } from "@ember/runloop"; export default Component.extend({ classNames: ["d-date-input"], diff --git a/app/assets/javascripts/discourse/app/components/date-picker.js b/app/assets/javascripts/discourse/app/components/date-picker.js index f54b48da8d..a3a1cd6ddf 100644 --- a/app/assets/javascripts/discourse/app/components/date-picker.js +++ b/app/assets/javascripts/discourse/app/components/date-picker.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; -import { schedule } from "@ember/runloop"; +import discourseComputed, { on } from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import I18n from "I18n"; /* global Pikaday:true */ import loadScript from "discourse/lib/load-script"; -import discourseComputed, { on } from "discourse-common/utils/decorators"; +import { schedule } from "@ember/runloop"; const DATE_FORMAT = "YYYY-MM-DD"; diff --git a/app/assets/javascripts/discourse/app/components/date-time-input.js b/app/assets/javascripts/discourse/app/components/date-time-input.js index 01d4d20ab1..2093b71c6e 100644 --- a/app/assets/javascripts/discourse/app/components/date-time-input.js +++ b/app/assets/javascripts/discourse/app/components/date-time-input.js @@ -1,5 +1,5 @@ +import { action, computed } from "@ember/object"; import Component from "@ember/component"; -import { computed, action } from "@ember/object"; export default Component.extend({ classNames: ["d-date-time-input"], diff --git a/app/assets/javascripts/discourse/app/components/desktop-notification-config.js b/app/assets/javascripts/discourse/app/components/desktop-notification-config.js index 56984dfa8a..29bf5bcfec 100644 --- a/app/assets/javascripts/discourse/app/components/desktop-notification-config.js +++ b/app/assets/javascripts/discourse/app/components/desktop-notification-config.js @@ -1,18 +1,18 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { or } from "@ember/object/computed"; -import Component from "@ember/component"; -import KeyValueStore from "discourse/lib/key-value-store"; import { - context, confirmNotification, + context, } from "discourse/lib/desktop-notifications"; import { - subscribe as subscribePushNotification, - unsubscribe as unsubscribePushNotification, isPushNotificationsSupported, keyValueStore as pushNotificationKeyValueStore, userSubscriptionKey as pushNotificationUserSubscriptionKey, + subscribe as subscribePushNotification, + unsubscribe as unsubscribePushNotification, } from "discourse/lib/push-notifications"; +import Component from "@ember/component"; +import KeyValueStore from "discourse/lib/key-value-store"; +import discourseComputed from "discourse-common/utils/decorators"; +import { or } from "@ember/object/computed"; const keyValueStore = new KeyValueStore(context); diff --git a/app/assets/javascripts/discourse/app/components/discourse-banner.js b/app/assets/javascripts/discourse/app/components/discourse-banner.js index baf54cfdc2..738211dde2 100644 --- a/app/assets/javascripts/discourse/app/components/discourse-banner.js +++ b/app/assets/javascripts/discourse/app/components/discourse-banner.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ hide: false, diff --git a/app/assets/javascripts/discourse/app/components/discourse-linked-text.js b/app/assets/javascripts/discourse/app/components/discourse-linked-text.js index acbb88021a..4085d56d2f 100644 --- a/app/assets/javascripts/discourse/app/components/discourse-linked-text.js +++ b/app/assets/javascripts/discourse/app/components/discourse-linked-text.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import Component from "@ember/component"; +import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/discourse-tag-bound.js b/app/assets/javascripts/discourse/app/components/discourse-tag-bound.js index f692e3a2fb..278ec36c7b 100644 --- a/app/assets/javascripts/discourse/app/components/discourse-tag-bound.js +++ b/app/assets/javascripts/discourse/app/components/discourse-tag-bound.js @@ -1,6 +1,6 @@ -import getURL from "discourse-common/lib/get-url"; -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; +import getURL from "discourse-common/lib/get-url"; export default Component.extend({ tagName: "a", diff --git a/app/assets/javascripts/discourse/app/components/discourse-topic.js b/app/assets/javascripts/discourse/app/components/discourse-topic.js index dcfbc4b21a..d09f9cd245 100644 --- a/app/assets/javascripts/discourse/app/components/discourse-topic.js +++ b/app/assets/javascripts/discourse/app/components/discourse-topic.js @@ -1,11 +1,11 @@ -import { alias } from "@ember/object/computed"; import { later, schedule, scheduleOnce, throttle } from "@ember/runloop"; -import Component from "@ember/component"; -import DiscourseURL from "discourse/lib/url"; import AddArchetypeClass from "discourse/mixins/add-archetype-class"; import ClickTrack from "discourse/lib/click-track"; -import Scrolling from "discourse/mixins/scrolling"; +import Component from "@ember/component"; +import DiscourseURL from "discourse/lib/url"; import MobileScrollDirection from "discourse/mixins/mobile-scroll-direction"; +import Scrolling from "discourse/mixins/scrolling"; +import { alias } from "@ember/object/computed"; import { observes } from "discourse-common/utils/decorators"; const MOBILE_SCROLL_DIRECTION_CHECK_THROTTLE = 300; diff --git a/app/assets/javascripts/discourse/app/components/discovery-topics-list.js b/app/assets/javascripts/discourse/app/components/discovery-topics-list.js index dad15d1d9d..bce1b2a9e8 100644 --- a/app/assets/javascripts/discourse/app/components/discovery-topics-list.js +++ b/app/assets/javascripts/discourse/app/components/discovery-topics-list.js @@ -1,6 +1,6 @@ +import { observes, on } from "discourse-common/utils/decorators"; import { schedule, scheduleOnce } from "@ember/runloop"; import Component from "@ember/component"; -import { on, observes } from "discourse-common/utils/decorators"; import LoadMore from "discourse/mixins/load-more"; import UrlRefresh from "discourse/mixins/url-refresh"; import { inject as service } from "@ember/service"; diff --git a/app/assets/javascripts/discourse/app/components/edit-category-general.js b/app/assets/javascripts/discourse/app/components/edit-category-general.js index 7a6c85d776..8bd8b8eda8 100644 --- a/app/assets/javascripts/discourse/app/components/edit-category-general.js +++ b/app/assets/javascripts/discourse/app/components/edit-category-general.js @@ -1,12 +1,12 @@ -import getURL from "discourse-common/lib/get-url"; -import discourseComputed from "discourse-common/utils/decorators"; -import { isEmpty } from "@ember/utils"; -import { not } from "@ember/object/computed"; +import { cancel, later } from "@ember/runloop"; +import Category from "discourse/models/category"; import { action } from "@ember/object"; -import { later, cancel } from "@ember/runloop"; import { buildCategoryPanel } from "discourse/components/edit-category-panel"; import { categoryBadgeHTML } from "discourse/helpers/category-link"; -import Category from "discourse/models/category"; +import discourseComputed from "discourse-common/utils/decorators"; +import getURL from "discourse-common/lib/get-url"; +import { isEmpty } from "@ember/utils"; +import { not } from "@ember/object/computed"; export default buildCategoryPanel("general", { init() { diff --git a/app/assets/javascripts/discourse/app/components/edit-category-panel.js b/app/assets/javascripts/discourse/app/components/edit-category-panel.js index 02f7a28424..e20bc7baab 100644 --- a/app/assets/javascripts/discourse/app/components/edit-category-panel.js +++ b/app/assets/javascripts/discourse/app/components/edit-category-panel.js @@ -1,5 +1,5 @@ -import { equal } from "@ember/object/computed"; import Component from "@ember/component"; +import { equal } from "@ember/object/computed"; const EditCategoryPanel = Component.extend({}); export default EditCategoryPanel; diff --git a/app/assets/javascripts/discourse/app/components/edit-category-security.js b/app/assets/javascripts/discourse/app/components/edit-category-security.js index 6f9e9309a3..e99352e4b1 100644 --- a/app/assets/javascripts/discourse/app/components/edit-category-security.js +++ b/app/assets/javascripts/discourse/app/components/edit-category-security.js @@ -1,5 +1,5 @@ -import { buildCategoryPanel } from "discourse/components/edit-category-panel"; import PermissionType from "discourse/models/permission-type"; +import { buildCategoryPanel } from "discourse/components/edit-category-panel"; import discourseComputed from "discourse-common/utils/decorators"; import { not } from "@ember/object/computed"; diff --git a/app/assets/javascripts/discourse/app/components/edit-category-settings.js b/app/assets/javascripts/discourse/app/components/edit-category-settings.js index b18e84d5c0..f04ffa6721 100644 --- a/app/assets/javascripts/discourse/app/components/edit-category-settings.js +++ b/app/assets/javascripts/discourse/app/components/edit-category-settings.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { empty, and } from "@ember/object/computed"; -import { setting } from "discourse/lib/computed"; -import { buildCategoryPanel } from "discourse/components/edit-category-panel"; -import { SEARCH_PRIORITIES } from "discourse/lib/constants"; +import { and, empty } from "@ember/object/computed"; import Group from "discourse/models/group"; +import I18n from "I18n"; +import { SEARCH_PRIORITIES } from "discourse/lib/constants"; +import { buildCategoryPanel } from "discourse/components/edit-category-panel"; +import discourseComputed from "discourse-common/utils/decorators"; +import { setting } from "discourse/lib/computed"; const categorySortCriteria = []; export function addCategorySortCriteria(criteria) { diff --git a/app/assets/javascripts/discourse/app/components/edit-category-tab.js b/app/assets/javascripts/discourse/app/components/edit-category-tab.js index 0ead526caa..45721b4370 100644 --- a/app/assets/javascripts/discourse/app/components/edit-category-tab.js +++ b/app/assets/javascripts/discourse/app/components/edit-category-tab.js @@ -1,11 +1,11 @@ +import Component from "@ember/component"; +import DiscourseURL from "discourse/lib/url"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; -import { scheduleOnce } from "@ember/runloop"; -import Component from "@ember/component"; -import { propertyEqual } from "discourse/lib/computed"; -import getURL from "discourse-common/lib/get-url"; import { empty } from "@ember/object/computed"; -import DiscourseURL from "discourse/lib/url"; +import getURL from "discourse-common/lib/get-url"; +import { propertyEqual } from "discourse/lib/computed"; +import { scheduleOnce } from "@ember/runloop"; import { underscore } from "@ember/string"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/edit-category-tags.js b/app/assets/javascripts/discourse/app/components/edit-category-tags.js index 862e874ce4..f9dc2d914b 100644 --- a/app/assets/javascripts/discourse/app/components/edit-category-tags.js +++ b/app/assets/javascripts/discourse/app/components/edit-category-tags.js @@ -1,4 +1,4 @@ -import { empty, and } from "@ember/object/computed"; +import { and, empty } from "@ember/object/computed"; import { buildCategoryPanel } from "discourse/components/edit-category-panel"; export default buildCategoryPanel("tags", { diff --git a/app/assets/javascripts/discourse/app/components/edit-category-topic-template.js b/app/assets/javascripts/discourse/app/components/edit-category-topic-template.js index eeac5335b0..b4d8d7a721 100644 --- a/app/assets/javascripts/discourse/app/components/edit-category-topic-template.js +++ b/app/assets/javascripts/discourse/app/components/edit-category-topic-template.js @@ -1,6 +1,6 @@ -import { schedule } from "@ember/runloop"; import { buildCategoryPanel } from "discourse/components/edit-category-panel"; import { observes } from "discourse-common/utils/decorators"; +import { schedule } from "@ember/runloop"; export default buildCategoryPanel("topic-template", { // Modals are defined using the singleton pattern. diff --git a/app/assets/javascripts/discourse/app/components/edit-topic-timer-form.js b/app/assets/javascripts/discourse/app/components/edit-topic-timer-form.js index fd3652d5cc..fea8de29bc 100644 --- a/app/assets/javascripts/discourse/app/components/edit-topic-timer-form.js +++ b/app/assets/javascripts/discourse/app/components/edit-topic-timer-form.js @@ -1,15 +1,15 @@ -import { equal, or, readOnly } from "@ember/object/computed"; -import { schedule } from "@ember/runloop"; -import Component from "@ember/component"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; import { - PUBLISH_TO_CATEGORY_STATUS_TYPE, - OPEN_STATUS_TYPE, - DELETE_STATUS_TYPE, - CLOSE_STATUS_TYPE, BUMP_TYPE, + CLOSE_STATUS_TYPE, DELETE_REPLIES_TYPE, + DELETE_STATUS_TYPE, + OPEN_STATUS_TYPE, + PUBLISH_TO_CATEGORY_STATUS_TYPE, } from "discourse/controllers/edit-topic-timer"; +import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import { equal, or, readOnly } from "@ember/object/computed"; +import Component from "@ember/component"; +import { schedule } from "@ember/runloop"; export default Component.extend({ selection: readOnly("topicTimer.status_type"), diff --git a/app/assets/javascripts/discourse/app/components/email-dropdown.js b/app/assets/javascripts/discourse/app/components/email-dropdown.js index 173d12d74b..f28cacf82e 100644 --- a/app/assets/javascripts/discourse/app/components/email-dropdown.js +++ b/app/assets/javascripts/discourse/app/components/email-dropdown.js @@ -1,7 +1,7 @@ import { action, computed } from "@ember/object"; -import { inject as service } from "@ember/service"; -import I18n from "I18n"; import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; +import I18n from "I18n"; +import { inject as service } from "@ember/service"; export default DropdownSelectBoxComponent.extend({ router: service(), diff --git a/app/assets/javascripts/discourse/app/components/emoji-picker.js b/app/assets/javascripts/discourse/app/components/emoji-picker.js index b13c18f6a4..38eff47a55 100644 --- a/app/assets/javascripts/discourse/app/components/emoji-picker.js +++ b/app/assets/javascripts/discourse/app/components/emoji-picker.js @@ -1,17 +1,17 @@ -import { observes, bind } from "discourse-common/utils/decorators"; -import { htmlSafe } from "@ember/template"; -import { emojiUnescape, emojiUrlFor } from "discourse/lib/text"; import { action, computed } from "@ember/object"; -import { inject as service } from "@ember/service"; -import { schedule, later } from "@ember/runloop"; -import Component from "@ember/component"; -import { createPopper } from "@popperjs/core"; +import { bind, observes } from "discourse-common/utils/decorators"; import { + emojiSearch, extendedEmojiList, isSkinTonableEmoji, - emojiSearch, } from "pretty-text/emoji"; -import { safariHacksDisabled, escapeExpression } from "discourse/lib/utilities"; +import { emojiUnescape, emojiUrlFor } from "discourse/lib/text"; +import { escapeExpression, safariHacksDisabled } from "discourse/lib/utilities"; +import { later, schedule } from "@ember/runloop"; +import Component from "@ember/component"; +import { createPopper } from "@popperjs/core"; +import { htmlSafe } from "@ember/template"; +import { inject as service } from "@ember/service"; function customEmojis() { const list = extendedEmojiList(); diff --git a/app/assets/javascripts/discourse/app/components/emoji-uploader.js b/app/assets/javascripts/discourse/app/components/emoji-uploader.js index d94117682a..371137e4fa 100644 --- a/app/assets/javascripts/discourse/app/components/emoji-uploader.js +++ b/app/assets/javascripts/discourse/app/components/emoji-uploader.js @@ -1,8 +1,8 @@ -import { notEmpty } from "@ember/object/computed"; -import { action } from "@ember/object"; import Component from "@ember/component"; -import discourseComputed from "discourse-common/utils/decorators"; import UploadMixin from "discourse/mixins/upload"; +import { action } from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; +import { notEmpty } from "@ember/object/computed"; const DEFAULT_GROUP = "default"; diff --git a/app/assets/javascripts/discourse/app/components/expanding-text-area.js b/app/assets/javascripts/discourse/app/components/expanding-text-area.js index ac1f6fae46..86a15b910b 100644 --- a/app/assets/javascripts/discourse/app/components/expanding-text-area.js +++ b/app/assets/javascripts/discourse/app/components/expanding-text-area.js @@ -1,7 +1,7 @@ +import { observes, on } from "discourse-common/utils/decorators"; import TextArea from "@ember/component/text-area"; -import { schedule } from "@ember/runloop"; -import { on, observes } from "discourse-common/utils/decorators"; import autosize from "discourse/lib/autosize"; +import { schedule } from "@ember/runloop"; export default TextArea.extend({ @on("didInsertElement") diff --git a/app/assets/javascripts/discourse/app/components/flag-action-type.js b/app/assets/javascripts/discourse/app/components/flag-action-type.js index b1fe079c60..a409fec15d 100644 --- a/app/assets/javascripts/discourse/app/components/flag-action-type.js +++ b/app/assets/javascripts/discourse/app/components/flag-action-type.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { and, not, equal } from "@ember/object/computed"; +import { and, equal, not } from "@ember/object/computed"; import Component from "@ember/component"; +import I18n from "I18n"; import { MAX_MESSAGE_LENGTH } from "discourse/models/post-action-type"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ classNames: ["flag-action-type"], diff --git a/app/assets/javascripts/discourse/app/components/flag-selection.js b/app/assets/javascripts/discourse/app/components/flag-selection.js index 6f731dd0e8..ebb7209e4f 100644 --- a/app/assets/javascripts/discourse/app/components/flag-selection.js +++ b/app/assets/javascripts/discourse/app/components/flag-selection.js @@ -1,5 +1,5 @@ -import { next } from "@ember/runloop"; import Component from "@ember/component"; +import { next } from "@ember/runloop"; import { observes } from "discourse-common/utils/decorators"; // Mostly hacks because `flag.hbs` didn't use `radio-button` diff --git a/app/assets/javascripts/discourse/app/components/flat-button.js b/app/assets/javascripts/discourse/app/components/flat-button.js index 927d19a2c4..8f8ac08a14 100644 --- a/app/assets/javascripts/discourse/app/components/flat-button.js +++ b/app/assets/javascripts/discourse/app/components/flat-button.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import Component from "@ember/component"; +import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/footer-nav.js b/app/assets/javascripts/discourse/app/components/footer-nav.js index ab87708bac..9a99c1b4fc 100644 --- a/app/assets/javascripts/discourse/app/components/footer-nav.js +++ b/app/assets/javascripts/discourse/app/components/footer-nav.js @@ -1,9 +1,9 @@ -import { throttle } from "@ember/runloop"; -import MountWidget from "discourse/components/mount-widget"; +import { isAppWebview, postRNWebviewMessage } from "discourse/lib/utilities"; import MobileScrollDirection from "discourse/mixins/mobile-scroll-direction"; +import MountWidget from "discourse/components/mount-widget"; import Scrolling from "discourse/mixins/scrolling"; import { observes } from "discourse-common/utils/decorators"; -import { isAppWebview, postRNWebviewMessage } from "discourse/lib/utilities"; +import { throttle } from "@ember/runloop"; const MOBILE_SCROLL_DIRECTION_CHECK_THROTTLE = 150; diff --git a/app/assets/javascripts/discourse/app/components/future-date-input.js b/app/assets/javascripts/discourse/app/components/future-date-input.js index 9457e900b3..ab0f447601 100644 --- a/app/assets/javascripts/discourse/app/components/future-date-input.js +++ b/app/assets/javascripts/discourse/app/components/future-date-input.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import { equal, and, empty, or } from "@ember/object/computed"; -import Component from "@ember/component"; +import { and, empty, equal, or } from "@ember/object/computed"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import Component from "@ember/component"; import { FORMAT } from "select-kit/components/future-date-input-selector"; +import I18n from "I18n"; import { PUBLISH_TO_CATEGORY_STATUS_TYPE } from "discourse/controllers/edit-topic-timer"; +import { isEmpty } from "@ember/utils"; export default Component.extend({ selection: null, diff --git a/app/assets/javascripts/discourse/app/components/global-notice.js b/app/assets/javascripts/discourse/app/components/global-notice.js index 00fdb98350..c6a2e9e967 100644 --- a/app/assets/javascripts/discourse/app/components/global-notice.js +++ b/app/assets/javascripts/discourse/app/components/global-notice.js @@ -1,10 +1,10 @@ -import getURL from "discourse-common/lib/get-url"; -import { bind } from "discourse-common/utils/decorators"; -import I18n from "I18n"; -import Component from "@ember/component"; -import LogsNotice from "discourse/services/logs-notice"; import EmberObject, { computed } from "@ember/object"; import cookie, { removeCookie } from "discourse/lib/cookie"; +import Component from "@ember/component"; +import I18n from "I18n"; +import LogsNotice from "discourse/services/logs-notice"; +import { bind } from "discourse-common/utils/decorators"; +import getURL from "discourse-common/lib/get-url"; const _pluginNotices = []; diff --git a/app/assets/javascripts/discourse/app/components/google-search.js b/app/assets/javascripts/discourse/app/components/google-search.js index 527ffdfd12..1e5e062258 100644 --- a/app/assets/javascripts/discourse/app/components/google-search.js +++ b/app/assets/javascripts/discourse/app/components/google-search.js @@ -1,7 +1,7 @@ -import getURL from "discourse-common/lib/get-url"; -import discourseComputed from "discourse-common/utils/decorators"; -import { alias } from "@ember/object/computed"; import Component from "@ember/component"; +import { alias } from "@ember/object/computed"; +import discourseComputed from "discourse-common/utils/decorators"; +import getURL from "discourse-common/lib/get-url"; export default Component.extend({ classNames: ["google-search-form"], diff --git a/app/assets/javascripts/discourse/app/components/group-card-contents.js b/app/assets/javascripts/discourse/app/components/group-card-contents.js index fa2897df18..f9b0ef1f19 100644 --- a/app/assets/javascripts/discourse/app/components/group-card-contents.js +++ b/app/assets/javascripts/discourse/app/components/group-card-contents.js @@ -1,11 +1,11 @@ import { alias, gt } from "@ember/object/computed"; -import Component from "@ember/component"; -import { setting } from "discourse/lib/computed"; -import discourseComputed from "discourse-common/utils/decorators"; import CardContentsBase from "discourse/mixins/card-contents-base"; import CleansUp from "discourse/mixins/cleans-up"; -import { groupPath } from "discourse/lib/url"; +import Component from "@ember/component"; import { Promise } from "rsvp"; +import discourseComputed from "discourse-common/utils/decorators"; +import { groupPath } from "discourse/lib/url"; +import { setting } from "discourse/lib/computed"; const maxMembersToDisplay = 10; diff --git a/app/assets/javascripts/discourse/app/components/group-flair-inputs.js b/app/assets/javascripts/discourse/app/components/group-flair-inputs.js index 0c60c695d4..465940927b 100644 --- a/app/assets/javascripts/discourse/app/components/group-flair-inputs.js +++ b/app/assets/javascripts/discourse/app/components/group-flair-inputs.js @@ -1,16 +1,16 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; import discourseComputed, { - on, observes, + on, } from "discourse-common/utils/decorators"; -import { debounce } from "@ember/runloop"; import Component from "@ember/component"; -import { escapeExpression } from "discourse/lib/utilities"; -import { convertIconClass } from "discourse-common/lib/icon-library"; -import { ajax } from "discourse/lib/ajax"; -import { htmlSafe } from "@ember/template"; +import I18n from "I18n"; import { action } from "@ember/object"; +import { ajax } from "discourse/lib/ajax"; +import { convertIconClass } from "discourse-common/lib/icon-library"; +import { debounce } from "@ember/runloop"; +import { escapeExpression } from "discourse/lib/utilities"; +import getURL from "discourse-common/lib/get-url"; +import { htmlSafe } from "@ember/template"; export default Component.extend({ classNames: ["group-flair-inputs"], diff --git a/app/assets/javascripts/discourse/app/components/group-manage-logs-filter.js b/app/assets/javascripts/discourse/app/components/group-manage-logs-filter.js index 52ca1587e4..8e7332663e 100644 --- a/app/assets/javascripts/discourse/app/components/group-manage-logs-filter.js +++ b/app/assets/javascripts/discourse/app/components/group-manage-logs-filter.js @@ -1,6 +1,6 @@ +import Component from "@ember/component"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; -import Component from "@ember/component"; export default Component.extend({ tagName: "", diff --git a/app/assets/javascripts/discourse/app/components/group-manage-save-button.js b/app/assets/javascripts/discourse/app/components/group-manage-save-button.js index 2c92af9c0c..0a92d4bd84 100644 --- a/app/assets/javascripts/discourse/app/components/group-manage-save-button.js +++ b/app/assets/javascripts/discourse/app/components/group-manage-save-button.js @@ -1,9 +1,9 @@ +import Component from "@ember/component"; +import DiscourseURL from "discourse/lib/url"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; -import Component from "@ember/component"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { popupAutomaticMembershipAlert } from "discourse/controllers/groups-new"; -import DiscourseURL from "discourse/lib/url"; export default Component.extend({ saving: null, diff --git a/app/assets/javascripts/discourse/app/components/group-member-dropdown.js b/app/assets/javascripts/discourse/app/components/group-member-dropdown.js index f4cb9ad287..c59dc84ca3 100644 --- a/app/assets/javascripts/discourse/app/components/group-member-dropdown.js +++ b/app/assets/javascripts/discourse/app/components/group-member-dropdown.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; +import I18n from "I18n"; import { computed } from "@ember/object"; export default DropdownSelectBoxComponent.extend({ diff --git a/app/assets/javascripts/discourse/app/components/group-membership-button.js b/app/assets/javascripts/discourse/app/components/group-membership-button.js index bb7df0ea9c..2849d16bb7 100644 --- a/app/assets/javascripts/discourse/app/components/group-membership-button.js +++ b/app/assets/javascripts/discourse/app/components/group-membership-button.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; import Component from "@ember/component"; +import I18n from "I18n"; +import bootbox from "bootbox"; +import cookie from "discourse/lib/cookie"; import discourseComputed from "discourse-common/utils/decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; import showModal from "discourse/lib/show-modal"; -import bootbox from "bootbox"; -import cookie from "discourse/lib/cookie"; export default Component.extend({ classNames: ["group-membership-button"], diff --git a/app/assets/javascripts/discourse/app/components/group-post.js b/app/assets/javascripts/discourse/app/components/group-post.js index 49d3227046..679f88ceff 100644 --- a/app/assets/javascripts/discourse/app/components/group-post.js +++ b/app/assets/javascripts/discourse/app/components/group-post.js @@ -1,6 +1,6 @@ -import getURL from "discourse-common/lib/get-url"; -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; +import getURL from "discourse-common/lib/get-url"; export default Component.extend({ @discourseComputed("post.url") diff --git a/app/assets/javascripts/discourse/app/components/group-selector.js b/app/assets/javascripts/discourse/app/components/group-selector.js index 2516de122c..651dfb7ade 100644 --- a/app/assets/javascripts/discourse/app/components/group-selector.js +++ b/app/assets/javascripts/discourse/app/components/group-selector.js @@ -1,11 +1,11 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import Component from "@ember/component"; import discourseComputed, { - on, observes, + on, } from "discourse-common/utils/decorators"; +import Component from "@ember/component"; +import I18n from "I18n"; import { findRawTemplate } from "discourse-common/lib/raw-templates"; +import { isEmpty } from "@ember/utils"; export default Component.extend({ @discourseComputed("placeholderKey") diff --git a/app/assets/javascripts/discourse/app/components/groups-form-interaction-fields.js b/app/assets/javascripts/discourse/app/components/groups-form-interaction-fields.js index fd60e3686b..ca271caa98 100644 --- a/app/assets/javascripts/discourse/app/components/groups-form-interaction-fields.js +++ b/app/assets/javascripts/discourse/app/components/groups-form-interaction-fields.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; import Component from "@ember/component"; -import { or } from "@ember/object/computed"; +import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; +import { or } from "@ember/object/computed"; export default Component.extend({ init() { diff --git a/app/assets/javascripts/discourse/app/components/groups-form-membership-fields.js b/app/assets/javascripts/discourse/app/components/groups-form-membership-fields.js index fb00e15c13..e7239ce385 100644 --- a/app/assets/javascripts/discourse/app/components/groups-form-membership-fields.js +++ b/app/assets/javascripts/discourse/app/components/groups-form-membership-fields.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import I18n from "I18n"; import { computed } from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ tokenSeparator: "|", diff --git a/app/assets/javascripts/discourse/app/components/groups-form-profile-fields.js b/app/assets/javascripts/discourse/app/components/groups-form-profile-fields.js index e6c2af54ba..23672bc5b8 100644 --- a/app/assets/javascripts/discourse/app/components/groups-form-profile-fields.js +++ b/app/assets/javascripts/discourse/app/components/groups-form-profile-fields.js @@ -1,12 +1,12 @@ +import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import Component from "@ember/component"; +import EmberObject from "@ember/object"; +import Group from "discourse/models/group"; import I18n from "I18n"; +import discourseDebounce from "discourse/lib/debounce"; import { isEmpty } from "@ember/utils"; import { not } from "@ember/object/computed"; -import Component from "@ember/component"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; -import Group from "discourse/models/group"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import discourseDebounce from "discourse/lib/debounce"; -import EmberObject from "@ember/object"; export default Component.extend({ disableSave: null, diff --git a/app/assets/javascripts/discourse/app/components/groups-info.js b/app/assets/javascripts/discourse/app/components/groups-info.js index 9390d17e4e..f7ff39a99f 100644 --- a/app/assets/javascripts/discourse/app/components/groups-info.js +++ b/app/assets/javascripts/discourse/app/components/groups-info.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "span", diff --git a/app/assets/javascripts/discourse/app/components/highlight-search.js b/app/assets/javascripts/discourse/app/components/highlight-search.js index 7864b6ef98..b0f8cc5e9c 100644 --- a/app/assets/javascripts/discourse/app/components/highlight-search.js +++ b/app/assets/javascripts/discourse/app/components/highlight-search.js @@ -1,6 +1,6 @@ +import { observes, on } from "discourse-common/utils/decorators"; import Component from "@ember/component"; import highlightSearch from "discourse/lib/highlight-search"; -import { observes, on } from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "span", diff --git a/app/assets/javascripts/discourse/app/components/highlight-text.js b/app/assets/javascripts/discourse/app/components/highlight-text.js index 2f37f89e9b..6199140de3 100644 --- a/app/assets/javascripts/discourse/app/components/highlight-text.js +++ b/app/assets/javascripts/discourse/app/components/highlight-text.js @@ -1,5 +1,5 @@ -import highlightSearch from "discourse/components/highlight-search"; import deprecated from "discourse-common/lib/deprecated"; +import highlightSearch from "discourse/components/highlight-search"; export default highlightSearch.extend({ init() { diff --git a/app/assets/javascripts/discourse/app/components/ignored-user-list.js b/app/assets/javascripts/discourse/app/components/ignored-user-list.js index a7a2d3d515..e355a898ed 100644 --- a/app/assets/javascripts/discourse/app/components/ignored-user-list.js +++ b/app/assets/javascripts/discourse/app/components/ignored-user-list.js @@ -1,7 +1,7 @@ import Component from "@ember/component"; +import User from "discourse/models/user"; import { popupAjaxError } from "discourse/lib/ajax-error"; import showModal from "discourse/lib/show-modal"; -import User from "discourse/models/user"; export default Component.extend({ item: null, diff --git a/app/assets/javascripts/discourse/app/components/image-uploader.js b/app/assets/javascripts/discourse/app/components/image-uploader.js index c292d20641..441ec4b743 100644 --- a/app/assets/javascripts/discourse/app/components/image-uploader.js +++ b/app/assets/javascripts/discourse/app/components/image-uploader.js @@ -1,11 +1,11 @@ -import { getURLWithCDN } from "discourse-common/lib/get-url"; -import discourseComputed from "discourse-common/utils/decorators"; -import { isEmpty } from "@ember/utils"; -import { next } from "@ember/runloop"; import Component from "@ember/component"; import UploadMixin from "discourse/mixins/upload"; -import lightbox from "discourse/lib/lightbox"; import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; +import { getURLWithCDN } from "discourse-common/lib/get-url"; +import { isEmpty } from "@ember/utils"; +import lightbox from "discourse/lib/lightbox"; +import { next } from "@ember/runloop"; import { popupAjaxError } from "discourse/lib/ajax-error"; export default Component.extend(UploadMixin, { diff --git a/app/assets/javascripts/discourse/app/components/images-uploader.js b/app/assets/javascripts/discourse/app/components/images-uploader.js index 7f6a70c15d..beeff06ccf 100644 --- a/app/assets/javascripts/discourse/app/components/images-uploader.js +++ b/app/assets/javascripts/discourse/app/components/images-uploader.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import I18n from "I18n"; import UploadMixin from "discourse/mixins/upload"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend(UploadMixin, { type: "avatar", diff --git a/app/assets/javascripts/discourse/app/components/invite-link-panel.js b/app/assets/javascripts/discourse/app/components/invite-link-panel.js index 27c2d53fd3..339cd521ea 100644 --- a/app/assets/javascripts/discourse/app/components/invite-link-panel.js +++ b/app/assets/javascripts/discourse/app/components/invite-link-panel.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; +import { and, readOnly } from "@ember/object/computed"; import Component from "@ember/component"; import Group from "discourse/models/group"; -import { and, readOnly } from "@ember/object/computed"; +import I18n from "I18n"; +import Invite from "discourse/models/invite"; import { action } from "@ember/object"; import discourseComputed from "discourse-common/utils/decorators"; -import Invite from "discourse/models/invite"; export default Component.extend({ inviteModel: readOnly("panel.model.inviteModel"), diff --git a/app/assets/javascripts/discourse/app/components/invite-panel.js b/app/assets/javascripts/discourse/app/components/invite-panel.js index 9b289189d8..0578836b38 100644 --- a/app/assets/javascripts/discourse/app/components/invite-panel.js +++ b/app/assets/javascripts/discourse/app/components/invite-panel.js @@ -1,14 +1,14 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { isEmpty } from "@ember/utils"; import EmberObject, { action } from "@ember/object"; import { alias, and, equal, readOnly } from "@ember/object/computed"; import Component from "@ember/component"; -import { emailValid } from "discourse/lib/utilities"; import Group from "discourse/models/group"; +import I18n from "I18n"; import Invite from "discourse/models/invite"; -import { i18n } from "discourse/lib/computed"; +import discourseComputed from "discourse-common/utils/decorators"; +import { emailValid } from "discourse/lib/utilities"; import { getNativeContact } from "discourse/lib/pwa-utils"; +import { i18n } from "discourse/lib/computed"; +import { isEmpty } from "@ember/utils"; export default Component.extend({ tagName: null, diff --git a/app/assets/javascripts/discourse/app/components/latest-topic-list-item.js b/app/assets/javascripts/discourse/app/components/latest-topic-list-item.js index 5e48bd6ac2..96fc9310b2 100644 --- a/app/assets/javascripts/discourse/app/components/latest-topic-list-item.js +++ b/app/assets/javascripts/discourse/app/components/latest-topic-list-item.js @@ -1,8 +1,8 @@ -import Component from "@ember/component"; import { - showEntrance, navigateToTopic, + showEntrance, } from "discourse/components/topic-list-item"; +import Component from "@ember/component"; export default Component.extend({ attributeBindings: ["topic.id:data-topic-id"], diff --git a/app/assets/javascripts/discourse/app/components/link-to-input.js b/app/assets/javascripts/discourse/app/components/link-to-input.js index 6a988c8c9a..b3b9b70432 100644 --- a/app/assets/javascripts/discourse/app/components/link-to-input.js +++ b/app/assets/javascripts/discourse/app/components/link-to-input.js @@ -1,5 +1,5 @@ -import { schedule } from "@ember/runloop"; import Component from "@ember/component"; +import { schedule } from "@ember/runloop"; export default Component.extend({ showInput: false, diff --git a/app/assets/javascripts/discourse/app/components/links-redirect.js b/app/assets/javascripts/discourse/app/components/links-redirect.js index e74b6d9f14..45996d88ec 100644 --- a/app/assets/javascripts/discourse/app/components/links-redirect.js +++ b/app/assets/javascripts/discourse/app/components/links-redirect.js @@ -1,5 +1,5 @@ -import Component from "@ember/component"; import ClickTrack from "discourse/lib/click-track"; +import Component from "@ember/component"; export default Component.extend({ didInsertElement() { diff --git a/app/assets/javascripts/discourse/app/components/login-buttons.js b/app/assets/javascripts/discourse/app/components/login-buttons.js index b321aaf6f8..ca8c628671 100644 --- a/app/assets/javascripts/discourse/app/components/login-buttons.js +++ b/app/assets/javascripts/discourse/app/components/login-buttons.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; import { findAll } from "discourse/models/login-method"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/login-modal.js b/app/assets/javascripts/discourse/app/components/login-modal.js index 2e3207e6df..52f0acef04 100644 --- a/app/assets/javascripts/discourse/app/components/login-modal.js +++ b/app/assets/javascripts/discourse/app/components/login-modal.js @@ -1,6 +1,6 @@ -import { schedule } from "@ember/runloop"; import Component from "@ember/component"; import cookie from "discourse/lib/cookie"; +import { schedule } from "@ember/runloop"; export default Component.extend({ didInsertElement() { diff --git a/app/assets/javascripts/discourse/app/components/mobile-nav.js b/app/assets/javascripts/discourse/app/components/mobile-nav.js index 197743242d..db61688f96 100644 --- a/app/assets/javascripts/discourse/app/components/mobile-nav.js +++ b/app/assets/javascripts/discourse/app/components/mobile-nav.js @@ -1,6 +1,6 @@ -import { next } from "@ember/runloop"; +import { observes, on } from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import { on, observes } from "discourse-common/utils/decorators"; +import { next } from "@ember/runloop"; export default Component.extend({ @on("init") diff --git a/app/assets/javascripts/discourse/app/components/modal-tab.js b/app/assets/javascripts/discourse/app/components/modal-tab.js index 07977aff2c..ed87097b6e 100644 --- a/app/assets/javascripts/discourse/app/components/modal-tab.js +++ b/app/assets/javascripts/discourse/app/components/modal-tab.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; import Component from "@ember/component"; +import I18n from "I18n"; +import discourseComputed from "discourse-common/utils/decorators"; import { equal } from "@ember/object/computed"; import { propertyEqual } from "discourse/lib/computed"; -import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "li", diff --git a/app/assets/javascripts/discourse/app/components/mount-widget.js b/app/assets/javascripts/discourse/app/components/mount-widget.js index 5d8b319f8e..f0f7e66e4a 100644 --- a/app/assets/javascripts/discourse/app/components/mount-widget.js +++ b/app/assets/javascripts/discourse/app/components/mount-widget.js @@ -1,11 +1,11 @@ import { cancel, scheduleOnce } from "@ember/runloop"; -import Component from "@ember/component"; import { diff, patch } from "virtual-dom"; -import { WidgetClickHook } from "discourse/widgets/hooks"; import { queryRegistry, traverseCustomWidgets } from "discourse/widgets/widget"; -import { getRegister } from "discourse-common/lib/get-owner"; +import Component from "@ember/component"; import DirtyKeys from "discourse/lib/dirty-keys"; +import { WidgetClickHook } from "discourse/widgets/hooks"; import { camelize } from "@ember/string"; +import { getRegister } from "discourse-common/lib/get-owner"; let _cleanCallbacks = {}; export function addWidgetCleanCallback(widgetName, fn) { diff --git a/app/assets/javascripts/discourse/app/components/nav-item.js b/app/assets/javascripts/discourse/app/components/nav-item.js index d8afc6b39c..54e0562ec0 100644 --- a/app/assets/javascripts/discourse/app/components/nav-item.js +++ b/app/assets/javascripts/discourse/app/components/nav-item.js @@ -1,9 +1,9 @@ +import Component from "@ember/component"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; -import { inject as service } from "@ember/service"; -import Component from "@ember/component"; -/* You might be looking for navigation-item. */ import { iconHTML } from "discourse-common/lib/icon-library"; +/* You might be looking for navigation-item. */ +import { inject as service } from "@ember/service"; export default Component.extend({ tagName: "li", diff --git a/app/assets/javascripts/discourse/app/components/navigation-bar.js b/app/assets/javascripts/discourse/app/components/navigation-bar.js index 45041bc4cb..8cd046314b 100644 --- a/app/assets/javascripts/discourse/app/components/navigation-bar.js +++ b/app/assets/javascripts/discourse/app/components/navigation-bar.js @@ -1,9 +1,9 @@ -import { next } from "@ember/runloop"; -import Component from "@ember/component"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import Component from "@ember/component"; import DiscourseURL from "discourse/lib/url"; -import { renderedConnectorsFor } from "discourse/lib/plugin-connectors"; import FilterModeMixin from "discourse/mixins/filter-mode"; +import { next } from "@ember/runloop"; +import { renderedConnectorsFor } from "discourse/lib/plugin-connectors"; export default Component.extend(FilterModeMixin, { tagName: "ul", diff --git a/app/assets/javascripts/discourse/app/components/navigation-item.js b/app/assets/javascripts/discourse/app/components/navigation-item.js index d5768eb202..29b95a405c 100644 --- a/app/assets/javascripts/discourse/app/components/navigation-item.js +++ b/app/assets/javascripts/discourse/app/components/navigation-item.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; import FilterModeMixin from "discourse/mixins/filter-mode"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend(FilterModeMixin, { tagName: "li", diff --git a/app/assets/javascripts/discourse/app/components/notification-consent-banner.js b/app/assets/javascripts/discourse/app/components/notification-consent-banner.js index e9cf6a936d..d19abc998d 100644 --- a/app/assets/javascripts/discourse/app/components/notification-consent-banner.js +++ b/app/assets/javascripts/discourse/app/components/notification-consent-banner.js @@ -1,6 +1,6 @@ +import DesktopNotificationConfig from "discourse/components/desktop-notification-config"; import discourseComputed from "discourse-common/utils/decorators"; import { keyValueStore as pushNotificationKeyValueStore } from "discourse/lib/push-notifications"; -import DesktopNotificationConfig from "discourse/components/desktop-notification-config"; const userDismissedPromptKey = "dismissed-prompt"; diff --git a/app/assets/javascripts/discourse/app/components/plugin-connector.js b/app/assets/javascripts/discourse/app/components/plugin-connector.js index 34dcb9ce4e..abf6d89f11 100644 --- a/app/assets/javascripts/discourse/app/components/plugin-connector.js +++ b/app/assets/javascripts/discourse/app/components/plugin-connector.js @@ -1,8 +1,8 @@ +import { computed, defineProperty } from "@ember/object"; import Component from "@ember/component"; -import { defineProperty, computed } from "@ember/object"; -import deprecated from "discourse-common/lib/deprecated"; -import { buildArgsWithDeprecations } from "discourse/lib/plugin-connectors"; import { afterRender } from "discourse-common/utils/decorators"; +import { buildArgsWithDeprecations } from "discourse/lib/plugin-connectors"; +import deprecated from "discourse-common/lib/deprecated"; let _decorators = {}; diff --git a/app/assets/javascripts/discourse/app/components/plugin-outlet.js b/app/assets/javascripts/discourse/app/components/plugin-outlet.js index 1fd1f402f7..410b070a1b 100644 --- a/app/assets/javascripts/discourse/app/components/plugin-outlet.js +++ b/app/assets/javascripts/discourse/app/components/plugin-outlet.js @@ -1,4 +1,7 @@ -import Component from "@ember/component"; +import { + buildArgsWithDeprecations, + renderedConnectorsFor, +} from "discourse/lib/plugin-connectors"; /** A plugin outlet is an extension point for templates where other templates can be inserted by plugins. @@ -30,10 +33,7 @@ import Component from "@ember/component"; The list of disabled plugins is returned via the `Site` singleton. **/ -import { - renderedConnectorsFor, - buildArgsWithDeprecations, -} from "discourse/lib/plugin-connectors"; +import Component from "@ember/component"; export default Component.extend({ tagName: "span", diff --git a/app/assets/javascripts/discourse/app/components/popup-input-tip.js b/app/assets/javascripts/discourse/app/components/popup-input-tip.js index f15a50c227..51d5519862 100644 --- a/app/assets/javascripts/discourse/app/components/popup-input-tip.js +++ b/app/assets/javascripts/discourse/app/components/popup-input-tip.js @@ -1,7 +1,7 @@ import { alias, not } from "@ember/object/computed"; +import discourseComputed, { observes } from "discourse-common/utils/decorators"; import Component from "@ember/component"; import { iconHTML } from "discourse-common/lib/icon-library"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; export default Component.extend({ classNameBindings: [":popup-tip", "good", "bad", "lastShownAt::hide"], diff --git a/app/assets/javascripts/discourse/app/components/preference-checkbox.js b/app/assets/javascripts/discourse/app/components/preference-checkbox.js index f38ed1f6c0..d138f58e19 100644 --- a/app/assets/javascripts/discourse/app/components/preference-checkbox.js +++ b/app/assets/javascripts/discourse/app/components/preference-checkbox.js @@ -1,6 +1,6 @@ +import Component from "@ember/component"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; -import Component from "@ember/component"; export default Component.extend({ classNames: ["controls"], diff --git a/app/assets/javascripts/discourse/app/components/pwa-install-banner.js b/app/assets/javascripts/discourse/app/components/pwa-install-banner.js index 86e91ab2b3..9f29c72cf3 100644 --- a/app/assets/javascripts/discourse/app/components/pwa-install-banner.js +++ b/app/assets/javascripts/discourse/app/components/pwa-install-banner.js @@ -1,5 +1,5 @@ -import Component from "@ember/component"; import discourseComputed, { bind, on } from "discourse-common/utils/decorators"; +import Component from "@ember/component"; const USER_DISMISSED_PROMPT_KEY = "dismissed-pwa-install-banner"; diff --git a/app/assets/javascripts/discourse/app/components/quote-button.js b/app/assets/javascripts/discourse/app/components/quote-button.js index 08b0d52ed9..6a7393775e 100644 --- a/app/assets/javascripts/discourse/app/components/quote-button.js +++ b/app/assets/javascripts/discourse/app/components/quote-button.js @@ -1,18 +1,18 @@ -import { schedule } from "@ember/runloop"; -import Component from "@ember/component"; -import discourseDebounce from "discourse/lib/debounce"; -import toMarkdown from "discourse/lib/to-markdown"; import { - selectedText, - selectedElement, postUrl, + selectedElement, + selectedText, } from "discourse/lib/utilities"; -import { getAbsoluteURL } from "discourse-common/lib/get-url"; +import Component from "@ember/component"; import { INPUT_DELAY } from "discourse-common/config/environment"; -import { action } from "@ember/object"; -import discourseComputed from "discourse-common/utils/decorators"; import Sharing from "discourse/lib/sharing"; +import { action } from "@ember/object"; import { alias } from "@ember/object/computed"; +import discourseComputed from "discourse-common/utils/decorators"; +import discourseDebounce from "discourse/lib/debounce"; +import { getAbsoluteURL } from "discourse-common/lib/get-url"; +import { schedule } from "@ember/runloop"; +import toMarkdown from "discourse/lib/to-markdown"; function getQuoteTitle(element) { const titleEl = element.querySelector(".title"); diff --git a/app/assets/javascripts/discourse/app/components/radio-button.js b/app/assets/javascripts/discourse/app/components/radio-button.js index 40a3abf07c..c7411a860a 100644 --- a/app/assets/javascripts/discourse/app/components/radio-button.js +++ b/app/assets/javascripts/discourse/app/components/radio-button.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "input", diff --git a/app/assets/javascripts/discourse/app/components/related-messages.js b/app/assets/javascripts/discourse/app/components/related-messages.js index 9d78fcee9e..daa1a058be 100644 --- a/app/assets/javascripts/discourse/app/components/related-messages.js +++ b/app/assets/javascripts/discourse/app/components/related-messages.js @@ -1,6 +1,6 @@ -import getURL from "discourse-common/lib/get-url"; -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; +import getURL from "discourse-common/lib/get-url"; export default Component.extend({ tagName: "", diff --git a/app/assets/javascripts/discourse/app/components/reviewable-bundled-action.js b/app/assets/javascripts/discourse/app/components/reviewable-bundled-action.js index 6a84b18eec..5046c027f2 100644 --- a/app/assets/javascripts/discourse/app/components/reviewable-bundled-action.js +++ b/app/assets/javascripts/discourse/app/components/reviewable-bundled-action.js @@ -1,4 +1,4 @@ -import { gt, alias } from "@ember/object/computed"; +import { alias, gt } from "@ember/object/computed"; import Component from "@ember/component"; export default Component.extend({ tagName: "", diff --git a/app/assets/javascripts/discourse/app/components/reviewable-claimed-topic.js b/app/assets/javascripts/discourse/app/components/reviewable-claimed-topic.js index 8405fc041a..b8fef00b17 100644 --- a/app/assets/javascripts/discourse/app/components/reviewable-claimed-topic.js +++ b/app/assets/javascripts/discourse/app/components/reviewable-claimed-topic.js @@ -1,7 +1,7 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import { popupAjaxError } from "discourse/lib/ajax-error"; import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Component.extend({ tagName: "", diff --git a/app/assets/javascripts/discourse/app/components/reviewable-conversation-post.js b/app/assets/javascripts/discourse/app/components/reviewable-conversation-post.js index 4cad0417be..375bac5343 100644 --- a/app/assets/javascripts/discourse/app/components/reviewable-conversation-post.js +++ b/app/assets/javascripts/discourse/app/components/reviewable-conversation-post.js @@ -1,5 +1,5 @@ -import { gte } from "@ember/object/computed"; import Component from "@ember/component"; +import { gte } from "@ember/object/computed"; export default Component.extend({ showUsername: gte("index", 1), }); diff --git a/app/assets/javascripts/discourse/app/components/reviewable-flagged-post.js b/app/assets/javascripts/discourse/app/components/reviewable-flagged-post.js index 7e57c8ed62..84c27f152f 100644 --- a/app/assets/javascripts/discourse/app/components/reviewable-flagged-post.js +++ b/app/assets/javascripts/discourse/app/components/reviewable-flagged-post.js @@ -1,8 +1,8 @@ +import Component from "@ember/component"; import discourseComputed from "discourse-common/utils/decorators"; import { gt } from "@ember/object/computed"; -import Component from "@ember/component"; -import { longDate } from "discourse/lib/formatter"; import { historyHeat } from "discourse/widgets/post-edits-indicator"; +import { longDate } from "discourse/lib/formatter"; import showModal from "discourse/lib/show-modal"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/reviewable-histories.js b/app/assets/javascripts/discourse/app/components/reviewable-histories.js index 9b7e1fb10a..b50025f33d 100644 --- a/app/assets/javascripts/discourse/app/components/reviewable-histories.js +++ b/app/assets/javascripts/discourse/app/components/reviewable-histories.js @@ -1,5 +1,5 @@ -import { filterBy } from "@ember/object/computed"; import Component from "@ember/component"; +import { filterBy } from "@ember/object/computed"; export default Component.extend({ filteredHistories: filterBy("histories", "created", false), }); diff --git a/app/assets/javascripts/discourse/app/components/reviewable-item.js b/app/assets/javascripts/discourse/app/components/reviewable-item.js index 39cfd92faa..585a54f7ff 100644 --- a/app/assets/javascripts/discourse/app/components/reviewable-item.js +++ b/app/assets/javascripts/discourse/app/components/reviewable-item.js @@ -1,14 +1,14 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import Component from "@ember/component"; -import { ajax } from "discourse/lib/ajax"; -import { popupAjaxError } from "discourse/lib/ajax-error"; import Category from "discourse/models/category"; -import optionalService from "discourse/lib/optional-service"; -import showModal from "discourse/lib/show-modal"; -import { dasherize } from "@ember/string"; -import { set } from "@ember/object"; +import Component from "@ember/component"; +import I18n from "I18n"; +import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; +import { dasherize } from "@ember/string"; +import discourseComputed from "discourse-common/utils/decorators"; +import optionalService from "discourse/lib/optional-service"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import { set } from "@ember/object"; +import showModal from "discourse/lib/show-modal"; let _components = {}; diff --git a/app/assets/javascripts/discourse/app/components/reviewable-score.js b/app/assets/javascripts/discourse/app/components/reviewable-score.js index 2cf3ba72d3..5ca9a262e7 100644 --- a/app/assets/javascripts/discourse/app/components/reviewable-score.js +++ b/app/assets/javascripts/discourse/app/components/reviewable-score.js @@ -1,6 +1,6 @@ +import Component from "@ember/component"; import discourseComputed from "discourse-common/utils/decorators"; import { gt } from "@ember/object/computed"; -import Component from "@ember/component"; export default Component.extend({ tagName: "", diff --git a/app/assets/javascripts/discourse/app/components/save-controls.js b/app/assets/javascripts/discourse/app/components/save-controls.js index b0f5f84f3e..73e0e0ba74 100644 --- a/app/assets/javascripts/discourse/app/components/save-controls.js +++ b/app/assets/javascripts/discourse/app/components/save-controls.js @@ -1,6 +1,6 @@ +import Component from "@ember/component"; import discourseComputed from "discourse-common/utils/decorators"; import { or } from "@ember/object/computed"; -import Component from "@ember/component"; export default Component.extend({ classNames: ["controls", "save-button"], diff --git a/app/assets/javascripts/discourse/app/components/scroll-tracker.js b/app/assets/javascripts/discourse/app/components/scroll-tracker.js index 7fb7b398e1..228a50d1a2 100644 --- a/app/assets/javascripts/discourse/app/components/scroll-tracker.js +++ b/app/assets/javascripts/discourse/app/components/scroll-tracker.js @@ -1,6 +1,6 @@ -import { next } from "@ember/runloop"; import Component from "@ember/component"; import Scrolling from "discourse/mixins/scrolling"; +import { next } from "@ember/runloop"; export default Component.extend(Scrolling, { didReceiveAttrs() { diff --git a/app/assets/javascripts/discourse/app/components/scrolling-post-stream.js b/app/assets/javascripts/discourse/app/components/scrolling-post-stream.js index a5bb6c089f..054a5d95a6 100644 --- a/app/assets/javascripts/discourse/app/components/scrolling-post-stream.js +++ b/app/assets/javascripts/discourse/app/components/scrolling-post-stream.js @@ -1,7 +1,7 @@ +import { cloak, uncloak } from "discourse/widgets/post-stream"; import { debounce, next, scheduleOnce } from "@ember/runloop"; import DiscourseURL from "discourse/lib/url"; import MountWidget from "discourse/components/mount-widget"; -import { cloak, uncloak } from "discourse/widgets/post-stream"; import { isWorkaroundActive } from "discourse/lib/safari-hacks"; import offsetCalculator from "discourse/lib/offset-calculator"; import { inject as service } from "@ember/service"; diff --git a/app/assets/javascripts/discourse/app/components/search-advanced-options.js b/app/assets/javascripts/discourse/app/components/search-advanced-options.js index 15aad708d0..86d11e1bf0 100644 --- a/app/assets/javascripts/discourse/app/components/search-advanced-options.js +++ b/app/assets/javascripts/discourse/app/components/search-advanced-options.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; +import Category from "discourse/models/category"; import Component from "@ember/component"; +import I18n from "I18n"; import { action } from "@ember/object"; import { escapeExpression } from "discourse/lib/utilities"; -import Category from "discourse/models/category"; const REGEXP_BLOCKS = /(([^" \t\n\x0B\f\r]+)?(("[^"]+")?))/g; diff --git a/app/assets/javascripts/discourse/app/components/search-text-field.js b/app/assets/javascripts/discourse/app/components/search-text-field.js index 2c78a6736d..f2ce629a2b 100644 --- a/app/assets/javascripts/discourse/app/components/search-text-field.js +++ b/app/assets/javascripts/discourse/app/components/search-text-field.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import discourseComputed, { on } from "discourse-common/utils/decorators"; +import I18n from "I18n"; import TextField from "discourse/components/text-field"; import { applySearchAutocomplete } from "discourse/lib/search"; diff --git a/app/assets/javascripts/discourse/app/components/second-factor-form.js b/app/assets/javascripts/discourse/app/components/second-factor-form.js index 8467026b06..3f0c40b381 100644 --- a/app/assets/javascripts/discourse/app/components/second-factor-form.js +++ b/app/assets/javascripts/discourse/app/components/second-factor-form.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import I18n from "I18n"; import { SECOND_FACTOR_METHODS } from "discourse/models/user"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ @discourseComputed("secondFactorMethod") diff --git a/app/assets/javascripts/discourse/app/components/second-factor-input.js b/app/assets/javascripts/discourse/app/components/second-factor-input.js index f1a2ac9fcd..b1da9e9d0e 100644 --- a/app/assets/javascripts/discourse/app/components/second-factor-input.js +++ b/app/assets/javascripts/discourse/app/components/second-factor-input.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; import { SECOND_FACTOR_METHODS } from "discourse/models/user"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ @discourseComputed("secondFactorMethod") diff --git a/app/assets/javascripts/discourse/app/components/share-panel.js b/app/assets/javascripts/discourse/app/components/share-panel.js index 5dc0012d12..af0fb62147 100644 --- a/app/assets/javascripts/discourse/app/components/share-panel.js +++ b/app/assets/javascripts/discourse/app/components/share-panel.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import { alias } from "@ember/object/computed"; import Component from "@ember/component"; -import { escapeExpression } from "discourse/lib/utilities"; -import discourseComputed from "discourse-common/utils/decorators"; +import I18n from "I18n"; import Sharing from "discourse/lib/sharing"; +import { alias } from "@ember/object/computed"; +import discourseComputed from "discourse-common/utils/decorators"; +import { escapeExpression } from "discourse/lib/utilities"; +import { isEmpty } from "@ember/utils"; import { later } from "@ember/runloop"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/share-popup.js b/app/assets/javascripts/discourse/app/components/share-popup.js index b62f08dc2c..3b2c3eb093 100644 --- a/app/assets/javascripts/discourse/app/components/share-popup.js +++ b/app/assets/javascripts/discourse/app/components/share-popup.js @@ -1,13 +1,13 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import { scheduleOnce, later } from "@ember/runloop"; -import Component from "@ember/component"; -import { wantsNewWindow } from "discourse/lib/intercept-click"; -import { longDateNoYear } from "discourse/lib/formatter"; import discourseComputed, { bind } from "discourse-common/utils/decorators"; +import { later, scheduleOnce } from "@ember/runloop"; +import Component from "@ember/component"; +import I18n from "I18n"; import Sharing from "discourse/lib/sharing"; -import { nativeShare } from "discourse/lib/pwa-utils"; import { alias } from "@ember/object/computed"; +import { isEmpty } from "@ember/utils"; +import { longDateNoYear } from "discourse/lib/formatter"; +import { nativeShare } from "discourse/lib/pwa-utils"; +import { wantsNewWindow } from "discourse/lib/intercept-click"; export default Component.extend({ elementId: "share-link", diff --git a/app/assets/javascripts/discourse/app/components/shared-draft-controls.js b/app/assets/javascripts/discourse/app/components/shared-draft-controls.js index 927f259d10..cc0347a41a 100644 --- a/app/assets/javascripts/discourse/app/components/shared-draft-controls.js +++ b/app/assets/javascripts/discourse/app/components/shared-draft-controls.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import I18n from "I18n"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "", diff --git a/app/assets/javascripts/discourse/app/components/signup-cta.js b/app/assets/javascripts/discourse/app/components/signup-cta.js index 6008bf3b46..944e536311 100644 --- a/app/assets/javascripts/discourse/app/components/signup-cta.js +++ b/app/assets/javascripts/discourse/app/components/signup-cta.js @@ -1,5 +1,5 @@ -import { later } from "@ember/runloop"; import Component from "@ember/component"; +import { later } from "@ember/runloop"; import { on } from "@ember/object/evented"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/site-header.js b/app/assets/javascripts/discourse/app/components/site-header.js index ffeaebadd4..b1d5146ae0 100644 --- a/app/assets/javascripts/discourse/app/components/site-header.js +++ b/app/assets/javascripts/discourse/app/components/site-header.js @@ -1,12 +1,12 @@ -import { cancel, later, schedule } from "@ember/runloop"; -import MountWidget from "discourse/components/mount-widget"; -import { observes } from "discourse-common/utils/decorators"; -import Docking from "discourse/mixins/docking"; import PanEvents, { - SWIPE_VELOCITY, SWIPE_DISTANCE_THRESHOLD, + SWIPE_VELOCITY, SWIPE_VELOCITY_THRESHOLD, } from "discourse/mixins/pan-events"; +import { cancel, later, schedule } from "@ember/runloop"; +import Docking from "discourse/mixins/docking"; +import MountWidget from "discourse/components/mount-widget"; +import { observes } from "discourse-common/utils/decorators"; import { topicTitleDecorators } from "discourse/components/topic-title"; const SiteHeaderComponent = MountWidget.extend(Docking, PanEvents, { diff --git a/app/assets/javascripts/discourse/app/components/slow-mode-info.js b/app/assets/javascripts/discourse/app/components/slow-mode-info.js index 178291630d..65fb10ebba 100644 --- a/app/assets/javascripts/discourse/app/components/slow-mode-info.js +++ b/app/assets/javascripts/discourse/app/components/slow-mode-info.js @@ -1,9 +1,9 @@ -import { durationTextFromSeconds } from "discourse/helpers/slow-mode"; import Component from "@ember/component"; -import discourseComputed from "discourse-common/utils/decorators"; import Topic from "discourse/models/topic"; -import { popupAjaxError } from "discourse/lib/ajax-error"; import { action } from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; +import { durationTextFromSeconds } from "discourse/helpers/slow-mode"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Component.extend({ @discourseComputed("topic.slow_mode_seconds") diff --git a/app/assets/javascripts/discourse/app/components/suggested-topics.js b/app/assets/javascripts/discourse/app/components/suggested-topics.js index cf34847a1b..f601c1d84d 100644 --- a/app/assets/javascripts/discourse/app/components/suggested-topics.js +++ b/app/assets/javascripts/discourse/app/components/suggested-topics.js @@ -1,10 +1,10 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import { computed, get } from "@ember/object"; import Component from "@ember/component"; -import { categoryBadgeHTML } from "discourse/helpers/category-link"; +import I18n from "I18n"; import Site from "discourse/models/site"; +import { categoryBadgeHTML } from "discourse/helpers/category-link"; +import discourseComputed from "discourse-common/utils/decorators"; +import getURL from "discourse-common/lib/get-url"; export default Component.extend({ tagName: "", diff --git a/app/assets/javascripts/discourse/app/components/table-header-toggle.js b/app/assets/javascripts/discourse/app/components/table-header-toggle.js index e94d260c86..0ab184a1e4 100644 --- a/app/assets/javascripts/discourse/app/components/table-header-toggle.js +++ b/app/assets/javascripts/discourse/app/components/table-header-toggle.js @@ -1,6 +1,6 @@ +import Component from "@ember/component"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; -import Component from "@ember/component"; import { iconHTML } from "discourse-common/lib/icon-library"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/tag-drop-link.js b/app/assets/javascripts/discourse/app/components/tag-drop-link.js index c3875ce884..8b90a3246f 100644 --- a/app/assets/javascripts/discourse/app/components/tag-drop-link.js +++ b/app/assets/javascripts/discourse/app/components/tag-drop-link.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; import DiscourseURL from "discourse/lib/url"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "a", diff --git a/app/assets/javascripts/discourse/app/components/tag-groups-form.js b/app/assets/javascripts/discourse/app/components/tag-groups-form.js index cc51816677..d9ba0fff3b 100644 --- a/app/assets/javascripts/discourse/app/components/tag-groups-form.js +++ b/app/assets/javascripts/discourse/app/components/tag-groups-form.js @@ -1,11 +1,11 @@ +import Component from "@ember/component"; +import Group from "discourse/models/group"; import I18n from "I18n"; +import PermissionType from "discourse/models/permission-type"; +import bootbox from "bootbox"; +import { bufferedProperty } from "discourse/mixins/buffered-content"; import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; -import Component from "@ember/component"; -import { bufferedProperty } from "discourse/mixins/buffered-content"; -import PermissionType from "discourse/models/permission-type"; -import Group from "discourse/models/group"; -import bootbox from "bootbox"; export default Component.extend(bufferedProperty("model"), { tagName: "", diff --git a/app/assets/javascripts/discourse/app/components/tag-info.js b/app/assets/javascripts/discourse/app/components/tag-info.js index 0aef4eedb6..5749eb283e 100644 --- a/app/assets/javascripts/discourse/app/components/tag-info.js +++ b/app/assets/javascripts/discourse/app/components/tag-info.js @@ -1,12 +1,12 @@ +import { and, reads } from "@ember/object/computed"; +import Component from "@ember/component"; import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; +import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; +import { isEmpty } from "@ember/utils"; import { popupAjaxError } from "discourse/lib/ajax-error"; import showModal from "discourse/lib/show-modal"; -import discourseComputed from "discourse-common/utils/decorators"; -import Component from "@ember/component"; -import { reads, and } from "@ember/object/computed"; -import { isEmpty } from "@ember/utils"; -import bootbox from "bootbox"; export default Component.extend({ tagName: "", diff --git a/app/assets/javascripts/discourse/app/components/tag-list.js b/app/assets/javascripts/discourse/app/components/tag-list.js index 72853d4bb7..52b3c41df3 100644 --- a/app/assets/javascripts/discourse/app/components/tag-list.js +++ b/app/assets/javascripts/discourse/app/components/tag-list.js @@ -1,8 +1,8 @@ +import Category from "discourse/models/category"; +import Component from "@ember/component"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; import { sort } from "@ember/object/computed"; -import Component from "@ember/component"; -import Category from "discourse/models/category"; export default Component.extend({ classNameBindings: [ diff --git a/app/assets/javascripts/discourse/app/components/tags-admin-dropdown.js b/app/assets/javascripts/discourse/app/components/tags-admin-dropdown.js index 0dbfc3233b..1f1da87149 100644 --- a/app/assets/javascripts/discourse/app/components/tags-admin-dropdown.js +++ b/app/assets/javascripts/discourse/app/components/tags-admin-dropdown.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; +import I18n from "I18n"; import { computed } from "@ember/object"; export default DropdownSelectBoxComponent.extend({ diff --git a/app/assets/javascripts/discourse/app/components/text-field.js b/app/assets/javascripts/discourse/app/components/text-field.js index 1a90c69340..187a1661b4 100644 --- a/app/assets/javascripts/discourse/app/components/text-field.js +++ b/app/assets/javascripts/discourse/app/components/text-field.js @@ -1,8 +1,8 @@ +import { cancel, debounce, next } from "@ember/runloop"; +import { isLTR, isRTL, siteDir } from "discourse/lib/text-direction"; import I18n from "I18n"; import TextField from "@ember/component/text-field"; import discourseComputed from "discourse-common/utils/decorators"; -import { siteDir, isRTL, isLTR } from "discourse/lib/text-direction"; -import { next, debounce, cancel } from "@ember/runloop"; const DEBOUNCE_MS = 500; diff --git a/app/assets/javascripts/discourse/app/components/time-input.js b/app/assets/javascripts/discourse/app/components/time-input.js index 0163ee1dd9..35b8c8d782 100644 --- a/app/assets/javascripts/discourse/app/components/time-input.js +++ b/app/assets/javascripts/discourse/app/components/time-input.js @@ -1,6 +1,6 @@ -import { isPresent } from "@ember/utils"; -import { computed, action } from "@ember/object"; +import { action, computed } from "@ember/object"; import Component from "@ember/component"; +import { isPresent } from "@ember/utils"; function convertMinutes(num) { return { hours: Math.floor(num / 60), minutes: num % 60 }; diff --git a/app/assets/javascripts/discourse/app/components/top-period-buttons.js b/app/assets/javascripts/discourse/app/components/top-period-buttons.js index 3ff48e71fb..f1f637385d 100644 --- a/app/assets/javascripts/discourse/app/components/top-period-buttons.js +++ b/app/assets/javascripts/discourse/app/components/top-period-buttons.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ classNames: ["top-title-buttons"], diff --git a/app/assets/javascripts/discourse/app/components/topic-entrance.js b/app/assets/javascripts/discourse/app/components/topic-entrance.js index c5cc0ca115..2b73f4de6e 100644 --- a/app/assets/javascripts/discourse/app/components/topic-entrance.js +++ b/app/assets/javascripts/discourse/app/components/topic-entrance.js @@ -1,9 +1,9 @@ +import CleansUp from "discourse/mixins/cleans-up"; +import Component from "@ember/component"; +import DiscourseURL from "discourse/lib/url"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; import { scheduleOnce } from "@ember/runloop"; -import Component from "@ember/component"; -import DiscourseURL from "discourse/lib/url"; -import CleansUp from "discourse/mixins/cleans-up"; function entranceDate(dt, showTime) { const today = new Date(); diff --git a/app/assets/javascripts/discourse/app/components/topic-footer-buttons.js b/app/assets/javascripts/discourse/app/components/topic-footer-buttons.js index 429c4ea186..270f488b6f 100644 --- a/app/assets/javascripts/discourse/app/components/topic-footer-buttons.js +++ b/app/assets/javascripts/discourse/app/components/topic-footer-buttons.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { alias, or, and } from "@ember/object/computed"; +import { alias, and, or } from "@ember/object/computed"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; import { getTopicFooterButtons } from "discourse/lib/register-topic-footer-button"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/topic-list-item.js b/app/assets/javascripts/discourse/app/components/topic-list-item.js index 59d433da15..22d67f2d00 100644 --- a/app/assets/javascripts/discourse/app/components/topic-list-item.js +++ b/app/assets/javascripts/discourse/app/components/topic-list-item.js @@ -1,13 +1,13 @@ -import I18n from "I18n"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; -import { alias } from "@ember/object/computed"; import Component from "@ember/component"; -import { schedule } from "@ember/runloop"; import DiscourseURL from "discourse/lib/url"; +import I18n from "I18n"; +import { alias } from "@ember/object/computed"; import { findRawTemplate } from "discourse-common/lib/raw-templates"; -import { wantsNewWindow } from "discourse/lib/intercept-click"; import { on } from "@ember/object/evented"; +import { schedule } from "@ember/runloop"; import { topicTitleDecorators } from "discourse/components/topic-title"; +import { wantsNewWindow } from "discourse/lib/intercept-click"; export function showEntrance(e) { let target = $(e.target); diff --git a/app/assets/javascripts/discourse/app/components/topic-list.js b/app/assets/javascripts/discourse/app/components/topic-list.js index 178fe9c82d..8c5919afe4 100644 --- a/app/assets/javascripts/discourse/app/components/topic-list.js +++ b/app/assets/javascripts/discourse/app/components/topic-list.js @@ -1,9 +1,9 @@ import { alias, reads } from "@ember/object/computed"; -import { schedule } from "@ember/runloop"; -import Component from "@ember/component"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import Component from "@ember/component"; import LoadMore from "discourse/mixins/load-more"; import { on } from "@ember/object/evented"; +import { schedule } from "@ember/runloop"; export default Component.extend(LoadMore, { tagName: "table", diff --git a/app/assets/javascripts/discourse/app/components/topic-navigation.js b/app/assets/javascripts/discourse/app/components/topic-navigation.js index 1db8312fe2..bacc74415e 100644 --- a/app/assets/javascripts/discourse/app/components/topic-navigation.js +++ b/app/assets/javascripts/discourse/app/components/topic-navigation.js @@ -1,13 +1,13 @@ -import EmberObject from "@ember/object"; -import { debounce, later } from "@ember/runloop"; -import Component from "@ember/component"; -import { observes } from "discourse-common/utils/decorators"; -import showModal from "discourse/lib/show-modal"; import PanEvents, { - SWIPE_VELOCITY, SWIPE_DISTANCE_THRESHOLD, + SWIPE_VELOCITY, SWIPE_VELOCITY_THRESHOLD, } from "discourse/mixins/pan-events"; +import { debounce, later } from "@ember/runloop"; +import Component from "@ember/component"; +import EmberObject from "@ember/object"; +import { observes } from "discourse-common/utils/decorators"; +import showModal from "discourse/lib/show-modal"; const MIN_WIDTH_TIMELINE = 924, MIN_HEIGHT_TIMELINE = 325; diff --git a/app/assets/javascripts/discourse/app/components/topic-post-badges.js b/app/assets/javascripts/discourse/app/components/topic-post-badges.js index 3efeaeee2d..78600182a1 100644 --- a/app/assets/javascripts/discourse/app/components/topic-post-badges.js +++ b/app/assets/javascripts/discourse/app/components/topic-post-badges.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import Component from "@ember/component"; +import I18n from "I18n"; export default Component.extend({ tagName: "span", diff --git a/app/assets/javascripts/discourse/app/components/topic-progress.js b/app/assets/javascripts/discourse/app/components/topic-progress.js index 1fa674c713..56f17df089 100644 --- a/app/assets/javascripts/discourse/app/components/topic-progress.js +++ b/app/assets/javascripts/discourse/app/components/topic-progress.js @@ -1,8 +1,8 @@ +import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import Component from "@ember/component"; import I18n from "I18n"; import { alias } from "@ember/object/computed"; import { scheduleOnce } from "@ember/runloop"; -import Component from "@ember/component"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; export default Component.extend({ elementId: "topic-progress-wrapper", diff --git a/app/assets/javascripts/discourse/app/components/topic-status.js b/app/assets/javascripts/discourse/app/components/topic-status.js index 9ff136b192..a370849c8c 100644 --- a/app/assets/javascripts/discourse/app/components/topic-status.js +++ b/app/assets/javascripts/discourse/app/components/topic-status.js @@ -1,6 +1,6 @@ +import Component from "@ember/component"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; -import Component from "@ember/component"; import { iconHTML } from "discourse-common/lib/icon-library"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/topic-timeline.js b/app/assets/javascripts/discourse/app/components/topic-timeline.js index e10377c30e..09fbfcd78a 100644 --- a/app/assets/javascripts/discourse/app/components/topic-timeline.js +++ b/app/assets/javascripts/discourse/app/components/topic-timeline.js @@ -1,6 +1,6 @@ -import { next } from "@ember/runloop"; -import MountWidget from "discourse/components/mount-widget"; import Docking from "discourse/mixins/docking"; +import MountWidget from "discourse/components/mount-widget"; +import { next } from "@ember/runloop"; import { observes } from "discourse-common/utils/decorators"; import optionalService from "discourse/lib/optional-service"; import outletHeights from "discourse/lib/header-outlet-height"; diff --git a/app/assets/javascripts/discourse/app/components/topic-timer-info.js b/app/assets/javascripts/discourse/app/components/topic-timer-info.js index da3ce4e7e2..146ca10b2d 100644 --- a/app/assets/javascripts/discourse/app/components/topic-timer-info.js +++ b/app/assets/javascripts/discourse/app/components/topic-timer-info.js @@ -1,10 +1,10 @@ +import { cancel, later } from "@ember/runloop"; +import Category from "discourse/models/category"; +import Component from "@ember/component"; +import { DELETE_REPLIES_TYPE } from "discourse/controllers/edit-topic-timer"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; -import { cancel, later } from "@ember/runloop"; -import Component from "@ember/component"; import { iconHTML } from "discourse-common/lib/icon-library"; -import Category from "discourse/models/category"; -import { DELETE_REPLIES_TYPE } from "discourse/controllers/edit-topic-timer"; import { isTesting } from "discourse-common/config/environment"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/user-badge.js b/app/assets/javascripts/discourse/app/components/user-badge.js index f2647da215..201fa55021 100644 --- a/app/assets/javascripts/discourse/app/components/user-badge.js +++ b/app/assets/javascripts/discourse/app/components/user-badge.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "span", diff --git a/app/assets/javascripts/discourse/app/components/user-card-contents.js b/app/assets/javascripts/discourse/app/components/user-card-contents.js index 93001a1299..6c128fd2b6 100644 --- a/app/assets/javascripts/discourse/app/components/user-card-contents.js +++ b/app/assets/javascripts/discourse/app/components/user-card-contents.js @@ -1,16 +1,16 @@ -import { getURLWithCDN } from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import { alias, gte, and, gt, not, or } from "@ember/object/computed"; import EmberObject, { set } from "@ember/object"; -import Component from "@ember/component"; +import { alias, and, gt, gte, not, or } from "@ember/object/computed"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; -import User from "discourse/models/user"; import { propertyNotEqual, setting } from "discourse/lib/computed"; -import { durationTiny } from "discourse/lib/formatter"; import CanCheckEmails from "discourse/mixins/can-check-emails"; import CardContentsBase from "discourse/mixins/card-contents-base"; import CleansUp from "discourse/mixins/cleans-up"; +import Component from "@ember/component"; +import I18n from "I18n"; +import User from "discourse/models/user"; +import { durationTiny } from "discourse/lib/formatter"; +import { getURLWithCDN } from "discourse-common/lib/get-url"; +import { isEmpty } from "@ember/utils"; import { prioritizeNameInUx } from "discourse/lib/settings"; export default Component.extend(CardContentsBase, CanCheckEmails, CleansUp, { diff --git a/app/assets/javascripts/discourse/app/components/user-field.js b/app/assets/javascripts/discourse/app/components/user-field.js index 08db97b9cb..aedfa0de48 100644 --- a/app/assets/javascripts/discourse/app/components/user-field.js +++ b/app/assets/javascripts/discourse/app/components/user-field.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; import { fmt } from "discourse/lib/computed"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/app/components/user-flag-percentage.js b/app/assets/javascripts/discourse/app/components/user-flag-percentage.js index 71525ea57f..a5f19d13e0 100644 --- a/app/assets/javascripts/discourse/app/components/user-flag-percentage.js +++ b/app/assets/javascripts/discourse/app/components/user-flag-percentage.js @@ -1,6 +1,6 @@ +import Component from "@ember/component"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; -import Component from "@ember/component"; export default Component.extend({ tagName: "", diff --git a/app/assets/javascripts/discourse/app/components/user-info.js b/app/assets/javascripts/discourse/app/components/user-info.js index 051d8a3b0b..a16b8875a4 100644 --- a/app/assets/javascripts/discourse/app/components/user-info.js +++ b/app/assets/javascripts/discourse/app/components/user-info.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { alias } from "@ember/object/computed"; import Component from "@ember/component"; +import { alias } from "@ember/object/computed"; +import discourseComputed from "discourse-common/utils/decorators"; import { userPath } from "discourse/lib/url"; export function normalize(name) { diff --git a/app/assets/javascripts/discourse/app/components/user-link.js b/app/assets/javascripts/discourse/app/components/user-link.js index 71737d6235..fc3978a50b 100644 --- a/app/assets/javascripts/discourse/app/components/user-link.js +++ b/app/assets/javascripts/discourse/app/components/user-link.js @@ -1,5 +1,5 @@ -import { alias } from "@ember/object/computed"; import Component from "@ember/component"; +import { alias } from "@ember/object/computed"; export default Component.extend({ tagName: "a", attributeBindings: ["href", "data-user-card"], diff --git a/app/assets/javascripts/discourse/app/components/user-selector.js b/app/assets/javascripts/discourse/app/components/user-selector.js index b47aff691c..6b9bb6a19a 100644 --- a/app/assets/javascripts/discourse/app/components/user-selector.js +++ b/app/assets/javascripts/discourse/app/components/user-selector.js @@ -1,8 +1,8 @@ -import { isEmpty } from "@ember/utils"; -import { bind, on, observes } from "discourse-common/utils/decorators"; +import { bind, observes, on } from "discourse-common/utils/decorators"; import TextField from "discourse/components/text-field"; -import userSearch from "discourse/lib/user-search"; import { findRawTemplate } from "discourse-common/lib/raw-templates"; +import { isEmpty } from "@ember/utils"; +import userSearch from "discourse/lib/user-search"; export default TextField.extend({ autocorrect: false, diff --git a/app/assets/javascripts/discourse/app/components/user-stat.js b/app/assets/javascripts/discourse/app/components/user-stat.js index 61003fa8c5..bc33c00a5d 100644 --- a/app/assets/javascripts/discourse/app/components/user-stat.js +++ b/app/assets/javascripts/discourse/app/components/user-stat.js @@ -1,5 +1,5 @@ -import { equal } from "@ember/object/computed"; import Component from "@ember/component"; +import { equal } from "@ember/object/computed"; export default Component.extend({ classNames: ["user-stat"], type: "number", diff --git a/app/assets/javascripts/discourse/app/components/user-stream-item.js b/app/assets/javascripts/discourse/app/components/user-stream-item.js index cb6b3a5a51..b80903845c 100644 --- a/app/assets/javascripts/discourse/app/components/user-stream-item.js +++ b/app/assets/javascripts/discourse/app/components/user-stream-item.js @@ -1,7 +1,7 @@ import Component from "@ember/component"; -import { propertyEqual } from "discourse/lib/computed"; -import { computed } from "@ember/object"; import { actionDescription } from "discourse/widgets/post-small-action"; +import { computed } from "@ember/object"; +import { propertyEqual } from "discourse/lib/computed"; export default Component.extend({ classNameBindings: [ diff --git a/app/assets/javascripts/discourse/app/components/user-stream.js b/app/assets/javascripts/discourse/app/components/user-stream.js index 72a0b533f3..b57117e88f 100644 --- a/app/assets/javascripts/discourse/app/components/user-stream.js +++ b/app/assets/javascripts/discourse/app/components/user-stream.js @@ -1,16 +1,16 @@ -import I18n from "I18n"; -import { schedule } from "@ember/runloop"; -import Component from "@ember/component"; -import LoadMore from "discourse/mixins/load-more"; import ClickTrack from "discourse/lib/click-track"; -import Post from "discourse/models/post"; +import Component from "@ember/component"; import DiscourseURL from "discourse/lib/url"; import Draft from "discourse/models/draft"; -import { popupAjaxError } from "discourse/lib/ajax-error"; +import I18n from "I18n"; +import LoadMore from "discourse/mixins/load-more"; +import Post from "discourse/models/post"; +import bootbox from "bootbox"; import { getOwner } from "discourse-common/lib/get-owner"; import { observes } from "discourse-common/utils/decorators"; import { on } from "@ember/object/evented"; -import bootbox from "bootbox"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import { schedule } from "@ember/runloop"; export default Component.extend(LoadMore, { _initialize: on("init", function () { diff --git a/app/assets/javascripts/discourse/app/components/user-summary-category-search.js b/app/assets/javascripts/discourse/app/components/user-summary-category-search.js index 3a5441ff6b..35c21644e9 100644 --- a/app/assets/javascripts/discourse/app/components/user-summary-category-search.js +++ b/app/assets/javascripts/discourse/app/components/user-summary-category-search.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "", diff --git a/app/assets/javascripts/discourse/app/components/user-summary-topics-list.js b/app/assets/javascripts/discourse/app/components/user-summary-topics-list.js index 18fc5e896a..f02063e03a 100644 --- a/app/assets/javascripts/discourse/app/components/user-summary-topics-list.js +++ b/app/assets/javascripts/discourse/app/components/user-summary-topics-list.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; // should be kept in sync with 'UserSummary::MAX_SUMMARY_RESULTS' const MAX_SUMMARY_RESULTS = 6; diff --git a/app/assets/javascripts/discourse/app/controllers/about.js b/app/assets/javascripts/discourse/app/controllers/about.js index 9e05f5e9f9..26f3761bfd 100644 --- a/app/assets/javascripts/discourse/app/controllers/about.js +++ b/app/assets/javascripts/discourse/app/controllers/about.js @@ -1,7 +1,7 @@ +import Controller from "@ember/controller"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; import { gt } from "@ember/object/computed"; -import Controller from "@ember/controller"; export default Controller.extend({ faqOverriden: gt("siteSettings.faq_url.length", 0), diff --git a/app/assets/javascripts/discourse/app/controllers/account-created-edit-email.js b/app/assets/javascripts/discourse/app/controllers/account-created-edit-email.js index 04c1dc7499..c3a20cc06d 100644 --- a/app/assets/javascripts/discourse/app/controllers/account-created-edit-email.js +++ b/app/assets/javascripts/discourse/app/controllers/account-created-edit-email.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; import { changeEmail } from "discourse/lib/user-activation"; +import discourseComputed from "discourse-common/utils/decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ diff --git a/app/assets/javascripts/discourse/app/controllers/activation-edit.js b/app/assets/javascripts/discourse/app/controllers/activation-edit.js index 29620f3c14..ee57b1b1fd 100644 --- a/app/assets/javascripts/discourse/app/controllers/activation-edit.js +++ b/app/assets/javascripts/discourse/app/controllers/activation-edit.js @@ -1,8 +1,8 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Controller, { inject as controller } from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; -import { extractError } from "discourse/lib/ajax-error"; import { changeEmail } from "discourse/lib/user-activation"; +import discourseComputed from "discourse-common/utils/decorators"; +import { extractError } from "discourse/lib/ajax-error"; export default Controller.extend(ModalFunctionality, { login: controller(), diff --git a/app/assets/javascripts/discourse/app/controllers/application.js b/app/assets/javascripts/discourse/app/controllers/application.js index fb6b103bcb..e8615d2f94 100644 --- a/app/assets/javascripts/discourse/app/controllers/application.js +++ b/app/assets/javascripts/discourse/app/controllers/application.js @@ -1,7 +1,7 @@ +import { isAppWebview, isiOSPWA } from "discourse/lib/utilities"; +import Controller from "@ember/controller"; import discourseComputed from "discourse-common/utils/decorators"; import { inject as service } from "@ember/service"; -import Controller from "@ember/controller"; -import { isAppWebview, isiOSPWA } from "discourse/lib/utilities"; export default Controller.extend({ showTop: true, diff --git a/app/assets/javascripts/discourse/app/controllers/associate-account-confirm.js b/app/assets/javascripts/discourse/app/controllers/associate-account-confirm.js index b817ae4324..6afae9f1d7 100644 --- a/app/assets/javascripts/discourse/app/controllers/associate-account-confirm.js +++ b/app/assets/javascripts/discourse/app/controllers/associate-account-confirm.js @@ -1,7 +1,7 @@ import Controller from "@ember/controller"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; import { ajax } from "discourse/lib/ajax"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; export default Controller.extend(ModalFunctionality, { actions: { diff --git a/app/assets/javascripts/discourse/app/controllers/auth-token.js b/app/assets/javascripts/discourse/app/controllers/auth-token.js index 6637ea3b1a..2d8c91157a 100644 --- a/app/assets/javascripts/discourse/app/controllers/auth-token.js +++ b/app/assets/javascripts/discourse/app/controllers/auth-token.js @@ -1,7 +1,7 @@ -import { next } from "@ember/runloop"; import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { ajax } from "discourse/lib/ajax"; +import { next } from "@ember/runloop"; import { userPath } from "discourse/lib/url"; export default Controller.extend(ModalFunctionality, { diff --git a/app/assets/javascripts/discourse/app/controllers/avatar-selector.js b/app/assets/javascripts/discourse/app/controllers/avatar-selector.js index 099919cbce..a7d7e2cf24 100644 --- a/app/assets/javascripts/discourse/app/controllers/avatar-selector.js +++ b/app/assets/javascripts/discourse/app/controllers/avatar-selector.js @@ -1,8 +1,8 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { ajax } from "discourse/lib/ajax"; import { allowsImages } from "discourse/lib/uploads"; +import discourseComputed from "discourse-common/utils/decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { setting } from "discourse/lib/computed"; diff --git a/app/assets/javascripts/discourse/app/controllers/badges/index.js b/app/assets/javascripts/discourse/app/controllers/badges/index.js index f685625408..265b5cd3e6 100644 --- a/app/assets/javascripts/discourse/app/controllers/badges/index.js +++ b/app/assets/javascripts/discourse/app/controllers/badges/index.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; +import discourseComputed from "discourse-common/utils/decorators"; function badgeKey(badge) { let pos = badge.get("badge_grouping.position"); diff --git a/app/assets/javascripts/discourse/app/controllers/badges/show.js b/app/assets/javascripts/discourse/app/controllers/badges/show.js index ae33c40c81..4cab9625da 100644 --- a/app/assets/javascripts/discourse/app/controllers/badges/show.js +++ b/app/assets/javascripts/discourse/app/controllers/badges/show.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; import Controller, { inject as controller } from "@ember/controller"; -import EmberObject from "@ember/object"; -import Badge from "discourse/models/badge"; -import UserBadge from "discourse/models/user-badge"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import Badge from "discourse/models/badge"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; +import UserBadge from "discourse/models/user-badge"; export default Controller.extend({ application: controller(), diff --git a/app/assets/javascripts/discourse/app/controllers/bookmark.js b/app/assets/javascripts/discourse/app/controllers/bookmark.js index 0eb85d6195..e53617d511 100644 --- a/app/assets/javascripts/discourse/app/controllers/bookmark.js +++ b/app/assets/javascripts/discourse/app/controllers/bookmark.js @@ -1,18 +1,18 @@ -import I18n from "I18n"; -import { schedule, next } from "@ember/runloop"; +import { REMINDER_TYPES, formattedReminderTime } from "discourse/lib/bookmark"; import { and, or } from "@ember/object/computed"; -import { action } from "@ember/object"; -import { isPresent, isEmpty } from "@ember/utils"; +import { isEmpty, isPresent } from "@ember/utils"; +import { next, schedule } from "@ember/runloop"; +import { AUTO_DELETE_PREFERENCES } from "discourse/models/bookmark"; import Controller from "@ember/controller"; -import { Promise } from "rsvp"; +import I18n from "I18n"; +import KeyboardShortcuts from "discourse/lib/keyboard-shortcuts"; import ModalFunctionality from "discourse/mixins/modal-functionality"; +import { Promise } from "rsvp"; +import { action } from "@ember/object"; +import { ajax } from "discourse/lib/ajax"; +import bootbox from "bootbox"; import discourseComputed from "discourse-common/utils/decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import { ajax } from "discourse/lib/ajax"; -import KeyboardShortcuts from "discourse/lib/keyboard-shortcuts"; -import { formattedReminderTime, REMINDER_TYPES } from "discourse/lib/bookmark"; -import { AUTO_DELETE_PREFERENCES } from "discourse/models/bookmark"; -import bootbox from "bootbox"; // global shortcuts that interfere with these modal shortcuts, they are rebound when the // modal is closed diff --git a/app/assets/javascripts/discourse/app/controllers/bulk-notification-level.js b/app/assets/javascripts/discourse/app/controllers/bulk-notification-level.js index 70808d469c..0a8655986f 100644 --- a/app/assets/javascripts/discourse/app/controllers/bulk-notification-level.js +++ b/app/assets/javascripts/discourse/app/controllers/bulk-notification-level.js @@ -1,7 +1,7 @@ +import Controller, { inject as controller } from "@ember/controller"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; import { empty } from "@ember/object/computed"; -import Controller, { inject as controller } from "@ember/controller"; import { topicLevels } from "discourse/lib/notification-levels"; // Support for changing the notification level of various topics diff --git a/app/assets/javascripts/discourse/app/controllers/change-owner.js b/app/assets/javascripts/discourse/app/controllers/change-owner.js index df39e86c95..d2e30c31c3 100644 --- a/app/assets/javascripts/discourse/app/controllers/change-owner.js +++ b/app/assets/javascripts/discourse/app/controllers/change-owner.js @@ -1,12 +1,12 @@ +import Controller, { inject } from "@ember/controller"; +import DiscourseURL from "discourse/lib/url"; import I18n from "I18n"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; +import Topic from "discourse/models/topic"; +import { alias } from "@ember/object/computed"; import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; -import { alias } from "@ember/object/computed"; import { next } from "@ember/runloop"; -import Controller, { inject } from "@ember/controller"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; -import DiscourseURL from "discourse/lib/url"; -import Topic from "discourse/models/topic"; export default Controller.extend(ModalFunctionality, { topicController: inject("topic"), diff --git a/app/assets/javascripts/discourse/app/controllers/change-post-notice.js b/app/assets/javascripts/discourse/app/controllers/change-post-notice.js index b8bfbdfa6a..ffcbbaa175 100644 --- a/app/assets/javascripts/discourse/app/controllers/change-post-notice.js +++ b/app/assets/javascripts/discourse/app/controllers/change-post-notice.js @@ -1,9 +1,9 @@ import Controller from "@ember/controller"; -import { action } from "@ember/object"; -import { isEmpty } from "@ember/utils"; -import discourseComputed from "discourse-common/utils/decorators"; -import { cookAsync } from "discourse/lib/text"; import ModalFunctionality from "discourse/mixins/modal-functionality"; +import { action } from "@ember/object"; +import { cookAsync } from "discourse/lib/text"; +import discourseComputed from "discourse-common/utils/decorators"; +import { isEmpty } from "@ember/utils"; export default Controller.extend(ModalFunctionality, { post: null, diff --git a/app/assets/javascripts/discourse/app/controllers/change-timestamp.js b/app/assets/javascripts/discourse/app/controllers/change-timestamp.js index acc39aef15..8e41d3aa04 100644 --- a/app/assets/javascripts/discourse/app/controllers/change-timestamp.js +++ b/app/assets/javascripts/discourse/app/controllers/change-timestamp.js @@ -1,11 +1,11 @@ +import Controller, { inject } from "@ember/controller"; +import DiscourseURL from "discourse/lib/url"; import I18n from "I18n"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; +import Topic from "discourse/models/topic"; import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import { next } from "@ember/runloop"; -import Controller, { inject } from "@ember/controller"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; -import DiscourseURL from "discourse/lib/url"; -import Topic from "discourse/models/topic"; // Modal related to changing the timestamp of posts export default Controller.extend(ModalFunctionality, { diff --git a/app/assets/javascripts/discourse/app/controllers/composer.js b/app/assets/javascripts/discourse/app/controllers/composer.js index 7feb149ddb..9cb9d444f4 100644 --- a/app/assets/javascripts/discourse/app/controllers/composer.js +++ b/app/assets/javascripts/discourse/app/controllers/composer.js @@ -1,36 +1,36 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import { and, or, alias, reads } from "@ember/object/computed"; -import { cancel, debounce, run } from "@ember/runloop"; -import { inject as service } from "@ember/service"; +import Composer, { SAVE_ICONS, SAVE_LABELS } from "discourse/models/composer"; import Controller, { inject } from "@ember/controller"; -import DiscourseURL from "discourse/lib/url"; -import { buildQuote } from "discourse/lib/quote"; -import Draft from "discourse/models/draft"; -import discourseComputed, { - observes, - on, -} from "discourse-common/utils/decorators"; -import { getOwner } from "discourse-common/lib/get-owner"; -import { escapeExpression } from "discourse/lib/utilities"; +import EmberObject, { action, computed } from "@ember/object"; +import { alias, and, or, reads } from "@ember/object/computed"; import { authorizesOneOrMoreExtensions, uploadIcon, } from "discourse/lib/uploads"; -import { emojiUnescape } from "discourse/lib/text"; -import { shortDate } from "discourse/lib/formatter"; -import Composer, { SAVE_LABELS, SAVE_ICONS } from "discourse/models/composer"; -import { Promise } from "rsvp"; -import { isTesting } from "discourse-common/config/environment"; -import EmberObject, { computed, action } from "@ember/object"; -import deprecated from "discourse-common/lib/deprecated"; -import bootbox from "bootbox"; -import showModal from "discourse/lib/show-modal"; +import { cancel, debounce, run } from "@ember/runloop"; import { cannotPostAgain, durationTextFromSeconds, } from "discourse/helpers/slow-mode"; +import discourseComputed, { + observes, + on, +} from "discourse-common/utils/decorators"; +import DiscourseURL from "discourse/lib/url"; +import Draft from "discourse/models/draft"; +import I18n from "I18n"; +import { Promise } from "rsvp"; +import bootbox from "bootbox"; +import { buildQuote } from "discourse/lib/quote"; +import deprecated from "discourse-common/lib/deprecated"; +import { emojiUnescape } from "discourse/lib/text"; +import { escapeExpression } from "discourse/lib/utilities"; +import { getOwner } from "discourse-common/lib/get-owner"; +import getURL from "discourse-common/lib/get-url"; +import { isEmpty } from "@ember/utils"; +import { isTesting } from "discourse-common/config/environment"; +import { inject as service } from "@ember/service"; +import { shortDate } from "discourse/lib/formatter"; +import showModal from "discourse/lib/show-modal"; function loadDraft(store, opts) { let promise = Promise.resolve(); diff --git a/app/assets/javascripts/discourse/app/controllers/convert-to-public-topic.js b/app/assets/javascripts/discourse/app/controllers/convert-to-public-topic.js index ba53b1a54b..4fb7c1eee7 100644 --- a/app/assets/javascripts/discourse/app/controllers/convert-to-public-topic.js +++ b/app/assets/javascripts/discourse/app/controllers/convert-to-public-topic.js @@ -1,6 +1,6 @@ import Controller from "@ember/controller"; -import { popupAjaxError } from "discourse/lib/ajax-error"; import ModalFunctionality from "discourse/mixins/modal-functionality"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend(ModalFunctionality, { publicCategoryId: null, diff --git a/app/assets/javascripts/discourse/app/controllers/create-account.js b/app/assets/javascripts/discourse/app/controllers/create-account.js index d0976f6104..fce8b5e08a 100644 --- a/app/assets/javascripts/discourse/app/controllers/create-account.js +++ b/app/assets/javascripts/discourse/app/controllers/create-account.js @@ -1,27 +1,27 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import { A } from "@ember/array"; -import { isEmpty } from "@ember/utils"; -import { notEmpty } from "@ember/object/computed"; import Controller, { inject as controller } from "@ember/controller"; -import { ajax } from "discourse/lib/ajax"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; -import { setting } from "discourse/lib/computed"; +import cookie, { removeCookie } from "discourse/lib/cookie"; import discourseComputed, { observes, on, } from "discourse-common/utils/decorators"; -import { emailValid } from "discourse/lib/utilities"; -import PasswordValidation from "discourse/mixins/password-validation"; -import UsernameValidation from "discourse/mixins/username-validation"; -import NameValidation from "discourse/mixins/name-validation"; -import UserFieldsValidation from "discourse/mixins/user-fields-validation"; -import { userPath } from "discourse/lib/url"; -import { findAll } from "discourse/models/login-method"; +import { A } from "@ember/array"; import EmberObject from "@ember/object"; -import User from "discourse/models/user"; +import I18n from "I18n"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; +import NameValidation from "discourse/mixins/name-validation"; +import PasswordValidation from "discourse/mixins/password-validation"; import { Promise } from "rsvp"; -import cookie, { removeCookie } from "discourse/lib/cookie"; +import User from "discourse/models/user"; +import UserFieldsValidation from "discourse/mixins/user-fields-validation"; +import UsernameValidation from "discourse/mixins/username-validation"; +import { ajax } from "discourse/lib/ajax"; +import { emailValid } from "discourse/lib/utilities"; +import { findAll } from "discourse/models/login-method"; +import getURL from "discourse-common/lib/get-url"; +import { isEmpty } from "@ember/utils"; +import { notEmpty } from "@ember/object/computed"; +import { setting } from "discourse/lib/computed"; +import { userPath } from "discourse/lib/url"; export default Controller.extend( ModalFunctionality, diff --git a/app/assets/javascripts/discourse/app/controllers/delete-topic-confirm.js b/app/assets/javascripts/discourse/app/controllers/delete-topic-confirm.js index f3e06c43f3..fb8de28430 100644 --- a/app/assets/javascripts/discourse/app/controllers/delete-topic-confirm.js +++ b/app/assets/javascripts/discourse/app/controllers/delete-topic-confirm.js @@ -1,8 +1,8 @@ +import Controller, { inject } from "@ember/controller"; import I18n from "I18n"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; import { action } from "@ember/object"; import discourseComputed from "discourse-common/utils/decorators"; -import Controller, { inject } from "@ember/controller"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; // Modal that displays confirmation text when user deletes a topic // The modal will display only if the topic exceeds a certain amount of views diff --git a/app/assets/javascripts/discourse/app/controllers/discovery.js b/app/assets/javascripts/discourse/app/controllers/discovery.js index c50bca76d3..9f2993a6ae 100644 --- a/app/assets/javascripts/discourse/app/controllers/discovery.js +++ b/app/assets/javascripts/discourse/app/controllers/discovery.js @@ -1,7 +1,7 @@ -import { alias, not, equal } from "@ember/object/computed"; import Controller, { inject as controller } from "@ember/controller"; -import DiscourseURL from "discourse/lib/url"; +import { alias, equal, not } from "@ember/object/computed"; import Category from "discourse/models/category"; +import DiscourseURL from "discourse/lib/url"; import { observes } from "discourse-common/utils/decorators"; import { inject as service } from "@ember/service"; diff --git a/app/assets/javascripts/discourse/app/controllers/discovery/categories.js b/app/assets/javascripts/discourse/app/controllers/discovery/categories.js index a213a32efb..01879ddc2e 100644 --- a/app/assets/javascripts/discourse/app/controllers/discovery/categories.js +++ b/app/assets/javascripts/discourse/app/controllers/discovery/categories.js @@ -1,8 +1,8 @@ +import DiscoveryController from "discourse/controllers/discovery"; +import { inject as controller } from "@ember/controller"; +import { dasherize } from "@ember/string"; import discourseComputed from "discourse-common/utils/decorators"; import { reads } from "@ember/object/computed"; -import { inject as controller } from "@ember/controller"; -import DiscoveryController from "discourse/controllers/discovery"; -import { dasherize } from "@ember/string"; const subcategoryStyleComponentNames = { rows: "categories_only", diff --git a/app/assets/javascripts/discourse/app/controllers/discovery/topics.js b/app/assets/javascripts/discourse/app/controllers/discovery/topics.js index 679ada3505..6e33eb20fc 100644 --- a/app/assets/javascripts/discourse/app/controllers/discovery/topics.js +++ b/app/assets/javascripts/discourse/app/controllers/discovery/topics.js @@ -1,25 +1,25 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import { alias, - not, - gt, empty, - notEmpty, equal, + gt, + not, + notEmpty, readOnly, } from "@ember/object/computed"; -import { inject as controller } from "@ember/controller"; -import DiscoveryController from "discourse/controllers/discovery"; import BulkTopicSelection from "discourse/mixins/bulk-topic-selection"; -import { endWith } from "discourse/lib/computed"; -import showModal from "discourse/lib/show-modal"; -import { userPath } from "discourse/lib/url"; -import TopicList from "discourse/models/topic-list"; +import DiscoveryController from "discourse/controllers/discovery"; +import I18n from "I18n"; import Topic from "discourse/models/topic"; +import TopicList from "discourse/models/topic-list"; +import { inject as controller } from "@ember/controller"; +import deprecated from "discourse-common/lib/deprecated"; +import discourseComputed from "discourse-common/utils/decorators"; +import { endWith } from "discourse/lib/computed"; import { routeAction } from "discourse/helpers/route-action"; import { inject as service } from "@ember/service"; -import deprecated from "discourse-common/lib/deprecated"; +import showModal from "discourse/lib/show-modal"; +import { userPath } from "discourse/lib/url"; const controllerOpts = { discovery: controller(), diff --git a/app/assets/javascripts/discourse/app/controllers/edit-category-tabs.js b/app/assets/javascripts/discourse/app/controllers/edit-category-tabs.js index cff351a23a..6a3f6ea50a 100644 --- a/app/assets/javascripts/discourse/app/controllers/edit-category-tabs.js +++ b/app/assets/javascripts/discourse/app/controllers/edit-category-tabs.js @@ -1,12 +1,12 @@ -import I18n from "I18n"; -import Controller from "@ember/controller"; import discourseComputed, { on } from "discourse-common/utils/decorators"; +import Controller from "@ember/controller"; +import DiscourseURL from "discourse/lib/url"; +import I18n from "I18n"; +import { NotificationLevels } from "discourse/lib/notification-levels"; +import PermissionType from "discourse/models/permission-type"; import bootbox from "bootbox"; import { extractError } from "discourse/lib/ajax-error"; -import DiscourseURL from "discourse/lib/url"; import { readOnly } from "@ember/object/computed"; -import PermissionType from "discourse/models/permission-type"; -import { NotificationLevels } from "discourse/lib/notification-levels"; import { underscore } from "@ember/string"; export default Controller.extend({ diff --git a/app/assets/javascripts/discourse/app/controllers/edit-slow-mode.js b/app/assets/javascripts/discourse/app/controllers/edit-slow-mode.js index 4cf17bf239..e76573617f 100644 --- a/app/assets/javascripts/discourse/app/controllers/edit-slow-mode.js +++ b/app/assets/javascripts/discourse/app/controllers/edit-slow-mode.js @@ -1,12 +1,12 @@ -import Controller from "@ember/controller"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; -import discourseComputed from "discourse-common/utils/decorators"; -import I18n from "I18n"; -import Topic from "discourse/models/topic"; import { fromSeconds, toSeconds } from "discourse/helpers/slow-mode"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import { equal } from "@ember/object/computed"; +import Controller from "@ember/controller"; +import I18n from "I18n"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; +import Topic from "discourse/models/topic"; import { action } from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; +import { equal } from "@ember/object/computed"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend(ModalFunctionality, { selectedSlowMode: null, diff --git a/app/assets/javascripts/discourse/app/controllers/edit-topic-timer.js b/app/assets/javascripts/discourse/app/controllers/edit-topic-timer.js index 784a6d0705..64a8c1c4f3 100644 --- a/app/assets/javascripts/discourse/app/controllers/edit-topic-timer.js +++ b/app/assets/javascripts/discourse/app/controllers/edit-topic-timer.js @@ -1,12 +1,12 @@ -import I18n from "I18n"; -import { alias } from "@ember/object/computed"; import EmberObject, { setProperties } from "@ember/object"; import Controller from "@ember/controller"; -import discourseComputed from "discourse-common/utils/decorators"; +import { FORMAT } from "select-kit/components/future-date-input-selector"; +import I18n from "I18n"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import TopicTimer from "discourse/models/topic-timer"; +import { alias } from "@ember/object/computed"; +import discourseComputed from "discourse-common/utils/decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import { FORMAT } from "select-kit/components/future-date-input-selector"; export const CLOSE_STATUS_TYPE = "close"; export const OPEN_STATUS_TYPE = "open"; diff --git a/app/assets/javascripts/discourse/app/controllers/email-login.js b/app/assets/javascripts/discourse/app/controllers/email-login.js index 575110d295..166f9fd8c3 100644 --- a/app/assets/javascripts/discourse/app/controllers/email-login.js +++ b/app/assets/javascripts/discourse/app/controllers/email-login.js @@ -1,11 +1,11 @@ -import getURL from "discourse-common/lib/get-url"; -import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; +import DiscourseURL from "discourse/lib/url"; import { SECOND_FACTOR_METHODS } from "discourse/models/user"; import { ajax } from "discourse/lib/ajax"; -import DiscourseURL from "discourse/lib/url"; -import { popupAjaxError } from "discourse/lib/ajax-error"; +import discourseComputed from "discourse-common/utils/decorators"; +import getURL from "discourse-common/lib/get-url"; import { getWebauthnCredential } from "discourse/lib/webauthn"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ lockImageUrl: getURL("/images/lock.svg"), diff --git a/app/assets/javascripts/discourse/app/controllers/exception.js b/app/assets/javascripts/discourse/app/controllers/exception.js index badf33afc8..0057782817 100644 --- a/app/assets/javascripts/discourse/app/controllers/exception.js +++ b/app/assets/javascripts/discourse/app/controllers/exception.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; -import { equal, gte, none, alias } from "@ember/object/computed"; -import { schedule } from "@ember/runloop"; -import Controller from "@ember/controller"; +import { alias, equal, gte, none } from "@ember/object/computed"; import discourseComputed, { on } from "discourse-common/utils/decorators"; +import Controller from "@ember/controller"; +import I18n from "I18n"; +import { schedule } from "@ember/runloop"; const ButtonBackBright = { classes: "btn-primary", diff --git a/app/assets/javascripts/discourse/app/controllers/feature-topic-on-profile.js b/app/assets/javascripts/discourse/app/controllers/feature-topic-on-profile.js index 622b5823bf..946a455106 100644 --- a/app/assets/javascripts/discourse/app/controllers/feature-topic-on-profile.js +++ b/app/assets/javascripts/discourse/app/controllers/feature-topic-on-profile.js @@ -1,8 +1,8 @@ import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { ajax } from "discourse/lib/ajax"; -import { popupAjaxError } from "discourse/lib/ajax-error"; import { none } from "@ember/object/computed"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend(ModalFunctionality, { newFeaturedTopic: null, diff --git a/app/assets/javascripts/discourse/app/controllers/feature-topic.js b/app/assets/javascripts/discourse/app/controllers/feature-topic.js index b646cec500..d05003e9a3 100644 --- a/app/assets/javascripts/discourse/app/controllers/feature-topic.js +++ b/app/assets/javascripts/discourse/app/controllers/feature-topic.js @@ -1,11 +1,11 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import Controller, { inject } from "@ember/controller"; -import { ajax } from "discourse/lib/ajax"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; -import { categoryLinkHTML } from "discourse/helpers/category-link"; import EmberObject from "@ember/object"; +import I18n from "I18n"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; +import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; +import { categoryLinkHTML } from "discourse/helpers/category-link"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend(ModalFunctionality, { topicController: inject("topic"), diff --git a/app/assets/javascripts/discourse/app/controllers/flag.js b/app/assets/javascripts/discourse/app/controllers/flag.js index 22cc684081..21c41e973b 100644 --- a/app/assets/javascripts/discourse/app/controllers/flag.js +++ b/app/assets/javascripts/discourse/app/controllers/flag.js @@ -1,15 +1,15 @@ +import ActionSummary from "discourse/models/action-summary"; +import Controller from "@ember/controller"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; +import { MAX_MESSAGE_LENGTH } from "discourse/models/post-action-type"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; +import { Promise } from "rsvp"; +import User from "discourse/models/user"; import discourseComputed from "discourse-common/utils/decorators"; import { not } from "@ember/object/computed"; -import EmberObject from "@ember/object"; -import Controller from "@ember/controller"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; -import ActionSummary from "discourse/models/action-summary"; -import { MAX_MESSAGE_LENGTH } from "discourse/models/post-action-type"; import optionalService from "discourse/lib/optional-service"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import I18n from "I18n"; -import User from "discourse/models/user"; -import { Promise } from "rsvp"; export default Controller.extend(ModalFunctionality, { adminTools: optionalService(), diff --git a/app/assets/javascripts/discourse/app/controllers/forgot-password.js b/app/assets/javascripts/discourse/app/controllers/forgot-password.js index 3da342f8f4..8a7d814a7b 100644 --- a/app/assets/javascripts/discourse/app/controllers/forgot-password.js +++ b/app/assets/javascripts/discourse/app/controllers/forgot-password.js @@ -1,13 +1,13 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { isEmpty } from "@ember/utils"; import Controller from "@ember/controller"; -import { ajax } from "discourse/lib/ajax"; +import I18n from "I18n"; import ModalFunctionality from "discourse/mixins/modal-functionality"; +import { ajax } from "discourse/lib/ajax"; +import cookie from "discourse/lib/cookie"; +import discourseComputed from "discourse-common/utils/decorators"; import { escapeExpression } from "discourse/lib/utilities"; import { extractError } from "discourse/lib/ajax-error"; import getURL from "discourse-common/lib/get-url"; -import cookie from "discourse/lib/cookie"; +import { isEmpty } from "@ember/utils"; export default Controller.extend(ModalFunctionality, { offerHelp: null, diff --git a/app/assets/javascripts/discourse/app/controllers/full-page-search.js b/app/assets/javascripts/discourse/app/controllers/full-page-search.js index 032b438c8e..44dee80ae3 100644 --- a/app/assets/javascripts/discourse/app/controllers/full-page-search.js +++ b/app/assets/javascripts/discourse/app/controllers/full-page-search.js @@ -1,20 +1,20 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import { or } from "@ember/object/computed"; import Controller, { inject as controller } from "@ember/controller"; -import { ajax } from "discourse/lib/ajax"; +import discourseComputed, { observes } from "discourse-common/utils/decorators"; import { - translateResults, - searchContextDescription, getSearchKey, isValidSearchTerm, + searchContextDescription, + translateResults, } from "discourse/lib/search"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; import Category from "discourse/models/category"; -import { escapeExpression } from "discourse/lib/utilities"; -import { setTransient } from "discourse/lib/page-tracker"; import Composer from "discourse/models/composer"; +import I18n from "I18n"; +import { ajax } from "discourse/lib/ajax"; +import { escapeExpression } from "discourse/lib/utilities"; +import { isEmpty } from "@ember/utils"; +import { or } from "@ember/object/computed"; import { scrollTop } from "discourse/mixins/scroll-top"; +import { setTransient } from "discourse/lib/page-tracker"; const SortOrders = [ { name: I18n.t("search.relevance"), id: 0 }, diff --git a/app/assets/javascripts/discourse/app/controllers/grant-badge.js b/app/assets/javascripts/discourse/app/controllers/grant-badge.js index 0375df7c30..a0f060aef5 100644 --- a/app/assets/javascripts/discourse/app/controllers/grant-badge.js +++ b/app/assets/javascripts/discourse/app/controllers/grant-badge.js @@ -1,12 +1,12 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import Controller, { inject } from "@ember/controller"; -import { extractError } from "discourse/lib/ajax-error"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; -import GrantBadgeController from "discourse/mixins/grant-badge-controller"; import Badge from "discourse/models/badge"; +import GrantBadgeController from "discourse/mixins/grant-badge-controller"; +import I18n from "I18n"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; import UserBadge from "discourse/models/user-badge"; import { all } from "rsvp"; +import discourseComputed from "discourse-common/utils/decorators"; +import { extractError } from "discourse/lib/ajax-error"; export default Controller.extend(ModalFunctionality, GrantBadgeController, { topicController: inject("topic"), diff --git a/app/assets/javascripts/discourse/app/controllers/group-activity-posts.js b/app/assets/javascripts/discourse/app/controllers/group-activity-posts.js index b5a702386f..3e73979ca8 100644 --- a/app/assets/javascripts/discourse/app/controllers/group-activity-posts.js +++ b/app/assets/javascripts/discourse/app/controllers/group-activity-posts.js @@ -1,6 +1,6 @@ import Controller, { inject as controller } from "@ember/controller"; -import { observes } from "discourse-common/utils/decorators"; import { fmt } from "discourse/lib/computed"; +import { observes } from "discourse-common/utils/decorators"; export default Controller.extend({ group: controller(), diff --git a/app/assets/javascripts/discourse/app/controllers/group-activity.js b/app/assets/javascripts/discourse/app/controllers/group-activity.js index 36a5ada86b..d00fe154e9 100644 --- a/app/assets/javascripts/discourse/app/controllers/group-activity.js +++ b/app/assets/javascripts/discourse/app/controllers/group-activity.js @@ -1,5 +1,5 @@ -import { inject as service } from "@ember/service"; import Controller from "@ember/controller"; +import { inject as service } from "@ember/service"; export default Controller.extend({ router: service(), queryParams: ["category_id"], diff --git a/app/assets/javascripts/discourse/app/controllers/group-add-members.js b/app/assets/javascripts/discourse/app/controllers/group-add-members.js index ed6258c45a..4964da6886 100644 --- a/app/assets/javascripts/discourse/app/controllers/group-add-members.js +++ b/app/assets/javascripts/discourse/app/controllers/group-add-members.js @@ -1,11 +1,11 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { isEmpty } from "@ember/utils"; import Controller from "@ember/controller"; -import { extractError } from "discourse/lib/ajax-error"; +import I18n from "I18n"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { action } from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; import { emailValid } from "discourse/lib/utilities"; -import I18n from "I18n"; +import { extractError } from "discourse/lib/ajax-error"; +import { isEmpty } from "@ember/utils"; export default Controller.extend(ModalFunctionality, { loading: false, diff --git a/app/assets/javascripts/discourse/app/controllers/group-index.js b/app/assets/javascripts/discourse/app/controllers/group-index.js index fa04f694ac..fd37fe892d 100644 --- a/app/assets/javascripts/discourse/app/controllers/group-index.js +++ b/app/assets/javascripts/discourse/app/controllers/group-index.js @@ -1,9 +1,9 @@ import Controller, { inject as controller } from "@ember/controller"; -import { gt } from "@ember/object/computed"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import discourseDebounce from "discourse/lib/debounce"; import { action } from "@ember/object"; +import discourseDebounce from "discourse/lib/debounce"; +import { gt } from "@ember/object/computed"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ application: controller(), diff --git a/app/assets/javascripts/discourse/app/controllers/group-manage-categories.js b/app/assets/javascripts/discourse/app/controllers/group-manage-categories.js index 88b101f43c..239a2eab23 100644 --- a/app/assets/javascripts/discourse/app/controllers/group-manage-categories.js +++ b/app/assets/javascripts/discourse/app/controllers/group-manage-categories.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend({ @discourseComputed( diff --git a/app/assets/javascripts/discourse/app/controllers/group-manage-tags.js b/app/assets/javascripts/discourse/app/controllers/group-manage-tags.js index c55b45bde3..70fbe2b8bf 100644 --- a/app/assets/javascripts/discourse/app/controllers/group-manage-tags.js +++ b/app/assets/javascripts/discourse/app/controllers/group-manage-tags.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend({ @discourseComputed( diff --git a/app/assets/javascripts/discourse/app/controllers/group-manage.js b/app/assets/javascripts/discourse/app/controllers/group-manage.js index fd7042334b..28b3da6b8b 100644 --- a/app/assets/javascripts/discourse/app/controllers/group-manage.js +++ b/app/assets/javascripts/discourse/app/controllers/group-manage.js @@ -1,6 +1,6 @@ -import { inject as service } from "@ember/service"; import Controller from "@ember/controller"; import discourseComputed from "discourse-common/utils/decorators"; +import { inject as service } from "@ember/service"; export default Controller.extend({ router: service(), diff --git a/app/assets/javascripts/discourse/app/controllers/group-messages.js b/app/assets/javascripts/discourse/app/controllers/group-messages.js index 9d96320419..cb0c46fcf1 100644 --- a/app/assets/javascripts/discourse/app/controllers/group-messages.js +++ b/app/assets/javascripts/discourse/app/controllers/group-messages.js @@ -1,5 +1,5 @@ -import { inject as service } from "@ember/service"; import Controller from "@ember/controller"; +import { inject as service } from "@ember/service"; export default Controller.extend({ router: service(), }); diff --git a/app/assets/javascripts/discourse/app/controllers/group-requests.js b/app/assets/javascripts/discourse/app/controllers/group-requests.js index a9f7e8dfd8..791da19ee0 100644 --- a/app/assets/javascripts/discourse/app/controllers/group-requests.js +++ b/app/assets/javascripts/discourse/app/controllers/group-requests.js @@ -1,8 +1,8 @@ import Controller, { inject as controller } from "@ember/controller"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; import { ajax } from "discourse/lib/ajax"; -import { popupAjaxError } from "discourse/lib/ajax-error"; import discourseDebounce from "discourse/lib/debounce"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ application: controller(), diff --git a/app/assets/javascripts/discourse/app/controllers/group.js b/app/assets/javascripts/discourse/app/controllers/group.js index 9cc9b218d9..635a1bca1e 100644 --- a/app/assets/javascripts/discourse/app/controllers/group.js +++ b/app/assets/javascripts/discourse/app/controllers/group.js @@ -1,11 +1,11 @@ -import I18n from "I18n"; -import EmberObject, { action } from "@ember/object"; import Controller, { inject as controller } from "@ember/controller"; -import discourseComputed from "discourse-common/utils/decorators"; -import { inject as service } from "@ember/service"; -import { readOnly } from "@ember/object/computed"; -import deprecated from "discourse-common/lib/deprecated"; +import EmberObject, { action } from "@ember/object"; +import I18n from "I18n"; import bootbox from "bootbox"; +import deprecated from "discourse-common/lib/deprecated"; +import discourseComputed from "discourse-common/utils/decorators"; +import { readOnly } from "@ember/object/computed"; +import { inject as service } from "@ember/service"; const Tab = EmberObject.extend({ init() { diff --git a/app/assets/javascripts/discourse/app/controllers/groups-index.js b/app/assets/javascripts/discourse/app/controllers/groups-index.js index de488fb53d..a68dbedf58 100644 --- a/app/assets/javascripts/discourse/app/controllers/groups-index.js +++ b/app/assets/javascripts/discourse/app/controllers/groups-index.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; import Controller, { inject as controller } from "@ember/controller"; -import { debounce } from "@ember/runloop"; -import { action } from "@ember/object"; -import discourseComputed from "discourse-common/utils/decorators"; +import I18n from "I18n"; import { INPUT_DELAY } from "discourse-common/config/environment"; +import { action } from "@ember/object"; +import { debounce } from "@ember/runloop"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend({ application: controller(), diff --git a/app/assets/javascripts/discourse/app/controllers/groups-new.js b/app/assets/javascripts/discourse/app/controllers/groups-new.js index ed2a25e936..821c60c167 100644 --- a/app/assets/javascripts/discourse/app/controllers/groups-new.js +++ b/app/assets/javascripts/discourse/app/controllers/groups-new.js @@ -1,9 +1,9 @@ +import Controller from "@ember/controller"; import I18n from "I18n"; import { action } from "@ember/object"; -import Controller from "@ember/controller"; import { ajax } from "discourse/lib/ajax"; -import { popupAjaxError } from "discourse/lib/ajax-error"; import bootbox from "bootbox"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export function popupAutomaticMembershipAlert(group_id, email_domains) { if (!email_domains) { diff --git a/app/assets/javascripts/discourse/app/controllers/history.js b/app/assets/javascripts/discourse/app/controllers/history.js index e80e265d3e..23d66efe33 100644 --- a/app/assets/javascripts/discourse/app/controllers/history.js +++ b/app/assets/javascripts/discourse/app/controllers/history.js @@ -1,19 +1,19 @@ -import I18n from "I18n"; +import { alias, equal, gt, not, or } from "@ember/object/computed"; import discourseComputed, { - on, observes, + on, } from "discourse-common/utils/decorators"; -import { alias, gt, not, or, equal } from "@ember/object/computed"; -import Controller from "@ember/controller"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; -import { categoryBadgeHTML } from "discourse/helpers/category-link"; import { propertyGreaterThan, propertyLessThan } from "discourse/lib/computed"; -import { sanitizeAsync } from "discourse/lib/text"; -import { iconHTML } from "discourse-common/lib/icon-library"; -import Post from "discourse/models/post"; import Category from "discourse/models/category"; -import { computed } from "@ember/object"; +import Controller from "@ember/controller"; +import I18n from "I18n"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; +import Post from "discourse/models/post"; import bootbox from "bootbox"; +import { categoryBadgeHTML } from "discourse/helpers/category-link"; +import { computed } from "@ember/object"; +import { iconHTML } from "discourse-common/lib/icon-library"; +import { sanitizeAsync } from "discourse/lib/text"; function customTagArray(fieldName) { return computed(fieldName, function () { diff --git a/app/assets/javascripts/discourse/app/controllers/ignore-duration-with-username.js b/app/assets/javascripts/discourse/app/controllers/ignore-duration-with-username.js index c8d7afcbbe..408c6f72d7 100644 --- a/app/assets/javascripts/discourse/app/controllers/ignore-duration-with-username.js +++ b/app/assets/javascripts/discourse/app/controllers/ignore-duration-with-username.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; import Controller from "@ember/controller"; +import I18n from "I18n"; import ModalFunctionality from "discourse/mixins/modal-functionality"; -import { popupAjaxError } from "discourse/lib/ajax-error"; import User from "discourse/models/user"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend(ModalFunctionality, { loading: false, diff --git a/app/assets/javascripts/discourse/app/controllers/ignore-duration.js b/app/assets/javascripts/discourse/app/controllers/ignore-duration.js index 8382e90cea..ad141ae22a 100644 --- a/app/assets/javascripts/discourse/app/controllers/ignore-duration.js +++ b/app/assets/javascripts/discourse/app/controllers/ignore-duration.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import Controller from "@ember/controller"; +import I18n from "I18n"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { popupAjaxError } from "discourse/lib/ajax-error"; diff --git a/app/assets/javascripts/discourse/app/controllers/insert-hyperlink.js b/app/assets/javascripts/discourse/app/controllers/insert-hyperlink.js index d57eec38b4..3d4b3babad 100644 --- a/app/assets/javascripts/discourse/app/controllers/insert-hyperlink.js +++ b/app/assets/javascripts/discourse/app/controllers/insert-hyperlink.js @@ -1,10 +1,10 @@ -import { isEmpty } from "@ember/utils"; import { cancel, debounce, schedule } from "@ember/runloop"; import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; -import { searchForTerm } from "discourse/lib/search"; import { bind } from "discourse-common/utils/decorators"; +import { isEmpty } from "@ember/utils"; import { prefixProtocol } from "discourse/lib/url"; +import { searchForTerm } from "discourse/lib/search"; export default Controller.extend(ModalFunctionality, { _debounced: null, diff --git a/app/assets/javascripts/discourse/app/controllers/invites-show.js b/app/assets/javascripts/discourse/app/controllers/invites-show.js index 8e142efdcc..811c74f960 100644 --- a/app/assets/javascripts/discourse/app/controllers/invites-show.js +++ b/app/assets/javascripts/discourse/app/controllers/invites-show.js @@ -1,18 +1,18 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; import { alias, notEmpty, or, readOnly } from "@ember/object/computed"; import Controller from "@ember/controller"; -import discourseComputed from "discourse-common/utils/decorators"; -import getUrl from "discourse-common/lib/get-url"; import DiscourseURL from "discourse/lib/url"; -import { ajax } from "discourse/lib/ajax"; -import { emailValid } from "discourse/lib/utilities"; -import PasswordValidation from "discourse/mixins/password-validation"; -import UsernameValidation from "discourse/mixins/username-validation"; -import NameValidation from "discourse/mixins/name-validation"; -import UserFieldsValidation from "discourse/mixins/user-fields-validation"; -import { findAll as findLoginMethods } from "discourse/models/login-method"; import EmberObject from "@ember/object"; +import I18n from "I18n"; +import NameValidation from "discourse/mixins/name-validation"; +import PasswordValidation from "discourse/mixins/password-validation"; +import UserFieldsValidation from "discourse/mixins/user-fields-validation"; +import UsernameValidation from "discourse/mixins/username-validation"; +import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; +import { emailValid } from "discourse/lib/utilities"; +import { findAll as findLoginMethods } from "discourse/models/login-method"; +import getUrl from "discourse-common/lib/get-url"; +import { isEmpty } from "@ember/utils"; export default Controller.extend( PasswordValidation, diff --git a/app/assets/javascripts/discourse/app/controllers/jump-to-post.js b/app/assets/javascripts/discourse/app/controllers/jump-to-post.js index a2aa1a0692..dab3ced52b 100644 --- a/app/assets/javascripts/discourse/app/controllers/jump-to-post.js +++ b/app/assets/javascripts/discourse/app/controllers/jump-to-post.js @@ -1,7 +1,7 @@ -import { alias } from "@ember/object/computed"; -import { next } from "@ember/runloop"; import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; +import { alias } from "@ember/object/computed"; +import { next } from "@ember/runloop"; export default Controller.extend(ModalFunctionality, { model: null, diff --git a/app/assets/javascripts/discourse/app/controllers/keyboard-shortcuts-help.js b/app/assets/javascripts/discourse/app/controllers/keyboard-shortcuts-help.js index ebf2632ac3..f717a0fe79 100644 --- a/app/assets/javascripts/discourse/app/controllers/keyboard-shortcuts-help.js +++ b/app/assets/javascripts/discourse/app/controllers/keyboard-shortcuts-help.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import Controller from "@ember/controller"; +import I18n from "I18n"; import ModalFunctionality from "discourse/mixins/modal-functionality"; const KEY = "keyboard_shortcuts_help"; diff --git a/app/assets/javascripts/discourse/app/controllers/login.js b/app/assets/javascripts/discourse/app/controllers/login.js index 94468d4bae..ce500f8209 100644 --- a/app/assets/javascripts/discourse/app/controllers/login.js +++ b/app/assets/javascripts/discourse/app/controllers/login.js @@ -1,23 +1,23 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { isEmpty } from "@ember/utils"; -import { alias, or, readOnly } from "@ember/object/computed"; -import EmberObject from "@ember/object"; -import { next, schedule } from "@ember/runloop"; import Controller, { inject as controller } from "@ember/controller"; -import { ajax } from "discourse/lib/ajax"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; -import showModal from "discourse/lib/show-modal"; -import { setting } from "discourse/lib/computed"; -import { findAll } from "discourse/models/login-method"; -import { escape } from "pretty-text/sanitizer"; -import { escapeExpression, areCookiesEnabled } from "discourse/lib/utilities"; -import { extractError } from "discourse/lib/ajax-error"; -import { SECOND_FACTOR_METHODS } from "discourse/models/user"; -import { getWebauthnCredential } from "discourse/lib/webauthn"; -import bootbox from "bootbox"; +import { alias, or, readOnly } from "@ember/object/computed"; +import { areCookiesEnabled, escapeExpression } from "discourse/lib/utilities"; import cookie, { removeCookie } from "discourse/lib/cookie"; +import { next, schedule } from "@ember/runloop"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; +import { SECOND_FACTOR_METHODS } from "discourse/models/user"; +import { ajax } from "discourse/lib/ajax"; +import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; +import { escape } from "pretty-text/sanitizer"; +import { extractError } from "discourse/lib/ajax-error"; +import { findAll } from "discourse/models/login-method"; +import getURL from "discourse-common/lib/get-url"; +import { getWebauthnCredential } from "discourse/lib/webauthn"; +import { isEmpty } from "@ember/utils"; +import { setting } from "discourse/lib/computed"; +import showModal from "discourse/lib/show-modal"; // This is happening outside of the app via popup const AuthErrors = [ diff --git a/app/assets/javascripts/discourse/app/controllers/move-to-topic.js b/app/assets/javascripts/discourse/app/controllers/move-to-topic.js index 1337ecad3d..648fa3cabc 100644 --- a/app/assets/javascripts/discourse/app/controllers/move-to-topic.js +++ b/app/assets/javascripts/discourse/app/controllers/move-to-topic.js @@ -1,13 +1,13 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import { alias, equal } from "@ember/object/computed"; -import { next } from "@ember/runloop"; import Controller, { inject } from "@ember/controller"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; -import { movePosts, mergeTopic } from "discourse/models/topic"; +import { alias, equal } from "@ember/object/computed"; +import { mergeTopic, movePosts } from "discourse/models/topic"; import DiscourseURL from "discourse/lib/url"; +import I18n from "I18n"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; import discourseComputed from "discourse-common/utils/decorators"; import { extractError } from "discourse/lib/ajax-error"; +import { isEmpty } from "@ember/utils"; +import { next } from "@ember/runloop"; export default Controller.extend(ModalFunctionality, { topicName: null, diff --git a/app/assets/javascripts/discourse/app/controllers/navigation/categories.js b/app/assets/javascripts/discourse/app/controllers/navigation/categories.js index 5d7d3dafa1..a1be94b13b 100644 --- a/app/assets/javascripts/discourse/app/controllers/navigation/categories.js +++ b/app/assets/javascripts/discourse/app/controllers/navigation/categories.js @@ -1,6 +1,6 @@ +import NavigationDefaultController from "discourse/controllers/navigation/default"; import discourseComputed from "discourse-common/utils/decorators"; import { inject } from "@ember/controller"; -import NavigationDefaultController from "discourse/controllers/navigation/default"; export default NavigationDefaultController.extend({ discoveryCategories: inject("discovery/categories"), diff --git a/app/assets/javascripts/discourse/app/controllers/navigation/category.js b/app/assets/javascripts/discourse/app/controllers/navigation/category.js index 0ddadd933f..2ff17f2a08 100644 --- a/app/assets/javascripts/discourse/app/controllers/navigation/category.js +++ b/app/assets/javascripts/discourse/app/controllers/navigation/category.js @@ -1,6 +1,6 @@ -import { none, and } from "@ember/object/computed"; -import NavigationDefaultController from "discourse/controllers/navigation/default"; +import { and, none } from "@ember/object/computed"; import FilterModeMixin from "discourse/mixins/filter-mode"; +import NavigationDefaultController from "discourse/controllers/navigation/default"; export default NavigationDefaultController.extend(FilterModeMixin, { showingParentCategory: none("category.parentCategory"), diff --git a/app/assets/javascripts/discourse/app/controllers/navigation/default.js b/app/assets/javascripts/discourse/app/controllers/navigation/default.js index 880869324e..28a3530650 100644 --- a/app/assets/javascripts/discourse/app/controllers/navigation/default.js +++ b/app/assets/javascripts/discourse/app/controllers/navigation/default.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Controller, { inject as controller } from "@ember/controller"; import FilterModeMixin from "discourse/mixins/filter-mode"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend(FilterModeMixin, { discovery: controller(), diff --git a/app/assets/javascripts/discourse/app/controllers/password-reset.js b/app/assets/javascripts/discourse/app/controllers/password-reset.js index ac6f7a69ec..9e7b9ede5a 100644 --- a/app/assets/javascripts/discourse/app/controllers/password-reset.js +++ b/app/assets/javascripts/discourse/app/controllers/password-reset.js @@ -1,12 +1,12 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; +import DiscourseURL, { userPath } from "discourse/lib/url"; import { alias, or, readOnly } from "@ember/object/computed"; import Controller from "@ember/controller"; -import discourseComputed from "discourse-common/utils/decorators"; -import DiscourseURL, { userPath } from "discourse/lib/url"; -import { ajax } from "discourse/lib/ajax"; +import I18n from "I18n"; import PasswordValidation from "discourse/mixins/password-validation"; import { SECOND_FACTOR_METHODS } from "discourse/models/user"; +import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; +import getURL from "discourse-common/lib/get-url"; import { getWebauthnCredential } from "discourse/lib/webauthn"; export default Controller.extend(PasswordValidation, { diff --git a/app/assets/javascripts/discourse/app/controllers/preferences.js b/app/assets/javascripts/discourse/app/controllers/preferences.js index 9d96320419..cb0c46fcf1 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences.js @@ -1,5 +1,5 @@ -import { inject as service } from "@ember/service"; import Controller from "@ember/controller"; +import { inject as service } from "@ember/service"; export default Controller.extend({ router: service(), }); diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/account.js b/app/assets/javascripts/discourse/app/controllers/preferences/account.js index f033cdc1f7..4e7507b57f 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/account.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/account.js @@ -1,19 +1,19 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import { not, or, gt } from "@ember/object/computed"; -import Controller from "@ember/controller"; -import { iconHTML } from "discourse-common/lib/icon-library"; -import CanCheckEmails from "discourse/mixins/can-check-emails"; -import discourseComputed from "discourse-common/utils/decorators"; +import { gt, not, or } from "@ember/object/computed"; import { propertyNotEqual, setting } from "discourse/lib/computed"; +import CanCheckEmails from "discourse/mixins/can-check-emails"; +import Controller from "@ember/controller"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; +import { ajax } from "discourse/lib/ajax"; +import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; +import { findAll } from "discourse/models/login-method"; +import getURL from "discourse-common/lib/get-url"; +import { iconHTML } from "discourse-common/lib/icon-library"; +import logout from "discourse/lib/logout"; import { popupAjaxError } from "discourse/lib/ajax-error"; import showModal from "discourse/lib/show-modal"; -import { findAll } from "discourse/models/login-method"; -import { ajax } from "discourse/lib/ajax"; import { userPath } from "discourse/lib/url"; -import logout from "discourse/lib/logout"; -import EmberObject from "@ember/object"; -import bootbox from "bootbox"; // Number of tokens shown by default. const DEFAULT_AUTH_TOKENS_COUNT = 2; diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/categories.js b/app/assets/javascripts/discourse/app/controllers/preferences/categories.js index 64d41aa9ca..862aedd323 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/categories.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/categories.js @@ -1,6 +1,6 @@ +import Controller from "@ember/controller"; import discourseComputed from "discourse-common/utils/decorators"; import { or } from "@ember/object/computed"; -import Controller from "@ember/controller"; import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/email.js b/app/assets/javascripts/discourse/app/controllers/preferences/email.js index 16772da45f..8a2380807a 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/email.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/email.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import { empty, or } from "@ember/object/computed"; import Controller from "@ember/controller"; -import { propertyEqual } from "discourse/lib/computed"; import EmberObject from "@ember/object"; +import I18n from "I18n"; +import discourseComputed from "discourse-common/utils/decorators"; import { emailValid } from "discourse/lib/utilities"; +import { propertyEqual } from "discourse/lib/computed"; export default Controller.extend({ queryParams: ["new"], diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/emails.js b/app/assets/javascripts/discourse/app/controllers/preferences/emails.js index 1672e4a6d1..2062170002 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/emails.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/emails.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; -import { equal } from "@ember/object/computed"; import Controller from "@ember/controller"; +import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; +import { equal } from "@ember/object/computed"; import { popupAjaxError } from "discourse/lib/ajax-error"; const EMAIL_LEVELS = { diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/interface.js b/app/assets/javascripts/discourse/app/controllers/preferences/interface.js index 8973272382..74f0940d3f 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/interface.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/interface.js @@ -1,22 +1,22 @@ -import I18n from "I18n"; import Controller, { inject } from "@ember/controller"; -import discourseComputed from "discourse-common/utils/decorators"; -import { listThemes, setLocalTheme } from "discourse/lib/theme-selector"; +import { + iOSWithVisualViewport, + isiPad, + safariHacksDisabled, + setDefaultHomepage, +} from "discourse/lib/utilities"; import { listColorSchemes, loadColorSchemeStylesheet, updateColorSchemeCookie, } from "discourse/lib/color-scheme-picker"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import { reload } from "discourse/helpers/page-reloader"; -import { - safariHacksDisabled, - isiPad, - iOSWithVisualViewport, - setDefaultHomepage, -} from "discourse/lib/utilities"; +import { listThemes, setLocalTheme } from "discourse/lib/theme-selector"; +import I18n from "I18n"; import { computed } from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; +import { popupAjaxError } from "discourse/lib/ajax-error"; import { reads } from "@ember/object/computed"; +import { reload } from "discourse/helpers/page-reloader"; const USER_HOMES = { 1: "latest", diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/notifications.js b/app/assets/javascripts/discourse/app/controllers/preferences/notifications.js index e231d043f9..52e8b03655 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/notifications.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/notifications.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import Controller from "@ember/controller"; +import I18n from "I18n"; import { NotificationLevels } from "discourse/lib/notification-levels"; import { popupAjaxError } from "discourse/lib/ajax-error"; diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/profile.js b/app/assets/javascripts/discourse/app/controllers/preferences/profile.js index 5f92bd20d5..fb31cf3392 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/profile.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/profile.js @@ -1,14 +1,14 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import EmberObject from "@ember/object"; import Controller from "@ember/controller"; -import discourseComputed from "discourse-common/utils/decorators"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import { cookAsync } from "discourse/lib/text"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; -import showModal from "discourse/lib/show-modal"; -import { readOnly } from "@ember/object/computed"; import bootbox from "bootbox"; +import { cookAsync } from "discourse/lib/text"; +import discourseComputed from "discourse-common/utils/decorators"; +import { isEmpty } from "@ember/utils"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import { readOnly } from "@ember/object/computed"; +import showModal from "discourse/lib/show-modal"; export default Controller.extend({ init() { diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/second-factor.js b/app/assets/javascripts/discourse/app/controllers/preferences/second-factor.js index c1746d4ed9..566c704a60 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/second-factor.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/second-factor.js @@ -1,15 +1,15 @@ -import I18n from "I18n"; -import { alias } from "@ember/object/computed"; -import Controller from "@ember/controller"; -import discourseComputed from "discourse-common/utils/decorators"; -import { iconHTML } from "discourse-common/lib/icon-library"; -import CanCheckEmails from "discourse/mixins/can-check-emails"; import DiscourseURL, { userPath } from "discourse/lib/url"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import { findAll } from "discourse/models/login-method"; +import CanCheckEmails from "discourse/mixins/can-check-emails"; +import Controller from "@ember/controller"; +import I18n from "I18n"; import { SECOND_FACTOR_METHODS } from "discourse/models/user"; -import showModal from "discourse/lib/show-modal"; +import { alias } from "@ember/object/computed"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; +import { findAll } from "discourse/models/login-method"; +import { iconHTML } from "discourse-common/lib/icon-library"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import showModal from "discourse/lib/show-modal"; export default Controller.extend(CanCheckEmails, { loading: false, diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/tags.js b/app/assets/javascripts/discourse/app/controllers/preferences/tags.js index bc959ca441..bc74ec007a 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/tags.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/tags.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; +import discourseComputed from "discourse-common/utils/decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/username.js b/app/assets/javascripts/discourse/app/controllers/preferences/username.js index 819121724a..6fbeb232c0 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/username.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/username.js @@ -1,13 +1,13 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import { empty, or } from "@ember/object/computed"; -import Controller from "@ember/controller"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; -import { setting, propertyEqual } from "discourse/lib/computed"; import DiscourseURL, { userPath } from "discourse/lib/url"; -import { popupAjaxError } from "discourse/lib/ajax-error"; +import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import { empty, or } from "@ember/object/computed"; +import { propertyEqual, setting } from "discourse/lib/computed"; +import Controller from "@ember/controller"; +import I18n from "I18n"; import User from "discourse/models/user"; import bootbox from "bootbox"; +import { isEmpty } from "@ember/utils"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ taken: false, diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/users.js b/app/assets/javascripts/discourse/app/controllers/preferences/users.js index c7311d5630..cdaf9ee0ac 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/users.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/users.js @@ -1,9 +1,9 @@ -import { makeArray } from "discourse-common/lib/helpers"; -import { alias, or, and } from "@ember/object/computed"; import { action, computed } from "@ember/object"; +import { alias, and, or } from "@ember/object/computed"; import Controller from "@ember/controller"; -import { popupAjaxError } from "discourse/lib/ajax-error"; import discourseComputed from "discourse-common/utils/decorators"; +import { makeArray } from "discourse-common/lib/helpers"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ ignoredUsernames: alias("model.ignored_usernames"), diff --git a/app/assets/javascripts/discourse/app/controllers/publish-page.js b/app/assets/javascripts/discourse/app/controllers/publish-page.js index 046685511e..ef1452c323 100644 --- a/app/assets/javascripts/discourse/app/controllers/publish-page.js +++ b/app/assets/javascripts/discourse/app/controllers/publish-page.js @@ -1,7 +1,7 @@ +import { action, computed } from "@ember/object"; +import { equal, not } from "@ember/object/computed"; import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; -import { computed, action } from "@ember/object"; -import { equal, not } from "@ember/object/computed"; import { ajax } from "discourse/lib/ajax"; import { popupAjaxError } from "discourse/lib/ajax-error"; diff --git a/app/assets/javascripts/discourse/app/controllers/raw-email.js b/app/assets/javascripts/discourse/app/controllers/raw-email.js index 887af55d52..b2a5a8ec1e 100644 --- a/app/assets/javascripts/discourse/app/controllers/raw-email.js +++ b/app/assets/javascripts/discourse/app/controllers/raw-email.js @@ -1,8 +1,8 @@ -import { equal } from "@ember/object/computed"; import Controller from "@ember/controller"; +import IncomingEmail from "admin/models/incoming-email"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import Post from "discourse/models/post"; -import IncomingEmail from "admin/models/incoming-email"; +import { equal } from "@ember/object/computed"; // This controller handles displaying of raw email export default Controller.extend(ModalFunctionality, { diff --git a/app/assets/javascripts/discourse/app/controllers/rename-tag.js b/app/assets/javascripts/discourse/app/controllers/rename-tag.js index 64a17026d7..04dc73c712 100644 --- a/app/assets/javascripts/discourse/app/controllers/rename-tag.js +++ b/app/assets/javascripts/discourse/app/controllers/rename-tag.js @@ -1,7 +1,7 @@ -import discourseComputed from "discourse-common/utils/decorators"; +import BufferedContent from "discourse/mixins/buffered-content"; import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; -import BufferedContent from "discourse/mixins/buffered-content"; +import discourseComputed from "discourse-common/utils/decorators"; import { extractError } from "discourse/lib/ajax-error"; import { oneWay } from "@ember/object/computed"; diff --git a/app/assets/javascripts/discourse/app/controllers/reorder-categories.js b/app/assets/javascripts/discourse/app/controllers/reorder-categories.js index 969c46f9da..0875848ce3 100644 --- a/app/assets/javascripts/discourse/app/controllers/reorder-categories.js +++ b/app/assets/javascripts/discourse/app/controllers/reorder-categories.js @@ -1,12 +1,12 @@ -import { sort } from "@ember/object/computed"; -import Evented from "@ember/object/evented"; -import EmberObjectProxy from "@ember/object/proxy"; -import Controller from "@ember/controller"; -import { ajax } from "discourse/lib/ajax"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; -import BufferedProxy from "ember-buffered-proxy/proxy"; -import { popupAjaxError } from "discourse/lib/ajax-error"; import discourseComputed, { on } from "discourse-common/utils/decorators"; +import BufferedProxy from "ember-buffered-proxy/proxy"; +import Controller from "@ember/controller"; +import EmberObjectProxy from "@ember/object/proxy"; +import Evented from "@ember/object/evented"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; +import { ajax } from "discourse/lib/ajax"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import { sort } from "@ember/object/computed"; export default Controller.extend(ModalFunctionality, Evented, { init() { diff --git a/app/assets/javascripts/discourse/app/controllers/request-group-membership-form.js b/app/assets/javascripts/discourse/app/controllers/request-group-membership-form.js index 32c6170a93..0d3b52f77f 100644 --- a/app/assets/javascripts/discourse/app/controllers/request-group-membership-form.js +++ b/app/assets/javascripts/discourse/app/controllers/request-group-membership-form.js @@ -1,11 +1,11 @@ +import Controller from "@ember/controller"; +import DiscourseURL from "discourse/lib/url"; import I18n from "I18n"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; +import { alias } from "@ember/object/computed"; import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; -import { alias } from "@ember/object/computed"; -import Controller from "@ember/controller"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import DiscourseURL from "discourse/lib/url"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; export default Controller.extend(ModalFunctionality, { loading: false, diff --git a/app/assets/javascripts/discourse/app/controllers/review-index.js b/app/assets/javascripts/discourse/app/controllers/review-index.js index cca820a456..7ea2523e87 100644 --- a/app/assets/javascripts/discourse/app/controllers/review-index.js +++ b/app/assets/javascripts/discourse/app/controllers/review-index.js @@ -1,6 +1,6 @@ +import Controller from "@ember/controller"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; -import Controller from "@ember/controller"; import { isPresent } from "@ember/utils"; export default Controller.extend({ diff --git a/app/assets/javascripts/discourse/app/controllers/review-settings.js b/app/assets/javascripts/discourse/app/controllers/review-settings.js index 353fc33e81..8ca69c8853 100644 --- a/app/assets/javascripts/discourse/app/controllers/review-settings.js +++ b/app/assets/javascripts/discourse/app/controllers/review-settings.js @@ -1,8 +1,8 @@ import Controller from "@ember/controller"; -import { ajax } from "discourse/lib/ajax"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import discourseComputed from "discourse-common/utils/decorators"; import I18n from "I18n"; +import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ saving: false, diff --git a/app/assets/javascripts/discourse/app/controllers/second-factor-add-security-key.js b/app/assets/javascripts/discourse/app/controllers/second-factor-add-security-key.js index 6674abff6d..d6b48db673 100644 --- a/app/assets/javascripts/discourse/app/controllers/second-factor-add-security-key.js +++ b/app/assets/javascripts/discourse/app/controllers/second-factor-add-security-key.js @@ -1,11 +1,11 @@ -import I18n from "I18n"; -import Controller from "@ember/controller"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; import { bufferToBase64, - stringToBuffer, isWebauthnSupported, + stringToBuffer, } from "discourse/lib/webauthn"; +import Controller from "@ember/controller"; +import I18n from "I18n"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; // model for this controller is user export default Controller.extend(ModalFunctionality, { diff --git a/app/assets/javascripts/discourse/app/controllers/second-factor-add-totp.js b/app/assets/javascripts/discourse/app/controllers/second-factor-add-totp.js index 2a5a6a4c63..bdc1f3511d 100644 --- a/app/assets/javascripts/discourse/app/controllers/second-factor-add-totp.js +++ b/app/assets/javascripts/discourse/app/controllers/second-factor-add-totp.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import Controller from "@ember/controller"; +import I18n from "I18n"; import ModalFunctionality from "discourse/mixins/modal-functionality"; export default Controller.extend(ModalFunctionality, { diff --git a/app/assets/javascripts/discourse/app/controllers/second-factor-backup-edit.js b/app/assets/javascripts/discourse/app/controllers/second-factor-backup-edit.js index f87c90c392..01afb54af7 100644 --- a/app/assets/javascripts/discourse/app/controllers/second-factor-backup-edit.js +++ b/app/assets/javascripts/discourse/app/controllers/second-factor-backup-edit.js @@ -1,9 +1,9 @@ +import Controller from "@ember/controller"; import I18n from "I18n"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; +import { SECOND_FACTOR_METHODS } from "discourse/models/user"; import { alias } from "@ember/object/computed"; import { later } from "@ember/runloop"; -import Controller from "@ember/controller"; -import { SECOND_FACTOR_METHODS } from "discourse/models/user"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; export default Controller.extend(ModalFunctionality, { loading: false, diff --git a/app/assets/javascripts/discourse/app/controllers/static.js b/app/assets/javascripts/discourse/app/controllers/static.js index f0228e7dc0..61f8008d15 100644 --- a/app/assets/javascripts/discourse/app/controllers/static.js +++ b/app/assets/javascripts/discourse/app/controllers/static.js @@ -1,7 +1,7 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { equal } from "@ember/object/computed"; import Controller, { inject as controller } from "@ember/controller"; import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; +import { equal } from "@ember/object/computed"; import { userPath } from "discourse/lib/url"; export default Controller.extend({ diff --git a/app/assets/javascripts/discourse/app/controllers/tag-show.js b/app/assets/javascripts/discourse/app/controllers/tag-show.js index 5d19259d6b..9fbc7ffc39 100644 --- a/app/assets/javascripts/discourse/app/controllers/tag-show.js +++ b/app/assets/javascripts/discourse/app/controllers/tag-show.js @@ -1,12 +1,12 @@ -import I18n from "I18n"; -import { alias } from "@ember/object/computed"; import Controller, { inject as controller } from "@ember/controller"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; import BulkTopicSelection from "discourse/mixins/bulk-topic-selection"; -import NavItem from "discourse/models/nav-item"; import FilterModeMixin from "discourse/mixins/filter-mode"; -import { queryParams } from "discourse/controllers/discovery-sortable"; +import I18n from "I18n"; +import NavItem from "discourse/models/nav-item"; +import { alias } from "@ember/object/computed"; import bootbox from "bootbox"; +import { queryParams } from "discourse/controllers/discovery-sortable"; import showModal from "discourse/lib/show-modal"; export default Controller.extend(BulkTopicSelection, FilterModeMixin, { diff --git a/app/assets/javascripts/discourse/app/controllers/tags-index.js b/app/assets/javascripts/discourse/app/controllers/tags-index.js index 7ce3acdb46..7222df90c9 100644 --- a/app/assets/javascripts/discourse/app/controllers/tags-index.js +++ b/app/assets/javascripts/discourse/app/controllers/tags-index.js @@ -1,11 +1,11 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import { alias, notEmpty } from "@ember/object/computed"; import Controller from "@ember/controller"; -import showModal from "discourse/lib/show-modal"; +import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; -import { popupAjaxError } from "discourse/lib/ajax-error"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import showModal from "discourse/lib/show-modal"; export default Controller.extend({ sortedByCount: true, diff --git a/app/assets/javascripts/discourse/app/controllers/topic-bulk-actions.js b/app/assets/javascripts/discourse/app/controllers/topic-bulk-actions.js index 98a56d80e1..909a8dc6c4 100644 --- a/app/assets/javascripts/discourse/app/controllers/topic-bulk-actions.js +++ b/app/assets/javascripts/discourse/app/controllers/topic-bulk-actions.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import { empty, alias } from "@ember/object/computed"; +import { alias, empty } from "@ember/object/computed"; import Controller from "@ember/controller"; +import I18n from "I18n"; import ModalFunctionality from "discourse/mixins/modal-functionality"; +import { Promise } from "rsvp"; import Topic from "discourse/models/topic"; import bootbox from "bootbox"; -import { Promise } from "rsvp"; const _buttons = []; diff --git a/app/assets/javascripts/discourse/app/controllers/topic.js b/app/assets/javascripts/discourse/app/controllers/topic.js index 5c3c16f6df..2bb4f750dd 100644 --- a/app/assets/javascripts/discourse/app/controllers/topic.js +++ b/app/assets/javascripts/discourse/app/controllers/topic.js @@ -1,31 +1,31 @@ -import I18n from "I18n"; -import { isPresent, isEmpty } from "@ember/utils"; -import { or, and, not, alias } from "@ember/object/computed"; -import EmberObject from "@ember/object"; -import { next, schedule, later } from "@ember/runloop"; import Controller, { inject as controller } from "@ember/controller"; -import { bufferedProperty } from "discourse/mixins/buffered-content"; -import Composer from "discourse/models/composer"; import DiscourseURL, { userPath } from "discourse/lib/url"; +import { alias, and, not, or } from "@ember/object/computed"; +import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import { isEmpty, isPresent } from "@ember/utils"; +import { later, next, schedule } from "@ember/runloop"; +import { AUTO_DELETE_PREFERENCES } from "discourse/models/bookmark"; +import Composer from "discourse/models/composer"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; import Post from "discourse/models/post"; -import { buildQuote } from "discourse/lib/quote"; +import { Promise } from "rsvp"; import QuoteState from "discourse/lib/quote-state"; import Topic from "discourse/models/topic"; -import discourseDebounce from "discourse/lib/debounce"; -import isElementInViewport from "discourse/lib/is-element-in-viewport"; -import { ajax } from "discourse/lib/ajax"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; -import { extractLinkMeta } from "discourse/lib/render-topic-featured-link"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import { spinnerHTML } from "discourse/helpers/loading-spinner"; -import showModal from "discourse/lib/show-modal"; import TopicTimer from "discourse/models/topic-timer"; -import { Promise } from "rsvp"; -import { escapeExpression } from "discourse/lib/utilities"; -import { AUTO_DELETE_PREFERENCES } from "discourse/models/bookmark"; -import { inject as service } from "@ember/service"; +import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; +import { bufferedProperty } from "discourse/mixins/buffered-content"; +import { buildQuote } from "discourse/lib/quote"; import { deepMerge } from "discourse-common/lib/object"; +import discourseDebounce from "discourse/lib/debounce"; +import { escapeExpression } from "discourse/lib/utilities"; +import { extractLinkMeta } from "discourse/lib/render-topic-featured-link"; +import isElementInViewport from "discourse/lib/is-element-in-viewport"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import { inject as service } from "@ember/service"; +import showModal from "discourse/lib/show-modal"; +import { spinnerHTML } from "discourse/helpers/loading-spinner"; let customPostMessageCallbacks = {}; diff --git a/app/assets/javascripts/discourse/app/controllers/upload-selector.js b/app/assets/javascripts/discourse/app/controllers/upload-selector.js index 8963016eb9..1e424f9aed 100644 --- a/app/assets/javascripts/discourse/app/controllers/upload-selector.js +++ b/app/assets/javascripts/discourse/app/controllers/upload-selector.js @@ -1,14 +1,14 @@ -import I18n from "I18n"; -import { equal } from "@ember/object/computed"; -import Controller from "@ember/controller"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; -import discourseComputed from "discourse-common/utils/decorators"; import { allowsAttachments, authorizedExtensions, authorizesAllExtensions, uploadIcon, } from "discourse/lib/uploads"; +import Controller from "@ember/controller"; +import I18n from "I18n"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; +import discourseComputed from "discourse-common/utils/decorators"; +import { equal } from "@ember/object/computed"; export default Controller.extend(ModalFunctionality, { imageUrl: null, diff --git a/app/assets/javascripts/discourse/app/controllers/user-activity-bookmarks.js b/app/assets/javascripts/discourse/app/controllers/user-activity-bookmarks.js index ab19fc5d57..86edb9b023 100644 --- a/app/assets/javascripts/discourse/app/controllers/user-activity-bookmarks.js +++ b/app/assets/javascripts/discourse/app/controllers/user-activity-bookmarks.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; import Controller, { inject } from "@ember/controller"; +import Bookmark from "discourse/models/bookmark"; +import I18n from "I18n"; import { Promise } from "rsvp"; import { action } from "@ember/object"; import discourseComputed from "discourse-common/utils/decorators"; -import Bookmark from "discourse/models/bookmark"; export default Controller.extend({ application: inject(), diff --git a/app/assets/javascripts/discourse/app/controllers/user-activity.js b/app/assets/javascripts/discourse/app/controllers/user-activity.js index ac945e469b..d6e7241f35 100644 --- a/app/assets/javascripts/discourse/app/controllers/user-activity.js +++ b/app/assets/javascripts/discourse/app/controllers/user-activity.js @@ -1,10 +1,10 @@ +import Controller, { inject as controller } from "@ember/controller"; import I18n from "I18n"; import { alias } from "@ember/object/computed"; -import { inject as service } from "@ember/service"; -import Controller, { inject as controller } from "@ember/controller"; +import bootbox from "bootbox"; import { exportUserArchive } from "discourse/lib/export-csv"; import { observes } from "discourse-common/utils/decorators"; -import bootbox from "bootbox"; +import { inject as service } from "@ember/service"; export default Controller.extend({ application: controller(), diff --git a/app/assets/javascripts/discourse/app/controllers/user-badges.js b/app/assets/javascripts/discourse/app/controllers/user-badges.js index 3b8cfdb9c2..a4d55048f9 100644 --- a/app/assets/javascripts/discourse/app/controllers/user-badges.js +++ b/app/assets/javascripts/discourse/app/controllers/user-badges.js @@ -1,5 +1,5 @@ -import { alias, sort } from "@ember/object/computed"; import Controller, { inject as controller } from "@ember/controller"; +import { alias, sort } from "@ember/object/computed"; export default Controller.extend({ user: controller(), diff --git a/app/assets/javascripts/discourse/app/controllers/user-card.js b/app/assets/javascripts/discourse/app/controllers/user-card.js index 9bc2a40c62..b08b8d3639 100644 --- a/app/assets/javascripts/discourse/app/controllers/user-card.js +++ b/app/assets/javascripts/discourse/app/controllers/user-card.js @@ -1,5 +1,5 @@ import Controller, { inject as controller } from "@ember/controller"; -import DiscourseURL, { userPath, groupPath } from "discourse/lib/url"; +import DiscourseURL, { groupPath, userPath } from "discourse/lib/url"; export default Controller.extend({ topic: controller(), diff --git a/app/assets/javascripts/discourse/app/controllers/user-invited-show.js b/app/assets/javascripts/discourse/app/controllers/user-invited-show.js index 6becdb6d4e..9781e87007 100644 --- a/app/assets/javascripts/discourse/app/controllers/user-invited-show.js +++ b/app/assets/javascripts/discourse/app/controllers/user-invited-show.js @@ -1,12 +1,12 @@ -import I18n from "I18n"; +import discourseComputed, { observes } from "discourse-common/utils/decorators"; import { equal, reads } from "@ember/object/computed"; import Controller from "@ember/controller"; +import I18n from "I18n"; +import { INPUT_DELAY } from "discourse-common/config/environment"; import Invite from "discourse/models/invite"; +import bootbox from "bootbox"; import discourseDebounce from "discourse/lib/debounce"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; -import { INPUT_DELAY } from "discourse-common/config/environment"; -import bootbox from "bootbox"; export default Controller.extend({ user: null, diff --git a/app/assets/javascripts/discourse/app/controllers/user-notifications.js b/app/assets/javascripts/discourse/app/controllers/user-notifications.js index 27da855d1b..369e6f6f12 100644 --- a/app/assets/javascripts/discourse/app/controllers/user-notifications.js +++ b/app/assets/javascripts/discourse/app/controllers/user-notifications.js @@ -1,6 +1,6 @@ import Controller, { inject as controller } from "@ember/controller"; -import { ajax } from "discourse/lib/ajax"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import { ajax } from "discourse/lib/ajax"; import { readOnly } from "@ember/object/computed"; import { inject as service } from "@ember/service"; diff --git a/app/assets/javascripts/discourse/app/controllers/user-private-messages.js b/app/assets/javascripts/discourse/app/controllers/user-private-messages.js index ce7663e334..4e1fd70393 100644 --- a/app/assets/javascripts/discourse/app/controllers/user-private-messages.js +++ b/app/assets/javascripts/discourse/app/controllers/user-private-messages.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { alias, equal, and } from "@ember/object/computed"; -import { inject as service } from "@ember/service"; import Controller, { inject as controller } from "@ember/controller"; +import { alias, and, equal } from "@ember/object/computed"; +import I18n from "I18n"; import Topic from "discourse/models/topic"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; +import { inject as service } from "@ember/service"; export default Controller.extend({ userTopicsList: controller("user-topics-list"), diff --git a/app/assets/javascripts/discourse/app/controllers/user-summary.js b/app/assets/javascripts/discourse/app/controllers/user-summary.js index 5a2863e2ba..fbfe0985df 100644 --- a/app/assets/javascripts/discourse/app/controllers/user-summary.js +++ b/app/assets/javascripts/discourse/app/controllers/user-summary.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { alias } from "@ember/object/computed"; import Controller, { inject } from "@ember/controller"; +import { alias } from "@ember/object/computed"; +import discourseComputed from "discourse-common/utils/decorators"; import { durationTiny } from "discourse/lib/formatter"; // should be kept in sync with 'UserSummary::MAX_BADGES' diff --git a/app/assets/javascripts/discourse/app/controllers/user-topics-list.js b/app/assets/javascripts/discourse/app/controllers/user-topics-list.js index 1480d4633e..1196916ebd 100644 --- a/app/assets/javascripts/discourse/app/controllers/user-topics-list.js +++ b/app/assets/javascripts/discourse/app/controllers/user-topics-list.js @@ -1,5 +1,5 @@ -import discourseComputed, { observes } from "discourse-common/utils/decorators"; import Controller, { inject as controller } from "@ember/controller"; +import discourseComputed, { observes } from "discourse-common/utils/decorators"; // Lists of topics on a user's page. export default Controller.extend({ diff --git a/app/assets/javascripts/discourse/app/controllers/user.js b/app/assets/javascripts/discourse/app/controllers/user.js index 0376d6a787..fa9e99749b 100644 --- a/app/assets/javascripts/discourse/app/controllers/user.js +++ b/app/assets/javascripts/discourse/app/controllers/user.js @@ -1,13 +1,13 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { isEmpty } from "@ember/utils"; -import { alias, or, gt, not, and } from "@ember/object/computed"; -import EmberObject, { set, computed } from "@ember/object"; -import { inject as service } from "@ember/service"; import Controller, { inject } from "@ember/controller"; +import EmberObject, { computed, set } from "@ember/object"; +import { alias, and, gt, not, or } from "@ember/object/computed"; import CanCheckEmails from "discourse/mixins/can-check-emails"; import User from "discourse/models/user"; +import discourseComputed from "discourse-common/utils/decorators"; +import { isEmpty } from "@ember/utils"; import optionalService from "discourse/lib/optional-service"; import { prioritizeNameInUx } from "discourse/lib/settings"; +import { inject as service } from "@ember/service"; export default Controller.extend(CanCheckEmails, { indexStream: false, diff --git a/app/assets/javascripts/discourse/app/controllers/users.js b/app/assets/javascripts/discourse/app/controllers/users.js index 52ec79863d..a0b180a164 100644 --- a/app/assets/javascripts/discourse/app/controllers/users.js +++ b/app/assets/javascripts/discourse/app/controllers/users.js @@ -1,8 +1,8 @@ -import { equal } from "@ember/object/computed"; import Controller, { inject as controller } from "@ember/controller"; import discourseDebounce from "discourse/lib/debounce"; -import { observes } from "discourse-common/utils/decorators"; +import { equal } from "@ember/object/computed"; import { longDate } from "discourse/lib/formatter"; +import { observes } from "discourse-common/utils/decorators"; export default Controller.extend({ application: controller(), diff --git a/app/assets/javascripts/discourse/app/helpers/application.js b/app/assets/javascripts/discourse/app/helpers/application.js index 98341b942f..629a20648a 100644 --- a/app/assets/javascripts/discourse/app/helpers/application.js +++ b/app/assets/javascripts/discourse/app/helpers/application.js @@ -1,12 +1,12 @@ -import I18n from "I18n"; -import { registerUnbound } from "discourse-common/lib/helpers"; import { - longDate, autoUpdatingRelativeAge, + longDate, number, } from "discourse/lib/formatter"; -import { htmlSafe } from "@ember/template"; +import I18n from "I18n"; import { escapeExpression } from "discourse/lib/utilities"; +import { htmlSafe } from "@ember/template"; +import { registerUnbound } from "discourse-common/lib/helpers"; registerUnbound("raw-date", (dt) => htmlSafe(longDate(new Date(dt)))); diff --git a/app/assets/javascripts/discourse/app/helpers/bound-avatar-template.js b/app/assets/javascripts/discourse/app/helpers/bound-avatar-template.js index b08e483b2e..8e054d8ce5 100644 --- a/app/assets/javascripts/discourse/app/helpers/bound-avatar-template.js +++ b/app/assets/javascripts/discourse/app/helpers/bound-avatar-template.js @@ -1,6 +1,6 @@ -import { isEmpty } from "@ember/utils"; -import { htmlHelper } from "discourse-common/lib/helpers"; import { avatarImg } from "discourse/lib/utilities"; +import { htmlHelper } from "discourse-common/lib/helpers"; +import { isEmpty } from "@ember/utils"; export default htmlHelper((avatarTemplate, size) => { if (isEmpty(avatarTemplate)) { diff --git a/app/assets/javascripts/discourse/app/helpers/bound-avatar.js b/app/assets/javascripts/discourse/app/helpers/bound-avatar.js index 6504dc1c08..627ca00017 100644 --- a/app/assets/javascripts/discourse/app/helpers/bound-avatar.js +++ b/app/assets/javascripts/discourse/app/helpers/bound-avatar.js @@ -1,8 +1,8 @@ -import { get } from "@ember/object"; -import { isEmpty } from "@ember/utils"; -import { htmlHelper } from "discourse-common/lib/helpers"; -import { avatarImg } from "discourse/lib/utilities"; import { addExtraUserClasses } from "discourse/helpers/user-avatar"; +import { avatarImg } from "discourse/lib/utilities"; +import { get } from "@ember/object"; +import { htmlHelper } from "discourse-common/lib/helpers"; +import { isEmpty } from "@ember/utils"; export default htmlHelper((user, size) => { if (isEmpty(user)) { diff --git a/app/assets/javascripts/discourse/app/helpers/bound-category-link.js b/app/assets/javascripts/discourse/app/helpers/bound-category-link.js index 4c86867061..bd62003221 100644 --- a/app/assets/javascripts/discourse/app/helpers/bound-category-link.js +++ b/app/assets/javascripts/discourse/app/helpers/bound-category-link.js @@ -1,4 +1,4 @@ -import { htmlHelper } from "discourse-common/lib/helpers"; import { categoryLinkHTML } from "discourse/helpers/category-link"; +import { htmlHelper } from "discourse-common/lib/helpers"; export default htmlHelper(categoryLinkHTML); diff --git a/app/assets/javascripts/discourse/app/helpers/category-link.js b/app/assets/javascripts/discourse/app/helpers/category-link.js index b26560a008..71dcd3d722 100644 --- a/app/assets/javascripts/discourse/app/helpers/category-link.js +++ b/app/assets/javascripts/discourse/app/helpers/category-link.js @@ -1,13 +1,13 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import { get } from "@ember/object"; import { helperContext, registerUnbound } from "discourse-common/lib/helpers"; -import { isRTL } from "discourse/lib/text-direction"; -import { iconHTML } from "discourse-common/lib/icon-library"; import Category from "discourse/models/category"; +import I18n from "I18n"; import Site from "discourse/models/site"; import { escapeExpression } from "discourse/lib/utilities"; +import { get } from "@ember/object"; +import getURL from "discourse-common/lib/get-url"; import { htmlSafe } from "@ember/template"; +import { iconHTML } from "discourse-common/lib/icon-library"; +import { isRTL } from "discourse/lib/text-direction"; let _renderer = defaultCategoryLinkRenderer; diff --git a/app/assets/javascripts/discourse/app/helpers/cold-age-class.js b/app/assets/javascripts/discourse/app/helpers/cold-age-class.js index 06f269e3b6..ff696982cc 100644 --- a/app/assets/javascripts/discourse/app/helpers/cold-age-class.js +++ b/app/assets/javascripts/discourse/app/helpers/cold-age-class.js @@ -1,4 +1,4 @@ -import { registerUnbound, helperContext } from "discourse-common/lib/helpers"; +import { helperContext, registerUnbound } from "discourse-common/lib/helpers"; function daysSinceEpoch(dt) { // 1000 * 60 * 60 * 24 = days since epoch diff --git a/app/assets/javascripts/discourse/app/helpers/dash-if-empty.js b/app/assets/javascripts/discourse/app/helpers/dash-if-empty.js index b6741cad28..502998ee87 100644 --- a/app/assets/javascripts/discourse/app/helpers/dash-if-empty.js +++ b/app/assets/javascripts/discourse/app/helpers/dash-if-empty.js @@ -1,4 +1,4 @@ -import { isEmpty } from "@ember/utils"; import { htmlHelper } from "discourse-common/lib/helpers"; +import { isEmpty } from "@ember/utils"; export default htmlHelper((str) => (isEmpty(str) ? "—" : str)); diff --git a/app/assets/javascripts/discourse/app/helpers/dir-span.js b/app/assets/javascripts/discourse/app/helpers/dir-span.js index e2fb6f9f48..022b2de52f 100644 --- a/app/assets/javascripts/discourse/app/helpers/dir-span.js +++ b/app/assets/javascripts/discourse/app/helpers/dir-span.js @@ -1,6 +1,6 @@ -import { registerUnbound, helperContext } from "discourse-common/lib/helpers"; -import { isRTL } from "discourse/lib/text-direction"; +import { helperContext, registerUnbound } from "discourse-common/lib/helpers"; import { htmlSafe } from "@ember/template"; +import { isRTL } from "discourse/lib/text-direction"; function setDir(text) { let content = text ? text : ""; diff --git a/app/assets/javascripts/discourse/app/helpers/discourse-tag.js b/app/assets/javascripts/discourse/app/helpers/discourse-tag.js index 21780387f1..09cb84518d 100644 --- a/app/assets/javascripts/discourse/app/helpers/discourse-tag.js +++ b/app/assets/javascripts/discourse/app/helpers/discourse-tag.js @@ -1,6 +1,6 @@ +import { htmlSafe } from "@ember/template"; import { registerUnbound } from "discourse-common/lib/helpers"; import renderTag from "discourse/lib/render-tag"; -import { htmlSafe } from "@ember/template"; export default registerUnbound("discourse-tag", function (name, params) { return htmlSafe(renderTag(name, params)); diff --git a/app/assets/javascripts/discourse/app/helpers/discourse-tags.js b/app/assets/javascripts/discourse/app/helpers/discourse-tags.js index 9b23365208..ea9a82a304 100644 --- a/app/assets/javascripts/discourse/app/helpers/discourse-tags.js +++ b/app/assets/javascripts/discourse/app/helpers/discourse-tags.js @@ -1,6 +1,6 @@ +import { htmlSafe } from "@ember/template"; import { registerUnbound } from "discourse-common/lib/helpers"; import renderTags from "discourse/lib/render-tags"; -import { htmlSafe } from "@ember/template"; export default registerUnbound("discourse-tags", function (topic, params) { return htmlSafe(renderTags(topic, params)); diff --git a/app/assets/javascripts/discourse/app/helpers/editable-value.js b/app/assets/javascripts/discourse/app/helpers/editable-value.js index ae67cedf5e..32763daaf4 100644 --- a/app/assets/javascripts/discourse/app/helpers/editable-value.js +++ b/app/assets/javascripts/discourse/app/helpers/editable-value.js @@ -1,5 +1,5 @@ -import { get } from "@ember/object"; import Helper from "@ember/component/helper"; +import { get } from "@ember/object"; export function formatCurrency([reviewable, fieldId]) { // The field `category_id` corresponds to `category` diff --git a/app/assets/javascripts/discourse/app/helpers/format-age.js b/app/assets/javascripts/discourse/app/helpers/format-age.js index 21bfeb423b..0eef634130 100644 --- a/app/assets/javascripts/discourse/app/helpers/format-age.js +++ b/app/assets/javascripts/discourse/app/helpers/format-age.js @@ -1,6 +1,6 @@ import { autoUpdatingRelativeAge, durationTiny } from "discourse/lib/formatter"; -import { registerUnbound } from "discourse-common/lib/helpers"; import { htmlSafe } from "@ember/template"; +import { registerUnbound } from "discourse-common/lib/helpers"; registerUnbound("format-age", function (dt) { dt = new Date(dt); diff --git a/app/assets/javascripts/discourse/app/helpers/format-date.js b/app/assets/javascripts/discourse/app/helpers/format-date.js index a68468076b..e91759cdce 100644 --- a/app/assets/javascripts/discourse/app/helpers/format-date.js +++ b/app/assets/javascripts/discourse/app/helpers/format-date.js @@ -1,6 +1,6 @@ -import { registerUnbound } from "discourse-common/lib/helpers"; import { autoUpdatingRelativeAge } from "discourse/lib/formatter"; import { htmlSafe } from "@ember/template"; +import { registerUnbound } from "discourse-common/lib/helpers"; /** Display logic for dates. It is unbound in Ember but will use jQuery to diff --git a/app/assets/javascripts/discourse/app/helpers/format-username.js b/app/assets/javascripts/discourse/app/helpers/format-username.js index 2e6904a799..6388a900fb 100644 --- a/app/assets/javascripts/discourse/app/helpers/format-username.js +++ b/app/assets/javascripts/discourse/app/helpers/format-username.js @@ -1,4 +1,4 @@ -import { registerUnbound } from "discourse-common/lib/helpers"; import { formatUsername } from "discourse/lib/utilities"; +import { registerUnbound } from "discourse-common/lib/helpers"; export default registerUnbound("format-username", formatUsername); diff --git a/app/assets/javascripts/discourse/app/helpers/icon-or-image.js b/app/assets/javascripts/discourse/app/helpers/icon-or-image.js index b8b02bdf00..3ad6d53604 100644 --- a/app/assets/javascripts/discourse/app/helpers/icon-or-image.js +++ b/app/assets/javascripts/discourse/app/helpers/icon-or-image.js @@ -1,6 +1,6 @@ -import { isEmpty } from "@ember/utils"; +import { convertIconClass, iconHTML } from "discourse-common/lib/icon-library"; import { htmlHelper } from "discourse-common/lib/helpers"; -import { iconHTML, convertIconClass } from "discourse-common/lib/icon-library"; +import { isEmpty } from "@ember/utils"; export default htmlHelper(function ({ icon, image }) { if (!isEmpty(image)) { diff --git a/app/assets/javascripts/discourse/app/helpers/inline-date.js b/app/assets/javascripts/discourse/app/helpers/inline-date.js index 16adc0c068..166ca2ad22 100644 --- a/app/assets/javascripts/discourse/app/helpers/inline-date.js +++ b/app/assets/javascripts/discourse/app/helpers/inline-date.js @@ -1,5 +1,5 @@ -import { relativeAge } from "discourse/lib/formatter"; import { registerHelper } from "discourse-common/lib/helpers"; +import { relativeAge } from "discourse/lib/formatter"; registerHelper("inline-date", function ([dt]) { // TODO: Remove this in 1.13 or greater diff --git a/app/assets/javascripts/discourse/app/helpers/node.js b/app/assets/javascripts/discourse/app/helpers/node.js index 79f8f73eae..5bc02d6b88 100644 --- a/app/assets/javascripts/discourse/app/helpers/node.js +++ b/app/assets/javascripts/discourse/app/helpers/node.js @@ -1,5 +1,5 @@ +import { longDate, number, relativeAge } from "discourse/lib/formatter"; import { h } from "virtual-dom"; -import { relativeAge, longDate, number } from "discourse/lib/formatter"; export function dateNode(dt) { if (typeof dt === "string") { diff --git a/app/assets/javascripts/discourse/app/helpers/raw-plugin-outlet.js b/app/assets/javascripts/discourse/app/helpers/raw-plugin-outlet.js index 52901c500f..18ba68c6fa 100644 --- a/app/assets/javascripts/discourse/app/helpers/raw-plugin-outlet.js +++ b/app/assets/javascripts/discourse/app/helpers/raw-plugin-outlet.js @@ -1,6 +1,6 @@ -import { rawConnectorsFor } from "discourse/lib/plugin-connectors"; import RawHandlebars from "discourse-common/lib/raw-handlebars"; import { htmlSafe } from "@ember/template"; +import { rawConnectorsFor } from "discourse/lib/plugin-connectors"; RawHandlebars.registerHelper("raw-plugin-outlet", function (args) { const connectors = rawConnectorsFor(args.hash.name); diff --git a/app/assets/javascripts/discourse/app/helpers/raw.js b/app/assets/javascripts/discourse/app/helpers/raw.js index 0c1ba6cf53..31374ee196 100644 --- a/app/assets/javascripts/discourse/app/helpers/raw.js +++ b/app/assets/javascripts/discourse/app/helpers/raw.js @@ -1,4 +1,4 @@ -import { registerUnbound, helperContext } from "discourse-common/lib/helpers"; +import { helperContext, registerUnbound } from "discourse-common/lib/helpers"; import { findRawTemplate } from "discourse-common/lib/raw-templates"; import { htmlSafe } from "@ember/template"; diff --git a/app/assets/javascripts/discourse/app/helpers/replace-emoji.js b/app/assets/javascripts/discourse/app/helpers/replace-emoji.js index 56f8c6e2f8..3109cf2900 100644 --- a/app/assets/javascripts/discourse/app/helpers/replace-emoji.js +++ b/app/assets/javascripts/discourse/app/helpers/replace-emoji.js @@ -1,6 +1,6 @@ -import { registerUnbound } from "discourse-common/lib/helpers"; import { emojiUnescape } from "discourse/lib/text"; import { htmlSafe } from "@ember/template"; +import { registerUnbound } from "discourse-common/lib/helpers"; registerUnbound("replace-emoji", (text, options) => { return htmlSafe(emojiUnescape(text, options)); diff --git a/app/assets/javascripts/discourse/app/helpers/reviewable-history-description.js b/app/assets/javascripts/discourse/app/helpers/reviewable-history-description.js index 85820f729f..0bd3e1aa81 100644 --- a/app/assets/javascripts/discourse/app/helpers/reviewable-history-description.js +++ b/app/assets/javascripts/discourse/app/helpers/reviewable-history-description.js @@ -1,7 +1,7 @@ +import { EDITED } from "discourse/models/reviewable-history"; import I18n from "I18n"; import { htmlHelper } from "discourse-common/lib/helpers"; import { htmlStatus } from "discourse/helpers/reviewable-status"; -import { EDITED } from "discourse/models/reviewable-history"; import { iconHTML } from "discourse-common/lib/icon-library"; export default htmlHelper(function (rh) { diff --git a/app/assets/javascripts/discourse/app/helpers/reviewable-status.js b/app/assets/javascripts/discourse/app/helpers/reviewable-status.js index 3eaebe847e..4fe4ef2445 100644 --- a/app/assets/javascripts/discourse/app/helpers/reviewable-status.js +++ b/app/assets/javascripts/discourse/app/helpers/reviewable-status.js @@ -1,13 +1,13 @@ +import { + APPROVED, + DELETED, + IGNORED, + PENDING, + REJECTED, +} from "discourse/models/reviewable"; import I18n from "I18n"; import { htmlHelper } from "discourse-common/lib/helpers"; import { iconHTML } from "discourse-common/lib/icon-library"; -import { - PENDING, - APPROVED, - REJECTED, - IGNORED, - DELETED, -} from "discourse/models/reviewable"; function dataFor(status) { switch (status) { diff --git a/app/assets/javascripts/discourse/app/helpers/theme-helpers.js b/app/assets/javascripts/discourse/app/helpers/theme-helpers.js index 354d69d1d0..989877554f 100644 --- a/app/assets/javascripts/discourse/app/helpers/theme-helpers.js +++ b/app/assets/javascripts/discourse/app/helpers/theme-helpers.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import { helperContext, registerUnbound } from "discourse-common/lib/helpers"; +import I18n from "I18n"; import deprecated from "discourse-common/lib/deprecated"; registerUnbound("theme-i18n", (themeId, key, params) => { diff --git a/app/assets/javascripts/discourse/app/helpers/topic-featured-link.js b/app/assets/javascripts/discourse/app/helpers/topic-featured-link.js index 31f3e8cdaa..44df2cb02f 100644 --- a/app/assets/javascripts/discourse/app/helpers/topic-featured-link.js +++ b/app/assets/javascripts/discourse/app/helpers/topic-featured-link.js @@ -1,6 +1,6 @@ +import { htmlSafe } from "@ember/template"; import { registerUnbound } from "discourse-common/lib/helpers"; import renderTopicFeaturedLink from "discourse/lib/render-topic-featured-link"; -import { htmlSafe } from "@ember/template"; export default registerUnbound("topic-featured-link", function (topic, params) { return htmlSafe(renderTopicFeaturedLink(topic, params)); diff --git a/app/assets/javascripts/discourse/app/helpers/topic-link.js b/app/assets/javascripts/discourse/app/helpers/topic-link.js index dcc9f6c2e8..2a8bb170e8 100644 --- a/app/assets/javascripts/discourse/app/helpers/topic-link.js +++ b/app/assets/javascripts/discourse/app/helpers/topic-link.js @@ -1,5 +1,5 @@ -import { registerUnbound } from "discourse-common/lib/helpers"; import { htmlSafe } from "@ember/template"; +import { registerUnbound } from "discourse-common/lib/helpers"; registerUnbound("topic-link", (topic, args) => { const title = topic.get("fancyTitle"); diff --git a/app/assets/javascripts/discourse/app/helpers/user-avatar.js b/app/assets/javascripts/discourse/app/helpers/user-avatar.js index 85cb4d1398..0e789c7e3a 100644 --- a/app/assets/javascripts/discourse/app/helpers/user-avatar.js +++ b/app/assets/javascripts/discourse/app/helpers/user-avatar.js @@ -1,8 +1,8 @@ -import { get } from "@ember/object"; -import { registerUnbound } from "discourse-common/lib/helpers"; import { avatarImg, formatUsername } from "discourse/lib/utilities"; -import { prioritizeNameInUx } from "discourse/lib/settings"; +import { get } from "@ember/object"; import { htmlSafe } from "@ember/template"; +import { prioritizeNameInUx } from "discourse/lib/settings"; +import { registerUnbound } from "discourse-common/lib/helpers"; let _customAvatarHelpers; diff --git a/app/assets/javascripts/discourse/app/helpers/user-status.js b/app/assets/javascripts/discourse/app/helpers/user-status.js index 1f84c11a0d..da2f3bd7d2 100644 --- a/app/assets/javascripts/discourse/app/helpers/user-status.js +++ b/app/assets/javascripts/discourse/app/helpers/user-status.js @@ -1,7 +1,7 @@ import I18n from "I18n"; -import { iconHTML } from "discourse-common/lib/icon-library"; -import { htmlHelper } from "discourse-common/lib/helpers"; import { escapeExpression } from "discourse/lib/utilities"; +import { htmlHelper } from "discourse-common/lib/helpers"; +import { iconHTML } from "discourse-common/lib/icon-library"; export default htmlHelper((user, args) => { if (!user) { diff --git a/app/assets/javascripts/discourse/app/initializers/asset-version.js b/app/assets/javascripts/discourse/app/initializers/asset-version.js index 203f6d4af8..c9017c6bcc 100644 --- a/app/assets/javascripts/discourse/app/initializers/asset-version.js +++ b/app/assets/javascripts/discourse/app/initializers/asset-version.js @@ -1,6 +1,6 @@ import I18n from "I18n"; -import { later } from "@ember/runloop"; import bootbox from "bootbox"; +import { later } from "@ember/runloop"; // Subscribe to "asset-version" change events via the Message Bus export default { diff --git a/app/assets/javascripts/discourse/app/initializers/auto-load-modules.js b/app/assets/javascripts/discourse/app/initializers/auto-load-modules.js index b08e3a291f..b985d85c37 100644 --- a/app/assets/javascripts/discourse/app/initializers/auto-load-modules.js +++ b/app/assets/javascripts/discourse/app/initializers/auto-load-modules.js @@ -1,10 +1,10 @@ import { - registerHelpers, createHelperContext, + registerHelpers, } from "discourse-common/lib/helpers"; +import Handlebars from "handlebars"; import RawHandlebars from "discourse-common/lib/raw-handlebars"; import { registerRawHelpers } from "discourse-common/lib/raw-handlebars-helpers"; -import Handlebars from "handlebars"; import { setOwner } from "@ember/application"; export function autoLoadModules(container, registry) { diff --git a/app/assets/javascripts/discourse/app/initializers/click-interceptor.js b/app/assets/javascripts/discourse/app/initializers/click-interceptor.js index ca7ec48380..9f8adfd7a7 100644 --- a/app/assets/javascripts/discourse/app/initializers/click-interceptor.js +++ b/app/assets/javascripts/discourse/app/initializers/click-interceptor.js @@ -1,5 +1,5 @@ -import interceptClick from "discourse/lib/intercept-click"; import DiscourseURL from "discourse/lib/url"; +import interceptClick from "discourse/lib/intercept-click"; export default { name: "click-interceptor", diff --git a/app/assets/javascripts/discourse/app/initializers/copy-codeblocks.js b/app/assets/javascripts/discourse/app/initializers/copy-codeblocks.js index a3326d2b47..828df323a1 100644 --- a/app/assets/javascripts/discourse/app/initializers/copy-codeblocks.js +++ b/app/assets/javascripts/discourse/app/initializers/copy-codeblocks.js @@ -1,9 +1,9 @@ -import { withPluginApi } from "discourse/lib/plugin-api"; import { cancel, later } from "@ember/runloop"; -import { Promise } from "rsvp"; -import { iconHTML } from "discourse-common/lib/icon-library"; import I18n from "I18n"; +import { Promise } from "rsvp"; import { guidFor } from "@ember/object/internals"; +import { iconHTML } from "discourse-common/lib/icon-library"; +import { withPluginApi } from "discourse/lib/plugin-api"; // http://github.com/feross/clipboard-copy function clipboardCopy(text) { diff --git a/app/assets/javascripts/discourse/app/initializers/d-popover.js b/app/assets/javascripts/discourse/app/initializers/d-popover.js index 9564f81aee..d3a96f2490 100644 --- a/app/assets/javascripts/discourse/app/initializers/d-popover.js +++ b/app/assets/javascripts/discourse/app/initializers/d-popover.js @@ -1,7 +1,7 @@ import { - showPopover, - hidePopover, POPOVER_SELECTORS, + hidePopover, + showPopover, } from "discourse/lib/d-popover"; export default { diff --git a/app/assets/javascripts/discourse/app/initializers/enable-emoji.js b/app/assets/javascripts/discourse/app/initializers/enable-emoji.js index 4a056a2532..965ff5a82c 100644 --- a/app/assets/javascripts/discourse/app/initializers/enable-emoji.js +++ b/app/assets/javascripts/discourse/app/initializers/enable-emoji.js @@ -1,6 +1,6 @@ -import { withPluginApi } from "discourse/lib/plugin-api"; -import { registerEmoji } from "pretty-text/emoji"; import PreloadStore from "discourse/lib/preload-store"; +import { registerEmoji } from "pretty-text/emoji"; +import { withPluginApi } from "discourse/lib/plugin-api"; export default { name: "enable-emoji", diff --git a/app/assets/javascripts/discourse/app/initializers/live-development.js b/app/assets/javascripts/discourse/app/initializers/live-development.js index e5b96a8544..00f1f89d0b 100644 --- a/app/assets/javascripts/discourse/app/initializers/live-development.js +++ b/app/assets/javascripts/discourse/app/initializers/live-development.js @@ -1,7 +1,7 @@ -import DiscourseURL from "discourse/lib/url"; import { currentThemeIds, refreshCSS } from "discourse/lib/theme-selector"; -import { isDevelopment } from "discourse-common/config/environment"; +import DiscourseURL from "discourse/lib/url"; import Handlebars from "handlebars"; +import { isDevelopment } from "discourse-common/config/environment"; // Use the message bus for live reloading of components for faster development. export default { diff --git a/app/assets/javascripts/discourse/app/initializers/logout.js b/app/assets/javascripts/discourse/app/initializers/logout.js index bff6d40ccb..cedb695a36 100644 --- a/app/assets/javascripts/discourse/app/initializers/logout.js +++ b/app/assets/javascripts/discourse/app/initializers/logout.js @@ -1,6 +1,6 @@ import I18n from "I18n"; -import logout from "discourse/lib/logout"; import bootbox from "bootbox"; +import logout from "discourse/lib/logout"; let _showingLogout = false; diff --git a/app/assets/javascripts/discourse/app/initializers/message-bus.js b/app/assets/javascripts/discourse/app/initializers/message-bus.js index 5f44db1273..13ccf4601b 100644 --- a/app/assets/javascripts/discourse/app/initializers/message-bus.js +++ b/app/assets/javascripts/discourse/app/initializers/message-bus.js @@ -1,8 +1,8 @@ -import getURL from "discourse-common/lib/get-url"; -// Initialize the message bus to receive messages. -import userPresent from "discourse/lib/user-presence"; -import { handleLogoff } from "discourse/lib/ajax"; import { isProduction, isTesting } from "discourse-common/config/environment"; +// Initialize the message bus to receive messages. +import getURL from "discourse-common/lib/get-url"; +import { handleLogoff } from "discourse/lib/ajax"; +import userPresent from "discourse/lib/user-presence"; const LONG_POLL_AFTER_UNSEEN_TIME = 1200000; // 20 minutes const CONNECTIVITY_ERROR_CLASS = "message-bus-offline"; diff --git a/app/assets/javascripts/discourse/app/initializers/page-tracking.js b/app/assets/javascripts/discourse/app/initializers/page-tracking.js index 80a462d5e8..13858cbc24 100644 --- a/app/assets/javascripts/discourse/app/initializers/page-tracking.js +++ b/app/assets/javascripts/discourse/app/initializers/page-tracking.js @@ -1,9 +1,9 @@ -import { cleanDOM } from "discourse/lib/clean-dom"; import { - startPageTracking, - resetPageTracking, googleTagManagerPageChanged, + resetPageTracking, + startPageTracking, } from "discourse/lib/page-tracker"; +import { cleanDOM } from "discourse/lib/clean-dom"; import { viewTrackingRequired } from "discourse/lib/ajax"; export default { diff --git a/app/assets/javascripts/discourse/app/initializers/post-decorations.js b/app/assets/javascripts/discourse/app/initializers/post-decorations.js index bdc1354636..8d59d50a4b 100644 --- a/app/assets/javascripts/discourse/app/initializers/post-decorations.js +++ b/app/assets/javascripts/discourse/app/initializers/post-decorations.js @@ -1,7 +1,7 @@ import highlightSyntax from "discourse/lib/highlight-syntax"; import lightbox from "discourse/lib/lightbox"; -import { setupLazyLoading } from "discourse/lib/lazy-load-images"; import { setTextDirections } from "discourse/lib/text-direction"; +import { setupLazyLoading } from "discourse/lib/lazy-load-images"; import { withPluginApi } from "discourse/lib/plugin-api"; export default { diff --git a/app/assets/javascripts/discourse/app/initializers/subscribe-user-notifications.js b/app/assets/javascripts/discourse/app/initializers/subscribe-user-notifications.js index 941ad849ea..4559df7e55 100644 --- a/app/assets/javascripts/discourse/app/initializers/subscribe-user-notifications.js +++ b/app/assets/javascripts/discourse/app/initializers/subscribe-user-notifications.js @@ -1,15 +1,15 @@ import EmberObject, { set } from "@ember/object"; // Subscribes to user events on the message bus import { - init as initDesktopNotifications, - onNotification, alertChannel, disable as disableDesktopNotifications, + init as initDesktopNotifications, + onNotification, } from "discourse/lib/desktop-notifications"; import { + isPushNotificationsEnabled, register as registerPushNotifications, unsubscribe as unsubscribePushNotifications, - isPushNotificationsEnabled, } from "discourse/lib/push-notifications"; import { isTesting } from "discourse-common/config/environment"; diff --git a/app/assets/javascripts/discourse/app/initializers/topic-footer-buttons.js b/app/assets/javascripts/discourse/app/initializers/topic-footer-buttons.js index 362f358a5a..812e1b8312 100644 --- a/app/assets/javascripts/discourse/app/initializers/topic-footer-buttons.js +++ b/app/assets/javascripts/discourse/app/initializers/topic-footer-buttons.js @@ -1,7 +1,7 @@ import I18n from "I18n"; -import showModal from "discourse/lib/show-modal"; -import { registerTopicFooterButton } from "discourse/lib/register-topic-footer-button"; import { formattedReminderTime } from "discourse/lib/bookmark"; +import { registerTopicFooterButton } from "discourse/lib/register-topic-footer-button"; +import showModal from "discourse/lib/show-modal"; const SHARE_PRIORITY = 1000; const BOOKMARK_PRIORITY = 900; diff --git a/app/assets/javascripts/discourse/app/initializers/webview-background.js b/app/assets/javascripts/discourse/app/initializers/webview-background.js index b3946c5495..72993a75fe 100644 --- a/app/assets/javascripts/discourse/app/initializers/webview-background.js +++ b/app/assets/javascripts/discourse/app/initializers/webview-background.js @@ -1,5 +1,5 @@ -import { later } from "@ember/runloop"; import { isAppWebview, postRNWebviewMessage } from "discourse/lib/utilities"; +import { later } from "@ember/runloop"; // Send bg color to webview so iOS status bar matches site theme export default { diff --git a/app/assets/javascripts/discourse/app/lib/ajax.js b/app/assets/javascripts/discourse/app/lib/ajax.js index 79fba4949c..36330cabf3 100644 --- a/app/assets/javascripts/discourse/app/lib/ajax.js +++ b/app/assets/javascripts/discourse/app/lib/ajax.js @@ -1,11 +1,11 @@ +import { Promise } from "rsvp"; +import Session from "discourse/models/session"; +import Site from "discourse/models/site"; +import User from "discourse/models/user"; import getURL from "discourse-common/lib/get-url"; +import { isTesting } from "discourse-common/config/environment"; import { run } from "@ember/runloop"; import userPresent from "discourse/lib/user-presence"; -import Session from "discourse/models/session"; -import { Promise } from "rsvp"; -import Site from "discourse/models/site"; -import { isTesting } from "discourse-common/config/environment"; -import User from "discourse/models/user"; let _trackView = false; let _transientHeader = null; diff --git a/app/assets/javascripts/discourse/app/lib/autocomplete.js b/app/assets/javascripts/discourse/app/lib/autocomplete.js index b9b32f6ff5..f08c7851d2 100644 --- a/app/assets/javascripts/discourse/app/lib/autocomplete.js +++ b/app/assets/javascripts/discourse/app/lib/autocomplete.js @@ -1,8 +1,8 @@ +import { cancel, debounce, later } from "@ember/runloop"; +import { caretPosition, setCaretPosition } from "discourse/lib/utilities"; import { INPUT_DELAY } from "discourse-common/config/environment"; -import { debounce, cancel, later } from "@ember/runloop"; -import { iconHTML } from "discourse-common/lib/icon-library"; -import { setCaretPosition, caretPosition } from "discourse/lib/utilities"; import Site from "discourse/models/site"; +import { iconHTML } from "discourse-common/lib/icon-library"; /** This is a jQuery plugin to support autocompleting values in our text fields. diff --git a/app/assets/javascripts/discourse/app/lib/category-hashtags.js b/app/assets/javascripts/discourse/app/lib/category-hashtags.js index 2aa56c3bbc..75c85616f9 100644 --- a/app/assets/javascripts/discourse/app/lib/category-hashtags.js +++ b/app/assets/javascripts/discourse/app/lib/category-hashtags.js @@ -1,7 +1,7 @@ export const SEPARATOR = ":"; import { - caretRowCol, caretPosition, + caretRowCol, inCodeBlock, } from "discourse/lib/utilities"; diff --git a/app/assets/javascripts/discourse/app/lib/category-tag-search.js b/app/assets/javascripts/discourse/app/lib/category-tag-search.js index 460e4770cb..95fcdab9e0 100644 --- a/app/assets/javascripts/discourse/app/lib/category-tag-search.js +++ b/app/assets/javascripts/discourse/app/lib/category-tag-search.js @@ -1,11 +1,11 @@ -import getURL from "discourse-common/lib/get-url"; -import discourseDebounce from "discourse/lib/debounce"; +import { cancel, later } from "@ember/runloop"; import { CANCELLED_STATUS } from "discourse/lib/autocomplete"; import Category from "discourse/models/category"; -import { TAG_HASHTAG_POSTFIX } from "discourse/lib/tag-hashtags"; -import { SEPARATOR } from "discourse/lib/category-hashtags"; import { Promise } from "rsvp"; -import { later, cancel } from "@ember/runloop"; +import { SEPARATOR } from "discourse/lib/category-hashtags"; +import { TAG_HASHTAG_POSTFIX } from "discourse/lib/tag-hashtags"; +import discourseDebounce from "discourse/lib/debounce"; +import getURL from "discourse-common/lib/get-url"; import { isTesting } from "discourse-common/config/environment"; let cache = {}; diff --git a/app/assets/javascripts/discourse/app/lib/click-track.js b/app/assets/javascripts/discourse/app/lib/click-track.js index a3524c760e..28744e2911 100644 --- a/app/assets/javascripts/discourse/app/lib/click-track.js +++ b/app/assets/javascripts/discourse/app/lib/click-track.js @@ -1,14 +1,14 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import { later } from "@ember/runloop"; -import { ajax } from "discourse/lib/ajax"; import DiscourseURL from "discourse/lib/url"; -import { wantsNewWindow } from "discourse/lib/intercept-click"; -import { selectedText } from "discourse/lib/utilities"; +import I18n from "I18n"; import { Promise } from "rsvp"; -import { isTesting } from "discourse-common/config/environment"; import User from "discourse/models/user"; +import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; +import getURL from "discourse-common/lib/get-url"; +import { isTesting } from "discourse-common/config/environment"; +import { later } from "@ember/runloop"; +import { selectedText } from "discourse/lib/utilities"; +import { wantsNewWindow } from "discourse/lib/intercept-click"; export function isValidLink($link) { // .hashtag == category/tag link diff --git a/app/assets/javascripts/discourse/app/lib/color-scheme-picker.js b/app/assets/javascripts/discourse/app/lib/color-scheme-picker.js index 5ddb5be9fd..2370a91ba6 100644 --- a/app/assets/javascripts/discourse/app/lib/color-scheme-picker.js +++ b/app/assets/javascripts/discourse/app/lib/color-scheme-picker.js @@ -1,6 +1,6 @@ +import cookie, { removeCookie } from "discourse/lib/cookie"; import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; -import cookie, { removeCookie } from "discourse/lib/cookie"; export function listColorSchemes(site, options = {}) { let schemes = site.get("user_color_schemes"); diff --git a/app/assets/javascripts/discourse/app/lib/computed.js b/app/assets/javascripts/discourse/app/lib/computed.js index f1640b18d2..b0cd28c7eb 100644 --- a/app/assets/javascripts/discourse/app/lib/computed.js +++ b/app/assets/javascripts/discourse/app/lib/computed.js @@ -1,6 +1,6 @@ -import getURL from "discourse-common/lib/get-url"; import I18n from "I18n"; import { computed } from "@ember/object"; +import getURL from "discourse-common/lib/get-url"; import { htmlSafe as htmlSafeTemplateHelper } from "@ember/template"; function addonFmt(str, formats) { diff --git a/app/assets/javascripts/discourse/app/lib/desktop-notifications.js b/app/assets/javascripts/discourse/app/lib/desktop-notifications.js index 2ec39fde56..5513b021ee 100644 --- a/app/assets/javascripts/discourse/app/lib/desktop-notifications.js +++ b/app/assets/javascripts/discourse/app/lib/desktop-notifications.js @@ -1,11 +1,11 @@ -import I18n from "I18n"; -import { later } from "@ember/runloop"; import DiscourseURL from "discourse/lib/url"; +import I18n from "I18n"; import KeyValueStore from "discourse/lib/key-value-store"; -import { formatUsername } from "discourse/lib/utilities"; import { Promise } from "rsvp"; import Site from "discourse/models/site"; import User from "discourse/models/user"; +import { formatUsername } from "discourse/lib/utilities"; +import { later } from "@ember/runloop"; let primaryTab = false; let liveEnabled = false; diff --git a/app/assets/javascripts/discourse/app/lib/export-csv.js b/app/assets/javascripts/discourse/app/lib/export-csv.js index d1dda9cef2..b259fcc865 100644 --- a/app/assets/javascripts/discourse/app/lib/export-csv.js +++ b/app/assets/javascripts/discourse/app/lib/export-csv.js @@ -1,7 +1,7 @@ import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; -import { popupAjaxError } from "discourse/lib/ajax-error"; import bootbox from "bootbox"; +import { popupAjaxError } from "discourse/lib/ajax-error"; function exportEntityByType(type, entity, args) { return ajax("/export_csv/export_entity.json", { diff --git a/app/assets/javascripts/discourse/app/lib/eyeline.js b/app/assets/javascripts/discourse/app/lib/eyeline.js index 9190bf05dc..f7f318865d 100644 --- a/app/assets/javascripts/discourse/app/lib/eyeline.js +++ b/app/assets/javascripts/discourse/app/lib/eyeline.js @@ -1,5 +1,5 @@ -import { isTesting } from "discourse-common/config/environment"; import AppEvents from "discourse/services/app-events"; +import { isTesting } from "discourse-common/config/environment"; let _skipUpdate; let _rootElement; diff --git a/app/assets/javascripts/discourse/app/lib/formatter.js b/app/assets/javascripts/discourse/app/lib/formatter.js index 6415fa08a5..616358521d 100644 --- a/app/assets/javascripts/discourse/app/lib/formatter.js +++ b/app/assets/javascripts/discourse/app/lib/formatter.js @@ -1,5 +1,5 @@ -import { helperContext } from "discourse-common/lib/helpers"; import I18n from "I18n"; +import { helperContext } from "discourse-common/lib/helpers"; export function shortDate(date) { return moment(date).format(I18n.t("dates.medium.date_year")); diff --git a/app/assets/javascripts/discourse/app/lib/highlight-syntax.js b/app/assets/javascripts/discourse/app/lib/highlight-syntax.js index 4ca0162c09..3a1a5d9b86 100644 --- a/app/assets/javascripts/discourse/app/lib/highlight-syntax.js +++ b/app/assets/javascripts/discourse/app/lib/highlight-syntax.js @@ -1,5 +1,5 @@ -import loadScript from "discourse/lib/load-script"; import deprecated from "discourse-common/lib/deprecated"; +import loadScript from "discourse/lib/load-script"; /*global hljs:true */ let _moreLanguages = []; diff --git a/app/assets/javascripts/discourse/app/lib/keyboard-shortcuts.js b/app/assets/javascripts/discourse/app/lib/keyboard-shortcuts.js index dabad15316..c49d279ca4 100644 --- a/app/assets/javascripts/discourse/app/lib/keyboard-shortcuts.js +++ b/app/assets/javascripts/discourse/app/lib/keyboard-shortcuts.js @@ -1,13 +1,13 @@ -import { later, run, throttle, schedule } from "@ember/runloop"; -import DiscourseURL from "discourse/lib/url"; -import Composer from "discourse/models/composer"; -import { minimumOffset } from "discourse/lib/offset-calculator"; -import { ajax } from "discourse/lib/ajax"; -import { INPUT_DELAY } from "discourse-common/config/environment"; +import { later, run, schedule, throttle } from "@ember/runloop"; import { nextTopicUrl, previousTopicUrl, } from "discourse/lib/topic-list-tracker"; +import Composer from "discourse/models/composer"; +import DiscourseURL from "discourse/lib/url"; +import { INPUT_DELAY } from "discourse-common/config/environment"; +import { ajax } from "discourse/lib/ajax"; +import { minimumOffset } from "discourse/lib/offset-calculator"; const DEFAULT_BINDINGS = { "!": { postAction: "showFlags" }, diff --git a/app/assets/javascripts/discourse/app/lib/lightbox.js b/app/assets/javascripts/discourse/app/lib/lightbox.js index 7bd934db2e..28563fb06d 100644 --- a/app/assets/javascripts/discourse/app/lib/lightbox.js +++ b/app/assets/javascripts/discourse/app/lib/lightbox.js @@ -1,13 +1,13 @@ -import I18n from "I18n"; -import loadScript from "discourse/lib/load-script"; import { escapeExpression, isAppWebview, postRNWebviewMessage, } from "discourse/lib/utilities"; +import I18n from "I18n"; +import User from "discourse/models/user"; +import loadScript from "discourse/lib/load-script"; import { renderIcon } from "discourse-common/lib/icon-library"; import { spinnerHTML } from "discourse/helpers/loading-spinner"; -import User from "discourse/models/user"; export default function (elem, siteSettings) { if (!elem) { diff --git a/app/assets/javascripts/discourse/app/lib/link-hashtags.js b/app/assets/javascripts/discourse/app/lib/link-hashtags.js index 202b9bb1b8..d09cbbdda1 100644 --- a/app/assets/javascripts/discourse/app/lib/link-hashtags.js +++ b/app/assets/javascripts/discourse/app/lib/link-hashtags.js @@ -1,7 +1,7 @@ -import { schedule } from "@ember/runloop"; +import { TAG_HASHTAG_POSTFIX } from "discourse/lib/tag-hashtags"; import { ajax } from "discourse/lib/ajax"; import { replaceSpan } from "discourse/lib/category-hashtags"; -import { TAG_HASHTAG_POSTFIX } from "discourse/lib/tag-hashtags"; +import { schedule } from "@ember/runloop"; const categoryHashtags = {}; const tagHashtags = {}; diff --git a/app/assets/javascripts/discourse/app/lib/link-mentions.js b/app/assets/javascripts/discourse/app/lib/link-mentions.js index 915c683fc3..fa3ff8ec0b 100644 --- a/app/assets/javascripts/discourse/app/lib/link-mentions.js +++ b/app/assets/javascripts/discourse/app/lib/link-mentions.js @@ -1,8 +1,8 @@ +import { ajax } from "discourse/lib/ajax"; +import { formatUsername } from "discourse/lib/utilities"; import getURL from "discourse-common/lib/get-url"; import { schedule } from "@ember/runloop"; -import { ajax } from "discourse/lib/ajax"; import { userPath } from "discourse/lib/url"; -import { formatUsername } from "discourse/lib/utilities"; let maxGroupMention; diff --git a/app/assets/javascripts/discourse/app/lib/load-oneboxes.js b/app/assets/javascripts/discourse/app/lib/load-oneboxes.js index c07d6abb48..7a88039178 100644 --- a/app/assets/javascripts/discourse/app/lib/load-oneboxes.js +++ b/app/assets/javascripts/discourse/app/lib/load-oneboxes.js @@ -1,5 +1,5 @@ +import { LOADING_ONEBOX_CSS_CLASS, load } from "pretty-text/oneboxer"; import { applyInlineOneboxes } from "pretty-text/inline-oneboxer"; -import { load, LOADING_ONEBOX_CSS_CLASS } from "pretty-text/oneboxer"; export function loadOneboxes( container, diff --git a/app/assets/javascripts/discourse/app/lib/load-script.js b/app/assets/javascripts/discourse/app/lib/load-script.js index 004be25f8b..9eebebff36 100644 --- a/app/assets/javascripts/discourse/app/lib/load-script.js +++ b/app/assets/javascripts/discourse/app/lib/load-script.js @@ -1,8 +1,8 @@ import getURL, { getURLWithCDN } from "discourse-common/lib/get-url"; -import { run } from "@ember/runloop"; -import { ajax } from "discourse/lib/ajax"; import { PUBLIC_JS_VERSIONS } from "discourse/lib/public-js-versions"; import { Promise } from "rsvp"; +import { ajax } from "discourse/lib/ajax"; +import { run } from "@ember/runloop"; const _loaded = {}; const _loading = {}; diff --git a/app/assets/javascripts/discourse/app/lib/lock-on.js b/app/assets/javascripts/discourse/app/lib/lock-on.js index 941e7d4a98..74df39c2ca 100644 --- a/app/assets/javascripts/discourse/app/lib/lock-on.js +++ b/app/assets/javascripts/discourse/app/lib/lock-on.js @@ -1,5 +1,5 @@ -import { minimumOffset } from "discourse/lib/offset-calculator"; import { bind } from "discourse-common/utils/decorators"; +import { minimumOffset } from "discourse/lib/offset-calculator"; // Dear traveller, you are entering a zone where we are at war with the browser. // The browser is insisting on positioning scrollTop per the location it was in diff --git a/app/assets/javascripts/discourse/app/lib/logout.js b/app/assets/javascripts/discourse/app/lib/logout.js index e1d73befef..637d85764d 100644 --- a/app/assets/javascripts/discourse/app/lib/logout.js +++ b/app/assets/javascripts/discourse/app/lib/logout.js @@ -1,6 +1,6 @@ import getURL from "discourse-common/lib/get-url"; -import { isEmpty } from "@ember/utils"; import { helperContext } from "discourse-common/lib/helpers"; +import { isEmpty } from "@ember/utils"; export default function logout({ redirect } = {}) { const ctx = helperContext(); diff --git a/app/assets/javascripts/discourse/app/lib/plugin-api.js b/app/assets/javascripts/discourse/app/lib/plugin-api.js index 8bdce675b9..b536e80dbb 100644 --- a/app/assets/javascripts/discourse/app/lib/plugin-api.js +++ b/app/assets/javascripts/discourse/app/lib/plugin-api.js @@ -1,73 +1,73 @@ -import deprecated from "discourse-common/lib/deprecated"; -import { addDecorator } from "discourse/widgets/post-cooked"; -import { addPluginOutletDecorator } from "discourse/components/plugin-connector"; -import { addTopicTitleDecorator } from "discourse/components/topic-title"; -import DiscourseBanner from "discourse/components/discourse-banner"; -import { addButton, removeButton } from "discourse/widgets/post-menu"; -import { includeAttributes } from "discourse/lib/transform-post"; -import { registerHighlightJSLanguage } from "discourse/lib/highlight-syntax"; -import { addToolbarCallback } from "discourse/components/d-editor"; -import { addWidgetCleanCallback } from "discourse/components/mount-widget"; -import { addGlobalNotice } from "discourse/components/global-notice"; -import { - createWidget, - reopenWidget, - decorateWidget, - changeSetting, - queryRegistry, -} from "discourse/widgets/widget"; -import { - preventCloak, - addPostTransformCallback, -} from "discourse/widgets/post-stream"; -import { h } from "virtual-dom"; -import { addPopupMenuOptionsCallback } from "discourse/controllers/composer"; -import { extraConnectorClass } from "discourse/lib/plugin-connectors"; -import { addPostSmallActionIcon } from "discourse/widgets/post-small-action"; -import { registerTopicFooterButton } from "discourse/lib/register-topic-footer-button"; -import { addDiscoveryQueryParam } from "discourse/controllers/discovery-sortable"; -import { addTagsHtmlCallback } from "discourse/lib/render-tags"; -import { addUserMenuGlyph } from "discourse/widgets/user-menu"; -import { addPostClassesCallback } from "discourse/widgets/post"; -import { - attachAdditionalPanel, - addToHeaderIcons, -} from "discourse/widgets/header"; -import { - registerIconRenderer, - replaceIcon, - iconNode, -} from "discourse-common/lib/icon-library"; -import { replaceTagRenderer } from "discourse/lib/render-tag"; -import { addNavItem } from "discourse/models/nav-item"; -import { replaceFormatter } from "discourse/lib/utilities"; -import { modifySelectKit } from "select-kit/mixins/plugin-api"; -import { addGTMPageChangedCallback } from "discourse/lib/page-tracker"; -import { registerCustomAvatarHelper } from "discourse/helpers/user-avatar"; -import { addUsernameSelectorDecorator } from "discourse/helpers/decorate-username-selector"; -import { disableNameSuppression } from "discourse/widgets/poster-name"; -import { registerCustomPostMessageCallback as registerCustomPostMessageCallback1 } from "discourse/controllers/topic"; -import Sharing from "discourse/lib/sharing"; import ComposerEditor, { addComposerUploadHandler, addComposerUploadMarkdownResolver, } from "discourse/components/composer-editor"; -import { addCategorySortCriteria } from "discourse/components/edit-category-settings"; +import { addButton, removeButton } from "discourse/widgets/post-menu"; import { addExtraIconRenderer, replaceCategoryLinkRenderer, } from "discourse/helpers/category-link"; -import Composer from "discourse/models/composer"; -import { on } from "@ember/object/evented"; -import { addQuickAccessProfileItem } from "discourse/widgets/quick-access-profile"; -import KeyboardShortcuts from "discourse/lib/keyboard-shortcuts"; -import { addFeaturedLinkMetaDecorator } from "discourse/lib/render-topic-featured-link"; -import { getOwner } from "discourse-common/lib/get-owner"; -import { addAdvancedSearchOptions } from "discourse/components/search-advanced-options"; +import { + addPostTransformCallback, + preventCloak, +} from "discourse/widgets/post-stream"; import { addSaveableUserField, addSaveableUserOptionField, } from "discourse/models/user"; +import { + addToHeaderIcons, + attachAdditionalPanel, +} from "discourse/widgets/header"; +import { + changeSetting, + createWidget, + decorateWidget, + queryRegistry, + reopenWidget, +} from "discourse/widgets/widget"; +import { + iconNode, + registerIconRenderer, + replaceIcon, +} from "discourse-common/lib/icon-library"; +import Composer from "discourse/models/composer"; +import DiscourseBanner from "discourse/components/discourse-banner"; +import KeyboardShortcuts from "discourse/lib/keyboard-shortcuts"; +import Sharing from "discourse/lib/sharing"; +import { addAdvancedSearchOptions } from "discourse/components/search-advanced-options"; +import { addCategorySortCriteria } from "discourse/components/edit-category-settings"; +import { addDecorator } from "discourse/widgets/post-cooked"; +import { addDiscoveryQueryParam } from "discourse/controllers/discovery-sortable"; +import { addFeaturedLinkMetaDecorator } from "discourse/lib/render-topic-featured-link"; +import { addGTMPageChangedCallback } from "discourse/lib/page-tracker"; +import { addGlobalNotice } from "discourse/components/global-notice"; +import { addNavItem } from "discourse/models/nav-item"; +import { addPluginOutletDecorator } from "discourse/components/plugin-connector"; +import { addPopupMenuOptionsCallback } from "discourse/controllers/composer"; +import { addPostClassesCallback } from "discourse/widgets/post"; +import { addPostSmallActionIcon } from "discourse/widgets/post-small-action"; +import { addQuickAccessProfileItem } from "discourse/widgets/quick-access-profile"; +import { addTagsHtmlCallback } from "discourse/lib/render-tags"; +import { addToolbarCallback } from "discourse/components/d-editor"; +import { addTopicTitleDecorator } from "discourse/components/topic-title"; +import { addUserMenuGlyph } from "discourse/widgets/user-menu"; +import { addUsernameSelectorDecorator } from "discourse/helpers/decorate-username-selector"; +import { addWidgetCleanCallback } from "discourse/components/mount-widget"; +import deprecated from "discourse-common/lib/deprecated"; +import { disableNameSuppression } from "discourse/widgets/poster-name"; +import { extraConnectorClass } from "discourse/lib/plugin-connectors"; +import { getOwner } from "discourse-common/lib/get-owner"; +import { h } from "virtual-dom"; +import { includeAttributes } from "discourse/lib/transform-post"; +import { modifySelectKit } from "select-kit/mixins/plugin-api"; +import { on } from "@ember/object/evented"; +import { registerCustomAvatarHelper } from "discourse/helpers/user-avatar"; +import { registerCustomPostMessageCallback as registerCustomPostMessageCallback1 } from "discourse/controllers/topic"; +import { registerHighlightJSLanguage } from "discourse/lib/highlight-syntax"; +import { registerTopicFooterButton } from "discourse/lib/register-topic-footer-button"; +import { replaceFormatter } from "discourse/lib/utilities"; +import { replaceTagRenderer } from "discourse/lib/render-tag"; // If you add any methods to the API ensure you bump up this number const PLUGIN_API_VERSION = "0.11.1"; diff --git a/app/assets/javascripts/discourse/app/lib/plugin-connectors.js b/app/assets/javascripts/discourse/app/lib/plugin-connectors.js index a722b7cd60..16b7fafdb3 100644 --- a/app/assets/javascripts/discourse/app/lib/plugin-connectors.js +++ b/app/assets/javascripts/discourse/app/lib/plugin-connectors.js @@ -1,6 +1,6 @@ import Site from "discourse/models/site"; -import deprecated from "discourse-common/lib/deprecated"; import { buildRawConnectorCache } from "discourse-common/lib/raw-templates"; +import deprecated from "discourse-common/lib/deprecated"; let _connectorCache; let _rawConnectorCache; diff --git a/app/assets/javascripts/discourse/app/lib/push-notifications.js b/app/assets/javascripts/discourse/app/lib/push-notifications.js index 40d4f27a2c..4c21b86e3f 100644 --- a/app/assets/javascripts/discourse/app/lib/push-notifications.js +++ b/app/assets/javascripts/discourse/app/lib/push-notifications.js @@ -1,5 +1,5 @@ -import { ajax } from "discourse/lib/ajax"; import KeyValueStore from "discourse/lib/key-value-store"; +import { ajax } from "discourse/lib/ajax"; export const keyValueStore = new KeyValueStore("discourse_push_notifications_"); diff --git a/app/assets/javascripts/discourse/app/lib/put-cursor-at-end.js b/app/assets/javascripts/discourse/app/lib/put-cursor-at-end.js index a8c483e479..8286036b4f 100644 --- a/app/assets/javascripts/discourse/app/lib/put-cursor-at-end.js +++ b/app/assets/javascripts/discourse/app/lib/put-cursor-at-end.js @@ -1,5 +1,5 @@ -import positioningWorkaround from "discourse/lib/safari-hacks"; import { isAppleDevice } from "discourse/lib/utilities"; +import positioningWorkaround from "discourse/lib/safari-hacks"; export default function (element) { if (isAppleDevice() && positioningWorkaround.touchstartEvent) { diff --git a/app/assets/javascripts/discourse/app/lib/register-topic-footer-button.js b/app/assets/javascripts/discourse/app/lib/register-topic-footer-button.js index 27f6130c10..cdafab891f 100644 --- a/app/assets/javascripts/discourse/app/lib/register-topic-footer-button.js +++ b/app/assets/javascripts/discourse/app/lib/register-topic-footer-button.js @@ -1,6 +1,6 @@ import I18n from "I18n"; -import error from "@ember/error"; import { computed } from "@ember/object"; +import error from "@ember/error"; let _topicFooterButtons = {}; diff --git a/app/assets/javascripts/discourse/app/lib/render-tag.js b/app/assets/javascripts/discourse/app/lib/render-tag.js index fbc7ab62c8..d545ad10bc 100644 --- a/app/assets/javascripts/discourse/app/lib/render-tag.js +++ b/app/assets/javascripts/discourse/app/lib/render-tag.js @@ -1,6 +1,6 @@ -import getURL from "discourse-common/lib/get-url"; import User from "discourse/models/user"; import { escapeExpression } from "discourse/lib/utilities"; +import getURL from "discourse-common/lib/get-url"; import { helperContext } from "discourse-common/lib/helpers"; let _renderer = defaultRenderTag; diff --git a/app/assets/javascripts/discourse/app/lib/render-topic-featured-link.js b/app/assets/javascripts/discourse/app/lib/render-topic-featured-link.js index 13d83c0064..5c3f0b4b24 100644 --- a/app/assets/javascripts/discourse/app/lib/render-topic-featured-link.js +++ b/app/assets/javascripts/discourse/app/lib/render-topic-featured-link.js @@ -1,6 +1,6 @@ +import User from "discourse/models/user"; import { h } from "virtual-dom"; import { renderIcon } from "discourse-common/lib/icon-library"; -import User from "discourse/models/user"; const _decorators = []; diff --git a/app/assets/javascripts/discourse/app/lib/reports-loader.js b/app/assets/javascripts/discourse/app/lib/reports-loader.js index 675f296ef9..e0b108b7c7 100644 --- a/app/assets/javascripts/discourse/app/lib/reports-loader.js +++ b/app/assets/javascripts/discourse/app/lib/reports-loader.js @@ -1,5 +1,5 @@ -import { run } from "@ember/runloop"; import { ajax } from "discourse/lib/ajax"; +import { run } from "@ember/runloop"; const { debounce } = run; let _queue = []; diff --git a/app/assets/javascripts/discourse/app/lib/safari-hacks.js b/app/assets/javascripts/discourse/app/lib/safari-hacks.js index 03e286d605..7ecdb18b89 100644 --- a/app/assets/javascripts/discourse/app/lib/safari-hacks.js +++ b/app/assets/javascripts/discourse/app/lib/safari-hacks.js @@ -1,11 +1,11 @@ -import { later } from "@ember/runloop"; -import discourseDebounce from "discourse/lib/debounce"; import { - safariHacksDisabled, iOSWithVisualViewport, + safariHacksDisabled, } from "discourse/lib/utilities"; import { INPUT_DELAY } from "discourse-common/config/environment"; +import discourseDebounce from "discourse/lib/debounce"; import { helperContext } from "discourse-common/lib/helpers"; +import { later } from "@ember/runloop"; // TODO: remove calcHeight once iOS 13 adoption > 90% // In iOS 13 and up we use visualViewport API to calculate height diff --git a/app/assets/javascripts/discourse/app/lib/screen-track.js b/app/assets/javascripts/discourse/app/lib/screen-track.js index 5ef5798967..40bc56104e 100644 --- a/app/assets/javascripts/discourse/app/lib/screen-track.js +++ b/app/assets/javascripts/discourse/app/lib/screen-track.js @@ -1,6 +1,6 @@ import { ajax } from "discourse/lib/ajax"; -import { isTesting } from "discourse-common/config/environment"; import { bind } from "discourse-common/utils/decorators"; +import { isTesting } from "discourse-common/config/environment"; // We use this class to track how long posts in a topic are on the screen. const PAUSE_UNLESS_SCROLLED = 1000 * 60 * 3; diff --git a/app/assets/javascripts/discourse/app/lib/search.js b/app/assets/javascripts/discourse/app/lib/search.js index fe5d7a6cf0..0b0f9ecb2f 100644 --- a/app/assets/javascripts/discourse/app/lib/search.js +++ b/app/assets/javascripts/discourse/app/lib/search.js @@ -1,19 +1,19 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import EmberObject from "@ember/object"; -import { ajax } from "discourse/lib/ajax"; -import { findRawTemplate } from "discourse-common/lib/raw-templates"; import Category from "discourse/models/category"; -import { search as searchCategoryTag } from "discourse/lib/category-tag-search"; -import userSearch from "discourse/lib/user-search"; -import { userPath } from "discourse/lib/url"; -import { emojiUnescape } from "discourse/lib/text"; -import User from "discourse/models/user"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; import Post from "discourse/models/post"; import Topic from "discourse/models/topic"; -import { escapeExpression } from "discourse/lib/utilities"; +import User from "discourse/models/user"; +import { ajax } from "discourse/lib/ajax"; import { deepMerge } from "discourse-common/lib/object"; +import { emojiUnescape } from "discourse/lib/text"; +import { escapeExpression } from "discourse/lib/utilities"; +import { findRawTemplate } from "discourse-common/lib/raw-templates"; +import getURL from "discourse-common/lib/get-url"; +import { isEmpty } from "@ember/utils"; +import { search as searchCategoryTag } from "discourse/lib/category-tag-search"; +import { userPath } from "discourse/lib/url"; +import userSearch from "discourse/lib/user-search"; export function translateResults(results, opts) { opts = opts || {}; diff --git a/app/assets/javascripts/discourse/app/lib/static-route-builder.js b/app/assets/javascripts/discourse/app/lib/static-route-builder.js index c2056a7a15..200714b4f3 100644 --- a/app/assets/javascripts/discourse/app/lib/static-route-builder.js +++ b/app/assets/javascripts/discourse/app/lib/static-route-builder.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; -import DiscourseRoute from "discourse/routes/discourse"; -import StaticPage from "discourse/models/static-page"; import DiscourseURL, { jumpToElement } from "discourse/lib/url"; +import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; +import StaticPage from "discourse/models/static-page"; const configs = { faq: "faq_url", diff --git a/app/assets/javascripts/discourse/app/lib/text.js b/app/assets/javascripts/discourse/app/lib/text.js index a46500e5d4..e20fb6ade3 100644 --- a/app/assets/javascripts/discourse/app/lib/text.js +++ b/app/assets/javascripts/discourse/app/lib/text.js @@ -1,14 +1,14 @@ -import { getURLWithCDN } from "discourse-common/lib/get-url"; import PrettyText, { buildOptions } from "pretty-text/pretty-text"; -import { performEmojiUnescape, buildEmojiUrl } from "pretty-text/emoji"; +import { buildEmojiUrl, performEmojiUnescape } from "pretty-text/emoji"; import AllowLister from "pretty-text/allow-lister"; -import { sanitize as textSanitize } from "pretty-text/sanitizer"; -import loadScript from "discourse/lib/load-script"; -import { formatUsername } from "discourse/lib/utilities"; import { Promise } from "rsvp"; -import { htmlSafe } from "@ember/template"; -import { helperContext } from "discourse-common/lib/helpers"; import Session from "discourse/models/session"; +import { formatUsername } from "discourse/lib/utilities"; +import { getURLWithCDN } from "discourse-common/lib/get-url"; +import { helperContext } from "discourse-common/lib/helpers"; +import { htmlSafe } from "@ember/template"; +import loadScript from "discourse/lib/load-script"; +import { sanitize as textSanitize } from "pretty-text/sanitizer"; function getOpts(opts) { let context = helperContext(); diff --git a/app/assets/javascripts/discourse/app/lib/theme-selector.js b/app/assets/javascripts/discourse/app/lib/theme-selector.js index 8b9f194bbd..32326b4a88 100644 --- a/app/assets/javascripts/discourse/app/lib/theme-selector.js +++ b/app/assets/javascripts/discourse/app/lib/theme-selector.js @@ -1,6 +1,6 @@ +import cookie, { removeCookie } from "discourse/lib/cookie"; import I18n from "I18n"; import deprecated from "discourse-common/lib/deprecated"; -import cookie, { removeCookie } from "discourse/lib/cookie"; const keySelector = "meta[name=discourse_theme_ids]"; diff --git a/app/assets/javascripts/discourse/app/lib/uploads.js b/app/assets/javascripts/discourse/app/lib/uploads.js index 92e2677e9e..6be776006f 100644 --- a/app/assets/javascripts/discourse/app/lib/uploads.js +++ b/app/assets/javascripts/discourse/app/lib/uploads.js @@ -1,6 +1,6 @@ import I18n from "I18n"; -import { isAppleDevice } from "discourse/lib/utilities"; import bootbox from "bootbox"; +import { isAppleDevice } from "discourse/lib/utilities"; function isGUID(value) { return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test( diff --git a/app/assets/javascripts/discourse/app/lib/url.js b/app/assets/javascripts/discourse/app/lib/url.js index 919e369ee1..f58fbe5ac3 100644 --- a/app/assets/javascripts/discourse/app/lib/url.js +++ b/app/assets/javascripts/discourse/app/lib/url.js @@ -1,12 +1,12 @@ -import { isEmpty } from "@ember/utils"; -import EmberObject from "@ember/object"; -import { next, schedule } from "@ember/runloop"; -import offsetCalculator from "discourse/lib/offset-calculator"; -import LockOn from "discourse/lib/lock-on"; -import { defaultHomepage } from "discourse/lib/utilities"; -import User from "discourse/models/user"; import getURL, { withoutPrefix } from "discourse-common/lib/get-url"; +import { next, schedule } from "@ember/runloop"; +import EmberObject from "@ember/object"; +import LockOn from "discourse/lib/lock-on"; import Session from "discourse/models/session"; +import User from "discourse/models/user"; +import { defaultHomepage } from "discourse/lib/utilities"; +import { isEmpty } from "@ember/utils"; +import offsetCalculator from "discourse/lib/offset-calculator"; import { setOwner } from "@ember/application"; const rewrites = []; diff --git a/app/assets/javascripts/discourse/app/lib/user-search.js b/app/assets/javascripts/discourse/app/lib/user-search.js index 8c3caa5143..b68e0755e8 100644 --- a/app/assets/javascripts/discourse/app/lib/user-search.js +++ b/app/assets/javascripts/discourse/app/lib/user-search.js @@ -1,10 +1,10 @@ -import { isTesting } from "discourse-common/config/environment"; -import discourseDebounce from "discourse/lib/debounce"; +import { cancel, later } from "@ember/runloop"; import { CANCELLED_STATUS } from "discourse/lib/autocomplete"; -import { userPath } from "discourse/lib/url"; -import { emailValid } from "discourse/lib/utilities"; import { Promise } from "rsvp"; -import { later, cancel } from "@ember/runloop"; +import discourseDebounce from "discourse/lib/debounce"; +import { emailValid } from "discourse/lib/utilities"; +import { isTesting } from "discourse-common/config/environment"; +import { userPath } from "discourse/lib/url"; var cache = {}, cacheKey, diff --git a/app/assets/javascripts/discourse/app/lib/utilities.js b/app/assets/javascripts/discourse/app/lib/utilities.js index 5d0b5c9f3c..50b51d59ac 100644 --- a/app/assets/javascripts/discourse/app/lib/utilities.js +++ b/app/assets/javascripts/discourse/app/lib/utilities.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import { escape } from "pretty-text/sanitizer"; -import toMarkdown from "discourse/lib/to-markdown"; -import Handlebars from "handlebars"; import getURL, { getURLWithCDN } from "discourse-common/lib/get-url"; -import { helperContext } from "discourse-common/lib/helpers"; +import Handlebars from "handlebars"; +import I18n from "I18n"; import { deepMerge } from "discourse-common/lib/object"; +import { escape } from "pretty-text/sanitizer"; +import { helperContext } from "discourse-common/lib/helpers"; +import toMarkdown from "discourse/lib/to-markdown"; let _defaultHomepage; diff --git a/app/assets/javascripts/discourse/app/mapping-router.js b/app/assets/javascripts/discourse/app/mapping-router.js index 51bf14322b..289c09a9b5 100644 --- a/app/assets/javascripts/discourse/app/mapping-router.js +++ b/app/assets/javascripts/discourse/app/mapping-router.js @@ -1,9 +1,9 @@ import EmberRouter from "@ember/routing/router"; -import { defaultHomepage } from "discourse/lib/utilities"; -import { rewritePath } from "discourse/lib/url"; import Site from "discourse/models/site"; -import { isTesting } from "discourse-common/config/environment"; +import { defaultHomepage } from "discourse/lib/utilities"; import getURL from "discourse-common/lib/get-url"; +import { isTesting } from "discourse-common/config/environment"; +import { rewritePath } from "discourse/lib/url"; const BareRouter = EmberRouter.extend({ location: isTesting() ? "none" : "discourse-location", diff --git a/app/assets/javascripts/discourse/app/mixins/add-archetype-class.js b/app/assets/javascripts/discourse/app/mixins/add-archetype-class.js index 723826790c..3105319490 100644 --- a/app/assets/javascripts/discourse/app/mixins/add-archetype-class.js +++ b/app/assets/javascripts/discourse/app/mixins/add-archetype-class.js @@ -1,4 +1,4 @@ -import { on, observes } from "discourse-common/utils/decorators"; +import { observes, on } from "discourse-common/utils/decorators"; // Mix this in to a view that has a `archetype` property to automatically // add it to the body as the view is entered / left / model is changed. diff --git a/app/assets/javascripts/discourse/app/mixins/buffered-content.js b/app/assets/javascripts/discourse/app/mixins/buffered-content.js index 6dd9f09be4..9b6d0b6449 100644 --- a/app/assets/javascripts/discourse/app/mixins/buffered-content.js +++ b/app/assets/javascripts/discourse/app/mixins/buffered-content.js @@ -1,7 +1,7 @@ +import BufferedProxy from "ember-buffered-proxy/proxy"; import EmberObjectProxy from "@ember/object/proxy"; import Mixin from "@ember/object/mixin"; import { computed } from "@ember/object"; -import BufferedProxy from "ember-buffered-proxy/proxy"; export function bufferedProperty(property) { const mixin = { diff --git a/app/assets/javascripts/discourse/app/mixins/bulk-topic-selection.js b/app/assets/javascripts/discourse/app/mixins/bulk-topic-selection.js index 279fe79fa3..d539a14063 100644 --- a/app/assets/javascripts/discourse/app/mixins/bulk-topic-selection.js +++ b/app/assets/javascripts/discourse/app/mixins/bulk-topic-selection.js @@ -1,8 +1,8 @@ -import { alias } from "@ember/object/computed"; -import { NotificationLevels } from "discourse/lib/notification-levels"; -import { on } from "discourse-common/utils/decorators"; import Mixin from "@ember/object/mixin"; +import { NotificationLevels } from "discourse/lib/notification-levels"; import Topic from "discourse/models/topic"; +import { alias } from "@ember/object/computed"; +import { on } from "discourse-common/utils/decorators"; export default Mixin.create({ bulkSelectEnabled: false, diff --git a/app/assets/javascripts/discourse/app/mixins/can-check-emails.js b/app/assets/javascripts/discourse/app/mixins/can-check-emails.js index e856d615c9..d76250124f 100644 --- a/app/assets/javascripts/discourse/app/mixins/can-check-emails.js +++ b/app/assets/javascripts/discourse/app/mixins/can-check-emails.js @@ -1,4 +1,4 @@ -import { and, alias, or } from "@ember/object/computed"; +import { alias, and, or } from "@ember/object/computed"; import { propertyEqual, setting } from "discourse/lib/computed"; import Mixin from "@ember/object/mixin"; diff --git a/app/assets/javascripts/discourse/app/mixins/card-contents-base.js b/app/assets/javascripts/discourse/app/mixins/card-contents-base.js index 0a996f8056..2b67cd1bde 100644 --- a/app/assets/javascripts/discourse/app/mixins/card-contents-base.js +++ b/app/assets/javascripts/discourse/app/mixins/card-contents-base.js @@ -1,12 +1,12 @@ import { alias, match } from "@ember/object/computed"; import { next, schedule, throttle } from "@ember/runloop"; -import { wantsNewWindow } from "discourse/lib/intercept-click"; -import afterTransition from "discourse/lib/after-transition"; import DiscourseURL from "discourse/lib/url"; import Mixin from "@ember/object/mixin"; +import afterTransition from "discourse/lib/after-transition"; import { escapeExpression } from "discourse/lib/utilities"; import headerOutletHeights from "discourse/lib/header-outlet-height"; import { inject as service } from "@ember/service"; +import { wantsNewWindow } from "discourse/lib/intercept-click"; export default Mixin.create({ router: service(), diff --git a/app/assets/javascripts/discourse/app/mixins/cleans-up.js b/app/assets/javascripts/discourse/app/mixins/cleans-up.js index 753dad027c..054f770def 100644 --- a/app/assets/javascripts/discourse/app/mixins/cleans-up.js +++ b/app/assets/javascripts/discourse/app/mixins/cleans-up.js @@ -1,5 +1,5 @@ -import { on } from "@ember/object/evented"; import Mixin from "@ember/object/mixin"; +import { on } from "@ember/object/evented"; // Include this mixin if you want to be notified when the dom should be // cleaned (usually on route change.) diff --git a/app/assets/javascripts/discourse/app/mixins/docking.js b/app/assets/javascripts/discourse/app/mixins/docking.js index 302ac24af8..4147ae94de 100644 --- a/app/assets/javascripts/discourse/app/mixins/docking.js +++ b/app/assets/javascripts/discourse/app/mixins/docking.js @@ -1,5 +1,5 @@ +import { debounce, later } from "@ember/runloop"; import Mixin from "@ember/object/mixin"; -import { later, debounce } from "@ember/runloop"; const helper = { offset() { diff --git a/app/assets/javascripts/discourse/app/mixins/filter-mode.js b/app/assets/javascripts/discourse/app/mixins/filter-mode.js index ebf59bb1a8..22f3060968 100644 --- a/app/assets/javascripts/discourse/app/mixins/filter-mode.js +++ b/app/assets/javascripts/discourse/app/mixins/filter-mode.js @@ -1,6 +1,6 @@ +import Category from "discourse/models/category"; import Mixin from "@ember/object/mixin"; import { computed } from "@ember/object"; -import Category from "discourse/models/category"; export default Mixin.create({ filterModeInternal: computed( diff --git a/app/assets/javascripts/discourse/app/mixins/grant-badge-controller.js b/app/assets/javascripts/discourse/app/mixins/grant-badge-controller.js index a1820399f6..6858d44096 100644 --- a/app/assets/javascripts/discourse/app/mixins/grant-badge-controller.js +++ b/app/assets/javascripts/discourse/app/mixins/grant-badge-controller.js @@ -1,8 +1,8 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { empty } from "@ember/object/computed"; +import Mixin from "@ember/object/mixin"; import UserBadge from "discourse/models/user-badge"; import { convertIconClass } from "discourse-common/lib/icon-library"; -import Mixin from "@ember/object/mixin"; +import discourseComputed from "discourse-common/utils/decorators"; +import { empty } from "@ember/object/computed"; export default Mixin.create({ @discourseComputed("allBadges.[]", "userBadges.[]") diff --git a/app/assets/javascripts/discourse/app/mixins/load-more.js b/app/assets/javascripts/discourse/app/mixins/load-more.js index 421cb16d2c..4b2f5d4f76 100644 --- a/app/assets/javascripts/discourse/app/mixins/load-more.js +++ b/app/assets/javascripts/discourse/app/mixins/load-more.js @@ -1,7 +1,7 @@ import Eyeline from "discourse/lib/eyeline"; +import Mixin from "@ember/object/mixin"; import Scrolling from "discourse/mixins/scrolling"; import { on } from "discourse-common/utils/decorators"; -import Mixin from "@ember/object/mixin"; // Provides the ability to load more items for a view which is scrolled to the bottom. export default Mixin.create(Scrolling, { diff --git a/app/assets/javascripts/discourse/app/mixins/mobile-scroll-direction.js b/app/assets/javascripts/discourse/app/mixins/mobile-scroll-direction.js index 556831fb33..2be71c0d63 100644 --- a/app/assets/javascripts/discourse/app/mixins/mobile-scroll-direction.js +++ b/app/assets/javascripts/discourse/app/mixins/mobile-scroll-direction.js @@ -1,5 +1,5 @@ -import { debounce } from "@ember/runloop"; import Mixin from "@ember/object/mixin"; +import { debounce } from "@ember/runloop"; // Small buffer so that very tiny scrolls don't trigger mobile header switch const MOBILE_SCROLL_TOLERANCE = 5; diff --git a/app/assets/javascripts/discourse/app/mixins/modal-functionality.js b/app/assets/javascripts/discourse/app/mixins/modal-functionality.js index bc728628a4..6287199a75 100644 --- a/app/assets/javascripts/discourse/app/mixins/modal-functionality.js +++ b/app/assets/javascripts/discourse/app/mixins/modal-functionality.js @@ -1,5 +1,5 @@ -import showModal from "discourse/lib/show-modal"; import Mixin from "@ember/object/mixin"; +import showModal from "discourse/lib/show-modal"; export default Mixin.create({ flash(text, messageClass) { diff --git a/app/assets/javascripts/discourse/app/mixins/name-validation.js b/app/assets/javascripts/discourse/app/mixins/name-validation.js index 61b8c62344..52623f537e 100644 --- a/app/assets/javascripts/discourse/app/mixins/name-validation.js +++ b/app/assets/javascripts/discourse/app/mixins/name-validation.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import discourseComputed from "discourse-common/utils/decorators"; -import Mixin from "@ember/object/mixin"; import EmberObject from "@ember/object"; +import I18n from "I18n"; +import Mixin from "@ember/object/mixin"; +import discourseComputed from "discourse-common/utils/decorators"; +import { isEmpty } from "@ember/utils"; export default Mixin.create({ @discourseComputed() diff --git a/app/assets/javascripts/discourse/app/mixins/password-validation.js b/app/assets/javascripts/discourse/app/mixins/password-validation.js index 6511ec4bde..feb020cbf7 100644 --- a/app/assets/javascripts/discourse/app/mixins/password-validation.js +++ b/app/assets/javascripts/discourse/app/mixins/password-validation.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import discourseComputed from "discourse-common/utils/decorators"; -import Mixin from "@ember/object/mixin"; import EmberObject from "@ember/object"; +import I18n from "I18n"; +import Mixin from "@ember/object/mixin"; +import discourseComputed from "discourse-common/utils/decorators"; +import { isEmpty } from "@ember/utils"; export default Mixin.create({ rejectedPasswords: null, diff --git a/app/assets/javascripts/discourse/app/mixins/scroll-top.js b/app/assets/javascripts/discourse/app/mixins/scroll-top.js index 0e0ffc58f7..93c72ae445 100644 --- a/app/assets/javascripts/discourse/app/mixins/scroll-top.js +++ b/app/assets/javascripts/discourse/app/mixins/scroll-top.js @@ -1,8 +1,8 @@ -import { scheduleOnce } from "@ember/runloop"; import DiscourseURL from "discourse/lib/url"; -import { deprecated } from "discourse/mixins/scroll-top"; import Mixin from "@ember/object/mixin"; +import { deprecated } from "discourse/mixins/scroll-top"; import { isTesting } from "discourse-common/config/environment"; +import { scheduleOnce } from "@ember/runloop"; const context = { _scrollTop() { diff --git a/app/assets/javascripts/discourse/app/mixins/scrolling.js b/app/assets/javascripts/discourse/app/mixins/scrolling.js index 67b5fb81f6..f1df25463a 100644 --- a/app/assets/javascripts/discourse/app/mixins/scrolling.js +++ b/app/assets/javascripts/discourse/app/mixins/scrolling.js @@ -1,6 +1,6 @@ -import { scheduleOnce } from "@ember/runloop"; -import discourseDebounce from "discourse/lib/debounce"; import Mixin from "@ember/object/mixin"; +import discourseDebounce from "discourse/lib/debounce"; +import { scheduleOnce } from "@ember/runloop"; import { inject as service } from "@ember/service"; /** diff --git a/app/assets/javascripts/discourse/app/mixins/upload.js b/app/assets/javascripts/discourse/app/mixins/upload.js index 1298f498e4..b626f6c994 100644 --- a/app/assets/javascripts/discourse/app/mixins/upload.js +++ b/app/assets/javascripts/discourse/app/mixins/upload.js @@ -1,14 +1,14 @@ -import I18n from "I18n"; -import { warn } from "@ember/debug"; import { displayErrorForUpload, validateUploadedFiles, } from "discourse/lib/uploads"; -import getUrl from "discourse-common/lib/get-url"; -import { on } from "@ember/object/evented"; +import I18n from "I18n"; import Mixin from "@ember/object/mixin"; import bootbox from "bootbox"; import { deepMerge } from "discourse-common/lib/object"; +import getUrl from "discourse-common/lib/get-url"; +import { on } from "@ember/object/evented"; +import { warn } from "@ember/debug"; export default Mixin.create({ uploading: false, diff --git a/app/assets/javascripts/discourse/app/mixins/user-fields-validation.js b/app/assets/javascripts/discourse/app/mixins/user-fields-validation.js index 6aeb2470ff..1a503dfcc2 100644 --- a/app/assets/javascripts/discourse/app/mixins/user-fields-validation.js +++ b/app/assets/javascripts/discourse/app/mixins/user-fields-validation.js @@ -1,8 +1,8 @@ -import { isEmpty } from "@ember/utils"; -import EmberObject from "@ember/object"; import discourseComputed, { on } from "discourse-common/utils/decorators"; -import Mixin from "@ember/object/mixin"; +import EmberObject from "@ember/object"; import I18n from "I18n"; +import Mixin from "@ember/object/mixin"; +import { isEmpty } from "@ember/utils"; export default Mixin.create({ @on("init") diff --git a/app/assets/javascripts/discourse/app/mixins/username-validation.js b/app/assets/javascripts/discourse/app/mixins/username-validation.js index 09d13d2b29..9d26b91cea 100644 --- a/app/assets/javascripts/discourse/app/mixins/username-validation.js +++ b/app/assets/javascripts/discourse/app/mixins/username-validation.js @@ -1,11 +1,11 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import discourseDebounce from "discourse/lib/debounce"; -import { setting } from "discourse/lib/computed"; -import discourseComputed from "discourse-common/utils/decorators"; -import Mixin from "@ember/object/mixin"; import EmberObject from "@ember/object"; +import I18n from "I18n"; +import Mixin from "@ember/object/mixin"; import User from "discourse/models/user"; +import discourseComputed from "discourse-common/utils/decorators"; +import discourseDebounce from "discourse/lib/debounce"; +import { isEmpty } from "@ember/utils"; +import { setting } from "discourse/lib/computed"; export default Mixin.create({ uniqueUsernameValidation: null, diff --git a/app/assets/javascripts/discourse/app/models/action-summary.js b/app/assets/javascripts/discourse/app/models/action-summary.js index 7680d13110..2bf455aade 100644 --- a/app/assets/javascripts/discourse/app/models/action-summary.js +++ b/app/assets/javascripts/discourse/app/models/action-summary.js @@ -1,6 +1,6 @@ -import { or } from "@ember/object/computed"; -import { ajax } from "discourse/lib/ajax"; import RestModel from "discourse/models/rest"; +import { ajax } from "discourse/lib/ajax"; +import { or } from "@ember/object/computed"; import { popupAjaxError } from "discourse/lib/ajax-error"; export default RestModel.extend({ diff --git a/app/assets/javascripts/discourse/app/models/archetype.js b/app/assets/javascripts/discourse/app/models/archetype.js index bd4eedffe0..fb48513fbc 100644 --- a/app/assets/javascripts/discourse/app/models/archetype.js +++ b/app/assets/javascripts/discourse/app/models/archetype.js @@ -1,6 +1,6 @@ import { gt, not } from "@ember/object/computed"; -import { propertyEqual } from "discourse/lib/computed"; import RestModel from "discourse/models/rest"; +import { propertyEqual } from "discourse/lib/computed"; export default RestModel.extend({ hasOptions: gt("options.length", 0), diff --git a/app/assets/javascripts/discourse/app/models/badge-grouping.js b/app/assets/javascripts/discourse/app/models/badge-grouping.js index cd9b1cd037..e681d4f025 100644 --- a/app/assets/javascripts/discourse/app/models/badge-grouping.js +++ b/app/assets/javascripts/discourse/app/models/badge-grouping.js @@ -1,6 +1,6 @@ import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import RestModel from "discourse/models/rest"; +import discourseComputed from "discourse-common/utils/decorators"; export default RestModel.extend({ @discourseComputed("name") diff --git a/app/assets/javascripts/discourse/app/models/badge.js b/app/assets/javascripts/discourse/app/models/badge.js index 894f3fb09d..99648d7558 100644 --- a/app/assets/javascripts/discourse/app/models/badge.js +++ b/app/assets/javascripts/discourse/app/models/badge.js @@ -1,11 +1,11 @@ -import getURL from "discourse-common/lib/get-url"; -import discourseComputed from "discourse-common/utils/decorators"; -import { none } from "@ember/object/computed"; -import EmberObject from "@ember/object"; -import { ajax } from "discourse/lib/ajax"; import BadgeGrouping from "discourse/models/badge-grouping"; -import RestModel from "discourse/models/rest"; +import EmberObject from "@ember/object"; import { Promise } from "rsvp"; +import RestModel from "discourse/models/rest"; +import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; +import getURL from "discourse-common/lib/get-url"; +import { none } from "@ember/object/computed"; const Badge = RestModel.extend({ newBadge: none("id"), diff --git a/app/assets/javascripts/discourse/app/models/bookmark.js b/app/assets/javascripts/discourse/app/models/bookmark.js index 0c416b15ba..d65b32272b 100644 --- a/app/assets/javascripts/discourse/app/models/bookmark.js +++ b/app/assets/javascripts/discourse/app/models/bookmark.js @@ -1,16 +1,16 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; import Category from "discourse/models/category"; -import User from "discourse/models/user"; -import { fancyTitle } from "discourse/lib/topic-fancy-title"; -import { longDate } from "discourse/lib/formatter"; -import { none } from "@ember/object/computed"; -import { computed } from "@ember/object"; -import { ajax } from "discourse/lib/ajax"; +import I18n from "I18n"; import { Promise } from "rsvp"; import RestModel from "discourse/models/rest"; +import User from "discourse/models/user"; +import { ajax } from "discourse/lib/ajax"; +import { computed } from "@ember/object"; import discourseComputed from "discourse-common/utils/decorators"; +import { fancyTitle } from "discourse/lib/topic-fancy-title"; import { formattedReminderTime } from "discourse/lib/bookmark"; +import getURL from "discourse-common/lib/get-url"; +import { longDate } from "discourse/lib/formatter"; +import { none } from "@ember/object/computed"; export const AUTO_DELETE_PREFERENCES = { NEVER: 0, diff --git a/app/assets/javascripts/discourse/app/models/category-list.js b/app/assets/javascripts/discourse/app/models/category-list.js index cf4d89534d..f9c4cc552b 100644 --- a/app/assets/javascripts/discourse/app/models/category-list.js +++ b/app/assets/javascripts/discourse/app/models/category-list.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; import ArrayProxy from "@ember/array/proxy"; -import PreloadStore from "discourse/lib/preload-store"; -import { ajax } from "discourse/lib/ajax"; -import Topic from "discourse/models/topic"; import Category from "discourse/models/category"; +import I18n from "I18n"; +import PreloadStore from "discourse/lib/preload-store"; import Site from "discourse/models/site"; +import Topic from "discourse/models/topic"; +import { ajax } from "discourse/lib/ajax"; const CategoryList = ArrayProxy.extend({ init() { diff --git a/app/assets/javascripts/discourse/app/models/category.js b/app/assets/javascripts/discourse/app/models/category.js index 33c9afd2ed..c37eeeef85 100644 --- a/app/assets/javascripts/discourse/app/models/category.js +++ b/app/assets/javascripts/discourse/app/models/category.js @@ -1,13 +1,13 @@ -import getURL from "discourse-common/lib/get-url"; import discourseComputed, { on } from "discourse-common/utils/decorators"; -import { get } from "@ember/object"; -import { ajax } from "discourse/lib/ajax"; -import RestModel from "discourse/models/rest"; -import PermissionType from "discourse/models/permission-type"; import { NotificationLevels } from "discourse/lib/notification-levels"; +import PermissionType from "discourse/models/permission-type"; +import RestModel from "discourse/models/rest"; import Site from "discourse/models/site"; import User from "discourse/models/user"; +import { ajax } from "discourse/lib/ajax"; +import { get } from "@ember/object"; import { getOwner } from "discourse-common/lib/get-owner"; +import getURL from "discourse-common/lib/get-url"; const STAFF_GROUP_NAME = "staff"; diff --git a/app/assets/javascripts/discourse/app/models/composer.js b/app/assets/javascripts/discourse/app/models/composer.js index bf594f253c..271c1ae51e 100644 --- a/app/assets/javascripts/discourse/app/models/composer.js +++ b/app/assets/javascripts/discourse/app/models/composer.js @@ -1,28 +1,28 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import { reads, equal, not, or, and } from "@ember/object/computed"; import EmberObject, { set } from "@ember/object"; +import { and, equal, not, or, reads } from "@ember/object/computed"; import { cancel, later, next, throttle } from "@ember/runloop"; -import RestModel from "discourse/models/rest"; -import Topic from "discourse/models/topic"; -import { throwAjaxError } from "discourse/lib/ajax-error"; -import { QUOTE_REGEXP } from "discourse/lib/quote"; -import Draft from "discourse/models/draft"; import discourseComputed, { observes, on, } from "discourse-common/utils/decorators"; import { + emailValid, escapeExpression, tinyAvatar, - emailValid, } from "discourse/lib/utilities"; -import { propertyNotEqual } from "discourse/lib/computed"; +import Draft from "discourse/models/draft"; +import I18n from "I18n"; import { Promise } from "rsvp"; +import { QUOTE_REGEXP } from "discourse/lib/quote"; +import RestModel from "discourse/models/rest"; import Site from "discourse/models/site"; +import Topic from "discourse/models/topic"; import User from "discourse/models/user"; -import deprecated from "discourse-common/lib/deprecated"; import bootbox from "bootbox"; +import deprecated from "discourse-common/lib/deprecated"; +import { isEmpty } from "@ember/utils"; +import { propertyNotEqual } from "discourse/lib/computed"; +import { throwAjaxError } from "discourse/lib/ajax-error"; // The actions the composer can take export const CREATE_TOPIC = "createTopic", diff --git a/app/assets/javascripts/discourse/app/models/draft.js b/app/assets/javascripts/discourse/app/models/draft.js index 25bddd8329..5406c7f9b8 100644 --- a/app/assets/javascripts/discourse/app/models/draft.js +++ b/app/assets/javascripts/discourse/app/models/draft.js @@ -1,5 +1,5 @@ -import { ajax } from "discourse/lib/ajax"; import EmberObject from "@ember/object"; +import { ajax } from "discourse/lib/ajax"; const Draft = EmberObject.extend(); diff --git a/app/assets/javascripts/discourse/app/models/group-history.js b/app/assets/javascripts/discourse/app/models/group-history.js index 2b8fb34b21..ef1c6787f1 100644 --- a/app/assets/javascripts/discourse/app/models/group-history.js +++ b/app/assets/javascripts/discourse/app/models/group-history.js @@ -1,6 +1,6 @@ import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import RestModel from "discourse/models/rest"; +import discourseComputed from "discourse-common/utils/decorators"; export default RestModel.extend({ @discourseComputed("action") diff --git a/app/assets/javascripts/discourse/app/models/group.js b/app/assets/javascripts/discourse/app/models/group.js index 6c6a662f01..a6c587382b 100644 --- a/app/assets/javascripts/discourse/app/models/group.js +++ b/app/assets/javascripts/discourse/app/models/group.js @@ -1,14 +1,14 @@ -import EmberObject from "@ember/object"; -import { equal } from "@ember/object/computed"; -import { isEmpty } from "@ember/utils"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; -import { ajax } from "discourse/lib/ajax"; import Category from "discourse/models/category"; +import EmberObject from "@ember/object"; import GroupHistory from "discourse/models/group-history"; +import { Promise } from "rsvp"; import RestModel from "discourse/models/rest"; import Topic from "discourse/models/topic"; import User from "discourse/models/user"; -import { Promise } from "rsvp"; +import { ajax } from "discourse/lib/ajax"; +import { equal } from "@ember/object/computed"; +import { isEmpty } from "@ember/utils"; const Group = RestModel.extend({ user_count: 0, diff --git a/app/assets/javascripts/discourse/app/models/invite.js b/app/assets/javascripts/discourse/app/models/invite.js index aa72a55e8e..aef88d10ab 100644 --- a/app/assets/javascripts/discourse/app/models/invite.js +++ b/app/assets/javascripts/discourse/app/models/invite.js @@ -1,10 +1,10 @@ import EmberObject from "@ember/object"; +import { Promise } from "rsvp"; +import User from "discourse/models/user"; import { ajax } from "discourse/lib/ajax"; +import { isNone } from "@ember/utils"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { userPath } from "discourse/lib/url"; -import { Promise } from "rsvp"; -import { isNone } from "@ember/utils"; -import User from "discourse/models/user"; const Invite = EmberObject.extend({ rescind() { diff --git a/app/assets/javascripts/discourse/app/models/live-post-counts.js b/app/assets/javascripts/discourse/app/models/live-post-counts.js index a95565e602..bac51ff825 100644 --- a/app/assets/javascripts/discourse/app/models/live-post-counts.js +++ b/app/assets/javascripts/discourse/app/models/live-post-counts.js @@ -1,5 +1,5 @@ -import { ajax } from "discourse/lib/ajax"; import EmberObject from "@ember/object"; +import { ajax } from "discourse/lib/ajax"; const LivePostCounts = EmberObject.extend({}); diff --git a/app/assets/javascripts/discourse/app/models/login-method.js b/app/assets/javascripts/discourse/app/models/login-method.js index 3b1ca37b2a..db0882f890 100644 --- a/app/assets/javascripts/discourse/app/models/login-method.js +++ b/app/assets/javascripts/discourse/app/models/login-method.js @@ -1,11 +1,11 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import EmberObject from "@ember/object"; -import { updateCsrfToken } from "discourse/lib/ajax"; +import I18n from "I18n"; import { Promise } from "rsvp"; import Session from "discourse/models/session"; import Site from "discourse/models/site"; +import discourseComputed from "discourse-common/utils/decorators"; +import getURL from "discourse-common/lib/get-url"; +import { updateCsrfToken } from "discourse/lib/ajax"; const LoginMethod = EmberObject.extend({ @discourseComputed diff --git a/app/assets/javascripts/discourse/app/models/nav-item.js b/app/assets/javascripts/discourse/app/models/nav-item.js index 3b36b6cdd2..5f74cb6818 100644 --- a/app/assets/javascripts/discourse/app/models/nav-item.js +++ b/app/assets/javascripts/discourse/app/models/nav-item.js @@ -1,15 +1,15 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { emojiUnescape } from "discourse/lib/text"; import Category from "discourse/models/category"; import EmberObject from "@ember/object"; -import { reads } from "@ember/object/computed"; -import deprecated from "discourse-common/lib/deprecated"; +import I18n from "I18n"; import Site from "discourse/models/site"; import User from "discourse/models/user"; -import { getOwner } from "discourse-common/lib/get-owner"; import { deepMerge } from "discourse-common/lib/object"; +import deprecated from "discourse-common/lib/deprecated"; +import discourseComputed from "discourse-common/utils/decorators"; +import { emojiUnescape } from "discourse/lib/text"; +import { getOwner } from "discourse-common/lib/get-owner"; +import getURL from "discourse-common/lib/get-url"; +import { reads } from "@ember/object/computed"; const NavItem = EmberObject.extend({ @discourseComputed("name") diff --git a/app/assets/javascripts/discourse/app/models/permission-type.js b/app/assets/javascripts/discourse/app/models/permission-type.js index 696f162034..17df7bd9df 100644 --- a/app/assets/javascripts/discourse/app/models/permission-type.js +++ b/app/assets/javascripts/discourse/app/models/permission-type.js @@ -1,6 +1,6 @@ +import EmberObject from "@ember/object"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; -import EmberObject from "@ember/object"; export function buildPermissionDescription(id) { return I18n.t("permission_types." + PermissionType.DESCRIPTION_KEYS[id]); diff --git a/app/assets/javascripts/discourse/app/models/post-action-type.js b/app/assets/javascripts/discourse/app/models/post-action-type.js index 35a93b54c5..9b40783c0a 100644 --- a/app/assets/javascripts/discourse/app/models/post-action-type.js +++ b/app/assets/javascripts/discourse/app/models/post-action-type.js @@ -1,5 +1,5 @@ -import { not } from "@ember/object/computed"; import RestModel from "discourse/models/rest"; +import { not } from "@ember/object/computed"; export const MAX_MESSAGE_LENGTH = 500; diff --git a/app/assets/javascripts/discourse/app/models/post-stream.js b/app/assets/javascripts/discourse/app/models/post-stream.js index 42e5da69fe..3ae9c1429a 100644 --- a/app/assets/javascripts/discourse/app/models/post-stream.js +++ b/app/assets/javascripts/discourse/app/models/post-stream.js @@ -1,17 +1,17 @@ -import I18n from "I18n"; -import { get } from "@ember/object"; -import { isEmpty } from "@ember/utils"; -import { or, not, and } from "@ember/object/computed"; -import { ajax } from "discourse/lib/ajax"; +import { and, not, or } from "@ember/object/computed"; import DiscourseURL from "discourse/lib/url"; -import RestModel from "discourse/models/rest"; +import I18n from "I18n"; import PostsWithPlaceholders from "discourse/lib/posts-with-placeholders"; -import discourseComputed from "discourse-common/utils/decorators"; -import { loadTopicView } from "discourse/models/topic"; import { Promise } from "rsvp"; +import RestModel from "discourse/models/rest"; import User from "discourse/models/user"; +import { ajax } from "discourse/lib/ajax"; import { deepMerge } from "discourse-common/lib/object"; import deprecated from "discourse-common/lib/deprecated"; +import discourseComputed from "discourse-common/utils/decorators"; +import { get } from "@ember/object"; +import { isEmpty } from "@ember/utils"; +import { loadTopicView } from "discourse/models/topic"; export default RestModel.extend({ _identityMap: null, diff --git a/app/assets/javascripts/discourse/app/models/post.js b/app/assets/javascripts/discourse/app/models/post.js index 911cca18b6..41dd4c5427 100644 --- a/app/assets/javascripts/discourse/app/models/post.js +++ b/app/assets/javascripts/discourse/app/models/post.js @@ -1,23 +1,23 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import EmberObject, { get } from "@ember/object"; -import { isEmpty } from "@ember/utils"; -import { equal, and, or, not } from "@ember/object/computed"; -import { ajax } from "discourse/lib/ajax"; -import RestModel from "discourse/models/rest"; -import { popupAjaxError } from "discourse/lib/ajax-error"; +import { and, equal, not, or } from "@ember/object/computed"; import ActionSummary from "discourse/models/action-summary"; -import { propertyEqual } from "discourse/lib/computed"; -import { postUrl } from "discourse/lib/utilities"; -import { cookAsync } from "discourse/lib/text"; -import { userPath } from "discourse/lib/url"; import Composer from "discourse/models/composer"; +import I18n from "I18n"; import { Promise } from "rsvp"; +import RestModel from "discourse/models/rest"; import Site from "discourse/models/site"; import User from "discourse/models/user"; -import showModal from "discourse/lib/show-modal"; +import { ajax } from "discourse/lib/ajax"; +import { cookAsync } from "discourse/lib/text"; +import discourseComputed from "discourse-common/utils/decorators"; import { fancyTitle } from "discourse/lib/topic-fancy-title"; +import { isEmpty } from "@ember/utils"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import { postUrl } from "discourse/lib/utilities"; +import { propertyEqual } from "discourse/lib/computed"; import { resolveShareUrl } from "discourse/helpers/share-url"; +import showModal from "discourse/lib/show-modal"; +import { userPath } from "discourse/lib/url"; const Post = RestModel.extend({ @discourseComputed("url") diff --git a/app/assets/javascripts/discourse/app/models/rest.js b/app/assets/javascripts/discourse/app/models/rest.js index 10f3d04b03..26219a9c48 100644 --- a/app/assets/javascripts/discourse/app/models/rest.js +++ b/app/assets/javascripts/discourse/app/models/rest.js @@ -1,8 +1,8 @@ -import { warn } from "@ember/debug"; -import { equal } from "@ember/object/computed"; import EmberObject from "@ember/object"; import { Promise } from "rsvp"; +import { equal } from "@ember/object/computed"; import { getOwner } from "discourse-common/lib/get-owner"; +import { warn } from "@ember/debug"; const RestModel = EmberObject.extend({ isNew: equal("__state", "new"), diff --git a/app/assets/javascripts/discourse/app/models/result-set.js b/app/assets/javascripts/discourse/app/models/result-set.js index 4e7866f86f..644e75638b 100644 --- a/app/assets/javascripts/discourse/app/models/result-set.js +++ b/app/assets/javascripts/discourse/app/models/result-set.js @@ -1,6 +1,6 @@ import ArrayProxy from "@ember/array/proxy"; -import discourseComputed from "discourse-common/utils/decorators"; import { Promise } from "rsvp"; +import discourseComputed from "discourse-common/utils/decorators"; export default ArrayProxy.extend({ loading: false, diff --git a/app/assets/javascripts/discourse/app/models/reviewable-history.js b/app/assets/javascripts/discourse/app/models/reviewable-history.js index bb143b712c..90484cc666 100644 --- a/app/assets/javascripts/discourse/app/models/reviewable-history.js +++ b/app/assets/javascripts/discourse/app/models/reviewable-history.js @@ -1,5 +1,5 @@ -import { equal } from "@ember/object/computed"; import RestModel from "discourse/models/rest"; +import { equal } from "@ember/object/computed"; export const CREATED = 0; export const TRANSITIONED_TO = 1; diff --git a/app/assets/javascripts/discourse/app/models/reviewable.js b/app/assets/javascripts/discourse/app/models/reviewable.js index a305241457..47c095bb46 100644 --- a/app/assets/javascripts/discourse/app/models/reviewable.js +++ b/app/assets/javascripts/discourse/app/models/reviewable.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -import { ajax } from "discourse/lib/ajax"; -import RestModel from "discourse/models/rest"; import Category from "discourse/models/category"; +import I18n from "I18n"; import { Promise } from "rsvp"; +import RestModel from "discourse/models/rest"; +import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; export const PENDING = 0; export const APPROVED = 1; diff --git a/app/assets/javascripts/discourse/app/models/site.js b/app/assets/javascripts/discourse/app/models/site.js index 24e483db42..fa59e1cc21 100644 --- a/app/assets/javascripts/discourse/app/models/site.js +++ b/app/assets/javascripts/discourse/app/models/site.js @@ -1,15 +1,15 @@ -import discourseComputed from "discourse-common/utils/decorators"; import EmberObject, { get } from "@ember/object"; -import { isEmpty } from "@ember/utils"; import { alias, sort } from "@ember/object/computed"; import Archetype from "discourse/models/archetype"; import PostActionType from "discourse/models/post-action-type"; -import Singleton from "discourse/mixins/singleton"; -import RestModel from "discourse/models/rest"; -import TrustLevel from "discourse/models/trust-level"; import PreloadStore from "discourse/lib/preload-store"; +import RestModel from "discourse/models/rest"; +import Singleton from "discourse/mixins/singleton"; +import TrustLevel from "discourse/models/trust-level"; import deprecated from "discourse-common/lib/deprecated"; +import discourseComputed from "discourse-common/utils/decorators"; import { getOwner } from "discourse-common/lib/get-owner"; +import { isEmpty } from "@ember/utils"; const Site = RestModel.extend({ isReadOnly: alias("is_readonly"), diff --git a/app/assets/javascripts/discourse/app/models/static-page.js b/app/assets/javascripts/discourse/app/models/static-page.js index 6d39b9c59c..38e373dffa 100644 --- a/app/assets/javascripts/discourse/app/models/static-page.js +++ b/app/assets/javascripts/discourse/app/models/static-page.js @@ -1,6 +1,6 @@ import EmberObject from "@ember/object"; -import { ajax } from "discourse/lib/ajax"; import { Promise } from "rsvp"; +import { ajax } from "discourse/lib/ajax"; const StaticPage = EmberObject.extend(); diff --git a/app/assets/javascripts/discourse/app/models/store.js b/app/assets/javascripts/discourse/app/models/store.js index 7f18d2262d..aa477b0ee1 100644 --- a/app/assets/javascripts/discourse/app/models/store.js +++ b/app/assets/javascripts/discourse/app/models/store.js @@ -1,11 +1,11 @@ import EmberObject, { set } from "@ember/object"; -import { ajax } from "discourse/lib/ajax"; -import RestModel from "discourse/models/rest"; -import ResultSet from "discourse/models/result-set"; -import { getRegister } from "discourse-common/lib/get-owner"; -import { underscore } from "@ember/string"; import Category from "discourse/models/category"; import { Promise } from "rsvp"; +import RestModel from "discourse/models/rest"; +import ResultSet from "discourse/models/result-set"; +import { ajax } from "discourse/lib/ajax"; +import { getRegister } from "discourse-common/lib/get-owner"; +import { underscore } from "@ember/string"; let _identityMap; diff --git a/app/assets/javascripts/discourse/app/models/tag-group.js b/app/assets/javascripts/discourse/app/models/tag-group.js index d34ddcf7d2..e34e5cae71 100644 --- a/app/assets/javascripts/discourse/app/models/tag-group.js +++ b/app/assets/javascripts/discourse/app/models/tag-group.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import RestModel from "discourse/models/rest"; import PermissionType from "discourse/models/permission-type"; +import RestModel from "discourse/models/rest"; +import discourseComputed from "discourse-common/utils/decorators"; export default RestModel.extend({ @discourseComputed("permissions") diff --git a/app/assets/javascripts/discourse/app/models/tag.js b/app/assets/javascripts/discourse/app/models/tag.js index 03946c9b67..5f514f8db1 100644 --- a/app/assets/javascripts/discourse/app/models/tag.js +++ b/app/assets/javascripts/discourse/app/models/tag.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import RestModel from "discourse/models/rest"; +import discourseComputed from "discourse-common/utils/decorators"; export default RestModel.extend({ @discourseComputed("count", "pm_count") diff --git a/app/assets/javascripts/discourse/app/models/topic-details.js b/app/assets/javascripts/discourse/app/models/topic-details.js index ce2f98363b..8162a0537d 100644 --- a/app/assets/javascripts/discourse/app/models/topic-details.js +++ b/app/assets/javascripts/discourse/app/models/topic-details.js @@ -1,16 +1,16 @@ -import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import EmberObject from "@ember/object"; -import { ajax } from "discourse/lib/ajax"; +import I18n from "I18n"; +import { NotificationLevels } from "discourse/lib/notification-levels"; +import RestModel from "discourse/models/rest"; import User from "discourse/models/user"; -import getURL from "discourse-common/lib/get-url"; +import { ajax } from "discourse/lib/ajax"; /** A model representing a Topic's details that aren't always present, such as a list of participants. When showing topics in lists and such this information should not be required. **/ -import { NotificationLevels } from "discourse/lib/notification-levels"; -import RestModel from "discourse/models/rest"; +import discourseComputed from "discourse-common/utils/decorators"; +import getURL from "discourse-common/lib/get-url"; const TopicDetails = RestModel.extend({ loaded: false, diff --git a/app/assets/javascripts/discourse/app/models/topic-list.js b/app/assets/javascripts/discourse/app/models/topic-list.js index 45020da87f..0503eca371 100644 --- a/app/assets/javascripts/discourse/app/models/topic-list.js +++ b/app/assets/javascripts/discourse/app/models/topic-list.js @@ -1,13 +1,13 @@ -import getURL from "discourse-common/lib/get-url"; -import { notEmpty } from "@ember/object/computed"; import EmberObject from "@ember/object"; -import { ajax } from "discourse/lib/ajax"; -import RestModel from "discourse/models/rest"; -import { getOwner } from "discourse-common/lib/get-owner"; import { Promise } from "rsvp"; +import RestModel from "discourse/models/rest"; import Session from "discourse/models/session"; -import { isEmpty } from "@ember/utils"; import User from "discourse/models/user"; +import { ajax } from "discourse/lib/ajax"; +import { getOwner } from "discourse-common/lib/get-owner"; +import getURL from "discourse-common/lib/get-url"; +import { isEmpty } from "@ember/utils"; +import { notEmpty } from "@ember/object/computed"; function extractByKey(collection, klass) { const retval = {}; diff --git a/app/assets/javascripts/discourse/app/models/topic-timer.js b/app/assets/javascripts/discourse/app/models/topic-timer.js index e6d108a608..a0685521aa 100644 --- a/app/assets/javascripts/discourse/app/models/topic-timer.js +++ b/app/assets/javascripts/discourse/app/models/topic-timer.js @@ -1,5 +1,5 @@ -import { ajax } from "discourse/lib/ajax"; import RestModel from "discourse/models/rest"; +import { ajax } from "discourse/lib/ajax"; const TopicTimer = RestModel.extend({}); diff --git a/app/assets/javascripts/discourse/app/models/topic-tracking-state.js b/app/assets/javascripts/discourse/app/models/topic-tracking-state.js index 4d209f5fee..983818cd40 100644 --- a/app/assets/javascripts/discourse/app/models/topic-tracking-state.js +++ b/app/assets/javascripts/discourse/app/models/topic-tracking-state.js @@ -1,12 +1,12 @@ import EmberObject, { get } from "@ember/object"; -import { isEmpty } from "@ember/utils"; -import { NotificationLevels } from "discourse/lib/notification-levels"; import discourseComputed, { on } from "discourse-common/utils/decorators"; -import PreloadStore from "discourse/lib/preload-store"; import Category from "discourse/models/category"; +import DiscourseURL from "discourse/lib/url"; +import { NotificationLevels } from "discourse/lib/notification-levels"; +import PreloadStore from "discourse/lib/preload-store"; import User from "discourse/models/user"; import { deepEqual } from "discourse-common/lib/object"; -import DiscourseURL from "discourse/lib/url"; +import { isEmpty } from "@ember/utils"; function isNew(topic) { return ( diff --git a/app/assets/javascripts/discourse/app/models/topic.js b/app/assets/javascripts/discourse/app/models/topic.js index 5c05172f35..819f8c8ff0 100644 --- a/app/assets/javascripts/discourse/app/models/topic.js +++ b/app/assets/javascripts/discourse/app/models/topic.js @@ -1,27 +1,27 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import EmberObject from "@ember/object"; -import { not, notEmpty, equal, and, or } from "@ember/object/computed"; -import { ajax } from "discourse/lib/ajax"; -import { flushMap } from "discourse/models/store"; -import RestModel from "discourse/models/rest"; -import { propertyEqual, fmt } from "discourse/lib/computed"; -import { longDate } from "discourse/lib/formatter"; +import { and, equal, not, notEmpty, or } from "@ember/object/computed"; +import { fmt, propertyEqual } from "discourse/lib/computed"; import ActionSummary from "discourse/models/action-summary"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import { emojiUnescape } from "discourse/lib/text"; -import PreloadStore from "discourse/lib/preload-store"; -import { userPath } from "discourse/lib/url"; -import { fancyTitle } from "discourse/lib/topic-fancy-title"; -import discourseComputed from "discourse-common/utils/decorators"; import Category from "discourse/models/category"; -import Session from "discourse/models/session"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; +import PreloadStore from "discourse/lib/preload-store"; import { Promise } from "rsvp"; +import RestModel from "discourse/models/rest"; +import Session from "discourse/models/session"; import Site from "discourse/models/site"; import User from "discourse/models/user"; +import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; import { deepMerge } from "discourse-common/lib/object"; +import discourseComputed from "discourse-common/utils/decorators"; +import { emojiUnescape } from "discourse/lib/text"; +import { fancyTitle } from "discourse/lib/topic-fancy-title"; +import { flushMap } from "discourse/models/store"; +import getURL from "discourse-common/lib/get-url"; +import { longDate } from "discourse/lib/formatter"; +import { popupAjaxError } from "discourse/lib/ajax-error"; import { resolveShareUrl } from "discourse/helpers/share-url"; +import { userPath } from "discourse/lib/url"; export function loadTopicView(topic, args) { const data = deepMerge({}, args); diff --git a/app/assets/javascripts/discourse/app/models/user-action-stat.js b/app/assets/javascripts/discourse/app/models/user-action-stat.js index 2ebde268b3..77394fe394 100644 --- a/app/assets/javascripts/discourse/app/models/user-action-stat.js +++ b/app/assets/javascripts/discourse/app/models/user-action-stat.js @@ -1,6 +1,6 @@ -import discourseComputed from "discourse-common/utils/decorators"; import RestModel from "discourse/models/rest"; import UserAction from "discourse/models/user-action"; +import discourseComputed from "discourse-common/utils/decorators"; import { i18n } from "discourse/lib/computed"; export default RestModel.extend({ diff --git a/app/assets/javascripts/discourse/app/models/user-action.js b/app/assets/javascripts/discourse/app/models/user-action.js index 5599e56c8b..2c3762c726 100644 --- a/app/assets/javascripts/discourse/app/models/user-action.js +++ b/app/assets/javascripts/discourse/app/models/user-action.js @@ -1,11 +1,11 @@ +import { and, equal, or } from "@ember/object/computed"; import discourseComputed, { on } from "discourse-common/utils/decorators"; -import { or, equal, and } from "@ember/object/computed"; +import Category from "discourse/models/category"; import RestModel from "discourse/models/rest"; +import User from "discourse/models/user"; import UserActionGroup from "discourse/models/user-action-group"; import { postUrl } from "discourse/lib/utilities"; import { userPath } from "discourse/lib/url"; -import Category from "discourse/models/category"; -import User from "discourse/models/user"; const UserActionTypes = { likes_given: 1, diff --git a/app/assets/javascripts/discourse/app/models/user-badge.js b/app/assets/javascripts/discourse/app/models/user-badge.js index 832730a1b1..304059d65d 100644 --- a/app/assets/javascripts/discourse/app/models/user-badge.js +++ b/app/assets/javascripts/discourse/app/models/user-badge.js @@ -1,10 +1,10 @@ -import discourseComputed from "discourse-common/utils/decorators"; -import { ajax } from "discourse/lib/ajax"; import Badge from "discourse/models/badge"; +import EmberObject from "@ember/object"; import { Promise } from "rsvp"; import Topic from "discourse/models/topic"; -import EmberObject from "@ember/object"; import User from "discourse/models/user"; +import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; const UserBadge = EmberObject.extend({ @discourseComputed diff --git a/app/assets/javascripts/discourse/app/models/user-draft.js b/app/assets/javascripts/discourse/app/models/user-draft.js index 0bf9a1116c..44874e9b1e 100644 --- a/app/assets/javascripts/discourse/app/models/user-draft.js +++ b/app/assets/javascripts/discourse/app/models/user-draft.js @@ -1,13 +1,13 @@ +import { + NEW_PRIVATE_MESSAGE_KEY, + NEW_TOPIC_KEY, +} from "discourse/models/composer"; import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; import RestModel from "discourse/models/rest"; +import User from "discourse/models/user"; +import discourseComputed from "discourse-common/utils/decorators"; import { postUrl } from "discourse/lib/utilities"; import { userPath } from "discourse/lib/url"; -import User from "discourse/models/user"; -import { - NEW_TOPIC_KEY, - NEW_PRIVATE_MESSAGE_KEY, -} from "discourse/models/composer"; export default RestModel.extend({ @discourseComputed("draft_username") diff --git a/app/assets/javascripts/discourse/app/models/user-drafts-stream.js b/app/assets/javascripts/discourse/app/models/user-drafts-stream.js index 6be4816502..90864e13ff 100644 --- a/app/assets/javascripts/discourse/app/models/user-drafts-stream.js +++ b/app/assets/javascripts/discourse/app/models/user-drafts-stream.js @@ -1,16 +1,16 @@ +import { + NEW_PRIVATE_MESSAGE_KEY, + NEW_TOPIC_KEY, +} from "discourse/models/composer"; import { A } from "@ember/array"; -import discourseComputed from "discourse-common/utils/decorators"; -import { ajax } from "discourse/lib/ajax"; -import { url } from "discourse/lib/computed"; +import { Promise } from "rsvp"; import RestModel from "discourse/models/rest"; import UserDraft from "discourse/models/user-draft"; +import { ajax } from "discourse/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; import { emojiUnescape } from "discourse/lib/text"; -import { Promise } from "rsvp"; -import { - NEW_TOPIC_KEY, - NEW_PRIVATE_MESSAGE_KEY, -} from "discourse/models/composer"; import { escapeExpression } from "discourse/lib/utilities"; +import { url } from "discourse/lib/computed"; export default RestModel.extend({ loaded: false, diff --git a/app/assets/javascripts/discourse/app/models/user-posts-stream.js b/app/assets/javascripts/discourse/app/models/user-posts-stream.js index 825feff035..b152630bc1 100644 --- a/app/assets/javascripts/discourse/app/models/user-posts-stream.js +++ b/app/assets/javascripts/discourse/app/models/user-posts-stream.js @@ -1,9 +1,9 @@ -import { on } from "discourse-common/utils/decorators"; -import { ajax } from "discourse/lib/ajax"; -import { url } from "discourse/lib/computed"; -import UserAction from "discourse/models/user-action"; -import { Promise } from "rsvp"; import EmberObject from "@ember/object"; +import { Promise } from "rsvp"; +import UserAction from "discourse/models/user-action"; +import { ajax } from "discourse/lib/ajax"; +import { on } from "discourse-common/utils/decorators"; +import { url } from "discourse/lib/computed"; export default EmberObject.extend({ loaded: false, diff --git a/app/assets/javascripts/discourse/app/models/user-stream.js b/app/assets/javascripts/discourse/app/models/user-stream.js index 14ff2fb401..b66c95d516 100644 --- a/app/assets/javascripts/discourse/app/models/user-stream.js +++ b/app/assets/javascripts/discourse/app/models/user-stream.js @@ -1,12 +1,12 @@ +import discourseComputed, { on } from "discourse-common/utils/decorators"; import { A } from "@ember/array"; -import { ajax } from "discourse/lib/ajax"; -import { url } from "discourse/lib/computed"; +import { Promise } from "rsvp"; import RestModel from "discourse/models/rest"; import UserAction from "discourse/models/user-action"; +import { ajax } from "discourse/lib/ajax"; import { emojiUnescape } from "discourse/lib/text"; -import { Promise } from "rsvp"; -import discourseComputed, { on } from "discourse-common/utils/decorators"; import { escapeExpression } from "discourse/lib/utilities"; +import { url } from "discourse/lib/computed"; export default RestModel.extend({ loaded: false, diff --git a/app/assets/javascripts/discourse/app/models/user.js b/app/assets/javascripts/discourse/app/models/user.js index f2b78e35ad..0a1a94e422 100644 --- a/app/assets/javascripts/discourse/app/models/user.js +++ b/app/assets/javascripts/discourse/app/models/user.js @@ -1,35 +1,35 @@ -import getURL, { getURLWithCDN } from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import { A } from "@ember/array"; -import { isEmpty } from "@ember/utils"; -import { gt, equal, or } from "@ember/object/computed"; -import EmberObject, { get, computed, getProperties } from "@ember/object"; -import { ajax } from "discourse/lib/ajax"; -import { url } from "discourse/lib/computed"; -import RestModel from "discourse/models/rest"; -import Bookmark from "discourse/models/bookmark"; -import UserStream from "discourse/models/user-stream"; -import UserPostsStream from "discourse/models/user-posts-stream"; -import Singleton from "discourse/mixins/singleton"; -import { longDate } from "discourse/lib/formatter"; -import discourseComputed from "discourse-common/utils/decorators"; -import Badge from "discourse/models/badge"; -import UserBadge from "discourse/models/user-badge"; -import UserActionStat from "discourse/models/user-action-stat"; -import UserAction from "discourse/models/user-action"; -import UserDraftsStream from "discourse/models/user-drafts-stream"; -import Group from "discourse/models/group"; -import { emojiUnescape } from "discourse/lib/text"; -import PreloadStore from "discourse/lib/preload-store"; -import { defaultHomepage, escapeExpression } from "discourse/lib/utilities"; -import { userPath } from "discourse/lib/url"; -import Category from "discourse/models/category"; -import { Promise } from "rsvp"; -import deprecated from "discourse-common/lib/deprecated"; -import Site from "discourse/models/site"; -import { NotificationLevels } from "discourse/lib/notification-levels"; -import { getOwner } from "discourse-common/lib/get-owner"; +import EmberObject, { computed, get, getProperties } from "@ember/object"; import cookie, { removeCookie } from "discourse/lib/cookie"; +import { defaultHomepage, escapeExpression } from "discourse/lib/utilities"; +import { equal, gt, or } from "@ember/object/computed"; +import getURL, { getURLWithCDN } from "discourse-common/lib/get-url"; +import { A } from "@ember/array"; +import Badge from "discourse/models/badge"; +import Bookmark from "discourse/models/bookmark"; +import Category from "discourse/models/category"; +import Group from "discourse/models/group"; +import I18n from "I18n"; +import { NotificationLevels } from "discourse/lib/notification-levels"; +import PreloadStore from "discourse/lib/preload-store"; +import { Promise } from "rsvp"; +import RestModel from "discourse/models/rest"; +import Singleton from "discourse/mixins/singleton"; +import Site from "discourse/models/site"; +import UserAction from "discourse/models/user-action"; +import UserActionStat from "discourse/models/user-action-stat"; +import UserBadge from "discourse/models/user-badge"; +import UserDraftsStream from "discourse/models/user-drafts-stream"; +import UserPostsStream from "discourse/models/user-posts-stream"; +import UserStream from "discourse/models/user-stream"; +import { ajax } from "discourse/lib/ajax"; +import deprecated from "discourse-common/lib/deprecated"; +import discourseComputed from "discourse-common/utils/decorators"; +import { emojiUnescape } from "discourse/lib/text"; +import { getOwner } from "discourse-common/lib/get-owner"; +import { isEmpty } from "@ember/utils"; +import { longDate } from "discourse/lib/formatter"; +import { url } from "discourse/lib/computed"; +import { userPath } from "discourse/lib/url"; export const SECOND_FACTOR_METHODS = { TOTP: 1, diff --git a/app/assets/javascripts/discourse/app/pre-initializers/discourse-bootstrap.js b/app/assets/javascripts/discourse/app/pre-initializers/discourse-bootstrap.js index 330fbe2554..4ecda523b1 100644 --- a/app/assets/javascripts/discourse/app/pre-initializers/discourse-bootstrap.js +++ b/app/assets/javascripts/discourse/app/pre-initializers/discourse-bootstrap.js @@ -1,18 +1,18 @@ -import PreloadStore from "discourse/lib/preload-store"; -import I18n from "I18n"; -import Session from "discourse/models/session"; -import RSVP from "rsvp"; import { - setEnvironment, - isTesting, - isProduction, isDevelopment, + isProduction, + isTesting, + setEnvironment, } from "discourse-common/config/environment"; -import { setupURL, setupS3CDN } from "discourse-common/lib/get-url"; +import { setupS3CDN, setupURL } from "discourse-common/lib/get-url"; +import I18n from "I18n"; +import PreloadStore from "discourse/lib/preload-store"; +import RSVP from "rsvp"; +import Session from "discourse/models/session"; import deprecated from "discourse-common/lib/deprecated"; +import { setDefaultOwner } from "discourse-common/lib/get-owner"; import { setIconList } from "discourse-common/lib/icon-library"; import { setURLContainer } from "discourse/lib/url"; -import { setDefaultOwner } from "discourse-common/lib/get-owner"; export default { name: "discourse-bootstrap", diff --git a/app/assets/javascripts/discourse/app/pre-initializers/dynamic-route-builders.js b/app/assets/javascripts/discourse/app/pre-initializers/dynamic-route-builders.js index aada8bab6b..654d525cc2 100644 --- a/app/assets/javascripts/discourse/app/pre-initializers/dynamic-route-builders.js +++ b/app/assets/javascripts/discourse/app/pre-initializers/dynamic-route-builders.js @@ -1,9 +1,9 @@ +import DiscoverySortableController from "discourse/controllers/discovery-sortable"; +import Site from "discourse/models/site"; +import TagShowRoute from "discourse/routes/tag-show"; +import User from "discourse/models/user"; import buildCategoryRoute from "discourse/routes/build-category-route"; import buildTopicRoute from "discourse/routes/build-topic-route"; -import DiscoverySortableController from "discourse/controllers/discovery-sortable"; -import TagShowRoute from "discourse/routes/tag-show"; -import Site from "discourse/models/site"; -import User from "discourse/models/user"; export default { after: "inject-discourse-objects", diff --git a/app/assets/javascripts/discourse/app/pre-initializers/inject-discourse-objects.js b/app/assets/javascripts/discourse/app/pre-initializers/inject-discourse-objects.js index 14ae8e272f..3e863c3394 100644 --- a/app/assets/javascripts/discourse/app/pre-initializers/inject-discourse-objects.js +++ b/app/assets/javascripts/discourse/app/pre-initializers/inject-discourse-objects.js @@ -1,15 +1,15 @@ -import Session from "discourse/models/session"; -import KeyValueStore from "discourse/lib/key-value-store"; -import Store from "discourse/models/store"; -import DiscourseLocation from "discourse/lib/discourse-location"; -import SearchService from "discourse/services/search"; import TopicTrackingState, { startTracking, } from "discourse/models/topic-tracking-state"; -import ScreenTrack from "discourse/lib/screen-track"; -import Site from "discourse/models/site"; -import User from "discourse/models/user"; +import DiscourseLocation from "discourse/lib/discourse-location"; +import KeyValueStore from "discourse/lib/key-value-store"; import MessageBus from "message-bus-client"; +import ScreenTrack from "discourse/lib/screen-track"; +import SearchService from "discourse/services/search"; +import Session from "discourse/models/session"; +import Site from "discourse/models/site"; +import Store from "discourse/models/store"; +import User from "discourse/models/user"; const ALL_TARGETS = ["controller", "component", "route", "model", "adapter"]; diff --git a/app/assets/javascripts/discourse/app/raw-views/list/post-count-or-badges.js b/app/assets/javascripts/discourse/app/raw-views/list/post-count-or-badges.js index b93a87bb9e..5a9573090b 100644 --- a/app/assets/javascripts/discourse/app/raw-views/list/post-count-or-badges.js +++ b/app/assets/javascripts/discourse/app/raw-views/list/post-count-or-badges.js @@ -1,6 +1,6 @@ -import I18n from "I18n"; -import { or, and } from "@ember/object/computed"; +import { and, or } from "@ember/object/computed"; import EmberObject from "@ember/object"; +import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; export default EmberObject.extend({ diff --git a/app/assets/javascripts/discourse/app/raw-views/list/posts-count-column.js b/app/assets/javascripts/discourse/app/raw-views/list/posts-count-column.js index 1484e812cc..6f9f953e12 100644 --- a/app/assets/javascripts/discourse/app/raw-views/list/posts-count-column.js +++ b/app/assets/javascripts/discourse/app/raw-views/list/posts-count-column.js @@ -1,6 +1,6 @@ +import EmberObject from "@ember/object"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; -import EmberObject from "@ember/object"; import { fmt } from "discourse/lib/computed"; export default EmberObject.extend({ diff --git a/app/assets/javascripts/discourse/app/raw-views/list/visited-line.js b/app/assets/javascripts/discourse/app/raw-views/list/visited-line.js index 254631f1dd..569137bd5b 100644 --- a/app/assets/javascripts/discourse/app/raw-views/list/visited-line.js +++ b/app/assets/javascripts/discourse/app/raw-views/list/visited-line.js @@ -1,5 +1,5 @@ -import discourseComputed from "discourse-common/utils/decorators"; import EmberObject from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; export default EmberObject.extend({ @discourseComputed diff --git a/app/assets/javascripts/discourse/app/raw-views/topic-list-header-column.js b/app/assets/javascripts/discourse/app/raw-views/topic-list-header-column.js index 9e2ec5fb2f..3ce75d3075 100644 --- a/app/assets/javascripts/discourse/app/raw-views/topic-list-header-column.js +++ b/app/assets/javascripts/discourse/app/raw-views/topic-list-header-column.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import EmberObject from "@ember/object"; +import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; export default EmberObject.extend({ diff --git a/app/assets/javascripts/discourse/app/raw-views/topic-status.js b/app/assets/javascripts/discourse/app/raw-views/topic-status.js index 646f22b4d3..da1e4273d2 100644 --- a/app/assets/javascripts/discourse/app/raw-views/topic-status.js +++ b/app/assets/javascripts/discourse/app/raw-views/topic-status.js @@ -1,6 +1,6 @@ +import EmberObject from "@ember/object"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; -import EmberObject from "@ember/object"; export default EmberObject.extend({ showDefault: null, diff --git a/app/assets/javascripts/discourse/app/routes/about.js b/app/assets/javascripts/discourse/app/routes/about.js index 4a9897ce70..efc663e0a4 100644 --- a/app/assets/javascripts/discourse/app/routes/about.js +++ b/app/assets/javascripts/discourse/app/routes/about.js @@ -1,6 +1,6 @@ +import DiscourseRoute from "discourse/routes/discourse"; import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; -import DiscourseRoute from "discourse/routes/discourse"; export default DiscourseRoute.extend({ model() { diff --git a/app/assets/javascripts/discourse/app/routes/account-created.js b/app/assets/javascripts/discourse/app/routes/account-created.js index c3c22c7dad..04944f2195 100644 --- a/app/assets/javascripts/discourse/app/routes/account-created.js +++ b/app/assets/javascripts/discourse/app/routes/account-created.js @@ -1,5 +1,5 @@ -import Route from "@ember/routing/route"; import PreloadStore from "discourse/lib/preload-store"; +import Route from "@ember/routing/route"; export default Route.extend({ setupController(controller) { diff --git a/app/assets/javascripts/discourse/app/routes/application.js b/app/assets/javascripts/discourse/app/routes/application.js index 8c8a21c80a..e355aa92f8 100644 --- a/app/assets/javascripts/discourse/app/routes/application.js +++ b/app/assets/javascripts/discourse/app/routes/application.js @@ -1,19 +1,19 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import DiscourseRoute from "discourse/routes/discourse"; -import { ajax } from "discourse/lib/ajax"; -import { setting } from "discourse/lib/computed"; -import logout from "discourse/lib/logout"; -import showModal from "discourse/lib/show-modal"; -import OpenComposer from "discourse/mixins/open-composer"; +import DiscourseURL, { userPath } from "discourse/lib/url"; import Category from "discourse/models/category"; -import mobile from "discourse/lib/mobile"; +import Composer from "discourse/models/composer"; +import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; +import OpenComposer from "discourse/mixins/open-composer"; +import { ajax } from "discourse/lib/ajax"; +import bootbox from "bootbox"; import { findAll } from "discourse/models/login-method"; import { getOwner } from "discourse-common/lib/get-owner"; -import DiscourseURL, { userPath } from "discourse/lib/url"; -import Composer from "discourse/models/composer"; +import getURL from "discourse-common/lib/get-url"; +import logout from "discourse/lib/logout"; +import mobile from "discourse/lib/mobile"; import { inject as service } from "@ember/service"; -import bootbox from "bootbox"; +import { setting } from "discourse/lib/computed"; +import showModal from "discourse/lib/show-modal"; function unlessReadOnly(method, message) { return function () { diff --git a/app/assets/javascripts/discourse/app/routes/associate-account.js b/app/assets/javascripts/discourse/app/routes/associate-account.js index c14075811c..ca1277f750 100644 --- a/app/assets/javascripts/discourse/app/routes/associate-account.js +++ b/app/assets/javascripts/discourse/app/routes/associate-account.js @@ -1,8 +1,8 @@ -import { next } from "@ember/runloop"; import DiscourseRoute from "discourse/routes/discourse"; import { ajax } from "discourse/lib/ajax"; -import showModal from "discourse/lib/show-modal"; +import { next } from "@ember/runloop"; import { popupAjaxError } from "discourse/lib/ajax-error"; +import showModal from "discourse/lib/show-modal"; export default DiscourseRoute.extend({ beforeModel() { diff --git a/app/assets/javascripts/discourse/app/routes/badges-index.js b/app/assets/javascripts/discourse/app/routes/badges-index.js index f11e5ca124..63b2cac55a 100644 --- a/app/assets/javascripts/discourse/app/routes/badges-index.js +++ b/app/assets/javascripts/discourse/app/routes/badges-index.js @@ -1,6 +1,6 @@ -import I18n from "I18n"; -import DiscourseRoute from "discourse/routes/discourse"; import Badge from "discourse/models/badge"; +import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; import PreloadStore from "discourse/lib/preload-store"; export default DiscourseRoute.extend({ diff --git a/app/assets/javascripts/discourse/app/routes/badges-show.js b/app/assets/javascripts/discourse/app/routes/badges-show.js index 1174938c38..81a05ddeaa 100644 --- a/app/assets/javascripts/discourse/app/routes/badges-show.js +++ b/app/assets/javascripts/discourse/app/routes/badges-show.js @@ -1,7 +1,7 @@ -import DiscourseRoute from "discourse/routes/discourse"; -import UserBadge from "discourse/models/user-badge"; import Badge from "discourse/models/badge"; +import DiscourseRoute from "discourse/routes/discourse"; import PreloadStore from "discourse/lib/preload-store"; +import UserBadge from "discourse/models/user-badge"; import { hash } from "rsvp"; export default DiscourseRoute.extend({ diff --git a/app/assets/javascripts/discourse/app/routes/build-category-route.js b/app/assets/javascripts/discourse/app/routes/build-category-route.js index 84959b9a6b..d7e10e764e 100644 --- a/app/assets/javascripts/discourse/app/routes/build-category-route.js +++ b/app/assets/javascripts/discourse/app/routes/build-category-route.js @@ -1,19 +1,19 @@ -import I18n from "I18n"; -import DiscourseRoute from "discourse/routes/discourse"; +import { Promise, all } from "rsvp"; +import { + changeSort, + queryParams, + resetParams, +} from "discourse/controllers/discovery-sortable"; import { filterQueryParams, findTopicList, } from "discourse/routes/build-topic-route"; -import { - changeSort, - resetParams, - queryParams, -} from "discourse/controllers/discovery-sortable"; -import TopicList from "discourse/models/topic-list"; -import PermissionType from "discourse/models/permission-type"; -import CategoryList from "discourse/models/category-list"; import Category from "discourse/models/category"; -import { Promise, all } from "rsvp"; +import CategoryList from "discourse/models/category-list"; +import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; +import PermissionType from "discourse/models/permission-type"; +import TopicList from "discourse/models/topic-list"; // A helper function to create a category route with parameters export default (filterArg, params) => { diff --git a/app/assets/javascripts/discourse/app/routes/build-private-messages-route.js b/app/assets/javascripts/discourse/app/routes/build-private-messages-route.js index ba7d099bbd..102e3cf585 100644 --- a/app/assets/javascripts/discourse/app/routes/build-private-messages-route.js +++ b/app/assets/javascripts/discourse/app/routes/build-private-messages-route.js @@ -1,7 +1,7 @@ import I18n from "I18n"; +import UserAction from "discourse/models/user-action"; import UserTopicListRoute from "discourse/routes/user-topic-list"; import { findOrResetCachedTopicList } from "discourse/lib/cached-topic-list"; -import UserAction from "discourse/models/user-action"; // A helper to build a user topic list route export default (viewName, path, channel) => { diff --git a/app/assets/javascripts/discourse/app/routes/build-topic-route.js b/app/assets/javascripts/discourse/app/routes/build-topic-route.js index b526c6af46..6a20e58d0f 100644 --- a/app/assets/javascripts/discourse/app/routes/build-topic-route.js +++ b/app/assets/javascripts/discourse/app/routes/build-topic-route.js @@ -1,17 +1,17 @@ -import { isEmpty } from "@ember/utils"; -import I18n from "I18n"; -import DiscourseRoute from "discourse/routes/discourse"; import { changeSort, - resetParams, queryParams, + resetParams, } from "discourse/controllers/discovery-sortable"; -import { defaultHomepage } from "discourse/lib/utilities"; -import Session from "discourse/models/session"; +import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; import { Promise } from "rsvp"; +import Session from "discourse/models/session"; import Site from "discourse/models/site"; -import { inject as service } from "@ember/service"; import { deepEqual } from "discourse-common/lib/object"; +import { defaultHomepage } from "discourse/lib/utilities"; +import { isEmpty } from "@ember/utils"; +import { inject as service } from "@ember/service"; // A helper to build a topic route for a filter function filterQueryParams(params, defaultParams) { diff --git a/app/assets/javascripts/discourse/app/routes/discourse.js b/app/assets/javascripts/discourse/app/routes/discourse.js index aff1f6b222..8ce296fc63 100644 --- a/app/assets/javascripts/discourse/app/routes/discourse.js +++ b/app/assets/javascripts/discourse/app/routes/discourse.js @@ -1,6 +1,6 @@ -import { once } from "@ember/runloop"; import Composer from "discourse/models/composer"; import Route from "@ember/routing/route"; +import { once } from "@ember/runloop"; import { seenUser } from "discourse/lib/user-presence"; const DiscourseRoute = Route.extend({ diff --git a/app/assets/javascripts/discourse/app/routes/discovery-categories.js b/app/assets/javascripts/discourse/app/routes/discovery-categories.js index 606664ef30..b496f99e7e 100644 --- a/app/assets/javascripts/discourse/app/routes/discovery-categories.js +++ b/app/assets/javascripts/discourse/app/routes/discovery-categories.js @@ -1,16 +1,16 @@ -import I18n from "I18n"; -import EmberObject from "@ember/object"; -import { next } from "@ember/runloop"; -import DiscourseRoute from "discourse/routes/discourse"; -import showModal from "discourse/lib/show-modal"; -import OpenComposer from "discourse/mixins/open-composer"; import CategoryList from "discourse/models/category-list"; -import { defaultHomepage } from "discourse/lib/utilities"; +import DiscourseRoute from "discourse/routes/discourse"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; +import OpenComposer from "discourse/mixins/open-composer"; +import PreloadStore from "discourse/lib/preload-store"; +import Site from "discourse/models/site"; import TopicList from "discourse/models/topic-list"; import { ajax } from "discourse/lib/ajax"; -import PreloadStore from "discourse/lib/preload-store"; +import { defaultHomepage } from "discourse/lib/utilities"; import { hash } from "rsvp"; -import Site from "discourse/models/site"; +import { next } from "@ember/runloop"; +import showModal from "discourse/lib/show-modal"; const DiscoveryCategoriesRoute = DiscourseRoute.extend(OpenComposer, { renderTemplate() { diff --git a/app/assets/javascripts/discourse/app/routes/discovery.js b/app/assets/javascripts/discourse/app/routes/discovery.js index a99efc3ca1..0a983301fa 100644 --- a/app/assets/javascripts/discourse/app/routes/discovery.js +++ b/app/assets/javascripts/discourse/app/routes/discovery.js @@ -4,8 +4,8 @@ **/ import DiscourseRoute from "discourse/routes/discourse"; import OpenComposer from "discourse/mixins/open-composer"; -import { scrollTop } from "discourse/mixins/scroll-top"; import User from "discourse/models/user"; +import { scrollTop } from "discourse/mixins/scroll-top"; import { setTopicList } from "discourse/lib/topic-list-tracker"; export default DiscourseRoute.extend(OpenComposer, { diff --git a/app/assets/javascripts/discourse/app/routes/edit-category.js b/app/assets/javascripts/discourse/app/routes/edit-category.js index ae8136c4a0..f9ebcf1255 100644 --- a/app/assets/javascripts/discourse/app/routes/edit-category.js +++ b/app/assets/javascripts/discourse/app/routes/edit-category.js @@ -1,6 +1,6 @@ -import I18n from "I18n"; -import DiscourseRoute from "discourse/routes/discourse"; import Category from "discourse/models/category"; +import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ model(params) { diff --git a/app/assets/javascripts/discourse/app/routes/edit-child-category.js b/app/assets/javascripts/discourse/app/routes/edit-child-category.js index ae8136c4a0..f9ebcf1255 100644 --- a/app/assets/javascripts/discourse/app/routes/edit-child-category.js +++ b/app/assets/javascripts/discourse/app/routes/edit-child-category.js @@ -1,6 +1,6 @@ -import I18n from "I18n"; -import DiscourseRoute from "discourse/routes/discourse"; import Category from "discourse/models/category"; +import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ model(params) { diff --git a/app/assets/javascripts/discourse/app/routes/email-login.js b/app/assets/javascripts/discourse/app/routes/email-login.js index b2e466977a..a83a484d3a 100644 --- a/app/assets/javascripts/discourse/app/routes/email-login.js +++ b/app/assets/javascripts/discourse/app/routes/email-login.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; export default DiscourseRoute.extend({ diff --git a/app/assets/javascripts/discourse/app/routes/forgot-password.js b/app/assets/javascripts/discourse/app/routes/forgot-password.js index fe42fbd9d3..932c63b7bb 100644 --- a/app/assets/javascripts/discourse/app/routes/forgot-password.js +++ b/app/assets/javascripts/discourse/app/routes/forgot-password.js @@ -1,6 +1,6 @@ -import { next } from "@ember/runloop"; -import { defaultHomepage } from "discourse/lib/utilities"; import buildStaticRoute from "discourse/routes/build-static-route"; +import { defaultHomepage } from "discourse/lib/utilities"; +import { next } from "@ember/runloop"; const ForgotPasswordRoute = buildStaticRoute("password-reset"); diff --git a/app/assets/javascripts/discourse/app/routes/full-page-search.js b/app/assets/javascripts/discourse/app/routes/full-page-search.js index 126b5a076e..f628bb7998 100644 --- a/app/assets/javascripts/discourse/app/routes/full-page-search.js +++ b/app/assets/javascripts/discourse/app/routes/full-page-search.js @@ -1,13 +1,13 @@ -import I18n from "I18n"; -import DiscourseRoute from "discourse/routes/discourse"; -import { ajax } from "discourse/lib/ajax"; import { - translateResults, getSearchKey, isValidSearchTerm, + translateResults, } from "discourse/lib/search"; -import PreloadStore from "discourse/lib/preload-store"; import { getTransient, setTransient } from "discourse/lib/page-tracker"; +import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; +import PreloadStore from "discourse/lib/preload-store"; +import { ajax } from "discourse/lib/ajax"; import { escapeExpression } from "discourse/lib/utilities"; export default DiscourseRoute.extend({ diff --git a/app/assets/javascripts/discourse/app/routes/group-activity-posts.js b/app/assets/javascripts/discourse/app/routes/group-activity-posts.js index 767f3e028e..0c805e51cc 100644 --- a/app/assets/javascripts/discourse/app/routes/group-activity-posts.js +++ b/app/assets/javascripts/discourse/app/routes/group-activity-posts.js @@ -1,6 +1,6 @@ +import DiscourseRoute from "discourse/routes/discourse"; import I18n from "I18n"; import { get } from "@ember/object"; -import DiscourseRoute from "discourse/routes/discourse"; export function buildGroupPage(type) { return DiscourseRoute.extend({ diff --git a/app/assets/javascripts/discourse/app/routes/group-activity-topics.js b/app/assets/javascripts/discourse/app/routes/group-activity-topics.js index 2169f7adc2..31e5fde47c 100644 --- a/app/assets/javascripts/discourse/app/routes/group-activity-topics.js +++ b/app/assets/javascripts/discourse/app/routes/group-activity-topics.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ showFooter: true, diff --git a/app/assets/javascripts/discourse/app/routes/group-index.js b/app/assets/javascripts/discourse/app/routes/group-index.js index 2db84a909e..fdd634dfa6 100644 --- a/app/assets/javascripts/discourse/app/routes/group-index.js +++ b/app/assets/javascripts/discourse/app/routes/group-index.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; -import showModal from "discourse/lib/show-modal"; +import I18n from "I18n"; import { action } from "@ember/object"; +import showModal from "discourse/lib/show-modal"; export default DiscourseRoute.extend({ titleToken() { diff --git a/app/assets/javascripts/discourse/app/routes/group-manage-categories.js b/app/assets/javascripts/discourse/app/routes/group-manage-categories.js index e6e30185b6..2523e5f8f5 100644 --- a/app/assets/javascripts/discourse/app/routes/group-manage-categories.js +++ b/app/assets/javascripts/discourse/app/routes/group-manage-categories.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ showFooter: true, diff --git a/app/assets/javascripts/discourse/app/routes/group-manage-interaction.js b/app/assets/javascripts/discourse/app/routes/group-manage-interaction.js index f8fa57bf59..ad993fb5cd 100644 --- a/app/assets/javascripts/discourse/app/routes/group-manage-interaction.js +++ b/app/assets/javascripts/discourse/app/routes/group-manage-interaction.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ showFooter: true, diff --git a/app/assets/javascripts/discourse/app/routes/group-manage-logs.js b/app/assets/javascripts/discourse/app/routes/group-manage-logs.js index cbe7a8c08a..4cdd9bd0cc 100644 --- a/app/assets/javascripts/discourse/app/routes/group-manage-logs.js +++ b/app/assets/javascripts/discourse/app/routes/group-manage-logs.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ titleToken() { diff --git a/app/assets/javascripts/discourse/app/routes/group-manage-membership.js b/app/assets/javascripts/discourse/app/routes/group-manage-membership.js index f65567c50f..b448f86756 100644 --- a/app/assets/javascripts/discourse/app/routes/group-manage-membership.js +++ b/app/assets/javascripts/discourse/app/routes/group-manage-membership.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ showFooter: true, diff --git a/app/assets/javascripts/discourse/app/routes/group-manage-profile.js b/app/assets/javascripts/discourse/app/routes/group-manage-profile.js index e1a76ac829..1edb6d39d7 100644 --- a/app/assets/javascripts/discourse/app/routes/group-manage-profile.js +++ b/app/assets/javascripts/discourse/app/routes/group-manage-profile.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ showFooter: true, diff --git a/app/assets/javascripts/discourse/app/routes/group-manage-tags.js b/app/assets/javascripts/discourse/app/routes/group-manage-tags.js index b86cd6264f..6e2523485c 100644 --- a/app/assets/javascripts/discourse/app/routes/group-manage-tags.js +++ b/app/assets/javascripts/discourse/app/routes/group-manage-tags.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ showFooter: true, diff --git a/app/assets/javascripts/discourse/app/routes/group-manage.js b/app/assets/javascripts/discourse/app/routes/group-manage.js index 12d266476c..db7ef9a8bc 100644 --- a/app/assets/javascripts/discourse/app/routes/group-manage.js +++ b/app/assets/javascripts/discourse/app/routes/group-manage.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ showFooter: true, diff --git a/app/assets/javascripts/discourse/app/routes/group-messages.js b/app/assets/javascripts/discourse/app/routes/group-messages.js index 5b4296bca5..ffd83a263c 100644 --- a/app/assets/javascripts/discourse/app/routes/group-messages.js +++ b/app/assets/javascripts/discourse/app/routes/group-messages.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ titleToken() { diff --git a/app/assets/javascripts/discourse/app/routes/group-permissions.js b/app/assets/javascripts/discourse/app/routes/group-permissions.js index d907b4e148..82ba93cac9 100644 --- a/app/assets/javascripts/discourse/app/routes/group-permissions.js +++ b/app/assets/javascripts/discourse/app/routes/group-permissions.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; import { buildPermissionDescription } from "discourse/models/permission-type"; diff --git a/app/assets/javascripts/discourse/app/routes/group-requests.js b/app/assets/javascripts/discourse/app/routes/group-requests.js index 42ddf67a99..0c87f2cb5e 100644 --- a/app/assets/javascripts/discourse/app/routes/group-requests.js +++ b/app/assets/javascripts/discourse/app/routes/group-requests.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ titleToken() { diff --git a/app/assets/javascripts/discourse/app/routes/groups-index.js b/app/assets/javascripts/discourse/app/routes/groups-index.js index 6140931110..41684664ea 100644 --- a/app/assets/javascripts/discourse/app/routes/groups-index.js +++ b/app/assets/javascripts/discourse/app/routes/groups-index.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ titleToken() { diff --git a/app/assets/javascripts/discourse/app/routes/groups-new.js b/app/assets/javascripts/discourse/app/routes/groups-new.js index 1a4e5ce849..fe375c5459 100644 --- a/app/assets/javascripts/discourse/app/routes/groups-new.js +++ b/app/assets/javascripts/discourse/app/routes/groups-new.js @@ -1,6 +1,6 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; import Group from "discourse/models/group"; +import I18n from "I18n"; export default DiscourseRoute.extend({ showFooter: true, diff --git a/app/assets/javascripts/discourse/app/routes/invites-show.js b/app/assets/javascripts/discourse/app/routes/invites-show.js index a2546f2d1d..d094036fe6 100644 --- a/app/assets/javascripts/discourse/app/routes/invites-show.js +++ b/app/assets/javascripts/discourse/app/routes/invites-show.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; import PreloadStore from "discourse/lib/preload-store"; import { deepMerge } from "discourse-common/lib/object"; diff --git a/app/assets/javascripts/discourse/app/routes/login.js b/app/assets/javascripts/discourse/app/routes/login.js index 88dc645f30..bc6766c1a3 100644 --- a/app/assets/javascripts/discourse/app/routes/login.js +++ b/app/assets/javascripts/discourse/app/routes/login.js @@ -1,6 +1,6 @@ -import { next } from "@ember/runloop"; import buildStaticRoute from "discourse/routes/build-static-route"; import { defaultHomepage } from "discourse/lib/utilities"; +import { next } from "@ember/runloop"; const LoginRoute = buildStaticRoute("login"); diff --git a/app/assets/javascripts/discourse/app/routes/new-category.js b/app/assets/javascripts/discourse/app/routes/new-category.js index 0ff104ea25..5b6816a292 100644 --- a/app/assets/javascripts/discourse/app/routes/new-category.js +++ b/app/assets/javascripts/discourse/app/routes/new-category.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; -import { SEARCH_PRIORITIES } from "discourse/lib/constants"; +import I18n from "I18n"; import { Promise } from "rsvp"; +import { SEARCH_PRIORITIES } from "discourse/lib/constants"; export default DiscourseRoute.extend({ model() { diff --git a/app/assets/javascripts/discourse/app/routes/new-message.js b/app/assets/javascripts/discourse/app/routes/new-message.js index be40e45592..04c3be6bc2 100644 --- a/app/assets/javascripts/discourse/app/routes/new-message.js +++ b/app/assets/javascripts/discourse/app/routes/new-message.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import { next } from "@ember/runloop"; import DiscourseRoute from "discourse/routes/discourse"; -import User from "discourse/models/user"; import Group from "discourse/models/group"; +import I18n from "I18n"; +import User from "discourse/models/user"; import bootbox from "bootbox"; import cookie from "discourse/lib/cookie"; +import { next } from "@ember/runloop"; export default DiscourseRoute.extend({ beforeModel(transition) { diff --git a/app/assets/javascripts/discourse/app/routes/new-topic.js b/app/assets/javascripts/discourse/app/routes/new-topic.js index 538254dff0..abf30681a7 100644 --- a/app/assets/javascripts/discourse/app/routes/new-topic.js +++ b/app/assets/javascripts/discourse/app/routes/new-topic.js @@ -1,7 +1,7 @@ -import { next } from "@ember/runloop"; -import DiscourseRoute from "discourse/routes/discourse"; import Category from "discourse/models/category"; +import DiscourseRoute from "discourse/routes/discourse"; import cookie from "discourse/lib/cookie"; +import { next } from "@ember/runloop"; export default DiscourseRoute.extend({ beforeModel(transition) { diff --git a/app/assets/javascripts/discourse/app/routes/password-reset.js b/app/assets/javascripts/discourse/app/routes/password-reset.js index dca1f8ac0d..9ab12b4442 100644 --- a/app/assets/javascripts/discourse/app/routes/password-reset.js +++ b/app/assets/javascripts/discourse/app/routes/password-reset.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; import PreloadStore from "discourse/lib/preload-store"; import { ajax } from "discourse/lib/ajax"; -import { userPath } from "discourse/lib/url"; import { deepMerge } from "discourse-common/lib/object"; +import { userPath } from "discourse/lib/url"; export default DiscourseRoute.extend({ titleToken() { diff --git a/app/assets/javascripts/discourse/app/routes/preferences-account.js b/app/assets/javascripts/discourse/app/routes/preferences-account.js index 7e2fee5b55..a56664daf6 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-account.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-account.js @@ -1,6 +1,6 @@ -import showModal from "discourse/lib/show-modal"; -import UserBadge from "discourse/models/user-badge"; import RestrictedUserRoute from "discourse/routes/restricted-user"; +import UserBadge from "discourse/models/user-badge"; +import showModal from "discourse/lib/show-modal"; export default RestrictedUserRoute.extend({ showFooter: true, diff --git a/app/assets/javascripts/discourse/app/routes/review.js b/app/assets/javascripts/discourse/app/routes/review.js index dbb1204369..573150584d 100644 --- a/app/assets/javascripts/discourse/app/routes/review.js +++ b/app/assets/javascripts/discourse/app/routes/review.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ titleToken() { diff --git a/app/assets/javascripts/discourse/app/routes/signup.js b/app/assets/javascripts/discourse/app/routes/signup.js index 2130250a0e..f46e3c544e 100644 --- a/app/assets/javascripts/discourse/app/routes/signup.js +++ b/app/assets/javascripts/discourse/app/routes/signup.js @@ -1,5 +1,5 @@ -import { next } from "@ember/runloop"; import buildStaticRoute from "discourse/routes/build-static-route"; +import { next } from "@ember/runloop"; const SignupRoute = buildStaticRoute("signup"); diff --git a/app/assets/javascripts/discourse/app/routes/tag-groups-new.js b/app/assets/javascripts/discourse/app/routes/tag-groups-new.js index e7e27caa3d..8df2516fb6 100644 --- a/app/assets/javascripts/discourse/app/routes/tag-groups-new.js +++ b/app/assets/javascripts/discourse/app/routes/tag-groups-new.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ showFooter: true, diff --git a/app/assets/javascripts/discourse/app/routes/tag-groups.js b/app/assets/javascripts/discourse/app/routes/tag-groups.js index e0d9ff6798..53e95088e1 100644 --- a/app/assets/javascripts/discourse/app/routes/tag-groups.js +++ b/app/assets/javascripts/discourse/app/routes/tag-groups.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ showFooter: true, diff --git a/app/assets/javascripts/discourse/app/routes/tag-show.js b/app/assets/javascripts/discourse/app/routes/tag-show.js index 565c4ca23f..bc07ea23e3 100644 --- a/app/assets/javascripts/discourse/app/routes/tag-show.js +++ b/app/assets/javascripts/discourse/app/routes/tag-show.js @@ -1,21 +1,21 @@ -import { makeArray } from "discourse-common/lib/helpers"; -import I18n from "I18n"; -import DiscourseRoute from "discourse/routes/discourse"; -import Composer from "discourse/models/composer"; -import showModal from "discourse/lib/show-modal"; import { filterQueryParams, findTopicList, } from "discourse/routes/build-topic-route"; import { - resetParams, queryParams, + resetParams, } from "discourse/controllers/discovery-sortable"; -import PermissionType from "discourse/models/permission-type"; import Category from "discourse/models/category"; +import Composer from "discourse/models/composer"; +import DiscourseRoute from "discourse/routes/discourse"; import FilterModeMixin from "discourse/mixins/filter-mode"; +import I18n from "I18n"; +import PermissionType from "discourse/models/permission-type"; import { escapeExpression } from "discourse/lib/utilities"; +import { makeArray } from "discourse-common/lib/helpers"; import { setTopicList } from "discourse/lib/topic-list-tracker"; +import showModal from "discourse/lib/show-modal"; export default DiscourseRoute.extend(FilterModeMixin, { navMode: "latest", diff --git a/app/assets/javascripts/discourse/app/routes/tags-index.js b/app/assets/javascripts/discourse/app/routes/tags-index.js index d33acb9bbf..12409d9576 100644 --- a/app/assets/javascripts/discourse/app/routes/tags-index.js +++ b/app/assets/javascripts/discourse/app/routes/tags-index.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; import Tag from "discourse/models/tag"; export default DiscourseRoute.extend({ diff --git a/app/assets/javascripts/discourse/app/routes/topic-by-slug-or-id.js b/app/assets/javascripts/discourse/app/routes/topic-by-slug-or-id.js index 539aa4b4e4..0cfe24473f 100644 --- a/app/assets/javascripts/discourse/app/routes/topic-by-slug-or-id.js +++ b/app/assets/javascripts/discourse/app/routes/topic-by-slug-or-id.js @@ -1,5 +1,5 @@ -import DiscourseRoute from "discourse/routes/discourse"; import Topic, { ID_CONSTRAINT } from "discourse/models/topic"; +import DiscourseRoute from "discourse/routes/discourse"; import DiscourseURL from "discourse/lib/url"; export default DiscourseRoute.extend({ diff --git a/app/assets/javascripts/discourse/app/routes/topic-from-params.js b/app/assets/javascripts/discourse/app/routes/topic-from-params.js index d2818b12fc..35fd8b40dc 100644 --- a/app/assets/javascripts/discourse/app/routes/topic-from-params.js +++ b/app/assets/javascripts/discourse/app/routes/topic-from-params.js @@ -1,9 +1,9 @@ -import { isEmpty } from "@ember/utils"; -import { schedule } from "@ember/runloop"; import DiscourseRoute from "discourse/routes/discourse"; import DiscourseURL from "discourse/lib/url"; import Draft from "discourse/models/draft"; +import { isEmpty } from "@ember/utils"; import { isTesting } from "discourse-common/config/environment"; +import { schedule } from "@ember/runloop"; // This route is used for retrieving a topic based on params export default DiscourseRoute.extend({ diff --git a/app/assets/javascripts/discourse/app/routes/topic.js b/app/assets/javascripts/discourse/app/routes/topic.js index 2653598c89..06c1351a85 100644 --- a/app/assets/javascripts/discourse/app/routes/topic.js +++ b/app/assets/javascripts/discourse/app/routes/topic.js @@ -1,11 +1,11 @@ -import { get } from "@ember/object"; -import { isEmpty } from "@ember/utils"; import { cancel, later, schedule } from "@ember/runloop"; import DiscourseRoute from "discourse/routes/discourse"; import DiscourseURL from "discourse/lib/url"; import { ID_CONSTRAINT } from "discourse/models/topic"; -import { setTopicId } from "discourse/lib/topic-list-tracker"; +import { get } from "@ember/object"; +import { isEmpty } from "@ember/utils"; import { inject as service } from "@ember/service"; +import { setTopicId } from "discourse/lib/topic-list-tracker"; import showModal from "discourse/lib/show-modal"; const SCROLL_DELAY = 500; diff --git a/app/assets/javascripts/discourse/app/routes/unknown.js b/app/assets/javascripts/discourse/app/routes/unknown.js index 3365d463ee..81eafa6359 100644 --- a/app/assets/javascripts/discourse/app/routes/unknown.js +++ b/app/assets/javascripts/discourse/app/routes/unknown.js @@ -1,6 +1,6 @@ -import { ajax } from "discourse/lib/ajax"; -import DiscourseURL from "discourse/lib/url"; import DiscourseRoute from "discourse/routes/discourse"; +import DiscourseURL from "discourse/lib/url"; +import { ajax } from "discourse/lib/ajax"; export default DiscourseRoute.extend({ model(params, transition) { diff --git a/app/assets/javascripts/discourse/app/routes/user-activity-likes-given.js b/app/assets/javascripts/discourse/app/routes/user-activity-likes-given.js index 4b599e9718..6c3ef6b002 100644 --- a/app/assets/javascripts/discourse/app/routes/user-activity-likes-given.js +++ b/app/assets/javascripts/discourse/app/routes/user-activity-likes-given.js @@ -1,5 +1,5 @@ -import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; import UserAction from "discourse/models/user-action"; +import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; export default UserActivityStreamRoute.extend({ userActionType: UserAction.TYPES["likes_given"], diff --git a/app/assets/javascripts/discourse/app/routes/user-activity-pending.js b/app/assets/javascripts/discourse/app/routes/user-activity-pending.js index 2f22c7e549..e5b5633164 100644 --- a/app/assets/javascripts/discourse/app/routes/user-activity-pending.js +++ b/app/assets/javascripts/discourse/app/routes/user-activity-pending.js @@ -1,5 +1,5 @@ -import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; import UserAction from "discourse/models/user-action"; +import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; export default UserActivityStreamRoute.extend({ userActionType: UserAction.TYPES.pending, diff --git a/app/assets/javascripts/discourse/app/routes/user-activity-replies.js b/app/assets/javascripts/discourse/app/routes/user-activity-replies.js index d1fe8bf264..ec530a4acd 100644 --- a/app/assets/javascripts/discourse/app/routes/user-activity-replies.js +++ b/app/assets/javascripts/discourse/app/routes/user-activity-replies.js @@ -1,5 +1,5 @@ -import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; import UserAction from "discourse/models/user-action"; +import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; export default UserActivityStreamRoute.extend({ userActionType: UserAction.TYPES["posts"], diff --git a/app/assets/javascripts/discourse/app/routes/user-activity-topics.js b/app/assets/javascripts/discourse/app/routes/user-activity-topics.js index 108193cb09..3e736f3514 100644 --- a/app/assets/javascripts/discourse/app/routes/user-activity-topics.js +++ b/app/assets/javascripts/discourse/app/routes/user-activity-topics.js @@ -1,5 +1,5 @@ -import UserTopicListRoute from "discourse/routes/user-topic-list"; import UserAction from "discourse/models/user-action"; +import UserTopicListRoute from "discourse/routes/user-topic-list"; export default UserTopicListRoute.extend({ userActionType: UserAction.TYPES.topics, diff --git a/app/assets/javascripts/discourse/app/routes/user-badges.js b/app/assets/javascripts/discourse/app/routes/user-badges.js index c2b02b3b95..3f2d04421a 100644 --- a/app/assets/javascripts/discourse/app/routes/user-badges.js +++ b/app/assets/javascripts/discourse/app/routes/user-badges.js @@ -1,6 +1,6 @@ import DiscourseRoute from "discourse/routes/discourse"; -import ViewingActionType from "discourse/mixins/viewing-action-type"; import UserBadge from "discourse/models/user-badge"; +import ViewingActionType from "discourse/mixins/viewing-action-type"; export default DiscourseRoute.extend(ViewingActionType, { model() { diff --git a/app/assets/javascripts/discourse/app/routes/user-invited-show.js b/app/assets/javascripts/discourse/app/routes/user-invited-show.js index 88d93a5509..aaac65bb68 100644 --- a/app/assets/javascripts/discourse/app/routes/user-invited-show.js +++ b/app/assets/javascripts/discourse/app/routes/user-invited-show.js @@ -1,7 +1,7 @@ import DiscourseRoute from "discourse/routes/discourse"; import Invite from "discourse/models/invite"; -import showModal from "discourse/lib/show-modal"; import { getAbsoluteURL } from "discourse-common/lib/get-url"; +import showModal from "discourse/lib/show-modal"; export default DiscourseRoute.extend({ model(params) { diff --git a/app/assets/javascripts/discourse/app/routes/user-notifications-edits.js b/app/assets/javascripts/discourse/app/routes/user-notifications-edits.js index 134da934da..8be7b15b7b 100644 --- a/app/assets/javascripts/discourse/app/routes/user-notifications-edits.js +++ b/app/assets/javascripts/discourse/app/routes/user-notifications-edits.js @@ -1,5 +1,5 @@ -import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; import UserAction from "discourse/models/user-action"; +import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; export default UserActivityStreamRoute.extend({ userActionType: UserAction.TYPES["edits"], diff --git a/app/assets/javascripts/discourse/app/routes/user-notifications-likes-received.js b/app/assets/javascripts/discourse/app/routes/user-notifications-likes-received.js index 7206e7705d..1bfaa46b84 100644 --- a/app/assets/javascripts/discourse/app/routes/user-notifications-likes-received.js +++ b/app/assets/javascripts/discourse/app/routes/user-notifications-likes-received.js @@ -1,5 +1,5 @@ -import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; import UserAction from "discourse/models/user-action"; +import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; export default UserActivityStreamRoute.extend({ userActionType: UserAction.TYPES["likes_received"], diff --git a/app/assets/javascripts/discourse/app/routes/user-notifications-mentions.js b/app/assets/javascripts/discourse/app/routes/user-notifications-mentions.js index 0c212babc7..2d8c2622da 100644 --- a/app/assets/javascripts/discourse/app/routes/user-notifications-mentions.js +++ b/app/assets/javascripts/discourse/app/routes/user-notifications-mentions.js @@ -1,5 +1,5 @@ -import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; import UserAction from "discourse/models/user-action"; +import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; export default UserActivityStreamRoute.extend({ userActionType: UserAction.TYPES["mentions"], diff --git a/app/assets/javascripts/discourse/app/routes/user-notifications-responses.js b/app/assets/javascripts/discourse/app/routes/user-notifications-responses.js index 271373e0b1..52604ccdc5 100644 --- a/app/assets/javascripts/discourse/app/routes/user-notifications-responses.js +++ b/app/assets/javascripts/discourse/app/routes/user-notifications-responses.js @@ -1,5 +1,5 @@ -import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; import UserAction from "discourse/models/user-action"; +import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; export default UserActivityStreamRoute.extend({ userActionType: UserAction.TYPES["replies"], diff --git a/app/assets/javascripts/discourse/app/routes/user-private-messages-tags.js b/app/assets/javascripts/discourse/app/routes/user-private-messages-tags.js index 1ce81b56cf..3cbda900f1 100644 --- a/app/assets/javascripts/discourse/app/routes/user-private-messages-tags.js +++ b/app/assets/javascripts/discourse/app/routes/user-private-messages-tags.js @@ -1,6 +1,6 @@ -import I18n from "I18n"; -import EmberObject from "@ember/object"; import DiscourseRoute from "discourse/routes/discourse"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; import { popupAjaxError } from "discourse/lib/ajax-error"; diff --git a/app/assets/javascripts/discourse/app/routes/user-private-messages.js b/app/assets/javascripts/discourse/app/routes/user-private-messages.js index b9e22f7782..49851427c3 100644 --- a/app/assets/javascripts/discourse/app/routes/user-private-messages.js +++ b/app/assets/javascripts/discourse/app/routes/user-private-messages.js @@ -1,6 +1,6 @@ +import Composer from "discourse/models/composer"; import DiscourseRoute from "discourse/routes/discourse"; import Draft from "discourse/models/draft"; -import Composer from "discourse/models/composer"; export default DiscourseRoute.extend({ renderTemplate() { diff --git a/app/assets/javascripts/discourse/app/routes/user.js b/app/assets/javascripts/discourse/app/routes/user.js index c95ead4969..b8f7437d31 100644 --- a/app/assets/javascripts/discourse/app/routes/user.js +++ b/app/assets/javascripts/discourse/app/routes/user.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; import User from "discourse/models/user"; export default DiscourseRoute.extend({ diff --git a/app/assets/javascripts/discourse/app/routes/users.js b/app/assets/javascripts/discourse/app/routes/users.js index 4dad9ebbe6..c055d4e2cc 100644 --- a/app/assets/javascripts/discourse/app/routes/users.js +++ b/app/assets/javascripts/discourse/app/routes/users.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ queryParams: { diff --git a/app/assets/javascripts/discourse/app/services/app-events.js b/app/assets/javascripts/discourse/app/services/app-events.js index 9e738afecb..3e639e4b16 100644 --- a/app/assets/javascripts/discourse/app/services/app-events.js +++ b/app/assets/javascripts/discourse/app/services/app-events.js @@ -1,6 +1,6 @@ -import deprecated from "discourse-common/lib/deprecated"; import Evented from "@ember/object/evented"; import Service from "@ember/service"; +import deprecated from "discourse-common/lib/deprecated"; let _events = {}; diff --git a/app/assets/javascripts/discourse/app/services/logs-notice.js b/app/assets/javascripts/discourse/app/services/logs-notice.js index a3334aadc8..6c77e7c6b8 100644 --- a/app/assets/javascripts/discourse/app/services/logs-notice.js +++ b/app/assets/javascripts/discourse/app/services/logs-notice.js @@ -1,13 +1,13 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import EmberObject from "@ember/object"; import discourseComputed, { - on, observes, + on, } from "discourse-common/utils/decorators"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; import { autoUpdatingRelativeAge } from "discourse/lib/formatter"; +import getURL from "discourse-common/lib/get-url"; import { htmlSafe } from "@ember/template"; +import { isEmpty } from "@ember/utils"; const LOGS_NOTICE_KEY = "logs-notice-text"; diff --git a/app/assets/javascripts/discourse/app/services/theme-settings.js b/app/assets/javascripts/discourse/app/services/theme-settings.js index 88cc4f736d..3a1afbdf22 100644 --- a/app/assets/javascripts/discourse/app/services/theme-settings.js +++ b/app/assets/javascripts/discourse/app/services/theme-settings.js @@ -1,5 +1,5 @@ -import { get } from "@ember/object"; import Service from "@ember/service"; +import { get } from "@ember/object"; export default Service.extend({ settings: null, diff --git a/app/assets/javascripts/discourse/app/widgets/actions-summary.js b/app/assets/javascripts/discourse/app/widgets/actions-summary.js index faefd2c559..16f6be54ed 100644 --- a/app/assets/javascripts/discourse/app/widgets/actions-summary.js +++ b/app/assets/javascripts/discourse/app/widgets/actions-summary.js @@ -1,10 +1,10 @@ -import getURL from "discourse-common/lib/get-url"; import I18n from "I18n"; -import { createWidget } from "discourse/widgets/widget"; import { avatarFor } from "discourse/widgets/post"; +import { createWidget } from "discourse/widgets/widget"; +import getURL from "discourse-common/lib/get-url"; import { h } from "virtual-dom"; -import { userPath } from "discourse/lib/url"; import hbs from "discourse/widgets/hbs-compiler"; +import { userPath } from "discourse/lib/url"; export function smallUserAtts(user) { return { diff --git a/app/assets/javascripts/discourse/app/widgets/avatar-flair.js b/app/assets/javascripts/discourse/app/widgets/avatar-flair.js index 4e1c5f0696..5aafe34de9 100644 --- a/app/assets/javascripts/discourse/app/widgets/avatar-flair.js +++ b/app/assets/javascripts/discourse/app/widgets/avatar-flair.js @@ -1,5 +1,5 @@ +import { convertIconClass, iconNode } from "discourse-common/lib/icon-library"; import { createWidget } from "discourse/widgets/widget"; -import { iconNode, convertIconClass } from "discourse-common/lib/icon-library"; import { escapeExpression } from "discourse/lib/utilities"; createWidget("avatar-flair", { diff --git a/app/assets/javascripts/discourse/app/widgets/bookmark-reminder-notification-item.js b/app/assets/javascripts/discourse/app/widgets/bookmark-reminder-notification-item.js index f923e8e0cd..5dd5c2c314 100644 --- a/app/assets/javascripts/discourse/app/widgets/bookmark-reminder-notification-item.js +++ b/app/assets/javascripts/discourse/app/widgets/bookmark-reminder-notification-item.js @@ -1,6 +1,6 @@ +import { DefaultNotificationItem } from "discourse/widgets/default-notification-item"; import I18n from "I18n"; import { createWidgetFrom } from "discourse/widgets/widget"; -import { DefaultNotificationItem } from "discourse/widgets/default-notification-item"; import { formatUsername } from "discourse/lib/utilities"; createWidgetFrom( diff --git a/app/assets/javascripts/discourse/app/widgets/button.js b/app/assets/javascripts/discourse/app/widgets/button.js index 82e706a7d0..413d01ba28 100644 --- a/app/assets/javascripts/discourse/app/widgets/button.js +++ b/app/assets/javascripts/discourse/app/widgets/button.js @@ -1,8 +1,8 @@ +import DiscourseURL from "discourse/lib/url"; import I18n from "I18n"; import { createWidget } from "discourse/widgets/widget"; -import { iconNode } from "discourse-common/lib/icon-library"; import { h } from "virtual-dom"; -import DiscourseURL from "discourse/lib/url"; +import { iconNode } from "discourse-common/lib/icon-library"; export const ButtonClass = { tagName: "button.widget-button.btn", diff --git a/app/assets/javascripts/discourse/app/widgets/component-connector.js b/app/assets/javascripts/discourse/app/widgets/component-connector.js index db52456adc..8799d2770f 100644 --- a/app/assets/javascripts/discourse/app/widgets/component-connector.js +++ b/app/assets/javascripts/discourse/app/widgets/component-connector.js @@ -1,5 +1,5 @@ -import { scheduleOnce } from "@ember/runloop"; import { getOwner } from "@ember/application"; +import { scheduleOnce } from "@ember/runloop"; export default class ComponentConnector { constructor(widget, componentName, opts, trackedProperties) { diff --git a/app/assets/javascripts/discourse/app/widgets/connector.js b/app/assets/javascripts/discourse/app/widgets/connector.js index 25c6e8e852..7e08a18e23 100644 --- a/app/assets/javascripts/discourse/app/widgets/connector.js +++ b/app/assets/javascripts/discourse/app/widgets/connector.js @@ -1,5 +1,5 @@ -import { next } from "@ember/runloop"; import { getOwner } from "@ember/application"; +import { next } from "@ember/runloop"; export default class Connector { constructor(widget, opts) { diff --git a/app/assets/javascripts/discourse/app/widgets/custom-notification-item.js b/app/assets/javascripts/discourse/app/widgets/custom-notification-item.js index 2f395a75ed..72c8dc6269 100644 --- a/app/assets/javascripts/discourse/app/widgets/custom-notification-item.js +++ b/app/assets/javascripts/discourse/app/widgets/custom-notification-item.js @@ -1,6 +1,6 @@ +import { DefaultNotificationItem } from "discourse/widgets/default-notification-item"; import I18n from "I18n"; import { createWidgetFrom } from "discourse/widgets/widget"; -import { DefaultNotificationItem } from "discourse/widgets/default-notification-item"; import { formatUsername } from "discourse/lib/utilities"; import { iconNode } from "discourse-common/lib/icon-library"; diff --git a/app/assets/javascripts/discourse/app/widgets/decorator-helper.js b/app/assets/javascripts/discourse/app/widgets/decorator-helper.js index 7c67d99ed9..fcd58cba03 100644 --- a/app/assets/javascripts/discourse/app/widgets/decorator-helper.js +++ b/app/assets/javascripts/discourse/app/widgets/decorator-helper.js @@ -1,7 +1,7 @@ import Connector from "discourse/widgets/connector"; -import { h } from "virtual-dom"; import PostCooked from "discourse/widgets/post-cooked"; import RawHtml from "discourse/widgets/raw-html"; +import { h } from "virtual-dom"; class DecoratorHelper { constructor(widget, attrs, state) { diff --git a/app/assets/javascripts/discourse/app/widgets/default-notification-item.js b/app/assets/javascripts/discourse/app/widgets/default-notification-item.js index a935121d13..1e0974904a 100644 --- a/app/assets/javascripts/discourse/app/widgets/default-notification-item.js +++ b/app/assets/javascripts/discourse/app/widgets/default-notification-item.js @@ -1,19 +1,19 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import { wantsNewWindow } from "discourse/lib/intercept-click"; -import RawHtml from "discourse/widgets/raw-html"; -import { createWidget } from "discourse/widgets/widget"; -import { h } from "virtual-dom"; -import { emojiUnescape } from "discourse/lib/text"; +import DiscourseURL, { userPath } from "discourse/lib/url"; +import { ajax, setTransientHeader } from "discourse/lib/ajax"; import { - postUrl, escapeExpression, formatUsername, + postUrl, } from "discourse/lib/utilities"; -import DiscourseURL, { userPath } from "discourse/lib/url"; -import { iconNode } from "discourse-common/lib/icon-library"; -import { ajax, setTransientHeader } from "discourse/lib/ajax"; +import I18n from "I18n"; +import RawHtml from "discourse/widgets/raw-html"; +import { createWidget } from "discourse/widgets/widget"; +import { emojiUnescape } from "discourse/lib/text"; import getURL from "discourse-common/lib/get-url"; +import { h } from "virtual-dom"; +import { iconNode } from "discourse-common/lib/icon-library"; +import { isEmpty } from "@ember/utils"; +import { wantsNewWindow } from "discourse/lib/intercept-click"; export const DefaultNotificationItem = createWidget( "default-notification-item", diff --git a/app/assets/javascripts/discourse/app/widgets/embedded-post.js b/app/assets/javascripts/discourse/app/widgets/embedded-post.js index 7e00cf04db..a723373454 100644 --- a/app/assets/javascripts/discourse/app/widgets/embedded-post.js +++ b/app/assets/javascripts/discourse/app/widgets/embedded-post.js @@ -1,8 +1,8 @@ -import PostCooked from "discourse/widgets/post-cooked"; import DecoratorHelper from "discourse/widgets/decorator-helper"; +import DiscourseURL from "discourse/lib/url"; +import PostCooked from "discourse/widgets/post-cooked"; import { createWidget } from "discourse/widgets/widget"; import { h } from "virtual-dom"; -import DiscourseURL from "discourse/lib/url"; import hbs from "discourse/widgets/hbs-compiler"; createWidget("post-link-arrow", { diff --git a/app/assets/javascripts/discourse/app/widgets/emoji.js b/app/assets/javascripts/discourse/app/widgets/emoji.js index 3c2b5e3b32..d1185ae9d5 100644 --- a/app/assets/javascripts/discourse/app/widgets/emoji.js +++ b/app/assets/javascripts/discourse/app/widgets/emoji.js @@ -1,6 +1,6 @@ -import { createWidget } from "discourse/widgets/widget"; -import { emojiUrlFor, emojiUnescape } from "discourse/lib/text"; +import { emojiUnescape, emojiUrlFor } from "discourse/lib/text"; import RawHtml from "discourse/widgets/raw-html"; +import { createWidget } from "discourse/widgets/widget"; import { escapeExpression } from "discourse/lib/utilities"; export function replaceEmoji(str) { diff --git a/app/assets/javascripts/discourse/app/widgets/footer-nav.js b/app/assets/javascripts/discourse/app/widgets/footer-nav.js index 0d57be4973..1a61ad34cc 100644 --- a/app/assets/javascripts/discourse/app/widgets/footer-nav.js +++ b/app/assets/javascripts/discourse/app/widgets/footer-nav.js @@ -1,5 +1,5 @@ -import { createWidget } from "discourse/widgets/widget"; import { isAppWebview, postRNWebviewMessage } from "discourse/lib/utilities"; +import { createWidget } from "discourse/widgets/widget"; createWidget("footer-nav", { tagName: "div.footer-nav-widget", diff --git a/app/assets/javascripts/discourse/app/widgets/group-message-summary-notification-item.js b/app/assets/javascripts/discourse/app/widgets/group-message-summary-notification-item.js index c005ec0a4f..03b3fea88a 100644 --- a/app/assets/javascripts/discourse/app/widgets/group-message-summary-notification-item.js +++ b/app/assets/javascripts/discourse/app/widgets/group-message-summary-notification-item.js @@ -1,6 +1,6 @@ +import { DefaultNotificationItem } from "discourse/widgets/default-notification-item"; import I18n from "I18n"; import { createWidgetFrom } from "discourse/widgets/widget"; -import { DefaultNotificationItem } from "discourse/widgets/default-notification-item"; createWidgetFrom( DefaultNotificationItem, diff --git a/app/assets/javascripts/discourse/app/widgets/hamburger-categories.js b/app/assets/javascripts/discourse/app/widgets/hamburger-categories.js index 3c7de57033..8ef945c88b 100644 --- a/app/assets/javascripts/discourse/app/widgets/hamburger-categories.js +++ b/app/assets/javascripts/discourse/app/widgets/hamburger-categories.js @@ -1,9 +1,9 @@ -import getURL from "discourse-common/lib/get-url"; +import Category from "discourse/models/category"; import I18n from "I18n"; import { createWidget } from "discourse/widgets/widget"; +import getURL from "discourse-common/lib/get-url"; import { h } from "virtual-dom"; import { number } from "discourse/lib/formatter"; -import Category from "discourse/models/category"; createWidget("hamburger-category", { tagName: "li.category-link", diff --git a/app/assets/javascripts/discourse/app/widgets/hamburger-menu.js b/app/assets/javascripts/discourse/app/widgets/hamburger-menu.js index b13a698a4e..b7a044358c 100644 --- a/app/assets/javascripts/discourse/app/widgets/hamburger-menu.js +++ b/app/assets/javascripts/discourse/app/widgets/hamburger-menu.js @@ -1,12 +1,12 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import { later } from "@ember/runloop"; -import { createWidget, applyDecorators } from "discourse/widgets/widget"; -import { h } from "virtual-dom"; import DiscourseURL, { userPath } from "discourse/lib/url"; -import { ajax } from "discourse/lib/ajax"; -import { wantsNewWindow } from "discourse/lib/intercept-click"; +import { applyDecorators, createWidget } from "discourse/widgets/widget"; +import I18n from "I18n"; import { NotificationLevels } from "discourse/lib/notification-levels"; +import { ajax } from "discourse/lib/ajax"; +import getURL from "discourse-common/lib/get-url"; +import { h } from "virtual-dom"; +import { later } from "@ember/runloop"; +import { wantsNewWindow } from "discourse/lib/intercept-click"; const flatten = (array) => [].concat.apply([], array); diff --git a/app/assets/javascripts/discourse/app/widgets/header-topic-info.js b/app/assets/javascripts/discourse/app/widgets/header-topic-info.js index d5099ea66f..1d223eb5f5 100644 --- a/app/assets/javascripts/discourse/app/widgets/header-topic-info.js +++ b/app/assets/javascripts/discourse/app/widgets/header-topic-info.js @@ -1,13 +1,13 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; import { applyDecorators, createWidget } from "discourse/widgets/widget"; +import DiscourseURL from "discourse/lib/url"; +import I18n from "I18n"; +import RawHtml from "discourse/widgets/raw-html"; +import { avatarImg } from "discourse/widgets/post"; +import getURL from "discourse-common/lib/get-url"; import { h } from "virtual-dom"; import { iconNode } from "discourse-common/lib/icon-library"; -import DiscourseURL from "discourse/lib/url"; -import RawHtml from "discourse/widgets/raw-html"; import renderTags from "discourse/lib/render-tags"; import { topicFeaturedLinkNode } from "discourse/lib/render-topic-featured-link"; -import { avatarImg } from "discourse/widgets/post"; createWidget("topic-header-participant", { tagName: "span", diff --git a/app/assets/javascripts/discourse/app/widgets/header.js b/app/assets/javascripts/discourse/app/widgets/header.js index 11a8a03849..a76108cb5b 100644 --- a/app/assets/javascripts/discourse/app/widgets/header.js +++ b/app/assets/javascripts/discourse/app/widgets/header.js @@ -1,17 +1,17 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import { get } from "@ember/object"; -import { schedule } from "@ember/runloop"; -import { createWidget } from "discourse/widgets/widget"; -import { iconNode } from "discourse-common/lib/icon-library"; -import { avatarImg } from "discourse/widgets/post"; import DiscourseURL, { userPath } from "discourse/lib/url"; -import { wantsNewWindow } from "discourse/lib/intercept-click"; -import { applySearchAutocomplete } from "discourse/lib/search"; -import { ajax } from "discourse/lib/ajax"; +import I18n from "I18n"; import { addExtraUserClasses } from "discourse/helpers/user-avatar"; -import { scrollTop } from "discourse/mixins/scroll-top"; +import { ajax } from "discourse/lib/ajax"; +import { applySearchAutocomplete } from "discourse/lib/search"; +import { avatarImg } from "discourse/widgets/post"; +import { createWidget } from "discourse/widgets/widget"; +import { get } from "@ember/object"; +import getURL from "discourse-common/lib/get-url"; import { h } from "virtual-dom"; +import { iconNode } from "discourse-common/lib/icon-library"; +import { schedule } from "@ember/runloop"; +import { scrollTop } from "discourse/mixins/scroll-top"; +import { wantsNewWindow } from "discourse/lib/intercept-click"; const _extraHeaderIcons = []; diff --git a/app/assets/javascripts/discourse/app/widgets/home-logo.js b/app/assets/javascripts/discourse/app/widgets/home-logo.js index 8fb0a4ef71..971d74f948 100644 --- a/app/assets/javascripts/discourse/app/widgets/home-logo.js +++ b/app/assets/javascripts/discourse/app/widgets/home-logo.js @@ -1,10 +1,10 @@ -import getURL from "discourse-common/lib/get-url"; +import DiscourseURL from "discourse/lib/url"; +import Session from "discourse/models/session"; import { createWidget } from "discourse/widgets/widget"; +import getURL from "discourse-common/lib/get-url"; import { h } from "virtual-dom"; import { iconNode } from "discourse-common/lib/icon-library"; import { wantsNewWindow } from "discourse/lib/intercept-click"; -import DiscourseURL from "discourse/lib/url"; -import Session from "discourse/models/session"; export default createWidget("home-logo", { tagName: "div.title", diff --git a/app/assets/javascripts/discourse/app/widgets/invitee-accepted-notification-item.js b/app/assets/javascripts/discourse/app/widgets/invitee-accepted-notification-item.js index 26fc48f971..0b0b181aba 100644 --- a/app/assets/javascripts/discourse/app/widgets/invitee-accepted-notification-item.js +++ b/app/assets/javascripts/discourse/app/widgets/invitee-accepted-notification-item.js @@ -1,5 +1,5 @@ -import { createWidgetFrom } from "discourse/widgets/widget"; import { DefaultNotificationItem } from "discourse/widgets/default-notification-item"; +import { createWidgetFrom } from "discourse/widgets/widget"; import { userPath } from "discourse/lib/url"; createWidgetFrom( diff --git a/app/assets/javascripts/discourse/app/widgets/liked-consolidated-notification-item.js b/app/assets/javascripts/discourse/app/widgets/liked-consolidated-notification-item.js index 6901f3b6a2..9257687fb4 100644 --- a/app/assets/javascripts/discourse/app/widgets/liked-consolidated-notification-item.js +++ b/app/assets/javascripts/discourse/app/widgets/liked-consolidated-notification-item.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; -import { isEmpty } from "@ember/utils"; -import { createWidgetFrom } from "discourse/widgets/widget"; import { DefaultNotificationItem } from "discourse/widgets/default-notification-item"; +import I18n from "I18n"; +import { createWidgetFrom } from "discourse/widgets/widget"; import { escapeExpression } from "discourse/lib/utilities"; +import { isEmpty } from "@ember/utils"; import { userPath } from "discourse/lib/url"; createWidgetFrom( diff --git a/app/assets/javascripts/discourse/app/widgets/liked-notification-item.js b/app/assets/javascripts/discourse/app/widgets/liked-notification-item.js index 46d5db1231..97b62d4eba 100644 --- a/app/assets/javascripts/discourse/app/widgets/liked-notification-item.js +++ b/app/assets/javascripts/discourse/app/widgets/liked-notification-item.js @@ -1,6 +1,6 @@ +import { DefaultNotificationItem } from "discourse/widgets/default-notification-item"; import I18n from "I18n"; import { createWidgetFrom } from "discourse/widgets/widget"; -import { DefaultNotificationItem } from "discourse/widgets/default-notification-item"; import { formatUsername } from "discourse/lib/utilities"; createWidgetFrom(DefaultNotificationItem, "liked-notification-item", { diff --git a/app/assets/javascripts/discourse/app/widgets/link.js b/app/assets/javascripts/discourse/app/widgets/link.js index 63452b0520..8dc41e842f 100644 --- a/app/assets/javascripts/discourse/app/widgets/link.js +++ b/app/assets/javascripts/discourse/app/widgets/link.js @@ -1,10 +1,10 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import { wantsNewWindow } from "discourse/lib/intercept-click"; -import { createWidget } from "discourse/widgets/widget"; -import { iconNode } from "discourse-common/lib/icon-library"; -import { h } from "virtual-dom"; import DiscourseURL from "discourse/lib/url"; +import I18n from "I18n"; +import { createWidget } from "discourse/widgets/widget"; +import getURL from "discourse-common/lib/get-url"; +import { h } from "virtual-dom"; +import { iconNode } from "discourse-common/lib/icon-library"; +import { wantsNewWindow } from "discourse/lib/intercept-click"; export default createWidget("link", { tagName: "a", diff --git a/app/assets/javascripts/discourse/app/widgets/membership-request-accepted-notification-item.js b/app/assets/javascripts/discourse/app/widgets/membership-request-accepted-notification-item.js index f47cea3eda..93dc02b7fb 100644 --- a/app/assets/javascripts/discourse/app/widgets/membership-request-accepted-notification-item.js +++ b/app/assets/javascripts/discourse/app/widgets/membership-request-accepted-notification-item.js @@ -1,6 +1,6 @@ +import { DefaultNotificationItem } from "discourse/widgets/default-notification-item"; import I18n from "I18n"; import { createWidgetFrom } from "discourse/widgets/widget"; -import { DefaultNotificationItem } from "discourse/widgets/default-notification-item"; import { groupPath } from "discourse/lib/url"; createWidgetFrom( diff --git a/app/assets/javascripts/discourse/app/widgets/membership-request-consolidated-notification-item.js b/app/assets/javascripts/discourse/app/widgets/membership-request-consolidated-notification-item.js index 62a8503027..cd270077db 100644 --- a/app/assets/javascripts/discourse/app/widgets/membership-request-consolidated-notification-item.js +++ b/app/assets/javascripts/discourse/app/widgets/membership-request-consolidated-notification-item.js @@ -1,6 +1,6 @@ +import { DefaultNotificationItem } from "discourse/widgets/default-notification-item"; import I18n from "I18n"; import { createWidgetFrom } from "discourse/widgets/widget"; -import { DefaultNotificationItem } from "discourse/widgets/default-notification-item"; import { userPath } from "discourse/lib/url"; createWidgetFrom( diff --git a/app/assets/javascripts/discourse/app/widgets/menu-panel.js b/app/assets/javascripts/discourse/app/widgets/menu-panel.js index 4a07f37a68..5c9872bb72 100644 --- a/app/assets/javascripts/discourse/app/widgets/menu-panel.js +++ b/app/assets/javascripts/discourse/app/widgets/menu-panel.js @@ -1,6 +1,6 @@ -import hbs from "discourse/widgets/hbs-compiler"; import { createWidget } from "discourse/widgets/widget"; import { h } from "virtual-dom"; +import hbs from "discourse/widgets/hbs-compiler"; createWidget("menu-links", { buildClasses(attrs) { diff --git a/app/assets/javascripts/discourse/app/widgets/post-admin-menu.js b/app/assets/javascripts/discourse/app/widgets/post-admin-menu.js index bc1b4369c5..dd56714c1b 100644 --- a/app/assets/javascripts/discourse/app/widgets/post-admin-menu.js +++ b/app/assets/javascripts/discourse/app/widgets/post-admin-menu.js @@ -1,6 +1,6 @@ +import { ButtonClass } from "discourse/widgets/button"; import { createWidget } from "discourse/widgets/widget"; import { h } from "virtual-dom"; -import { ButtonClass } from "discourse/widgets/button"; createWidget( "post-admin-menu-button", diff --git a/app/assets/javascripts/discourse/app/widgets/post-cooked.js b/app/assets/javascripts/discourse/app/widgets/post-cooked.js index 94a61f66e3..5de05a4996 100644 --- a/app/assets/javascripts/discourse/app/widgets/post-cooked.js +++ b/app/assets/javascripts/discourse/app/widgets/post-cooked.js @@ -1,10 +1,10 @@ +import highlightHTML, { unhighlightHTML } from "discourse/lib/highlight-html"; import I18n from "I18n"; -import { iconHTML } from "discourse-common/lib/icon-library"; import { ajax } from "discourse/lib/ajax"; +import highlightSearch from "discourse/lib/highlight-search"; +import { iconHTML } from "discourse-common/lib/icon-library"; import { isValidLink } from "discourse/lib/click-track"; import { number } from "discourse/lib/formatter"; -import highlightSearch from "discourse/lib/highlight-search"; -import highlightHTML, { unhighlightHTML } from "discourse/lib/highlight-html"; import { spinnerHTML } from "discourse/helpers/loading-spinner"; let _beforeAdoptDecorators = []; diff --git a/app/assets/javascripts/discourse/app/widgets/post-edits-indicator.js b/app/assets/javascripts/discourse/app/widgets/post-edits-indicator.js index 5a69e4c338..818da0e0c3 100644 --- a/app/assets/javascripts/discourse/app/widgets/post-edits-indicator.js +++ b/app/assets/javascripts/discourse/app/widgets/post-edits-indicator.js @@ -1,8 +1,8 @@ import I18n from "I18n"; import { createWidget } from "discourse/widgets/widget"; +import { h } from "virtual-dom"; import { iconNode } from "discourse-common/lib/icon-library"; import { longDate } from "discourse/lib/formatter"; -import { h } from "virtual-dom"; function mult(val) { return 60 * 50 * 1000 * val; diff --git a/app/assets/javascripts/discourse/app/widgets/post-links.js b/app/assets/javascripts/discourse/app/widgets/post-links.js index 36ea35513b..54d437b6cd 100644 --- a/app/assets/javascripts/discourse/app/widgets/post-links.js +++ b/app/assets/javascripts/discourse/app/widgets/post-links.js @@ -1,6 +1,6 @@ -import { iconNode } from "discourse-common/lib/icon-library"; import { createWidget } from "discourse/widgets/widget"; import { h } from "virtual-dom"; +import { iconNode } from "discourse-common/lib/icon-library"; import { replaceEmoji } from "discourse/widgets/emoji"; export default createWidget("post-links", { diff --git a/app/assets/javascripts/discourse/app/widgets/post-menu.js b/app/assets/javascripts/discourse/app/widgets/post-menu.js index 17002ce893..ed5fe33b13 100644 --- a/app/assets/javascripts/discourse/app/widgets/post-menu.js +++ b/app/assets/javascripts/discourse/app/widgets/post-menu.js @@ -1,11 +1,11 @@ -import { next, run } from "@ember/runloop"; import { applyDecorators, createWidget } from "discourse/widgets/widget"; -import { smallUserAtts } from "discourse/widgets/actions-summary"; -import { h } from "virtual-dom"; -import showModal from "discourse/lib/show-modal"; +import { next, run } from "@ember/runloop"; import { Promise } from "rsvp"; -import { isTesting } from "discourse-common/config/environment"; import { formattedReminderTime } from "discourse/lib/bookmark"; +import { h } from "virtual-dom"; +import { isTesting } from "discourse-common/config/environment"; +import showModal from "discourse/lib/show-modal"; +import { smallUserAtts } from "discourse/widgets/actions-summary"; const LIKE_ACTION = 2; const VIBRATE_DURATION = 5; diff --git a/app/assets/javascripts/discourse/app/widgets/post-small-action.js b/app/assets/javascripts/discourse/app/widgets/post-small-action.js index 824c72bea1..700ffef23a 100644 --- a/app/assets/javascripts/discourse/app/widgets/post-small-action.js +++ b/app/assets/javascripts/discourse/app/widgets/post-small-action.js @@ -1,12 +1,12 @@ import I18n from "I18n"; -import { createWidget } from "discourse/widgets/widget"; import RawHtml from "discourse/widgets/raw-html"; -import { iconNode } from "discourse-common/lib/icon-library"; -import { h } from "virtual-dom"; -import { avatarFor } from "discourse/widgets/post"; -import { userPath } from "discourse/lib/url"; import { autoUpdatingRelativeAge } from "discourse/lib/formatter"; +import { avatarFor } from "discourse/widgets/post"; import { computed } from "@ember/object"; +import { createWidget } from "discourse/widgets/widget"; +import { h } from "virtual-dom"; +import { iconNode } from "discourse-common/lib/icon-library"; +import { userPath } from "discourse/lib/url"; export function actionDescriptionHtml(actionCode, createdAt, username) { const dt = new Date(createdAt); diff --git a/app/assets/javascripts/discourse/app/widgets/post-stream.js b/app/assets/javascripts/discourse/app/widgets/post-stream.js index c4d32dacc6..e8dc61cf32 100644 --- a/app/assets/javascripts/discourse/app/widgets/post-stream.js +++ b/app/assets/javascripts/discourse/app/widgets/post-stream.js @@ -1,9 +1,9 @@ -import { debounce } from "@ember/runloop"; -import { createWidget } from "discourse/widgets/widget"; -import transformPost from "discourse/lib/transform-post"; import { Placeholder } from "discourse/lib/posts-with-placeholders"; import { addWidgetCleanCallback } from "discourse/components/mount-widget"; +import { createWidget } from "discourse/widgets/widget"; +import { debounce } from "@ember/runloop"; import { isTesting } from "discourse-common/config/environment"; +import transformPost from "discourse/lib/transform-post"; let transformCallbacks = null; export function postTransformCallbacks(transformed) { diff --git a/app/assets/javascripts/discourse/app/widgets/post.js b/app/assets/javascripts/discourse/app/widgets/post.js index 7d8d0d3f6a..0a97e6332e 100644 --- a/app/assets/javascripts/discourse/app/widgets/post.js +++ b/app/assets/javascripts/discourse/app/widgets/post.js @@ -1,25 +1,25 @@ -import getURL, { getURLWithCDN } from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import PostCooked from "discourse/widgets/post-cooked"; -import DecoratorHelper from "discourse/widgets/decorator-helper"; -import { createWidget, applyDecorators } from "discourse/widgets/widget"; -import RawHtml from "discourse/widgets/raw-html"; -import { iconNode } from "discourse-common/lib/icon-library"; -import { transformBasicPost } from "discourse/lib/transform-post"; -import { postTransformCallbacks } from "discourse/widgets/post-stream"; -import { h } from "virtual-dom"; -import DiscourseURL from "discourse/lib/url"; -import { dateNode } from "discourse/helpers/node"; +import { applyDecorators, createWidget } from "discourse/widgets/widget"; import { - translateSize, avatarUrl, formatUsername, + translateSize, } from "discourse/lib/utilities"; -import hbs from "discourse/widgets/hbs-compiler"; -import { relativeAgeMediumSpan } from "discourse/lib/formatter"; -import { prioritizeNameInUx } from "discourse/lib/settings"; +import getURL, { getURLWithCDN } from "discourse-common/lib/get-url"; +import DecoratorHelper from "discourse/widgets/decorator-helper"; +import DiscourseURL from "discourse/lib/url"; +import I18n from "I18n"; +import PostCooked from "discourse/widgets/post-cooked"; import { Promise } from "rsvp"; +import RawHtml from "discourse/widgets/raw-html"; import bootbox from "bootbox"; +import { dateNode } from "discourse/helpers/node"; +import { h } from "virtual-dom"; +import hbs from "discourse/widgets/hbs-compiler"; +import { iconNode } from "discourse-common/lib/icon-library"; +import { postTransformCallbacks } from "discourse/widgets/post-stream"; +import { prioritizeNameInUx } from "discourse/lib/settings"; +import { relativeAgeMediumSpan } from "discourse/lib/formatter"; +import { transformBasicPost } from "discourse/lib/transform-post"; function transformWithCallbacks(post) { let transformed = transformBasicPost(post); diff --git a/app/assets/javascripts/discourse/app/widgets/poster-name.js b/app/assets/javascripts/discourse/app/widgets/poster-name.js index da553bf9b5..441fda53fd 100644 --- a/app/assets/javascripts/discourse/app/widgets/poster-name.js +++ b/app/assets/javascripts/discourse/app/widgets/poster-name.js @@ -1,9 +1,9 @@ -import getURL from "discourse-common/lib/get-url"; +import { applyDecorators, createWidget } from "discourse/widgets/widget"; import I18n from "I18n"; -import { iconNode } from "discourse-common/lib/icon-library"; -import { createWidget, applyDecorators } from "discourse/widgets/widget"; -import { h } from "virtual-dom"; import { formatUsername } from "discourse/lib/utilities"; +import getURL from "discourse-common/lib/get-url"; +import { h } from "virtual-dom"; +import { iconNode } from "discourse-common/lib/icon-library"; import { prioritizeNameInUx } from "discourse/lib/settings"; let sanitizeName = function (name) { diff --git a/app/assets/javascripts/discourse/app/widgets/private-message-map.js b/app/assets/javascripts/discourse/app/widgets/private-message-map.js index 13784716e0..9a68c2e16d 100644 --- a/app/assets/javascripts/discourse/app/widgets/private-message-map.js +++ b/app/assets/javascripts/discourse/app/widgets/private-message-map.js @@ -1,11 +1,11 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import { makeArray } from "discourse-common/lib/helpers"; -import { createWidget } from "discourse/widgets/widget"; -import { h } from "virtual-dom"; import { avatarFor, avatarImg } from "discourse/widgets/post"; -import hbs from "discourse/widgets/hbs-compiler"; +import I18n from "I18n"; import bootbox from "bootbox"; +import { createWidget } from "discourse/widgets/widget"; +import getURL from "discourse-common/lib/get-url"; +import { h } from "virtual-dom"; +import hbs from "discourse/widgets/hbs-compiler"; +import { makeArray } from "discourse-common/lib/helpers"; createWidget("pm-remove-group-link", { tagName: "a.remove-invited.no-text.btn-icon.btn", diff --git a/app/assets/javascripts/discourse/app/widgets/quick-access-bookmarks.js b/app/assets/javascripts/discourse/app/widgets/quick-access-bookmarks.js index fdeb7e0a86..9f8c99f889 100644 --- a/app/assets/javascripts/discourse/app/widgets/quick-access-bookmarks.js +++ b/app/assets/javascripts/discourse/app/widgets/quick-access-bookmarks.js @@ -1,8 +1,8 @@ -import { h } from "virtual-dom"; import QuickAccessPanel from "discourse/widgets/quick-access-panel"; import UserAction from "discourse/models/user-action"; import { ajax } from "discourse/lib/ajax"; import { createWidgetFrom } from "discourse/widgets/widget"; +import { h } from "virtual-dom"; import { postUrl } from "discourse/lib/utilities"; const ICON = "bookmark"; diff --git a/app/assets/javascripts/discourse/app/widgets/quick-access-item.js b/app/assets/javascripts/discourse/app/widgets/quick-access-item.js index f21fbf971b..b5a241214e 100644 --- a/app/assets/javascripts/discourse/app/widgets/quick-access-item.js +++ b/app/assets/javascripts/discourse/app/widgets/quick-access-item.js @@ -1,9 +1,9 @@ -import { h } from "virtual-dom"; import RawHtml from "discourse/widgets/raw-html"; import { createWidget } from "discourse/widgets/widget"; import { emojiUnescape } from "discourse/lib/text"; -import { iconNode } from "discourse-common/lib/icon-library"; import { escapeExpression } from "discourse/lib/utilities"; +import { h } from "virtual-dom"; +import { iconNode } from "discourse-common/lib/icon-library"; /** * This helper widget tries to enforce a consistent look and behavior for any diff --git a/app/assets/javascripts/discourse/app/widgets/quick-access-notifications.js b/app/assets/javascripts/discourse/app/widgets/quick-access-notifications.js index 39d8e14a7b..98a1c1b7d3 100644 --- a/app/assets/javascripts/discourse/app/widgets/quick-access-notifications.js +++ b/app/assets/javascripts/discourse/app/widgets/quick-access-notifications.js @@ -1,6 +1,6 @@ +import QuickAccessPanel from "discourse/widgets/quick-access-panel"; import { ajax } from "discourse/lib/ajax"; import { createWidgetFrom } from "discourse/widgets/widget"; -import QuickAccessPanel from "discourse/widgets/quick-access-panel"; createWidgetFrom(QuickAccessPanel, "quick-access-notifications", { buildKey: () => "quick-access-notifications", diff --git a/app/assets/javascripts/discourse/app/widgets/quick-access-panel.js b/app/assets/javascripts/discourse/app/widgets/quick-access-panel.js index 7b75486881..18feb59dd1 100644 --- a/app/assets/javascripts/discourse/app/widgets/quick-access-panel.js +++ b/app/assets/javascripts/discourse/app/widgets/quick-access-panel.js @@ -1,8 +1,8 @@ import I18n from "I18n"; +import { Promise } from "rsvp"; import Session from "discourse/models/session"; import { createWidget } from "discourse/widgets/widget"; import { h } from "virtual-dom"; -import { Promise } from "rsvp"; /** * This tries to enforce a consistent flow of fetching, caching, refreshing, diff --git a/app/assets/javascripts/discourse/app/widgets/quick-access-profile.js b/app/assets/javascripts/discourse/app/widgets/quick-access-profile.js index 5b32c40954..83961b1cc6 100644 --- a/app/assets/javascripts/discourse/app/widgets/quick-access-profile.js +++ b/app/assets/javascripts/discourse/app/widgets/quick-access-profile.js @@ -1,7 +1,7 @@ import I18n from "I18n"; +import { Promise } from "rsvp"; import QuickAccessPanel from "discourse/widgets/quick-access-panel"; import { createWidgetFrom } from "discourse/widgets/widget"; -import { Promise } from "rsvp"; const _extraItems = []; diff --git a/app/assets/javascripts/discourse/app/widgets/search-menu-controls.js b/app/assets/javascripts/discourse/app/widgets/search-menu-controls.js index 461b93b2e8..27ff502b85 100644 --- a/app/assets/javascripts/discourse/app/widgets/search-menu-controls.js +++ b/app/assets/javascripts/discourse/app/widgets/search-menu-controls.js @@ -1,8 +1,8 @@ import I18n from "I18n"; -import { get } from "@ember/object"; -import { searchContextDescription } from "discourse/lib/search"; -import { h } from "virtual-dom"; import { createWidget } from "discourse/widgets/widget"; +import { get } from "@ember/object"; +import { h } from "virtual-dom"; +import { searchContextDescription } from "discourse/lib/search"; createWidget("search-term", { tagName: "input", diff --git a/app/assets/javascripts/discourse/app/widgets/search-menu-results.js b/app/assets/javascripts/discourse/app/widgets/search-menu-results.js index d1981adf80..8c0719f002 100644 --- a/app/assets/javascripts/discourse/app/widgets/search-menu-results.js +++ b/app/assets/javascripts/discourse/app/widgets/search-menu-results.js @@ -1,11 +1,11 @@ +import { escapeExpression, formatUsername } from "discourse/lib/utilities"; import I18n from "I18n"; -import { avatarImg } from "discourse/widgets/post"; -import { dateNode } from "discourse/helpers/node"; import RawHtml from "discourse/widgets/raw-html"; +import { avatarImg } from "discourse/widgets/post"; import { createWidget } from "discourse/widgets/widget"; +import { dateNode } from "discourse/helpers/node"; import { h } from "virtual-dom"; import highlightSearch from "discourse/lib/highlight-search"; -import { escapeExpression, formatUsername } from "discourse/lib/utilities"; import { iconNode } from "discourse-common/lib/icon-library"; import renderTag from "discourse/lib/render-tag"; diff --git a/app/assets/javascripts/discourse/app/widgets/search-menu.js b/app/assets/javascripts/discourse/app/widgets/search-menu.js index 1b3585c72f..999e063742 100644 --- a/app/assets/javascripts/discourse/app/widgets/search-menu.js +++ b/app/assets/javascripts/discourse/app/widgets/search-menu.js @@ -1,11 +1,11 @@ -import getURL from "discourse-common/lib/get-url"; -import { get } from "@ember/object"; -import { debounce } from "@ember/runloop"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import { searchForTerm, isValidSearchTerm } from "discourse/lib/search"; -import { createWidget } from "discourse/widgets/widget"; -import { h } from "virtual-dom"; +import { isValidSearchTerm, searchForTerm } from "discourse/lib/search"; import DiscourseURL from "discourse/lib/url"; +import { createWidget } from "discourse/widgets/widget"; +import { debounce } from "@ember/runloop"; +import { get } from "@ember/object"; +import getURL from "discourse-common/lib/get-url"; +import { h } from "virtual-dom"; +import { popupAjaxError } from "discourse/lib/ajax-error"; const searchData = {}; diff --git a/app/assets/javascripts/discourse/app/widgets/topic-admin-menu.js b/app/assets/javascripts/discourse/app/widgets/topic-admin-menu.js index a022ac3b40..ed7d6e9ca7 100644 --- a/app/assets/javascripts/discourse/app/widgets/topic-admin-menu.js +++ b/app/assets/javascripts/discourse/app/widgets/topic-admin-menu.js @@ -1,4 +1,4 @@ -import { createWidget, applyDecorators } from "discourse/widgets/widget"; +import { applyDecorators, createWidget } from "discourse/widgets/widget"; import { h } from "virtual-dom"; createWidget("admin-menu-button", { diff --git a/app/assets/javascripts/discourse/app/widgets/topic-map.js b/app/assets/javascripts/discourse/app/widgets/topic-map.js index dc4f053b6f..abde361f8b 100644 --- a/app/assets/javascripts/discourse/app/widgets/topic-map.js +++ b/app/assets/javascripts/discourse/app/widgets/topic-map.js @@ -1,8 +1,8 @@ +import { avatarFor, avatarImg } from "discourse/widgets/post"; +import { dateNode, numberNode } from "discourse/helpers/node"; import I18n from "I18n"; import { createWidget } from "discourse/widgets/widget"; import { h } from "virtual-dom"; -import { avatarImg, avatarFor } from "discourse/widgets/post"; -import { dateNode, numberNode } from "discourse/helpers/node"; import { replaceEmoji } from "discourse/widgets/emoji"; const LINKS_SHOWN = 5; diff --git a/app/assets/javascripts/discourse/app/widgets/topic-status.js b/app/assets/javascripts/discourse/app/widgets/topic-status.js index 28363d1a6f..9a1b460db6 100644 --- a/app/assets/javascripts/discourse/app/widgets/topic-status.js +++ b/app/assets/javascripts/discourse/app/widgets/topic-status.js @@ -1,9 +1,9 @@ import I18n from "I18n"; -import { createWidget } from "discourse/widgets/widget"; -import { iconNode } from "discourse-common/lib/icon-library"; -import { h } from "virtual-dom"; -import { escapeExpression } from "discourse/lib/utilities"; import TopicStatusIcons from "discourse/helpers/topic-status-icons"; +import { createWidget } from "discourse/widgets/widget"; +import { escapeExpression } from "discourse/lib/utilities"; +import { h } from "virtual-dom"; +import { iconNode } from "discourse-common/lib/icon-library"; export default createWidget("topic-status", { tagName: "div.topic-statuses", diff --git a/app/assets/javascripts/discourse/app/widgets/topic-timeline.js b/app/assets/javascripts/discourse/app/widgets/topic-timeline.js index ba21c6eb8d..18f8573a83 100644 --- a/app/assets/javascripts/discourse/app/widgets/topic-timeline.js +++ b/app/assets/javascripts/discourse/app/widgets/topic-timeline.js @@ -1,14 +1,14 @@ -import I18n from "I18n"; -import { later } from "@ember/runloop"; -import { createWidget } from "discourse/widgets/widget"; import ComponentConnector from "discourse/widgets/component-connector"; -import { h } from "virtual-dom"; -import { relativeAge } from "discourse/lib/formatter"; -import { iconNode } from "discourse-common/lib/icon-library"; +import I18n from "I18n"; import RawHtml from "discourse/widgets/raw-html"; +import { createWidget } from "discourse/widgets/widget"; +import { deepMerge } from "discourse-common/lib/object"; +import { h } from "virtual-dom"; +import { iconNode } from "discourse-common/lib/icon-library"; +import { later } from "@ember/runloop"; +import { relativeAge } from "discourse/lib/formatter"; import renderTags from "discourse/lib/render-tags"; import renderTopicFeaturedLink from "discourse/lib/render-topic-featured-link"; -import { deepMerge } from "discourse-common/lib/object"; const SCROLLER_HEIGHT = 50; const LAST_READ_HEIGHT = 20; diff --git a/app/assets/javascripts/discourse/app/widgets/user-menu.js b/app/assets/javascripts/discourse/app/widgets/user-menu.js index 79379340f7..2fb8c417e7 100644 --- a/app/assets/javascripts/discourse/app/widgets/user-menu.js +++ b/app/assets/javascripts/discourse/app/widgets/user-menu.js @@ -1,6 +1,6 @@ -import { later } from "@ember/runloop"; import { createWidget } from "discourse/widgets/widget"; import { h } from "virtual-dom"; +import { later } from "@ember/runloop"; const UserMenuAction = { QUICK_ACCESS: "quickAccess", diff --git a/app/assets/javascripts/discourse/app/widgets/user-notifications-large.js b/app/assets/javascripts/discourse/app/widgets/user-notifications-large.js index d5b05fbe8c..9ca518313a 100644 --- a/app/assets/javascripts/discourse/app/widgets/user-notifications-large.js +++ b/app/assets/javascripts/discourse/app/widgets/user-notifications-large.js @@ -1,6 +1,6 @@ import { createWidget } from "discourse/widgets/widget"; -import { h } from "virtual-dom"; import { dateNode } from "discourse/helpers/node"; +import { h } from "virtual-dom"; createWidget("large-notification-item", { buildClasses(attrs) { diff --git a/app/assets/javascripts/discourse/app/widgets/widget-dropdown.js b/app/assets/javascripts/discourse/app/widgets/widget-dropdown.js index 47b7f875d5..605082d87a 100644 --- a/app/assets/javascripts/discourse/app/widgets/widget-dropdown.js +++ b/app/assets/javascripts/discourse/app/widgets/widget-dropdown.js @@ -1,8 +1,8 @@ import I18n from "I18n"; +import { createPopper } from "@popperjs/core"; import { createWidget } from "discourse/widgets/widget"; import hbs from "discourse/widgets/hbs-compiler"; import { schedule } from "@ember/runloop"; -import { createPopper } from "@popperjs/core"; /* diff --git a/app/assets/javascripts/discourse/app/widgets/widget.js b/app/assets/javascripts/discourse/app/widgets/widget.js index a00ccc8af7..a69fee5a3b 100644 --- a/app/assets/javascripts/discourse/app/widgets/widget.js +++ b/app/assets/javascripts/discourse/app/widgets/widget.js @@ -1,28 +1,28 @@ -import I18n from "I18n"; import { + WidgetChangeHook, WidgetClickHook, - WidgetDoubleClickHook, WidgetClickOutsideHook, - WidgetKeyUpHook, - WidgetKeyDownHook, - WidgetMouseDownOutsideHook, + WidgetDoubleClickHook, WidgetDragHook, WidgetInputHook, - WidgetChangeHook, - WidgetMouseUpHook, + WidgetKeyDownHook, + WidgetKeyUpHook, WidgetMouseDownHook, + WidgetMouseDownOutsideHook, WidgetMouseMoveHook, - WidgetMouseOverHook, WidgetMouseOutHook, - WidgetTouchStartHook, + WidgetMouseOverHook, + WidgetMouseUpHook, WidgetTouchEndHook, + WidgetTouchStartHook, } from "discourse/widgets/hooks"; -import { h } from "virtual-dom"; import DecoratorHelper from "discourse/widgets/decorator-helper"; +import I18n from "I18n"; import { Promise } from "rsvp"; -import { isProduction } from "discourse-common/config/environment"; -import { get } from "@ember/object"; import { deepMerge } from "discourse-common/lib/object"; +import { get } from "@ember/object"; +import { h } from "virtual-dom"; +import { isProduction } from "discourse-common/config/environment"; const _registry = {}; diff --git a/app/assets/javascripts/discourse/tests/acceptance/about-test.js b/app/assets/javascripts/discourse/tests/acceptance/about-test.js index 92a8f3e333..b51cd5a572 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/about-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/about-test.js @@ -1,6 +1,6 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("About", function () { test("viewing", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/account-created-test.js b/app/assets/javascripts/discourse/tests/acceptance/account-created-test.js index 2d8433a0e0..fab4de4e04 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/account-created-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/account-created-test.js @@ -1,11 +1,11 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import { visit, click, fillIn, currentRouteName } from "@ember/test-helpers"; -import { test } from "qunit"; +import { click, currentRouteName, fillIn, visit } from "@ember/test-helpers"; import PreloadStore from "discourse/lib/preload-store"; +import { test } from "qunit"; acceptance("Account Created", function () { test("account created - message", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/admin-emails-test.js b/app/assets/javascripts/discourse/tests/acceptance/admin-emails-test.js index 326895c9a5..0b2342b9dc 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/admin-emails-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/admin-emails-test.js @@ -1,5 +1,5 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { fillIn, click, visit } from "@ember/test-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; +import { click, fillIn, visit } from "@ember/test-helpers"; import { test } from "qunit"; const EMAIL = ` diff --git a/app/assets/javascripts/discourse/tests/acceptance/admin-search-log-term-test.js b/app/assets/javascripts/discourse/tests/acceptance/admin-search-log-term-test.js index 8baa169fe1..b4a9df1cde 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/admin-search-log-term-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/admin-search-log-term-test.js @@ -1,6 +1,6 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Admin - Search Log Term", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/admin-search-logs-test.js b/app/assets/javascripts/discourse/tests/acceptance/admin-search-logs-test.js index 42e64263e0..9b19b29b6b 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/admin-search-logs-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/admin-search-logs-test.js @@ -1,4 +1,4 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/admin-site-settings-test.js b/app/assets/javascripts/discourse/tests/acceptance/admin-site-settings-test.js index cdba86ee70..57bff6d17f 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/admin-site-settings-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/admin-site-settings-test.js @@ -1,18 +1,18 @@ -import { - fillIn, - click, - triggerKeyEvent, - visit, - currentURL, -} from "@ember/test-helpers"; -import { test } from "qunit"; import { acceptance, count, - queryAll, exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; +import { + click, + currentURL, + fillIn, + triggerKeyEvent, + visit, +} from "@ember/test-helpers"; import siteSettingFixture from "discourse/tests/fixtures/site-settings"; +import { test } from "qunit"; acceptance("Admin - Site Settings", function (needs) { let updatedTitle; diff --git a/app/assets/javascripts/discourse/tests/acceptance/admin-site-text-test.js b/app/assets/javascripts/discourse/tests/acceptance/admin-site-text-test.js index 25ab4ae46b..d477fd90c5 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/admin-site-text-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/admin-site-text-test.js @@ -1,9 +1,9 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import { fillIn, click, visit, currentURL } from "@ember/test-helpers"; +import { click, currentURL, fillIn, visit } from "@ember/test-helpers"; import { test } from "qunit"; acceptance("Admin - Site Texts", function (needs) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/admin-suspend-user-test.js b/app/assets/javascripts/discourse/tests/acceptance/admin-suspend-user-test.js index b615a126b3..05a8a86dee 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/admin-suspend-user-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/admin-suspend-user-test.js @@ -1,11 +1,11 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import { visit, click, fillIn } from "@ember/test-helpers"; -import { test } from "qunit"; +import { click, fillIn, visit } from "@ember/test-helpers"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; acceptance("Admin - Suspend User", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/admin-user-badges-test.js b/app/assets/javascripts/discourse/tests/acceptance/admin-user-badges-test.js index 72edb00493..fa36848fe2 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/admin-user-badges-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/admin-user-badges-test.js @@ -1,6 +1,6 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Admin - Users Badges", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/admin-user-emails-test.js b/app/assets/javascripts/discourse/tests/acceptance/admin-user-emails-test.js index 273f7031ce..400d03e5c8 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/admin-user-emails-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/admin-user-emails-test.js @@ -1,7 +1,7 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import I18n from "I18n"; +import { test } from "qunit"; function assertNoSecondary(assert) { assert.equal( diff --git a/app/assets/javascripts/discourse/tests/acceptance/admin-user-index-test.js b/app/assets/javascripts/discourse/tests/acceptance/admin-user-index-test.js index e7096a6da1..731c77c216 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/admin-user-index-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/admin-user-index-test.js @@ -1,7 +1,7 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; acceptance("Admin - User Index", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/admin-users-list-test.js b/app/assets/javascripts/discourse/tests/acceptance/admin-users-list-test.js index 6d71d40227..86d4bbee41 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/admin-users-list-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/admin-users-list-test.js @@ -1,11 +1,11 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import I18n from "I18n"; +import { test } from "qunit"; acceptance("Admin - Users List", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/admin-watched-words-test.js b/app/assets/javascripts/discourse/tests/acceptance/admin-watched-words-test.js index 3a2d4cc462..2ae807ffc9 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/admin-watched-words-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/admin-watched-words-test.js @@ -1,9 +1,9 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import { fillIn, click, visit } from "@ember/test-helpers"; +import { click, fillIn, visit } from "@ember/test-helpers"; import { test } from "qunit"; acceptance("Admin - Watched Words", function (needs) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/auth-complete-test.js b/app/assets/javascripts/discourse/tests/acceptance/auth-complete-test.js index c480166ba5..d89d834cf3 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/auth-complete-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/auth-complete-test.js @@ -1,5 +1,5 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit, currentRouteName } from "@ember/test-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; +import { currentRouteName, visit } from "@ember/test-helpers"; import { test } from "qunit"; acceptance("Auth Complete", function (needs) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/badges-test.js b/app/assets/javascripts/discourse/tests/acceptance/badges-test.js index 6292d3e0c6..6eaaf10431 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/badges-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/badges-test.js @@ -1,7 +1,7 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Badges", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/bookmarks-test.js b/app/assets/javascripts/discourse/tests/acceptance/bookmarks-test.js index 36af34e88f..b879e1583c 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/bookmarks-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/bookmarks-test.js @@ -1,13 +1,13 @@ -import { click, fillIn, visit } from "@ember/test-helpers"; -import { test } from "qunit"; -import I18n from "I18n"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; import { acceptance, + exists, loggedInUser, queryAll, - exists, } from "discourse/tests/helpers/qunit-helpers"; +import { click, fillIn, visit } from "@ember/test-helpers"; +import I18n from "I18n"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; async function openBookmarkModal() { if (exists(".topic-post:first-child button.show-more-actions")) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/category-banner-test.js b/app/assets/javascripts/discourse/tests/acceptance/category-banner-test.js index 1c9846c8a9..9a2264a6b5 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/category-banner-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/category-banner-test.js @@ -1,11 +1,11 @@ import { - queryAll, acceptance, + queryAll, visible, } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import DiscoveryFixtures from "discourse/tests/fixtures/discovery-fixtures"; +import { test } from "qunit"; acceptance("Category Banners", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/category-chooser-test.js b/app/assets/javascripts/discourse/tests/acceptance/category-chooser-test.js index bd7ef8217d..81d2b9abdf 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/category-chooser-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/category-chooser-test.js @@ -1,7 +1,7 @@ import { click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; import { acceptance } from "discourse/tests/helpers/qunit-helpers"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; acceptance("CategoryChooser", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/category-edit-security-test.js b/app/assets/javascripts/discourse/tests/acceptance/category-edit-security-test.js index c8a6e043ce..020aa1fde3 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/category-edit-security-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/category-edit-security-test.js @@ -1,8 +1,8 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; import I18n from "I18n"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; acceptance("Category Edit - security", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/category-edit-test.js b/app/assets/javascripts/discourse/tests/acceptance/category-edit-test.js index 7f7ff5fd2f..3df14fd12e 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/category-edit-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/category-edit-test.js @@ -1,13 +1,13 @@ import { - queryAll, acceptance, + queryAll, visible, } from "discourse/tests/helpers/qunit-helpers"; -import { click, fillIn, visit, currentURL } from "@ember/test-helpers"; -import { test } from "qunit"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { click, currentURL, fillIn, visit } from "@ember/test-helpers"; import DiscourseURL from "discourse/lib/url"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; import sinon from "sinon"; +import { test } from "qunit"; acceptance("Category Edit", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/category-new-test.js b/app/assets/javascripts/discourse/tests/acceptance/category-new-test.js index c5496f56cb..f02189ea47 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/category-new-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/category-new-test.js @@ -1,9 +1,9 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { fillIn, click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; -import I18n from "I18n"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; +import { click, fillIn, visit } from "@ember/test-helpers"; import DiscourseURL from "discourse/lib/url"; +import I18n from "I18n"; import sinon from "sinon"; +import { test } from "qunit"; acceptance("Category New", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/click-track-test.js b/app/assets/javascripts/discourse/tests/acceptance/click-track-test.js index 8b7585ad8c..9829cc7512 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/click-track-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/click-track-test.js @@ -1,5 +1,5 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { click, visit, currentURL } from "@ember/test-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; +import { click, currentURL, visit } from "@ember/test-helpers"; import { test } from "qunit"; acceptance("Click Track", function (needs) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-actions-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-actions-test.js index 518faf8c27..95c3585143 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-actions-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-actions-test.js @@ -1,18 +1,18 @@ -import { click, fillIn, visit } from "@ember/test-helpers"; -import { test } from "qunit"; -import I18n from "I18n"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; import { acceptance, - updateCurrentUser, - queryAll, exists, + queryAll, + updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; -import { _clearSnapshots } from "select-kit/components/composer-actions"; -import { toggleCheckDraftPopup } from "discourse/controllers/composer"; +import { click, fillIn, visit } from "@ember/test-helpers"; import Draft from "discourse/models/draft"; +import I18n from "I18n"; import { Promise } from "rsvp"; +import { _clearSnapshots } from "select-kit/components/composer-actions"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; import sinon from "sinon"; +import { test } from "qunit"; +import { toggleCheckDraftPopup } from "discourse/controllers/composer"; acceptance("Composer Actions", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-attachment-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-attachment-test.js index 63f8fbbc60..51e7b1806b 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-attachment-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-attachment-test.js @@ -1,4 +1,4 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-edit-conflict-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-edit-conflict-test.js index ec0d7b4c02..6eb7be8235 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-edit-conflict-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-edit-conflict-test.js @@ -1,7 +1,7 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import I18n from "I18n"; +import { test } from "qunit"; acceptance("Composer - Edit conflict", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-hyperlink-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-hyperlink-test.js index c825cbd1ae..3cc5eb98eb 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-hyperlink-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-hyperlink-test.js @@ -1,7 +1,7 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, triggerKeyEvent, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-onebox-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-onebox-test.js index 7e48fae369..04ad220536 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-onebox-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-onebox-test.js @@ -1,4 +1,4 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-tags-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-tags-test.js index 47feb7c70a..2948b10008 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-tags-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-tags-test.js @@ -1,11 +1,11 @@ -import { click, fillIn, visit, currentURL } from "@ember/test-helpers"; -import { test } from "qunit"; -import Category from "discourse/models/category"; import { acceptance, updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; +import { click, currentURL, fillIn, visit } from "@ember/test-helpers"; +import Category from "discourse/models/category"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; acceptance("Composer - Tags", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-test.js index 738c770ad3..1cec7ceb8c 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-test.js @@ -1,19 +1,19 @@ -import { click, fillIn, visit, currentURL } from "@ember/test-helpers"; -import { skip, test } from "qunit"; -import I18n from "I18n"; -import { run } from "@ember/runloop"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; import { acceptance, - invisible, - visible, - queryAll, exists, + invisible, + queryAll, + visible, } from "discourse/tests/helpers/qunit-helpers"; -import { toggleCheckDraftPopup } from "discourse/controllers/composer"; +import { click, currentURL, fillIn, visit } from "@ember/test-helpers"; +import { skip, test } from "qunit"; import Draft from "discourse/models/draft"; +import I18n from "I18n"; import { Promise } from "rsvp"; +import { run } from "@ember/runloop"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; import sinon from "sinon"; +import { toggleCheckDraftPopup } from "discourse/controllers/composer"; acceptance("Composer", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-topic-links-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-topic-links-test.js index 32e8badb2b..7a9d6b402d 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-topic-links-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-topic-links-test.js @@ -1,7 +1,7 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-uncategorized-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-uncategorized-test.js index 6d7ec8cbac..f9b8c1be32 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-uncategorized-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-uncategorized-test.js @@ -1,11 +1,11 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; acceptance( "Composer disabled, uncategorized not allowed when any topic_template present", diff --git a/app/assets/javascripts/discourse/tests/acceptance/create-account-external-test.js b/app/assets/javascripts/discourse/tests/acceptance/create-account-external-test.js index 0c24d119c7..0e0fb6deee 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/create-account-external-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/create-account-external-test.js @@ -1,6 +1,6 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Create Account - external auth", function (needs) { needs.hooks.beforeEach(() => { diff --git a/app/assets/javascripts/discourse/tests/acceptance/create-account-user-fields-test.js b/app/assets/javascripts/discourse/tests/acceptance/create-account-user-fields-test.js index 60d24324e6..9bbefe9313 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/create-account-user-fields-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/create-account-user-fields-test.js @@ -1,7 +1,7 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/custom-html-set-test.js b/app/assets/javascripts/discourse/tests/acceptance/custom-html-set-test.js index fd58172d05..8266f7a9df 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/custom-html-set-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/custom-html-set-test.js @@ -1,12 +1,12 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; -import { setCustomHTML } from "discourse/helpers/custom-html"; import PreloadStore from "discourse/lib/preload-store"; +import { setCustomHTML } from "discourse/helpers/custom-html"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("CustomHTML set", function () { test("has no custom HTML in the top", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/custom-html-template-test.js b/app/assets/javascripts/discourse/tests/acceptance/custom-html-template-test.js index ecc7e0d752..bb79868cc8 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/custom-html-template-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/custom-html-template-test.js @@ -1,8 +1,8 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import Ember from "ember"; import hbs from "htmlbars-inline-precompile"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("CustomHTML template", function (needs) { needs.hooks.beforeEach(() => { diff --git a/app/assets/javascripts/discourse/tests/acceptance/dashboard-test.js b/app/assets/javascripts/discourse/tests/acceptance/dashboard-test.js index d1e6f31fb1..b573383066 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/dashboard-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/dashboard-test.js @@ -1,11 +1,11 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; acceptance("Dashboard", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/email-notice-test.js b/app/assets/javascripts/discourse/tests/acceptance/email-notice-test.js index 087efa0e3e..a4bdd4e8fa 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/email-notice-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/email-notice-test.js @@ -1,10 +1,10 @@ -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; import { acceptance, - updateCurrentUser, exists, + updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Email Disabled Banner", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/emoji-picker-test.js b/app/assets/javascripts/discourse/tests/acceptance/emoji-picker-test.js index 11467f6a7a..fdaaabb1f2 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/emoji-picker-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/emoji-picker-test.js @@ -1,7 +1,7 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/emoji-test.js b/app/assets/javascripts/discourse/tests/acceptance/emoji-test.js index ca23c0cf03..67c1dfc7b9 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/emoji-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/emoji-test.js @@ -1,4 +1,4 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; import { test } from "qunit"; import { IMAGE_VERSION as v } from "pretty-text/emoji/version"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/encoded-category-test.js b/app/assets/javascripts/discourse/tests/acceptance/encoded-category-test.js index 773a54ef8b..9e5a80bead 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/encoded-category-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/encoded-category-test.js @@ -1,7 +1,7 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import DiscoveryFixtures from "discourse/tests/fixtures/discovery-fixtures"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Encoded Sub Category Discovery", function (needs) { needs.settings({ diff --git a/app/assets/javascripts/discourse/tests/acceptance/enforce-second-factor-test.js b/app/assets/javascripts/discourse/tests/acceptance/enforce-second-factor-test.js index 735b49fb3e..eaf9ca4896 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/enforce-second-factor-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/enforce-second-factor-test.js @@ -1,10 +1,10 @@ -import { click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import { acceptance, - updateCurrentUser, queryAll, + updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; +import { click, visit } from "@ember/test-helpers"; +import { test } from "qunit"; acceptance("Enforce Second Factor", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/flag-post-test.js b/app/assets/javascripts/discourse/tests/acceptance/flag-post-test.js index f5cd5c413e..124b58f4e8 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/flag-post-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/flag-post-test.js @@ -1,11 +1,11 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; import userFixtures from "discourse/tests/fixtures/user-fixtures"; async function openFlagModal() { diff --git a/app/assets/javascripts/discourse/tests/acceptance/forgot-password-test.js b/app/assets/javascripts/discourse/tests/acceptance/forgot-password-test.js index 09cda1e425..92df2514a1 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/forgot-password-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/forgot-password-test.js @@ -1,11 +1,11 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import I18n from "I18n"; +import { test } from "qunit"; let userFound = false; diff --git a/app/assets/javascripts/discourse/tests/acceptance/group-index-test.js b/app/assets/javascripts/discourse/tests/acceptance/group-index-test.js index 70898fd78a..524af365e5 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/group-index-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/group-index-test.js @@ -1,12 +1,12 @@ -import { click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; -import I18n from "I18n"; import { acceptance, - updateCurrentUser, count, queryAll, + updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; +import { click, visit } from "@ember/test-helpers"; +import I18n from "I18n"; +import { test } from "qunit"; acceptance("Group Members - Anonymous", function () { test("Viewing Members as anon user", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/group-manage-categories-test.js b/app/assets/javascripts/discourse/tests/acceptance/group-manage-categories-test.js index 5a07bdba70..573b606da3 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/group-manage-categories-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/group-manage-categories-test.js @@ -1,11 +1,11 @@ -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; import { acceptance, - updateCurrentUser, count, queryAll, + updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Managing Group Category Notification Defaults", function () { test("As an anonymous user", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/group-manage-interaction-test.js b/app/assets/javascripts/discourse/tests/acceptance/group-manage-interaction-test.js index 244ae75e8f..e5bf10edbb 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/group-manage-interaction-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/group-manage-interaction-test.js @@ -1,10 +1,10 @@ -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; import { acceptance, - updateCurrentUser, queryAll, + updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Managing Group Interaction Settings", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/group-manage-logs-test.js b/app/assets/javascripts/discourse/tests/acceptance/group-manage-logs-test.js index 0573a88d90..6ae37982a5 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/group-manage-logs-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/group-manage-logs-test.js @@ -1,4 +1,4 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/group-manage-membership-test.js b/app/assets/javascripts/discourse/tests/acceptance/group-manage-membership-test.js index a130efdc46..5a955e12c9 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/group-manage-membership-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/group-manage-membership-test.js @@ -1,11 +1,11 @@ -import { click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import { acceptance, - updateCurrentUser, queryAll, + updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; +import { click, visit } from "@ember/test-helpers"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; acceptance("Managing Group Membership", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/group-manage-profile-test.js b/app/assets/javascripts/discourse/tests/acceptance/group-manage-profile-test.js index dc4bdba41f..67785934d1 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/group-manage-profile-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/group-manage-profile-test.js @@ -1,11 +1,11 @@ -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; import { acceptance, - updateCurrentUser, count, queryAll, + updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Managing Group Profile", function () { test("As an anonymous user", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/group-manage-tags-test.js b/app/assets/javascripts/discourse/tests/acceptance/group-manage-tags-test.js index 248f56d0a2..f309023e6d 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/group-manage-tags-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/group-manage-tags-test.js @@ -1,11 +1,11 @@ -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; import { acceptance, - updateCurrentUser, count, queryAll, + updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Managing Group Tag Notification Defaults", function () { test("As an anonymous user", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/group-requests-test.js b/app/assets/javascripts/discourse/tests/acceptance/group-requests-test.js index 40b321f1be..08310e7580 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/group-requests-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/group-requests-test.js @@ -1,4 +1,4 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/group-test.js b/app/assets/javascripts/discourse/tests/acceptance/group-test.js index 4405e6e163..2e92868be1 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/group-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/group-test.js @@ -1,12 +1,12 @@ import { - queryAll, acceptance, count, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import I18n from "I18n"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; function setupGroupPretender(server, helper) { server.post("/groups/Macdonald/request_membership", () => { diff --git a/app/assets/javascripts/discourse/tests/acceptance/groups-index-test.js b/app/assets/javascripts/discourse/tests/acceptance/groups-index-test.js index 42da9a3b4c..e1bc069f20 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/groups-index-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/groups-index-test.js @@ -1,12 +1,12 @@ -import { click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import { acceptance, - invisible, count, - queryAll, exists, + invisible, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; +import { click, visit } from "@ember/test-helpers"; +import { test } from "qunit"; acceptance("Groups", function () { test("Browsing Groups", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/groups-new-test.js b/app/assets/javascripts/discourse/tests/acceptance/groups-new-test.js index 38eb83822d..1b020084b3 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/groups-new-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/groups-new-test.js @@ -1,7 +1,7 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import I18n from "I18n"; +import { test } from "qunit"; acceptance("New Group - Anonymous", function () { test("As an anon user", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/hamburger-menu-test.js b/app/assets/javascripts/discourse/tests/acceptance/hamburger-menu-test.js index 93b3e8b74e..618315426e 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/hamburger-menu-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/hamburger-menu-test.js @@ -1,10 +1,10 @@ -import { click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import { acceptance, - updateCurrentUser, queryAll, + updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; +import { click, visit } from "@ember/test-helpers"; +import { test } from "qunit"; acceptance("Opening the hamburger menu with some reviewables", function ( needs diff --git a/app/assets/javascripts/discourse/tests/acceptance/hashtags-test.js b/app/assets/javascripts/discourse/tests/acceptance/hashtags-test.js index 726397c9b5..96db923d6e 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/hashtags-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/hashtags-test.js @@ -1,4 +1,4 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/invite-accept-test.js b/app/assets/javascripts/discourse/tests/acceptance/invite-accept-test.js index bd877437dc..7004ee6e14 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/invite-accept-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/invite-accept-test.js @@ -1,11 +1,11 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { fillIn, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import PreloadStore from "discourse/lib/preload-store"; +import { test } from "qunit"; acceptance("Invite Accept", function (needs) { needs.settings({ full_name_required: true }); diff --git a/app/assets/javascripts/discourse/tests/acceptance/invite-show-user-fields-test.js b/app/assets/javascripts/discourse/tests/acceptance/invite-show-user-fields-test.js index 8bc3b810e8..a03c92e3a4 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/invite-show-user-fields-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/invite-show-user-fields-test.js @@ -1,7 +1,7 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { fillIn, click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; +import { click, fillIn, visit } from "@ember/test-helpers"; import PreloadStore from "discourse/lib/preload-store"; +import { test } from "qunit"; acceptance("Accept Invite - User Fields", function (needs) { needs.site({ diff --git a/app/assets/javascripts/discourse/tests/acceptance/jump-to-test.js b/app/assets/javascripts/discourse/tests/acceptance/jump-to-test.js index 5d72e2e2b7..3afb2a1bab 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/jump-to-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/jump-to-test.js @@ -1,5 +1,5 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { click, fillIn, visit, currentURL } from "@ember/test-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; +import { click, currentURL, fillIn, visit } from "@ember/test-helpers"; import { test } from "qunit"; acceptance("Jump to", function (needs) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/keyboard-shortcuts-test.js b/app/assets/javascripts/discourse/tests/acceptance/keyboard-shortcuts-test.js index f9bdf7bd58..7228638e78 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/keyboard-shortcuts-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/keyboard-shortcuts-test.js @@ -1,6 +1,6 @@ -import { triggerKeyEvent, visit, currentURL } from "@ember/test-helpers"; -import { test } from "qunit"; +import { currentURL, triggerKeyEvent, visit } from "@ember/test-helpers"; import { acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { test } from "qunit"; acceptance("Keyboard Shortcuts", function (needs) { needs.pretender((server, helper) => { diff --git a/app/assets/javascripts/discourse/tests/acceptance/login-redirect-test.js b/app/assets/javascripts/discourse/tests/acceptance/login-redirect-test.js index 6d3b26ff95..2731a37854 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/login-redirect-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/login-redirect-test.js @@ -1,6 +1,6 @@ -import { visit, currentRouteName } from "@ember/test-helpers"; -import { test } from "qunit"; +import { currentRouteName, visit } from "@ember/test-helpers"; import { acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { test } from "qunit"; acceptance("Login redirect - anonymous", function () { test("redirects login to default homepage", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/login-required-test.js b/app/assets/javascripts/discourse/tests/acceptance/login-required-test.js index 06d5106001..283ad78737 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/login-required-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/login-required-test.js @@ -1,9 +1,9 @@ import { - exists, acceptance, + exists, invisible, } from "discourse/tests/helpers/qunit-helpers"; -import { click, visit, currentRouteName } from "@ember/test-helpers"; +import { click, currentRouteName, visit } from "@ember/test-helpers"; import { test } from "qunit"; acceptance("Login Required", function (needs) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/login-with-email-and-hide-email-address-taken-test.js b/app/assets/javascripts/discourse/tests/acceptance/login-with-email-and-hide-email-address-taken-test.js index 4c05406c6c..d75eafea08 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/login-with-email-and-hide-email-address-taken-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/login-with-email-and-hide-email-address-taken-test.js @@ -1,7 +1,7 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import I18n from "I18n"; +import { test } from "qunit"; acceptance("Login with email - hide email address taken", function (needs) { needs.settings({ diff --git a/app/assets/javascripts/discourse/tests/acceptance/login-with-email-and-no-social-logins-test.js b/app/assets/javascripts/discourse/tests/acceptance/login-with-email-and-no-social-logins-test.js index 474db0e4fa..b1496f7e28 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/login-with-email-and-no-social-logins-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/login-with-email-and-no-social-logins-test.js @@ -1,7 +1,7 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/login-with-email-disabled-test.js b/app/assets/javascripts/discourse/tests/acceptance/login-with-email-disabled-test.js index 7a38f54f9d..84fcd4d576 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/login-with-email-disabled-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/login-with-email-disabled-test.js @@ -1,4 +1,4 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/login-with-email-test.js b/app/assets/javascripts/discourse/tests/acceptance/login-with-email-test.js index bca7b367e0..b75514b9fc 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/login-with-email-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/login-with-email-test.js @@ -1,11 +1,11 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import { fillIn, click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; +import { click, fillIn, visit } from "@ember/test-helpers"; import I18n from "I18n"; +import { test } from "qunit"; acceptance("Login with email", function (needs) { needs.settings({ diff --git a/app/assets/javascripts/discourse/tests/acceptance/mobile-discovery-test.js b/app/assets/javascripts/discourse/tests/acceptance/mobile-discovery-test.js index 106a1fb2e6..700554d1d3 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/mobile-discovery-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/mobile-discovery-test.js @@ -1,6 +1,6 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Topic Discovery - Mobile", function (needs) { needs.mobileView(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/mobile-sign-in-test.js b/app/assets/javascripts/discourse/tests/acceptance/mobile-sign-in-test.js index 8a6449de51..3b84b022b0 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/mobile-sign-in-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/mobile-sign-in-test.js @@ -1,4 +1,4 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/mobile-users-test.js b/app/assets/javascripts/discourse/tests/acceptance/mobile-users-test.js index 903a89d09b..bd888676fd 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/mobile-users-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/mobile-users-test.js @@ -1,6 +1,6 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("User Directory - Mobile", function (needs) { needs.mobileView(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/modal-test.js b/app/assets/javascripts/discourse/tests/acceptance/modal-test.js index 6864a68c89..d2f16fb425 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/modal-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/modal-test.js @@ -1,14 +1,14 @@ -import { click, triggerKeyEvent, visit } from "@ember/test-helpers"; -import { skip, test } from "qunit"; -import I18n from "I18n"; -import { run } from "@ember/runloop"; import { acceptance, controllerFor, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import showModal from "discourse/lib/show-modal"; +import { click, triggerKeyEvent, visit } from "@ember/test-helpers"; +import { skip, test } from "qunit"; +import I18n from "I18n"; import hbs from "htmlbars-inline-precompile"; +import { run } from "@ember/runloop"; +import showModal from "discourse/lib/show-modal"; acceptance("Modal", function (needs) { let _translations; diff --git a/app/assets/javascripts/discourse/tests/acceptance/new-message-test.js b/app/assets/javascripts/discourse/tests/acceptance/new-message-test.js index adef980eb0..764c1abd0a 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/new-message-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/new-message-test.js @@ -1,10 +1,10 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("New Message - Anonymous", function () { test("accessing new-message route when logged out", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/new-topic-test.js b/app/assets/javascripts/discourse/tests/acceptance/new-topic-test.js index 34292f54ad..1d5a9bdbf6 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/new-topic-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/new-topic-test.js @@ -1,11 +1,11 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("New Topic - Anonymous", function () { test("accessing new-topic route when logged out", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/notifications-filter-test.js b/app/assets/javascripts/discourse/tests/acceptance/notifications-filter-test.js index 7bceb89507..14ccee5afc 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/notifications-filter-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/notifications-filter-test.js @@ -1,7 +1,7 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Notifications filter", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/page-publishing-test.js b/app/assets/javascripts/discourse/tests/acceptance/page-publishing-test.js index 11d8e71e1e..cc77008f4f 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/page-publishing-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/page-publishing-test.js @@ -1,4 +1,4 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/password-reset-test.js b/app/assets/javascripts/discourse/tests/acceptance/password-reset-test.js index 331900f93b..9ddee1bee9 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/password-reset-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/password-reset-test.js @@ -1,15 +1,15 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import { visit, click, fillIn } from "@ember/test-helpers"; -import { test } from "qunit"; +import { click, fillIn, visit } from "@ember/test-helpers"; +import DiscourseURL from "discourse/lib/url"; import I18n from "I18n"; import PreloadStore from "discourse/lib/preload-store"; import { parsePostData } from "discourse/tests/helpers/create-pretender"; -import DiscourseURL from "discourse/lib/url"; import sinon from "sinon"; +import { test } from "qunit"; acceptance("Password Reset", function (needs) { needs.pretender((server, helper) => { diff --git a/app/assets/javascripts/discourse/tests/acceptance/personal-message-test.js b/app/assets/javascripts/discourse/tests/acceptance/personal-message-test.js index 875c316ba1..1558b244ee 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/personal-message-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/personal-message-test.js @@ -1,11 +1,11 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; import I18n from "I18n"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Personal Message", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/plugin-keyboard-shortcut-test.js b/app/assets/javascripts/discourse/tests/acceptance/plugin-keyboard-shortcut-test.js index ba4bc64e52..4a517fae5b 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/plugin-keyboard-shortcut-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/plugin-keyboard-shortcut-test.js @@ -1,10 +1,10 @@ import { triggerKeyEvent, visit } from "@ember/test-helpers"; -import { test } from "qunit"; -import { acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { withPluginApi } from "discourse/lib/plugin-api"; -import KeyboardShortcuts from "discourse/lib/keyboard-shortcuts"; import KeyboardShortcutInitializer from "discourse/initializers/keyboard-shortcuts"; +import KeyboardShortcuts from "discourse/lib/keyboard-shortcuts"; +import { acceptance } from "discourse/tests/helpers/qunit-helpers"; import sinon from "sinon"; +import { test } from "qunit"; +import { withPluginApi } from "discourse/lib/plugin-api"; acceptance("Plugin Keyboard Shortcuts - Logged In", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/plugin-outlet-connector-class-test.js b/app/assets/javascripts/discourse/tests/acceptance/plugin-outlet-connector-class-test.js index 35ff37a03a..c7028c7acb 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/plugin-outlet-connector-class-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/plugin-outlet-connector-class-test.js @@ -1,9 +1,9 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit, click } from "@ember/test-helpers"; -import { test } from "qunit"; -import { extraConnectorClass } from "discourse/lib/plugin-connectors"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; +import { click, visit } from "@ember/test-helpers"; import { action } from "@ember/object"; +import { extraConnectorClass } from "discourse/lib/plugin-connectors"; import hbs from "htmlbars-inline-precompile"; +import { test } from "qunit"; const PREFIX = "javascripts/single-test/connectors"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/plugin-outlet-decorator-test.js b/app/assets/javascripts/discourse/tests/acceptance/plugin-outlet-decorator-test.js index 4ebef80da5..99f0e800c8 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/plugin-outlet-decorator-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/plugin-outlet-decorator-test.js @@ -1,12 +1,12 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; -import { withPluginApi } from "discourse/lib/plugin-api"; import hbs from "htmlbars-inline-precompile"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; +import { withPluginApi } from "discourse/lib/plugin-api"; const PREFIX = "javascripts/single-test/connectors"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/plugin-outlet-multi-template-test.js b/app/assets/javascripts/discourse/tests/acceptance/plugin-outlet-multi-template-test.js index 77d19c53f9..640916bfee 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/plugin-outlet-multi-template-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/plugin-outlet-multi-template-test.js @@ -1,8 +1,8 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { clearCache } from "discourse/lib/plugin-connectors"; import hbs from "htmlbars-inline-precompile"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; const HELLO = "javascripts/multi-test/connectors/user-profile-primary/hello"; const GOODBYE = diff --git a/app/assets/javascripts/discourse/tests/acceptance/plugin-outlet-single-template-test.js b/app/assets/javascripts/discourse/tests/acceptance/plugin-outlet-single-template-test.js index c6d92a5f06..edd4504072 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/plugin-outlet-single-template-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/plugin-outlet-single-template-test.js @@ -1,7 +1,7 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import hbs from "htmlbars-inline-precompile"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; const CONNECTOR = "javascripts/single-test/connectors/user-profile-primary/hello"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/post-admin-menu-test.js b/app/assets/javascripts/discourse/tests/acceptance/post-admin-menu-test.js index 2b0817fb9b..e69edbb5ad 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/post-admin-menu-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/post-admin-menu-test.js @@ -1,5 +1,5 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit, click } from "@ember/test-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; +import { click, visit } from "@ember/test-helpers"; import { test } from "qunit"; acceptance("Post - Admin Menu - Anonymous", function () { diff --git a/app/assets/javascripts/discourse/tests/acceptance/preferences-test.js b/app/assets/javascripts/discourse/tests/acceptance/preferences-test.js index 2a3ca2dcc2..e22cfa1000 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/preferences-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/preferences-test.js @@ -1,20 +1,20 @@ -import { - visit, - currentURL, - currentRouteName, - click, - fillIn, -} from "@ember/test-helpers"; -import { test } from "qunit"; -import I18n from "I18n"; import { acceptance, - updateCurrentUser, - queryAll, exists, + queryAll, + updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { + click, + currentRouteName, + currentURL, + fillIn, + visit, +} from "@ember/test-helpers"; +import I18n from "I18n"; import User from "discourse/models/user"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; function preferencesPretender(server, helper) { server.post("/u/second_factors.json", () => { diff --git a/app/assets/javascripts/discourse/tests/acceptance/raw-plugin-outlet-test.js b/app/assets/javascripts/discourse/tests/acceptance/raw-plugin-outlet-test.js index f8337a3f21..13a2f52e1e 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/raw-plugin-outlet-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/raw-plugin-outlet-test.js @@ -1,11 +1,11 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; -import compile from "handlebars-compiler"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { addRawTemplate, removeRawTemplate, } from "discourse-common/lib/raw-templates"; +import compile from "handlebars-compiler"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; const CONNECTOR = "javascripts/raw-test/connectors/topic-list-before-status/lala"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/redirect-to-top-test.js b/app/assets/javascripts/discourse/tests/acceptance/redirect-to-top-test.js index f698cfe2f4..542e31b22a 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/redirect-to-top-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/redirect-to-top-test.js @@ -1,10 +1,10 @@ -import { visit, currentRouteName } from "@ember/test-helpers"; -import { test } from "qunit"; import { acceptance, updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; +import { currentRouteName, visit } from "@ember/test-helpers"; import DiscoveryFixtures from "discourse/tests/fixtures/discovery-fixtures"; +import { test } from "qunit"; acceptance("Redirect to Top", function (needs) { needs.pretender((server, helper) => { diff --git a/app/assets/javascripts/discourse/tests/acceptance/reports-test.js b/app/assets/javascripts/discourse/tests/acceptance/reports-test.js index f09734ee4e..14928dafe2 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/reports-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/reports-test.js @@ -1,6 +1,6 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Reports", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/review-test.js b/app/assets/javascripts/discourse/tests/acceptance/review-test.js index 4ec8ebb675..a8dfcd1881 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/review-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/review-test.js @@ -1,7 +1,7 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit, click, fillIn } from "@ember/test-helpers"; -import { test } from "qunit"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; +import { click, fillIn, visit } from "@ember/test-helpers"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; acceptance("Review", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/search-full-test.js b/app/assets/javascripts/discourse/tests/acceptance/search-full-test.js index f22827afa8..62c57421b8 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/search-full-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/search-full-test.js @@ -1,14 +1,14 @@ -import { triggerKeyEvent, visit, fillIn, click } from "@ember/test-helpers"; +import { + acceptance, + exists, + queryAll, + selectDate, + visible, + waitFor, +} from "discourse/tests/helpers/qunit-helpers"; +import { click, fillIn, triggerKeyEvent, visit } from "@ember/test-helpers"; import { skip, test } from "qunit"; import selectKit from "discourse/tests/helpers/select-kit-helper"; -import { - selectDate, - acceptance, - waitFor, - visible, - queryAll, - exists, -} from "discourse/tests/helpers/qunit-helpers"; acceptance("Search - Full Page", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/search-mobile-test.js b/app/assets/javascripts/discourse/tests/acceptance/search-mobile-test.js index bad0576f3c..2aefc5efa5 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/search-mobile-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/search-mobile-test.js @@ -1,7 +1,7 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/search-test.js b/app/assets/javascripts/discourse/tests/acceptance/search-test.js index d7b7b82077..00bd5bc22d 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/search-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/search-test.js @@ -1,12 +1,12 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import { click, triggerKeyEvent, fillIn, visit } from "@ember/test-helpers"; -import { test } from "qunit"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { click, fillIn, triggerKeyEvent, visit } from "@ember/test-helpers"; import searchFixtures from "discourse/tests/fixtures/search-fixtures"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; acceptance("Search - Anonymous", function (needs) { let calledEmpty = false; diff --git a/app/assets/javascripts/discourse/tests/acceptance/share-and-invite-desktop-test.js b/app/assets/javascripts/discourse/tests/acceptance/share-and-invite-desktop-test.js index 1030da6231..39cc6dfac5 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/share-and-invite-desktop-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/share-and-invite-desktop-test.js @@ -1,7 +1,7 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/share-and-invite-mobile-test.js b/app/assets/javascripts/discourse/tests/acceptance/share-and-invite-mobile-test.js index ee21e0e23f..3ec3650a04 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/share-and-invite-mobile-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/share-and-invite-mobile-test.js @@ -1,11 +1,11 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; acceptance("Share and Invite modal - mobile", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/shared-drafts-test.js b/app/assets/javascripts/discourse/tests/acceptance/shared-drafts-test.js index a69f3bec8e..5e6d236f7b 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/shared-drafts-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/shared-drafts-test.js @@ -1,7 +1,7 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; acceptance("Shared Drafts", function () { test("Viewing", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/sign-in-test.js b/app/assets/javascripts/discourse/tests/acceptance/sign-in-test.js index ed467e7eef..62df079754 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/sign-in-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/sign-in-test.js @@ -1,7 +1,7 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; import { skip, test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/static-test.js b/app/assets/javascripts/discourse/tests/acceptance/static-test.js index d955e08fe3..55fa797140 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/static-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/static-test.js @@ -1,6 +1,6 @@ -import { visit, currentRouteName } from "@ember/test-helpers"; -import { test } from "qunit"; import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; +import { currentRouteName, visit } from "@ember/test-helpers"; +import { test } from "qunit"; acceptance("Static", function () { test("Static Pages", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/tag-groups-test.js b/app/assets/javascripts/discourse/tests/acceptance/tag-groups-test.js index 03131de6ce..c3ab9d85d8 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/tag-groups-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/tag-groups-test.js @@ -1,7 +1,7 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; acceptance("Tag Groups", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/tags-intersection-test.js b/app/assets/javascripts/discourse/tests/acceptance/tags-intersection-test.js index f05a989c63..e2747520a1 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/tags-intersection-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/tags-intersection-test.js @@ -1,4 +1,4 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; import { test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/tags-test.js b/app/assets/javascripts/discourse/tests/acceptance/tags-test.js index 663aedc781..a3d339afec 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/tags-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/tags-test.js @@ -1,11 +1,11 @@ -import { click, visit, currentURL } from "@ember/test-helpers"; -import { test } from "qunit"; import { - updateCurrentUser, acceptance, - queryAll, exists, + queryAll, + updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; +import { click, currentURL, visit } from "@ember/test-helpers"; +import { test } from "qunit"; acceptance("Tags", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-admin-menu-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-admin-menu-test.js index ed8dde1117..cba99e8f8f 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-admin-menu-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-admin-menu-test.js @@ -1,6 +1,6 @@ import { - exists, acceptance, + exists, updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-anonymous-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-anonymous-test.js index f131b7620f..d07cac2381 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-anonymous-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-anonymous-test.js @@ -1,10 +1,10 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Topic - Anonymous", function () { test("Enter a Topic", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-discovery-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-discovery-test.js index f82c20f42a..627da72912 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-discovery-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-discovery-test.js @@ -1,14 +1,14 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; import DiscourseURL from "discourse/lib/url"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; import MessageBus from "message-bus-client"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; import sinon from "sinon"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Topic Discovery", function (needs) { needs.settings({ diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-edit-timer-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-edit-timer-test.js index 5893d33da6..bdc5e543a3 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-edit-timer-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-edit-timer-test.js @@ -1,7 +1,7 @@ import { acceptance, - updateCurrentUser, queryAll, + updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; import { skip, test } from "qunit"; diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-footer-buttons-mobile-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-footer-buttons-mobile-test.js index 1950e23d2c..bbf42fdf7d 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-footer-buttons-mobile-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-footer-buttons-mobile-test.js @@ -1,10 +1,10 @@ -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; import I18n from "I18n"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; -import { withPluginApi } from "discourse/lib/plugin-api"; -import { clearTopicFooterButtons } from "discourse/lib/register-topic-footer-button"; import { acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { clearTopicFooterButtons } from "discourse/lib/register-topic-footer-button"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; +import { withPluginApi } from "discourse/lib/plugin-api"; let _test; diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-list-tracker-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-list-tracker-test.js index 4b3cb170e9..72d747d044 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-list-tracker-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-list-tracker-test.js @@ -1,11 +1,11 @@ -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; -import { acceptance } from "discourse/tests/helpers/qunit-helpers"; import { nextTopicUrl, previousTopicUrl, setTopicId, } from "discourse/lib/topic-list-tracker"; +import { acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Topic list tracking", function () { test("Navigation", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-move-posts-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-move-posts-test.js index fba4550cd2..442b109dcd 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-move-posts-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-move-posts-test.js @@ -1,7 +1,7 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; import I18n from "I18n"; +import { test } from "qunit"; acceptance("Topic move posts", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-notifications-button-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-notifications-button-test.js index 8b36d5211a..b345fb36a1 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-notifications-button-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-notifications-button-test.js @@ -1,7 +1,7 @@ -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; import { acceptance } from "discourse/tests/helpers/qunit-helpers"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("Topic Notifications button", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js index 56686feec7..912c5a6135 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js @@ -1,11 +1,11 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; -import { test } from "qunit"; import I18n from "I18n"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; function selectText(selector) { const range = document.createRange(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-test.js index 77d92442ad..dbb5df668a 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-test.js @@ -1,15 +1,15 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, visible, } from "discourse/tests/helpers/qunit-helpers"; -import { click, triggerKeyEvent, fillIn, visit } from "@ember/test-helpers"; -import { test } from "qunit"; +import { click, fillIn, triggerKeyEvent, visit } from "@ember/test-helpers"; import I18n from "I18n"; -import { withPluginApi } from "discourse/lib/plugin-api"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; import { IMAGE_VERSION as v } from "pretty-text/emoji/version"; +import { withPluginApi } from "discourse/lib/plugin-api"; function selectText(selector) { const range = document.createRange(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/unknown-test.js b/app/assets/javascripts/discourse/tests/acceptance/unknown-test.js index aa2e5e3931..b552dcfeb6 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/unknown-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/unknown-test.js @@ -1,5 +1,5 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit, currentURL } from "@ember/test-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; +import { currentURL, visit } from "@ember/test-helpers"; import { test } from "qunit"; acceptance("Unknown", function (needs) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/user-anonymous-test.js b/app/assets/javascripts/discourse/tests/acceptance/user-anonymous-test.js index 78b6339456..5e86c5c869 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/user-anonymous-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/user-anonymous-test.js @@ -1,10 +1,10 @@ -import { visit, currentURL, currentRouteName } from "@ember/test-helpers"; -import { test } from "qunit"; import { acceptance, count, exists, } from "discourse/tests/helpers/qunit-helpers"; +import { currentRouteName, currentURL, visit } from "@ember/test-helpers"; +import { test } from "qunit"; acceptance("User Anonymous", function () { test("Root URL", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/user-bookmarks-test.js b/app/assets/javascripts/discourse/tests/acceptance/user-bookmarks-test.js index a86878a1e1..79c6dd90e1 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/user-bookmarks-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/user-bookmarks-test.js @@ -1,13 +1,13 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, visit } from "@ember/test-helpers"; -import { test } from "qunit"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; -import userFixtures from "discourse/tests/fixtures/user-fixtures"; import { cloneJSON } from "discourse-common/lib/object"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; +import userFixtures from "discourse/tests/fixtures/user-fixtures"; acceptance("User's bookmarks", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/user-card-test.js b/app/assets/javascripts/discourse/tests/acceptance/user-card-test.js index 4785de3e12..3dff64d71d 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/user-card-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/user-card-test.js @@ -1,8 +1,8 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit, click } from "@ember/test-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; +import { click, visit } from "@ember/test-helpers"; +import User from "discourse/models/user"; import { test } from "qunit"; import userFixtures from "discourse/tests/fixtures/user-fixtures"; -import User from "discourse/models/user"; acceptance("User Card - Show Local Time", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/user-drafts-stream-test.js b/app/assets/javascripts/discourse/tests/acceptance/user-drafts-stream-test.js index 7938bef36e..2f39a4cfde 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/user-drafts-stream-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/user-drafts-stream-test.js @@ -1,9 +1,9 @@ import { - queryAll, acceptance, + queryAll, visible, } from "discourse/tests/helpers/qunit-helpers"; -import { visit, click } from "@ember/test-helpers"; +import { click, visit } from "@ember/test-helpers"; import { test } from "qunit"; acceptance("User Drafts", function (needs) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/user-preferences-interface-test.js b/app/assets/javascripts/discourse/tests/acceptance/user-preferences-interface-test.js index 644f06b36c..8f1de7289f 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/user-preferences-interface-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/user-preferences-interface-test.js @@ -1,14 +1,14 @@ import { - queryAll, - exists, acceptance, + exists, + queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import { visit, click } from "@ember/test-helpers"; -import { test } from "qunit"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; -import Site from "discourse/models/site"; -import Session from "discourse/models/session"; +import { click, visit } from "@ember/test-helpers"; import cookie, { removeCookie } from "discourse/lib/cookie"; +import Session from "discourse/models/session"; +import Site from "discourse/models/site"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { test } from "qunit"; acceptance("User Preferences - Interface", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/user-test.js b/app/assets/javascripts/discourse/tests/acceptance/user-test.js index d72318b95d..2c747253a6 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/user-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/user-test.js @@ -1,10 +1,10 @@ -import { visit, currentRouteName, click } from "@ember/test-helpers"; -import { test } from "qunit"; import { acceptance, exists, queryAll, } from "discourse/tests/helpers/qunit-helpers"; +import { click, currentRouteName, visit } from "@ember/test-helpers"; +import { test } from "qunit"; acceptance("User Routes", function (needs) { needs.user(); diff --git a/app/assets/javascripts/discourse/tests/acceptance/users-test.js b/app/assets/javascripts/discourse/tests/acceptance/users-test.js index 79469bf2c8..72899463c2 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/users-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/users-test.js @@ -1,6 +1,6 @@ -import { exists, acceptance } from "discourse/tests/helpers/qunit-helpers"; -import { visit } from "@ember/test-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; acceptance("User Directory", function () { test("Visit Page", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/helpers/component-test.js b/app/assets/javascripts/discourse/tests/helpers/component-test.js index e2edd2ead6..3670d26533 100644 --- a/app/assets/javascripts/discourse/tests/helpers/component-test.js +++ b/app/assets/javascripts/discourse/tests/helpers/component-test.js @@ -1,13 +1,13 @@ import EmberObject from "@ember/object"; -import createStore from "discourse/tests/helpers/create-store"; -import { autoLoadModules } from "discourse/initializers/auto-load-modules"; +import Session from "discourse/models/session"; +import Site from "discourse/models/site"; +import { TestModuleForComponent } from "@ember/test-helpers"; import TopicTrackingState from "discourse/models/topic-tracking-state"; import User from "discourse/models/user"; -import Site from "discourse/models/site"; -import Session from "discourse/models/session"; +import { autoLoadModules } from "discourse/initializers/auto-load-modules"; +import createStore from "discourse/tests/helpers/create-store"; import { currentSettings } from "discourse/tests/helpers/site-settings"; import { test } from "qunit"; -import { TestModuleForComponent } from "@ember/test-helpers"; export function setupRenderingTest(hooks) { let testModule; diff --git a/app/assets/javascripts/discourse/tests/helpers/create-pretender.js b/app/assets/javascripts/discourse/tests/helpers/create-pretender.js index 2a2431afd0..5665df651d 100644 --- a/app/assets/javascripts/discourse/tests/helpers/create-pretender.js +++ b/app/assets/javascripts/discourse/tests/helpers/create-pretender.js @@ -1,5 +1,5 @@ -import User from "discourse/models/user"; import Pretender from "pretender"; +import User from "discourse/models/user"; export function parsePostData(query) { const result = {}; diff --git a/app/assets/javascripts/discourse/tests/helpers/create-store.js b/app/assets/javascripts/discourse/tests/helpers/create-store.js index 80eb23704c..ad15ffd4fa 100644 --- a/app/assets/javascripts/discourse/tests/helpers/create-store.js +++ b/app/assets/javascripts/discourse/tests/helpers/create-store.js @@ -1,6 +1,6 @@ -import Store from "discourse/models/store"; -import RestAdapter from "discourse/adapters/rest"; import KeyValueStore from "discourse/lib/key-value-store"; +import RestAdapter from "discourse/adapters/rest"; +import Store from "discourse/models/store"; import TopicListAdapter from "discourse/adapters/topic-list"; import TopicTrackingState from "discourse/models/topic-tracking-state"; import { buildResolver } from "discourse-common/resolver"; diff --git a/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js b/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js index 6ac0547949..64a66c7774 100644 --- a/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js +++ b/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js @@ -1,43 +1,43 @@ -import { Promise } from "rsvp"; -import { isEmpty } from "@ember/utils"; -import { run, later } from "@ember/runloop"; -import sessionFixtures from "discourse/tests/fixtures/session-fixtures"; -import HeaderComponent from "discourse/components/site-header"; -import { forceMobile, resetMobile } from "discourse/lib/mobile"; -import { resetPluginApi } from "discourse/lib/plugin-api"; +import QUnit, { module } from "qunit"; import { clearCache as clearOutletCache, resetExtraClasses, } from "discourse/lib/plugin-connectors"; -import { clearHTMLCache } from "discourse/helpers/custom-html"; -import { flushMap } from "discourse/models/store"; import { clearRewrites, setURLContainer } from "discourse/lib/url"; -import { initSearchData } from "discourse/widgets/search-menu"; -import { resetDecorators } from "discourse/widgets/widget"; -import { resetWidgetCleanCallbacks } from "discourse/components/mount-widget"; -import { resetTopicTitleDecorators } from "discourse/components/topic-title"; -import { resetDecorators as resetPostCookedDecorators } from "discourse/widgets/post-cooked"; -import { resetDecorators as resetPluginOutletDecorators } from "discourse/components/plugin-connector"; -import { resetUsernameDecorators } from "discourse/helpers/decorate-username-selector"; -import { resetCache as resetOneboxCache } from "pretty-text/oneboxer"; -import { resetCustomPostMessageCallbacks } from "discourse/controllers/topic"; -import { _clearSnapshots } from "select-kit/components/composer-actions"; -import User from "discourse/models/user"; -import { mapRoutes } from "discourse/mapping-router"; import { currentSettings, mergeSettings, } from "discourse/tests/helpers/site-settings"; +import { forceMobile, resetMobile } from "discourse/lib/mobile"; import { getOwner, setDefaultOwner } from "discourse-common/lib/get-owner"; -import { setTopicList } from "discourse/lib/topic-list-tracker"; -import { moduleFor } from "ember-qunit"; -import QUnit, { module } from "qunit"; -import siteFixtures from "discourse/tests/fixtures/site-fixtures"; +import { later, run } from "@ember/runloop"; +import HeaderComponent from "discourse/components/site-header"; +import { Promise } from "rsvp"; import Site from "discourse/models/site"; +import User from "discourse/models/user"; +import { _clearSnapshots } from "select-kit/components/composer-actions"; +import { clearHTMLCache } from "discourse/helpers/custom-html"; import createStore from "discourse/tests/helpers/create-store"; -import { getApplication } from "@ember/test-helpers"; import deprecated from "discourse-common/lib/deprecated"; +import { flushMap } from "discourse/models/store"; +import { getApplication } from "@ember/test-helpers"; +import { initSearchData } from "discourse/widgets/search-menu"; +import { isEmpty } from "@ember/utils"; +import { mapRoutes } from "discourse/mapping-router"; +import { moduleFor } from "ember-qunit"; +import { resetCustomPostMessageCallbacks } from "discourse/controllers/topic"; +import { resetDecorators } from "discourse/widgets/widget"; +import { resetCache as resetOneboxCache } from "pretty-text/oneboxer"; +import { resetPluginApi } from "discourse/lib/plugin-api"; +import { resetDecorators as resetPluginOutletDecorators } from "discourse/components/plugin-connector"; +import { resetDecorators as resetPostCookedDecorators } from "discourse/widgets/post-cooked"; +import { resetTopicTitleDecorators } from "discourse/components/topic-title"; +import { resetUsernameDecorators } from "discourse/helpers/decorate-username-selector"; +import { resetWidgetCleanCallbacks } from "discourse/components/mount-widget"; +import sessionFixtures from "discourse/tests/fixtures/session-fixtures"; +import { setTopicList } from "discourse/lib/topic-list-tracker"; import sinon from "sinon"; +import siteFixtures from "discourse/tests/fixtures/site-fixtures"; export function currentUser() { return User.create(sessionFixtures["/session/current.json"].current_user); diff --git a/app/assets/javascripts/discourse/tests/helpers/select-kit-helper.js b/app/assets/javascripts/discourse/tests/helpers/select-kit-helper.js index a8a4377b48..5058dd9e1a 100644 --- a/app/assets/javascripts/discourse/tests/helpers/select-kit-helper.js +++ b/app/assets/javascripts/discourse/tests/helpers/select-kit-helper.js @@ -1,7 +1,7 @@ -import { queryAll, exists } from "discourse/tests/helpers/qunit-helpers"; -import { moduleForComponent } from "ember-qunit"; -import { isEmpty } from "@ember/utils"; import { click, fillIn } from "@ember/test-helpers"; +import { exists, queryAll } from "discourse/tests/helpers/qunit-helpers"; +import { isEmpty } from "@ember/utils"; +import { moduleForComponent } from "ember-qunit"; function checkSelectKitIsNotExpanded(selector) { if (queryAll(selector).hasClass("is-expanded")) { diff --git a/app/assets/javascripts/discourse/tests/helpers/widget-test.js b/app/assets/javascripts/discourse/tests/helpers/widget-test.js index 91f8daaa48..ed1514e0d4 100644 --- a/app/assets/javascripts/discourse/tests/helpers/widget-test.js +++ b/app/assets/javascripts/discourse/tests/helpers/widget-test.js @@ -1,6 +1,6 @@ -import { moduleForComponent } from "ember-qunit"; -import componentTest from "discourse/tests/helpers/component-test"; import { addPretenderCallback } from "discourse/tests/helpers/qunit-helpers"; +import componentTest from "discourse/tests/helpers/component-test"; +import { moduleForComponent } from "ember-qunit"; export function moduleForWidget(name, options = {}) { let fullName = `widget:${name}`; diff --git a/app/assets/javascripts/discourse/tests/integration/components/ace-editor-test.js b/app/assets/javascripts/discourse/tests/integration/components/ace-editor-test.js index 83f94cc4c9..e711a2b279 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/ace-editor-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/ace-editor-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; discourseModule("Integration | Component | ace-editor", function (hooks) { setupRenderingTest(hooks); diff --git a/app/assets/javascripts/discourse/tests/integration/components/admin-report-test.js b/app/assets/javascripts/discourse/tests/integration/components/admin-report-test.js index 878c007942..fdc398de9a 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/admin-report-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/admin-report-test.js @@ -1,13 +1,13 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, exists, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; -import pretender from "discourse/tests/helpers/create-pretender"; import { click } from "@ember/test-helpers"; +import pretender from "discourse/tests/helpers/create-pretender"; discourseModule("Integration | Component | admin-report", function (hooks) { setupRenderingTest(hooks); diff --git a/app/assets/javascripts/discourse/tests/integration/components/badge-title-test.js b/app/assets/javascripts/discourse/tests/integration/components/badge-title-test.js index 8f8ee9e9ac..a2ffe1ab18 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/badge-title-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/badge-title-test.js @@ -1,11 +1,11 @@ -import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; import EmberObject from "@ember/object"; -import pretender from "discourse/tests/helpers/create-pretender"; import { click } from "@ember/test-helpers"; +import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; +import pretender from "discourse/tests/helpers/create-pretender"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; discourseModule("Integration | Component | badge-title", function (hooks) { setupRenderingTest(hooks); diff --git a/app/assets/javascripts/discourse/tests/integration/components/cook-text-test.js b/app/assets/javascripts/discourse/tests/integration/components/cook-text-test.js index 0477ecb84f..c349bcac79 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/cook-text-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/cook-text-test.js @@ -1,10 +1,10 @@ -import { - queryAll, - discourseModule, -} from "discourse/tests/helpers/qunit-helpers"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; +import { + discourseModule, + queryAll, +} from "discourse/tests/helpers/qunit-helpers"; import pretender from "discourse/tests/helpers/create-pretender"; import { resetCache } from "pretty-text/upload-short-url"; diff --git a/app/assets/javascripts/discourse/tests/integration/components/d-button-test.js b/app/assets/javascripts/discourse/tests/integration/components/d-button-test.js index a79aeceb87..3341ecc19e 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/d-button-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/d-button-test.js @@ -1,12 +1,12 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, exists, queryAll, } from "discourse/tests/helpers/qunit-helpers"; import I18n from "I18n"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; discourseModule("Integration | Component | d-button", function (hooks) { setupRenderingTest(hooks); diff --git a/app/assets/javascripts/discourse/tests/integration/components/d-editor-test.js b/app/assets/javascripts/discourse/tests/integration/components/d-editor-test.js index c116dab8af..aa11d74479 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/d-editor-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/d-editor-test.js @@ -1,20 +1,20 @@ +import { click, fillIn } from "@ember/test-helpers"; +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import I18n from "I18n"; -import { next } from "@ember/runloop"; -import { clearToolbarCallbacks } from "discourse/components/d-editor"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; -import { withPluginApi } from "discourse/lib/plugin-api"; -import formatTextWithSelection from "discourse/tests/helpers/d-editor-helper"; import { - setTextareaSelection, getTextareaSelection, + setTextareaSelection, } from "discourse/tests/helpers/textarea-selection-helper"; -import { fillIn, click } from "@ember/test-helpers"; +import I18n from "I18n"; +import { clearToolbarCallbacks } from "discourse/components/d-editor"; +import formatTextWithSelection from "discourse/tests/helpers/d-editor-helper"; +import { next } from "@ember/runloop"; +import { withPluginApi } from "discourse/lib/plugin-api"; discourseModule("Integration | Component | d-editor", function (hooks) { setupRenderingTest(hooks); diff --git a/app/assets/javascripts/discourse/tests/integration/components/d-icon-test.js b/app/assets/javascripts/discourse/tests/integration/components/d-icon-test.js index 4f1f69ee0d..8a6c97e005 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/d-icon-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/d-icon-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; discourseModule("Integration | Component | d-icon", function (hooks) { setupRenderingTest(hooks); diff --git a/app/assets/javascripts/discourse/tests/integration/components/date-input-test.js b/app/assets/javascripts/discourse/tests/integration/components/date-input-test.js index abc1246b0e..22dd41ac42 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/date-input-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/date-input-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; import { click } from "@ember/test-helpers"; function dateInput() { diff --git a/app/assets/javascripts/discourse/tests/integration/components/date-time-input-range-test.js b/app/assets/javascripts/discourse/tests/integration/components/date-time-input-range-test.js index e9d035f879..eade3cffdf 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/date-time-input-range-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/date-time-input-range-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; function fromDateInput() { return queryAll(".from.d-date-time-input .date-picker")[0]; diff --git a/app/assets/javascripts/discourse/tests/integration/components/date-time-input-test.js b/app/assets/javascripts/discourse/tests/integration/components/date-time-input-test.js index b010643c0b..a660917a36 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/date-time-input-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/date-time-input-test.js @@ -1,11 +1,11 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, exists, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; import { click } from "@ember/test-helpers"; function dateInput() { diff --git a/app/assets/javascripts/discourse/tests/integration/components/highlighted-code-test.js b/app/assets/javascripts/discourse/tests/integration/components/highlighted-code-test.js index 4f748269cc..85aed0811f 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/highlighted-code-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/highlighted-code-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; const LONG_CODE_BLOCK = "puts a\n".repeat(15000); diff --git a/app/assets/javascripts/discourse/tests/integration/components/html-safe-helper-test.js b/app/assets/javascripts/discourse/tests/integration/components/html-safe-helper-test.js index 27e71cee90..eda366d295 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/html-safe-helper-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/html-safe-helper-test.js @@ -1,7 +1,7 @@ -import { discourseModule, exists } from "discourse/tests/helpers/qunit-helpers"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; +import { discourseModule, exists } from "discourse/tests/helpers/qunit-helpers"; discourseModule("Integration | Component | html-safe-helper", function (hooks) { setupRenderingTest(hooks); diff --git a/app/assets/javascripts/discourse/tests/integration/components/iframed-html-test.js b/app/assets/javascripts/discourse/tests/integration/components/iframed-html-test.js index d2ca70ba61..c9312f99bc 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/iframed-html-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/iframed-html-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; discourseModule("Integration | Component | iframed-html", function (hooks) { setupRenderingTest(hooks); diff --git a/app/assets/javascripts/discourse/tests/integration/components/image-uploader-test.js b/app/assets/javascripts/discourse/tests/integration/components/image-uploader-test.js index d1b5b74b72..b100fb4b85 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/image-uploader-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/image-uploader-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; import { click } from "@ember/test-helpers"; discourseModule("Integration | Component | image-uploader", function (hooks) { diff --git a/app/assets/javascripts/discourse/tests/integration/components/load-more-test.js b/app/assets/javascripts/discourse/tests/integration/components/load-more-test.js index a9d2138b52..cdfc720f8e 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/load-more-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/load-more-test.js @@ -1,8 +1,8 @@ -import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; -import { configureEyeline } from "discourse/lib/eyeline"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; +import { configureEyeline } from "discourse/lib/eyeline"; +import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; discourseModule("Integration | Component | load-more", function (hooks) { setupRenderingTest(hooks); diff --git a/app/assets/javascripts/discourse/tests/integration/components/secret-value-list-test.js b/app/assets/javascripts/discourse/tests/integration/components/secret-value-list-test.js index 44a80873ae..684ef966d1 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/secret-value-list-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/secret-value-list-test.js @@ -1,12 +1,12 @@ +import { click, fillIn } from "@ember/test-helpers"; +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; import I18n from "I18n"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; -import { fillIn, click } from "@ember/test-helpers"; discourseModule("Integration | Component | secret-value-list", function ( hooks diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/api-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/api-test.js index 5a4876dfc9..e352e97fee 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/select-kit/api-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/api-test.js @@ -1,16 +1,16 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; import selectKit, { - setDefaultState, DEFAULT_CONTENT, + setDefaultState, } from "discourse/tests/helpers/select-kit-helper"; -import { withPluginApi } from "discourse/lib/plugin-api"; import { clearCallbacks } from "select-kit/mixins/plugin-api"; +import { withPluginApi } from "discourse/lib/plugin-api"; discourseModule("Integration | Component | select-kit:api", function (hooks) { setupRenderingTest(hooks); diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/category-chooser-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/category-chooser-test.js index a7ca05875e..080838a656 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/select-kit/category-chooser-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/category-chooser-test.js @@ -1,9 +1,9 @@ -import createStore from "discourse/tests/helpers/create-store"; -import I18n from "I18n"; -import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; +import I18n from "I18n"; +import createStore from "discourse/tests/helpers/create-store"; +import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import selectKit from "discourse/tests/helpers/select-kit-helper"; function template(options = []) { diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/category-drop-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/category-drop-test.js index 39c13b7f22..4cc1a4b013 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/select-kit/category-drop-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/category-drop-test.js @@ -1,17 +1,17 @@ -import { discourseModule, exists } from "discourse/tests/helpers/qunit-helpers"; -import I18n from "I18n"; -import DiscourseURL from "discourse/lib/url"; -import Category from "discourse/models/category"; +import { + ALL_CATEGORIES_ID, + NO_CATEGORIES_ID, +} from "select-kit/components/category-drop"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; -import { - NO_CATEGORIES_ID, - ALL_CATEGORIES_ID, -} from "select-kit/components/category-drop"; +import { discourseModule, exists } from "discourse/tests/helpers/qunit-helpers"; +import Category from "discourse/models/category"; +import DiscourseURL from "discourse/lib/url"; +import I18n from "I18n"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; import { set } from "@ember/object"; import sinon from "sinon"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; function initCategories(context) { const categories = context.site.categoriesList; diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/combo-box-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/combo-box-test.js index 37bc4cac73..fbd9e4cc03 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/select-kit/combo-box-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/combo-box-test.js @@ -1,9 +1,9 @@ -import { discourseModule, exists } from "discourse/tests/helpers/qunit-helpers"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { discourseModule, exists } from "discourse/tests/helpers/qunit-helpers"; import { click } from "@ember/test-helpers"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; const DEFAULT_CONTENT = [ { id: 1, name: "foo" }, diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/dropdown-select-box-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/dropdown-select-box-test.js index 124c31a5c7..01ddec94dc 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/select-kit/dropdown-select-box-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/dropdown-select-box-test.js @@ -1,7 +1,7 @@ -import { discourseModule, exists } from "discourse/tests/helpers/qunit-helpers"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; +import { discourseModule, exists } from "discourse/tests/helpers/qunit-helpers"; import selectKit from "discourse/tests/helpers/select-kit-helper"; const DEFAULT_CONTENT = [ diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/list-setting-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/list-setting-test.js index 45a1806847..d7dfbe6a3f 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/select-kit/list-setting-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/list-setting-test.js @@ -1,7 +1,7 @@ -import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; +import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import selectKit from "discourse/tests/helpers/select-kit-helper"; function template(options = []) { diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/mini-tag-chooser-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/mini-tag-chooser-test.js index bd1431e25b..9eb3fb1574 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/select-kit/mini-tag-chooser-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/mini-tag-chooser-test.js @@ -1,12 +1,12 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; import I18n from "I18n"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; discourseModule( "Integration | Component | select-kit/mini-tag-chooser", diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/multi-select-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/multi-select-test.js index 1ac0a366c0..503966d994 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/select-kit/multi-select-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/multi-select-test.js @@ -1,7 +1,7 @@ -import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; +import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import selectKit from "discourse/tests/helpers/select-kit-helper"; function template(options = []) { diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/notifications-button-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/notifications-button-test.js index 6783f1edc3..a85589fa0d 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/select-kit/notifications-button-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/notifications-button-test.js @@ -1,10 +1,10 @@ -import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; import selectKit, { setDefaultState, } from "discourse/tests/helpers/select-kit-helper"; +import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; discourseModule( "Integration | Component | select-kit/notifications-button", diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/pinned-options-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/pinned-options-test.js index 561d33661c..8ac593a768 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/select-kit/pinned-options-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/pinned-options-test.js @@ -1,9 +1,9 @@ -import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; import Topic from "discourse/models/topic"; +import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; const buildTopic = function (pinned = true) { return Topic.create({ diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/single-select-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/single-select-test.js index fc6acb6002..dd7972d490 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/select-kit/single-select-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/single-select-test.js @@ -1,9 +1,9 @@ -import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; import I18n from "I18n"; +import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; function template(options = []) { return ` diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/tag-drop-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/tag-drop-test.js index fc4aa2a88f..55df881fdf 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/select-kit/tag-drop-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/tag-drop-test.js @@ -1,12 +1,12 @@ -import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; import I18n from "I18n"; import Site from "discourse/models/site"; -import { set } from "@ember/object"; +import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import pretender from "discourse/tests/helpers/create-pretender"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import { set } from "@ember/object"; function initTags(context) { const categories = context.site.categoriesList; diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/topic-notifications-button-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/topic-notifications-button-test.js index 61ceaf1736..3e991248cc 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/select-kit/topic-notifications-button-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/topic-notifications-button-test.js @@ -1,10 +1,10 @@ -import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; -import I18n from "I18n"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; +import I18n from "I18n"; import Topic from "discourse/models/topic"; +import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; const buildTopic = function (level, archetype = "regular") { return Topic.create({ diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/topic-notifications-options-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/topic-notifications-options-test.js index a274b44f3b..5be20fc32b 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/select-kit/topic-notifications-options-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/topic-notifications-options-test.js @@ -1,10 +1,10 @@ -import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; -import I18n from "I18n"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; +import I18n from "I18n"; import Topic from "discourse/models/topic"; +import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; const buildTopic = function (archetype) { return Topic.create({ diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/user-chooser-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/user-chooser-test.js index f6233da364..8eae6bf75b 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/select-kit/user-chooser-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/user-chooser-test.js @@ -1,7 +1,7 @@ -import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; +import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import selectKit from "discourse/tests/helpers/select-kit-helper"; discourseModule("Integration | Component | select-kit/user-chooser", function ( diff --git a/app/assets/javascripts/discourse/tests/integration/components/simple-list-test.js b/app/assets/javascripts/discourse/tests/integration/components/simple-list-test.js index a9d3236d23..c0cfb63b69 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/simple-list-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/simple-list-test.js @@ -1,11 +1,11 @@ +import { click, fillIn, triggerKeyEvent } from "@ember/test-helpers"; +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; -import { click, triggerKeyEvent, fillIn } from "@ember/test-helpers"; discourseModule("Integration | Component | simple-list", function (hooks) { setupRenderingTest(hooks); diff --git a/app/assets/javascripts/discourse/tests/integration/components/text-field-test.js b/app/assets/javascripts/discourse/tests/integration/components/text-field-test.js index 3a5b612c58..ab9ba425ab 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/text-field-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/text-field-test.js @@ -1,13 +1,13 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import sinon from "sinon"; import I18n from "I18n"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; import { fillIn } from "@ember/test-helpers"; +import sinon from "sinon"; discourseModule("Integration | Component | text-field", function (hooks) { setupRenderingTest(hooks); diff --git a/app/assets/javascripts/discourse/tests/integration/components/time-input-test.js b/app/assets/javascripts/discourse/tests/integration/components/time-input-test.js index 07f5e896ab..f30a396878 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/time-input-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/time-input-test.js @@ -1,8 +1,8 @@ -import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; +import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; function setTime(time) { this.setProperties(time); diff --git a/app/assets/javascripts/discourse/tests/integration/components/user-selector-test.js b/app/assets/javascripts/discourse/tests/integration/components/user-selector-test.js index 35d44053f5..d3def0d2b8 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/user-selector-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/user-selector-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; function paste(element, text) { let e = new Event("paste"); diff --git a/app/assets/javascripts/discourse/tests/integration/components/value-list-test.js b/app/assets/javascripts/discourse/tests/integration/components/value-list-test.js index 84795c9c62..b49b6ccc4e 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/value-list-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/value-list-test.js @@ -1,12 +1,12 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import selectKit from "discourse/tests/helpers/select-kit-helper"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; import { click } from "@ember/test-helpers"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; discourseModule("Integration | Component | value-list", function (hooks) { setupRenderingTest(hooks); diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/actions-summary-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/actions-summary-test.js index e717e6a3d4..794c95338b 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/actions-summary-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/actions-summary-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; discourseModule("Integration | Component | Widget | actions-summary", function ( hooks diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/avatar-flair-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/avatar-flair-test.js index 3a5c899ca6..49a11aa97d 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/avatar-flair-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/avatar-flair-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; discourseModule("Integration | Component | Widget | avatar-flair", function ( hooks diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/button-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/button-test.js index 196c02b0d6..343aeb729e 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/button-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/button-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; discourseModule("Integration | Component | Widget | button", function (hooks) { setupRenderingTest(hooks); diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/default-notification-item-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/default-notification-item-test.js index ddf2365ac5..40cd6e2984 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/default-notification-item-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/default-notification-item-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; import EmberObject from "@ember/object"; import pretender from "discourse/tests/helpers/create-pretender"; diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/hamburger-menu-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/hamburger-menu-test.js index 74fa5b7c08..43638125ea 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/hamburger-menu-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/hamburger-menu-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; import { NotificationLevels } from "discourse/lib/notification-levels"; const topCategoryIds = [2, 3, 1]; diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/header-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/header-test.js index b4f74d1746..512eeaa422 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/header-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/header-test.js @@ -1,11 +1,11 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, exists, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; import { click } from "@ember/test-helpers"; discourseModule("Integration | Component | Widget | header", function (hooks) { diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/home-logo-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/home-logo-test.js index 91046ece55..bf5d3d3684 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/home-logo-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/home-logo-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; import Session from "discourse/models/session"; const bigLogo = "/images/d-logo-sketch.png?test"; diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/post-links-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/post-links-test.js index 43510cf083..6a24877b12 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/post-links-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/post-links-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; import { click } from "@ember/test-helpers"; discourseModule("Integration | Component | Widget | post-links", function ( diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/post-menu-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/post-menu-test.js index 2bf649baeb..a497cae817 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/post-menu-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/post-menu-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; import { withPluginApi } from "discourse/lib/plugin-api"; discourseModule("Integration | Component | Widget | post-menu", function ( diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/post-stream-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/post-stream-test.js index 69063f7d2e..5d4ce3ff92 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/post-stream-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/post-stream-test.js @@ -1,12 +1,12 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; -import Topic from "discourse/models/topic"; import Post from "discourse/models/post"; +import Topic from "discourse/models/topic"; function postStreamTest(name, attrs) { componentTest(name, { diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/post-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/post-test.js index 4bd114a1c4..c996ee2edc 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/post-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/post-test.js @@ -1,12 +1,12 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; -import I18n from "I18n"; import EmberObject from "@ember/object"; +import I18n from "I18n"; import { click } from "@ember/test-helpers"; discourseModule("Integration | Component | Widget | post", function (hooks) { diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/poster-name-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/poster-name-test.js index 6c44623884..0c2a15ba76 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/poster-name-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/poster-name-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; discourseModule("Integration | Component | Widget | poster-name", function ( hooks diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/quick-access-item-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/quick-access-item-test.js index 5834b2cb27..6fe42c672a 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/quick-access-item-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/quick-access-item-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; const CONTENT_DIV_SELECTOR = "li > a > div"; diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/small-user-list-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/small-user-list-test.js index 0f5d8ebbf1..20ae8b1206 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/small-user-list-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/small-user-list-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; discourseModule("Integration | Component | Widget | small-user-list", function ( hooks diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/topic-admin-menu-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/topic-admin-menu-test.js index 098cce1149..62348c4a89 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/topic-admin-menu-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/topic-admin-menu-test.js @@ -1,9 +1,9 @@ -import { exists, discourseModule } from "discourse/tests/helpers/qunit-helpers"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; -import Topic from "discourse/models/topic"; +import { discourseModule, exists } from "discourse/tests/helpers/qunit-helpers"; import Category from "discourse/models/category"; +import Topic from "discourse/models/topic"; const createArgs = (topic) => { return { diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/topic-participant-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/topic-participant-test.js index c81534f3e5..3ca1029127 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/topic-participant-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/topic-participant-test.js @@ -1,7 +1,7 @@ -import { discourseModule, exists } from "discourse/tests/helpers/qunit-helpers"; import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; +import { discourseModule, exists } from "discourse/tests/helpers/qunit-helpers"; discourseModule( "Integration | Component | Widget | topic-participant", diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/topic-status-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/topic-status-test.js index 6fce46e765..89fce7aeb1 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/topic-status-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/topic-status-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; import TopicStatusIcons from "discourse/helpers/topic-status-icons"; discourseModule("Integration | Component | Widget | topic-status", function ( diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/user-menu-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/user-menu-test.js index b9f0166214..d2b2667afc 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/user-menu-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/user-menu-test.js @@ -1,14 +1,14 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; -import sinon from "sinon"; -import I18n from "I18n"; import DiscourseURL from "discourse/lib/url"; +import I18n from "I18n"; import { click } from "@ember/test-helpers"; +import sinon from "sinon"; discourseModule("Integration | Component | Widget | user-menu", function ( hooks diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/widget-dropdown-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/widget-dropdown-test.js index 6b6350d9b7..9e2642a16a 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/widget-dropdown-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/widget-dropdown-test.js @@ -1,11 +1,11 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, exists, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; import I18n from "I18n"; import { click } from "@ember/test-helpers"; diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/widget-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/widget-test.js index 88607997b5..047eebbf32 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/widget-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/widget-test.js @@ -1,17 +1,17 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; import I18n from "I18n"; -import { next } from "@ember/runloop"; -import { createWidget } from "discourse/widgets/widget"; -import { withPluginApi } from "discourse/lib/plugin-api"; import { Promise } from "rsvp"; -import hbs from "discourse/widgets/hbs-compiler"; import { click } from "@ember/test-helpers"; +import { createWidget } from "discourse/widgets/widget"; +import hbs from "discourse/widgets/hbs-compiler"; +import { next } from "@ember/runloop"; +import { withPluginApi } from "discourse/lib/plugin-api"; discourseModule("Integration | Component | Widget | base", function (hooks) { setupRenderingTest(hooks); diff --git a/app/assets/javascripts/discourse/tests/setup-tests.js b/app/assets/javascripts/discourse/tests/setup-tests.js index d4405bc2a8..39f97ab8b7 100644 --- a/app/assets/javascripts/discourse/tests/setup-tests.js +++ b/app/assets/javascripts/discourse/tests/setup-tests.js @@ -1,32 +1,32 @@ import { - resetSettings, - currentSettings, -} from "discourse/tests/helpers/site-settings"; -import { getOwner, setDefaultOwner } from "discourse-common/lib/get-owner"; -import { setupURL, setupS3CDN } from "discourse-common/lib/get-url"; -import { createHelperContext } from "discourse-common/lib/helpers"; -import { buildResolver } from "discourse-common/resolver"; -import createPretender, { - pretenderHelpers, - applyDefaultHandlers, -} from "discourse/tests/helpers/create-pretender"; -import { flushMap } from "discourse/models/store"; -import { ScrollingDOMMethods } from "discourse/mixins/scrolling"; -import { - resetSite, applyPretender, exists, + resetSite, } from "discourse/tests/helpers/qunit-helpers"; -import PreloadStore from "discourse/lib/preload-store"; -import User from "discourse/models/user"; -import Session from "discourse/models/session"; -import { clearAppEventsCache } from "discourse/services/app-events"; -import QUnit from "qunit"; -import MessageBus from "message-bus-client"; -import deprecated from "discourse-common/lib/deprecated"; -import sinon from "sinon"; +import createPretender, { + applyDefaultHandlers, + pretenderHelpers, +} from "discourse/tests/helpers/create-pretender"; +import { + currentSettings, + resetSettings, +} from "discourse/tests/helpers/site-settings"; +import { getOwner, setDefaultOwner } from "discourse-common/lib/get-owner"; import { setApplication, setResolver } from "@ember/test-helpers"; +import { setupS3CDN, setupURL } from "discourse-common/lib/get-url"; +import MessageBus from "message-bus-client"; +import PreloadStore from "discourse/lib/preload-store"; +import QUnit from "qunit"; +import { ScrollingDOMMethods } from "discourse/mixins/scrolling"; +import Session from "discourse/models/session"; +import User from "discourse/models/user"; import bootbox from "bootbox"; +import { buildResolver } from "discourse-common/resolver"; +import { clearAppEventsCache } from "discourse/services/app-events"; +import { createHelperContext } from "discourse-common/lib/helpers"; +import deprecated from "discourse-common/lib/deprecated"; +import { flushMap } from "discourse/models/store"; +import sinon from "sinon"; const Plugin = $.fn.modal; const Modal = Plugin.Constructor; diff --git a/app/assets/javascripts/discourse/tests/unit/components/group-membership-button-test.js b/app/assets/javascripts/discourse/tests/unit/components/group-membership-button-test.js index 58e2eb3855..1076d00435 100644 --- a/app/assets/javascripts/discourse/tests/unit/components/group-membership-button-test.js +++ b/app/assets/javascripts/discourse/tests/unit/components/group-membership-button-test.js @@ -1,5 +1,5 @@ -import { test } from "qunit"; import { moduleFor } from "ember-qunit"; +import { test } from "qunit"; // TODO: Convert to a modern *integration* test moduleFor("component:group-membership-button"); diff --git a/app/assets/javascripts/discourse/tests/unit/controllers/avatar-selector-test.js b/app/assets/javascripts/discourse/tests/unit/controllers/avatar-selector-test.js index 7a88c1e119..870d05a78e 100644 --- a/app/assets/javascripts/discourse/tests/unit/controllers/avatar-selector-test.js +++ b/app/assets/javascripts/discourse/tests/unit/controllers/avatar-selector-test.js @@ -1,6 +1,6 @@ import EmberObject from "@ember/object"; -import { mapRoutes } from "discourse/mapping-router"; import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; +import { mapRoutes } from "discourse/mapping-router"; import { test } from "qunit"; discourseModule("Unit | Controller | avatar-selector", function (hooks) { diff --git a/app/assets/javascripts/discourse/tests/unit/controllers/bookmark-test.js b/app/assets/javascripts/discourse/tests/unit/controllers/bookmark-test.js index 4b44be5884..ca8a6b1856 100644 --- a/app/assets/javascripts/discourse/tests/unit/controllers/bookmark-test.js +++ b/app/assets/javascripts/discourse/tests/unit/controllers/bookmark-test.js @@ -1,13 +1,13 @@ -import sinon from "sinon"; import { discourseModule, - logIn, fakeTime, + logIn, } from "discourse/tests/helpers/qunit-helpers"; -import { test } from "qunit"; -import User from "discourse/models/user"; import KeyboardShortcutInitializer from "discourse/initializers/keyboard-shortcuts"; import { REMINDER_TYPES } from "discourse/lib/bookmark"; +import User from "discourse/models/user"; +import sinon from "sinon"; +import { test } from "qunit"; let BookmarkController; diff --git a/app/assets/javascripts/discourse/tests/unit/controllers/create-account-test.js b/app/assets/javascripts/discourse/tests/unit/controllers/create-account-test.js index 6f0e157434..90f96b6efa 100644 --- a/app/assets/javascripts/discourse/tests/unit/controllers/create-account-test.js +++ b/app/assets/javascripts/discourse/tests/unit/controllers/create-account-test.js @@ -1,6 +1,6 @@ -import { test } from "qunit"; import I18n from "I18n"; import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; +import { test } from "qunit"; discourseModule("Unit | Controller | create-account", function () { test("basicUsernameValidation", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/controllers/preferences-account-test.js b/app/assets/javascripts/discourse/tests/unit/controllers/preferences-account-test.js index 35b6fd228b..a57d1441b7 100644 --- a/app/assets/javascripts/discourse/tests/unit/controllers/preferences-account-test.js +++ b/app/assets/javascripts/discourse/tests/unit/controllers/preferences-account-test.js @@ -1,6 +1,6 @@ +import EmberObject from "@ember/object"; import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import { test } from "qunit"; -import EmberObject from "@ember/object"; discourseModule("Unit | Controller | preferences/account", function () { test("updating of associated accounts", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/controllers/reorder-categories-test.js b/app/assets/javascripts/discourse/tests/unit/controllers/reorder-categories-test.js index 47c4323d70..50c466d319 100644 --- a/app/assets/javascripts/discourse/tests/unit/controllers/reorder-categories-test.js +++ b/app/assets/javascripts/discourse/tests/unit/controllers/reorder-categories-test.js @@ -1,7 +1,7 @@ -import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; -import { test } from "qunit"; import EmberObject from "@ember/object"; import createStore from "discourse/tests/helpers/create-store"; +import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; +import { test } from "qunit"; discourseModule("Unit | Controller | reorder-categories", function () { test("reorder set unique position number", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/controllers/topic-test.js b/app/assets/javascripts/discourse/tests/unit/controllers/topic-test.js index b68ad5bfdc..324073256d 100644 --- a/app/assets/javascripts/discourse/tests/unit/controllers/topic-test.js +++ b/app/assets/javascripts/discourse/tests/unit/controllers/topic-test.js @@ -1,12 +1,12 @@ -import { moduleFor } from "ember-qunit"; -import { test } from "qunit"; import EmberObject from "@ember/object"; -import { next } from "@ember/runloop"; -import Topic from "discourse/models/topic"; import { Placeholder } from "discourse/lib/posts-with-placeholders"; -import User from "discourse/models/user"; import { Promise } from "rsvp"; +import Topic from "discourse/models/topic"; +import User from "discourse/models/user"; +import { moduleFor } from "ember-qunit"; +import { next } from "@ember/runloop"; import pretender from "discourse/tests/helpers/create-pretender"; +import { test } from "qunit"; moduleFor("controller:topic", "controller:topic", { needs: [ diff --git a/app/assets/javascripts/discourse/tests/unit/ember/resolver-test.js b/app/assets/javascripts/discourse/tests/unit/ember/resolver-test.js index 3aa18c8d52..decaab7f4a 100644 --- a/app/assets/javascripts/discourse/tests/unit/ember/resolver-test.js +++ b/app/assets/javascripts/discourse/tests/unit/ember/resolver-test.js @@ -1,5 +1,5 @@ -import { test, module } from "qunit"; -import { setResolverOption, buildResolver } from "discourse-common/resolver"; +import { buildResolver, setResolverOption } from "discourse-common/resolver"; +import { module, test } from "qunit"; let originalTemplates; let resolver; diff --git a/app/assets/javascripts/discourse/tests/unit/lib/allow-lister-test.js b/app/assets/javascripts/discourse/tests/unit/lib/allow-lister-test.js index 683ab4c0fd..0a759c16bc 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/allow-lister-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/allow-lister-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import AllowLister from "pretty-text/allow-lister"; module("Unit | Utility | allowLister", function () { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/bookmark-test.js b/app/assets/javascripts/discourse/tests/unit/lib/bookmark-test.js index 4635b46997..79dcb4a6fe 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/bookmark-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/bookmark-test.js @@ -1,7 +1,7 @@ -import sinon from "sinon"; -import { test, module } from "qunit"; -import { formattedReminderTime } from "discourse/lib/bookmark"; +import { module, test } from "qunit"; import { fakeTime } from "discourse/tests/helpers/qunit-helpers"; +import { formattedReminderTime } from "discourse/lib/bookmark"; +import sinon from "sinon"; module("Unit | Utility | bookmark", function (hooks) { hooks.beforeEach(function () { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/break-string-test.js b/app/assets/javascripts/discourse/tests/unit/lib/break-string-test.js index 35a13b7607..f35d81c002 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/break-string-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/break-string-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; /* global BreakString:true */ module("Unit | Utility | breakString", function () { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/category-badge-test.js b/app/assets/javascripts/discourse/tests/unit/lib/category-badge-test.js index 5f59b74e4c..21236dec84 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/category-badge-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/category-badge-test.js @@ -1,9 +1,9 @@ -import { test } from "qunit"; +import Site from "discourse/models/site"; +import { categoryBadgeHTML } from "discourse/helpers/category-link"; import createStore from "discourse/tests/helpers/create-store"; import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; -import Site from "discourse/models/site"; import sinon from "sinon"; -import { categoryBadgeHTML } from "discourse/helpers/category-link"; +import { test } from "qunit"; discourseModule("Unit | Utility | category-badge", function () { test("categoryBadge without a category", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/click-track-edit-history-test.js b/app/assets/javascripts/discourse/tests/unit/lib/click-track-edit-history-test.js index ae6b16e66d..f6e875e6a6 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/click-track-edit-history-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/click-track-edit-history-test.js @@ -1,10 +1,10 @@ -import sinon from "sinon"; -import { module, skip } from "qunit"; -import DiscourseURL from "discourse/lib/url"; -import ClickTrack from "discourse/lib/click-track"; import { fixture, logIn } from "discourse/tests/helpers/qunit-helpers"; +import { module, skip } from "qunit"; +import ClickTrack from "discourse/lib/click-track"; +import DiscourseURL from "discourse/lib/url"; import User from "discourse/models/user"; import pretender from "discourse/tests/helpers/create-pretender"; +import sinon from "sinon"; const track = ClickTrack.trackClick; diff --git a/app/assets/javascripts/discourse/tests/unit/lib/click-track-profile-page-test.js b/app/assets/javascripts/discourse/tests/unit/lib/click-track-profile-page-test.js index 3bf79ce2c4..1de09ca57a 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/click-track-profile-page-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/click-track-profile-page-test.js @@ -1,9 +1,9 @@ -import sinon from "sinon"; -import { module, skip } from "qunit"; -import DiscourseURL from "discourse/lib/url"; -import ClickTrack from "discourse/lib/click-track"; import { fixture, logIn } from "discourse/tests/helpers/qunit-helpers"; +import { module, skip } from "qunit"; +import ClickTrack from "discourse/lib/click-track"; +import DiscourseURL from "discourse/lib/url"; import pretender from "discourse/tests/helpers/create-pretender"; +import sinon from "sinon"; const track = ClickTrack.trackClick; diff --git a/app/assets/javascripts/discourse/tests/unit/lib/click-track-test.js b/app/assets/javascripts/discourse/tests/unit/lib/click-track-test.js index d29cd0f770..de2f56eed3 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/click-track-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/click-track-test.js @@ -1,11 +1,11 @@ -import sinon from "sinon"; -import { skip, test, module } from "qunit"; -import { later } from "@ember/runloop"; -import DiscourseURL from "discourse/lib/url"; -import ClickTrack from "discourse/lib/click-track"; import { fixture, logIn } from "discourse/tests/helpers/qunit-helpers"; +import { module, skip, test } from "qunit"; +import ClickTrack from "discourse/lib/click-track"; +import DiscourseURL from "discourse/lib/url"; import User from "discourse/models/user"; +import { later } from "@ember/runloop"; import pretender from "discourse/tests/helpers/create-pretender"; +import sinon from "sinon"; const track = ClickTrack.trackClick; diff --git a/app/assets/javascripts/discourse/tests/unit/lib/computed-test.js b/app/assets/javascripts/discourse/tests/unit/lib/computed-test.js index 869336cc81..216e42cd63 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/computed-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/computed-test.js @@ -1,18 +1,18 @@ -import sinon from "sinon"; -import { test } from "qunit"; -import I18n from "I18n"; -import EmberObject from "@ember/object"; import { - setting, + fmt, + htmlSafe, + i18n, propertyEqual, propertyNotEqual, - fmt, - i18n, + setting, url, - htmlSafe, } from "discourse/lib/computed"; -import { setPrefix } from "discourse-common/lib/get-url"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; +import { setPrefix } from "discourse-common/lib/get-url"; +import sinon from "sinon"; +import { test } from "qunit"; discourseModule("Unit | Utility | computed", function (hooks) { hooks.beforeEach(function () { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/emoji-store-test.js b/app/assets/javascripts/discourse/tests/unit/lib/emoji-store-test.js index 2c49202e7b..fa17f404e6 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/emoji-store-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/emoji-store-test.js @@ -1,5 +1,5 @@ -import { test } from "qunit"; import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; +import { test } from "qunit"; discourseModule("Unit | Utility | emoji-emojiStore", function (hooks) { hooks.beforeEach(function () { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/emoji-test.js b/app/assets/javascripts/discourse/tests/unit/lib/emoji-test.js index 78cc82b272..34491cb537 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/emoji-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/emoji-test.js @@ -1,8 +1,8 @@ -import { test } from "qunit"; -import { emojiSearch } from "pretty-text/emoji"; -import { IMAGE_VERSION as v } from "pretty-text/emoji/version"; -import { emojiUnescape } from "discourse/lib/text"; import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; +import { emojiSearch } from "pretty-text/emoji"; +import { emojiUnescape } from "discourse/lib/text"; +import { test } from "qunit"; +import { IMAGE_VERSION as v } from "pretty-text/emoji/version"; discourseModule("Unit | Utility | emoji", function () { test("emojiUnescape", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/formatter-test.js b/app/assets/javascripts/discourse/tests/unit/lib/formatter-test.js index 23aaa2f37a..2d04636ccd 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/formatter-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/formatter-test.js @@ -1,14 +1,14 @@ -import { test } from "qunit"; import { - relativeAge, autoUpdatingRelativeAge, - updateRelativeAge, - number, - longDate, durationTiny, + longDate, + number, + relativeAge, + updateRelativeAge, } from "discourse/lib/formatter"; import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import sinon from "sinon"; +import { test } from "qunit"; function formatMins(mins, opts = {}) { let dt = new Date(new Date() - mins * 60 * 1000); diff --git a/app/assets/javascripts/discourse/tests/unit/lib/get-url-test.js b/app/assets/javascripts/discourse/tests/unit/lib/get-url-test.js index 8d95763027..82d86b838a 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/get-url-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/get-url-test.js @@ -1,13 +1,13 @@ -import { test, module } from "qunit"; import getURL, { - setupURL, - setupS3CDN, + getAbsoluteURL, getURLWithCDN, isAbsoluteURL, - getAbsoluteURL, setPrefix, + setupS3CDN, + setupURL, withoutPrefix, } from "discourse-common/lib/get-url"; +import { module, test } from "qunit"; module("Unit | Utility | get-url", function () { test("isAbsoluteURL", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/highlight-search-test.js b/app/assets/javascripts/discourse/tests/unit/lib/highlight-search-test.js index 0756899e30..165c53b5de 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/highlight-search-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/highlight-search-test.js @@ -1,6 +1,6 @@ import highlightSearch, { CLASS_NAME } from "discourse/lib/highlight-search"; -import { fixture } from "discourse/tests/helpers/qunit-helpers"; import { module, test } from "qunit"; +import { fixture } from "discourse/tests/helpers/qunit-helpers"; module("Unit | Utility | highlight-search", function () { test("highlighting text", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/i18n-test.js b/app/assets/javascripts/discourse/tests/unit/lib/i18n-test.js index 53d132726e..bbc2635a20 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/i18n-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/i18n-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import I18n from "I18n"; module("Unit | Utility | i18n", function (hooks) { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/icon-library-test.js b/app/assets/javascripts/discourse/tests/unit/lib/icon-library-test.js index d86a251112..3089ebec8f 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/icon-library-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/icon-library-test.js @@ -1,9 +1,9 @@ -import { test, module } from "qunit"; import { + convertIconClass, iconHTML, iconNode, - convertIconClass, } from "discourse-common/lib/icon-library"; +import { module, test } from "qunit"; module("Unit | Utility | icon-library", function () { test("return icon markup", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/key-value-store-test.js b/app/assets/javascripts/discourse/tests/unit/lib/key-value-store-test.js index 51c4bff28e..a2fa6876a9 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/key-value-store-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/key-value-store-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import KeyValueStore from "discourse/lib/key-value-store"; module("Unit | Utility | key-value-store", function () { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/keyboard-shortcuts-test.js b/app/assets/javascripts/discourse/tests/unit/lib/keyboard-shortcuts-test.js index 56f77dcf35..fe9b717db1 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/keyboard-shortcuts-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/keyboard-shortcuts-test.js @@ -1,7 +1,7 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import DiscourseURL from "discourse/lib/url"; -import sinon from "sinon"; import KeyboardShortcuts from "discourse/lib/keyboard-shortcuts"; +import sinon from "sinon"; let testMouseTrap; diff --git a/app/assets/javascripts/discourse/tests/unit/lib/link-mentions-test.js b/app/assets/javascripts/discourse/tests/unit/lib/link-mentions-test.js index df3528168c..53c072bdc9 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/link-mentions-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/link-mentions-test.js @@ -1,8 +1,8 @@ -import { test, module } from "qunit"; import { fetchUnseenMentions, linkSeenMentions, } from "discourse/lib/link-mentions"; +import { module, test } from "qunit"; import { Promise } from "rsvp"; import pretender from "discourse/tests/helpers/create-pretender"; diff --git a/app/assets/javascripts/discourse/tests/unit/lib/load-script-test.js b/app/assets/javascripts/discourse/tests/unit/lib/load-script-test.js index 11e1d2d56a..8fbb43605b 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/load-script-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/load-script-test.js @@ -1,5 +1,5 @@ -import { skip, test, module } from "qunit"; -import { loadScript, cacheBuster } from "discourse/lib/load-script"; +import { cacheBuster, loadScript } from "discourse/lib/load-script"; +import { module, skip, test } from "qunit"; import { PUBLIC_JS_VERSIONS as jsVersions } from "discourse/lib/public-js-versions"; module("Unit | Utility | load-script", function () { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/oneboxer-test.js b/app/assets/javascripts/discourse/tests/unit/lib/oneboxer-test.js index be8f8dcd2c..6630075cdd 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/oneboxer-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/oneboxer-test.js @@ -1,7 +1,7 @@ -import { test, module } from "qunit"; -import { load } from "pretty-text/oneboxer"; -import { ajax } from "discourse/lib/ajax"; import { failedCache, localCache } from "pretty-text/oneboxer-cache"; +import { module, test } from "qunit"; +import { ajax } from "discourse/lib/ajax"; +import { load } from "pretty-text/oneboxer"; import { stringToHTML } from "discourse/tests/helpers/html-helper"; function loadOnebox(element) { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/parse-bbcode-tag-test.js b/app/assets/javascripts/discourse/tests/unit/lib/parse-bbcode-tag-test.js index 91eecc3441..ac433caa37 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/parse-bbcode-tag-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/parse-bbcode-tag-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import { parseBBCodeTag } from "pretty-text/engines/discourse-markdown/bbcode-block"; module("Unit | Utility | parseBBCodeTag", function () { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/preload-store-test.js b/app/assets/javascripts/discourse/tests/unit/lib/preload-store-test.js index dd0f952b74..abdde2fec6 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/preload-store-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/preload-store-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import PreloadStore from "discourse/lib/preload-store"; import { Promise } from "rsvp"; diff --git a/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js b/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js index 401e98a984..8f232ae855 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js @@ -1,15 +1,15 @@ -import { skip, test, module } from "qunit"; -import { buildQuote } from "discourse/lib/quote"; -import Post from "discourse/models/post"; import PrettyText, { buildOptions } from "pretty-text/pretty-text"; -import { IMAGE_VERSION as v } from "pretty-text/emoji/version"; import { applyCachedInlineOnebox, deleteCachedInlineOnebox, } from "pretty-text/inline-oneboxer"; +import { module, skip, test } from "qunit"; +import Post from "discourse/models/post"; +import { buildQuote } from "discourse/lib/quote"; +import { deepMerge } from "discourse-common/lib/object"; import { extractDataAttribute } from "pretty-text/engines/discourse-markdown-it"; import { registerEmoji } from "pretty-text/emoji"; -import { deepMerge } from "discourse-common/lib/object"; +import { IMAGE_VERSION as v } from "pretty-text/emoji/version"; const rawOpts = { siteSettings: { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/sanitizer-test.js b/app/assets/javascripts/discourse/tests/unit/lib/sanitizer-test.js index cdc6a33a75..ea7898f33c 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/sanitizer-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/sanitizer-test.js @@ -1,5 +1,5 @@ -import { test, module } from "qunit"; import PrettyText, { buildOptions } from "pretty-text/pretty-text"; +import { module, test } from "qunit"; import { hrefAllowed } from "pretty-text/sanitizer"; module("Unit | Utility | sanitizer", function () { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/screen-track-test.js b/app/assets/javascripts/discourse/tests/unit/lib/screen-track-test.js index c119debdbb..b1a557811d 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/screen-track-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/screen-track-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import ScreenTrack from "discourse/lib/screen-track"; module("Unit | Utility | screen-track", function () { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/search-test.js b/app/assets/javascripts/discourse/tests/unit/lib/search-test.js index db46e18992..61f9876011 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/search-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/search-test.js @@ -1,9 +1,9 @@ -import { test, module } from "qunit"; -import I18n from "I18n"; +import { module, test } from "qunit"; import { - translateResults, searchContextDescription, + translateResults, } from "discourse/lib/search"; +import I18n from "I18n"; module("Unit | Utility | search", function () { test("unescapesEmojisInBlurbs", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/sharing-test.js b/app/assets/javascripts/discourse/tests/unit/lib/sharing-test.js index cf505fba0d..8a1a0afcbe 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/sharing-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/sharing-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import Sharing from "discourse/lib/sharing"; module("Unit | Utility | sharing", function (hooks) { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/text-direction-test.js b/app/assets/javascripts/discourse/tests/unit/lib/text-direction-test.js index cfc9640b24..ab23021fab 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/text-direction-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/text-direction-test.js @@ -1,5 +1,5 @@ -import { test, module } from "qunit"; -import { isRTL, isLTR } from "discourse/lib/text-direction"; +import { isLTR, isRTL } from "discourse/lib/text-direction"; +import { module, test } from "qunit"; module("Unit | Utility | text-direction", function () { test("isRTL", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/to-markdown-test.js b/app/assets/javascripts/discourse/tests/unit/lib/to-markdown-test.js index 1ee3b245a6..9a74adf00c 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/to-markdown-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/to-markdown-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import toMarkdown from "discourse/lib/to-markdown"; module("Unit | Utility | to-markdown", function () { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/upload-short-url-test.js b/app/assets/javascripts/discourse/tests/unit/lib/upload-short-url-test.js index 19c66342da..5d1cf7d824 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/upload-short-url-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/upload-short-url-test.js @@ -1,12 +1,12 @@ -import { test, module } from "qunit"; import { lookupCachedUploadUrl, - resolveAllShortUrls, resetCache, + resolveAllShortUrls, } from "pretty-text/upload-short-url"; +import { module, test } from "qunit"; +import pretender, { response } from "discourse/tests/helpers/create-pretender"; import { ajax } from "discourse/lib/ajax"; import { fixture } from "discourse/tests/helpers/qunit-helpers"; -import pretender, { response } from "discourse/tests/helpers/create-pretender"; import { settled } from "@ember/test-helpers"; function stubUrls(imageSrcs, attachmentSrcs, otherMediaSrcs) { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/uploads-test.js b/app/assets/javascripts/discourse/tests/unit/lib/uploads-test.js index c477c08ebc..25b6121bda 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/uploads-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/uploads-test.js @@ -1,18 +1,18 @@ +import * as Utilities from "discourse/lib/utilities"; +import { + allowsAttachments, + allowsImages, + authorizedExtensions, + getUploadMarkdown, + isImage, + validateUploadedFiles, +} from "discourse/lib/uploads"; +import I18n from "I18n"; +import User from "discourse/models/user"; +import bootbox from "bootbox"; +import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; import sinon from "sinon"; import { test } from "qunit"; -import I18n from "I18n"; -import { - validateUploadedFiles, - authorizedExtensions, - isImage, - allowsImages, - allowsAttachments, - getUploadMarkdown, -} from "discourse/lib/uploads"; -import * as Utilities from "discourse/lib/utilities"; -import User from "discourse/models/user"; -import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; -import bootbox from "bootbox"; discourseModule("Unit | Utility | uploads", function () { test("validateUploadedFiles", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/url-test.js b/app/assets/javascripts/discourse/tests/unit/lib/url-test.js index adfb906f51..5781a8383a 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/url-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/url-test.js @@ -1,9 +1,9 @@ -import sinon from "sinon"; -import { test, module } from "qunit"; -import DiscourseURL, { userPath, prefixProtocol } from "discourse/lib/url"; -import { setPrefix } from "discourse-common/lib/get-url"; -import { logIn } from "discourse/tests/helpers/qunit-helpers"; +import DiscourseURL, { prefixProtocol, userPath } from "discourse/lib/url"; +import { module, test } from "qunit"; import User from "discourse/models/user"; +import { logIn } from "discourse/tests/helpers/qunit-helpers"; +import { setPrefix } from "discourse-common/lib/get-url"; +import sinon from "sinon"; module("Unit | Utility | url", function () { test("isInternal with a HTTP url", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/user-search-test.js b/app/assets/javascripts/discourse/tests/unit/lib/user-search-test.js index 3d3e2157de..021fee33fc 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/user-search-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/user-search-test.js @@ -1,7 +1,7 @@ -import { test, module } from "qunit"; -import userSearch from "discourse/lib/user-search"; -import { CANCELLED_STATUS } from "discourse/lib/autocomplete"; +import { module, test } from "qunit"; import pretender, { response } from "discourse/tests/helpers/create-pretender"; +import { CANCELLED_STATUS } from "discourse/lib/autocomplete"; +import userSearch from "discourse/lib/user-search"; module("Unit | Utility | user-search", function (hooks) { hooks.beforeEach(function () { diff --git a/app/assets/javascripts/discourse/tests/unit/lib/utilities-test.js b/app/assets/javascripts/discourse/tests/unit/lib/utilities-test.js index b38d96d16a..e76b27877d 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/utilities-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/utilities-test.js @@ -1,21 +1,21 @@ -import { skip, test } from "qunit"; import { - escapeExpression, - emailValid, - extractDomainFromUrl, - avatarUrl, - getRawSize, avatarImg, - initializeDefaultHomepage, - defaultHomepage, - setDefaultHomepage, + avatarUrl, caretRowCol, - setCaretPosition, - toAsciiPrintable, - slugify, + defaultHomepage, + emailValid, + escapeExpression, + extractDomainFromUrl, fillMissingDates, + getRawSize, inCodeBlock, + initializeDefaultHomepage, + setCaretPosition, + setDefaultHomepage, + slugify, + toAsciiPrintable, } from "discourse/lib/utilities"; +import { skip, test } from "qunit"; import Handlebars from "handlebars"; import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; diff --git a/app/assets/javascripts/discourse/tests/unit/localization-test.js b/app/assets/javascripts/discourse/tests/unit/localization-test.js index 55f35738de..4939746aed 100644 --- a/app/assets/javascripts/discourse/tests/unit/localization-test.js +++ b/app/assets/javascripts/discourse/tests/unit/localization-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import I18n from "I18n"; import LocalizationInitializer from "discourse/initializers/localization"; diff --git a/app/assets/javascripts/discourse/tests/unit/mixins/grant-badge-controller-test.js b/app/assets/javascripts/discourse/tests/unit/mixins/grant-badge-controller-test.js index 7807f8c367..8b939bd9de 100644 --- a/app/assets/javascripts/discourse/tests/unit/mixins/grant-badge-controller-test.js +++ b/app/assets/javascripts/discourse/tests/unit/mixins/grant-badge-controller-test.js @@ -1,7 +1,7 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; +import Badge from "discourse/models/badge"; import Controller from "@ember/controller"; import GrantBadgeControllerMixin from "discourse/mixins/grant-badge-controller"; -import Badge from "discourse/models/badge"; module("Unit | Mixin | grant-badge-controller", function (hooks) { hooks.beforeEach(function () { diff --git a/app/assets/javascripts/discourse/tests/unit/mixins/setting-object-test.js b/app/assets/javascripts/discourse/tests/unit/mixins/setting-object-test.js index cc2f92bfe2..a3cca394fc 100644 --- a/app/assets/javascripts/discourse/tests/unit/mixins/setting-object-test.js +++ b/app/assets/javascripts/discourse/tests/unit/mixins/setting-object-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import EmberObject from "@ember/object"; import Setting from "admin/mixins/setting-object"; diff --git a/app/assets/javascripts/discourse/tests/unit/mixins/singleton-test.js b/app/assets/javascripts/discourse/tests/unit/mixins/singleton-test.js index 6aaf8c6e1b..b142e52042 100644 --- a/app/assets/javascripts/discourse/tests/unit/mixins/singleton-test.js +++ b/app/assets/javascripts/discourse/tests/unit/mixins/singleton-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import EmberObject from "@ember/object"; import Singleton from "discourse/mixins/singleton"; diff --git a/app/assets/javascripts/discourse/tests/unit/models/badge-test.js b/app/assets/javascripts/discourse/tests/unit/models/badge-test.js index 1e950b066d..794cf97231 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/badge-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/badge-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import Badge from "discourse/models/badge"; module("Unit | Model | badge", function () { diff --git a/app/assets/javascripts/discourse/tests/unit/models/category-test.js b/app/assets/javascripts/discourse/tests/unit/models/category-test.js index 8aac6f2467..2d5f8e0e85 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/category-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/category-test.js @@ -1,7 +1,7 @@ -import sinon from "sinon"; -import { test, module } from "qunit"; -import createStore from "discourse/tests/helpers/create-store"; +import { module, test } from "qunit"; import Category from "discourse/models/category"; +import createStore from "discourse/tests/helpers/create-store"; +import sinon from "sinon"; module("Unit | Model | category", function () { test("slugFor", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/models/composer-test.js b/app/assets/javascripts/discourse/tests/unit/models/composer-test.js index 53a0c41e53..975ea0303b 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/composer-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/composer-test.js @@ -1,18 +1,18 @@ -import { test } from "qunit"; -import EmberObject from "@ember/object"; import { - discourseModule, + CREATE_TOPIC, + EDIT, + PRIVATE_MESSAGE, + REPLY, +} from "discourse/models/composer"; +import { currentUser, + discourseModule, } from "discourse/tests/helpers/qunit-helpers"; import AppEvents from "discourse/services/app-events"; -import { - EDIT, - REPLY, - CREATE_TOPIC, - PRIVATE_MESSAGE, -} from "discourse/models/composer"; +import EmberObject from "@ember/object"; import Post from "discourse/models/post"; import createStore from "discourse/tests/helpers/create-store"; +import { test } from "qunit"; function createComposer(opts) { opts = opts || {}; diff --git a/app/assets/javascripts/discourse/tests/unit/models/email-log-test.js b/app/assets/javascripts/discourse/tests/unit/models/email-log-test.js index ad7e9a918c..adefc0dc13 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/email-log-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/email-log-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import EmailLog from "admin/models/email-log"; import { setPrefix } from "discourse-common/lib/get-url"; diff --git a/app/assets/javascripts/discourse/tests/unit/models/group-test.js b/app/assets/javascripts/discourse/tests/unit/models/group-test.js index 4e8d17114e..4b266f7e0c 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/group-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/group-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import Group from "discourse/models/group"; module("Unit | Model | group", function () { diff --git a/app/assets/javascripts/discourse/tests/unit/models/invite-test.js b/app/assets/javascripts/discourse/tests/unit/models/invite-test.js index 688aaebd06..10c7530751 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/invite-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/invite-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import Invite from "discourse/models/invite"; module("Unit | Model | invite", function () { diff --git a/app/assets/javascripts/discourse/tests/unit/models/nav-item-test.js b/app/assets/javascripts/discourse/tests/unit/models/nav-item-test.js index ead95c535c..329aa30fa6 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/nav-item-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/nav-item-test.js @@ -1,9 +1,9 @@ -import { test, module } from "qunit"; -import { run } from "@ember/runloop"; -import createStore from "discourse/tests/helpers/create-store"; -import NavItem from "discourse/models/nav-item"; +import { module, test } from "qunit"; import Category from "discourse/models/category"; +import NavItem from "discourse/models/nav-item"; import Site from "discourse/models/site"; +import createStore from "discourse/tests/helpers/create-store"; +import { run } from "@ember/runloop"; module("Unit | Model | nav-item", function (hooks) { hooks.beforeEach(function () { diff --git a/app/assets/javascripts/discourse/tests/unit/models/post-stream-test.js b/app/assets/javascripts/discourse/tests/unit/models/post-stream-test.js index 97a93542f3..849c8e7d6d 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/post-stream-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/post-stream-test.js @@ -1,11 +1,11 @@ -import sinon from "sinon"; -import { test, module } from "qunit"; +import { module, test } from "qunit"; import ArrayProxy from "@ember/array/proxy"; import Post from "discourse/models/post"; -import createStore from "discourse/tests/helpers/create-store"; -import User from "discourse/models/user"; import { Promise } from "rsvp"; +import User from "discourse/models/user"; +import createStore from "discourse/tests/helpers/create-store"; import pretender from "discourse/tests/helpers/create-pretender"; +import sinon from "sinon"; function buildStream(id, stream) { const store = createStore(); diff --git a/app/assets/javascripts/discourse/tests/unit/models/post-test.js b/app/assets/javascripts/discourse/tests/unit/models/post-test.js index 39b5a58471..b85d5762b7 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/post-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/post-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import Post from "discourse/models/post"; import User from "discourse/models/user"; import { deepMerge } from "discourse-common/lib/object"; diff --git a/app/assets/javascripts/discourse/tests/unit/models/report-test.js b/app/assets/javascripts/discourse/tests/unit/models/report-test.js index 2fd60707fd..3324ec0919 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/report-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/report-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import Report from "admin/models/report"; import { setPrefix } from "discourse-common/lib/get-url"; diff --git a/app/assets/javascripts/discourse/tests/unit/models/rest-model-test.js b/app/assets/javascripts/discourse/tests/unit/models/rest-model-test.js index 2a6f7a75c0..8fe391217d 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/rest-model-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/rest-model-test.js @@ -1,8 +1,8 @@ -import sinon from "sinon"; -import { test, module } from "qunit"; -import createStore from "discourse/tests/helpers/create-store"; -import RestModel from "discourse/models/rest"; +import { module, test } from "qunit"; import RestAdapter from "discourse/adapters/rest"; +import RestModel from "discourse/models/rest"; +import createStore from "discourse/tests/helpers/create-store"; +import sinon from "sinon"; module("Unit | Model | rest-model", function () { test("munging", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/models/result-set-test.js b/app/assets/javascripts/discourse/tests/unit/models/result-set-test.js index cf102cc9dd..595e722780 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/result-set-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/result-set-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import ResultSet from "discourse/models/result-set"; import createStore from "discourse/tests/helpers/create-store"; diff --git a/app/assets/javascripts/discourse/tests/unit/models/session-test.js b/app/assets/javascripts/discourse/tests/unit/models/session-test.js index 30c521afe4..8037876ec9 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/session-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/session-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import Session from "discourse/models/session"; module("Unit | Model | session", function () { diff --git a/app/assets/javascripts/discourse/tests/unit/models/site-test.js b/app/assets/javascripts/discourse/tests/unit/models/site-test.js index dd0395eee3..d5e52ada4c 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/site-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/site-test.js @@ -1,6 +1,6 @@ -import { test, module } from "qunit"; -import createStore from "discourse/tests/helpers/create-store"; +import { module, test } from "qunit"; import Site from "discourse/models/site"; +import createStore from "discourse/tests/helpers/create-store"; module("Unit | Model | site", function () { test("create", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/models/staff-action-log-test.js b/app/assets/javascripts/discourse/tests/unit/models/staff-action-log-test.js index 1ad43c507a..e76f05fdbe 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/staff-action-log-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/staff-action-log-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import StaffActionLog from "admin/models/staff-action-log"; module("Unit | Model | staff-action-log", function () { diff --git a/app/assets/javascripts/discourse/tests/unit/models/topic-details-test.js b/app/assets/javascripts/discourse/tests/unit/models/topic-details-test.js index dcd6d9d0dc..8cbe7b06b5 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/topic-details-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/topic-details-test.js @@ -1,6 +1,6 @@ -import { test, module } from "qunit"; -import User from "discourse/models/user"; +import { module, test } from "qunit"; import Topic from "discourse/models/topic"; +import User from "discourse/models/user"; function buildDetails(id) { const topic = Topic.create({ id: id }); diff --git a/app/assets/javascripts/discourse/tests/unit/models/topic-test.js b/app/assets/javascripts/discourse/tests/unit/models/topic-test.js index 02fbdbd492..cbad413691 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/topic-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/topic-test.js @@ -1,10 +1,10 @@ -import { test } from "qunit"; -import { IMAGE_VERSION as v } from "pretty-text/emoji/version"; import Category from "discourse/models/category"; +import EmberObject from "@ember/object"; import Topic from "discourse/models/topic"; import User from "discourse/models/user"; import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; -import EmberObject from "@ember/object"; +import { test } from "qunit"; +import { IMAGE_VERSION as v } from "pretty-text/emoji/version"; discourseModule("Unit | Model | topic", function () { test("defaults", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/models/topic-tracking-state-test.js b/app/assets/javascripts/discourse/tests/unit/models/topic-tracking-state-test.js index 2f7b2331a1..761f955f6f 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/topic-tracking-state-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/topic-tracking-state-test.js @@ -1,9 +1,9 @@ -import { test, module } from "qunit"; -import TopicTrackingState from "discourse/models/topic-tracking-state"; -import createStore from "discourse/tests/helpers/create-store"; +import { module, test } from "qunit"; import Category from "discourse/models/category"; import { NotificationLevels } from "discourse/lib/notification-levels"; +import TopicTrackingState from "discourse/models/topic-tracking-state"; import User from "discourse/models/user"; +import createStore from "discourse/tests/helpers/create-store"; import sinon from "sinon"; module("Unit | Model | topic-tracking-state", function (hooks) { diff --git a/app/assets/javascripts/discourse/tests/unit/models/user-action-test.js b/app/assets/javascripts/discourse/tests/unit/models/user-action-test.js index 00dd4c0116..9b6518c3de 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/user-action-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/user-action-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import UserAction from "discourse/models/user-action"; module("Unit | Model | user-action", function () { diff --git a/app/assets/javascripts/discourse/tests/unit/models/user-badge-test.js b/app/assets/javascripts/discourse/tests/unit/models/user-badge-test.js index 999cbc94d1..28257789e2 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/user-badge-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/user-badge-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import UserBadge from "discourse/models/user-badge"; import badgeFixtures from "discourse/tests/fixtures/user-badges"; diff --git a/app/assets/javascripts/discourse/tests/unit/models/user-drafts-test.js b/app/assets/javascripts/discourse/tests/unit/models/user-drafts-test.js index a7b8ecc538..118089d644 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/user-drafts-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/user-drafts-test.js @@ -1,8 +1,8 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import I18n from "I18n"; -import UserDraft from "discourse/models/user-draft"; import { NEW_TOPIC_KEY } from "discourse/models/composer"; import User from "discourse/models/user"; +import UserDraft from "discourse/models/user-draft"; module("Unit | Model | user-draft", function () { test("stream", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/models/user-stream-test.js b/app/assets/javascripts/discourse/tests/unit/models/user-stream-test.js index 698855b3cc..9fdeb815a6 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/user-stream-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/user-stream-test.js @@ -1,6 +1,6 @@ -import { test, module } from "qunit"; -import UserAction from "discourse/models/user-action"; +import { module, test } from "qunit"; import User from "discourse/models/user"; +import UserAction from "discourse/models/user-action"; module("Unit | Model | user-stream", function () { test("basics", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/models/user-test.js b/app/assets/javascripts/discourse/tests/unit/models/user-test.js index 680f6562db..d17725a6f8 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/user-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/user-test.js @@ -1,9 +1,9 @@ -import sinon from "sinon"; -import { test, module } from "qunit"; -import User from "discourse/models/user"; -import Group from "discourse/models/group"; import * as ajaxlib from "discourse/lib/ajax"; +import { module, test } from "qunit"; +import Group from "discourse/models/group"; +import User from "discourse/models/user"; import pretender from "discourse/tests/helpers/create-pretender"; +import sinon from "sinon"; module("Unit | Model | user", function () { test("staff", function (assert) { diff --git a/app/assets/javascripts/discourse/tests/unit/services/document-title-test.js b/app/assets/javascripts/discourse/tests/unit/services/document-title-test.js index cae8dccdb6..a960c3757e 100644 --- a/app/assets/javascripts/discourse/tests/unit/services/document-title-test.js +++ b/app/assets/javascripts/discourse/tests/unit/services/document-title-test.js @@ -1,8 +1,8 @@ -import { test } from "qunit"; import { - discourseModule, currentUser, + discourseModule, } from "discourse/tests/helpers/qunit-helpers"; +import { test } from "qunit"; discourseModule("Unit | Service | document-title", function (hooks) { hooks.beforeEach(function () { diff --git a/app/assets/javascripts/discourse/tests/unit/services/store-test.js b/app/assets/javascripts/discourse/tests/unit/services/store-test.js index 1396d5122d..28d676453b 100644 --- a/app/assets/javascripts/discourse/tests/unit/services/store-test.js +++ b/app/assets/javascripts/discourse/tests/unit/services/store-test.js @@ -1,4 +1,4 @@ -import { test, module } from "qunit"; +import { module, test } from "qunit"; import createStore from "discourse/tests/helpers/create-store"; module("Unit | Service | store", function () { diff --git a/app/assets/javascripts/discourse/tests/unit/utils/decorators-test.js b/app/assets/javascripts/discourse/tests/unit/utils/decorators-test.js index 996ed19473..5da70fd5d8 100644 --- a/app/assets/javascripts/discourse/tests/unit/utils/decorators-test.js +++ b/app/assets/javascripts/discourse/tests/unit/utils/decorators-test.js @@ -1,7 +1,7 @@ -import { exists } from "discourse/tests/helpers/qunit-helpers"; -import { afterRender } from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import { afterRender } from "discourse-common/utils/decorators"; import componentTest from "discourse/tests/helpers/component-test"; +import { exists } from "discourse/tests/helpers/qunit-helpers"; import { moduleForComponent } from "ember-qunit"; const fooComponent = Component.extend({ diff --git a/app/assets/javascripts/pretty-text/addon/emoji.js b/app/assets/javascripts/pretty-text/addon/emoji.js index 67a7c2afaf..6e25d3881c 100644 --- a/app/assets/javascripts/pretty-text/addon/emoji.js +++ b/app/assets/javascripts/pretty-text/addon/emoji.js @@ -1,10 +1,10 @@ import { - emojis, aliases, - searchAliases, - translations, - tonableEmojis, + emojis, replacements, + searchAliases, + tonableEmojis, + translations, } from "pretty-text/emoji/data"; import { IMAGE_VERSION } from "pretty-text/emoji/version"; diff --git a/app/assets/javascripts/pretty-text/addon/engines/discourse-markdown-it.js b/app/assets/javascripts/pretty-text/addon/engines/discourse-markdown-it.js index e28ec7becf..3e6f3f64fe 100644 --- a/app/assets/javascripts/pretty-text/addon/engines/discourse-markdown-it.js +++ b/app/assets/javascripts/pretty-text/addon/engines/discourse-markdown-it.js @@ -1,7 +1,7 @@ import AllowLister from "pretty-text/allow-lister"; -import { sanitize } from "pretty-text/sanitizer"; -import guid from "pretty-text/guid"; import deprecated from "discourse-common/lib/deprecated"; +import guid from "pretty-text/guid"; +import { sanitize } from "pretty-text/sanitizer"; export const ATTACHMENT_CSS_CLASS = "attachment"; diff --git a/app/assets/javascripts/pretty-text/addon/oneboxer.js b/app/assets/javascripts/pretty-text/addon/oneboxer.js index 00d6867d24..77879690de 100644 --- a/app/assets/javascripts/pretty-text/addon/oneboxer.js +++ b/app/assets/javascripts/pretty-text/addon/oneboxer.js @@ -1,13 +1,13 @@ -import { later } from "@ember/runloop"; import { - localCache, failedCache, - setLocalCache, - setFailedCache, - resetLocalCache, - resetFailedCache, + localCache, normalize, + resetFailedCache, + resetLocalCache, + setFailedCache, + setLocalCache, } from "pretty-text/oneboxer-cache"; +import { later } from "@ember/runloop"; let timeout; const loadingQueue = []; diff --git a/app/assets/javascripts/pretty-text/addon/upload-short-url.js b/app/assets/javascripts/pretty-text/addon/upload-short-url.js index 56a5311c22..5080a52ec8 100644 --- a/app/assets/javascripts/pretty-text/addon/upload-short-url.js +++ b/app/assets/javascripts/pretty-text/addon/upload-short-url.js @@ -1,5 +1,5 @@ -import { debounce } from "@ember/runloop"; import I18n from "I18n"; +import { debounce } from "@ember/runloop"; let _cache = {}; diff --git a/app/assets/javascripts/pretty-text/addon/white-lister.js b/app/assets/javascripts/pretty-text/addon/white-lister.js index 9e2fa6bf10..e07df502e4 100644 --- a/app/assets/javascripts/pretty-text/addon/white-lister.js +++ b/app/assets/javascripts/pretty-text/addon/white-lister.js @@ -1,7 +1,7 @@ -import deprecated from "discourse-common/lib/deprecated"; import AllowLister, { DEFAULT_LIST as NEW_DEFAULT_LIST, } from "pretty-text/allow-lister"; +import deprecated from "discourse-common/lib/deprecated"; export default class WhiteLister extends AllowLister { constructor(options) { diff --git a/app/assets/javascripts/pretty-text/engines/discourse-markdown/onebox.js b/app/assets/javascripts/pretty-text/engines/discourse-markdown/onebox.js index edbe4d54bd..f1eb387877 100644 --- a/app/assets/javascripts/pretty-text/engines/discourse-markdown/onebox.js +++ b/app/assets/javascripts/pretty-text/engines/discourse-markdown/onebox.js @@ -1,5 +1,5 @@ -import { lookupCache } from "pretty-text/oneboxer-cache"; import { cachedInlineOnebox } from "pretty-text/inline-oneboxer"; +import { lookupCache } from "pretty-text/oneboxer-cache"; const ONEBOX = 1; const INLINE = 2; diff --git a/app/assets/javascripts/select-kit/addon/components/categories-admin-dropdown.js b/app/assets/javascripts/select-kit/addon/components/categories-admin-dropdown.js index 4336ff22a5..da6f133907 100644 --- a/app/assets/javascripts/select-kit/addon/components/categories-admin-dropdown.js +++ b/app/assets/javascripts/select-kit/addon/components/categories-admin-dropdown.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; +import I18n from "I18n"; import { computed } from "@ember/object"; import { setting } from "discourse/lib/computed"; diff --git a/app/assets/javascripts/select-kit/addon/components/category-chooser.js b/app/assets/javascripts/select-kit/addon/components/category-chooser.js index 8bb8a68815..fa56c7a443 100644 --- a/app/assets/javascripts/select-kit/addon/components/category-chooser.js +++ b/app/assets/javascripts/select-kit/addon/components/category-chooser.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; -import ComboBoxComponent from "select-kit/components/combo-box"; -import PermissionType from "discourse/models/permission-type"; -import Category from "discourse/models/category"; -import { categoryBadgeHTML } from "discourse/helpers/category-link"; import { computed, set } from "@ember/object"; +import Category from "discourse/models/category"; +import ComboBoxComponent from "select-kit/components/combo-box"; +import I18n from "I18n"; +import PermissionType from "discourse/models/permission-type"; +import { categoryBadgeHTML } from "discourse/helpers/category-link"; import { isNone } from "@ember/utils"; import { setting } from "discourse/lib/computed"; diff --git a/app/assets/javascripts/select-kit/addon/components/category-drop.js b/app/assets/javascripts/select-kit/addon/components/category-drop.js index a7d6e82e06..9007a45219 100644 --- a/app/assets/javascripts/select-kit/addon/components/category-drop.js +++ b/app/assets/javascripts/select-kit/addon/components/category-drop.js @@ -1,11 +1,11 @@ -import getURL from "discourse-common/lib/get-url"; -import I18n from "I18n"; -import { readOnly } from "@ember/object/computed"; -import { computed } from "@ember/object"; +import Category from "discourse/models/category"; import ComboBoxComponent from "select-kit/components/combo-box"; import DiscourseURL from "discourse/lib/url"; -import Category from "discourse/models/category"; +import I18n from "I18n"; import { categoryBadgeHTML } from "discourse/helpers/category-link"; +import { computed } from "@ember/object"; +import getURL from "discourse-common/lib/get-url"; +import { readOnly } from "@ember/object/computed"; export const NO_CATEGORIES_ID = "no-categories"; export const ALL_CATEGORIES_ID = "all-categories"; diff --git a/app/assets/javascripts/select-kit/addon/components/category-drop/category-drop-header.js b/app/assets/javascripts/select-kit/addon/components/category-drop/category-drop-header.js index 7daa6c0e4b..5cb7281d89 100644 --- a/app/assets/javascripts/select-kit/addon/components/category-drop/category-drop-header.js +++ b/app/assets/javascripts/select-kit/addon/components/category-drop/category-drop-header.js @@ -1,8 +1,8 @@ -import { readOnly } from "@ember/object/computed"; -import { schedule } from "@ember/runloop"; import ComboBoxSelectBoxHeaderComponent from "select-kit/components/combo-box/combo-box-header"; import discourseComputed from "discourse-common/utils/decorators"; import layout from "select-kit/templates/components/category-drop/category-drop-header"; +import { readOnly } from "@ember/object/computed"; +import { schedule } from "@ember/runloop"; export default ComboBoxSelectBoxHeaderComponent.extend({ layout, diff --git a/app/assets/javascripts/select-kit/addon/components/category-notifications-button.js b/app/assets/javascripts/select-kit/addon/components/category-notifications-button.js index aee957c63c..4b93627ef6 100644 --- a/app/assets/javascripts/select-kit/addon/components/category-notifications-button.js +++ b/app/assets/javascripts/select-kit/addon/components/category-notifications-button.js @@ -1,5 +1,5 @@ -import { or } from "@ember/object/computed"; import NotificationOptionsComponent from "select-kit/components/notifications-button"; +import { or } from "@ember/object/computed"; export default NotificationOptionsComponent.extend({ pluginApiIdentifiers: ["category-notifications-button"], diff --git a/app/assets/javascripts/select-kit/addon/components/category-row.js b/app/assets/javascripts/select-kit/addon/components/category-row.js index cbcb6df4db..dedd8a5c48 100644 --- a/app/assets/javascripts/select-kit/addon/components/category-row.js +++ b/app/assets/javascripts/select-kit/addon/components/category-row.js @@ -1,11 +1,11 @@ -import { reads, bool } from "@ember/object/computed"; -import SelectKitRowComponent from "select-kit/components/select-kit/select-kit-row"; -import Category from "discourse/models/category"; -import { categoryBadgeHTML } from "discourse/helpers/category-link"; +import { bool, reads } from "@ember/object/computed"; import { isEmpty, isNone } from "@ember/utils"; +import Category from "discourse/models/category"; +import SelectKitRowComponent from "select-kit/components/select-kit/select-kit-row"; +import { categoryBadgeHTML } from "discourse/helpers/category-link"; import { computed } from "@ember/object"; -import { setting } from "discourse/lib/computed"; import layout from "select-kit/templates/components/category-row"; +import { setting } from "discourse/lib/computed"; function htmlToText(encodedString) { const elem = document.createElement("textarea"); diff --git a/app/assets/javascripts/select-kit/addon/components/category-selector.js b/app/assets/javascripts/select-kit/addon/components/category-selector.js index 69f157fe41..1a081f9e9c 100644 --- a/app/assets/javascripts/select-kit/addon/components/category-selector.js +++ b/app/assets/javascripts/select-kit/addon/components/category-selector.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import { categoryBadgeHTML } from "discourse/helpers/category-link"; -import EmberObject, { get, computed } from "@ember/object"; -import { mapBy } from "@ember/object/computed"; -import { makeArray } from "discourse-common/lib/helpers"; -import MultiSelectComponent from "select-kit/components/multi-select"; +import EmberObject, { computed, get } from "@ember/object"; import Category from "discourse/models/category"; +import I18n from "I18n"; +import MultiSelectComponent from "select-kit/components/multi-select"; +import { categoryBadgeHTML } from "discourse/helpers/category-link"; +import { makeArray } from "discourse-common/lib/helpers"; +import { mapBy } from "@ember/object/computed"; export default MultiSelectComponent.extend({ pluginApiIdentifiers: ["category-selector"], diff --git a/app/assets/javascripts/select-kit/addon/components/color-palettes.js b/app/assets/javascripts/select-kit/addon/components/color-palettes.js index 417aca4edc..9c419f41b5 100644 --- a/app/assets/javascripts/select-kit/addon/components/color-palettes.js +++ b/app/assets/javascripts/select-kit/addon/components/color-palettes.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import ComboBoxComponent from "select-kit/components/combo-box"; +import I18n from "I18n"; export default ComboBoxComponent.extend({ pluginApiIdentifiers: ["color-palettes"], diff --git a/app/assets/javascripts/select-kit/addon/components/color-palettes/color-palettes-row.js b/app/assets/javascripts/select-kit/addon/components/color-palettes/color-palettes-row.js index 4ec5a382de..4819db65d0 100644 --- a/app/assets/javascripts/select-kit/addon/components/color-palettes/color-palettes-row.js +++ b/app/assets/javascripts/select-kit/addon/components/color-palettes/color-palettes-row.js @@ -1,6 +1,6 @@ -import { escapeExpression } from "discourse/lib/utilities"; import SelectKitRowComponent from "select-kit/components/select-kit/select-kit-row"; import { computed } from "@ember/object"; +import { escapeExpression } from "discourse/lib/utilities"; import layout from "select-kit/templates/components/color-palettes/color-palettes-row"; export default SelectKitRowComponent.extend({ diff --git a/app/assets/javascripts/select-kit/addon/components/combo-box/combo-box-header.js b/app/assets/javascripts/select-kit/addon/components/combo-box/combo-box-header.js index be48bb3132..6d6378d333 100644 --- a/app/assets/javascripts/select-kit/addon/components/combo-box/combo-box-header.js +++ b/app/assets/javascripts/select-kit/addon/components/combo-box/combo-box-header.js @@ -1,4 +1,4 @@ -import { reads, and } from "@ember/object/computed"; +import { and, reads } from "@ember/object/computed"; import SingleSelectHeaderComponent from "select-kit/components/select-kit/single-select-header"; import { computed } from "@ember/object"; import layout from "select-kit/templates/components/combo-box/combo-box-header"; diff --git a/app/assets/javascripts/select-kit/addon/components/composer-actions.js b/app/assets/javascripts/select-kit/addon/components/composer-actions.js index c453c46918..3cde967ef3 100644 --- a/app/assets/javascripts/select-kit/addon/components/composer-actions.js +++ b/app/assets/javascripts/select-kit/addon/components/composer-actions.js @@ -1,18 +1,18 @@ -import I18n from "I18n"; -import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; import { - PRIVATE_MESSAGE, - CREATE_TOPIC, CREATE_SHARED_DRAFT, - REPLY, + CREATE_TOPIC, EDIT, + PRIVATE_MESSAGE, + REPLY, } from "discourse/models/composer"; import Draft from "discourse/models/draft"; +import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; +import I18n from "I18n"; +import bootbox from "bootbox"; +import { camelize } from "@ember/string"; import { computed } from "@ember/object"; import { equal } from "@ember/object/computed"; -import { camelize } from "@ember/string"; import { isEmpty } from "@ember/utils"; -import bootbox from "bootbox"; // Component can get destroyed and lose state let _topicSnapshot = null; diff --git a/app/assets/javascripts/select-kit/addon/components/create-color-row.js b/app/assets/javascripts/select-kit/addon/components/create-color-row.js index 063cc67ba3..e19630287f 100644 --- a/app/assets/javascripts/select-kit/addon/components/create-color-row.js +++ b/app/assets/javascripts/select-kit/addon/components/create-color-row.js @@ -1,7 +1,7 @@ import SelectKitRowComponent from "select-kit/components/select-kit/select-kit-row"; import { escapeExpression } from "discourse/lib/utilities"; -import { schedule } from "@ember/runloop"; import layout from "select-kit/templates/components/create-color-row"; +import { schedule } from "@ember/runloop"; export default SelectKitRowComponent.extend({ layout, diff --git a/app/assets/javascripts/select-kit/addon/components/dropdown-select-box/dropdown-select-box-header.js b/app/assets/javascripts/select-kit/addon/components/dropdown-select-box/dropdown-select-box-header.js index 68d26db9af..c8115d4850 100644 --- a/app/assets/javascripts/select-kit/addon/components/dropdown-select-box/dropdown-select-box-header.js +++ b/app/assets/javascripts/select-kit/addon/components/dropdown-select-box/dropdown-select-box-header.js @@ -1,7 +1,7 @@ import SingleSelectHeaderComponent from "select-kit/components/select-kit/single-select-header"; import { computed } from "@ember/object"; -import { readOnly } from "@ember/object/computed"; import layout from "select-kit/templates/components/dropdown-select-box/dropdown-select-box-header"; +import { readOnly } from "@ember/object/computed"; export default SingleSelectHeaderComponent.extend({ layout, diff --git a/app/assets/javascripts/select-kit/addon/components/dropdown-select-box/dropdown-select-box-row.js b/app/assets/javascripts/select-kit/addon/components/dropdown-select-box/dropdown-select-box-row.js index 3bb126c0fa..6399da5b2d 100644 --- a/app/assets/javascripts/select-kit/addon/components/dropdown-select-box/dropdown-select-box-row.js +++ b/app/assets/javascripts/select-kit/addon/components/dropdown-select-box/dropdown-select-box-row.js @@ -1,6 +1,6 @@ -import { readOnly } from "@ember/object/computed"; import SelectKitRowComponent from "select-kit/components/select-kit/select-kit-row"; import layout from "select-kit/templates/components/dropdown-select-box/dropdown-select-box-row"; +import { readOnly } from "@ember/object/computed"; export default SelectKitRowComponent.extend({ layout, diff --git a/app/assets/javascripts/select-kit/addon/components/future-date-input-selector.js b/app/assets/javascripts/select-kit/addon/components/future-date-input-selector.js index 291a7c1bb4..8371514e74 100644 --- a/app/assets/javascripts/select-kit/addon/components/future-date-input-selector.js +++ b/app/assets/javascripts/select-kit/addon/components/future-date-input-selector.js @@ -1,10 +1,10 @@ +import { CLOSE_STATUS_TYPE } from "discourse/controllers/edit-topic-timer"; +import ComboBoxComponent from "select-kit/components/combo-box"; +import DatetimeMixin from "select-kit/components/future-date-input-selector/mixin"; import I18n from "I18n"; import { computed } from "@ember/object"; import { equal } from "@ember/object/computed"; import { isEmpty } from "@ember/utils"; -import ComboBoxComponent from "select-kit/components/combo-box"; -import { CLOSE_STATUS_TYPE } from "discourse/controllers/edit-topic-timer"; -import DatetimeMixin from "select-kit/components/future-date-input-selector/mixin"; const TIMEFRAME_BASE = { enabled: () => true, diff --git a/app/assets/javascripts/select-kit/addon/components/future-date-input-selector/mixin.js b/app/assets/javascripts/select-kit/addon/components/future-date-input-selector/mixin.js index 66dea89183..c9b64fa531 100644 --- a/app/assets/javascripts/select-kit/addon/components/future-date-input-selector/mixin.js +++ b/app/assets/javascripts/select-kit/addon/components/future-date-input-selector/mixin.js @@ -1,7 +1,7 @@ import { CLOSE_STATUS_TYPE } from "discourse/controllers/edit-topic-timer"; -import { timeframeDetails } from "select-kit/components/future-date-input-selector"; import Mixin from "@ember/object/mixin"; import { isNone } from "@ember/utils"; +import { timeframeDetails } from "select-kit/components/future-date-input-selector"; export default Mixin.create({ _computeIconsForValue(value) { diff --git a/app/assets/javascripts/select-kit/addon/components/group-dropdown.js b/app/assets/javascripts/select-kit/addon/components/group-dropdown.js index 4477618753..365f8c5ad0 100644 --- a/app/assets/javascripts/select-kit/addon/components/group-dropdown.js +++ b/app/assets/javascripts/select-kit/addon/components/group-dropdown.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; -import { reads, gte } from "@ember/object/computed"; +import { gte, reads } from "@ember/object/computed"; import ComboBoxComponent from "select-kit/components/combo-box"; import DiscourseURL from "discourse/lib/url"; +import I18n from "I18n"; import { computed } from "@ember/object"; import { setting } from "discourse/lib/computed"; diff --git a/app/assets/javascripts/select-kit/addon/components/group-members-dropdown.js b/app/assets/javascripts/select-kit/addon/components/group-members-dropdown.js index 5d089e1be0..d9d64832c3 100644 --- a/app/assets/javascripts/select-kit/addon/components/group-members-dropdown.js +++ b/app/assets/javascripts/select-kit/addon/components/group-members-dropdown.js @@ -1,6 +1,6 @@ -import I18n from "I18n"; -import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; import { action, computed } from "@ember/object"; +import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; +import I18n from "I18n"; export default DropdownSelectBoxComponent.extend({ classNames: ["group-members-dropdown"], diff --git a/app/assets/javascripts/select-kit/addon/components/icon-picker.js b/app/assets/javascripts/select-kit/addon/components/icon-picker.js index eb053b0396..69b7767b1d 100644 --- a/app/assets/javascripts/select-kit/addon/components/icon-picker.js +++ b/app/assets/javascripts/select-kit/addon/components/icon-picker.js @@ -1,13 +1,13 @@ -import MultiSelectComponent from "select-kit/components/multi-select"; -import { computed } from "@ember/object"; -import { ajax } from "discourse/lib/ajax"; -import { makeArray } from "discourse-common/lib/helpers"; import { convertIconClass, disableMissingIconWarning, enableMissingIconWarning, } from "discourse-common/lib/icon-library"; +import MultiSelectComponent from "select-kit/components/multi-select"; +import { ajax } from "discourse/lib/ajax"; +import { computed } from "@ember/object"; import { isDevelopment } from "discourse-common/config/environment"; +import { makeArray } from "discourse-common/lib/helpers"; export default MultiSelectComponent.extend({ pluginApiIdentifiers: ["icon-picker"], diff --git a/app/assets/javascripts/select-kit/addon/components/list-setting.js b/app/assets/javascripts/select-kit/addon/components/list-setting.js index f2ee92b603..da9d9f7d4b 100644 --- a/app/assets/javascripts/select-kit/addon/components/list-setting.js +++ b/app/assets/javascripts/select-kit/addon/components/list-setting.js @@ -1,8 +1,8 @@ -import MultiSelectComponent from "select-kit/components/multi-select"; import { MAIN_COLLECTION } from "select-kit/components/select-kit"; +import MultiSelectComponent from "select-kit/components/multi-select"; import { computed } from "@ember/object"; -import { readOnly } from "@ember/object/computed"; import { makeArray } from "discourse-common/lib/helpers"; +import { readOnly } from "@ember/object/computed"; export default MultiSelectComponent.extend({ pluginApiIdentifiers: ["list-setting"], diff --git a/app/assets/javascripts/select-kit/addon/components/mini-tag-chooser.js b/app/assets/javascripts/select-kit/addon/components/mini-tag-chooser.js index 8ed8cff649..7fcbe045fe 100644 --- a/app/assets/javascripts/select-kit/addon/components/mini-tag-chooser.js +++ b/app/assets/javascripts/select-kit/addon/components/mini-tag-chooser.js @@ -1,13 +1,13 @@ -import I18n from "I18n"; import { empty, or } from "@ember/object/computed"; import ComboBox from "select-kit/components/combo-box"; +import { ERRORS_COLLECTION } from "select-kit/components/select-kit"; +import I18n from "I18n"; import TagsMixin from "select-kit/mixins/tags"; -import { makeArray } from "discourse-common/lib/helpers"; import { computed } from "@ember/object"; -import { setting } from "discourse/lib/computed"; +import { makeArray } from "discourse-common/lib/helpers"; const SELECTED_TAGS_COLLECTION = "MINI_TAG_CHOOSER_SELECTED_TAGS"; -import { ERRORS_COLLECTION } from "select-kit/components/select-kit"; +import { setting } from "discourse/lib/computed"; export default ComboBox.extend(TagsMixin, { pluginApiIdentifiers: ["mini-tag-chooser"], diff --git a/app/assets/javascripts/select-kit/addon/components/mini-tag-chooser/selected-collection.js b/app/assets/javascripts/select-kit/addon/components/mini-tag-chooser/selected-collection.js index bb9fbac778..e8187c687a 100644 --- a/app/assets/javascripts/select-kit/addon/components/mini-tag-chooser/selected-collection.js +++ b/app/assets/javascripts/select-kit/addon/components/mini-tag-chooser/selected-collection.js @@ -1,6 +1,6 @@ +import { empty, reads } from "@ember/object/computed"; import Component from "@ember/component"; import { computed } from "@ember/object"; -import { reads, empty } from "@ember/object/computed"; import layout from "select-kit/templates/components/mini-tag-chooser/selected-collection"; export default Component.extend({ diff --git a/app/assets/javascripts/select-kit/addon/components/multi-select.js b/app/assets/javascripts/select-kit/addon/components/multi-select.js index 2c7900fe4a..d4b8e09a14 100644 --- a/app/assets/javascripts/select-kit/addon/components/multi-select.js +++ b/app/assets/javascripts/select-kit/addon/components/multi-select.js @@ -1,9 +1,9 @@ -import deprecated from "discourse-common/lib/deprecated"; import SelectKitComponent from "select-kit/components/select-kit"; import { computed } from "@ember/object"; +import deprecated from "discourse-common/lib/deprecated"; import { isPresent } from "@ember/utils"; -import { makeArray } from "discourse-common/lib/helpers"; import layout from "select-kit/templates/components/multi-select"; +import { makeArray } from "discourse-common/lib/helpers"; export default SelectKitComponent.extend({ pluginApiIdentifiers: ["multi-select"], diff --git a/app/assets/javascripts/select-kit/addon/components/multi-select/multi-select-filter.js b/app/assets/javascripts/select-kit/addon/components/multi-select/multi-select-filter.js index 267e83f273..3e49691a4f 100644 --- a/app/assets/javascripts/select-kit/addon/components/multi-select/multi-select-filter.js +++ b/app/assets/javascripts/select-kit/addon/components/multi-select/multi-select-filter.js @@ -1,7 +1,7 @@ import I18n from "I18n"; -import discourseComputed from "discourse-common/utils/decorators"; -const { isEmpty } = Ember; import SelectKitFilterComponent from "select-kit/components/select-kit/select-kit-filter"; +const { isEmpty } = Ember; +import discourseComputed from "discourse-common/utils/decorators"; import layout from "select-kit/templates/components/select-kit/select-kit-filter"; export default SelectKitFilterComponent.extend({ diff --git a/app/assets/javascripts/select-kit/addon/components/multi-select/multi-select-header.js b/app/assets/javascripts/select-kit/addon/components/multi-select/multi-select-header.js index e01a0f7ca8..ed3b298da8 100644 --- a/app/assets/javascripts/select-kit/addon/components/multi-select/multi-select-header.js +++ b/app/assets/javascripts/select-kit/addon/components/multi-select/multi-select-header.js @@ -1,7 +1,7 @@ import SelectKitHeaderComponent from "select-kit/components/select-kit/select-kit-header"; import { computed } from "@ember/object"; -import { makeArray } from "discourse-common/lib/helpers"; import layout from "select-kit/templates/components/multi-select/multi-select-header"; +import { makeArray } from "discourse-common/lib/helpers"; export default SelectKitHeaderComponent.extend({ classNames: ["multi-select-header"], diff --git a/app/assets/javascripts/select-kit/addon/components/notifications-button.js b/app/assets/javascripts/select-kit/addon/components/notifications-button.js index 5e0788e55a..0935db826b 100644 --- a/app/assets/javascripts/select-kit/addon/components/notifications-button.js +++ b/app/assets/javascripts/select-kit/addon/components/notifications-button.js @@ -1,7 +1,7 @@ -import I18n from "I18n"; -import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; import { allLevels, buttonDetails } from "discourse/lib/notification-levels"; import { computed, setProperties } from "@ember/object"; +import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; +import I18n from "I18n"; export default DropdownSelectBoxComponent.extend({ pluginApiIdentifiers: ["notifications-button"], diff --git a/app/assets/javascripts/select-kit/addon/components/notifications-button/notifications-button-row.js b/app/assets/javascripts/select-kit/addon/components/notifications-button/notifications-button-row.js index 25fa2f323f..58cb0aa44c 100644 --- a/app/assets/javascripts/select-kit/addon/components/notifications-button/notifications-button-row.js +++ b/app/assets/javascripts/select-kit/addon/components/notifications-button/notifications-button-row.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; -import { readOnly } from "@ember/object/computed"; -import { computed } from "@ember/object"; import DropdownSelectBoxRowComponent from "select-kit/components/dropdown-select-box/dropdown-select-box-row"; +import I18n from "I18n"; +import { computed } from "@ember/object"; import { escapeExpression } from "discourse/lib/utilities"; +import { readOnly } from "@ember/object/computed"; export default DropdownSelectBoxRowComponent.extend({ classNames: ["notifications-button-row"], diff --git a/app/assets/javascripts/select-kit/addon/components/notifications-filter.js b/app/assets/javascripts/select-kit/addon/components/notifications-filter.js index aafd2ce447..08b05789be 100644 --- a/app/assets/javascripts/select-kit/addon/components/notifications-filter.js +++ b/app/assets/javascripts/select-kit/addon/components/notifications-filter.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; +import I18n from "I18n"; import { computed } from "@ember/object"; export default DropdownSelectBoxComponent.extend({ diff --git a/app/assets/javascripts/select-kit/addon/components/period-chooser/period-chooser-row.js b/app/assets/javascripts/select-kit/addon/components/period-chooser/period-chooser-row.js index 49bfefa581..0787fa62ef 100644 --- a/app/assets/javascripts/select-kit/addon/components/period-chooser/period-chooser-row.js +++ b/app/assets/javascripts/select-kit/addon/components/period-chooser/period-chooser-row.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DropdownSelectBoxRowComponent from "select-kit/components/dropdown-select-box/dropdown-select-box-row"; +import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; import layout from "select-kit/templates/components/period-chooser/period-chooser-row"; diff --git a/app/assets/javascripts/select-kit/addon/components/pinned-button.js b/app/assets/javascripts/select-kit/addon/components/pinned-button.js index 3b9f79c091..bc1a834bec 100644 --- a/app/assets/javascripts/select-kit/addon/components/pinned-button.js +++ b/app/assets/javascripts/select-kit/addon/components/pinned-button.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import Component from "@ember/component"; +import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; import layout from "select-kit/templates/components/pinned-button"; diff --git a/app/assets/javascripts/select-kit/addon/components/pinned-options.js b/app/assets/javascripts/select-kit/addon/components/pinned-options.js index f137223f58..94a355baef 100644 --- a/app/assets/javascripts/select-kit/addon/components/pinned-options.js +++ b/app/assets/javascripts/select-kit/addon/components/pinned-options.js @@ -1,6 +1,6 @@ -import I18n from "I18n"; +import { action, computed } from "@ember/object"; import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; -import { computed, action } from "@ember/object"; +import I18n from "I18n"; const UNPINNED = "unpinned"; const PINNED = "pinned"; diff --git a/app/assets/javascripts/select-kit/addon/components/select-kit.js b/app/assets/javascripts/select-kit/addon/components/select-kit.js index d76586f50f..a440f8d096 100644 --- a/app/assets/javascripts/select-kit/addon/components/select-kit.js +++ b/app/assets/javascripts/select-kit/addon/components/select-kit.js @@ -1,26 +1,26 @@ -import { createPopper } from "@popperjs/core"; -import I18n from "I18n"; import EmberObject, { computed, get } from "@ember/object"; -import { guidFor } from "@ember/object/internals"; -import Component from "@ember/component"; -import deprecated from "discourse-common/lib/deprecated"; -import { makeArray } from "discourse-common/lib/helpers"; -import UtilsMixin from "select-kit/mixins/utils"; -import Mixin from "@ember/object/mixin"; -import { isPresent, isEmpty, isNone } from "@ember/utils"; -import { - next, - debounce, - cancel, - throttle, - bind, - schedule, -} from "@ember/runloop"; -import { Promise } from "rsvp"; import PluginApiMixin, { applyContentPluginApiCallbacks, applyOnChangePluginApiCallbacks, } from "select-kit/mixins/plugin-api"; +import { + bind, + cancel, + debounce, + next, + schedule, + throttle, +} from "@ember/runloop"; +import { isEmpty, isNone, isPresent } from "@ember/utils"; +import Component from "@ember/component"; +import I18n from "I18n"; +import Mixin from "@ember/object/mixin"; +import { Promise } from "rsvp"; +import UtilsMixin from "select-kit/mixins/utils"; +import { createPopper } from "@popperjs/core"; +import deprecated from "discourse-common/lib/deprecated"; +import { guidFor } from "@ember/object/internals"; +import { makeArray } from "discourse-common/lib/helpers"; export const MAIN_COLLECTION = "MAIN_COLLECTION"; export const ERRORS_COLLECTION = "ERRORS_COLLECTION"; diff --git a/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-body.js b/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-body.js index 594c0232a5..8566eee81d 100644 --- a/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-body.js +++ b/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-body.js @@ -1,6 +1,6 @@ import Component from "@ember/component"; -import { computed } from "@ember/object"; import { bind } from "@ember/runloop"; +import { computed } from "@ember/object"; import layout from "select-kit/templates/components/select-kit/select-kit-body"; export default Component.extend({ diff --git a/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-filter.js b/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-filter.js index 729b3d5d67..f9f6bbe2b3 100644 --- a/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-filter.js +++ b/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-filter.js @@ -1,11 +1,11 @@ -import I18n from "I18n"; import Component from "@ember/component"; +import I18n from "I18n"; +import UtilsMixin from "select-kit/mixins/utils"; +import { computed } from "@ember/object"; import discourseComputed from "discourse-common/utils/decorators"; import { isPresent } from "@ember/utils"; -import { computed } from "@ember/object"; -import { not } from "@ember/object/computed"; -import UtilsMixin from "select-kit/mixins/utils"; import layout from "select-kit/templates/components/select-kit/select-kit-filter"; +import { not } from "@ember/object/computed"; export default Component.extend(UtilsMixin, { layout, diff --git a/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-header.js b/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-header.js index 83a48f961d..7db79a2b52 100644 --- a/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-header.js +++ b/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-header.js @@ -1,8 +1,8 @@ -import { computed } from "@ember/object"; import Component from "@ember/component"; import UtilsMixin from "select-kit/mixins/utils"; -import { schedule } from "@ember/runloop"; +import { computed } from "@ember/object"; import { makeArray } from "discourse-common/lib/helpers"; +import { schedule } from "@ember/runloop"; export default Component.extend(UtilsMixin, { eventType: "click", diff --git a/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-row.js b/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-row.js index 30ed72ffce..287637a56d 100644 --- a/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-row.js +++ b/app/assets/javascripts/select-kit/addon/components/select-kit/select-kit-row.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; +import { action, computed } from "@ember/object"; import Component from "@ember/component"; -import { computed, action } from "@ember/object"; -import { makeArray } from "discourse-common/lib/helpers"; -import { guidFor } from "@ember/object/internals"; +import I18n from "I18n"; import UtilsMixin from "select-kit/mixins/utils"; +import { guidFor } from "@ember/object/internals"; import layout from "select-kit/templates/components/select-kit/select-kit-row"; +import { makeArray } from "discourse-common/lib/helpers"; export default Component.extend(UtilsMixin, { layout, diff --git a/app/assets/javascripts/select-kit/addon/components/selected-name.js b/app/assets/javascripts/select-kit/addon/components/selected-name.js index 5b0c512270..e9cc1688a7 100644 --- a/app/assets/javascripts/select-kit/addon/components/selected-name.js +++ b/app/assets/javascripts/select-kit/addon/components/selected-name.js @@ -1,8 +1,8 @@ -import { computed, get, action } from "@ember/object"; +import { action, computed, get } from "@ember/object"; import Component from "@ember/component"; -import { makeArray } from "discourse-common/lib/helpers"; import UtilsMixin from "select-kit/mixins/utils"; import layout from "select-kit/templates/components/selected-name"; +import { makeArray } from "discourse-common/lib/helpers"; export default Component.extend(UtilsMixin, { tagName: "", diff --git a/app/assets/javascripts/select-kit/addon/components/tag-chooser.js b/app/assets/javascripts/select-kit/addon/components/tag-chooser.js index 0fcc339c11..64693c62fe 100644 --- a/app/assets/javascripts/select-kit/addon/components/tag-chooser.js +++ b/app/assets/javascripts/select-kit/addon/components/tag-chooser.js @@ -1,6 +1,6 @@ -import { computed } from "@ember/object"; import MultiSelectComponent from "select-kit/components/multi-select"; import TagsMixin from "select-kit/mixins/tags"; +import { computed } from "@ember/object"; import { makeArray } from "discourse-common/lib/helpers"; export default MultiSelectComponent.extend(TagsMixin, { diff --git a/app/assets/javascripts/select-kit/addon/components/tag-drop.js b/app/assets/javascripts/select-kit/addon/components/tag-drop.js index 720e8ad64b..02abe4ccb2 100644 --- a/app/assets/javascripts/select-kit/addon/components/tag-drop.js +++ b/app/assets/javascripts/select-kit/addon/components/tag-drop.js @@ -1,11 +1,11 @@ -import getURL from "discourse-common/lib/get-url"; -import Category from "discourse/models/category"; -import { readOnly, or, equal, gte } from "@ember/object/computed"; +import { equal, gte, or, readOnly } from "@ember/object/computed"; import { i18n, setting } from "discourse/lib/computed"; +import Category from "discourse/models/category"; import ComboBoxComponent from "select-kit/components/combo-box"; import DiscourseURL from "discourse/lib/url"; import TagsMixin from "select-kit/mixins/tags"; import { computed } from "@ember/object"; +import getURL from "discourse-common/lib/get-url"; import { isEmpty } from "@ember/utils"; import { makeArray } from "discourse-common/lib/helpers"; diff --git a/app/assets/javascripts/select-kit/addon/components/tag-group-chooser.js b/app/assets/javascripts/select-kit/addon/components/tag-group-chooser.js index 17676a20e6..d2026ff113 100644 --- a/app/assets/javascripts/select-kit/addon/components/tag-group-chooser.js +++ b/app/assets/javascripts/select-kit/addon/components/tag-group-chooser.js @@ -1,7 +1,7 @@ import MultiSelectComponent from "select-kit/components/multi-select"; import TagsMixin from "select-kit/mixins/tags"; -import { makeArray } from "discourse-common/lib/helpers"; import { computed } from "@ember/object"; +import { makeArray } from "discourse-common/lib/helpers"; export default MultiSelectComponent.extend(TagsMixin, { pluginApiIdentifiers: ["tag-group-chooser"], diff --git a/app/assets/javascripts/select-kit/addon/components/toolbar-popup-menu-options.js b/app/assets/javascripts/select-kit/addon/components/toolbar-popup-menu-options.js index 812166a29e..e8a1f68c28 100644 --- a/app/assets/javascripts/select-kit/addon/components/toolbar-popup-menu-options.js +++ b/app/assets/javascripts/select-kit/addon/components/toolbar-popup-menu-options.js @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; +import I18n from "I18n"; export default DropdownSelectBoxComponent.extend({ pluginApiIdentifiers: ["toolbar-popup-menu-options"], diff --git a/app/assets/javascripts/select-kit/addon/components/topic-notifications-button.js b/app/assets/javascripts/select-kit/addon/components/topic-notifications-button.js index dd7ada4144..13faac30b1 100644 --- a/app/assets/javascripts/select-kit/addon/components/topic-notifications-button.js +++ b/app/assets/javascripts/select-kit/addon/components/topic-notifications-button.js @@ -1,5 +1,5 @@ -import Component from "@ember/component"; import { action, computed } from "@ember/object"; +import Component from "@ember/component"; import layout from "select-kit/templates/components/topic-notifications-button"; export default Component.extend({ diff --git a/app/assets/javascripts/select-kit/addon/components/topic-notifications-options.js b/app/assets/javascripts/select-kit/addon/components/topic-notifications-options.js index 163ea1030b..65b99695f5 100644 --- a/app/assets/javascripts/select-kit/addon/components/topic-notifications-options.js +++ b/app/assets/javascripts/select-kit/addon/components/topic-notifications-options.js @@ -1,6 +1,6 @@ import NotificationsButtonComponent from "select-kit/components/notifications-button"; -import { topicLevels } from "discourse/lib/notification-levels"; import { computed } from "@ember/object"; +import { topicLevels } from "discourse/lib/notification-levels"; export default NotificationsButtonComponent.extend({ pluginApiIdentifiers: ["topic-notifications-options"], diff --git a/app/assets/javascripts/select-kit/addon/components/user-chooser.js b/app/assets/javascripts/select-kit/addon/components/user-chooser.js index 102556ae83..6bf7257bad 100644 --- a/app/assets/javascripts/select-kit/addon/components/user-chooser.js +++ b/app/assets/javascripts/select-kit/addon/components/user-chooser.js @@ -1,9 +1,9 @@ +import userSearch, { + eagerCompleteSearch, + skipSearch, +} from "discourse/lib/user-search"; import MultiSelectComponent from "select-kit/components/multi-select"; import { computed } from "@ember/object"; -import userSearch, { - skipSearch, - eagerCompleteSearch, -} from "discourse/lib/user-search"; import { makeArray } from "discourse-common/lib/helpers"; export default MultiSelectComponent.extend({ diff --git a/app/assets/javascripts/select-kit/addon/components/user-notifications-dropdown.js b/app/assets/javascripts/select-kit/addon/components/user-notifications-dropdown.js index 04ac5944a6..b246e81777 100644 --- a/app/assets/javascripts/select-kit/addon/components/user-notifications-dropdown.js +++ b/app/assets/javascripts/select-kit/addon/components/user-notifications-dropdown.js @@ -1,8 +1,8 @@ -import I18n from "I18n"; import DropdownSelectBox from "select-kit/components/dropdown-select-box"; +import I18n from "I18n"; +import { computed } from "@ember/object"; import { popupAjaxError } from "discourse/lib/ajax-error"; import showModal from "discourse/lib/show-modal"; -import { computed } from "@ember/object"; export default DropdownSelectBox.extend({ classNames: ["user-notifications", "user-notifications-dropdown"], diff --git a/app/assets/javascripts/select-kit/addon/mixins/tags.js b/app/assets/javascripts/select-kit/addon/mixins/tags.js index 180ee41410..b9240bd3f5 100644 --- a/app/assets/javascripts/select-kit/addon/mixins/tags.js +++ b/app/assets/javascripts/select-kit/addon/mixins/tags.js @@ -1,11 +1,11 @@ -import getURL from "discourse-common/lib/get-url"; import I18n from "I18n"; -import { reads } from "@ember/object/computed"; -import { ajax } from "discourse/lib/ajax"; -import { popupAjaxError } from "discourse/lib/ajax-error"; import Mixin from "@ember/object/mixin"; -import { makeArray } from "discourse-common/lib/helpers"; +import { ajax } from "discourse/lib/ajax"; +import getURL from "discourse-common/lib/get-url"; import { isEmpty } from "@ember/utils"; +import { makeArray } from "discourse-common/lib/helpers"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import { reads } from "@ember/object/computed"; export default Mixin.create({ searchTags(url, data, callback) { diff --git a/app/assets/javascripts/wizard/components/font-preview.js b/app/assets/javascripts/wizard/components/font-preview.js index df6d9ef0e9..ef2f73f216 100644 --- a/app/assets/javascripts/wizard/components/font-preview.js +++ b/app/assets/javascripts/wizard/components/font-preview.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; -import { observes } from "discourse-common/utils/decorators"; import { + chooseDarker, createPreviewComponent, darkLightDiff, - chooseDarker, } from "wizard/lib/preview"; +import I18n from "I18n"; +import { observes } from "discourse-common/utils/decorators"; const LOREM = ` Lorem ipsum dolor sit amet, consectetur adipiscing. diff --git a/app/assets/javascripts/wizard/components/homepage-preview.js b/app/assets/javascripts/wizard/components/homepage-preview.js index 8848ebd317..0e61f60f3a 100644 --- a/app/assets/javascripts/wizard/components/homepage-preview.js +++ b/app/assets/javascripts/wizard/components/homepage-preview.js @@ -1,9 +1,9 @@ -import { observes } from "discourse-common/utils/decorators"; import { - createPreviewComponent, LOREM, + createPreviewComponent, darkLightDiff, } from "wizard/lib/preview"; +import { observes } from "discourse-common/utils/decorators"; export default createPreviewComponent(659, 320, { logo: null, diff --git a/app/assets/javascripts/wizard/components/image-preview-favicon.js b/app/assets/javascripts/wizard/components/image-preview-favicon.js index 82b0e95cee..12a47e7ed6 100644 --- a/app/assets/javascripts/wizard/components/image-preview-favicon.js +++ b/app/assets/javascripts/wizard/components/image-preview-favicon.js @@ -1,5 +1,5 @@ -import { observes } from "discourse-common/utils/decorators"; import { createPreviewComponent } from "wizard/lib/preview"; +import { observes } from "discourse-common/utils/decorators"; export default createPreviewComponent(371, 124, { tab: null, diff --git a/app/assets/javascripts/wizard/components/image-preview-large-icon.js b/app/assets/javascripts/wizard/components/image-preview-large-icon.js index 0d7c86a7d6..25ff537125 100644 --- a/app/assets/javascripts/wizard/components/image-preview-large-icon.js +++ b/app/assets/javascripts/wizard/components/image-preview-large-icon.js @@ -1,5 +1,5 @@ -import { observes } from "discourse-common/utils/decorators"; import { createPreviewComponent } from "wizard/lib/preview"; +import { observes } from "discourse-common/utils/decorators"; export default createPreviewComponent(325, 125, { ios: null, diff --git a/app/assets/javascripts/wizard/components/image-preview-logo-small.js b/app/assets/javascripts/wizard/components/image-preview-logo-small.js index ba55380d15..cc692e2aa8 100644 --- a/app/assets/javascripts/wizard/components/image-preview-logo-small.js +++ b/app/assets/javascripts/wizard/components/image-preview-logo-small.js @@ -1,5 +1,5 @@ +import { LOREM, createPreviewComponent, drawHeader } from "wizard/lib/preview"; import { observes } from "discourse-common/utils/decorators"; -import { createPreviewComponent, drawHeader, LOREM } from "wizard/lib/preview"; export default createPreviewComponent(375, 100, { image: null, diff --git a/app/assets/javascripts/wizard/components/image-preview-logo.js b/app/assets/javascripts/wizard/components/image-preview-logo.js index acad28063a..c48bfa7ba5 100644 --- a/app/assets/javascripts/wizard/components/image-preview-logo.js +++ b/app/assets/javascripts/wizard/components/image-preview-logo.js @@ -1,5 +1,5 @@ -import { observes } from "discourse-common/utils/decorators"; import { createPreviewComponent, drawHeader } from "wizard/lib/preview"; +import { observes } from "discourse-common/utils/decorators"; export default createPreviewComponent(400, 100, { image: null, diff --git a/app/assets/javascripts/wizard/components/invite-list.js b/app/assets/javascripts/wizard/components/invite-list.js index 115a25c66f..f01f708884 100644 --- a/app/assets/javascripts/wizard/components/invite-list.js +++ b/app/assets/javascripts/wizard/components/invite-list.js @@ -1,6 +1,6 @@ +import Component from "@ember/component"; import I18n from "I18n"; import { schedule } from "@ember/runloop"; -import Component from "@ember/component"; export default Component.extend({ classNames: ["invite-list"], diff --git a/app/assets/javascripts/wizard/components/radio-button.js b/app/assets/javascripts/wizard/components/radio-button.js index f1a829cfa1..af16d49236 100644 --- a/app/assets/javascripts/wizard/components/radio-button.js +++ b/app/assets/javascripts/wizard/components/radio-button.js @@ -1,6 +1,6 @@ -import { next } from "@ember/runloop"; -import Component from "@ember/component"; import { observes, on } from "discourse-common/utils/decorators"; +import Component from "@ember/component"; +import { next } from "@ember/runloop"; export default Component.extend({ tagName: "label", diff --git a/app/assets/javascripts/wizard/components/theme-preview.js b/app/assets/javascripts/wizard/components/theme-preview.js index 5e72c3ec3c..7ef561db1f 100644 --- a/app/assets/javascripts/wizard/components/theme-preview.js +++ b/app/assets/javascripts/wizard/components/theme-preview.js @@ -1,11 +1,11 @@ -import I18n from "I18n"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; import { + LOREM, + chooseDarker, createPreviewComponent, darkLightDiff, - chooseDarker, - LOREM, } from "wizard/lib/preview"; +import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import I18n from "I18n"; export default createPreviewComponent(305, 165, { logo: null, diff --git a/app/assets/javascripts/wizard/components/wizard-field-image.js b/app/assets/javascripts/wizard/components/wizard-field-image.js index 6900a2ec3e..783e203e79 100644 --- a/app/assets/javascripts/wizard/components/wizard-field-image.js +++ b/app/assets/javascripts/wizard/components/wizard-field-image.js @@ -1,10 +1,10 @@ -import I18n from "I18n"; import Component from "@ember/component"; -import getUrl from "discourse-common/lib/get-url"; -import discourseComputed from "discourse-common/utils/decorators"; -import { getToken } from "wizard/lib/ajax"; -import { getOwner } from "discourse-common/lib/get-owner"; +import I18n from "I18n"; import { dasherize } from "@ember/string"; +import discourseComputed from "discourse-common/utils/decorators"; +import { getOwner } from "discourse-common/lib/get-owner"; +import { getToken } from "wizard/lib/ajax"; +import getUrl from "discourse-common/lib/get-url"; export default Component.extend({ classNames: ["wizard-image-row"], diff --git a/app/assets/javascripts/wizard/components/wizard-field.js b/app/assets/javascripts/wizard/components/wizard-field.js index e7af4bcb62..3a39cb46d5 100644 --- a/app/assets/javascripts/wizard/components/wizard-field.js +++ b/app/assets/javascripts/wizard/components/wizard-field.js @@ -1,6 +1,6 @@ import Component from "@ember/component"; -import discourseComputed from "discourse-common/utils/decorators"; import { dasherize } from "@ember/string"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ classNameBindings: [":wizard-field", "typeClass", "field.invalid"], diff --git a/app/assets/javascripts/wizard/components/wizard-step.js b/app/assets/javascripts/wizard/components/wizard-step.js index c71141d2b0..7baf1ea42f 100644 --- a/app/assets/javascripts/wizard/components/wizard-step.js +++ b/app/assets/javascripts/wizard/components/wizard-step.js @@ -1,9 +1,9 @@ -import I18n from "I18n"; -import { schedule } from "@ember/runloop"; -import Component from "@ember/component"; -import getUrl from "discourse-common/lib/get-url"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import Component from "@ember/component"; +import I18n from "I18n"; +import getUrl from "discourse-common/lib/get-url"; import { htmlSafe } from "@ember/template"; +import { schedule } from "@ember/runloop"; jQuery.fn.wiggle = function (times, duration) { if (times > 0) { diff --git a/app/assets/javascripts/wizard/lib/ajax.js b/app/assets/javascripts/wizard/lib/ajax.js index e5c89e6bb2..ec0dd1c5cd 100644 --- a/app/assets/javascripts/wizard/lib/ajax.js +++ b/app/assets/javascripts/wizard/lib/ajax.js @@ -1,7 +1,7 @@ -import { run } from "@ember/runloop"; -import getUrl from "discourse-common/lib/get-url"; import { Promise } from "rsvp"; +import getUrl from "discourse-common/lib/get-url"; import jQuery from "jquery"; +import { run } from "@ember/runloop"; let token; diff --git a/app/assets/javascripts/wizard/lib/preview.js b/app/assets/javascripts/wizard/lib/preview.js index fd17028bee..db9553d035 100644 --- a/app/assets/javascripts/wizard/lib/preview.js +++ b/app/assets/javascripts/wizard/lib/preview.js @@ -1,8 +1,8 @@ -import { scheduleOnce } from "@ember/runloop"; import Component from "@ember/component"; +import { Promise } from "rsvp"; /*eslint no-bitwise:0 */ import getUrl from "discourse-common/lib/get-url"; -import { Promise } from "rsvp"; +import { scheduleOnce } from "@ember/runloop"; export const LOREM = ` Lorem ipsum dolor sit amet, diff --git a/app/assets/javascripts/wizard/models/step.js b/app/assets/javascripts/wizard/models/step.js index 3c84dbfa00..527789d299 100644 --- a/app/assets/javascripts/wizard/models/step.js +++ b/app/assets/javascripts/wizard/models/step.js @@ -1,7 +1,7 @@ import EmberObject from "@ember/object"; -import discourseComputed from "discourse-common/utils/decorators"; import ValidState from "wizard/mixins/valid-state"; import { ajax } from "wizard/lib/ajax"; +import discourseComputed from "discourse-common/utils/decorators"; export default EmberObject.extend(ValidState, { id: null, diff --git a/app/assets/javascripts/wizard/models/wizard.js b/app/assets/javascripts/wizard/models/wizard.js index 1d8cbdbd61..b0bb132c39 100644 --- a/app/assets/javascripts/wizard/models/wizard.js +++ b/app/assets/javascripts/wizard/models/wizard.js @@ -1,8 +1,8 @@ +import EmberObject from "@ember/object"; import Step from "wizard/models/step"; import WizardField from "wizard/models/wizard-field"; import { ajax } from "wizard/lib/ajax"; import discourseComputed from "discourse-common/utils/decorators"; -import EmberObject from "@ember/object"; const Wizard = EmberObject.extend({ @discourseComputed("steps.length") diff --git a/app/assets/javascripts/wizard/test/acceptance/wizard-test.js b/app/assets/javascripts/wizard/test/acceptance/wizard-test.js index ef8b3f0aec..4c00de2810 100644 --- a/app/assets/javascripts/wizard/test/acceptance/wizard-test.js +++ b/app/assets/javascripts/wizard/test/acceptance/wizard-test.js @@ -1,7 +1,7 @@ -import { test, module } from "qunit"; +import { currentRouteName, visit } from "@ember/test-helpers"; +import { module, test } from "qunit"; import { run } from "@ember/runloop"; import startApp from "wizard/test/helpers/start-app"; -import { visit, currentRouteName } from "@ember/test-helpers"; var wizard; module("Acceptance: wizard", { diff --git a/app/assets/javascripts/wizard/test/components/invite-list-test.js b/app/assets/javascripts/wizard/test/components/invite-list-test.js index 6489a45271..c3e988b318 100644 --- a/app/assets/javascripts/wizard/test/components/invite-list-test.js +++ b/app/assets/javascripts/wizard/test/components/invite-list-test.js @@ -1,5 +1,5 @@ -import { moduleForComponent } from "ember-qunit"; import { componentTest } from "wizard/test/helpers/component-test"; +import { moduleForComponent } from "ember-qunit"; moduleForComponent("invite-list", { integration: true }); diff --git a/app/assets/javascripts/wizard/test/helpers/start-app.js b/app/assets/javascripts/wizard/test/helpers/start-app.js index 9c6cfe898e..e49d315bb2 100644 --- a/app/assets/javascripts/wizard/test/helpers/start-app.js +++ b/app/assets/javascripts/wizard/test/helpers/start-app.js @@ -1,6 +1,6 @@ -import { run } from "@ember/runloop"; import Wizard from "wizard/wizard"; import initializer from "wizard/initializers/load-helpers"; +import { run } from "@ember/runloop"; let app; let started = false; diff --git a/app/assets/javascripts/wizard/test/models/wizard-field-test.js b/app/assets/javascripts/wizard/test/models/wizard-field-test.js index 876ffd8df9..90eda2bb14 100644 --- a/app/assets/javascripts/wizard/test/models/wizard-field-test.js +++ b/app/assets/javascripts/wizard/test/models/wizard-field-test.js @@ -1,6 +1,6 @@ +import WizardField from "wizard/models/wizard-field"; import { moduleFor } from "ember-qunit"; import { test } from "qunit"; -import WizardField from "wizard/models/wizard-field"; moduleFor("model:wizard-field"); diff --git a/plugins/discourse-details/test/javascripts/acceptance/details-button-test.js.es6 b/plugins/discourse-details/test/javascripts/acceptance/details-button-test.js.es6 index 2a72387f4b..34f0437f62 100644 --- a/plugins/discourse-details/test/javascripts/acceptance/details-button-test.js.es6 +++ b/plugins/discourse-details/test/javascripts/acceptance/details-button-test.js.es6 @@ -1,5 +1,5 @@ -import I18n from "I18n"; import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; +import I18n from "I18n"; import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer"; import selectKit from "discourse/tests/helpers/select-kit-helper"; diff --git a/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js.es6 b/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js.es6 index e304337903..581b502781 100644 --- a/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js.es6 +++ b/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js.es6 @@ -1,17 +1,17 @@ -import I18n from "I18n"; -import EmberObject from "@ember/object"; -import { isEmpty } from "@ember/utils"; -import { schedule } from "@ember/runloop"; -import Component from "@ember/component"; -import { notEmpty } from "@ember/object/computed"; -import { Promise } from "rsvp"; /* global Pikaday:true */ -import { propertyNotEqual } from "discourse/lib/computed"; -import loadScript from "discourse/lib/load-script"; import computed, { observes } from "discourse-common/utils/decorators"; +import Component from "@ember/component"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; +import { INPUT_DELAY } from "discourse-common/config/environment"; +import { Promise } from "rsvp"; import { cookAsync } from "discourse/lib/text"; import discourseDebounce from "discourse/lib/debounce"; -import { INPUT_DELAY } from "discourse-common/config/environment"; +import { isEmpty } from "@ember/utils"; +import loadScript from "discourse/lib/load-script"; +import { notEmpty } from "@ember/object/computed"; +import { propertyNotEqual } from "discourse/lib/computed"; +import { schedule } from "@ember/runloop"; export default Component.extend({ timeFormat: "HH:mm:ss", diff --git a/plugins/discourse-local-dates/assets/javascripts/initializers/discourse-local-dates.js.es6 b/plugins/discourse-local-dates/assets/javascripts/initializers/discourse-local-dates.js.es6 index 7ed2756635..c4633d1f85 100644 --- a/plugins/discourse-local-dates/assets/javascripts/initializers/discourse-local-dates.js.es6 +++ b/plugins/discourse-local-dates/assets/javascripts/initializers/discourse-local-dates.js.es6 @@ -1,6 +1,6 @@ -import { withPluginApi } from "discourse/lib/plugin-api"; -import showModal from "discourse/lib/show-modal"; import LocalDateBuilder from "../lib/local-date-builder"; +import showModal from "discourse/lib/show-modal"; +import { withPluginApi } from "discourse/lib/plugin-api"; const DATE_TEMPLATE = ` diff --git a/plugins/discourse-local-dates/assets/javascripts/lib/local-date-builder.js.es6 b/plugins/discourse-local-dates/assets/javascripts/lib/local-date-builder.js.es6 index a6771da39a..502d05b21a 100644 --- a/plugins/discourse-local-dates/assets/javascripts/lib/local-date-builder.js.es6 +++ b/plugins/discourse-local-dates/assets/javascripts/lib/local-date-builder.js.es6 @@ -1,5 +1,5 @@ -import I18n from "I18n"; import DateWithZoneHelper from "./date-with-zone-helper"; +import I18n from "I18n"; const TIME_FORMAT = "LLL"; const DATE_FORMAT = "LL"; diff --git a/plugins/discourse-local-dates/test/javascripts/lib/local-date-builder-test.js.es6 b/plugins/discourse-local-dates/test/javascripts/lib/local-date-builder-test.js.es6 index c4d62e08b4..92baa75838 100644 --- a/plugins/discourse-local-dates/test/javascripts/lib/local-date-builder-test.js.es6 +++ b/plugins/discourse-local-dates/test/javascripts/lib/local-date-builder-test.js.es6 @@ -1,6 +1,6 @@ -import sinon from "sinon"; import I18n from "I18n"; import LocalDateBuilder from "./local-date-builder"; +import sinon from "sinon"; const UTC = "Etc/UTC"; const SYDNEY = "Australia/Sydney"; diff --git a/plugins/discourse-narrative-bot/assets/javascripts/initializers/new-user-narrative.js.es6 b/plugins/discourse-narrative-bot/assets/javascripts/initializers/new-user-narrative.js.es6 index 0a89564672..3cac3b63e0 100644 --- a/plugins/discourse-narrative-bot/assets/javascripts/initializers/new-user-narrative.js.es6 +++ b/plugins/discourse-narrative-bot/assets/javascripts/initializers/new-user-narrative.js.es6 @@ -1,5 +1,5 @@ -import { withPluginApi } from "discourse/lib/plugin-api"; import { ajax } from "discourse/lib/ajax"; +import { withPluginApi } from "discourse/lib/plugin-api"; function initialize(api) { const messageBus = api.container.lookup("message-bus:main"); diff --git a/plugins/discourse-presence/assets/javascripts/discourse/components/composer-presence-display.js.es6 b/plugins/discourse-presence/assets/javascripts/discourse/components/composer-presence-display.js.es6 index 9c2703de1c..19a82d0309 100644 --- a/plugins/discourse-presence/assets/javascripts/discourse/components/composer-presence-display.js.es6 +++ b/plugins/discourse-presence/assets/javascripts/discourse/components/composer-presence-display.js.es6 @@ -1,18 +1,18 @@ -import Component from "@ember/component"; +import { + CLOSED, + COMPOSER_TYPE, + EDITING, + KEEP_ALIVE_DURATION_SECONDS, + REPLYING, +} from "discourse/plugins/discourse-presence/discourse/lib/presence"; import { cancel, throttle } from "@ember/runloop"; -import { gt, readOnly } from "@ember/object/computed"; -import { inject as service } from "@ember/service"; import discourseComputed, { observes, on, } from "discourse-common/utils/decorators"; -import { - REPLYING, - CLOSED, - EDITING, - COMPOSER_TYPE, - KEEP_ALIVE_DURATION_SECONDS, -} from "discourse/plugins/discourse-presence/discourse/lib/presence"; +import { gt, readOnly } from "@ember/object/computed"; +import Component from "@ember/component"; +import { inject as service } from "@ember/service"; export default Component.extend({ // Passed in variables diff --git a/plugins/discourse-presence/assets/javascripts/discourse/components/topic-presence-display.js.es6 b/plugins/discourse-presence/assets/javascripts/discourse/components/topic-presence-display.js.es6 index 4600eef460..169f00b438 100644 --- a/plugins/discourse-presence/assets/javascripts/discourse/components/topic-presence-display.js.es6 +++ b/plugins/discourse-presence/assets/javascripts/discourse/components/topic-presence-display.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed, { on } from "discourse-common/utils/decorators"; import Component from "@ember/component"; +import { TOPIC_TYPE } from "discourse/plugins/discourse-presence/discourse/lib/presence"; import { gt } from "@ember/object/computed"; import { inject as service } from "@ember/service"; -import discourseComputed, { on } from "discourse-common/utils/decorators"; -import { TOPIC_TYPE } from "discourse/plugins/discourse-presence/discourse/lib/presence"; export default Component.extend({ topic: null, diff --git a/plugins/discourse-presence/assets/javascripts/discourse/lib/presence.js.es6 b/plugins/discourse-presence/assets/javascripts/discourse/lib/presence.js.es6 index aa070d68ab..2146ce582a 100644 --- a/plugins/discourse-presence/assets/javascripts/discourse/lib/presence.js.es6 +++ b/plugins/discourse-presence/assets/javascripts/discourse/lib/presence.js.es6 @@ -1,5 +1,5 @@ -import EmberObject from "@ember/object"; import { cancel, later } from "@ember/runloop"; +import EmberObject from "@ember/object"; import { ajax } from "discourse/lib/ajax"; import discourseComputed from "discourse-common/utils/decorators"; diff --git a/plugins/discourse-presence/assets/javascripts/discourse/services/presence-manager.js.es6 b/plugins/discourse-presence/assets/javascripts/discourse/services/presence-manager.js.es6 index fa8cc51c23..ae24b63073 100644 --- a/plugins/discourse-presence/assets/javascripts/discourse/services/presence-manager.js.es6 +++ b/plugins/discourse-presence/assets/javascripts/discourse/services/presence-manager.js.es6 @@ -1,7 +1,7 @@ -import Service from "@ember/service"; import Presence, { CLOSED, } from "discourse/plugins/discourse-presence/discourse/lib/presence"; +import Service from "@ember/service"; const PresenceManager = Service.extend({ presences: null, diff --git a/plugins/poll/assets/javascripts/components/poll-breakdown-chart.js.es6 b/plugins/poll/assets/javascripts/components/poll-breakdown-chart.js.es6 index 96e93c3a87..be7826602d 100644 --- a/plugins/poll/assets/javascripts/components/poll-breakdown-chart.js.es6 +++ b/plugins/poll/assets/javascripts/components/poll-breakdown-chart.js.es6 @@ -1,10 +1,10 @@ -import I18n from "I18n"; import Component from "@ember/component"; -import { mapBy } from "@ember/object/computed"; -import { htmlSafe } from "@ember/template"; +import I18n from "I18n"; import { PIE_CHART_TYPE } from "discourse/plugins/poll/controllers/poll-ui-builder"; -import { getColors } from "discourse/plugins/poll/lib/chart-colors"; import discourseComputed from "discourse-common/utils/decorators"; +import { getColors } from "discourse/plugins/poll/lib/chart-colors"; +import { htmlSafe } from "@ember/template"; +import { mapBy } from "@ember/object/computed"; export default Component.extend({ // Arguments: diff --git a/plugins/poll/assets/javascripts/components/poll-breakdown-option.js.es6 b/plugins/poll/assets/javascripts/components/poll-breakdown-option.js.es6 index 0a02c79c6e..c63d9f45c1 100644 --- a/plugins/poll/assets/javascripts/components/poll-breakdown-option.js.es6 +++ b/plugins/poll/assets/javascripts/components/poll-breakdown-option.js.es6 @@ -1,11 +1,11 @@ -import I18n from "I18n"; import Component from "@ember/component"; +import I18n from "I18n"; import { action } from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; import { equal } from "@ember/object/computed"; +import { getColors } from "discourse/plugins/poll/lib/chart-colors"; import { htmlSafe } from "@ember/template"; import { propertyEqual } from "discourse/lib/computed"; -import discourseComputed from "discourse-common/utils/decorators"; -import { getColors } from "discourse/plugins/poll/lib/chart-colors"; export default Component.extend({ // Arguments: diff --git a/plugins/poll/assets/javascripts/controllers/poll-breakdown.js.es6 b/plugins/poll/assets/javascripts/controllers/poll-breakdown.js.es6 index 89effd9272..66c160f2f2 100644 --- a/plugins/poll/assets/javascripts/controllers/poll-breakdown.js.es6 +++ b/plugins/poll/assets/javascripts/controllers/poll-breakdown.js.es6 @@ -1,13 +1,13 @@ -import I18n from "I18n"; import Controller from "@ember/controller"; -import { action } from "@ember/object"; -import { classify } from "@ember/string"; -import { htmlSafe } from "@ember/template"; -import { ajax } from "discourse/lib/ajax"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import loadScript from "discourse/lib/load-script"; +import I18n from "I18n"; import ModalFunctionality from "discourse/mixins/modal-functionality"; +import { action } from "@ember/object"; +import { ajax } from "discourse/lib/ajax"; +import { classify } from "@ember/string"; import discourseComputed from "discourse-common/utils/decorators"; +import { htmlSafe } from "@ember/template"; +import loadScript from "discourse/lib/load-script"; +import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend(ModalFunctionality, { model: null, diff --git a/plugins/poll/assets/javascripts/controllers/poll-ui-builder.js.es6 b/plugins/poll/assets/javascripts/controllers/poll-ui-builder.js.es6 index 9090e92f65..2bf034e8f8 100644 --- a/plugins/poll/assets/javascripts/controllers/poll-ui-builder.js.es6 +++ b/plugins/poll/assets/javascripts/controllers/poll-ui-builder.js.es6 @@ -1,7 +1,7 @@ -import I18n from "I18n"; +import discourseComputed, { observes } from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; import EmberObject from "@ember/object"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import I18n from "I18n"; export const BAR_CHART_TYPE = "bar"; export const PIE_CHART_TYPE = "pie"; diff --git a/plugins/poll/assets/javascripts/initializers/add-poll-ui-builder.js.es6 b/plugins/poll/assets/javascripts/initializers/add-poll-ui-builder.js.es6 index d920848db9..abeb3056c6 100644 --- a/plugins/poll/assets/javascripts/initializers/add-poll-ui-builder.js.es6 +++ b/plugins/poll/assets/javascripts/initializers/add-poll-ui-builder.js.es6 @@ -1,6 +1,6 @@ -import { withPluginApi } from "discourse/lib/plugin-api"; -import showModal from "discourse/lib/show-modal"; import discourseComputed from "discourse-common/utils/decorators"; +import showModal from "discourse/lib/show-modal"; +import { withPluginApi } from "discourse/lib/plugin-api"; function initializePollUIBuilder(api) { api.modifyClass("controller:composer", { diff --git a/plugins/poll/assets/javascripts/initializers/extend-for-poll.js.es6 b/plugins/poll/assets/javascripts/initializers/extend-for-poll.js.es6 index 46ec6e86c4..6d9505704e 100644 --- a/plugins/poll/assets/javascripts/initializers/extend-for-poll.js.es6 +++ b/plugins/poll/assets/javascripts/initializers/extend-for-poll.js.es6 @@ -1,8 +1,8 @@ import EmberObject from "@ember/object"; -import { withPluginApi } from "discourse/lib/plugin-api"; import WidgetGlue from "discourse/widgets/glue"; import { getRegister } from "discourse-common/lib/get-owner"; import { observes } from "discourse-common/utils/decorators"; +import { withPluginApi } from "discourse/lib/plugin-api"; function initializePolls(api) { const register = getRegister(api); diff --git a/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 b/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 index 45f48d6922..fa98363173 100644 --- a/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 +++ b/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 @@ -1,18 +1,18 @@ import I18n from "I18n"; -import { h } from "virtual-dom"; +import { PIE_CHART_TYPE } from "discourse/plugins/poll/controllers/poll-ui-builder"; +import RawHtml from "discourse/widgets/raw-html"; import { ajax } from "discourse/lib/ajax"; +import { avatarFor } from "discourse/widgets/post"; +import { createWidget } from "discourse/widgets/widget"; +import evenRound from "discourse/plugins/poll/lib/even-round"; +import { getColors } from "discourse/plugins/poll/lib/chart-colors"; +import { h } from "virtual-dom"; +import { iconNode } from "discourse-common/lib/icon-library"; +import loadScript from "discourse/lib/load-script"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { relativeAge } from "discourse/lib/formatter"; -import loadScript from "discourse/lib/load-script"; import round from "discourse/lib/round"; import showModal from "discourse/lib/show-modal"; -import { avatarFor } from "discourse/widgets/post"; -import RawHtml from "discourse/widgets/raw-html"; -import { createWidget } from "discourse/widgets/widget"; -import { iconNode } from "discourse-common/lib/icon-library"; -import { PIE_CHART_TYPE } from "discourse/plugins/poll/controllers/poll-ui-builder"; -import { getColors } from "discourse/plugins/poll/lib/chart-colors"; -import evenRound from "discourse/plugins/poll/lib/even-round"; function optionHtml(option) { const $node = $(`${option.html}`); diff --git a/plugins/poll/test/javascripts/acceptance/poll-builder-disabled-test.js.es6 b/plugins/poll/test/javascripts/acceptance/poll-builder-disabled-test.js.es6 index e79b2f7b5c..8969cea164 100644 --- a/plugins/poll/test/javascripts/acceptance/poll-builder-disabled-test.js.es6 +++ b/plugins/poll/test/javascripts/acceptance/poll-builder-disabled-test.js.es6 @@ -1,10 +1,10 @@ import { acceptance, - updateCurrentUser, exists, + updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; -import { displayPollBuilderButton } from "discourse/plugins/poll/helpers/display-poll-builder-button"; import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer"; +import { displayPollBuilderButton } from "discourse/plugins/poll/helpers/display-poll-builder-button"; acceptance("Poll Builder - polls are disabled", function (needs) { needs.user(); diff --git a/plugins/poll/test/javascripts/acceptance/poll-builder-enabled-test.js.es6 b/plugins/poll/test/javascripts/acceptance/poll-builder-enabled-test.js.es6 index f0e517ceae..b0df0ba558 100644 --- a/plugins/poll/test/javascripts/acceptance/poll-builder-enabled-test.js.es6 +++ b/plugins/poll/test/javascripts/acceptance/poll-builder-enabled-test.js.es6 @@ -1,12 +1,12 @@ -import selectKit from "discourse/tests/helpers/select-kit-helper"; import { acceptance, - updateCurrentUser, exists, queryAll, + updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; -import { displayPollBuilderButton } from "discourse/plugins/poll/helpers/display-poll-builder-button"; import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer"; +import { displayPollBuilderButton } from "discourse/plugins/poll/helpers/display-poll-builder-button"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; acceptance("Poll Builder - polls are enabled", function (needs) { needs.user(); diff --git a/plugins/poll/test/javascripts/acceptance/poll-pie-chart-test.js.es6 b/plugins/poll/test/javascripts/acceptance/poll-pie-chart-test.js.es6 index 78f6d0bb9d..721f764a1d 100644 --- a/plugins/poll/test/javascripts/acceptance/poll-pie-chart-test.js.es6 +++ b/plugins/poll/test/javascripts/acceptance/poll-pie-chart-test.js.es6 @@ -1,4 +1,4 @@ -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; acceptance("Rendering polls with pie charts", function (needs) { needs.user(); diff --git a/plugins/poll/test/javascripts/acceptance/poll-quote-test.js.es6 b/plugins/poll/test/javascripts/acceptance/poll-quote-test.js.es6 index 113bbf9b26..45b93f47c5 100644 --- a/plugins/poll/test/javascripts/acceptance/poll-quote-test.js.es6 +++ b/plugins/poll/test/javascripts/acceptance/poll-quote-test.js.es6 @@ -1,5 +1,5 @@ +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer"; -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; acceptance("Poll quote", function (needs) { needs.user(); diff --git a/plugins/poll/test/javascripts/acceptance/polls-bar-chart-test-desktop.js.es6 b/plugins/poll/test/javascripts/acceptance/polls-bar-chart-test-desktop.js.es6 index 625ca4fda6..8bfdf21712 100644 --- a/plugins/poll/test/javascripts/acceptance/polls-bar-chart-test-desktop.js.es6 +++ b/plugins/poll/test/javascripts/acceptance/polls-bar-chart-test-desktop.js.es6 @@ -1,5 +1,5 @@ +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer"; -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; acceptance("Rendering polls with bar charts - desktop", function (needs) { needs.user(); diff --git a/plugins/poll/test/javascripts/acceptance/polls-bar-chart-test-mobile.js.es6 b/plugins/poll/test/javascripts/acceptance/polls-bar-chart-test-mobile.js.es6 index 2acce037d8..625907a40b 100644 --- a/plugins/poll/test/javascripts/acceptance/polls-bar-chart-test-mobile.js.es6 +++ b/plugins/poll/test/javascripts/acceptance/polls-bar-chart-test-mobile.js.es6 @@ -1,5 +1,5 @@ +import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer"; -import { queryAll, acceptance } from "discourse/tests/helpers/qunit-helpers"; acceptance("Rendering polls with bar charts - mobile", function (needs) { needs.user(); diff --git a/plugins/poll/test/javascripts/widgets/discourse-poll-standard-results-test.js.es6 b/plugins/poll/test/javascripts/widgets/discourse-poll-standard-results-test.js.es6 index 8c8cb8dae7..3edd1c3e59 100644 --- a/plugins/poll/test/javascripts/widgets/discourse-poll-standard-results-test.js.es6 +++ b/plugins/poll/test/javascripts/widgets/discourse-poll-standard-results-test.js.es6 @@ -1,8 +1,8 @@ -import EmberObject from "@ember/object"; import { moduleForWidget, widgetTest, } from "discourse/tests/helpers/widget-test"; +import EmberObject from "@ember/object"; import { queryAll } from "discourse/tests/helpers/qunit-helpers"; moduleForWidget("discourse-poll-standard-results"); diff --git a/plugins/poll/test/javascripts/widgets/discourse-poll-test.js.es6 b/plugins/poll/test/javascripts/widgets/discourse-poll-test.js.es6 index 3ecf17cc6a..6be48becf7 100644 --- a/plugins/poll/test/javascripts/widgets/discourse-poll-test.js.es6 +++ b/plugins/poll/test/javascripts/widgets/discourse-poll-test.js.es6 @@ -1,9 +1,9 @@ -import I18n from "I18n"; -import EmberObject from "@ember/object"; import { moduleForWidget, widgetTest, } from "discourse/tests/helpers/widget-test"; +import EmberObject from "@ember/object"; +import I18n from "I18n"; import { queryAll } from "discourse/tests/helpers/qunit-helpers"; let requests = 0; diff --git a/plugins/styleguide/assets/javascripts/discourse/routes/styleguide-show.js.es6 b/plugins/styleguide/assets/javascripts/discourse/routes/styleguide-show.js.es6 index 71ca411ddc..21e7dd6552 100644 --- a/plugins/styleguide/assets/javascripts/discourse/routes/styleguide-show.js.es6 +++ b/plugins/styleguide/assets/javascripts/discourse/routes/styleguide-show.js.es6 @@ -1,6 +1,6 @@ import { - sectionById, findNote, + sectionById, } from "discourse/plugins/styleguide/discourse/lib/styleguide"; import { createData } from "discourse/plugins/styleguide/discourse/lib/dummy-data"; From 4052f5e854412755a148d07c71b02148734ee2ca Mon Sep 17 00:00:00 2001 From: Roman Rizzi Date: Tue, 1 Dec 2020 15:40:10 -0300 Subject: [PATCH 005/393] DEV: Hide 'DEV: Sort imports alphabetically (#11382)' from blame (#11388) --- .git-blame-ignore-revs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 7e97daba6d..a01123fbe2 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -52,3 +52,6 @@ bc97c79a35d8acd283d4d8b79aa079bce9d127c6 # DEV: Tidy up imports. (#11364) 1c2358ba162eb9f9ba9095c9afe30cf51dd85e04 + +# DEV: Sort imports alphabetically (#11382) +bbe5d8d5cf1220165842985c0e2cd4c454d501cd From dee2f6b36aeed6470b1dd93787cc13199e2515eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Dec 2020 21:02:30 +0000 Subject: [PATCH 006/393] Build(deps): Bump rubocop-ast from 1.2.0 to 1.3.0 Bumps [rubocop-ast](https://github.com/rubocop-hq/rubocop-ast) from 1.2.0 to 1.3.0. - [Release notes](https://github.com/rubocop-hq/rubocop-ast/releases) - [Changelog](https://github.com/rubocop-hq/rubocop-ast/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop-hq/rubocop-ast/compare/v1.2.0...v1.3.0) Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 3b67835ec7..358d8e3dec 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -350,7 +350,7 @@ GEM rubocop-ast (>= 1.1.1) ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 2.0) - rubocop-ast (1.2.0) + rubocop-ast (1.3.0) parser (>= 2.7.1.5) rubocop-discourse (2.4.1) rubocop (>= 1.1.0) From 28032eaf38530b96c92aef3df42841aa8613a2f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Dec 2020 21:03:14 +0000 Subject: [PATCH 007/393] Build(deps): Bump rubocop from 1.4.2 to 1.5.0 Bumps [rubocop](https://github.com/rubocop-hq/rubocop) from 1.4.2 to 1.5.0. - [Release notes](https://github.com/rubocop-hq/rubocop/releases) - [Changelog](https://github.com/rubocop-hq/rubocop/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop-hq/rubocop/compare/v1.4.2...v1.5.0) Signed-off-by: dependabot[bot] --- Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 358d8e3dec..b123b96969 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -341,13 +341,13 @@ GEM json-schema (~> 2.2) railties (>= 3.1, < 7.0) rtlit (0.0.5) - rubocop (1.4.2) + rubocop (1.5.0) parallel (~> 1.10) parser (>= 2.7.1.5) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 1.8) + regexp_parser (>= 2.0) rexml - rubocop-ast (>= 1.1.1) + rubocop-ast (>= 1.2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 2.0) rubocop-ast (1.3.0) From 86feaec9bec7a634a5aac8b9ea4cea0a69bb5911 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 2 Dec 2020 12:36:41 +0530 Subject: [PATCH 008/393] FIX: URL encode tag name (#11393) Tags with emoji in the name were failing to redirect via permalink handling. This commit percent encodes the emoji name which fixes the issue. https://meta.discourse.org/t/permalinks-not-working-in-unicode-tags/171757/ --- app/models/tag.rb | 2 +- spec/models/tag_spec.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/models/tag.rb b/app/models/tag.rb index 866adf3fce..73af70faf1 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -152,7 +152,7 @@ class Tag < ActiveRecord::Base end def full_url - "#{Discourse.base_url}/tag/#{self.name}" + "#{Discourse.base_url}/tag/#{UrlHelper.encode_component(self.name)}" end def index_search diff --git a/spec/models/tag_spec.rb b/spec/models/tag_spec.rb index e31b15b807..ea30571a2c 100644 --- a/spec/models/tag_spec.rb +++ b/spec/models/tag_spec.rb @@ -202,6 +202,14 @@ describe Tag do end end + context "full_url" do + let(:tag) { Fabricate(:tag, name: "🚀") } + + it "percent encodes emojis" do + expect(tag.full_url).to eq("http://test.localhost/tag/%F0%9F%9A%80") + end + end + context "synonyms" do let(:synonym) { Fabricate(:tag, target_tag: tag) } From a78c64db351431bae1e74d03c097c25b23fa4af8 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 2 Dec 2020 18:38:26 +0530 Subject: [PATCH 009/393] FIX: on invite redemption only update pending ReviewableUser record (#11394) When the invite was being redeemed and the ReviewableUser record status for the invited user was not pending an error was being raised. This commit makes sure that we are only looking for ReviewableUser record with status pending and updates that to approved. --- app/models/invite_redeemer.rb | 2 +- spec/models/invite_redeemer_spec.rb | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/app/models/invite_redeemer.rb b/app/models/invite_redeemer.rb index 997d970711..a2d436a5e7 100644 --- a/app/models/invite_redeemer.rb +++ b/app/models/invite_redeemer.rb @@ -145,7 +145,7 @@ InviteRedeemer = Struct.new(:invite, :email, :username, :name, :password, :user_ end def approve_account_if_needed - if invited_user.present? && reviewable_user = ReviewableUser.find_by(target: invited_user) + if invited_user.present? && reviewable_user = ReviewableUser.find_by(target: invited_user, status: Reviewable.statuses[:pending]) reviewable_user.perform( invite.invited_by, :approve_user, diff --git a/spec/models/invite_redeemer_spec.rb b/spec/models/invite_redeemer_spec.rb index fd3d52cf2b..79b5fc066a 100644 --- a/spec/models/invite_redeemer_spec.rb +++ b/spec/models/invite_redeemer_spec.rb @@ -189,6 +189,28 @@ describe InviteRedeemer do expect(invite.invited_users.first).to be_present end + context "ReviewableUser" do + it "approves pending record" do + reviewable = ReviewableUser.needs_review!(target: Fabricate(:user, email: invite.email), created_by: invite.invited_by) + reviewable.status = Reviewable.statuses[:pending] + reviewable.save! + invite_redeemer.redeem + + reviewable.reload + expect(reviewable.status).to eq(Reviewable.statuses[:approved]) + end + + it "does not raise error if record is not pending" do + reviewable = ReviewableUser.needs_review!(target: Fabricate(:user, email: invite.email), created_by: invite.invited_by) + reviewable.status = Reviewable.statuses[:ignored] + reviewable.save! + invite_redeemer.redeem + + reviewable.reload + expect(reviewable.status).to eq(Reviewable.statuses[:ignored]) + end + end + context 'invite_link' do fab!(:invite_link) { Fabricate(:invite, max_redemptions_allowed: 5, expires_at: 1.month.from_now, emailed_status: Invite.emailed_status_types[:not_required]) } let(:invite_redeemer) { InviteRedeemer.new(invite: invite_link, email: 'foo@example.com') } From d627cc62335ef6c5889c294fcd2146ba7f513af9 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 2 Dec 2020 19:08:59 +0530 Subject: [PATCH 010/393] Fix typo. (#11395) --- app/models/reviewable.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/reviewable.rb b/app/models/reviewable.rb index 3fba7ef9c7..c26efaedb4 100644 --- a/app/models/reviewable.rb +++ b/app/models/reviewable.rb @@ -6,7 +6,7 @@ class Reviewable < ActiveRecord::Base class InvalidAction < StandardError def initialize(action_id, klass) @action_id, @klass = action_id, klass - super("Can't peform `#{action_id}` on #{klass.name}") + super("Can't perform `#{action_id}` on #{klass.name}") end end From 2b66a4364db5877d595eec3b5b59cda155f3bc6a Mon Sep 17 00:00:00 2001 From: Jordan Vidrine <30537603+jordanvidrine@users.noreply.github.com> Date: Wed, 2 Dec 2020 09:22:30 -0600 Subject: [PATCH 011/393] Update header_primary in shades of blue (#11391) This commit changes header_primary to a shade of blue, fixing contrast issues with some text colors in the header. --- app/models/color_scheme.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/color_scheme.rb b/app/models/color_scheme.rb index 19a88ccc58..79e38fb8bd 100644 --- a/app/models/color_scheme.rb +++ b/app/models/color_scheme.rb @@ -50,7 +50,7 @@ class ColorScheme < ActiveRecord::Base "tertiary" => '416376', "quaternary" => '5e99b9', "header_background" => '86bddb', - "header_primary" => 'ffffff', + "header_primary" => '203243', "highlight" => '86bddb', "danger" => 'bf3c3c', "success" => '70db82', From 1c870382556d255102ba72a31695915390458997 Mon Sep 17 00:00:00 2001 From: jbrw Date: Wed, 2 Dec 2020 17:21:59 -0500 Subject: [PATCH 012/393] FEATURE: Allow Category Group Moderators to edit topic titles (#11340) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * FEATURE: Allow Category Group Moderators to edit topic titles Adds category group moderators to the topic guardian’s `can_edit` method. The value of `can_edit` is returned by the topic view serializer, and this value determines whether the current user can edit the title/category/tags of the topic directly (which category group moderators could already do by editing the first post of a topic). Note that the value of `can_edit` is now always returned by the topic view serializer (ie, for both true and false values) to cover the case where a topic is moved out of a category that a category group moderator has permissions on, so that when the topic is reloaded the UI picks up that `can_edit` is now false, and thus the edit icon should no longer be displayed. * DEV: Add a comment explaining why `can_edit` is always returned --- .../topic_view_details_serializer.rb | 15 ++++++++----- lib/guardian/topic_guardian.rb | 1 + .../serializers/topic_view_serializer_spec.rb | 21 +++++++++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/app/serializers/topic_view_details_serializer.rb b/app/serializers/topic_view_details_serializer.rb index ef152591c5..9988675130 100644 --- a/app/serializers/topic_view_details_serializer.rb +++ b/app/serializers/topic_view_details_serializer.rb @@ -4,7 +4,6 @@ class TopicViewDetailsSerializer < ApplicationSerializer def self.can_attributes [:can_move_posts, - :can_edit, :can_delete, :can_recover, :can_remove_allowed_users, @@ -24,7 +23,10 @@ class TopicViewDetailsSerializer < ApplicationSerializer :can_moderate_category] end + # NOTE: `can_edit` is defined as an attribute because we explicitly want + # it returned even if it has a value of `false` attributes( + :can_edit, :notification_level, :notifications_reason_id, *can_attributes, @@ -87,6 +89,13 @@ class TopicViewDetailsSerializer < ApplicationSerializer define_method(ca) { true } end + # NOTE: A Category Group Moderator moving a topic to a different category + # may result in the 'can_edit?' result changing from `true` to `false`. + # Explictly returning a `false` value is required to update the client UI. + def can_edit + scope.can_edit?(object.topic) + end + def include_can_review_topic? scope.can_review_topic?(object.topic) end @@ -95,10 +104,6 @@ class TopicViewDetailsSerializer < ApplicationSerializer scope.can_move_posts?(object.topic) end - def include_can_edit? - scope.can_edit?(object.topic) - end - def include_can_delete? scope.can_delete?(object.topic) end diff --git a/lib/guardian/topic_guardian.rb b/lib/guardian/topic_guardian.rb index fdd13e703f..92e4c6702a 100644 --- a/lib/guardian/topic_guardian.rb +++ b/lib/guardian/topic_guardian.rb @@ -79,6 +79,7 @@ module TopicGuardian return true if is_admin? return true if is_moderator? && can_create_post?(topic) + return true if is_category_group_moderator?(topic.category) # can't edit topics in secured categories where you don't have permission to create topics # except for a tiny edge case where the topic is uncategorized and you are trying diff --git a/spec/serializers/topic_view_serializer_spec.rb b/spec/serializers/topic_view_serializer_spec.rb index 421b65ce37..b9a9d03e25 100644 --- a/spec/serializers/topic_view_serializer_spec.rb +++ b/spec/serializers/topic_view_serializer_spec.rb @@ -365,6 +365,27 @@ describe TopicViewSerializer do expect(json[:details][:can_edit_tags]).to eq(true) end end + + context "can_edit" do + fab!(:group_user) { Fabricate(:group_user) } + fab!(:category) { Fabricate(:category, reviewable_by_group: group_user.group) } + fab!(:topic) { Fabricate(:topic, category: category) } + let(:user) { group_user.user } + + before do + SiteSetting.enable_category_group_moderation = true + end + + it 'explicitly returns can_edit' do + json = serialize_topic(topic, user) + expect(json[:details][:can_edit]).to eq(true) + + topic.update!(category: nil) + + json = serialize_topic(topic, user) + expect(json[:details][:can_edit]).to eq(false) + end + end end context "published_page" do From 9c5ee4923b7b039162acdc5661da03d29688b428 Mon Sep 17 00:00:00 2001 From: Krzysztof Kotlarek Date: Thu, 3 Dec 2020 10:43:19 +1100 Subject: [PATCH 013/393] FEATURE: silently close topic (#11392) New TopicTimer to silently close topic. It will be used by discourse-solved plugin Meta: https://meta.discourse.org/t/allow-auto-close-for-solved-to-do-so-silently/169300 --- .../app/components/topic-timer-info.js | 5 +++- app/jobs/regular/toggle_topic_closed.rb | 7 +++-- app/models/topic.rb | 8 +++-- app/models/topic_timer.rb | 17 ++++++++++- app/services/topic_status_updater.rb | 11 ++++--- lib/post_creator.rb | 4 +-- spec/components/post_creator_spec.rb | 30 +++++++++++++++++++ 7 files changed, 68 insertions(+), 14 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/topic-timer-info.js b/app/assets/javascripts/discourse/app/components/topic-timer-info.js index 146ca10b2d..0a86d508a8 100644 --- a/app/assets/javascripts/discourse/app/components/topic-timer-info.js +++ b/app/assets/javascripts/discourse/app/components/topic-timer-info.js @@ -126,7 +126,10 @@ export default Component.extend({ }, _noticeKey() { - const statusType = this.statusType; + let statusType = this.statusType; + if (statusType === "silent_close") { + statusType = "close"; + } if (this.basedOnLastPost) { return `topic.status_update_notice.auto_${statusType}_based_on_last_post`; diff --git a/app/jobs/regular/toggle_topic_closed.rb b/app/jobs/regular/toggle_topic_closed.rb index d636360e94..cc10d5a9be 100644 --- a/app/jobs/regular/toggle_topic_closed.rb +++ b/app/jobs/regular/toggle_topic_closed.rb @@ -5,6 +5,7 @@ module Jobs def execute(args) topic_timer = TopicTimer.find_by(id: args[:topic_timer_id] || args[:topic_status_update_id]) state = !!args[:state] + timer_type = args[:silent] ? :silent_close : :close if topic_timer.blank? || topic_timer.execute_at > Time.zone.now return @@ -25,16 +26,16 @@ module Jobs by_user: Discourse.system_user ) else - topic.update_status('autoclosed', state, user) + topic.update_status('autoclosed', state, user, { silent: args[:silent] }) end - topic.inherit_auto_close_from_category if state == false + topic.inherit_auto_close_from_category(timer_type: timer_type) if state == false else topic_timer.destroy! topic.reload if topic_timer.based_on_last_post - topic.inherit_auto_close_from_category + topic.inherit_auto_close_from_category(timer_type: timer_type) end end end diff --git a/app/models/topic.rb b/app/models/topic.rb index 2977ed9642..7cf6886520 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -368,7 +368,7 @@ class Topic < ActiveRecord::Base self.last_post_user_id ||= user_id end - def inherit_auto_close_from_category + def inherit_auto_close_from_category(timer_type: :close) if !self.closed && !@ignore_category_auto_close && self.category && @@ -379,7 +379,7 @@ class Topic < ActiveRecord::Base duration = based_on_last_post ? self.category.auto_close_hours : nil self.set_or_create_timer( - TopicTimer.types[:close], + TopicTimer.types[timer_type], self.category.auto_close_hours, by_user: Discourse.system_user, based_on_last_post: based_on_last_post, @@ -902,6 +902,7 @@ class Topic < ActiveRecord::Base action_code: opts[:action_code], no_bump: opts[:bump].blank?, topic_id: self.id, + silent: opts[:silent], skip_validations: true, custom_fields: opts[:custom_fields], import_mode: opts[:import_mode]) @@ -1299,12 +1300,13 @@ class Topic < ActiveRecord::Base # * by_user: User who is setting the topic's status update. # * based_on_last_post: True if time should be based on timestamp of the last post. # * category_id: Category that the update will apply to. - def set_or_create_timer(status_type, time, by_user: nil, based_on_last_post: false, category_id: SiteSetting.uncategorized_category_id, duration: nil) + def set_or_create_timer(status_type, time, by_user: nil, based_on_last_post: false, category_id: SiteSetting.uncategorized_category_id, duration: nil, silent: nil) return delete_topic_timer(status_type, by_user: by_user) if time.blank? && duration.blank? public_topic_timer = !!TopicTimer.public_types[status_type] topic_timer_options = { topic: self, public_type: public_topic_timer } topic_timer_options.merge!(user: by_user) unless public_topic_timer + topic_timer_options.merge!(silent: silent) if silent topic_timer = TopicTimer.find_or_initialize_by(topic_timer_options) topic_timer.status_type = status_type diff --git a/app/models/topic_timer.rb b/app/models/topic_timer.rb index 89da22a24f..441e631aa1 100644 --- a/app/models/topic_timer.rb +++ b/app/models/topic_timer.rb @@ -50,7 +50,8 @@ class TopicTimer < ActiveRecord::Base delete: 4, reminder: 5, bump: 6, - delete_replies: 7 + delete_replies: 7, + silent_close: 8 ) end @@ -97,6 +98,10 @@ class TopicTimer < ActiveRecord::Base end alias_method :cancel_auto_open_job, :cancel_auto_close_job + def cancel_auto_silent_close_job + Jobs.cancel_scheduled_job(:toggle_topic_closed, topic_timer_id: id) + end + def cancel_auto_publish_to_category_job Jobs.cancel_scheduled_job(:publish_topic_to_category, topic_timer_id: id) end @@ -143,6 +148,16 @@ class TopicTimer < ActiveRecord::Base ) end + def schedule_auto_silent_close_job(time) + topic.update_status('closed', false, user) if topic&.closed + + Jobs.enqueue_at(time, :toggle_topic_closed, + topic_timer_id: id, + silent: true, + state: true + ) + end + def schedule_auto_publish_to_category_job(time) Jobs.enqueue_at(time, :publish_topic_to_category, topic_timer_id: id) end diff --git a/app/services/topic_status_updater.rb b/app/services/topic_status_updater.rb index 795538cbd0..b1dce64a7c 100644 --- a/app/services/topic_status_updater.rb +++ b/app/services/topic_status_updater.rb @@ -11,7 +11,7 @@ TopicStatusUpdater = Struct.new(:topic, :user) do updated = change(status, opts) if updated highest_post_number = topic.highest_post_number - create_moderator_post_for(status, opts[:message]) + create_moderator_post_for(status, opts) update_read_state_for(status, highest_post_number) end end @@ -49,6 +49,7 @@ TopicStatusUpdater = Struct.new(:topic, :user) do if @topic_status_update if status.manually_closing_topic? || status.closing_topic? topic.delete_topic_timer(TopicTimer.types[:close]) + topic.delete_topic_timer(TopicTimer.types[:silent_close]) elsif status.manually_opening_topic? || status.opening_topic? topic.delete_topic_timer(TopicTimer.types[:open]) end @@ -65,8 +66,9 @@ TopicStatusUpdater = Struct.new(:topic, :user) do result end - def create_moderator_post_for(status, message = nil) - topic.add_moderator_post(user, message || message_for(status), options_for(status)) + def create_moderator_post_for(status, opts) + message = opts[:message] + topic.add_moderator_post(user, message || message_for(status), options_for(status, opts)) topic.reload end @@ -110,9 +112,10 @@ TopicStatusUpdater = Struct.new(:topic, :user) do end end - def options_for(status) + def options_for(status, opts = {}) { bump: status.opening_topic?, post_type: Post.types[:small_action], + silent: opts[:silent], action_code: status.action_code } end diff --git a/lib/post_creator.rb b/lib/post_creator.rb index b0f066ac2b..7884c22581 100644 --- a/lib/post_creator.rb +++ b/lib/post_creator.rb @@ -36,6 +36,7 @@ class PostCreator # hidden_reason_id - Reason for hiding the post (optional) # skip_validations - Do not validate any of the content in the post # draft_key - the key of the draft we are creating (will be deleted on success) + # silent - Do not update topic stats and fields like last_post_user_id # # When replying to a topic: # topic_id - topic we're replying to @@ -506,13 +507,12 @@ class PostCreator def update_topic_stats attrs = { updated_at: Time.now } - if @post.post_type != Post.types[:whisper] + if @post.post_type != Post.types[:whisper] && !@opts[:silent] attrs[:last_posted_at] = @post.created_at attrs[:last_post_user_id] = @post.user_id attrs[:word_count] = (@topic.word_count || 0) + @post.word_count attrs[:excerpt] = @post.excerpt_for_topic if new_topic? attrs[:bumped_at] = @post.created_at unless @post.no_bump - @topic.update_columns(attrs) end @topic.update_columns(attrs) diff --git a/spec/components/post_creator_spec.rb b/spec/components/post_creator_spec.rb index bbd35d4c24..310ba1aea7 100644 --- a/spec/components/post_creator_spec.rb +++ b/spec/components/post_creator_spec.rb @@ -581,6 +581,36 @@ describe PostCreator do end end + context 'silent' do + fab!(:topic) { Fabricate(:topic, user: user) } + + it 'silent do not mess up the public view' do + freeze_time DateTime.parse('2010-01-01 12:00') + + first = PostCreator.new( + user, + topic_id: topic.id, + raw: 'this is the first post' + ).create + + freeze_time 1.year.from_now + + PostCreator.new(user, + topic_id: topic.id, + reply_to_post_number: 1, + silent: true, + post_type: Post.types[:regular], + raw: 'this is a whispered reply').create + + topic.reload + + # silent post should not muck up that number + expect(topic.last_posted_at).to eq_time(first.created_at) + expect(topic.last_post_user_id).to eq(first.user_id) + expect(topic.word_count).to eq(5) + end + end + context 'uniqueness' do fab!(:topic) { Fabricate(:topic, user: user) } From 889d52e2af78f067c8b6b4364445f296b21dd618 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Dec 2020 03:09:37 +0100 Subject: [PATCH 014/393] Build(deps): Bump rubocop from 1.5.0 to 1.5.1 (#11396) Bumps [rubocop](https://github.com/rubocop-hq/rubocop) from 1.5.0 to 1.5.1. - [Release notes](https://github.com/rubocop-hq/rubocop/releases) - [Changelog](https://github.com/rubocop-hq/rubocop/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop-hq/rubocop/compare/v1.5.0...v1.5.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index b123b96969..ebf903c2e8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -341,7 +341,7 @@ GEM json-schema (~> 2.2) railties (>= 3.1, < 7.0) rtlit (0.0.5) - rubocop (1.5.0) + rubocop (1.5.1) parallel (~> 1.10) parser (>= 2.7.1.5) rainbow (>= 2.2.2, < 4.0) From d0e2a00e010ed94e510a2b030b6f2ab4af7ecc76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Dec 2020 03:10:11 +0100 Subject: [PATCH 015/393] Build(deps): Bump memory_profiler from 0.9.14 to 1.0.0 (#11397) Bumps [memory_profiler](https://github.com/SamSaffron/memory_profiler) from 0.9.14 to 1.0.0. - [Release notes](https://github.com/SamSaffron/memory_profiler/releases) - [Changelog](https://github.com/SamSaffron/memory_profiler/blob/master/CHANGELOG.md) - [Commits](https://github.com/SamSaffron/memory_profiler/compare/v0.9.14...v1.0.0) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index ebf903c2e8..a74e323649 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -180,7 +180,7 @@ GEM mail (2.7.1) mini_mime (>= 0.1.1) maxminddb (0.1.22) - memory_profiler (0.9.14) + memory_profiler (1.0.0) message_bus (3.3.4) rack (>= 1.1.3) method_source (1.0.0) From e773e21f0ac7188dc052cc01d8d8da4acb962052 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Dec 2020 03:11:09 +0100 Subject: [PATCH 016/393] Build(deps): Bump rubocop-rspec from 2.0.0 to 2.0.1 (#11398) Bumps [rubocop-rspec](https://github.com/rubocop-hq/rubocop-rspec) from 2.0.0 to 2.0.1. - [Release notes](https://github.com/rubocop-hq/rubocop-rspec/releases) - [Changelog](https://github.com/rubocop-hq/rubocop-rspec/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop-hq/rubocop-rspec/compare/v2.0.0...v2.0.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index a74e323649..ec9fa250aa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -355,7 +355,7 @@ GEM rubocop-discourse (2.4.1) rubocop (>= 1.1.0) rubocop-rspec (>= 2.0.0) - rubocop-rspec (2.0.0) + rubocop-rspec (2.0.1) rubocop (~> 1.0) rubocop-ast (>= 1.1.0) ruby-prof (1.4.2) From 9fb36290e302b6298e0cbd5752def0045219095d Mon Sep 17 00:00:00 2001 From: Roman Rizzi Date: Thu, 3 Dec 2020 11:07:57 -0300 Subject: [PATCH 017/393] FEATURE: Non-staff users can use shared drafts. (#11329) You can let non-staff users use shared drafts by modifying the `shared_drafts_min_trust_level` site setting. These users must have access to the shared draft category. --- config/locales/client.en.yml | 2 +- config/locales/server.en.yml | 1 + config/site_settings.yml | 3 + lib/guardian/post_guardian.rb | 8 ++ lib/guardian/topic_guardian.rb | 19 +++- .../guardian/topic_guardian_spec.rb | 86 +++++++++++++++++++ .../components/guardian/user_guardian_spec.rb | 27 ++++++ 7 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 spec/components/guardian/topic_guardian_spec.rb diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index ee3e7ac12a..7a81c06984 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1964,7 +1964,7 @@ en: label: "New Topic" shared_draft: label: "Shared Draft" - desc: "Draft a topic that will only be visible to staff" + desc: "Draft a topic that will only be visible to allowed users" toggle_topic_bump: label: "Toggle topic bump" desc: "Reply without changing latest reply date" diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 1321f005b0..877d4f37fc 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -2252,6 +2252,7 @@ en: city_for_disputes: "City for Disputes" shared_drafts_category: "Enable the Shared Drafts feature by designating a category for topic drafts. Topics in this category will be suppressed from topic lists for staff users." + shared_drafts_min_trust_level: "Allow users to see and edit Shared Drafts." push_notifications_prompt: "Display user consent prompt." push_notifications_icon: "The badge icon that appears in the notification corner. A 96×96 monochromatic PNG with transparency is recommended." diff --git a/config/site_settings.yml b/config/site_settings.yml index 4bea11f1b5..fa35652b88 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -772,6 +772,9 @@ posting: shared_drafts_category: type: category default: "" + shared_drafts_min_trust_level: + default: "staff" + enum: "TrustLevelAndStaffSetting" post_edit_time_limit: default: 1440 max: 10080 diff --git a/lib/guardian/post_guardian.rb b/lib/guardian/post_guardian.rb index e6e9041013..4bbd2ac3e8 100644 --- a/lib/guardian/post_guardian.rb +++ b/lib/guardian/post_guardian.rb @@ -139,6 +139,14 @@ module PostGuardian return false end + return true if ( + can_see_post?(post) && + can_create_post?(post.topic) && + post.topic.category_id == SiteSetting.shared_drafts_category.to_i && + can_see_category?(post.topic.category) && + can_create_shared_draft? + ) + if post.wiki && (@user.trust_level >= SiteSetting.min_trust_to_edit_wiki_post.to_i) return can_create_post?(post.topic) end diff --git a/lib/guardian/topic_guardian.rb b/lib/guardian/topic_guardian.rb index 92e4c6702a..74a0295850 100644 --- a/lib/guardian/topic_guardian.rb +++ b/lib/guardian/topic_guardian.rb @@ -22,7 +22,12 @@ module TopicGuardian alias :can_moderate_topic? :can_review_topic? def can_create_shared_draft? - is_staff? && SiteSetting.shared_drafts_enabled? + return false unless SiteSetting.shared_drafts_enabled? + + return is_admin? if SiteSetting.shared_drafts_min_trust_level.to_s == 'admin' + return is_staff? if SiteSetting.shared_drafts_min_trust_level.to_s == 'staff' + + @user.has_trust_level?(SiteSetting.shared_drafts_min_trust_level.to_i) end def can_create_whisper? @@ -34,7 +39,7 @@ module TopicGuardian end def can_publish_topic?(topic, category) - is_staff? && can_see?(topic) && can_create_topic?(category) + can_create_shared_draft? && can_see?(topic) && can_create_topic_on_category?(category) end # Creating Methods @@ -91,6 +96,16 @@ module TopicGuardian return false if !can_create_topic_on_category?(topic.category) end + # Editing a shared draft. + return true if ( + !topic.archived && + !topic.private_message? && + topic.category_id == SiteSetting.shared_drafts_category.to_i && + can_see_category?(topic.category) && + can_create_shared_draft? && + can_create_post?(topic) + ) + # TL4 users can edit archived topics, but can not edit private messages return true if ( SiteSetting.trusted_users_can_edit_others? && diff --git a/spec/components/guardian/topic_guardian_spec.rb b/spec/components/guardian/topic_guardian_spec.rb new file mode 100644 index 0000000000..60bc247291 --- /dev/null +++ b/spec/components/guardian/topic_guardian_spec.rb @@ -0,0 +1,86 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe TopicGuardian do + fab!(:admin) { Fabricate(:admin) } + fab!(:tl3_user) { Fabricate(:leader) } + fab!(:moderator) { Fabricate(:moderator) } + fab!(:category) { Fabricate(:category) } + + describe '#can_create_shared_draft?' do + it 'when shared_drafts are disabled' do + SiteSetting.shared_drafts_min_trust_level = 'admin' + + expect(Guardian.new(admin).can_create_shared_draft?).to eq(false) + end + + it 'when user is a moderator and access is set to admin' do + SiteSetting.shared_drafts_category = category.id + SiteSetting.shared_drafts_min_trust_level = 'admin' + + expect(Guardian.new(moderator).can_create_shared_draft?).to eq(false) + end + + it 'when user is a moderator and access is set to staff' do + SiteSetting.shared_drafts_category = category.id + SiteSetting.shared_drafts_min_trust_level = 'staff' + + expect(Guardian.new(moderator).can_create_shared_draft?).to eq(true) + end + + it 'when user is TL3 and access is set to TL2' do + SiteSetting.shared_drafts_category = category.id + SiteSetting.shared_drafts_min_trust_level = '2' + + expect(Guardian.new(tl3_user).can_create_shared_draft?).to eq(true) + end + end + + describe '#can_edit_topic?' do + context 'when the topic is a shared draft' do + let(:tl2_user) { Fabricate(:user, trust_level: TrustLevel[2]) } + + before do + SiteSetting.shared_drafts_category = category.id + SiteSetting.shared_drafts_min_trust_level = '2' + end + + it 'returns false if the topic is a PM' do + pm_with_draft = Fabricate(:private_message_topic, category: category) + Fabricate(:shared_draft, topic: pm_with_draft) + + expect(Guardian.new(tl2_user).can_edit_topic?(pm_with_draft)).to eq(false) + end + + it 'returns false if the topic is archived' do + archived_topic = Fabricate(:topic, archived: true, category: category) + Fabricate(:shared_draft, topic: archived_topic) + + expect(Guardian.new(tl2_user).can_edit_topic?(archived_topic)).to eq(false) + end + + it 'returns true if a shared draft exists' do + topic = Fabricate(:topic, category: category) + Fabricate(:shared_draft, topic: topic) + + expect(Guardian.new(tl2_user).can_edit_topic?(topic)).to eq(true) + end + + it 'returns false if the user has a lower trust level' do + tl1_user = Fabricate(:user, trust_level: TrustLevel[1]) + topic = Fabricate(:topic, category: category) + Fabricate(:shared_draft, topic: topic) + + expect(Guardian.new(tl1_user).can_edit_topic?(topic)).to eq(false) + end + + it 'returns true if the shared_draft is from a different category' do + topic = Fabricate(:topic, category: Fabricate(:category)) + Fabricate(:shared_draft, topic: topic) + + expect(Guardian.new(tl2_user).can_edit_topic?(topic)).to eq(false) + end + end + end +end diff --git a/spec/components/guardian/user_guardian_spec.rb b/spec/components/guardian/user_guardian_spec.rb index fc516cf70d..9d289d3216 100644 --- a/spec/components/guardian/user_guardian_spec.rb +++ b/spec/components/guardian/user_guardian_spec.rb @@ -456,4 +456,31 @@ describe UserGuardian do end end + describe '#can_edit_post?' do + fab!(:category) { Fabricate(:category) } + + let(:topic) { Fabricate(:topic, category: category) } + let(:post_with_draft) { Fabricate(:post, topic: topic) } + + before do + SiteSetting.shared_drafts_category = category.id + SiteSetting.shared_drafts_min_trust_level = '2' + Fabricate(:shared_draft, topic: topic) + end + + it 'returns true if a shared draft exists' do + expect(Guardian.new(trust_level_2).can_edit_post?(post_with_draft)).to eq(true) + end + + it 'returns false if the user has a lower trust level' do + expect(Guardian.new(trust_level_1).can_edit_post?(post_with_draft)).to eq(false) + end + + it 'returns false if the draft is from a different category' do + topic.update!(category: Fabricate(:category)) + + expect(Guardian.new(trust_level_2).can_edit_post?(post_with_draft)).to eq(false) + end + + end end From acbc47ef36870ac9af0ba7e66f17fa895715344f Mon Sep 17 00:00:00 2001 From: Mark VanLandingham Date: Thu, 3 Dec 2020 10:25:42 -0600 Subject: [PATCH 018/393] FIX: Load .js files from plugins in qunit testing env (#11304) --- app/assets/javascripts/admin.js.erb | 4 ++-- app/assets/javascripts/discourse/tests/plugin_tests.js.erb | 4 ++-- lib/discourse_plugin_registry.rb | 4 ++-- lib/plugin/instance.rb | 2 ++ 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/admin.js.erb b/app/assets/javascripts/admin.js.erb index 41f0315deb..dda5756177 100644 --- a/app/assets/javascripts/admin.js.erb +++ b/app/assets/javascripts/admin.js.erb @@ -3,10 +3,10 @@ require_asset("main_include_admin.js") DiscoursePluginRegistry.admin_javascripts.each { |js| require_asset(js) } -DiscoursePluginRegistry.each_globbed_asset(admin: true) do |f, ext| +DiscoursePluginRegistry.each_globbed_asset(admin: true) do |f| if File.directory?(f) depend_on(f) - elsif f.to_s.end_with?(".#{ext}") + else require_asset(f) end end diff --git a/app/assets/javascripts/discourse/tests/plugin_tests.js.erb b/app/assets/javascripts/discourse/tests/plugin_tests.js.erb index 5709a19399..0bb267961d 100644 --- a/app/assets/javascripts/discourse/tests/plugin_tests.js.erb +++ b/app/assets/javascripts/discourse/tests/plugin_tests.js.erb @@ -1,10 +1,10 @@ <% DiscoursePluginRegistry.javascripts.each { |js| require_asset(js) } DiscoursePluginRegistry.handlebars.each { |hb| require_asset(hb) } - DiscoursePluginRegistry.each_globbed_asset do |f, ext| + DiscoursePluginRegistry.each_globbed_asset do |f| if File.directory?(f) depend_on(f) - elsif f.to_s.end_with?(".#{ext}") + else require_asset(f) end end diff --git a/lib/discourse_plugin_registry.rb b/lib/discourse_plugin_registry.rb index 39e00ca3a6..890165a315 100644 --- a/lib/discourse_plugin_registry.rb +++ b/lib/discourse_plugin_registry.rb @@ -131,8 +131,8 @@ class DiscoursePluginRegistry next if each_options[:admin] end - Dir.glob("#{root}/**/*") do |f| - yield f, ext + Dir.glob("#{root}/**/*.#{ext}") do |f| + yield f end end end diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb index 3471c38505..f449a19593 100644 --- a/lib/plugin/instance.rb +++ b/lib/plugin/instance.rb @@ -588,11 +588,13 @@ class Plugin::Instance # Automatically include all ES6 JS and hbs files root_path = "#{root_dir_name}/assets/javascripts" + DiscoursePluginRegistry.register_glob(root_path, 'js') if transpile_js DiscoursePluginRegistry.register_glob(root_path, 'js.es6') DiscoursePluginRegistry.register_glob(root_path, 'hbs') DiscoursePluginRegistry.register_glob(root_path, 'hbr') admin_path = "#{root_dir_name}/admin/assets/javascripts" + DiscoursePluginRegistry.register_glob(admin_path, 'js', admin: true) if transpile_js DiscoursePluginRegistry.register_glob(admin_path, 'js.es6', admin: true) DiscoursePluginRegistry.register_glob(admin_path, 'hbs', admin: true) DiscoursePluginRegistry.register_glob(admin_path, 'hbr', admin: true) From bcbe2de64606319a518a6322e1a795686a0fd87f Mon Sep 17 00:00:00 2001 From: Gerhard Schlager Date: Thu, 3 Dec 2020 22:27:55 +0100 Subject: [PATCH 019/393] DEV: Make it easier to customize omniauth login complete handler in plugins (#11403) It also removes the unused `provider` variable and stops Discourse from redirecting to /login after a login. --- .../users/omniauth_callbacks_controller.rb | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/app/controllers/users/omniauth_callbacks_controller.rb b/app/controllers/users/omniauth_callbacks_controller.rb index c4b99bb441..513ae6f012 100644 --- a/app/controllers/users/omniauth_callbacks_controller.rb +++ b/app/controllers/users/omniauth_callbacks_controller.rb @@ -26,7 +26,6 @@ class Users::OmniauthCallbacksController < ApplicationController auth[:session] = session authenticator = self.class.find_authenticator(params[:provider]) - provider = DiscoursePluginRegistry.auth_providers.find { |p| p.name == params[:provider] } if session.delete(:auth_reconnect) && authenticator.can_connect_existing_user? && current_user # Save to redis, with a secret token, then redirect to confirmation screen @@ -54,9 +53,7 @@ class Users::OmniauthCallbacksController < ApplicationController rescue URI::Error end - if parsed && # Valid - (parsed.host == nil || parsed.host == Discourse.current_hostname) && # Local - !parsed.path.starts_with?("#{Discourse.base_path}/auth/") # Not /auth URL + if valid_origin?(parsed) @origin = +"#{parsed.path}" @origin << "?#{parsed.query}" if parsed.query end @@ -83,6 +80,14 @@ class Users::OmniauthCallbacksController < ApplicationController redirect_to @origin end + def valid_origin?(uri) + return false if uri.nil? + return false if uri.host.present? && uri.host != Discourse.current_hostname + return false if uri.path.start_with?("#{Discourse.base_path}/auth/") + return false if uri.path.start_with?("#{Discourse.base_path}/login") + true + end + def failure error_key = params[:message].to_s.gsub(/[^\w-]/, "") || "generic" flash[:error] = I18n.t("login.omniauth_error.#{error_key}", default: I18n.t("login.omniauth_error.generic")) @@ -106,13 +111,17 @@ class Users::OmniauthCallbacksController < ApplicationController def complete_response_data if @auth_result.user user_found(@auth_result.user) - elsif SiteSetting.invite_only? + elsif invite_required? @auth_result.requires_invite = true else session[:authentication] = @auth_result.session_data end end + def invite_required? + SiteSetting.invite_only? + end + def user_found(user) if user.has_any_second_factor_methods_enabled? @auth_result.omniauth_disallow_totp = true From e4d51e5b0aa072da1460c33b4ebe657ac7225954 Mon Sep 17 00:00:00 2001 From: Krzysztof Kotlarek Date: Fri, 4 Dec 2020 08:43:42 +1100 Subject: [PATCH 020/393] FIX: correct link in the notification about moved post (#11399) Notification is created by a job. If the job is evaluated before changes are committed to a database, a notification will have an incorrect URL. Therefore, the job should be lodged in enqueue_jobs method which is triggered after the transaction: ```ruby Topic.transaction do move_posts_to topic end add_allowed_users(participants) if participants.present? && @move_to_pm enqueue_jobs(topic) ``` I improved a little bit specs to ensure that the destination topic_id is set. However, that tests are passing even without code improvements. I couldn't find an easy way to "delay" database transaction. Meta: https://meta.discourse.org/t/bug-with-notifications-for-moved-posts/168937 --- app/models/post_mover.rb | 21 +++++++-------------- spec/models/post_mover_spec.rb | 5 ++++- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/app/models/post_mover.rb b/app/models/post_mover.rb index 184fd3b9ee..5ac0a416a5 100644 --- a/app/models/post_mover.rb +++ b/app/models/post_mover.rb @@ -71,7 +71,7 @@ class PostMover create_temp_table delete_invalid_post_timings move_each_post - notify_users_that_posts_have_moved + create_moderator_post_in_original_topic update_statistics update_user_actions update_last_post_stats @@ -438,19 +438,6 @@ class PostMover UserAction.synchronize_target_topic_ids(posts.map(&:id)) end - def notify_users_that_posts_have_moved - enqueue_notification_job - create_moderator_post_in_original_topic - end - - def enqueue_notification_job - Jobs.enqueue( - :notify_moved_posts, - post_ids: post_ids, - moved_by_id: user.id - ) - end - def create_moderator_post_in_original_topic move_type_str = PostMover.move_types[@move_type].to_s move_type_str.sub!("topic", "message") if @move_to_pm @@ -538,6 +525,12 @@ class PostMover def enqueue_jobs(topic) @post_creator.enqueue_jobs if @post_creator + Jobs.enqueue( + :notify_moved_posts, + post_ids: post_ids, + moved_by_id: user.id + ) + Jobs.enqueue( :delete_inaccessible_notifications, topic_id: topic.id diff --git a/spec/models/post_mover_spec.rb b/spec/models/post_mover_spec.rb index aebfefe12d..018c850a3e 100644 --- a/spec/models/post_mover_spec.rb +++ b/spec/models/post_mover_spec.rb @@ -75,6 +75,7 @@ describe PostMover do notification = p2.user.notifications.where(notification_type: Notification.types[:moved_post]).first expect(notification.topic_id).to eq(p2.topic_id) + expect(notification.topic_id).not_to eq(old_topic_id) expect(notification.post_number).to eq(1) # no message for person who made the move @@ -84,6 +85,7 @@ describe PostMover do notification = p6.user.notifications.where(notification_type: Notification.types[:moved_post]).first expect(notification.topic_id).to eq(p2.topic_id) + expect(notification.topic_id).not_to eq(old_topic_id) # this is the 3rd post we moved expect(notification.post_number).to eq(3) @@ -541,7 +543,7 @@ describe PostMover do # Should notify correctly notification = p2.user.notifications.where(notification_type: Notification.types[:moved_post]).first - expect(notification.topic_id).to eq(p2.topic_id) + expect(notification.topic_id).to eq(destination_topic.id) expect(notification.post_number).to eq(p2.post_number) # Should update last reads @@ -1145,6 +1147,7 @@ describe PostMover do notification = p2.user.notifications.where(notification_type: Notification.types[:moved_post]).first expect(notification.topic_id).to eq(p2.topic_id) + expect(notification.topic_id).not_to eq(old_message_id) expect(notification.post_number).to eq(1) # no message for person who made the move From da9b837da090f1b0e2a960d461a5a79788b301ed Mon Sep 17 00:00:00 2001 From: jbrw Date: Thu, 3 Dec 2020 17:16:01 -0500 Subject: [PATCH 021/393] DEV: More robust processing of URLs (#11361) * DEV: More robust processing of URLs The previous `UrlHelper.encode_component(CGI.unescapeHTML(UrlHelper.unencode(uri))` method would naively process URLs, which could result in a badly formed response. `Addressable::URI.normalized_encode(uri)` appears to deal with these edge-cases in a more robust way. * DEV: onebox should use UrlHelper * DEV: fix spec * DEV: Escape output when rendering local links --- lib/oneboxer.rb | 4 ++-- lib/url_helper.rb | 4 +--- spec/components/final_destination_spec.rb | 2 +- spec/components/url_helper_spec.rb | 7 ++++++- spec/models/topic_embed_spec.rb | 4 ++-- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/oneboxer.rb b/lib/oneboxer.rb index a9bdabdddf..3bf526a57f 100644 --- a/lib/oneboxer.rb +++ b/lib/oneboxer.rb @@ -170,7 +170,7 @@ module Oneboxer end def self.onebox_raw(url, opts = {}) - url = URI(url).to_s + url = UrlHelper.escape_uri(url).to_s local_onebox(url, opts) || external_onebox(url) rescue => e # no point warning here, just cause we have an issue oneboxing a url @@ -191,7 +191,7 @@ module Oneboxer when "list" then local_category_html(url, route) end - html = html.presence || "#{url}" + html = html.presence || "#{URI(url).to_s}" { onebox: html, preview: html } end diff --git a/lib/url_helper.rb b/lib/url_helper.rb index 4b2ad9106c..885c6ee767 100644 --- a/lib/url_helper.rb +++ b/lib/url_helper.rb @@ -60,11 +60,9 @@ class UrlHelper self.absolute(Upload.secure_media_url_from_upload_url(url), nil) end - # Prevents double URL encode - # https://stackoverflow.com/a/37599235 def self.escape_uri(uri) return uri if s3_presigned_url?(uri) - UrlHelper.encode_component(CGI.unescapeHTML(UrlHelper.unencode(uri))) + Addressable::URI.normalized_encode(uri) end def self.rails_route_from_url(url) diff --git a/spec/components/final_destination_spec.rb b/spec/components/final_destination_spec.rb index ff61289e8a..585ca61097 100644 --- a/spec/components/final_destination_spec.rb +++ b/spec/components/final_destination_spec.rb @@ -463,7 +463,7 @@ describe FinalDestination do expect(fd(fragment_url).escape_url.to_s).to eq(fragment_url) expect(fd("https://eviltrout.com?s=180&d=mm&r=g").escape_url.to_s) - .to eq("https://eviltrout.com?s=180&d=mm&r=g") + .to eq("https://eviltrout.com?s=180&d=mm&%23038;r=g") expect(fd("http://example.com/?a=\11\15").escape_url.to_s).to eq("http://example.com/?a=%09%0D") diff --git a/spec/components/url_helper_spec.rb b/spec/components/url_helper_spec.rb index 8328cec9b9..0d8afc9598 100644 --- a/spec/components/url_helper_spec.rb +++ b/spec/components/url_helper_spec.rb @@ -114,11 +114,16 @@ describe UrlHelper do expect(url).to eq('http://example.com/%D9%85%D8%A7%D9%87%DB%8C') end - it "doesn't escape already escaped chars" do + it "doesn't escape already escaped chars (space)" do url = UrlHelper.escape_uri('http://example.com/foo%20bar/foo bar/') expect(url).to eq('http://example.com/foo%20bar/foo%20bar/') end + it "doesn't escape already escaped chars (hash)" do + url = UrlHelper.escape_uri('https://calendar.google.com/calendar/embed?src=en.uk%23holiday%40group.v.calendar.google.com&ctz=Europe%2FLondon') + expect(url).to eq('https://calendar.google.com/calendar/embed?src=en.uk%23holiday@group.v.calendar.google.com&ctz=Europe/London') + end + it "doesn't escape S3 presigned URLs" do # both of these were originally real presigned URLs and have had all # sensitive information stripped diff --git a/spec/models/topic_embed_spec.rb b/spec/models/topic_embed_spec.rb index d3dc1567b1..9cf293a9c8 100644 --- a/spec/models/topic_embed_spec.rb +++ b/spec/models/topic_embed_spec.rb @@ -349,9 +349,9 @@ describe TopicEmbed do let(:invalid_url) { 'http://source.com/#double#anchor' } let(:contents) { "hello world new post hello" } - it "does not attempt absolutizing on a bad URI" do + it "handles badly formed URIs" do raw = TopicEmbed.absolutize_urls(invalid_url, contents) - expect(raw).to eq(contents) + expect(raw).to eq("hello world new post hello") end end From 1960fc533323e9e43a609247a997c0e4a8bb8cc4 Mon Sep 17 00:00:00 2001 From: Gerhard Schlager Date: Fri, 4 Dec 2020 00:05:43 +0100 Subject: [PATCH 022/393] FIX: Stop using duplicate composer button ID (#11404) "quote" is used by the button added in `composer-editor`. https://github.com/discourse/discourse/blob/bbe5d8d5cf1220165842985c0e2cd4c454d501cd/app/assets/javascripts/discourse/app/components/composer-editor.js#L875-L882 --- .../javascripts/discourse/app/components/d-editor.js | 2 +- .../tests/integration/components/d-editor-test.js | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/d-editor.js b/app/assets/javascripts/discourse/app/components/d-editor.js index 976acf965f..9fd17ad9de 100644 --- a/app/assets/javascripts/discourse/app/components/d-editor.js +++ b/app/assets/javascripts/discourse/app/components/d-editor.js @@ -104,7 +104,7 @@ class Toolbar { } this.addButton({ - id: "quote", + id: "blockquote", group: "insertions", icon: "quote-right", shortcut: "Shift+9", diff --git a/app/assets/javascripts/discourse/tests/integration/components/d-editor-test.js b/app/assets/javascripts/discourse/tests/integration/components/d-editor-test.js index aa11d74479..cf87c4ef46 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/d-editor-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/d-editor-test.js @@ -459,13 +459,13 @@ third line` textarea.selectionStart = 0; - await click("button.quote"); + await click("button.blockquote"); assert.equal(this.value, "> one\n> \n> two\n> \n> three"); assert.equal(textarea.selectionStart, 0); assert.equal(textarea.selectionEnd, 25); - await click("button.quote"); + await click("button.blockquote"); assert.equal(this.value, "one\n\ntwo\n\nthree"); }, }); @@ -481,7 +481,7 @@ third line` textarea.selectionStart = 6; textarea.selectionEnd = 10; - await click("button.quote"); + await click("button.blockquote"); assert.equal(this.value, "one\n\n\n> \n> two"); }, }); @@ -490,12 +490,12 @@ third line` textarea.selectionStart = 6; textarea.selectionEnd = 9; - await click("button.quote"); + await click("button.blockquote"); assert.equal(this.value, "hello\n\n> wor\n\nld."); assert.equal(textarea.selectionStart, 7); assert.equal(textarea.selectionEnd, 12); - await click("button.quote"); + await click("button.blockquote"); assert.equal(this.value, "hello\n\nwor\n\nld."); assert.equal(textarea.selectionStart, 7); @@ -504,7 +504,7 @@ third line` textarea.selectionStart = 15; textarea.selectionEnd = 15; - await click("button.quote"); + await click("button.blockquote"); assert.equal(this.value, "hello\n\nwor\n\nld.\n\n> Blockquote"); }); From 477538bf2dde226747cfa9de85006bbab1930f63 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 4 Dec 2020 09:41:17 +0000 Subject: [PATCH 023/393] DEV: setproctitle on demon processes (#11402) This makes it easier to identify processes in `ps` output --- lib/demon/base.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/demon/base.rb b/lib/demon/base.rb index fc752a4464..008a17d07c 100644 --- a/lib/demon/base.rb +++ b/lib/demon/base.rb @@ -146,6 +146,7 @@ class Demon::Base return end + Process.setproctitle("discourse #{self.class.prefix}") monitor_parent establish_app after_fork From 4d9686c4944c3c2f441fc799042185e808823a96 Mon Sep 17 00:00:00 2001 From: Roman Rizzi Date: Fri, 4 Dec 2020 14:09:05 -0300 Subject: [PATCH 024/393] FEATURE: Reviewed by filter. (#11405) New reviewable filter to only display reviewables handled by a specific user. --- .../discourse/app/controllers/review-index.js | 3 +++ .../discourse/app/routes/review-index.js | 1 + .../discourse/app/templates/review-index.hbs | 11 +++++++++++ app/controllers/reviewables_controller.rb | 2 +- app/models/reviewable.rb | 16 ++++++++++++++++ config/locales/client.en.yml | 1 + spec/models/reviewable_spec.rb | 12 ++++++++++++ 7 files changed, 45 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/app/controllers/review-index.js b/app/assets/javascripts/discourse/app/controllers/review-index.js index 7ea2523e87..e1e003870d 100644 --- a/app/assets/javascripts/discourse/app/controllers/review-index.js +++ b/app/assets/javascripts/discourse/app/controllers/review-index.js @@ -11,6 +11,7 @@ export default Controller.extend({ "category_id", "topic_id", "username", + "reviewed_by", "from_date", "to_date", "sort_order", @@ -24,6 +25,7 @@ export default Controller.extend({ topic_id: null, filtersExpanded: false, username: "", + reviewed_by: "", from_date: null, to_date: null, sort_order: null, @@ -147,6 +149,7 @@ export default Controller.extend({ status: this.filterStatus, category_id: this.filterCategoryId, username: this.filterUsername, + reviewed_by: this.filterReviewedBy, from_date: isPresent(this.filterFromDate) ? this.filterFromDate.toISOString(true).split("T")[0] : null, diff --git a/app/assets/javascripts/discourse/app/routes/review-index.js b/app/assets/javascripts/discourse/app/routes/review-index.js index 13d10724f2..b4d15e68e1 100644 --- a/app/assets/javascripts/discourse/app/routes/review-index.js +++ b/app/assets/javascripts/discourse/app/routes/review-index.js @@ -32,6 +32,7 @@ export default DiscourseRoute.extend({ filterPriority: meta.priority, reviewableTypes: meta.reviewable_types, filterUsername: meta.username, + filterReviewedBy: meta.reviewed_by, filterFromDate: isPresent(meta.from_date) ? moment(meta.from_date) : null, filterToDate: isPresent(meta.to_date) ? moment(meta.to_date) : null, filterSortOrder: meta.sort_order, diff --git a/app/assets/javascripts/discourse/app/templates/review-index.hbs b/app/assets/javascripts/discourse/app/templates/review-index.hbs index c5a0fad889..322ba824c2 100644 --- a/app/assets/javascripts/discourse/app/templates/review-index.hbs +++ b/app/assets/javascripts/discourse/app/templates/review-index.hbs @@ -58,6 +58,17 @@ }} +
+ {{i18n "review.filtered_reviewed_by"}} + {{user-selector + excludeCurrentUser=false + usernames=filterReviewedBy + fullWidthWrap=true + single=true + class="user-selector" + canReceiveUpdates=true}} +
+
{{i18n "review.filtered_user"}} {{user-selector diff --git a/app/controllers/reviewables_controller.rb b/app/controllers/reviewables_controller.rb index 65de25b429..874a678c32 100644 --- a/app/controllers/reviewables_controller.rb +++ b/app/controllers/reviewables_controller.rb @@ -30,7 +30,7 @@ class ReviewablesController < ApplicationController additional_filters: additional_filters.reject { |_, v| v.blank? } } - %i[priority username from_date to_date type sort_order].each do |filter_key| + %i[priority username reviewed_by from_date to_date type sort_order].each do |filter_key| filters[filter_key] = params[filter_key] end diff --git a/app/models/reviewable.rb b/app/models/reviewable.rb index c26efaedb4..6adcb6ae42 100644 --- a/app/models/reviewable.rb +++ b/app/models/reviewable.rb @@ -437,6 +437,7 @@ class Reviewable < ActiveRecord::Base offset: nil, priority: nil, username: nil, + reviewed_by: nil, sort_order: nil, from_date: nil, to_date: nil, @@ -470,6 +471,21 @@ class Reviewable < ActiveRecord::Base result = result.where("reviewables.created_at >= ?", from_date) if from_date result = result.where("reviewables.created_at <= ?", to_date) if to_date + if reviewed_by + reviewed_by_id = User.find_by_username(reviewed_by)&.id + return [] if reviewed_by_id.nil? + + result = result.joins(<<~SQL + INNER JOIN( + SELECT reviewable_id + FROM reviewable_histories + WHERE reviewable_history_type = #{ReviewableHistory.types[:transitioned]} AND + status <> #{Reviewable.statuses[:pending]} AND created_by_id = #{reviewed_by_id} + ) AS rh ON rh.reviewable_id = reviewables.id + SQL + ) + end + if min_score > 0 && status == :pending result = result.where("reviewables.score >= ? OR reviewables.force_review", min_score) elsif min_score > 0 diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 7a81c06984..b1fcd40bc9 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -457,6 +457,7 @@ en: topic: "Topic:" filtered_topic: "You have filtered to reviewable content in a single topic." filtered_user: "User" + filtered_reviewed_by: "Reviewed By" show_all_topics: "show all topics" deleted_post: "(post deleted)" deleted_user: "(user deleted)" diff --git a/spec/models/reviewable_spec.rb b/spec/models/reviewable_spec.rb index e5246ef05d..2572da5e90 100644 --- a/spec/models/reviewable_spec.rb +++ b/spec/models/reviewable_spec.rb @@ -149,6 +149,18 @@ RSpec.describe Reviewable, type: :model do expect(reviewables).not_to include(qp) end + it 'can filter by who reviewed the flag' do + reviewable = Fabricate(:reviewable_flagged_post) + admin = Fabricate(:admin) + reviewable.perform(admin, :ignore) + + reviewables = Reviewable.list_for( + user, status: :all, reviewed_by: admin.username + ) + + expect(reviewables).to contain_exactly(reviewable) + end + it 'Does not filter by status when status parameter is set to all' do rejected_reviewable = Fabricate(:reviewable, target: post, status: Reviewable.statuses[:rejected]) reviewables = Reviewable.list_for(user, status: :all) From 4aeb3ef8e0b0a68d076989cde587725bc4522baa Mon Sep 17 00:00:00 2001 From: Roman Rizzi Date: Fri, 4 Dec 2020 15:09:20 -0300 Subject: [PATCH 025/393] FIX: Trigger an event when a post is bookmarked. (#11407) When we renamed BookmarkWithReminder to Bookmark in ca539fd, the bookmark event trigger was removed with the old code, and we forgot to add it again. --- app/assets/javascripts/discourse/app/models/post.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/javascripts/discourse/app/models/post.js b/app/assets/javascripts/discourse/app/models/post.js index 41dd4c5427..7ccb15340d 100644 --- a/app/assets/javascripts/discourse/app/models/post.js +++ b/app/assets/javascripts/discourse/app/models/post.js @@ -343,6 +343,7 @@ const Post = RestModel.extend({ bookmark_id: savedData.id, }); resolve({ closedWithoutSaving: false }); + this.appEvents.trigger("page:bookmark-post-toggled", this); this.appEvents.trigger("post-stream:refresh", { id: this.id }); }, afterDelete: (topicBookmarked) => { From 161e92be61c30af3a1e1d972f6413e4c3e4cfbff Mon Sep 17 00:00:00 2001 From: jbrw Date: Fri, 4 Dec 2020 15:07:32 -0500 Subject: [PATCH 026/393] DEV: update onebox gem (#11409) --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index ec9fa250aa..8ee7f50435 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -204,7 +204,7 @@ GEM nio4r (2.5.4) nokogiri (1.10.10) mini_portile2 (~> 2.4.0) - nokogumbo (2.0.2) + nokogumbo (2.0.4) nokogiri (~> 1.8, >= 1.8.4) oauth (0.5.4) oauth2 (1.4.4) @@ -235,7 +235,7 @@ GEM omniauth-twitter (1.4.0) omniauth-oauth (~> 1.1) rack - onebox (2.1.7) + onebox (2.1.8) addressable (~> 2.7.0) htmlentities (~> 4.3) multi_json (~> 1.11) From 54519a2976a2ccd8e1251b6ad2839362cfaf244e Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Sun, 6 Dec 2020 18:28:39 +0100 Subject: [PATCH 027/393] FIX: do not replace smiling_face by slight_smile (#11412) --- app/models/emoji.rb | 1 - spec/components/pretty_text_spec.rb | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/models/emoji.rb b/app/models/emoji.rb index f7c7b70c90..b4698c568e 100644 --- a/app/models/emoji.rb +++ b/app/models/emoji.rb @@ -173,7 +173,6 @@ class Emoji end replacements["\u{2639}"] = 'frowning' - replacements["\u{263A}"] = 'slight_smile' replacements["\u{263B}"] = 'slight_smile' replacements["\u{2661}"] = 'heart' replacements["\u{2665}"] = 'heart' diff --git a/spec/components/pretty_text_spec.rb b/spec/components/pretty_text_spec.rb index 887dcfba9c..cb574b096c 100644 --- a/spec/components/pretty_text_spec.rb +++ b/spec/components/pretty_text_spec.rb @@ -1037,7 +1037,7 @@ describe PrettyText do end it "replaces some glyphs that are not in the emoji range" do - expect(PrettyText.cook("☺")).to match(/\:slight_smile\:/) + expect(PrettyText.cook("☺")).to match(/\:relaxed\:/) end it "replaces digits" do From da74b3e14b4a3a02835d533faaaaf0b0ac196ce9 Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Mon, 7 Dec 2020 13:33:24 +0200 Subject: [PATCH 028/393] FEATURE: Add after-topic-list-body plugin-outlet (#11410) --- .../app/templates/components/topic-list.hbs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/assets/javascripts/discourse/app/templates/components/topic-list.hbs b/app/assets/javascripts/discourse/app/templates/components/topic-list.hbs index 5fbbf9cde6..d524cdaffb 100644 --- a/app/assets/javascripts/discourse/app/templates/components/topic-list.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/topic-list.hbs @@ -45,3 +45,15 @@ {{raw "list/visited-line" lastVisitedTopic=lastVisitedTopic topic=topic}} {{/each}} + +{{plugin-outlet + name="after-topic-list-body" + args=(hash + topics=topics + selected=selected + bulkSelectEnabled=bulkSelectEnabled + lastVisitedTopic=lastVisitedTopic + discoveryList=discoveryList + hideCategory=hideCategory) + tagName="" + connectorTagName=""}} From ed52577e1ce44697877a49fbe3c348db864cb40b Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Mon, 7 Dec 2020 13:35:41 +0200 Subject: [PATCH 029/393] FIX: Group#flair_url must be a real URL (#11400) It used to be a short URL, but that did not work with the lightbox in {{image-uploader}}. --- app/models/group.rb | 2 +- spec/jobs/migrate_group_flair_images_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/group.rb b/app/models/group.rb index c673afed46..f4fd4dceab 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -750,7 +750,7 @@ class Group < ActiveRecord::Base end def flair_url - flair_icon.presence || flair_upload&.short_path + flair_icon.presence || flair_upload&.url end [:muted, :regular, :tracking, :watching, :watching_first_post].each do |level| diff --git a/spec/jobs/migrate_group_flair_images_spec.rb b/spec/jobs/migrate_group_flair_images_spec.rb index cc72d26fa2..d47a5acd30 100644 --- a/spec/jobs/migrate_group_flair_images_spec.rb +++ b/spec/jobs/migrate_group_flair_images_spec.rb @@ -30,7 +30,7 @@ RSpec.describe Jobs::MigrateGroupFlairImages do group.reload upload = Upload.last expect(group.flair_upload).to eq(upload) - expect(group.flair_url).to eq(upload.short_path) + expect(group.flair_url).to eq(upload.url) expect(group[:flair_url]).to eq(nil) end From 154c8c3fefc63ec19978d76c0b8d398ba65f217e Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Mon, 7 Dec 2020 13:36:08 +0200 Subject: [PATCH 030/393] FIX: Use CDN for custom emojis (#11401) --- app/serializers/emoji_serializer.rb | 4 ++++ spec/serializers/emoji_serializer_spec.rb | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 spec/serializers/emoji_serializer_spec.rb diff --git a/app/serializers/emoji_serializer.rb b/app/serializers/emoji_serializer.rb index d0d440e24d..f5ed3946c2 100644 --- a/app/serializers/emoji_serializer.rb +++ b/app/serializers/emoji_serializer.rb @@ -2,4 +2,8 @@ class EmojiSerializer < ApplicationSerializer attributes :name, :url, :group + + def url + Discourse.store.cdn_url(object.url) + end end diff --git a/spec/serializers/emoji_serializer_spec.rb b/spec/serializers/emoji_serializer_spec.rb new file mode 100644 index 0000000000..434ee17f35 --- /dev/null +++ b/spec/serializers/emoji_serializer_spec.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe EmojiSerializer do + fab!(:emoji) do + CustomEmoji.create!(name: 'trout', upload: Fabricate(:upload)) + Emoji.load_custom.first + end + + subject { described_class.new(emoji, root: false) } + + describe '#url' do + it 'returns a valid URL' do + expect(subject.url).to start_with('/uploads/') + end + + it 'works with a CDN' do + set_cdn_url('https://cdn.com') + expect(subject.url).to start_with('https://cdn.com') + end + end +end From 8b33e2f73ddd29a633317a473dd020862377f899 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 7 Dec 2020 12:24:18 +0000 Subject: [PATCH 031/393] FIX: Include locale in cache key for not_found_topics (#11406) This ensures that users are only served cached content in their own language. This commit also refactors to make use of the `Discourse.cache` framework rather than direct redis access --- app/controllers/application_controller.rb | 11 ++++------- spec/requests/application_controller_spec.rb | 12 ++++++++++-- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index a1fc32cf76..53878b0396 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -803,16 +803,13 @@ class ApplicationController < ActionController::Base @current_user = current_user rescue nil if !SiteSetting.login_required? || @current_user - key = "page_not_found_topics" - if @topics_partial = Discourse.redis.get(key) - @topics_partial = @topics_partial.html_safe - else + key = "page_not_found_topics:#{I18n.locale}" + @topics_partial = Discourse.cache.fetch(key, expires_in: 10.minutes) do category_topic_ids = Category.pluck(:topic_id).compact @top_viewed = TopicQuery.new(nil, except_topic_ids: category_topic_ids).list_top_for("monthly").topics.first(10) @recent = Topic.includes(:category).where.not(id: category_topic_ids).recent(10) - @topics_partial = render_to_string partial: '/exceptions/not_found_topics', formats: [:html] - Discourse.redis.setex(key, 10.minutes, @topics_partial) - end + render_to_string partial: '/exceptions/not_found_topics', formats: [:html] + end.html_safe end @container_class = "wrap not-found-container" diff --git a/spec/requests/application_controller_spec.rb b/spec/requests/application_controller_spec.rb index 7808d23de2..5e82551fc2 100644 --- a/spec/requests/application_controller_spec.rb +++ b/spec/requests/application_controller_spec.rb @@ -373,7 +373,7 @@ RSpec.describe ApplicationController do it 'should handle 404 to a css file' do - Discourse.redis.del("page_not_found_topics") + Discourse.cache.delete("page_not_found_topics:#{I18n.locale}") topic1 = Fabricate(:topic) get '/stylesheets/mobile_1_4cd559272273fe6d3c7db620c617d596a5fdf240.css', headers: { 'HTTP_ACCEPT' => 'text/css,*/*,q=0.1' } @@ -394,7 +394,8 @@ RSpec.describe ApplicationController do end it 'should cache results' do - Discourse.redis.del("page_not_found_topics") + Discourse.cache.delete("page_not_found_topics:#{I18n.locale}") + Discourse.cache.delete("page_not_found_topics:fr") topic1 = Fabricate(:topic) get '/t/nope-nope/99999999' @@ -406,6 +407,13 @@ RSpec.describe ApplicationController do expect(response.status).to eq(404) expect(response.body).to include(topic1.title) expect(response.body).to_not include(topic2.title) + + # Different locale should have different cache + SiteSetting.default_locale = :fr + get '/t/nope-nope/99999999' + expect(response.status).to eq(404) + expect(response.body).to include(topic1.title) + expect(response.body).to include(topic2.title) end end end From dcd7defb144ab662209869ab3baa433f7457cd96 Mon Sep 17 00:00:00 2001 From: John Losito Date: Mon, 7 Dec 2020 10:56:50 -0500 Subject: [PATCH 032/393] DEV: Check github actions weekly with dependabot (#11411) --- .github/dependabot.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 7b1bb84427..aefab9fadb 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,5 +1,9 @@ version: 2 updates: +- package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" - package-ecosystem: bundler directory: "/" schedule: From 490e1cfbbb6806d75b7780f7fbaac2d3b253807f Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Mon, 7 Dec 2020 12:10:21 -0500 Subject: [PATCH 033/393] DEV: Use tag renderer in tags filter dropdown (#11378) A small change that would allow components to extend the tag display in the filter dropdown, like they can in other contexts. Was requested in the tag icons component, see https://meta.discourse.org/t/tag-icons-component/109757/60?u=pmusaraj The PR also standardises tag styling in select-kit dropdowns. --- .../javascripts/select-kit/addon/components/tag-drop.js | 4 ++++ .../stylesheets/common/select-kit/mini-tag-chooser.scss | 6 ------ app/assets/stylesheets/common/select-kit/select-kit.scss | 4 +++- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/select-kit/addon/components/tag-drop.js b/app/assets/javascripts/select-kit/addon/components/tag-drop.js index 02abe4ccb2..8773d5a8d2 100644 --- a/app/assets/javascripts/select-kit/addon/components/tag-drop.js +++ b/app/assets/javascripts/select-kit/addon/components/tag-drop.js @@ -96,6 +96,10 @@ export default ComboBoxComponent.extend(TagsMixin, { noTagsLabel: i18n("tagging.selector_no_tags"), + modifyComponentForRow() { + return "tag-row"; + }, + shortcuts: computed("tagId", function () { const shortcuts = []; diff --git a/app/assets/stylesheets/common/select-kit/mini-tag-chooser.scss b/app/assets/stylesheets/common/select-kit/mini-tag-chooser.scss index 55e2ee0e63..e3085aeceb 100644 --- a/app/assets/stylesheets/common/select-kit/mini-tag-chooser.scss +++ b/app/assets/stylesheets/common/select-kit/mini-tag-chooser.scss @@ -47,12 +47,6 @@ background: var(--tertiary-low); } - .discourse-tag { - &:hover { - color: var(--primary); - } - } - .discourse-tag-count { margin-left: 0.5em; } diff --git a/app/assets/stylesheets/common/select-kit/select-kit.scss b/app/assets/stylesheets/common/select-kit/select-kit.scss index a4ffccfc3a..7cbc9c9d24 100644 --- a/app/assets/stylesheets/common/select-kit/select-kit.scss +++ b/app/assets/stylesheets/common/select-kit/select-kit.scss @@ -170,8 +170,10 @@ } .discourse-tag, + .discourse-tag:visited, + .discourse-tag:hover, .discourse-tag-count { - color: var(--primary); + color: var(--primary-high); } &.create-color-row { From 62cf30bec158f0ccf371bd824b8226d415e1bac1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Dec 2020 17:29:01 +0000 Subject: [PATCH 034/393] Build(deps): Bump rails_failover from 0.6.2 to 0.6.3 (#11419) Bumps rails_failover from 0.6.2 to 0.6.3. Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8ee7f50435..0b7e79362a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -275,7 +275,7 @@ GEM nokogiri (>= 1.6) rails-html-sanitizer (1.3.0) loofah (~> 2.3) - rails_failover (0.6.2) + rails_failover (0.6.3) activerecord (~> 6.0) concurrent-ruby railties (~> 6.0) @@ -427,7 +427,7 @@ GEM jwt (~> 2.0) xorcist (1.1.2) yaml-lint (0.0.10) - zeitwerk (2.4.1) + zeitwerk (2.4.2) PLATFORMS ruby From dd9ec827e57e7653c710d26e715b0828363f3ce2 Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Mon, 7 Dec 2020 13:39:18 -0500 Subject: [PATCH 035/393] FIX: Adjust reviewable menu placement on mobile (#11420) Shows the actions dropdown above the triggering button to avoid some options from displaying below mobile navigation in DiscourseHub. --- .../app/components/reviewable-bundled-action.js | 10 ++++++++++ .../templates/components/reviewable-bundled-action.hbs | 1 + 2 files changed, 11 insertions(+) diff --git a/app/assets/javascripts/discourse/app/components/reviewable-bundled-action.js b/app/assets/javascripts/discourse/app/components/reviewable-bundled-action.js index 5046c027f2..27b3942f43 100644 --- a/app/assets/javascripts/discourse/app/components/reviewable-bundled-action.js +++ b/app/assets/javascripts/discourse/app/components/reviewable-bundled-action.js @@ -1,11 +1,21 @@ import { alias, gt } from "@ember/object/computed"; import Component from "@ember/component"; +import discourseComputed from "discourse-common/utils/decorators"; +import { isRTL } from "discourse/lib/text-direction"; + export default Component.extend({ tagName: "", multiple: gt("bundle.actions.length", 1), first: alias("bundle.actions.firstObject"), + @discourseComputed() + placement() { + const vertical = this.site.mobileView ? "top" : "bottom", + horizontal = isRTL() ? "end" : "start"; + return `${vertical}-${horizontal}`; + }, + actions: { performById(id) { this.attrs.performAction(this.get("bundle.actions").findBy("id", id)); diff --git a/app/assets/javascripts/discourse/app/templates/components/reviewable-bundled-action.hbs b/app/assets/javascripts/discourse/app/templates/components/reviewable-bundled-action.hbs index 1455e3f4e0..c40ac432c3 100644 --- a/app/assets/javascripts/discourse/app/templates/components/reviewable-bundled-action.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/reviewable-bundled-action.hbs @@ -8,6 +8,7 @@ options=(hash icon=bundle.icon disabled=reviewableUpdating + placement=placement ) }} {{else}} From 28feb7c2ff6be4b6b804a05b8bb8a0a882b3de46 Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Mon, 7 Dec 2020 14:50:45 -0500 Subject: [PATCH 036/393] DEV: Add header colors to styleguide (#11421) --- .../templates/styleguide/atoms/03-colors.hbs | 16 ++++++++++ .../styleguide/assets/stylesheets/colors.scss | 31 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/atoms/03-colors.hbs b/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/atoms/03-colors.hbs index a153fccf82..b233a37619 100644 --- a/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/atoms/03-colors.hbs +++ b/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/atoms/03-colors.hbs @@ -68,3 +68,19 @@ {{color-example color="love"}} {{/styleguide-example}} + +{{#styleguide-example title="$header"}} +
+ {{color-example color="header_background"}} +
+
+ {{color-example color="header_primary"}} + {{color-example color="header_primary-very-high"}} + {{color-example color="header_primary-high"}} +
+
+ {{color-example color="header_primary-medium"}} + {{color-example color="header_primary-low-mid"}} + {{color-example color="header_primary-low"}} +
+{{/styleguide-example}} diff --git a/plugins/styleguide/assets/stylesheets/colors.scss b/plugins/styleguide/assets/stylesheets/colors.scss index a59afb0904..e1b4e28c49 100644 --- a/plugins/styleguide/assets/stylesheets/colors.scss +++ b/plugins/styleguide/assets/stylesheets/colors.scss @@ -86,4 +86,35 @@ .love { background-color: var(--love, $love); } + + .header_primary { + background-color: var(--header_primary, $header_primary); + } + + .header_background { + background-color: var(--header_background, $header_background); + } + + .header_primary-low { + background-color: var(--header_primary-low, $header_primary-low); + } + + .header_primary-low-mid { + background-color: var(--header_primary-low-mid, $header_primary-low-mid); + } + + .header_primary-medium { + background-color: var(--header_primary-medium, $header_primary-medium); + } + + .header_primary-high { + background-color: var(--header_primary-high, $header_primary-high); + } + + .header_primary-very-high { + background-color: var( + --header_primary-very-high, + $header_primary-very-high + ); + } } From d5ba854c916f55e9f7f503322bbe6100330109af Mon Sep 17 00:00:00 2001 From: Krzysztof Kotlarek Date: Tue, 8 Dec 2020 08:25:35 +1100 Subject: [PATCH 037/393] FIX: hide user id when hide_email_address_taken (#11417) We should always hide user_id in response when `hide_email_address_taken` setting is enabled. Currently, it can be used to determine if the email was used or not. --- app/controllers/users_controller.rb | 8 +++----- spec/requests/users_controller_spec.rb | 12 ++++++++++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index d97ad5f71e..42700f31d5 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -647,8 +647,7 @@ class UsersController < ApplicationController success: true, active: user.active?, message: activation.message, - user_id: user.id - } + }.merge(SiteSetting.hide_email_address_taken ? {} : { user_id: user.id }) elsif SiteSetting.hide_email_address_taken && user.errors[:primary_email]&.include?(I18n.t('errors.messages.taken')) session["user_created_message"] = activation.success_message @@ -658,9 +657,8 @@ class UsersController < ApplicationController render json: { success: true, - active: user.active?, - message: activation.success_message, - user_id: user.id + active: false, + message: activation.success_message } else errors = user.errors.to_hash diff --git a/spec/requests/users_controller_spec.rb b/spec/requests/users_controller_spec.rb index be4b5eff8f..b3635d1439 100644 --- a/spec/requests/users_controller_spec.rb +++ b/spec/requests/users_controller_spec.rb @@ -762,6 +762,18 @@ describe UsersController do json = response.parsed_body expect(json['active']).to be_falsey expect(json['message']).to eq(I18n.t("login.activate_email", email: post_user_params[:email])) + expect(json['user_id']).not_to be_present + + existing.destroy! + expect { + post_user + }.to change { User.count } + expect(response.status).to eq(200) + json = response.parsed_body + + expect(json['active']).to be_falsey + expect(json['message']).to eq(I18n.t("login.activate_email", email: post_user_params[:email])) + expect(json['user_id']).not_to be_present end end end From e16b3da04a8be659a035a6ae2f45c1e92799ef9f Mon Sep 17 00:00:00 2001 From: Kane York Date: Mon, 7 Dec 2020 14:22:39 -0800 Subject: [PATCH 038/393] FIX: Stop category 404s from breaking the router (#11424) The propagated promise failure from model() caused the router to reject future route transitions, even though it correctly routed to the last-resort 404 page. Co-authored-by: Jeff Wong --- .../app/routes/build-category-route.js | 17 ++++++++----- .../tests/acceptance/unknown-test.js | 24 ++++++++++++++++++- .../discourse/tests/fixtures/topic.js | 2 +- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/discourse/app/routes/build-category-route.js b/app/assets/javascripts/discourse/app/routes/build-category-route.js index d7e10e764e..af741fc6cb 100644 --- a/app/assets/javascripts/discourse/app/routes/build-category-route.js +++ b/app/assets/javascripts/discourse/app/routes/build-category-route.js @@ -66,12 +66,17 @@ export default (filterArg, params) => { parts.pop(); } - return Category.reloadBySlugPath(parts.join("/")).then((result) => { - const record = this.store.createRecord("category", result.category); - record.setupGroupsAndPermissions(); - this.site.updateCategory(record); - return { category: record, modelParams }; - }); + return Category.reloadBySlugPath(parts.join("/")) + .then((result) => { + const record = this.store.createRecord("category", result.category); + record.setupGroupsAndPermissions(); + this.site.updateCategory(record); + return { category: record, modelParams }; + }) + .catch(() => { + // afterModel will call replaceWith(/404) + return null; + }); } if (category) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/unknown-test.js b/app/assets/javascripts/discourse/tests/acceptance/unknown-test.js index b552dcfeb6..7910e938f0 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/unknown-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/unknown-test.js @@ -1,7 +1,29 @@ import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; -import { currentURL, visit } from "@ember/test-helpers"; +import { click, currentURL, visit } from "@ember/test-helpers"; import { test } from "qunit"; +acceptance("Category 404", function (needs) { + needs.pretender((server, helper) => { + server.get("/c/category-does-not-exist/find_by_slug.json", () => { + return helper.response(404, { + errors: ["The requested URL or resource could not be found."], + error_type: "not_found", + extras: { html: "
not found
" }, + }); + }); + }); + test("Navigating to a bad category link does not break the router", async function (assert) { + await visit("/t/internationalization-localization/280"); + + await click('[data-for-test="category-404"]'); + assert.equal(currentURL(), "/404"); + + // See that we can navigate away + await click("#site-logo"); + assert.equal(currentURL(), "/"); + }); +}); + acceptance("Unknown", function (needs) { const urls = { "viewtopic.php": "/t/internationalization-localization/280", diff --git a/app/assets/javascripts/discourse/tests/fixtures/topic.js b/app/assets/javascripts/discourse/tests/fixtures/topic.js index 2f4a97a684..5d97207a92 100644 --- a/app/assets/javascripts/discourse/tests/fixtures/topic.js +++ b/app/assets/javascripts/discourse/tests/fixtures/topic.js @@ -374,7 +374,7 @@ export default { uploaded_avatar_id: 40181, created_at: "2013-02-05T21:32:47.649Z", cooked: - '

The application strings are externalized, so localization should be entirely possible with enough translation effort.

', + '

The application strings are externalized, so localization should be entirely possible with enough translation effort.

Link for unknown-test: link

', post_number: 2, post_type: 1, updated_at: "2013-02-06T10:15:27.965Z", From 0302de058cba7738df7ff237c2ce02de4c5ee854 Mon Sep 17 00:00:00 2001 From: Kris Date: Mon, 7 Dec 2020 18:08:04 -0500 Subject: [PATCH 039/393] UX: Fix invite checkbox width issue (#11371) --- app/assets/stylesheets/desktop/login.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/desktop/login.scss b/app/assets/stylesheets/desktop/login.scss index 70a882bfc3..f89e06d104 100644 --- a/app/assets/stylesheets/desktop/login.scss +++ b/app/assets/stylesheets/desktop/login.scss @@ -294,7 +294,8 @@ h2 { margin-bottom: 12px; } - input { + input:not([type="checkbox"]) { + // 80% width on checkboxes messes up the layout for custom fields width: 80%; } } From 06b24429143464a8301289637b550c56fcb06018 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Dec 2020 10:09:36 +1100 Subject: [PATCH 040/393] Build(deps): Bump onebox from 2.1.8 to 2.1.9 (#11423) Bumps [onebox](https://github.com/discourse/onebox) from 2.1.8 to 2.1.9. - [Release notes](https://github.com/discourse/onebox/releases) - [Changelog](https://github.com/discourse/onebox/blob/master/CHANGELOG.md) - [Commits](https://github.com/discourse/onebox/compare/v2.1.8...v2.1.9) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0b7e79362a..5c70526e67 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -235,7 +235,7 @@ GEM omniauth-twitter (1.4.0) omniauth-oauth (~> 1.1) rack - onebox (2.1.8) + onebox (2.1.9) addressable (~> 2.7.0) htmlentities (~> 4.3) multi_json (~> 1.11) From ff0f2009d90656e1fb45418cb60baf41d1c4ad39 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Dec 2020 10:10:15 +1100 Subject: [PATCH 041/393] DEV: Bump excon from 0.78.0 to 0.78.1 (#11415) Bumps [excon](https://github.com/excon/excon) from 0.78.0 to 0.78.1. - [Release notes](https://github.com/excon/excon/releases) - [Changelog](https://github.com/excon/excon/blob/master/changelog.txt) - [Commits](https://github.com/excon/excon/compare/v0.78.0...v0.78.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 5c70526e67..e3e515cf48 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -121,7 +121,7 @@ GEM sprockets (>= 3.3, < 4.1) ember-source (2.18.2) erubi (1.10.0) - excon (0.78.0) + excon (0.78.1) execjs (2.7.0) exifr (1.3.9) fabrication (2.21.1) From c6e6f34d83670669440238f4e5b8e31fed84488d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Dec 2020 10:11:31 +1100 Subject: [PATCH 042/393] DEV: Bump rubocop from 1.5.1 to 1.5.2 (#11414) Bumps [rubocop](https://github.com/rubocop-hq/rubocop) from 1.5.1 to 1.5.2. - [Release notes](https://github.com/rubocop-hq/rubocop/releases) - [Changelog](https://github.com/rubocop-hq/rubocop/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop-hq/rubocop/compare/v1.5.1...v1.5.2) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index e3e515cf48..99b5a1e1ef 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -341,13 +341,13 @@ GEM json-schema (~> 2.2) railties (>= 3.1, < 7.0) rtlit (0.0.5) - rubocop (1.5.1) + rubocop (1.5.2) parallel (~> 1.10) parser (>= 2.7.1.5) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 2.0) + regexp_parser (>= 1.8, < 3.0) rexml - rubocop-ast (>= 1.2.0) + rubocop-ast (>= 1.2.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 2.0) rubocop-ast (1.3.0) From 95355eb27b2921f3d8794f268c4f6e294e0a879e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Dec 2020 10:11:57 +1100 Subject: [PATCH 043/393] DEV: Bump mini_scheduler from 0.12.3 to 0.13.0 (#11381) Bumps [mini_scheduler](https://github.com/discourse/mini_scheduler) from 0.12.3 to 0.13.0. - [Release notes](https://github.com/discourse/mini_scheduler/releases) - [Changelog](https://github.com/discourse/mini_scheduler/blob/master/CHANGELOG.md) - [Commits](https://github.com/discourse/mini_scheduler/compare/v0.12.3...v0.13.0) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 99b5a1e1ef..335ed333f9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -188,8 +188,8 @@ GEM mini_portile2 (2.4.0) mini_racer (0.3.1) libv8 (~> 8.4.255) - mini_scheduler (0.12.3) - sidekiq + mini_scheduler (0.13.0) + sidekiq (>= 4.2.3) mini_sql (0.3) mini_suffix (0.3.0) ffi (~> 1.9) From 3ef60686ede5bdaf11dd38fa5f74caccdd3c5a4a Mon Sep 17 00:00:00 2001 From: Kris Date: Mon, 7 Dec 2020 18:26:31 -0500 Subject: [PATCH 044/393] UX: When requiring user fields at signup, also mark default fields as required (#11356) --- .../app/controllers/create-account.js | 8 ---- .../app/templates/modal/create-account.hbs | 38 ++++++++++++++++--- app/assets/stylesheets/common/base/user.scss | 1 + 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/discourse/app/controllers/create-account.js b/app/assets/javascripts/discourse/app/controllers/create-account.js index fce8b5e08a..588826f6bc 100644 --- a/app/assets/javascripts/discourse/app/controllers/create-account.js +++ b/app/assets/javascripts/discourse/app/controllers/create-account.js @@ -99,14 +99,6 @@ export default Controller.extend( return authOptions && !canEditName; }, - @discourseComputed - fullnameRequired() { - return ( - this.get("siteSettings.full_name_required") || - this.get("siteSettings.enable_names") - ); - }, - @discourseComputed("authOptions.auth_provider") passwordRequired(authProvider) { return isEmpty(authProvider); diff --git a/app/assets/javascripts/discourse/app/templates/modal/create-account.hbs b/app/assets/javascripts/discourse/app/templates/modal/create-account.hbs index a353fb0f88..b672ef964e 100644 --- a/app/assets/javascripts/discourse/app/templates/modal/create-account.hbs +++ b/app/assets/javascripts/discourse/app/templates/modal/create-account.hbs @@ -17,7 +17,14 @@ - + - + - {{#if fullnameRequired}} + {{#if siteSettings.enable_names}} - + diff --git a/app/assets/stylesheets/common/base/user.scss b/app/assets/stylesheets/common/base/user.scss index 24a318e2fb..272ce23aad 100644 --- a/app/assets/stylesheets/common/base/user.scss +++ b/app/assets/stylesheets/common/base/user.scss @@ -339,6 +339,7 @@ } } +.login-form, .user-field { .required { vertical-align: top; From b67c7f35d96b4c168314b346de95e32c7dcaf956 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Dec 2020 10:53:18 +1100 Subject: [PATCH 045/393] DEV: Bump puma from 5.0.4 to 5.1.0 (#11380) Bumps [puma](https://github.com/puma/puma) from 5.0.4 to 5.1.0. - [Release notes](https://github.com/puma/puma/releases) - [Changelog](https://github.com/puma/puma/blob/master/History.md) - [Commits](https://github.com/puma/puma/compare/v5.0.4...v5.1.0) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 335ed333f9..8775a6de32 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -260,7 +260,7 @@ GEM pry-rails (0.3.9) pry (>= 0.10.4) public_suffix (4.0.6) - puma (5.0.4) + puma (5.1.0) nio4r (~> 2.0) r2 (0.2.7) rack (2.2.3) From 70741766cbc241a07159bc2adca1d806b7587e43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Dec 2020 10:53:46 +1100 Subject: [PATCH 046/393] DEV: Bump listen from 3.3.1 to 3.3.3 (#11379) Bumps [listen](https://github.com/guard/listen) from 3.3.1 to 3.3.3. - [Release notes](https://github.com/guard/listen/releases) - [Commits](https://github.com/guard/listen/compare/v3.3.1...v3.3.3) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8775a6de32..2dbcce6086 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -160,7 +160,7 @@ GEM jwt (2.2.2) kgio (2.11.3) libv8 (8.4.255.0) - listen (3.3.1) + listen (3.3.3) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) lograge (0.11.2) From 5ab6ef97650d4e89e2c80aeec954a632f611356f Mon Sep 17 00:00:00 2001 From: Joe Date: Tue, 8 Dec 2020 07:54:44 +0800 Subject: [PATCH 047/393] FEATURE: Adds back button to theme editor (#11416) --- .../admin-customize-themes-edit.js | 4 +++ .../addon/templates/customize-themes-edit.hbs | 31 +++++++++++++++++-- .../stylesheets/common/admin/customize.scss | 19 ++++++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/admin/addon/controllers/admin-customize-themes-edit.js b/app/assets/javascripts/admin/addon/controllers/admin-customize-themes-edit.js index b69b57510c..2e1536d181 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-customize-themes-edit.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-customize-themes-edit.js @@ -64,5 +64,9 @@ export default Controller.extend({ } } }, + + goBack() { + this.replaceRoute(this.showRouteName, this.model.id); + }, }, }); diff --git a/app/assets/javascripts/admin/addon/templates/customize-themes-edit.hbs b/app/assets/javascripts/admin/addon/templates/customize-themes-edit.hbs index a4e7fa583f..32e3521f65 100644 --- a/app/assets/javascripts/admin/addon/templates/customize-themes-edit.hbs +++ b/app/assets/javascripts/admin/addon/templates/customize-themes-edit.hbs @@ -1,6 +1,21 @@
-

{{i18n "admin.customize.theme.edit_css_html"}} {{#link-to showRouteName model.id replace=true}}{{model.name}}{{/link-to}}

+
+ {{d-button + title="go_back" + action=(action "goBack") + icon="chevron-left" + class="btn-small editor-back-button" + }} + + + {{i18n "admin.customize.theme.edit_css_html"}} + {{#link-to showRouteName model.id replace=true class="editor-theme-name" + }} + {{model.name}} + {{/link-to}} + +
{{admin-theme-editor theme=model @@ -15,14 +30,24 @@ {{else}} {{#if this.user.bio_excerpt}} -
{{html-safe this.user.bio_excerpt}}
+
+ {{#html-with-links}} + {{html-safe this.user.bio_excerpt}} + {{/html-with-links}} +
{{/if}} {{/if}}
diff --git a/app/assets/javascripts/discourse/app/templates/user.hbs b/app/assets/javascripts/discourse/app/templates/user.hbs index 882963d8be..5a3468539d 100644 --- a/app/assets/javascripts/discourse/app/templates/user.hbs +++ b/app/assets/javascripts/discourse/app/templates/user.hbs @@ -144,7 +144,9 @@
{{/if}} {{#if isNotSuspendedOrIsStaff}} - {{html-safe model.bio_cooked}} + {{#html-with-links}} + {{html-safe model.bio_cooked}} + {{/html-with-links}} {{/if}} From 76b04afca3591460b9f066339bb441a4f018aeca Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 7 Dec 2020 18:57:18 -0500 Subject: [PATCH 049/393] FIX: Local dates showed incorrect timezones with extra whitespace (#11408) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit You might wonder why this matters. It turns out in some locales like French, we replace quotation marks with « and » -- this should likely not happen before BBCode is parsed but that is not the case for this plugin. The plugin has code to handle this situation, but it means extra spaces are inserted around the time zone which breaks it. This fix allows us to supply extra whitespace and will show the correct time zone. --- .../lib/discourse-markdown/discourse-local-dates.js.es6 | 2 +- .../javascripts/acceptance/local-dates-composer-test.js.es6 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/discourse-local-dates/assets/javascripts/lib/discourse-markdown/discourse-local-dates.js.es6 b/plugins/discourse-local-dates/assets/javascripts/lib/discourse-markdown/discourse-local-dates.js.es6 index 8ea3c13a4a..09eba6c253 100644 --- a/plugins/discourse-local-dates/assets/javascripts/lib/discourse-markdown/discourse-local-dates.js.es6 +++ b/plugins/discourse-local-dates/assets/javascripts/lib/discourse-markdown/discourse-local-dates.js.es6 @@ -25,7 +25,7 @@ function addLocalDate(buffer, matches, state) { config.format = parsed.attrs.format; config.calendar = parsed.attrs.calendar; config.time = parsed.attrs.time; - config.timezone = parsed.attrs.timezone; + config.timezone = (parsed.attrs.timezone || "").trim(); config.recurring = parsed.attrs.recurring; config.timezones = parsed.attrs.timezones; config.displayedTimezone = parsed.attrs.displayedTimezone; diff --git a/plugins/discourse-local-dates/test/javascripts/acceptance/local-dates-composer-test.js.es6 b/plugins/discourse-local-dates/test/javascripts/acceptance/local-dates-composer-test.js.es6 index 8e2e982056..bd0b79426c 100644 --- a/plugins/discourse-local-dates/test/javascripts/acceptance/local-dates-composer-test.js.es6 +++ b/plugins/discourse-local-dates/test/javascripts/acceptance/local-dates-composer-test.js.es6 @@ -16,7 +16,7 @@ acceptance("Local Dates - composer", function (needs) { await fillIn( ".d-editor-input", - '[date=2017-10-23 time=01:30:00 displayedTimezone="America/Chicago" format="LLLL" calendar="off" recurring="1.weeks" timezone="Asia/Calcutta" timezones="Europe/Paris|America/Los_Angeles"]' + '[date=2017-10-23 time=01:30:00 displayedTimezone="America/Chicago" format="LLLL" calendar="off" recurring="1.weeks" timezone=" Asia/Calcutta" timezones="Europe/Paris|America/Los_Angeles"]' ); assert.equal(getAttr("date"), "2017-10-23", "it has the correct date"); From ed91385c18cdc831eea4fc5178a0829f640990fd Mon Sep 17 00:00:00 2001 From: David Taylor Date: Tue, 8 Dec 2020 00:03:31 +0000 Subject: [PATCH 050/393] DEV: Update `DB.after_commit` to be compatible with 'real' transactions (#11294) Previously it matched the behavior of standard ActiveRecord after_commit callbacks. They do not work well within `joinable: false` nested transactions. Now `DB.after_commit` callbacks will only be run when the outermost transaction has been committed. Tests always run inside transactions, so this also introduces some logic to run callbacks once the test-wrapping transaction is reached. --- lib/mini_sql_multisite_connection.rb | 28 +++++++++---- .../lib/mini_sql_multisite_connection_spec.rb | 39 ++++++++++++------- spec/rails_helper.rb | 5 +++ 3 files changed, 51 insertions(+), 21 deletions(-) diff --git a/lib/mini_sql_multisite_connection.rb b/lib/mini_sql_multisite_connection.rb index 202cf87b4e..2cf50ca61e 100644 --- a/lib/mini_sql_multisite_connection.rb +++ b/lib/mini_sql_multisite_connection.rb @@ -32,7 +32,12 @@ class MiniSqlMultisiteConnection < MiniSql::Postgres::Connection end def committed!(*) - @callback.call + if DB.transaction_open? + # Nested transaction. Pass the callback to the parent + ActiveRecord::Base.connection.add_transaction_record(self) + else + @callback.call + end end def before_committed!(*); end @@ -42,16 +47,25 @@ class MiniSqlMultisiteConnection < MiniSql::Postgres::Connection end end + def transaction_open? + ActiveRecord::Base.connection.transaction_open? + end + + if Rails.env.test? + def test_transaction=(transaction) + @test_transaction = transaction + end + + def transaction_open? + ActiveRecord::Base.connection.current_transaction != @test_transaction + end + end + # Allows running arbitrary code after the current transaction has been committed. # Works with nested ActiveRecord transaction blocks. Useful for scheduling sidekiq jobs. # If not currently in a transaction, will execute immediately def after_commit(&blk) - return blk.call if !ActiveRecord::Base.connection.transaction_open? - - # In tests, everything is run inside a transaction. - # To run immediately, check for joinable? transaction - # This mimics core rails behavior: https://github.com/rails/rails/blob/348e142b/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb#L211 - return blk.call if Rails.env.test? && !ActiveRecord::Base.connection.current_transaction.joinable? + return blk.call if !transaction_open? ActiveRecord::Base.connection.add_transaction_record( AfterCommitWrapper.new(&blk) diff --git a/spec/lib/mini_sql_multisite_connection_spec.rb b/spec/lib/mini_sql_multisite_connection_spec.rb index 9cfa452178..47e8f55837 100644 --- a/spec/lib/mini_sql_multisite_connection_spec.rb +++ b/spec/lib/mini_sql_multisite_connection_spec.rb @@ -5,27 +5,38 @@ require 'rails_helper' describe MiniSqlMultisiteConnection do describe "after_commit" do - it "runs callbacks after outermost transaction is committed" do + it "works for 'fake' (joinable) transactions" do outputString = "1" - # Main transaction ActiveRecord::Base.transaction do outputString += "2" + DB.exec("SELECT 1") + ActiveRecord::Base.transaction do + DB.exec("SELECT 2") + outputString += "3" + DB.after_commit { outputString += "6" } + outputString += "4" + end + DB.after_commit { outputString += "7" } + outputString += "5" + end - # Nested transaction - ActiveRecord::Base.transaction do + expect(outputString).to eq("1234567") + end + + it "works for real (non-joinable) transactions" do + outputString = "1" + + ActiveRecord::Base.transaction(requires_new: true, joinable: false) do + outputString += "2" + DB.exec("SELECT 1") + ActiveRecord::Base.transaction(requires_new: true) do + DB.exec("SELECT 2") outputString += "3" - - DB.after_commit do - outputString += "6" - end - outputString += "4" + DB.after_commit { outputString += "6" } + outputString += "4" end - - DB.after_commit do - outputString += "7" - end - + DB.after_commit { outputString += "7" } outputString += "5" end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 42f7d6f69a..6286218a94 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -273,6 +273,11 @@ RSpec.configure do |config| expect(before_event_count).to eq(after_event_count), "DiscourseEvent registrations were not cleaned up" end + config.before :each do + # This allows DB.transaction_open? to work in tests. See lib/mini_sql_multisite_connection.rb + DB.test_transaction = ActiveRecord::Base.connection.current_transaction + end + config.before(:each, type: :multisite) do Rails.configuration.multisite = true # rubocop:disable Discourse/NoDirectMultisiteManipulation From c69bb5d5be8138bbadc3a2fb188a048d470671ff Mon Sep 17 00:00:00 2001 From: David Taylor Date: Tue, 8 Dec 2020 00:05:01 +0000 Subject: [PATCH 051/393] DEV: Always enqueue sidekiq jobs after database transaction commit (#11293) When jobs are enqueued inside a transaction, it's possible that they will be executed before the necessary data is available in the database. This commit ensures all jobs are enqueued in an ActiveRecord after_commit hook. One potential downside here is if the job fails to enqueue, the transaction will no longer be aborted. However, the chance of that happening is reasonably low, and the impact is significantly lower than the current issue where jobs are scheduled before their data is ready. --- app/jobs/base.rb | 2 +- spec/jobs/jobs_spec.rb | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/app/jobs/base.rb b/app/jobs/base.rb index b69302861a..fdcd1dd55e 100644 --- a/app/jobs/base.rb +++ b/app/jobs/base.rb @@ -311,7 +311,7 @@ module Jobs hash['queue'] = queue end - klass.client_push(hash) + DB.after_commit { klass.client_push(hash) } else # Otherwise execute the job right away opts.delete(:delay_for) diff --git a/spec/jobs/jobs_spec.rb b/spec/jobs/jobs_spec.rb index 0f3f8d48ca..5ee5ff09a7 100644 --- a/spec/jobs/jobs_spec.rb +++ b/spec/jobs/jobs_spec.rb @@ -29,6 +29,28 @@ describe Jobs do end end + it "enqueues the job after the current transaction has committed" do + jobs = Jobs::ProcessPost.jobs + expect(jobs.length).to eq(0) + + Jobs.enqueue(:process_post, post_id: 1) + expect(jobs.length).to eq(1) + + ActiveRecord::Base.transaction do + Jobs.enqueue(:process_post, post_id: 1) + expect(jobs.length).to eq(1) + end + expect(jobs.length).to eq(2) + + # Failed transation + ActiveRecord::Base.transaction do + Jobs.enqueue(:process_post, post_id: 1) + raise ActiveRecord::Rollback + end + + expect(jobs.length).to eq(2) # No change + end + it "does not pass current_site_id when 'all_sites' is present" do Sidekiq::Testing.fake! do jobs = Jobs::ProcessPost.jobs From 6b464d1b8d9507d791f64d480858a61c6e989751 Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Tue, 8 Dec 2020 01:11:35 +0100 Subject: [PATCH 052/393] FIX: Restore dismissing the first notification (#10433) * FIX: Restore dismissing the first notification Reverts the temporary fix (8e4fea897e68e4b50e548f820dc1f1fdeeeb199d) and restores the feature introduced in e638d43f0a7549a75eb9de57bb8508b36f11543d. The issue that was the reason for the revert (https://meta.discourse.org/t/logins-redirects-to-missing-notifications-page/149718) was a combination of two bugs: 1. Fixed in this commit - the click listener was accidentally registered also for logged-out users. This meant that the first click on a page always trigger an AJAX call to the notifications endpoint (`/notifications?recent=true&limit=5`), which returned a 403 error. Now, this code is run only when the user is logged in. 2. A still unknown bug that I could not reproduce, which was somehow setting the login redirect cookie to the URL of that previously failed AJAX request. --- .../discourse/app/components/site-header.js | 9 +-- .../components/site-header-test.js | 56 +++++++++++++++++++ 2 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 app/assets/javascripts/discourse/tests/integration/components/site-header-test.js diff --git a/app/assets/javascripts/discourse/app/components/site-header.js b/app/assets/javascripts/discourse/app/components/site-header.js index b1d5146ae0..578a4a4e47 100644 --- a/app/assets/javascripts/discourse/app/components/site-header.js +++ b/app/assets/javascripts/discourse/app/components/site-header.js @@ -209,6 +209,7 @@ const SiteHeaderComponent = MountWidget.extend(Docking, PanEvents, { // Allow first notification to be dismissed on a click anywhere if ( + this.currentUser && !this.get("currentUser.read_first_notification") && !this.get("currentUser.enforcedSecondFactor") ) { @@ -216,6 +217,7 @@ const SiteHeaderComponent = MountWidget.extend(Docking, PanEvents, { if ( !e.target.closest("#current-user") && !e.target.closest(".ring-backdrop") && + this.currentUser && !this.get("currentUser.read_first_notification") && !this.get("currentUser.enforcedSecondFactor") ) { @@ -225,10 +227,9 @@ const SiteHeaderComponent = MountWidget.extend(Docking, PanEvents, { ); } }; - // TODO: re-enable event listener - // document.addEventListener("click", this._dismissFirstNotification, { - // once: true - // }); + document.addEventListener("click", this._dismissFirstNotification, { + once: true, + }); } }, diff --git a/app/assets/javascripts/discourse/tests/integration/components/site-header-test.js b/app/assets/javascripts/discourse/tests/integration/components/site-header-test.js new file mode 100644 index 0000000000..5481456e36 --- /dev/null +++ b/app/assets/javascripts/discourse/tests/integration/components/site-header-test.js @@ -0,0 +1,56 @@ +import { + discourseModule, + queryAll, +} from "discourse/tests/helpers/qunit-helpers"; +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; +import pretender from "discourse/tests/helpers/create-pretender"; + +discourseModule("Integration | Component | site-header", function (hooks) { + setupRenderingTest(hooks); + + componentTest("first notification mask", { + template: `{{site-header}}`, + + beforeEach() { + this.set("currentUser.unread_high_priority_notifications", 1); + this.set("currentUser.read_first_notification", false); + }, + + async test(assert) { + assert.ok( + queryAll(".ring-backdrop").length === 1, + "there is the first notification mask" + ); + + // Click anywhere + await click("header.d-header"); + + assert.ok( + queryAll(".ring-backdrop").length === 0, + "it hides the first notification mask" + ); + }, + }); + + componentTest("do not call authenticated endpoints as anonymous", { + template: `{{site-header}}`, + anonymous: true, + + async test(assert) { + assert.ok( + queryAll(".ring-backdrop").length === 0, + "there is no first notification mask for anonymous users" + ); + + pretender.get("/notifications", () => { + assert.ok(false, "it should not try to refresh notifications"); + return [403, { "Content-Type": "application/json" }, {}]; + }); + + // Click anywhere + await click("header.d-header"); + }, + }); +}); From b3332d029615c83a9901ee0e38202fa7b4317281 Mon Sep 17 00:00:00 2001 From: Frank Gambino Date: Mon, 7 Dec 2020 19:16:41 -0500 Subject: [PATCH 053/393] FIX: Correct casing of whitelisted SVG elements (#11094) * FIX: Casing of whitelisted SVG element "clipPath" * FIX: Casing of whitelisted SVG element `textPath` --- lib/upload_creator.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/upload_creator.rb b/lib/upload_creator.rb index 1b37f47e79..5bd0eace14 100644 --- a/lib/upload_creator.rb +++ b/lib/upload_creator.rb @@ -7,9 +7,9 @@ class UploadCreator TYPES_TO_CROP ||= %w{avatar card_background custom_emoji profile_background}.each(&:freeze) ALLOWED_SVG_ELEMENTS ||= %w{ - circle clippath defs ellipse feGaussianBlur filter g line linearGradient + circle clipPath defs ellipse feGaussianBlur filter g line linearGradient marker path polygon polyline radialGradient rect stop style svg text - textpath tref tspan use + textPath tref tspan use }.each(&:freeze) include ActiveSupport::Deprecation::DeprecatedConstantAccessor From daefa3d25aaa8b5595045cd798cf3193d2b80a52 Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Tue, 8 Dec 2020 01:18:02 +0100 Subject: [PATCH 054/393] UX: makes sk components full width on users admin page (#11413) --- app/assets/stylesheets/common/admin/users.scss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/common/admin/users.scss b/app/assets/stylesheets/common/admin/users.scss index 28a8612c01..42ab09fe09 100644 --- a/app/assets/stylesheets/common/admin/users.scss +++ b/app/assets/stylesheets/common/admin/users.scss @@ -151,10 +151,11 @@ align-items: flex-start; .field, .value { - width: unset; + width: 100%; } + .select-kit { - width: 300px; + width: 100%; } } From 1cf057fb1c4e168ce441ddde918636725abeb668 Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Tue, 8 Dec 2020 11:46:34 +1100 Subject: [PATCH 055/393] DEV: lint file We enforce ordering of imports in our linter, missed this on a merge --- .../tests/integration/components/site-header-test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/tests/integration/components/site-header-test.js b/app/assets/javascripts/discourse/tests/integration/components/site-header-test.js index 5481456e36..7f61b95b42 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/site-header-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/site-header-test.js @@ -1,10 +1,10 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; import { discourseModule, queryAll, } from "discourse/tests/helpers/qunit-helpers"; -import componentTest, { - setupRenderingTest, -} from "discourse/tests/helpers/component-test"; import pretender from "discourse/tests/helpers/create-pretender"; discourseModule("Integration | Component | site-header", function (hooks) { From a19a3adf9e7688c7b0dd9691a0c1fbf851dd5cd3 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Tue, 8 Dec 2020 18:41:26 +0530 Subject: [PATCH 056/393] DEV: no need to iterate through each tag for rendering (#11428) This commit allows discourse-assign plugin to show assigned user next to tags. --- .../discourse/app/templates/full-page-search.hbs | 4 +--- app/assets/stylesheets/common/base/search.scss | 16 +++++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/discourse/app/templates/full-page-search.hbs b/app/assets/javascripts/discourse/app/templates/full-page-search.hbs index f95bc36dc7..37898b35e4 100644 --- a/app/assets/javascripts/discourse/app/templates/full-page-search.hbs +++ b/app/assets/javascripts/discourse/app/templates/full-page-search.hbs @@ -104,9 +104,7 @@ {{category-link result.topic.category.parentCategory}} {{/if}} {{category-link result.topic.category hideParent=true}} - {{#each result.topic.tags as |tag|}} - {{discourse-tag tag isPrivateMessage=isPrivateMessage}} - {{/each}} + {{discourse-tags result.topic}} {{plugin-outlet name="full-page-search-category" args=(hash result=result)}} diff --git a/app/assets/stylesheets/common/base/search.scss b/app/assets/stylesheets/common/base/search.scss index e4d85303ac..ed441c964c 100644 --- a/app/assets/stylesheets/common/base/search.scss +++ b/app/assets/stylesheets/common/base/search.scss @@ -226,6 +226,17 @@ } } + .discourse-tags { + flex-wrap: wrap; + display: inline-flex; + font-weight: normal; + + .discourse-tag.simple { + font-size: $font-down-1; + margin-right: 0.25em; + } + } + input[type="checkbox"] { margin-top: 0; margin-left: 0; @@ -277,11 +288,6 @@ } } } - - .discourse-tag.simple { - font-size: $font-down-1; - margin-right: 0.25em; - } } .no-results-suggestion { From f62ea776667552e1be3a669bd21416ef2d6c6f2e Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Tue, 8 Dec 2020 20:35:46 +0530 Subject: [PATCH 057/393] Revert "DEV: no need to iterate through each tag for rendering" (#11432) This reverts commit a19a3adf9e7688c7b0dd9691a0c1fbf851dd5cd3. Need to look into failing tests. --- .../discourse/app/templates/full-page-search.hbs | 4 +++- app/assets/stylesheets/common/base/search.scss | 16 +++++----------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/app/assets/javascripts/discourse/app/templates/full-page-search.hbs b/app/assets/javascripts/discourse/app/templates/full-page-search.hbs index 37898b35e4..f95bc36dc7 100644 --- a/app/assets/javascripts/discourse/app/templates/full-page-search.hbs +++ b/app/assets/javascripts/discourse/app/templates/full-page-search.hbs @@ -104,7 +104,9 @@ {{category-link result.topic.category.parentCategory}} {{/if}} {{category-link result.topic.category hideParent=true}} - {{discourse-tags result.topic}} + {{#each result.topic.tags as |tag|}} + {{discourse-tag tag isPrivateMessage=isPrivateMessage}} + {{/each}} {{plugin-outlet name="full-page-search-category" args=(hash result=result)}} diff --git a/app/assets/stylesheets/common/base/search.scss b/app/assets/stylesheets/common/base/search.scss index ed441c964c..e4d85303ac 100644 --- a/app/assets/stylesheets/common/base/search.scss +++ b/app/assets/stylesheets/common/base/search.scss @@ -226,17 +226,6 @@ } } - .discourse-tags { - flex-wrap: wrap; - display: inline-flex; - font-weight: normal; - - .discourse-tag.simple { - font-size: $font-down-1; - margin-right: 0.25em; - } - } - input[type="checkbox"] { margin-top: 0; margin-left: 0; @@ -288,6 +277,11 @@ } } } + + .discourse-tag.simple { + font-size: $font-down-1; + margin-right: 0.25em; + } } .no-results-suggestion { From 9df2bce5384291876935a4da1c02ffe379be647c Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Tue, 8 Dec 2020 17:34:28 +0200 Subject: [PATCH 058/393] FIX: Generate correct prev and next topics page URL (#11431) It did not work well for category + tags pages. --- app/controllers/tags_controller.rb | 13 ++++++------- spec/requests/tags_controller_spec.rb | 7 +++++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index ea4909f38f..3fe3019e97 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -409,8 +409,6 @@ class TagsController < ::ApplicationController end def construct_url_with(action, opts) - method = url_method(opts) - page_params = case action when :prev @@ -421,13 +419,13 @@ class TagsController < ::ApplicationController raise "unreachable" end - if page_params.include?(:category_slug_path_with_id) - opts = opts.dup - opts.delete(:category) - end + opts = opts.merge(page_params) + opts.delete(:category) if opts.include?(:category_slug_path_with_id) + + method = url_method(opts) begin - url = public_send(method, opts.merge(page_params)) + url = public_send(method, opts) rescue ActionController::UrlGenerationError raise Discourse::NotFound end @@ -451,6 +449,7 @@ class TagsController < ::ApplicationController q: params[:q] ) options[:no_subcategories] = true if params[:no_subcategories] == 'true' + options[:per_page] = params[:per_page].to_i.clamp(1, 30) if params[:per_page].present? if params[:tag_id] == 'none' options.delete(:tags) diff --git a/spec/requests/tags_controller_spec.rb b/spec/requests/tags_controller_spec.rb index ffcbe86a3a..8a9ace93cb 100644 --- a/spec/requests/tags_controller_spec.rb +++ b/spec/requests/tags_controller_spec.rb @@ -204,6 +204,13 @@ describe TagsController do expect(topic_ids).to_not include(topic_out_of_category.id) expect(topic_ids).to_not include(topic_in_category_without_tag.id) end + + it "should produce the right next topic URL" do + get "/tags/c/#{category.slug_path.join("/")}/#{category.id}/#{tag.name}.json?per_page=1" + + expect(response.parsed_body['topic_list']['more_topics_url']) + .to start_with("/tags/c/#{category.slug_path.join('/')}/#{category.id}/#{tag.name}") + end end context "with a subcategory in the path" do From 7a079b9e3be47ae3920e23a7e847c5f2ef7fff50 Mon Sep 17 00:00:00 2001 From: Discourse Translator Bot Date: Tue, 8 Dec 2020 16:51:49 +0100 Subject: [PATCH 059/393] Update translations (#11429) --- config/locales/client.bs_BA.yml | 1 - config/locales/client.ca.yml | 1 - config/locales/client.cs.yml | 1 - config/locales/client.da.yml | 1 - config/locales/client.de.yml | 9 +++--- config/locales/client.el.yml | 1 - config/locales/client.es.yml | 1 - config/locales/client.fa_IR.yml | 1 - config/locales/client.fi.yml | 1 - config/locales/client.fr.yml | 1 - config/locales/client.he.yml | 3 +- config/locales/client.hu.yml | 1 - config/locales/client.hy.yml | 1 - config/locales/client.it.yml | 2 +- config/locales/client.ko.yml | 8 ++++-- config/locales/client.nb_NO.yml | 1 - config/locales/client.nl.yml | 3 +- config/locales/client.pl_PL.yml | 3 +- config/locales/client.pt.yml | 1 - config/locales/client.pt_BR.yml | 1 - config/locales/client.ro.yml | 2 -- config/locales/client.ru.yml | 22 +++++++------- config/locales/client.sl.yml | 1 - config/locales/client.sv.yml | 3 +- config/locales/client.sw.yml | 1 - config/locales/client.th.yml | 1 - config/locales/client.tr_TR.yml | 1 - config/locales/client.uk.yml | 1 - config/locales/client.ur.yml | 1 - config/locales/client.vi.yml | 1 - config/locales/client.zh_CN.yml | 3 +- config/locales/client.zh_TW.yml | 1 - config/locales/server.he.yml | 1 + config/locales/server.it.yml | 1 + config/locales/server.ko.yml | 51 +++++++++++++++++---------------- config/locales/server.nl.yml | 2 ++ config/locales/server.pl_PL.yml | 1 + config/locales/server.pt_BR.yml | 1 + config/locales/server.ru.yml | 1 + config/locales/server.sv.yml | 1 + config/locales/server.zh_CN.yml | 1 + 41 files changed, 67 insertions(+), 73 deletions(-) diff --git a/config/locales/client.bs_BA.yml b/config/locales/client.bs_BA.yml index a3e61ed21e..71ce8691cd 100644 --- a/config/locales/client.bs_BA.yml +++ b/config/locales/client.bs_BA.yml @@ -1765,7 +1765,6 @@ bs_BA: label: "Nova tema" shared_draft: label: "Dijeljena skica" - desc: "Skiciraj temu koja će biti vidljiva samo administratorima" toggle_topic_bump: label: "Toggle topic bump" desc: "Odgovori bez izmjene zadnjeg datuma odgovora" diff --git a/config/locales/client.ca.yml b/config/locales/client.ca.yml index c37a3ce056..3614d0a60e 100644 --- a/config/locales/client.ca.yml +++ b/config/locales/client.ca.yml @@ -1630,7 +1630,6 @@ ca: label: "Tema nou" shared_draft: label: "Esborrany compartit" - desc: "Esborrany d'un tema que sols serà visible a l'equip responsable" toggle_topic_bump: label: "Commuta l'elevació del tema" desc: "Respon sense canviar la data més recent de resposta" diff --git a/config/locales/client.cs.yml b/config/locales/client.cs.yml index 45109f7219..a5af983f50 100644 --- a/config/locales/client.cs.yml +++ b/config/locales/client.cs.yml @@ -1391,7 +1391,6 @@ cs: label: "Nové téma" shared_draft: label: "Sdílený koncept" - desc: "Navrhnout téma, které uvidí pouze redakce" toggle_topic_bump: label: "Přepnout zvýraznění tématu" desc: "Odpovědět bez ovlivnění data poslední odpovědi" diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml index 4fd39e5d27..1250527575 100644 --- a/config/locales/client.da.yml +++ b/config/locales/client.da.yml @@ -1537,7 +1537,6 @@ da: label: "Nyt emne" shared_draft: label: "Delt Kladde" - desc: "Lav en kladde til et emne, der kun er synligt for hjælperteam" toggle_topic_bump: label: "Slå emne 'bump' til/fra" desc: "Svar uden at ændre den seneste svardato" diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml index d5e7c25f51..8aacf0894a 100644 --- a/config/locales/client.de.yml +++ b/config/locales/client.de.yml @@ -732,13 +732,13 @@ de: muted: title: "Stummgeschaltet" description: "Du erhältst keine Benachrichtigungen im Zusammenhang mit Nachrichten in dieser Gruppe." - flair_url: "Avatar-Hintergrund" + flair_url: "Avatar-Flair Bild" flair_upload_description: "Verwende quadratische Bilder, die nicht kleiner als 20 x 20 Pixel sind." - flair_bg_color: "Avatar-Hintergrundfarbe" + flair_bg_color: "Avatar-Flair Hintergrundfarbe" flair_bg_color_placeholder: "(Optional) Hex-Farbwert" - flair_color: "Avatar-Hintergrundfarbe" + flair_color: "Avatar-Flair Farbe" flair_color_placeholder: "(Optoinal) Hex-Farbwert" - flair_preview_icon: "Vorschau-Icon" + flair_preview_icon: "Vorschau Symbol" flair_preview_image: "Vorschaubild" flair_type: icon: "Wähle ein Symbol" @@ -1815,7 +1815,6 @@ de: label: "Neues Thema" shared_draft: label: "Gemeinsame Vorlage" - desc: "Entwerfe ein Thema, das nur für das Team sichtbar ist." toggle_topic_bump: label: "Bump des Themas umschalten" desc: "Antworten ohne das Datum der neuesten Antwort zu ändern" diff --git a/config/locales/client.el.yml b/config/locales/client.el.yml index 7b5c051d02..bd88a3f4bf 100644 --- a/config/locales/client.el.yml +++ b/config/locales/client.el.yml @@ -1734,7 +1734,6 @@ el: label: "Νέο Νήμα" shared_draft: label: "Κοινόχρηστο προσχέδιο" - desc: "Προσχέδιο ενός θέματος που θα είναι ορατό μόνο στο προσωπικό" toggle_topic_bump: label: "Εναλλαγή ώθησης θέματος" desc: "Απάντηση χωρίς αλλαγή της τελευταίας ημερομηνίας απάντησης" diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml index 656b12340c..76d6229e06 100644 --- a/config/locales/client.es.yml +++ b/config/locales/client.es.yml @@ -1812,7 +1812,6 @@ es: label: "Crear tema" shared_draft: label: "Borrador compartido" - desc: "Crea un borrador que solo será visible por el staff" toggle_topic_bump: label: "Alternar bump del tema" desc: "Responder sin alterar la fecha de última respuesta" diff --git a/config/locales/client.fa_IR.yml b/config/locales/client.fa_IR.yml index dc58849286..9625940a02 100644 --- a/config/locales/client.fa_IR.yml +++ b/config/locales/client.fa_IR.yml @@ -1636,7 +1636,6 @@ fa_IR: label: "موضوع جدید" shared_draft: label: "درفت اشتراکی" - desc: "درفت یک مبحث که تنها توسط کارکنان قابل مشاهده است" toggle_topic_bump: label: "فعالسازی بالا آوردن مبحث در لیست" desc: "بدون تغییر زمان اخرین پاسخ، پاسخ دهید." diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml index 0b28562e60..ca401335da 100644 --- a/config/locales/client.fi.yml +++ b/config/locales/client.fi.yml @@ -1709,7 +1709,6 @@ fi: label: "Uusi ketju" shared_draft: label: "Jaettu luonnos" - desc: "Luonnostele ketju, joka näkyy vain henkilökunnalle" toggle_topic_bump: label: "Ketjun nosto päälle/pois" desc: "Vastaa muuttamatta ketjun viimeisin viesti -aikaleimaa" diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml index 949f720f2f..0c3f5e6c59 100644 --- a/config/locales/client.fr.yml +++ b/config/locales/client.fr.yml @@ -1721,7 +1721,6 @@ fr: label: "Nouveau sujet" shared_draft: label: "Brouillon partagé" - desc: "Créer un brouillon de sujet qui ne sera visible qu'aux responsables" toggle_topic_bump: label: "Basculer l'actualisation du sujet" desc: "Répondre sans changer la date de dernière réponse" diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml index 40656145c2..ab1fd80d1f 100644 --- a/config/locales/client.he.yml +++ b/config/locales/client.he.yml @@ -469,6 +469,7 @@ he: topic: "נושא:" filtered_topic: "סיננת לתוכן שממתין לסקירה בנושא מסוים." filtered_user: "משתמש" + filtered_reviewed_by: "נסקר על ידי" show_all_topics: "להציג את כל הנושאים" deleted_post: "(פוסט נמחק)" deleted_user: "(משתמש נמחק)" @@ -1941,7 +1942,7 @@ he: label: "נושא חדש" shared_draft: label: "טיוטה משותפת" - desc: "יצירת טיוטה לנושא שרק חברי הסגל יוכלו לראות" + desc: "יצירת טיוטה לנושא שרק משתמשים מורשים יוכלו לראות" toggle_topic_bump: label: "החלפת מצב הקפצת נושא" desc: "הגב מבלי לשנות את תאריך התגובה האחרונה" diff --git a/config/locales/client.hu.yml b/config/locales/client.hu.yml index 63dd1cf5c3..7bc7225a6e 100644 --- a/config/locales/client.hu.yml +++ b/config/locales/client.hu.yml @@ -1474,7 +1474,6 @@ hu: label: "Új téma" shared_draft: label: "Megsztott vázlat" - desc: "Csak olyan témákat soroljon be amik csak a személyzet által láthatóak" notifications: tooltip: regular: diff --git a/config/locales/client.hy.yml b/config/locales/client.hy.yml index 70f6d83e09..8d098088d5 100644 --- a/config/locales/client.hy.yml +++ b/config/locales/client.hy.yml @@ -1583,7 +1583,6 @@ hy: label: "Նոր Թեմա" shared_draft: label: "Ստեղծել Կիսված Սևագիր" - desc: "Սևագրեք թեմա, որը տեսանելի կլինի միայն անձնակազմին" toggle_topic_bump: label: "Փոխանջատել թեմայի բարձրացումը " desc: "Պատասխանել՝ առանց պատասխանի վերջին ամսաթիվը փոխելու" diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml index fcefdba708..5a87affe64 100644 --- a/config/locales/client.it.yml +++ b/config/locales/client.it.yml @@ -411,6 +411,7 @@ it: topic: "Argomento:" filtered_topic: "Hai filtrato il contenuto revisionabile in un singolo Argomento" filtered_user: "Utente" + filtered_reviewed_by: "Revisionato da" show_all_topics: "mostra tutti gli argomenti" deleted_post: "(messaggio eliminato)" deleted_user: "(utente eliminato)" @@ -1809,7 +1810,6 @@ it: label: "Nuovo Argomento" shared_draft: label: "Bozza Condivisa" - desc: "Prepara la bozza di un argomento che sarà visibile solo allo Staff" toggle_topic_bump: label: "Commuta riproposizione argomenti" desc: "Rispondi senza cambiare la data dell'ultima risposta" diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index 0e18e9e13e..746477e433 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -382,6 +382,7 @@ ko: topic: "글:" filtered_topic: "한 글에서 검토 가능한 콘텐츠로 필터링했습니다." filtered_user: "사용자" + filtered_reviewed_by: "검토자" show_all_topics: "모든 글 보기" deleted_post: "(게시물 삭제됨)" deleted_user: "(사용자 삭제됨)" @@ -1752,7 +1753,7 @@ ko: label: "새 글" shared_draft: label: "공유 초안" - desc: "관리자만 볼 수있는 글 초안 작성" + desc: "허용된 사용자만 볼 수 있는 글 초안 작성" toggle_topic_bump: label: "글 범프 전환" desc: "최신 회신 날짜를 변경하지 않고 회신" @@ -2727,7 +2728,7 @@ ko: flagging: title: "우리 커뮤니티 질서를 지키는데 도와주셔서 감사합니다!" action: "글 신고했습니다" - take_action: "조치 수행..." + take_action: "조치하기..." take_action_options: default: title: "조치하기" @@ -3670,6 +3671,7 @@ ko: check_for_updates: "업데이트 체크하기" updating: "업데이트 중..." up_to_date: "테마가 최신입니다, 마지막으로 체크한 일시:" + has_overwritten_history: "강제 푸시로 Git 기록을 덮어 썼으므로 현재 테마 버전이 더 이상 존재하지 않습니다." add: "추가" theme_settings: "테마 설정" no_settings: "이 테마에는 설정이 없습니다." @@ -3769,7 +3771,7 @@ ko: description: "글 삭제 등에 사용되는 강조색" success: name: "성공" - description: "동작이 성공적으로 수행되었음을 알립니다." + description: "작업이 성공했음을 나타내는데 사용됩니다." love: name: "사랑" description: "좋아요 버튼 색" diff --git a/config/locales/client.nb_NO.yml b/config/locales/client.nb_NO.yml index 6be0975e2f..c427f97f1d 100644 --- a/config/locales/client.nb_NO.yml +++ b/config/locales/client.nb_NO.yml @@ -1353,7 +1353,6 @@ nb_NO: label: "Nytt emne" shared_draft: label: "Delt kladd" - desc: "Lag et emneutkast som kun er synlig for staben" toggle_topic_bump: label: "Slå på/av at emnet flyttes øverst" notifications: diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml index ac11c4362c..b4fbd511c1 100644 --- a/config/locales/client.nl.yml +++ b/config/locales/client.nl.yml @@ -411,6 +411,7 @@ nl: topic: "Topic:" filtered_topic: "U hebt op beoordeelbare inhoud in één topic gefilterd." filtered_user: "Gebruiker" + filtered_reviewed_by: "Beoordeeld door" show_all_topics: "alle topics tonen" deleted_post: "(bericht verwijderd)" deleted_user: "(gebruiker verwijderd)" @@ -1815,7 +1816,7 @@ nl: label: "Nieuw topic" shared_draft: label: "Gedeeld concept" - desc: "Een concepttopic maken dat alleen zichtbaar is voor stafleden" + desc: "Een concepttopic maken dat alleen zichtbaar is voor toegestane gebruikers" toggle_topic_bump: label: "Topicbump in-/uitschakelen" desc: "Antwoorden zonder datum van laatste antwoord te wijzigen" diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml index ce6b8c3cae..b52e07bec5 100644 --- a/config/locales/client.pl_PL.yml +++ b/config/locales/client.pl_PL.yml @@ -469,6 +469,7 @@ pl_PL: topic: "Temat:" filtered_topic: "Przefiltrowałeś do przeglądalnej zawartości w jednym temacie." filtered_user: "Użytkownik" + filtered_reviewed_by: "Sprawdzony przez" show_all_topics: "pokaż wszystkie tematy" deleted_post: "(wpis usunięty)" deleted_user: "(użytkownik usunięty)" @@ -1940,7 +1941,7 @@ pl_PL: label: "Nowy temat" shared_draft: label: "Udostępniony projekt" - desc: "Opracuj temat, który będzie widoczny tylko dla zespołu zarządzającego" + desc: "Szkicuj temat, który będzie widoczny tylko dla uprawnionych użytkowników" toggle_topic_bump: label: "Przełącz wypukłość tematu" desc: "Odpowiedz bez zmiany ostatniej daty odpowiedzi" diff --git a/config/locales/client.pt.yml b/config/locales/client.pt.yml index 9f6f213ade..5b0aac35a7 100644 --- a/config/locales/client.pt.yml +++ b/config/locales/client.pt.yml @@ -1529,7 +1529,6 @@ pt: label: "Novo Tópico" shared_draft: label: "Rascunho Partilhado" - desc: "Escrever um rascunho de tópico que só pode ser visível pela equipa do site" toggle_topic_bump: label: "Alterar possibilidade de bump de tópico" desc: "Responder sem alterar a data de última resposta" diff --git a/config/locales/client.pt_BR.yml b/config/locales/client.pt_BR.yml index 23283f8064..9e67fcc2a3 100644 --- a/config/locales/client.pt_BR.yml +++ b/config/locales/client.pt_BR.yml @@ -1693,7 +1693,6 @@ pt_BR: label: "Novo Tópico" shared_draft: label: "Rascunho Compartilhado" - desc: "Elabore um tópico que será visível somente para a staff" toggle_topic_bump: label: "Alternar promoção de tópico" desc: "Responder sem alterar a data da última resposta" diff --git a/config/locales/client.ro.yml b/config/locales/client.ro.yml index 1c2d401450..07e06a1c99 100644 --- a/config/locales/client.ro.yml +++ b/config/locales/client.ro.yml @@ -1487,8 +1487,6 @@ ro: desc: Răspundeți subiectului, nu unei anumite postări create_topic: label: "Discuție nouă" - shared_draft: - desc: "Pregătește o ciornă a unei discuții care va fi vizibilă doar pentru personal" toggle_topic_bump: label: "Comută bump pentru subiect" reload: "Reîncarcă" diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml index 4418520ea5..07851f99de 100644 --- a/config/locales/client.ru.yml +++ b/config/locales/client.ru.yml @@ -420,21 +420,21 @@ ru: in_reply_to: "Посмотреть обсуждение" explain: why: "Объяснить, почему этот элемент оказался в очереди" - title: "Обзорная оценка" + title: "Оценка содержимого" formula: "Формула" subtotal: "Промежуточный итог" total: "Всего" - min_score_visibility: "Минимальная оценка для видимости" + min_score_visibility: "Минимальная оценка для показа сообщения" score_to_hide: "Оценка, чтобы скрыть сообщение" take_action_bonus: name: "принята мера" title: "Когда сотрудник решает принять меры, жалоба получает бонус." user_accuracy_bonus: name: "точность пользователя" - title: "Пользователи, чьи жалобы были согласованы, получают бонус." + title: "Пользователи, чьи жалобы были удовлетворены, получают бонус." trust_level_bonus: name: "Уровень доверия" - title: "Проверяемые элементы, созданные пользователями с более высоким уровнем доверия, имеют более высокий балл." + title: "Элементы, проверяемые пользователями с более высоким уровнем доверия, имеют более высокий балл." type_bonus: name: "тип бонуса" title: "Некоторые проверяемые типы могут быть назначены бонус сотрудниками, чтобы сделать их более приоритетными." @@ -454,12 +454,12 @@ ru: save_changes: "Сохранить изменения" title: "Настройки" priorities: - title: "Обзорные приоритеты" + title: "Приоритеты проверяемых элементов" moderation_history: "История модерации" view_all: "Посмотреть всё" grouped_by_topic: "Группировать по темам" none: "Нет элементов для премодерации." - view_pending: "Просмотр сообщений, ожидающих подтверждения" + view_pending: "Просмотр сообщений, ожидающих проверки" topic_has_pending: one: "В этой теме %{count} сообщение ожидает проверки" few: "В этой теме %{count} сообщения ожидают проверки" @@ -467,8 +467,9 @@ ru: other: "В этой теме %{count} сообщений ожидают проверки" title: "Премодерация" topic: "Тема:" - filtered_topic: "Вы отфильтровали для просмотра содержимое в одной теме." + filtered_topic: "Вы отфильтровали проверяемый контент в рамках одной темы." filtered_user: "Пользователь" + filtered_reviewed_by: "Проверено" show_all_topics: "показать все темы" deleted_post: "(сообщение удалено)" deleted_user: "(пользователь удалён)" @@ -503,7 +504,7 @@ ru: topics: topic: "Тема" reviewable_count: "Количество" - reported_by: "Сообщает" + reported_by: "Жалоба от" deleted: "[Тема удалена]" original: "(оригинальная тема)" details: "подробности" @@ -568,7 +569,7 @@ ru: types: reviewable_flagged_post: title: "На это сообщение поступила жалоба" - flagged_by: "Кем отмечено" + flagged_by: "Кто пожаловался" reviewable_queued_topic: title: "Тема в очереди" reviewable_queued_post: @@ -1941,7 +1942,6 @@ ru: label: "Новая тема" shared_draft: label: "Общий черновик" - desc: "Черновик темы, который будет виден только сотрудникам" toggle_topic_bump: label: "Не поднимать тему" desc: "Ответить без изменения даты последнего ответа" @@ -3366,7 +3366,7 @@ ru: others_count: "Другие с этой наградой (%{count})" title: Награды allow_title: "Вы можете использовать эту награду в качестве титула." - multiple_grant: "Вы можете получить её несколько раз" + multiple_grant: "Вы можете получить эту награду несколько раз" badge_count: one: "%{count} награда" few: "%{count} награды" diff --git a/config/locales/client.sl.yml b/config/locales/client.sl.yml index ad4e106b70..bfa2f780de 100644 --- a/config/locales/client.sl.yml +++ b/config/locales/client.sl.yml @@ -1828,7 +1828,6 @@ sl: label: "Nova tema" shared_draft: label: "Skupen osnutek" - desc: "Ustvari osnutek teme, ki bo viden samo osebju" toggle_topic_bump: label: "Preklopi izpostavljanje teme" desc: "Odgovori brez da spremeniš čas zadnjega odgovora" diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml index 12775ffc97..14a6192388 100644 --- a/config/locales/client.sv.yml +++ b/config/locales/client.sv.yml @@ -411,6 +411,7 @@ sv: topic: "Ämne:" filtered_topic: "Du har filtrerat för granskning av innehåll i ett enskilt ämne." filtered_user: "Användare" + filtered_reviewed_by: "Granskade av" show_all_topics: "visa alla ämnen" deleted_post: "(inlägg raderat)" deleted_user: "(användare raderad)" @@ -1815,7 +1816,7 @@ sv: label: "Nytt ämne" shared_draft: label: "Delat utkast" - desc: "Utarbeta ett ämne som endast är synligt för personalen" + desc: "Skapa ett utkast av ett ämne vilket enbart kommer vara synligt för tillåtna användare" toggle_topic_bump: label: "Växla ämnesknuff" desc: "Svara utan att ändra senaste svarsdatum" diff --git a/config/locales/client.sw.yml b/config/locales/client.sw.yml index 945d8ef2c4..dc856b4707 100644 --- a/config/locales/client.sw.yml +++ b/config/locales/client.sw.yml @@ -1265,7 +1265,6 @@ sw: label: "Mada Mpya" shared_draft: label: "Mswadajaribio Gawiza" - desc: "Mswadajaribio wa mada utakao onekana kwa wasaidizi tu" notifications: tooltip: regular: diff --git a/config/locales/client.th.yml b/config/locales/client.th.yml index dcab0dda1f..0ab4aec46a 100644 --- a/config/locales/client.th.yml +++ b/config/locales/client.th.yml @@ -1396,7 +1396,6 @@ th: label: "กระทู้ใหม่" shared_draft: label: "แบบร่างที่ถูกแบ่งปัน" - desc: "ร่างกระทู้ที่สามารถเห็นแค่ทีมงาน" toggle_topic_bump: desc: "ตอบกลับโดยไม่เปลี่ยนวันที่ตอบกลับล่าสุด" notifications: diff --git a/config/locales/client.tr_TR.yml b/config/locales/client.tr_TR.yml index ce3e8ba5c2..2029025097 100644 --- a/config/locales/client.tr_TR.yml +++ b/config/locales/client.tr_TR.yml @@ -1596,7 +1596,6 @@ tr_TR: label: "Yeni Konu" shared_draft: label: "Paylaşılan Taslak" - desc: "Sadece görevli tarafından görülebilecek bir konu tasarla" toggle_topic_bump: label: "Konu detaylarını değiştir" desc: "Son cevap tarihini değiştirmeden yanıtla" diff --git a/config/locales/client.uk.yml b/config/locales/client.uk.yml index 7339ae74c5..b9d2da19f5 100644 --- a/config/locales/client.uk.yml +++ b/config/locales/client.uk.yml @@ -1928,7 +1928,6 @@ uk: label: "Нова тема" shared_draft: label: "Загальний Проект" - desc: "Проект теми, яку буде видно тільки співробітникам" toggle_topic_bump: label: "Не піднімати тему" desc: "Відповісти без зміни дати останньої відповіді" diff --git a/config/locales/client.ur.yml b/config/locales/client.ur.yml index 7240f90bdb..724a8fac7f 100644 --- a/config/locales/client.ur.yml +++ b/config/locales/client.ur.yml @@ -1526,7 +1526,6 @@ ur: label: "نیا ٹاپک" shared_draft: label: "مشترکہ ڈرافٹ" - desc: "ایک ٹاپک ڈرافٹ کریں جو صرف سٹاف کو نظر آسکے" toggle_topic_bump: label: "ٹاپک بَمپ ٹَوگل کریں" desc: "تازہ ترین جواب کی تاریخ تبدیل کیے بغیر جواب دیں" diff --git a/config/locales/client.vi.yml b/config/locales/client.vi.yml index 536f1b07ce..c39f64937b 100644 --- a/config/locales/client.vi.yml +++ b/config/locales/client.vi.yml @@ -1749,7 +1749,6 @@ vi: label: "Chủ đề Mới" shared_draft: label: "Bản nháp được Chia sẻ" - desc: "Soạn thảo một chủ đề sẽ chỉ hiển thị cho nhân viên" toggle_topic_bump: label: "Chuyển đổi phần mở rộng chủ đề" desc: "Trả lời mà không thay đổi ngày trả lời gần nhất" diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml index c3ccf16682..d10ddd51be 100644 --- a/config/locales/client.zh_CN.yml +++ b/config/locales/client.zh_CN.yml @@ -382,6 +382,7 @@ zh_CN: topic: "主题:" filtered_topic: "您正在选择性地查看这一主题中的可审核内容。" filtered_user: "用户" + filtered_reviewed_by: "审核者" show_all_topics: "显示所有主题" deleted_post: "(已删除的帖子)" deleted_user: "(已删除的用户)" @@ -1752,7 +1753,7 @@ zh_CN: label: "新主题" shared_draft: label: "共享草稿" - desc: "起草一个只对管理人员可见的主题" + desc: "起草一个只对允许的用户可见的主题" toggle_topic_bump: label: "切换主题顶帖" desc: "回复但不改变最新回复的日期" diff --git a/config/locales/client.zh_TW.yml b/config/locales/client.zh_TW.yml index 05307ec83f..c2ff5716e6 100644 --- a/config/locales/client.zh_TW.yml +++ b/config/locales/client.zh_TW.yml @@ -1423,7 +1423,6 @@ zh_TW: label: "新增話題" shared_draft: label: "共享草稿" - desc: "建立只有管理員可見的話題草稿" toggle_topic_bump: label: "回應但不讓貼文浮上來" desc: "回覆而不改變最新回應日期" diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index d3dd1736d2..72ad7195d0 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -2094,6 +2094,7 @@ he: governing_law: "החוק המחייב" city_for_disputes: "עיר המחלוקת" shared_drafts_category: "הפעלת תכונת הטיוטות המשותפות על ידי הקצאת קטגוריה שתשמש לטובת טיוטות לנושאים. נושאים בקטגוריה זו יוסתרו מרשימות הנושאים לחברי הסגל." + shared_drafts_min_trust_level: "לאפשר למשתמשים לראות ולערוך טיוטות משותפות." push_notifications_prompt: "הצגת בקשה להסכמת המשתמש." push_notifications_icon: "סמל העיטור שמופיע בפינת ההתרעה. מומלץ PNG בצבעים אחידים עם שקיפות בגודל 96 × 96." base_font: "גופן בסיס לשימוש רוב הטקסט באתר. ערכות עיצוב יכולות לדרוס אותו באמצעות מאפיין ה־CSS‏ ‎`--font-family`‎." diff --git a/config/locales/server.it.yml b/config/locales/server.it.yml index ba8b5e8d04..43a7009e97 100644 --- a/config/locales/server.it.yml +++ b/config/locales/server.it.yml @@ -1951,6 +1951,7 @@ it: governing_law: "Diritto applicabile" city_for_disputes: "Sede per eventuali controversie" shared_drafts_category: "Abilita la funzione Bozze Condivise designando una categoria per le bozze di argomento. Gli argomenti in questa categoria verranno eliminati dagli elenchi di argomenti per gli utenti dello staff." + shared_drafts_min_trust_level: "Consenti agli utenti di visualizzare e modificare le bozze condivise." push_notifications_prompt: "Visualizza richiesta di consenso dell'utente." short_title: "Il titolo breve verrà utilizzato nella schermata iniziale dell'tente, nel programma di avvio o in altri contesti in cui lo spazio potrebbe essere limitato. Dovrebbe essere limitato a 12 caratteri." dashboard_general_tab_activity_metrics: "Scegli i report da visualizzare come metriche di attività nella scheda generale." diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml index 4231902892..b9b6e41047 100644 --- a/config/locales/server.ko.yml +++ b/config/locales/server.ko.yml @@ -141,7 +141,9 @@ ko: inclusion: 리스트에 없음 invalid: 올바르지 않음 is_invalid: "문장이 불분명합니다." + is_invalid_meaningful: "불분명해 보이지만, 대부분의 단어에 같은 문자가 계속해서 포함되어 있습니까?" is_invalid_unpretentious: "명확하지 않은 것 같습니다. 하나 이상의 단어가 매우 깁니다." + is_invalid_quiet: "명확하지 않은 것 같습니다. 모두 대문자로 입력 하시겠습니까?" invalid_timezone: "'%{tz}'은 (는) 유효한 시간대가 아닙니다" contains_censored_words: "검열된 단어가 있습니다: %{censored_words}" less_than: '%{count}보다 작아야 함' @@ -1340,15 +1342,15 @@ ko: allow_uncategorized_topics: "카테고리 없이 게시 허용. 주의: 카테고리 없는 글은 이 항목을 비활성화에 하기전에 카테고리 설정을 해야 합니다." allow_duplicate_topic_titles: "같은 제목의 동일한 주제 허용" allow_duplicate_topic_titles_category: "카테고리가 다른 경우 동일한 중복 제목을 가진 글을 허용합니다. allow_duplicate_topic_titles는 false 여야합니다." - unique_posts_mins: "같은 컨텐츠를 다시 글 할 수 있는 기간(분)" + unique_posts_mins: "사용자가 동일한 콘텐츠로 다시 글을 작성하기 위해서 필요한 시간(분)" educate_until_posts: "새로운 사용자가 글를 작성할 시 글 작성 방법에 대한 교육패널을 보여주는데, 해당 패널이 보여지는 초기 글 개수" title: "타이틀 태그에 쓰일 이 사이트의 이름" site_description: "이 사이트를 한 문장으로 설명해 주세요. 설명 메타태그에 사용됩니다." short_site_description: "홈페이지의 제목 태그에 사용 된 간단한 설명입니다." contact_email: "이 사이트를 담당하는 주요 담당자의 이메일 주소입니다. 긴급한 문제에 대한 / about 문의 양식뿐만 아니라 중요한 알림에 사용됩니다." contact_url: "이 사이트의 연락처 URL. 긴급한 문제에 대해서는 / about 문의 양식에 사용됩니다." - crawl_images: "제대로된 넓이와 높이를 추가하기 위해, 원격 URL로 부터 이미지를 회수해온다." - download_remote_images_to_local: "이미지를 다운로드하면 원격 이미지를 로컬이미지로 변경. 이미지가 깨지는 것을 막을 수 있습니다." + crawl_images: "원격 URL에서 이미지를 가져와 올바른 너비 및 높이 치수를 삽입합니다." + download_remote_images_to_local: "원격 이미지를 다운로드하여 로컬 이미지로 변환합니다. 이렇게 하면 이미지가 손상되지 않습니다." download_remote_images_threshold: "원격의 이미지를 로컬에 다운받기 위한 최소 디스크 공간(%)" disabled_image_download_domains: "이 도메인을 통해서 원격 이미지를 다운로드 하지 않는다. ` | `를 구분자로 한 리스트" editing_grace_period: "글 작성 후, 편집해도 히스토리에 남기지 않는 시간 (단위: 초)" @@ -1569,15 +1571,15 @@ ko: top_topics_formula_least_likes_per_post_multiplier: "인기 토픽 계산 공식에서 포스트당 최소 좋아요 가중치 설정: `log(views_count) * 2 + op_likes_count * 0.5 + LEAST(likes_count / posts_count, (n)) + 10 + log(posts_count)`" rebake_old_posts_count: "15분마다 HTML로 리빌드할 옛날 포스트의 수" enable_safe_mode: "사용자가 안전 모드로 들어가 플러그인을 디버깅 할 수 있도록합니다." - rate_limit_create_topic: "사용자가 글타래를 생성하고 난 후 다음 글타래를 생성할 때 까지의 대기 기간(초)" - rate_limit_create_post: "사용자가 포스팅을하고 난 후 다음 포스팅까지 대기 기간(초)" - rate_limit_new_user_create_topic: "새로운 사용자 글타래를 생성하고 난 후 다음 글타래를 생성할 때 까지의 대기 기간(초)" - rate_limit_new_user_create_post: "새로운 사용자 포스팅을하고 난 후 다음 포스팅까지 대기 기간(초)" + rate_limit_create_topic: "글을 작성 후 다른 글을 작성하기 위해서는 (n)초 동안 기다려야 합니다." + rate_limit_create_post: "사용자가 댓글 작성 후 다른 댓글을 작성하기 위해서는 (n)초를 기다려야합니다." + rate_limit_new_user_create_topic: "새로 가입한 사용자가 글을 작성 후 다른 글을 작성하기 위해서는 (n)초를 기다려야합니다." + rate_limit_new_user_create_post: "새로 가입한 사용자가 댓글을 작성 후 다른 댓글을 작성하기 위해서는 (n)초를 기다려야합니다." max_likes_per_day: "사용자가 하루동안 할 수 있는 최대 좋아요 개수" max_flags_per_day: "사용자가 하루동안 할 수 있는 최대 신고 개수" max_bookmarks_per_day: "사용자가 하루동안 할 수 있는 최대 북마크 개수" max_edits_per_day: "사용자가 하루동안 할 수 있는 최대 편집 수" - max_topics_per_day: "사용자가 하루동안 생성할 수 있는 최대 글타래 개수" + max_topics_per_day: "사용자가 하루에 작성 할 수 있는 최대 글 수입니다." max_personal_messages_per_day: "사용자가 하루에 작성 할 수있는 최대 새 개인 메시지 수입니다." max_invites_per_day: "하루에 보낼 수 있는 초대장의 최대치입니다." max_topic_invitations_per_day: "하루에 유저가 최대로 보낼 수 있는 글타래 초대장 수" @@ -1614,7 +1616,7 @@ ko: png_to_jpg_quality: "변환된 JPG 파일의 퀄리티(1은 최하, 99는 최상, 100은 해제)" recompress_original_jpg_quality: "업로드된 이미지 파일의 품질 (1은 최저 품질, 99는 최고 품질, 100은 사용하지 않도록 설정)" image_preview_jpg_quality: "크기가 조정된 이미지 파일의 품질 (1은 가장 낮은 품질, 99는 최고 품질, 100은 사용하지 않도록 설정)" - allow_staff_to_upload_any_file_in_pm: "운영진이 보내는 개인메시지에 모든 파일 첨부 허용" + allow_staff_to_upload_any_file_in_pm: "관리자는 개인메시지에 파일 첨부를 허용합니다." strip_image_metadata: "스트립 이미지 메타 데이터." min_ratio_to_crop: "큰 이미지를 자르는 데 사용되는 비율. 너비 / 높이의 결과를 입력하십시오." simultaneous_uploads: "글 작성기에서 끌어서 놓을 수 있는 최대 파일 수" @@ -1658,6 +1660,7 @@ ko: min_trust_level_to_allow_profile_background: "프로필 배경을 업로드하는데 필요한 최소 회원 레벨" min_trust_level_to_allow_user_card_background: "사용자 카드 배경을 업로드하는데 필요한 최소 회원 레벨" min_trust_level_to_allow_invite: "사용자를 초대하는 데 필요한 최소 회원 등급" + min_trust_level_to_allow_ignore: "사용자를 무시하는데 필요한 최소 회원등급" allowed_link_domains: "링크를 삽입 할 수 있는 레벨이 아닌 사용자가 연결할 수 있는 도메인" newuser_max_links: "새로운 사용자가 글에 붙일 수 있는 최대 링크 개수" newuser_max_embedded_media: "새 사용자가 게시물에 추가 할 수있는 미디어 항목 수입니다." @@ -1667,7 +1670,7 @@ ko: max_mentions_per_post: "글 당 사용할 수 있는 최대 @name 알림의 수" max_users_notified_per_group_mention: "그룹이 멘션을 받으면 알림을 받는 최대사용자의 수(최대치에 도달하면 알림이 전송되지 않음)" enable_mentions: "사용자가 다른 사용자를 언급 할 수 있도록합니다." - create_thumbnails: "글의 너무 큰 크기의 이미지는 thumnails와 lightbox를 만든다." + create_thumbnails: "게시물에 맞지 않는 큰 이미지는 썸네일 이미지와 라이트 박스 이미지를 만듭니다." email_time_window_mins: "알림 메일을 보내기 전 대기 기간(분), 사용자에게 글의 변경하고 완료할 수 있는 기회를 준다." personal_email_time_window_seconds: "개인 메시지 알림 이메일을 보내기 전에 사용자가 메시지를 편집하고 마무리 할 수 있도록 (n) 초 동안 기다리십시오." email_posts_context: "알림메일의 내용에 추가할 기존 답글 수" @@ -3481,13 +3484,13 @@ ko: 사이트 운영자는 조건에 따라 다른 서비스를 제공 할 수 있습니다. 이 약관은 사이트 이용에만 적용됩니다. - 건너 뛰기: + 바로가기: - - [Important Terms](#heading--important-terms) - - [Your Permission to Use the Forum](#heading--permission) - - [Conditions for Use of the Forum](#heading--conditions) - - [Acceptable Use](#heading--acceptable-use) - - [Content Standards](#heading--content-standards) + - [중요 용어](#heading--important-terms) + - [사이트 사용 권한](#heading--permission) + - [사이트 이용 조건](#heading--conditions) + - [허용되는 사용](#heading--acceptable-use) + - [콘텐츠 표준](#heading--content-standards) - [Enforcement](#heading--enforcement) - [Your Account](#heading--your-account) - [Your Content](#heading--your-content) @@ -3535,21 +3538,21 @@ ko: 7. 사용자님은 이 사이트와 제휴하거나 이 사이트의 보증을 받았다고 거짓으로 암시해서는 안됩니다. - 8. You may not hyperlink to images or other non-hypertext content on the forum on other webpages. + 8. 다른 웹 페이지의 포럼에있는 이미지 또는 기타 하이퍼 텍스트가 아닌 콘텐츠에 하이퍼 링크를 사용할 수 없습니다. - 9. You may not remove any marks showing proprietary ownership from materials you download from the forum. + 9. 포럼에서 다운로드 한 자료의 소유권을 나타내는 표시를 제거 할 수 없습니다. - 10. You may not show any part of the forum on other websites with ` + HTML + + md = PrettyText.format_for_email(html, post) + + expect(md).not_to include('This is a Vimeo link:

+

https://vimeo.com/1

+ HTML + end + end + describe "#strip_secure_media" do before do setup_s3 From 06077856ce39743592bcd46b7a0305ff6a287e9e Mon Sep 17 00:00:00 2001 From: Gerhard Schlager Date: Wed, 9 Dec 2020 15:22:53 +0100 Subject: [PATCH 070/393] FIX: Prevent usage of `composer-action-undefined` CSS class (#11445) --- .../javascripts/discourse/app/components/composer-body.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/app/components/composer-body.js b/app/assets/javascripts/discourse/app/components/composer-body.js index 7708f8287c..24f978c687 100644 --- a/app/assets/javascripts/discourse/app/components/composer-body.js +++ b/app/assets/javascripts/discourse/app/components/composer-body.js @@ -45,7 +45,7 @@ export default Component.extend(KeyEnterEscape, { @discourseComputed("composer.action") prefixedComposerAction(action) { - return `composer-action-${action}`; + return action ? `composer-action-${action}` : ""; }, @discourseComputed("currentUser.primary_group_name") From 521934f1638bf059bc4dc8b8522fbc86ce4cec6f Mon Sep 17 00:00:00 2001 From: Mark VanLandingham Date: Wed, 9 Dec 2020 10:54:41 -0600 Subject: [PATCH 071/393] FIX: Only cache reports with exceptions for 1 minute (#11447) --- app/controllers/admin/reports_controller.rb | 4 +-- app/models/report.rb | 3 ++- .../shared_examples_for_backup_store.rb | 2 +- spec/models/report_spec.rb | 27 +++++++++++++++++++ 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/app/controllers/admin/reports_controller.rb b/app/controllers/admin/reports_controller.rb index 5fc2544b48..e9be087108 100644 --- a/app/controllers/admin/reports_controller.rb +++ b/app/controllers/admin/reports_controller.rb @@ -42,7 +42,7 @@ class Admin::ReportsController < Admin::AdminController report = Report.find(report_type, args) if (report_params[:cache]) && report - Report.cache(report, 35.minutes) + Report.cache(report) end if report.blank? @@ -80,7 +80,7 @@ class Admin::ReportsController < Admin::AdminController raise Discourse::NotFound if report.blank? if (params[:cache]) - Report.cache(report, 35.minutes) + Report.cache(report) end render_json_dump(report: report) diff --git a/app/models/report.rb b/app/models/report.rb index 9a62774d9e..b0f97d7ae5 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -223,7 +223,8 @@ class Report Discourse.cache.read(cache_key(report)) end - def self.cache(report, duration) + def self.cache(report) + duration = report.error == :exception ? 1.minute : 35.minutes Discourse.cache.write(cache_key(report), report.as_json, expires_in: duration) end diff --git a/spec/lib/backup_restore/shared_examples_for_backup_store.rb b/spec/lib/backup_restore/shared_examples_for_backup_store.rb index 679bc9aa79..f6d3fbab3d 100644 --- a/spec/lib/backup_restore/shared_examples_for_backup_store.rb +++ b/spec/lib/backup_restore/shared_examples_for_backup_store.rb @@ -88,7 +88,7 @@ shared_examples "backup store" do report_type = "storage_stats" report = Report.find(report_type) - Report.cache(report, 35.minutes) + Report.cache(report) expect(Report.find_cached(report_type)).to be_present store.reset_cache diff --git a/spec/models/report_spec.rb b/spec/models/report_spec.rb index 576c713125..0b4c330af8 100644 --- a/spec/models/report_spec.rb +++ b/spec/models/report_spec.rb @@ -1237,6 +1237,33 @@ describe Report do end end + describe ".cache" do + let(:exception_report) { Report.find("exception_test", wrap_exceptions_in_test: true) } + let(:valid_report) { Report.find("valid_test", wrap_exceptions_in_test: true) } + + before(:each) do + class Report + def self.report_exception_test(report) + report.data = x + end + + def self.report_valid_test(report) + report.data = "success!" + end + end + end + + it "caches exception reports for 1 minute" do + Discourse.cache.expects(:write).with(Report.cache_key(exception_report), exception_report.as_json, { expires_in: 1.minute }) + Report.cache(exception_report) + end + + it "caches valid reports for 35 minutes" do + Discourse.cache.expects(:write).with(Report.cache_key(valid_report), valid_report.as_json, { expires_in: 35.minutes }) + Report.cache(valid_report) + end + end + describe "top_uploads" do context "with no data" do it "works" do From b572ca6da0c076f0733d7b72ba2819b4578a1009 Mon Sep 17 00:00:00 2001 From: Gerhard Schlager Date: Wed, 9 Dec 2020 18:14:33 +0100 Subject: [PATCH 072/393] FIX: Missing translation (#11444) Follow-up to 1960fc53 --- config/locales/client.en.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 7297a38a12..3952c25d50 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1830,7 +1830,6 @@ en: options: "Options" whisper: "whisper" unlist: "unlisted" - blockquote_text: "Blockquote" add_warning: "This is an official warning." toggle_whisper: "Toggle Whisper" @@ -1908,8 +1907,8 @@ en: link_dialog_title: "Insert Hyperlink" link_optional_text: "optional title" link_url_placeholder: "Paste a URL or type to search topics" - quote_title: "Blockquote" - quote_text: "Blockquote" + blockquote_title: "Blockquote" + blockquote_text: "Blockquote" code_title: "Preformatted text" code_text: "indent preformatted text by 4 spaces" paste_code_text: "type or paste code here" @@ -2975,10 +2974,10 @@ en: reply: "Reply" create: "Create" no_groups_selected: "No groups have been granted access; this category will only be visible to staff." - everyone_has_access: "This category is public, everyone can see, reply and create posts. To restrict permissions, remove one or more of the permissions granted to the \"everyone\" group." + everyone_has_access: 'This category is public, everyone can see, reply and create posts. To restrict permissions, remove one or more of the permissions granted to the "everyone" group.' toggle_reply: "Toggle Reply permission" toggle_full: "Toggle Create permission" - inherited: "This permission is inherited from \"everyone\"" + inherited: 'This permission is inherited from "everyone"' special_warning: "Warning: This category is a pre-seeded category and the security settings cannot be edited. If you do not wish to use this category, delete it instead of repurposing it." uncategorized_security_warning: "This category is special. It is intended as holding area for topics that have no category; it cannot have security settings." uncategorized_general_warning: 'This category is special. It is used as the default category for new topics that do not have a category selected. If you want to prevent this behavior and force category selection, please disable the setting here. If you want to change the name or description, go to Customize / Text Content.' From 538e1142e72fbb915b03ef6939671da2c00b22b3 Mon Sep 17 00:00:00 2001 From: Gerhard Schlager Date: Wed, 9 Dec 2020 18:14:45 +0100 Subject: [PATCH 073/393] FIX: Prevent error when primary email is missing (#11446) --- app/models/user.rb | 2 +- app/services/user_merger.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index f027593178..d2d35bbc16 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1240,7 +1240,7 @@ class User < ActiveRecord::Base end def email - primary_email.email + primary_email&.email end def email=(new_email) diff --git a/app/services/user_merger.rb b/app/services/user_merger.rb index d45da9dbee..989c67e796 100644 --- a/app/services/user_merger.rb +++ b/app/services/user_merger.rb @@ -369,7 +369,7 @@ class UserMerger def log_merge logger = StaffActionLogger.new(@acting_user || Discourse.system_user) - logger.log_user_merge(@target_user, @source_user.username, @source_primary_email) + logger.log_user_merge(@target_user, @source_user.username, @source_primary_email || "") end def update_user_id(table_name, opts = {}) From 0116897ac91f60759c8dadaa3a58b2d9cac6c48b Mon Sep 17 00:00:00 2001 From: Jordan Vidrine <30537603+jordanvidrine@users.noreply.github.com> Date: Wed, 9 Dec 2020 11:36:05 -0600 Subject: [PATCH 074/393] UI: Category Onebox styling changes (#11448) This commit adjusts the category one box styling to be more in line with the discourse categories UI. --- app/assets/stylesheets/common/base/onebox.scss | 5 +++++ lib/onebox/templates/discourse_category_onebox.mustache | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/common/base/onebox.scss b/app/assets/stylesheets/common/base/onebox.scss index 07dbe58677..750d1627f2 100644 --- a/app/assets/stylesheets/common/base/onebox.scss +++ b/app/assets/stylesheets/common/base/onebox.scss @@ -670,6 +670,11 @@ aside.onebox.stackexchange .onebox-body { margin-right: 0.5em; } } + &.category-onebox { + border: 1px solid var(--primary-low); + padding-left: calc(1em - 5px); + margin-left: 5px; + } } .onebox.gfycat p { diff --git a/lib/onebox/templates/discourse_category_onebox.mustache b/lib/onebox/templates/discourse_category_onebox.mustache index 68f41074ad..fb8ddd3300 100644 --- a/lib/onebox/templates/discourse_category_onebox.mustache +++ b/lib/onebox/templates/discourse_category_onebox.mustache @@ -1,10 +1,13 @@ -
+ + {{#if usernameDisabled}} {{accountUsername}} @@ -49,10 +63,17 @@
- + {{#if nameDisabled}} @@ -83,7 +104,14 @@ {{#if passwordRequired}}
+ + {{password-field value=accountPassword type="password" id="new-account-password" capsLockOn=capsLockOn}}
- + - + - {{#if siteSettings.enable_names}} + {{#if fullnameRequired}} - + diff --git a/app/assets/stylesheets/common/base/user.scss b/app/assets/stylesheets/common/base/user.scss index 272ce23aad..24a318e2fb 100644 --- a/app/assets/stylesheets/common/base/user.scss +++ b/app/assets/stylesheets/common/base/user.scss @@ -339,7 +339,6 @@ } } -.login-form, .user-field { .required { vertical-align: top; From cfb81b789537dc326ac544cf1b86874c426f6fc5 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 14 Dec 2020 09:39:10 +1100 Subject: [PATCH 103/393] FIX: show retina avatars on Chrome (#11480) chromium may report float device pixel ratio below 1.5 that is still clearly retina: ``` window.devicePixelRatio 1.4999998807907104 ``` We used to round this down to 1 and not provide these browsers with retina avatars. New algorithm is much more forgiving, anything over 1.1 gets 2x images, anything over 2.1 gets 3x images. --- app/assets/javascripts/discourse/app/lib/utilities.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/app/lib/utilities.js b/app/assets/javascripts/discourse/app/lib/utilities.js index a350d01181..6267aa8f21 100644 --- a/app/assets/javascripts/discourse/app/lib/utilities.js +++ b/app/assets/javascripts/discourse/app/lib/utilities.js @@ -59,7 +59,13 @@ export function avatarUrl(template, size) { export function getRawSize(size) { const pixelRatio = window.devicePixelRatio || 1; - return size * Math.min(3, Math.max(1, Math.round(pixelRatio))); + let rawSize = 1; + if (pixelRatio > 1.1 && pixelRatio < 2.1) { + rawSize = 2; + } else if (pixelRatio >= 2.1) { + rawSize = 3; + } + return size * rawSize; } export function avatarImg(options, customGetURL) { From b913afe5bb7bf0bc9c1bfdbcc26f081bfd758336 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Dec 2020 09:50:02 +1100 Subject: [PATCH 104/393] DEV: Bump bullet from 6.1.0 to 6.1.2 (#11478) Bumps [bullet](https://github.com/flyerhzm/bullet) from 6.1.0 to 6.1.2. - [Release notes](https://github.com/flyerhzm/bullet/releases) - [Changelog](https://github.com/flyerhzm/bullet/blob/master/CHANGELOG.md) - [Commits](https://github.com/flyerhzm/bullet/compare/6.1.0...6.1.2) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index ceca915e41..2065129294 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -75,7 +75,7 @@ GEM bootsnap (1.5.1) msgpack (~> 1.0) builder (3.2.4) - bullet (6.1.0) + bullet (6.1.2) activesupport (>= 3.0.0) uniform_notifier (~> 1.11) byebug (11.1.3) From a85d5edbf16d4fa5bc37b869190fb73bc5329906 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Mon, 14 Dec 2020 00:58:14 +0100 Subject: [PATCH 105/393] DEV: set digest_attempted_at during migrations (#11369) --- script/bulk_import/base.rb | 8 ++++---- script/import_scripts/base.rb | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/script/bulk_import/base.rb b/script/bulk_import/base.rb index 0d7ec65d06..261110a8ba 100644 --- a/script/bulk_import/base.rb +++ b/script/bulk_import/base.rb @@ -285,7 +285,7 @@ class BulkImport::Base user_id topics_entered time_read days_visited posts_read_count likes_given likes_received new_since read_faq first_post_created_at post_count topic_count bounce_score - reset_bounce_score_after + reset_bounce_score_after digest_attempted_at } USER_PROFILE_COLUMNS ||= %i{ @@ -435,7 +435,6 @@ class BulkImport::Base user_email[:updated_at] ||= user_email[:created_at] user_email[:email] ||= random_email user_email[:email].downcase! - user_email end @@ -451,11 +450,12 @@ class BulkImport::Base user_stat[:post_count] ||= 0 user_stat[:topic_count] ||= 0 user_stat[:bounce_score] ||= 0 + user_stat[:digest_attempted_at] ||= NOW user_stat end def process_user_profile(user_profile) - user_profile[:bio_raw] = (user_profile[:bio_raw].presence || "").scrub.strip.presence + user_profile[:bio_raw] = (user_profile[:bio_raw].presence || "").scrub.strip.presence user_profile[:bio_cooked] = pre_cook(user_profile[:bio_raw]) if user_profile[:bio_raw].present? user_profile[:views] ||= 0 user_profile @@ -494,7 +494,7 @@ class BulkImport::Base topic[:closed] ||= false topic[:views] ||= 0 topic[:created_at] ||= NOW - topic[:bumped_at] ||= topic[:created_at] + topic[:bumped_at] ||= topic[:created_at] topic[:updated_at] ||= topic[:created_at] topic end diff --git a/script/import_scripts/base.rb b/script/import_scripts/base.rb index bc780e6886..39530d7447 100644 --- a/script/import_scripts/base.rb +++ b/script/import_scripts/base.rb @@ -737,6 +737,10 @@ class ImportScripts::Base WHERE u1.user_id = user_stats.user_id AND user_stats.topic_count <> sub.topic_count SQL + + puts "", "Updating user digest_attempted_at..." + + DB.exec("UPDATE user_stats SET digest_attempted_at = now() WHERE digest_attempted_at IS NULL") end # scripts that are able to import last_seen_at from the source data should override this method From a7cc17cff7893dc9582c5b5b15ac30a43cbb558b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Dec 2020 10:35:50 +0000 Subject: [PATCH 106/393] Build(deps): Bump omniauth-google-oauth2 from 0.8.0 to 0.8.1 (#11479) Bumps [omniauth-google-oauth2](https://github.com/zquestz/omniauth-google-oauth2) from 0.8.0 to 0.8.1. - [Release notes](https://github.com/zquestz/omniauth-google-oauth2/releases) - [Changelog](https://github.com/zquestz/omniauth-google-oauth2/blob/master/CHANGELOG.md) - [Commits](https://github.com/zquestz/omniauth-google-oauth2/compare/v0.8.0...v0.8.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2065129294..9933355e50 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -222,8 +222,9 @@ GEM omniauth-github (1.4.0) omniauth (~> 1.5) omniauth-oauth2 (>= 1.4.0, < 2.0) - omniauth-google-oauth2 (0.8.0) + omniauth-google-oauth2 (0.8.1) jwt (>= 2.0) + oauth2 (~> 1.1) omniauth (>= 1.1.1) omniauth-oauth2 (>= 1.6) omniauth-oauth (1.1.0) From 2d51833ca95028065c50952813185a7ab3a73cb8 Mon Sep 17 00:00:00 2001 From: Dan Ungureanu Date: Mon, 14 Dec 2020 17:49:37 +0200 Subject: [PATCH 107/393] FIX: Make Oneboxer#apply insert block Oneboxes correctly (#11449) It used to insert block Oneboxes inside paragraphs which resulted in invalid HTML. This needed an additional parsing for removal of empty paragraphs and the resulting HTML could still be invalid. This commit ensure that block Oneboxes are inserted correctly, by splitting the paragraph containing the link and putting the block between the two. Paragraphs left with nothing but whitespaces will be removed. Follow up to 7f3a30d79fa63aca063e4186a21f983e23d759e8. --- lib/oneboxer.rb | 59 ++++++++++++------ spec/components/cooked_post_processor_spec.rb | 61 ++++++++----------- spec/components/excerpt_parser_spec.rb | 2 +- spec/components/oneboxer_spec.rb | 23 +++++++ spec/services/username_changer_spec.rb | 28 ++++----- spec/support/match_html_matcher.rb | 16 +++-- 6 files changed, 117 insertions(+), 72 deletions(-) diff --git a/lib/oneboxer.rb b/lib/oneboxer.rb index 3bf526a57f..eecc2a38d0 100644 --- a/lib/oneboxer.rb +++ b/lib/oneboxer.rb @@ -99,32 +99,57 @@ module Oneboxer each_onebox_link(doc, extra_paths: extra_paths) do |url, element| onebox, _ = yield(url, element) + next if onebox.blank? - if onebox - parsed_onebox = Nokogiri::HTML5::fragment(onebox) - next unless parsed_onebox.children.count > 0 + parsed_onebox = Nokogiri::HTML5::fragment(onebox) + next if parsed_onebox.children.blank? - if element&.parent&.node_name&.downcase == "p" && - element.parent.children.count == 1 && - HTML5_BLOCK_ELEMENTS.include?(parsed_onebox.children[0].node_name.downcase) - element = element.parent + changed = true + + parent = element.parent + if parent&.node_name&.downcase == "p" && + parsed_onebox.children.any? { |child| HTML5_BLOCK_ELEMENTS.include?(child.node_name.downcase) } + + siblings = parent.children + element_idx = siblings.find_index(element) + before_idx = first_significant_element_index(siblings, element_idx - 1, -1) + after_idx = first_significant_element_index(siblings, element_idx + 1, +1) + + if before_idx < 0 && after_idx >= siblings.size + parent.replace parsed_onebox + elsif before_idx < 0 + parent.children = siblings[after_idx..siblings.size] + parent.add_previous_sibling(parsed_onebox) + elsif after_idx >= siblings.size + parent.children = siblings[0..before_idx] + parent.add_next_sibling(parsed_onebox) + else + parent_rest = parent.dup + + parent.children = siblings[0..before_idx] + parent_rest.children = siblings[after_idx..siblings.size] + + parent.add_next_sibling(parent_rest) + parent.add_next_sibling(parsed_onebox) end - - changed = true - element.swap parsed_onebox.to_html - end - end - - # strip empty

elements - doc.css("p").each do |p| - if p.children.empty? && doc.children.count > 1 - p.remove + else + element.replace parsed_onebox end end Result.new(doc, changed) end + def self.first_significant_element_index(elements, index, step) + while index >= 0 && index < elements.size && + (elements[index].node_name.downcase == "br" || + (elements[index].node_name.downcase == "text" && elements[index].to_html.strip.blank?)) + index = index + step + end + + index + end + def self.is_previewing?(user_id) Discourse.redis.get(preview_key(user_id)) == "1" end diff --git a/spec/components/cooked_post_processor_spec.rb b/spec/components/cooked_post_processor_spec.rb index fd2cd6c782..93a2a42079 100644 --- a/spec/components/cooked_post_processor_spec.rb +++ b/spec/components/cooked_post_processor_spec.rb @@ -413,7 +413,7 @@ describe CookedPostProcessor do it "generates overlay information" do cpp.post_process - expect(cpp.html).to match_html <<~HTML.rstrip + expect(cpp.html).to match_html <<~HTML

HTML @@ -433,7 +433,7 @@ describe CookedPostProcessor do cpp.post_process - expect(cpp.html).to match_html <<~HTML.rstrip + expect(cpp.html).to match_html <<~HTML

HTML end @@ -449,7 +449,7 @@ describe CookedPostProcessor do cpp.post_process - expect(cpp.html).to match_html <<~HTML.rstrip + expect(cpp.html).to match_html <<~HTML

HTML end @@ -576,7 +576,7 @@ describe CookedPostProcessor do it "crops the image" do cpp.post_process - expect(cpp.html).to match_html <<~HTML.rstrip + expect(cpp.html).to match_html <<~HTML

HTML @@ -607,7 +607,7 @@ describe CookedPostProcessor do it "generates overlay information" do cpp.post_process - expect(cpp.html). to match_html <<~HTML.rstrip + expect(cpp.html). to match_html <<~HTML

HTML @@ -618,7 +618,7 @@ describe CookedPostProcessor do upload.update!(original_filename: ">.png") cpp.post_process - expect(cpp.html).to match_html <<~HTML.rstrip + expect(cpp.html).to match_html <<~HTML

HTML end @@ -644,7 +644,7 @@ describe CookedPostProcessor do it "generates overlay information using image title and ignores alt" do cpp.post_process - expect(cpp.html).to match_html <<~HTML.rstrip + expect(cpp.html).to match_html <<~HTML

HTML @@ -672,7 +672,7 @@ describe CookedPostProcessor do it "generates overlay information using image title" do cpp.post_process - expect(cpp.html).to match_html <<~HTML.rstrip + expect(cpp.html).to match_html <<~HTML

HTML @@ -700,7 +700,7 @@ describe CookedPostProcessor do it "generates overlay information using image alt" do cpp.post_process - expect(cpp.html).to match_html <<~HTML.rstrip + expect(cpp.html).to match_html <<~HTML

HTML @@ -1202,7 +1202,7 @@ describe CookedPostProcessor do it "uses schemaless url for uploads" do cpp.optimize_urls - expect(cpp.html).to match_html <<~HTML.rstrip + expect(cpp.html).to match_html <<~HTML

Link

Google
@@ -1217,7 +1217,7 @@ describe CookedPostProcessor do it "uses schemaless CDN url for http uploads" do Rails.configuration.action_controller.stubs(:asset_host).returns("http://my.cdn.com") cpp.optimize_urls - expect(cpp.html).to match_html <<~HTML.rstrip + expect(cpp.html).to match_html <<~HTML

Link

Google
@@ -1230,7 +1230,7 @@ describe CookedPostProcessor do it "doesn't use schemaless CDN url for https uploads" do Rails.configuration.action_controller.stubs(:asset_host).returns("https://my.cdn.com") cpp.optimize_urls - expect(cpp.html).to match_html <<~HTML.rstrip + expect(cpp.html).to match_html <<~HTML

Link

Google
@@ -1244,7 +1244,7 @@ describe CookedPostProcessor do SiteSetting.login_required = true Rails.configuration.action_controller.stubs(:asset_host).returns("http://my.cdn.com") cpp.optimize_urls - expect(cpp.html).to match_html <<~HTML.rstrip + expect(cpp.html).to match_html <<~HTML

Link

Google
@@ -1258,7 +1258,7 @@ describe CookedPostProcessor do SiteSetting.prevent_anons_from_downloading_files = true Rails.configuration.action_controller.stubs(:asset_host).returns("http://my.cdn.com") cpp.optimize_urls - expect(cpp.html).to match_html <<~HTML.rstrip + expect(cpp.html).to match_html <<~HTML

Link

Google
@@ -1297,7 +1297,7 @@ describe CookedPostProcessor do cpp = CookedPostProcessor.new(the_post) cpp.optimize_urls - expect(cpp.html).to match_html <<~HTML.rstrip + expect(cpp.html).to match_html <<~HTML

This post has a local emoji :+1: and an external upload

smallest.png

HTML @@ -1315,7 +1315,7 @@ describe CookedPostProcessor do cpp = CookedPostProcessor.new(the_post) cpp.optimize_urls - expect(cpp.html).to match_html <<~HTML.rstrip + expect(cpp.html).to match_html <<~HTML

This post has a local emoji :+1: and an external upload

smallest.png

HTML @@ -1339,17 +1339,14 @@ describe CookedPostProcessor do cpp = CookedPostProcessor.new(the_post.reload) cpp.post_process_oneboxes - cpp = CookedPostProcessor.new(the_post.reload) - cpp.post_process_oneboxes - expect(cpp.html).to match_html <<~HTML -

This post has an S3 video onebox:
-

+

This post has an S3 video onebox:

+ HTML end @@ -1365,15 +1362,13 @@ describe CookedPostProcessor do secure_url = video_upload.url.sub(SiteSetting.s3_cdn_url, "#{Discourse.base_url}/secure-media-uploads") - expect(cpp.html).to match_html <<~HTML.rstrip -

This post has an S3 video onebox:
-

+ expect(cpp.html).to match_html <<~HTML +

This post has an S3 video onebox:

-

HTML end @@ -1415,20 +1410,18 @@ describe CookedPostProcessor do secure_video_url = video_upload.url.sub(SiteSetting.s3_cdn_url, "#{Discourse.base_url}/secure-media-uploads") secure_audio_url = audio_upload.url.sub(SiteSetting.s3_cdn_url, "#{Discourse.base_url}/secure-media-uploads") - expect(cpp.html).to match_html <<~HTML.rstrip -

This post has a video upload.
+ expect(cpp.html).to match_html <<~HTML +

This post has a video upload.

-

This post has an audio upload.

And an image upload.
#{image_upload.original_filename}

- HTML end diff --git a/spec/components/excerpt_parser_spec.rb b/spec/components/excerpt_parser_spec.rb index 363dd049e0..61eda9941a 100644 --- a/spec/components/excerpt_parser_spec.rb +++ b/spec/components/excerpt_parser_spec.rb @@ -18,7 +18,7 @@ describe ExcerptParser do HTML - expect(ExcerptParser.get_excerpt(html, 50, {})).to match_html(<<~HTML.rstrip) + expect(ExcerptParser.get_excerpt(html, 50, {})).to match_html <<~HTML
FOOBAR Lorem ipsum dolor sit amet, consectetur adi…
HTML diff --git a/spec/components/oneboxer_spec.rb b/spec/components/oneboxer_spec.rb index 30e6b470a7..1b3ec47d57 100644 --- a/spec/components/oneboxer_spec.rb +++ b/spec/components/oneboxer_spec.rb @@ -300,4 +300,27 @@ describe Oneboxer do end end + describe '#apply' do + it 'generates valid HTML' do + raw = "Before Onebox\nhttps://example.com\nAfter Onebox" + cooked = Oneboxer.apply(PrettyText.cook(raw)) { '
onebox
' } + doc = Nokogiri::HTML5::fragment(cooked.to_html) + expect(doc.to_html).to match_html <<~HTML +

Before Onebox

+
onebox
+

After Onebox

+ HTML + + raw = "Before Onebox\nhttps://example.com\nhttps://example.com\nAfter Onebox" + cooked = Oneboxer.apply(PrettyText.cook(raw)) { '
onebox
' } + doc = Nokogiri::HTML5::fragment(cooked.to_html) + expect(doc.to_html).to match_html <<~HTML +

Before Onebox

+
onebox
+
onebox
+

After Onebox

+ HTML + end + end + end diff --git a/spec/services/username_changer_spec.rb b/spec/services/username_changer_spec.rb index a860ac7f80..b23cbcf1d4 100644 --- a/spec/services/username_changer_spec.rb +++ b/spec/services/username_changer_spec.rb @@ -147,7 +147,7 @@ describe UsernameChanger do post = create_post_and_change_username(raw: ".@foo -@foo %@foo _@foo ,@foo ;@foo @@foo") expect(post.raw).to eq(".@bar -@bar %@bar _@bar ,@bar ;@bar @@bar") - expect(post.cooked).to match_html(<<~HTML.rstrip) + expect(post.cooked).to match_html <<~HTML

.@bar -@bar %@bar @@ -169,7 +169,7 @@ describe UsernameChanger do post = create_post_and_change_username(raw: "**@foo** *@foo* _@foo_ ~~@foo~~") expect(post.raw).to eq("**@bar** *@bar* _@bar_ ~~@bar~~") - expect(post.cooked).to match_html(<<~HTML.rstrip) + expect(post.cooked).to match_html <<~HTML

@bar @bar @bar @@ -181,7 +181,7 @@ describe UsernameChanger do post = create_post_and_change_username(raw: "@foo. @foo, @foo: @foo; @foo_ @foo-") expect(post.raw).to eq("@bar. @bar, @bar: @bar; @bar_ @bar-") - expect(post.cooked).to match_html(<<~HTML.rstrip) + expect(post.cooked).to match_html <<~HTML

@bar. @bar, @bar: @@ -225,7 +225,7 @@ describe UsernameChanger do post = create_post_and_change_username(raw: "@foo @foobar @foo-bar @foo_bar @foo1") expect(post.raw).to eq("@bar @foobar @foo-bar @foo_bar @foo1") - expect(post.cooked).to match_html(<<~HTML.rstrip) + expect(post.cooked).to match_html <<~HTML

@bar @foobar @foo-bar @foo_bar @foo1

HTML end @@ -312,7 +312,7 @@ describe UsernameChanger do post = create_post_and_change_username(raw: "@թռչուն @թռչուն鳥 @թռչուն-鳥 @թռչուն_鳥 @թռչուն٩", target_username: 'птица') expect(post.raw).to eq("@птица @թռչուն鳥 @թռչուն-鳥 @թռչուն_鳥 @թռչուն٩") - expect(post.cooked).to match_html(<<~HTML.rstrip) + expect(post.cooked).to match_html <<~HTML

@птица @թռչուն鳥 @թռչուն-鳥 @թռչուն_鳥 @թռչուն٩

HTML end @@ -361,7 +361,7 @@ describe UsernameChanger do dolor sit amet RAW - expect(post.cooked).to match_html(<<~HTML.rstrip) + expect(post.cooked).to match_html <<~HTML

Lorem ipsum

- - {{#if usernameDisabled}} {{accountUsername}} @@ -63,17 +49,10 @@
- + {{#if nameDisabled}} @@ -104,14 +83,7 @@ {{#if passwordRequired}}
- - {{password-field value=accountPassword type="password" id="new-account-password" capsLockOn=capsLockOn}}
- + - + - + diff --git a/app/assets/stylesheets/common/base/user.scss b/app/assets/stylesheets/common/base/user.scss index 24a318e2fb..272ce23aad 100644 --- a/app/assets/stylesheets/common/base/user.scss +++ b/app/assets/stylesheets/common/base/user.scss @@ -339,6 +339,7 @@ } } +.login-form, .user-field { .required { vertical-align: top; From 86a8070fd798f48794a33437b568b79453f26276 Mon Sep 17 00:00:00 2001 From: Krzysztof Kotlarek Date: Tue, 15 Dec 2020 09:48:27 +1100 Subject: [PATCH 114/393] FIX: clear WordWatcher cache after topic_spec (#11488) Forbidden words are cached and should be purged after spec if finished --- spec/models/topic_spec.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spec/models/topic_spec.rb b/spec/models/topic_spec.rb index 8ccac8ac3d..be424d46f9 100644 --- a/spec/models/topic_spec.rb +++ b/spec/models/topic_spec.rb @@ -37,6 +37,10 @@ describe Topic do end describe 'when title contains censored words' do + after do + WordWatcher.clear_cache! + end + it 'should not be valid' do ['pineapple', 'pen'].each { |w| Fabricate(:watched_word, word: w, action: WatchedWord.actions[:censor]) } @@ -88,6 +92,10 @@ describe Topic do describe 'blocked words' do describe 'when title contains watched words' do + after do + WordWatcher.clear_cache! + end + it 'should not be valid' do Fabricate(:watched_word, word: 'pineapple', action: WatchedWord.actions[:block]) From 55292cfce17c95a7096c0c7fe26eb16dbffa6168 Mon Sep 17 00:00:00 2001 From: Kane York Date: Mon, 14 Dec 2020 15:51:40 -0800 Subject: [PATCH 115/393] FIX: Do not forbid tags in /new-topic on mobile (#11486) Now that mobile has a UI for tags, there is no longer any reason to forbid setting them via URL. --- app/assets/javascripts/discourse/app/controllers/composer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/app/controllers/composer.js b/app/assets/javascripts/discourse/app/controllers/composer.js index 9cb9d444f4..2d1c9a0e89 100644 --- a/app/assets/javascripts/discourse/app/controllers/composer.js +++ b/app/assets/javascripts/discourse/app/controllers/composer.js @@ -1008,7 +1008,7 @@ export default Controller.extend({ this.model.set("categoryId", opts.topicCategoryId); } - if (opts.topicTags && !this.site.mobileView && this.site.can_tag_topics) { + if (opts.topicTags && this.site.can_tag_topics) { let tags = escapeExpression(opts.topicTags) .split(",") .slice(0, this.siteSettings.max_tags_per_topic); From 47fa3cf864757ed255d3777163ab1c2d4fb08eb3 Mon Sep 17 00:00:00 2001 From: Discourse Translator Bot Date: Tue, 15 Dec 2020 15:25:10 +0100 Subject: [PATCH 116/393] Update translations (#11492) --- config/locales/client.ar.yml | 4 +- config/locales/client.be.yml | 4 +- config/locales/client.bg.yml | 4 +- config/locales/client.bs_BA.yml | 4 +- config/locales/client.ca.yml | 4 +- config/locales/client.cs.yml | 4 +- config/locales/client.da.yml | 4 +- config/locales/client.de.yml | 39 ++++++++++----- config/locales/client.el.yml | 4 +- config/locales/client.es.yml | 8 ++-- config/locales/client.et.yml | 4 +- config/locales/client.fa_IR.yml | 4 +- config/locales/client.fi.yml | 4 +- config/locales/client.fr.yml | 48 +++++++++++++++++-- config/locales/client.gl.yml | 4 +- config/locales/client.he.yml | 12 +++-- config/locales/client.hu.yml | 4 +- config/locales/client.hy.yml | 4 +- config/locales/client.id.yml | 4 +- config/locales/client.it.yml | 5 +- config/locales/client.ja.yml | 4 +- config/locales/client.ko.yml | 37 ++++++++------ config/locales/client.lt.yml | 4 +- config/locales/client.lv.yml | 4 +- config/locales/client.nb_NO.yml | 4 +- config/locales/client.nl.yml | 8 ++-- config/locales/client.pl_PL.yml | 32 +++++++++---- config/locales/client.pt.yml | 4 +- config/locales/client.pt_BR.yml | 4 +- config/locales/client.ro.yml | 4 +- config/locales/client.ru.yml | 35 ++++++++++---- config/locales/client.sk.yml | 4 +- config/locales/client.sl.yml | 8 ++-- config/locales/client.sq.yml | 4 +- config/locales/client.sr.yml | 4 +- config/locales/client.sv.yml | 22 +++++++-- config/locales/client.sw.yml | 4 +- config/locales/client.te.yml | 4 +- config/locales/client.th.yml | 4 +- config/locales/client.tr_TR.yml | 5 +- config/locales/client.uk.yml | 4 +- config/locales/client.ur.yml | 4 +- config/locales/client.vi.yml | 8 ++-- config/locales/client.zh_CN.yml | 21 ++++++-- config/locales/client.zh_TW.yml | 4 +- config/locales/server.de.yml | 14 ++++++ config/locales/server.he.yml | 12 +++++ config/locales/server.ko.yml | 13 +++++ config/locales/server.pl_PL.yml | 23 +++++++-- config/locales/server.ru.yml | 19 ++++++-- config/locales/server.sv.yml | 13 +++++ config/locales/server.zh_CN.yml | 13 +++++ .../config/locales/server.fr.yml | 25 ++++++++++ .../config/locales/client.fa_IR.yml | 8 +++- .../config/locales/client.fr.yml | 6 +++ .../config/locales/server.fa_IR.yml | 2 +- plugins/poll/config/locales/client.fr.yml | 6 +++ .../config/locales/client.fa_IR.yml | 46 ++++++++++++++++++ 58 files changed, 419 insertions(+), 193 deletions(-) diff --git a/config/locales/client.ar.yml b/config/locales/client.ar.yml index e1b7899a7a..d17840fe50 100644 --- a/config/locales/client.ar.yml +++ b/config/locales/client.ar.yml @@ -1663,7 +1663,6 @@ ar: options: "خيارات" whisper: "همس" unlist: "غير مدرج" - blockquote_text: "اقتبس الفقرة" add_warning: "هذا تحذير رسمي." toggle_whisper: "تبديل الهمس" toggle_unlisted: "تبديل الغير مدرج" @@ -1743,8 +1742,7 @@ ar: link_dialog_title: "أضِف الرابط" link_optional_text: "عنوان اختياري" link_url_placeholder: "ألصِق عنوانًا أو اكتب للبحث في المواضيع" - quote_title: "اقتباس فقرة" - quote_text: "اقتباس فقرة" + blockquote_text: "اقتبس الفقرة" code_title: "نصّ مُنسّق سابقًا" code_text: "اضف 4 مسافات اول السطر قبل النص المنسق" paste_code_text: "اكتب أو ألصِق الكود هنا" diff --git a/config/locales/client.be.yml b/config/locales/client.be.yml index f01bed8eb8..020a2a9aee 100644 --- a/config/locales/client.be.yml +++ b/config/locales/client.be.yml @@ -755,7 +755,6 @@ be: composer: more_emoji: "яшчэ ..." options: "Налады" - blockquote_text: "цытата" posting_not_on_topic: "На якую тэму Вы хочаце адказаць?" saved_local_draft_tip: "захавана лакальна" similar_topics: "Ваша тэма падобная на ..." @@ -796,8 +795,7 @@ be: link_dialog_title: "ўставіць гіперспасылку" link_optional_text: "неабавязкова назву" link_url_placeholder: "Устаўце URL адрас альбо тып для пошуку тэмаў" - quote_title: "цытата" - quote_text: "цытата" + blockquote_text: "цытата" code_title: "Папярэдне фарматаваны тэкст" paste_code_text: "увядзіце ці ўстаўце код тут" upload_title: "спампаваць" diff --git a/config/locales/client.bg.yml b/config/locales/client.bg.yml index 47a5bac712..1c9dc3c4d9 100644 --- a/config/locales/client.bg.yml +++ b/config/locales/client.bg.yml @@ -1200,7 +1200,6 @@ bg: options: "Опции" whisper: "шепот" unlist: "скрити" - blockquote_text: "Текстов блок" add_warning: "Това е официално предупреждение." toggle_whisper: "Включи шепот" posting_not_on_topic: "На коя тема искате да отговорите ?" @@ -1241,8 +1240,7 @@ bg: link_description: "добави описание на връзката тук" link_dialog_title: "Добави хипервръзка" link_optional_text: "заглавие по избор" - quote_title: "Текстов блок" - quote_text: "Текстов блок" + blockquote_text: "Текстов блок" code_title: "Форматиран текст" code_text: "Избутай текста с 4 интервала" paste_code_text: "въведете или поставете кода тук" diff --git a/config/locales/client.bs_BA.yml b/config/locales/client.bs_BA.yml index 71ce8691cd..90d319ff8d 100644 --- a/config/locales/client.bs_BA.yml +++ b/config/locales/client.bs_BA.yml @@ -1653,7 +1653,6 @@ bs_BA: options: "Opcije" whisper: "šapat" unlist: "nelistan" - blockquote_text: "Citiranje" add_warning: "Ovo je zvanično upozorenje." toggle_whisper: " Prekidač za Šapat" toggle_unlisted: "Prekidač za Listan" @@ -1719,8 +1718,7 @@ bs_BA: link_description: "ubaci opis linka" link_dialog_title: "Unesi Link" link_optional_text: "naslov neobavezan" - quote_title: "\"Blockquote\" izdvojeni citat" - quote_text: "\"Blockquote\" izdvojeni citat" + blockquote_text: "Citiranje" code_title: "Formatiran Tekst" code_text: "Unapred formatirani tekst za 4 razmaka" paste_code_text: "ukucaj ili zalijepi kod ovdje" diff --git a/config/locales/client.ca.yml b/config/locales/client.ca.yml index 3614d0a60e..f7264f3af2 100644 --- a/config/locales/client.ca.yml +++ b/config/locales/client.ca.yml @@ -1518,7 +1518,6 @@ ca: options: "Opcions" whisper: "xiuxiueig" unlist: "invisible" - blockquote_text: "Bloc de citació" add_warning: "Aquest és un avís oficial." toggle_whisper: "Commuta el xiuxiueig" toggle_unlisted: "Commuta invisible" @@ -1584,8 +1583,7 @@ ca: link_dialog_title: "Insereix un enllaç" link_optional_text: "títol opcional" link_url_placeholder: "Enganxeu un URL o escriviu per a cercar temes" - quote_title: "Bloc de citació" - quote_text: "Bloc de citació" + blockquote_text: "Bloc de citació" code_title: "Text preformatat" code_text: "Text amb sagnat preformatat de 4 espais" paste_code_text: "escriviu o enganxeu el codi aquí" diff --git a/config/locales/client.cs.yml b/config/locales/client.cs.yml index a5af983f50..220f30a8cc 100644 --- a/config/locales/client.cs.yml +++ b/config/locales/client.cs.yml @@ -1286,7 +1286,6 @@ cs: options: "Možnosti" whisper: "šeptat" unlist: "neviditelné" - blockquote_text: "Bloková citace" add_warning: "Toto je oficiální varování." toggle_whisper: "Přepnout šeptání" toggle_unlisted: "Přepnout neviditelné" @@ -1346,8 +1345,7 @@ cs: link_description: "sem vložte popis odkazu" link_dialog_title: "Vložit odkaz" link_optional_text: "volitelný popis" - quote_title: "Bloková citace" - quote_text: "Bloková citace" + blockquote_text: "Bloková citace" code_title: "Ukázka kódu" code_text: "odsadit předformátovaný text o 4 mezery" paste_code_text: "napište nebo vložte kód tady" diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml index 1250527575..1f0e38d9a1 100644 --- a/config/locales/client.da.yml +++ b/config/locales/client.da.yml @@ -1428,7 +1428,6 @@ da: options: "Indstillinger" whisper: "hvisken" unlist: "Ikke listede" - blockquote_text: "Citatblok" add_warning: "Dette er en officiel advarsel." toggle_whisper: "Slå hvisken til/fra" toggle_unlisted: "Slå listning til/fra" @@ -1491,8 +1490,7 @@ da: link_description: "skriv linkets beskrivelse her" link_dialog_title: "Indsæt link" link_optional_text: "evt. titel" - quote_title: "Citatblok" - quote_text: "Citatblok" + blockquote_text: "Citatblok" code_title: "Præformateret tekst" code_text: "indryk præformateret tekst med 4 mellemrum" paste_code_text: "skriv eller indsæt kode her" diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml index 8aacf0894a..879ec98059 100644 --- a/config/locales/client.de.yml +++ b/config/locales/client.de.yml @@ -411,6 +411,7 @@ de: topic: "Thema:" filtered_topic: "Du hast nach zu prüfenden Inhalten in einem einzelnen Thema gefiltert." filtered_user: "Benutzer" + filtered_reviewed_by: "Überprüft von" show_all_topics: "Zeige alle Themen" deleted_post: "(Beitrag gelöscht)" deleted_user: "(Benutzer gelöscht)" @@ -1688,7 +1689,6 @@ de: options: "Optionen" whisper: "flüstern" unlist: "unsichtbar" - blockquote_text: "Blockquote" add_warning: "Dies ist eine offizielle Warnung." toggle_whisper: "Flüstermodus umschalten" toggle_unlisted: "Sichtbarkeit umschalten" @@ -1760,8 +1760,8 @@ de: link_dialog_title: "Link einfügen" link_optional_text: "Optionaler Titel" link_url_placeholder: "Füge eine URL ein oder tippe, um die Themen zu durchsuchen" - quote_title: "Zitat" - quote_text: "Zitat" + blockquote_title: "Blockquote" + blockquote_text: "Blockquote" code_title: "Vorformatierter Text" code_text: "vorformatierten Text mit 4 Leerzeichen einrücken" paste_code_text: "Tippe oder füge den Code hier ein" @@ -1815,6 +1815,7 @@ de: label: "Neues Thema" shared_draft: label: "Gemeinsame Vorlage" + desc: "Entwurf eines Themas, das nur für erlaubte Benutzer sichtbar ist" toggle_topic_bump: label: "Bump des Themas umschalten" desc: "Antworten ohne das Datum der neuesten Antwort zu ändern" @@ -2520,6 +2521,7 @@ de: has_replies: one: "%{count} Antwort" other: "%{count} Antworten" + has_replies_count: "%{count}" unknown_user: "(unbekannt/gelöschter Benutzer)" has_likes_title: one: "dieser Beitrag gefällt %{count} Person" @@ -2528,6 +2530,9 @@ de: has_likes_title_you: one: "dir und einer weiteren Person gefällt dieser Beitrag" other: "dir und %{count} weiteren Personen gefällt dieser Beitrag" + filtered_replies_hint: + one: "Diesen Beitrag und seine Antwort ansehen" + other: "Diesen Beitrag und seine %{count} Antworten ansehen" errors: create: "Entschuldige, es gab einen Fehler beim Anlegen des Beitrags. Bitte versuche es noch einmal." edit: "Entschuldige, es gab einen Fehler beim Bearbeiten des Beitrags. Bitte versuche es noch einmal." @@ -2684,6 +2689,13 @@ de: edit_bookmark: name: "Lesezeichen bearbeiten" description: "Ändere den Namen des Lesezeichens oder den Erinnerungszeitpunkt." + filtered_replies: + viewing: "Zeige %{reply_count} Antworten an" + viewing_posts_by: "Zeige %{post_count} Beiträge von" + viewing_subset: "Einige Antworten sind reduziert" + viewing_summary: "Eine Zusammenfassung dieses Themas anzeigen" + post_number: "%{username}, Beitrag #%{post_number}" + show_all: "Alle anzeigen" category: can: "kann… " none: "(keine Kategorie)" @@ -2741,10 +2753,10 @@ de: reply: "Antworte" create: "Erstelle" no_groups_selected: "Es wurde keinen Gruppen Zugriff gewährt. Diese Kategorie ist nur für Mitarbeiter sichtbar." - everyone_has_access: "Diese Kategorie ist öffentlich, jeder kann Beiträge sehen, beantworten und erstellen. Entferne eine oder mehrere der Berechtigungen, die der Gruppe \"Jeder\" erteilt wurden, um die Berechtigungen einzuschränken." + everyone_has_access: 'Diese Kategorie ist öffentlich, jeder kann Beiträge sehen, beantworten und erstellen. Entferne eine oder mehrere der Berechtigungen, die der Gruppe "Jeder" erteilt wurden, um die Berechtigungen einzuschränken.' toggle_reply: "Antwortberechtigung umschalten" toggle_full: "Erstellungsberechtigung umschalten" - inherited: "Diese Berechtigung wird von \"jedem\" vererbt" + inherited: 'Diese Berechtigung wird von "jedem" vererbt' special_warning: "Warnung: Diese Kategorie wurde bei der Installation angelegt. Die Sicherheitseinstellungen können daher nicht verändert werden. Wenn du diese Kategorie nicht benötigst, dann solltest du sie löschen anstatt sie für andere Zwecke zu verwenden." uncategorized_security_warning: "Diese Kategorie ist etwas Spezielles. Sie dient als Bereich für Themen, die keine Kategorie haben und besitzt keine Sicherheitseinstellungen." uncategorized_general_warning: 'Diese Kategorie ist etwas Spezielles. Sie wird als Standard-Kategorie für neue Themen genutzt, für die keine Kategorie ausgewählt wurde. Deaktiviere diese Einstellung, wenn dieses Verhalten verhindert und eine Kategoriewahl erzwungen werden soll. Der Name und die Beschreibung können unter Anpassen / Textinhalte geändert werden.' @@ -3426,8 +3438,8 @@ de: none_selected: "Wähle eine Gruppe, um loszulegen" no_custom_groups: "Erstelle eine neue benutzerdefinierte Gruppe" api: - generate_master: "Master API Key erzeugen" - none: "Es gibt momentan keine aktiven API-Keys" + generate_master: "Master API Schlüssel erzeugen" + none: "Es gibt momentan keine aktiven API Schlüssel" user: "Benutzer" title: "API" key: "Schlüssel" @@ -3436,7 +3448,7 @@ de: last_used: Zuletzt verwendet never_used: (nie) generate: "Erzeugen" - undo_revoke: "Widerrufen zurückziehen" + undo_revoke: "Widerruf rückgängig machen" revoke: "Widerrufen" all_users: "Alle Benutzer" active_keys: "Aktive API Schlüssel" @@ -3453,7 +3465,7 @@ de: save: Speichern new_key: Neuer API Schlüssel revoked: Widerrufen - delete: Endgültig gelöscht + delete: Endgültig löschen not_shown_again: Dieser Schlüssel wird nicht noch einmal angezeigt. Stelle sicher, dass du eine Kopie hast, bevor du fortfährst. continue: Weiter use_global_key: Globaler Schlüssel (erlaubt alle Aktionen) @@ -4315,7 +4327,7 @@ de: last_100_days: "in den letzten 100 Tagen" private_topics_count: Private Themen posts_read_count: Gelesene Beiträge - post_count: Erstelle Beiträge + post_count: Erstellte Beiträge second_factor_enabled: Zwei-Faktor-Authentifizierung aktiviert topics_entered: Betrachtete Themen flags_given_count: Gemachte Meldungen @@ -4360,13 +4372,13 @@ de: delete_posts_forbidden_because_staff: "Löschen aller Beiträge von Administratoren und Moderatoren ist nicht möglich." delete_forbidden: one: "Benutzer können nicht gelöscht werden, wenn diese Beiträge haben. Lösche zuerst all dessen Beiträge, bevor du versuchst einen Benutzer zu löschen. (Beiträge, die älter als %{count} Tag sind, können nicht gelöscht werden.)" - other: "Benutzer können nicht gelöscht werden, wenn diese Beiträge haben. Lösche zuerst all dessen Beiträge, bevor du versuchst einen Benutzer zu löschen. (Beiträge, die älter als %{count} Tage sind, können nicht gelöscht werden.)" + other: "Benutzer können nicht gelöscht werden, wenn sie Beiträge haben. Lösche zuerst alle Beiträge, bevor du versuchst einen Benutzer zu löschen. (Beiträge älter als %{count} Tage können nicht gelöscht werden.)" cant_delete_all_posts: one: "Nicht alle Beiträge können gelöscht werden. Einige Beiträge sind älter als %{count} Tag (die „delete_user_max_post_age“ Einstellung)." other: "Nicht alle Beiträge können gelöscht werden. Einige Beiträge sind älter als %{count} Tage (die „delete_user_max_post_age“ Einstellung)." cant_delete_all_too_many_posts: one: "Nicht alle Beiträge konnten gelöscht werden, da der Benutzer mehr als %{count} Beitrag hat (die „delete_all_posts_max“ Einstellung)." - other: "Nicht alle Beiträge konnten gelöscht werden, da der Benutzer mehr als %{count} Beiträge hat (die „delete_all_posts_max“ Einstellung)." + other: "Es können nicht alle Beiträge gelöscht werden, da der Benutzer mehr als %{count} Beiträge hat (siehe „delete_all_posts_max“ Einstellung)." delete_confirm: "Es ist grundsätzlich vorzuziehen, Benutzer zu anonymisieren statt sie zu löschen, um zu vermeiden, dass Inhalt aus bestehenden Diskussionen entfernt wird.

Bist du SICHER, dass du diesen Benutzer löschen möchtest? Dies lässt sich nicht rückgängig machen." delete_and_block: "Löschen und diese E-Mail-Adresse und IP-Adresse blockieren" delete_dont_block: "Nur löschen" @@ -4388,7 +4400,7 @@ de: reset_bounce_score: label: "Zurücksetzen" title: "Anzahl unzustellbarer E-Mails auf 0 zurücksetzen" - visit_profile: "Besuche die Benutzer-Einstellungen, um dieses Profil zu bearbeiten" + visit_profile: "Besuche die Benutzer-Einstellungen, um dieses Profil zu bearbeiten." deactivate_explanation: "Ein deaktivierter Benutzer muss seine E-Mail-Adresse erneut bestätigen." suspended_explanation: "Ein gesperrter Benutzer kann sich nicht anmelden." silence_explanation: "Ein stummgeschalteter Benutzer kann keine Beiträge schreiben oder Themen beginnen." @@ -4586,6 +4598,7 @@ de: image: Bild icon_help: "Gib einen Font Awesome Icon Namen ein (benutze für reguläre Icons das Präfix 'far-' und für Marken-Icons 'fab-')" image_help: "Gebe die URL eines Bildes ein (überschreibt Symbol Feld wenn beide aktiv sind)" + read_only_setting_help: "Anpassen von Text" query: Abzeichen-Abfrage (SQL) target_posts: Abfrage betrifft Beiträge auto_revoke: Führe die Abfrage zum Widerruf täglich aus diff --git a/config/locales/client.el.yml b/config/locales/client.el.yml index bd88a3f4bf..2dd56506ed 100644 --- a/config/locales/client.el.yml +++ b/config/locales/client.el.yml @@ -1618,7 +1618,6 @@ el: options: "Επιλογές" whisper: "ψιθύρισμα" unlist: "κρυμμένο" - blockquote_text: "Blockquote" add_warning: "Αυτή είναι μια επίσημη προειδοποίηση." toggle_whisper: "Εναλλαγή Ψιθύρων" toggle_unlisted: "Εναλλαγή Κρυφών" @@ -1684,8 +1683,7 @@ el: link_dialog_title: "Εισαγωγή Υπερσύνδεσμου" link_optional_text: "προαιρετικός τίτλος" link_url_placeholder: "Επικολλήστε μια διεύθυνση URL ή πληκτρολογήστε για να αναζητήσετε θέματα" - quote_title: "Μπλοκ Κειμένου" - quote_text: "Μπλοκ κειμένου σε παράθεση" + blockquote_text: "Blockquote" code_title: "Προ-διαμορφωμένο κείμενο" code_text: "το προ-διαμορφωμένο κείμενο να μπει σε εσοχή με 4 κενά" paste_code_text: "πληκτρολογήστε ή επικολλήστε τον κώδικα εδώ" diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml index 76d6229e06..5df68db891 100644 --- a/config/locales/client.es.yml +++ b/config/locales/client.es.yml @@ -1685,7 +1685,6 @@ es: options: "Opciones" whisper: "susurrar" unlist: "invisible" - blockquote_text: "Cita" add_warning: "Esta es una advertencia oficial." toggle_whisper: "Activar/desactivar susurro" toggle_unlisted: "Visible/Invisible" @@ -1757,8 +1756,7 @@ es: link_dialog_title: "Insertar hipervínculo" link_optional_text: "título opcional" link_url_placeholder: "Copia una URL o escribe para buscar temas" - quote_title: "Cita" - quote_text: "Cita" + blockquote_text: "Cita" code_title: "Texto preformateado" code_text: "texto preformateado con sangría de 4 espacios" paste_code_text: "escribe o pega el código aquí" @@ -2738,10 +2736,10 @@ es: reply: "Responder" create: "Crear" no_groups_selected: "Ningún grupo tiene acceso. Esta categoría solo será visible por el staff." - everyone_has_access: "Esta categoría es pública. Todo el mundo puede ver, responder y crear temas. Para restringir permisos, quita uno o varios permisos del grupo «todos»." + everyone_has_access: 'Esta categoría es pública. Todo el mundo puede ver, responder y crear temas. Para restringir permisos, quita uno o varios permisos del grupo «todos».' toggle_reply: "Alternar el permiso para responder" toggle_full: "Alternar el permiso para crear temas" - inherited: "Este permiso está heredado de «todos»" + inherited: 'Este permiso está heredado de «todos»' special_warning: "Aviso: esta categoría se ajusta por defecto y las opciones de seguridad no pueden ser editadas. Si no deseas utilizarla, elimínala en vez de reutilizarla." uncategorized_security_warning: "Esta categoría es especial: se usa para temas que no tienen una categoría asignada y y no puede tener ajustes de seguridad." uncategorized_general_warning: 'Esta categoría es especial. Se utiliza como la categoría predeterminada para los temas nuevos que no tienen una categoría seleccionada. Si deseas evitar este comportamiento y forzar la selección de categorías, por favor, desactiva la opción aquí. Si deseas cambiar el nombre o la descripción, ve a Personalizar / Contenido de texto.' diff --git a/config/locales/client.et.yml b/config/locales/client.et.yml index 81d72e6f9d..5bed06bc34 100644 --- a/config/locales/client.et.yml +++ b/config/locales/client.et.yml @@ -1136,7 +1136,6 @@ et: options: "Võimalused" whisper: "sosista" unlist: "eemaldatud" - blockquote_text: "Tsitaat" add_warning: "See on ametlik hoiatus." toggle_whisper: "Lülita sosistamine ümber" toggle_unlisted: "Lülita eemaldamine ümber" @@ -1194,8 +1193,7 @@ et: link_description: "sisesta viite kirjeldus siia" link_dialog_title: "Lisa hüperlink" link_optional_text: "valikuline pealkiri" - quote_title: "Plokktsitaat" - quote_text: "Plokktsitaat" + blockquote_text: "Tsitaat" code_title: "Eelvormindatud tekst" code_text: "taanda eelvormindatud tekst 4 tühiku võrra" paste_code_text: "kirjuta või kleebi kood siia" diff --git a/config/locales/client.fa_IR.yml b/config/locales/client.fa_IR.yml index 9625940a02..278f0daabc 100644 --- a/config/locales/client.fa_IR.yml +++ b/config/locales/client.fa_IR.yml @@ -1528,7 +1528,6 @@ fa_IR: options: "گزینه‌ها" whisper: "زمزمه" unlist: "از فهرست پاک شده" - blockquote_text: "نقل‌قول" add_warning: "این یک هشدار رسمی است." toggle_whisper: "تغییر وضعیت زمزمه" toggle_unlisted: "تغییر وضعیت از لیست خارج شده" @@ -1590,8 +1589,7 @@ fa_IR: link_description: "توضیحات لینک را اینجا وارد کنید." link_dialog_title: "افزودن پیوند" link_optional_text: "عنوان اختیاری" - quote_title: "نقل‌قول" - quote_text: "نقل‌قول" + blockquote_text: "نقل‌قول" code_title: "متن قالب‌بندی شده" code_text: "متن قالب‌بندی شده را با 4 فاصله دندانه‌دار کن" paste_code_text: "کد را در اینجا بنویسید یا بچسبانید" diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml index ca401335da..38c1460c95 100644 --- a/config/locales/client.fi.yml +++ b/config/locales/client.fi.yml @@ -1596,7 +1596,6 @@ fi: options: "Asetukset" whisper: "kuiskaus" unlist: "listaamaton" - blockquote_text: "Sitaatti" add_warning: "Tämä on virallinen varoitus." toggle_whisper: "Vaihda kuiskaus" toggle_unlisted: "Listauksissa näkyminen" @@ -1662,8 +1661,7 @@ fi: link_dialog_title: "Lisää linkki" link_optional_text: "ei-pakollinen kuvaus" link_url_placeholder: "Liitä URL tai etsi ketjua kirjoittamalla" - quote_title: "Lainaus" - quote_text: "Lainaus" + blockquote_text: "Sitaatti" code_title: "Teksti ilman muotoiluja" code_text: "Sisennä teksti neljällä välilyönnillä poistaaksesi automaattisen muotoilun" paste_code_text: "kirjoita tai liitä koodia tähän" diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml index 0c3f5e6c59..e1fdbb0469 100644 --- a/config/locales/client.fr.yml +++ b/config/locales/client.fr.yml @@ -304,6 +304,7 @@ fr: drafts: resume: "Reprendre" remove: "Supprimer" + remove_confirmation: "Êtes-vous sûr de vouloir supprimer ce brouillon?" new_topic: "Nouveau brouillon de sujet" new_private_message: "Nouveau brouillon de message direct" topic_reply: "Créer un brouillon de réponse" @@ -322,6 +323,7 @@ fr: other: "Voir %{count} nouveaux sujets" preview: "prévisualiser" cancel: "annuler" + deleting: "Suppression en cours..." save: "Sauvegarder" saving: "Sauvegarde en cours…" saved: "Sauvegardé !" @@ -406,6 +408,7 @@ fr: topic: "Sujet :" filtered_topic: "Vous avez restreint au contenu vérifiable dans un seul sujet." filtered_user: "Utilisateur" + filtered_reviewed_by: "Vérifié par" show_all_topics: "afficher tous les sujets" deleted_post: "(message supprimé)" deleted_user: "(utilisateur supprimé)" @@ -507,6 +510,7 @@ fr: one: "Vous avez %{count} message en attente." other: "Vous avez %{count} messages en attente." ok: "OK" + example_username: "nom d'utilisateur" user_action: user_posted_topic: "%{user} a démarré le sujet" you_posted_topic: "Vous avez démarré le sujet" @@ -606,9 +610,12 @@ fr: description: "Lorsque des utilisateurs sont ajoutés à ce groupe, leurs paramètres de notification de catégorie seront définis à ces valeurs par défaut. Ensuite, ils pourront les modifier." watched_categories_instructions: "Surveiller automatiquement tous les sujets de ces catégories. Les membres du groupe seront notifiés de tous les nouveaux messages et sujets, et le nombre de nouveaux messages apparaîtra à coté de leur sujet." tracked_categories_instructions: "Suivre automatiquement tous les sujets dans ces catégories. Le nombre de nouveaux messages apparaîtra à côté de leur sujet." + watching_first_post_categories_instructions: "Les utilisateurs seront notifiés du premier message de chaque sujet dans ces catégories." + muted_categories_instructions: "Les utilisateurs ne seront notifiés en rien des nouveaux sujets de ces catégories et ces derniers n'apparaîtront pas dans les pages Catégories ou Récents." tags: title: Étiquettes long_title: "Notifications par défaut des étiquettes" + description: "Lorsque des utilisateurs sont ajoutés à ce groupe, leurs paramètres de notification d'étiquettes seront définis à ces valeurs par défaut. Ensuite, ils pourront les modifier." logs: title: "Journaux" when: "Date" @@ -882,6 +889,7 @@ fr: suspended_notice: "L'utilisateur est suspendu jusqu'au %{date}." suspended_permanently: "Cet utilisateur est suspendu." suspended_reason: "Raison :" + github_profile: "GitHub" email_activity_summary: "Résumé d'activité" mailing_list_mode: label: "Liste de diffusion" @@ -1488,8 +1496,10 @@ fr: awaiting_approval: "Votre compte n'a pas encore été approuvé par un modérateur. Vous recevrez une confirmation par courriel lors de l'activation." requires_invite: "Désolé, l'accès à ce forum est sur invitation seulement." not_activated: "Vous ne pouvez pas vous encore vous connecter. Nous avons envoyé un courriel d'activation à %{sentTo}. Veuillez suivre les instructions afin d'activer votre compte." + not_allowed_from_ip_address: "Vous ne pouvez pas vous connecter depuis cette adresse IP." admin_not_allowed_from_ip_address: "Vous ne pouvez pas vous connecter comme administrateur depuis cette adresse IP." resend_activation_email: "Cliquez ici pour envoyer à nouveau le courriel d'activation." + omniauth_disallow_totp: "L'authentification à deux facteurs est activée sur votre compte. Veuillez vous connecter avec votre mot de passe." resend_title: "Renvoyer le courriel d'activation" change_email: "Changer l'adresse courriel" provide_new_email: "Donnez une nouvelle adresse et nous allons renvoyer votre courriel de confirmation." @@ -1530,6 +1540,7 @@ fr: accept_invite: "Accepter l'invitation" success: "Votre compte a été créé et vous êtes maintenant connecté." name_label: "Nom" + password_label: "Mot de passe" optional_description: "(facultatif)" password_reset: continue: "Continuer vers %{site_name}" @@ -1604,7 +1615,6 @@ fr: options: "Options" whisper: "murmure" unlist: "invisible" - blockquote_text: "Citation" add_warning: "Ceci est un avertissement officiel." toggle_whisper: "Basculer murmure" toggle_unlisted: "Basculer la visibilité" @@ -1670,8 +1680,8 @@ fr: link_dialog_title: "Insérer le lien" link_optional_text: "titre optionnel" link_url_placeholder: "Collez une URL ou tapez pour rechercher des sujets" - quote_title: "Citation" - quote_text: "Citation" + blockquote_title: "Citation" + blockquote_text: "Citation" code_title: "Texte préformaté" code_text: "texte préformaté indenté par 4 espaces" paste_code_text: "saisir ou coller le code ici" @@ -1724,6 +1734,7 @@ fr: toggle_topic_bump: label: "Basculer l'actualisation du sujet" desc: "Répondre sans changer la date de dernière réponse" + ignore: "Ignorer" notifications: tooltip: regular: @@ -1762,6 +1773,7 @@ fr: topic_reminder: "%{username} %{description}" watching_first_post: "Nouveau sujet %{description}" membership_request_accepted: "Adhésion acceptée dans « %{group_name} »" + votes_released: "%{description} - terminé" group_message_summary: one: "%{count} message dans la boîte de réception de %{group_name}" other: "%{count} messages dans la boîte de réception de %{group_name}" @@ -1800,6 +1812,7 @@ fr: liked_consolidated: "nouveaux J'aime" post_approved: "message approuvé" membership_request_consolidated: "nouvelles demandes d'adhésion" + reaction: "nouvelle réaction" upload_selector: title: "Ajouter une image" title_with_attachments: "Ajouter une image ou un fichier" @@ -1883,10 +1896,20 @@ fr: noreplies: n'ont aucune réponse single_user: contiennent un unique utilisateur post: + min: + placeholder: minimum + max: + placeholder: maximum time: label: Date before: avant after: après + views: + label: Vues + min_views: + placeholder: minimum + max_views: + placeholder: maximum hamburger_menu: "aller à une autre catégorie ou liste de sujets" new_item: "nouveau" go_back: "retour" @@ -1924,6 +1947,9 @@ fr: choose_append_tags: "Choisissez de nouvelles étiquettes à ajouter à ces sujets :" changed_tags: "Les étiquettes de ces sujets ont été modifiées." remove_tags: "Supprimer les étiquettes" + progress: + one: "Progression : %{count} sujet" + other: "Progression : %{count} sujets" none: unread: "Vous n'avez aucun sujet non lu." new: "Vous n'avez aucun nouveau sujet." @@ -2017,6 +2043,19 @@ fr: jump_reply_up: aller à des réponses précédentes jump_reply_down: aller à des réponses ultérieures deleted: "Ce sujet a été supprimé" + slow_mode_update: + hours: "Heures :" + minutes: "Minutes :" + seconds: "Secondes :" + durations: + 15_minutes: "15 minutes" + 1_hour: "1 heure" + 4_hours: "4 heures" + 1_day: "1 jour" + 1_week: "1 semaine" + custom: "Durée personnalisée" + slow_mode_notice: + duration: "Vous devez attendre %{duration} entre les messages de ce sujet" topic_status_update: title: "Planifier une action" save: "Planifier" @@ -2571,6 +2610,9 @@ fr: change_in_category_topic: "Modifier la description" already_used: "Cette couleur est déjà utilisée par une autre catégorie" security: "Sécurité" + security_add_group: "Ajouter un groupe" + permissions: + group: "Groupe" special_warning: "Avertissement : cette catégorie est une catégorie pré-remplie et les réglages de sécurité ne peuvent pas être modifiés. Si vous ne souhaitez pas utiliser cette catégorie, supprimez là au lieu de détourner sa fonction." uncategorized_security_warning: "Cette catégorie est spéciale. Elle sert à rassembler les sujets qui n'ont pas de catégorie ; vous ne pouvez pas changer ses paramètres de sécurité." uncategorized_general_warning: 'Cette catégorie est spéciale. Elle sert de catégorie par défaut pour les nouveaux sujets qui ne sont pas liés à une catégorie. Si vous souhaitez changer cela et forcer la sélection de catégorie, veuillez désactiver ce paramètre. Si vous voulez modifier son nom ou sa description, allez dans Personnaliser / Contenu.' diff --git a/config/locales/client.gl.yml b/config/locales/client.gl.yml index 7b7426f3a1..91a53e5992 100644 --- a/config/locales/client.gl.yml +++ b/config/locales/client.gl.yml @@ -1477,7 +1477,6 @@ gl: options: "Opcións" whisper: "bisbar" unlist: "retirado da lista" - blockquote_text: "Citación" add_warning: "Este é un aviso oficial." toggle_whisper: "Cambiar Bisbar" posting_not_on_topic: "A que tema queres responder?" @@ -1534,8 +1533,7 @@ gl: link_dialog_title: "Inserir hiperligazón" link_optional_text: "título opcional" link_url_placeholder: "Copia un URL ou escríbeo para buscar temas." - quote_title: "Citación" - quote_text: "Citación" + blockquote_text: "Citación" code_title: "Texto preformatado" code_text: "Texto preformatado cun sangrado de 4 espazos" paste_code_text: "Escribe un título ou pégao aquí" diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml index ab1fd80d1f..bdd78681f5 100644 --- a/config/locales/client.he.yml +++ b/config/locales/client.he.yml @@ -1809,7 +1809,6 @@ he: options: "אפשרויות" whisper: "לחישה" unlist: "לא-רשום" - blockquote_text: "בלוק ציטוט" add_warning: "זוהי אזהרה רשמית." toggle_whisper: "הפעלת לחישה" toggle_unlisted: "סימון/אי-סימון כלא-ברשימות" @@ -1887,8 +1886,8 @@ he: link_dialog_title: "הזן קישור" link_optional_text: "כותרת כרשות" link_url_placeholder: "יש להדביק כתובת כדי לחפש נושאים" - quote_title: "ציטוט" - quote_text: "ציטוט" + blockquote_title: "מקטע ציטוט" + blockquote_text: "בלוק ציטוט" code_title: "טקסט מעוצב" code_text: "הזחה של הטקסט ב-4 רווחים" paste_code_text: "הקלידו או הדביקו קוד כאן" @@ -2312,6 +2311,7 @@ he: select: "משתמשים יכולים לפרסם לנושא הזה רק פעם אחת בכל:" description: "כדי לקדם דיון מתחשב במהלך דיונים מהירים או וכחניים, משתמשים חייבים להמתין בטרם פרסום פעם נוספת לנושא הזה." save: "הפעלה" + enabled_until: "(רשות) פעיל עד:" remove: "השבתה" hours: "שעות:" minutes: "דקות:" @@ -2714,6 +2714,7 @@ he: two: "%{count} תגובות" many: "%{count} תגובות" other: "%{count} תגובות" + has_replies_count: "%{count}" unknown_user: "(משתמש לא ידוע/נמחק)" has_likes_title: one: "מישהו אחד אהב את התגובה הזו" @@ -2957,10 +2958,10 @@ he: reply: "להגיב" create: "ליצור" no_groups_selected: "אף קבוצה לא קיבלה גישה; קטגוריה זו תהיה גלויה רק לסגל." - everyone_has_access: "קטגוריה זו היא ציבורית, כולם יכולים לצפות, להגיב וליצור פוסטים. די להגביל את ההרשאות, יש להסיר הרשאה אחת או יותר מאלו שהוענקו לקבוצה „כולם”." + everyone_has_access: 'קטגוריה זו היא ציבורית, כולם יכולים לצפות, להגיב וליצור פוסטים. די להגביל את ההרשאות, יש להסיר הרשאה אחת או יותר מאלו שהוענקו לקבוצה „כולם”.' toggle_reply: "החלפת הרשאות תגובה" toggle_full: "החלפת הרשאות יצירה" - inherited: "הרשאה זו התקבלה בירושה מתוך „כולם”" + inherited: 'הרשאה זו התקבלה בירושה מתוך „כולם”' special_warning: "אזהרה: קטגוריה זו הגיעה מראש והגדרות האבטחה שלה אינן ניתנות לשינוי. אם אתם מעוניינים להשתמש בקטגוריה זו, מחקו אותה במקום להשתמש בה מחדש." uncategorized_security_warning: "קטגוריה זו היא מיוחדת. היא מיועדת להחזקת מגוון של נושאים שאין להם קטגוריה, לא יכולות להיות לקבוצה זו הגדרות אבטחה." uncategorized_general_warning: 'קטגוריה זו היא מיוחדת. היא משמשת כקטגוריית בררת המחדל לנושאים חדשים שלא נבחרה עבורם קטגוריה. אם ברצונך למנוע את ההתנהגות הזאת ולאלץ בחירת קטגוריה, נא לנטרל את ההגדרה הזאת כאן. אם מעניין אותך לשנות את השם או את התיאור, עליך לגשת אל התאמה אישית / תוכן טקסט.' @@ -4876,6 +4877,7 @@ he: image: תמונה icon_help: "נא למלא שם של סמל מתוך Font Awesome (קידומת ‚far-‎’ לסמלים רגילים ו־‚fab-‎’ לסמלים ממותגים)" image_help: "נא להקליד את כתובת התמונה (דורסת את שדה הסמל אם שניהם מוגדרים)" + read_only_setting_help: "התאמת טקסט אישית" query: שאילתת עיטור (SQL) target_posts: השאילתה מוכוונת פוסטים auto_revoke: הרצת שאילתת שלילה יומית diff --git a/config/locales/client.hu.yml b/config/locales/client.hu.yml index 7bc7225a6e..9acdcd39d5 100644 --- a/config/locales/client.hu.yml +++ b/config/locales/client.hu.yml @@ -1384,7 +1384,6 @@ hu: options: "Beállítások" whisper: "suttogás" unlist: "nem listázott" - blockquote_text: "idézetblokk" add_warning: "Ez egy hivatalos figyelmeztetés." posting_not_on_topic: "Melyik témakörre szeretnél válaszolni?" saved_local_draft_tip: "helyi mentés készült" @@ -1438,8 +1437,7 @@ hu: link_description: "itt add meg a link leírását" link_dialog_title: "Hiperhivatkozás beszúrása" link_optional_text: "alternatív cím" - quote_title: "Idézet" - quote_text: "Idézet" + blockquote_text: "idézetblokk" code_title: "Előformázott szöveg" code_text: "az előformázott szöveget 4 szóközzel beljebb kezdi" paste_code_text: "Írd vagy másold be a kódot ide" diff --git a/config/locales/client.hy.yml b/config/locales/client.hy.yml index 8d098088d5..fe7919bf8c 100644 --- a/config/locales/client.hy.yml +++ b/config/locales/client.hy.yml @@ -1470,7 +1470,6 @@ hy: options: "Տարբերակներ" whisper: "շշուկ" unlist: "չցուցակագրված" - blockquote_text: "Մեջբերել բաժինը" add_warning: "Սա պաշտոնական զգուշացում է:" toggle_whisper: "Փոխանջատել Շշնջումը" toggle_unlisted: "Փոխանջատել Չցուցակագրվածները" @@ -1536,8 +1535,7 @@ hy: link_dialog_title: "Տեղադրել Հիպերհղումը" link_optional_text: "ընտրովի վերնագիր" link_url_placeholder: "Տեղադրեք URL կամ տեքստը մուտքագրեք՝ թեմաները որոնելու համար" - quote_title: "Մեջբերել" - quote_text: "Մեջբերել բաժինը" + blockquote_text: "Մեջբերել բաժինը" code_title: "Ձևաչափված տեքստ" code_text: "Անջատել ձևաչափված տեքստը 4 բացատով" paste_code_text: "գրեք կամ տեղադրեք կոդն այստեղ" diff --git a/config/locales/client.id.yml b/config/locales/client.id.yml index cad276b543..ca64de785b 100644 --- a/config/locales/client.id.yml +++ b/config/locales/client.id.yml @@ -1187,7 +1187,6 @@ id: composer: emoji: "Emoji :)" options: "Pilihan" - blockquote_text: "Blok Kutipan" add_warning: "Ini adalah peringatan resmi." similar_topics: "Topik anda mirip dengan..." reference_topic_title: "RE: %{title}" @@ -1232,8 +1231,7 @@ id: link_dialog_title: "Sisipkan Tautan" link_optional_text: "judul opsional" link_url_placeholder: "Tempel URL atau ketik untuk mencari topik" - quote_title: "Blok Kutipan" - quote_text: "Blok Kutipan" + blockquote_text: "Blok Kutipan" code_title: "Teks terformat" paste_code_text: "ketik atau tempel kode di sini" upload_title: "Unggah" diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml index 5a87affe64..e0dc49b504 100644 --- a/config/locales/client.it.yml +++ b/config/locales/client.it.yml @@ -1683,7 +1683,6 @@ it: options: "Opzioni" whisper: "sussurra" unlist: "invisibile" - blockquote_text: "Citazione" add_warning: "Questo è un avvertimento ufficiale." toggle_whisper: "Attiva/Disattiva Sussurri" toggle_unlisted: "Rendi Invisibile" @@ -1755,8 +1754,7 @@ it: link_dialog_title: "Inserisci il collegamento" link_optional_text: "titolo opzionale" link_url_placeholder: "Incolla un URL o digita per cercare argomenti" - quote_title: "Citazione" - quote_text: "Citazione" + blockquote_text: "Citazione" code_title: "Testo preformattato" code_text: "rientra il testo preformattato di 4 spazi" paste_code_text: "digita o incolla il codice qui" @@ -2145,6 +2143,7 @@ it: select: "Gli utenti possono pubblicare in questo argomento solo una volta ogni:" description: "Per promuovere discussioni ponderate in argomenti in rapida evoluzione o controversi, gli utenti devono attendere prima di pubblicare nuovamente in questo argomento." save: "Abilita" + enabled_until: "(Facoltativo) Attivato fino a:" remove: "Disattiva" hours: "Ore:" minutes: "Minuti:" diff --git a/config/locales/client.ja.yml b/config/locales/client.ja.yml index 31fb8281ce..ccdccc86ce 100644 --- a/config/locales/client.ja.yml +++ b/config/locales/client.ja.yml @@ -1255,7 +1255,6 @@ ja: options: "オプション" whisper: "ささやき" unlist: "リストから非表示" - blockquote_text: "引用" add_warning: "これは運営スタッフからの警告です。" toggle_whisper: "ささやき機能の切り替え" toggle_unlisted: "表示非表示を切り替える" @@ -1310,8 +1309,7 @@ ja: link_description: "リンクの説明をここに入力" link_dialog_title: "ハイパーリンクの挿入" link_optional_text: "タイトル(オプション)" - quote_title: "引用" - quote_text: "引用" + blockquote_text: "引用" code_title: "整形済みテキスト" code_text: "4文字スペースでインデント" paste_code_text: "コードをここに入力" diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index 746477e433..5e8eba8478 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -185,17 +185,17 @@ ko: other: "링크" faq: "자주하는 질문" guidelines: "가이드라인" - privacy_policy: "개인보호 정책" - privacy: "개인정보처리방침" - tos: "서비스 이용약관" + privacy_policy: "개인 정보 보호 정책" + privacy: "개인 정보 처리 방침" + tos: "서비스 약관" rules: "규칙" - conduct: "윤리 강령" - mobile_view: "모바일로 보기" - desktop_view: "PC로 보기" + conduct: "행동 강령" + mobile_view: "모바일 보기" + desktop_view: "데스크톱 보기" you: "사용자님" or: "또는" now: "방금" - read_more: "더보기" + read_more: "더 보기" more: "더 보기" less: "덜" never: "전혀" @@ -258,14 +258,14 @@ ko: never: "절대" when_reminder_sent: "알림이 전송되면" on_owner_reply: "이 글에 댓글을 작성한 후" - search_placeholder: "이름, 글 제목 또는 글 내용으로 북마크 검색" + search_placeholder: "이름, 글 제목 또는 내용으로 북마크 검색" search: "검색" reminders: later_today: "오늘 나중에" next_business_day: "다음 영업일" tomorrow: "내일" next_week: "다음 주" - post_local_date: "게시물의 날짜" + post_local_date: "게시 날짜" later_this_week: "이번 주말" start_of_next_business_week: "월요일" start_of_next_business_week_alt: "다음주 월요일" @@ -1629,7 +1629,6 @@ ko: options: "옵션" whisper: "귓속말" unlist: "목록에서 제외됨" - blockquote_text: "인용구" add_warning: "경고 메시지" toggle_whisper: "귀속말 켜고 끄기" toggle_unlisted: "목록제외 켜고 끄기" @@ -1698,8 +1697,8 @@ ko: link_dialog_title: "하이퍼링크 삽입" link_optional_text: "선택적 제목" link_url_placeholder: "글을 검색하려면 URL을 붙여 넣거나 입력하세요." - quote_title: "인용구" - quote_text: "인용구" + blockquote_title: "인용구" + blockquote_text: "인용구" code_title: "코드" code_text: "미리 서식이 지정된 텍스트를 4칸 들여쓰기" paste_code_text: "여기에 코드를 입력하거나 붙여 넣습니다." @@ -2072,6 +2071,7 @@ ko: select: "사용자는 이 글에 한 번 씩만 댓글을 작성 할 수 있습니다." description: "빠르게 진행되거나 논쟁이되는 대화에서 신중한 대화를 유도하기위해 사용자는이 글에 추가로 글을 작성하기 위해서는 기다려야합니다." save: "활성화" + enabled_until: "(선택 사항) 다음 시점까지 사용:" remove: "비활성화" hours: "시간:" minutes: "분:" @@ -2426,12 +2426,15 @@ ko: unread: "읽지 않은 포스트" has_replies: other: "%{count}개의 댓글" + has_replies_count: "%{count}" unknown_user: "(알 수 없음/삭제된 사용자)" has_likes_title: other: "%{count}명이 이 글을 좋아합니다" has_likes_title_only_you: "당신이 이 글을 좋아합니다." has_likes_title_you: other: "당신 외 %{count}명이 이 글을 좋아합니다" + filtered_replies_hint: + other: "이 글과 %{count}개의 댓글 보기" errors: create: "죄송합니다. 글을 만드는 동안 오류가 발생했습니다. 다시 시도하십시오." edit: "죄송합니다. 글을 수정하는 중에 오류가 발생했습니다. 다시 시도하십시오." @@ -2579,6 +2582,11 @@ ko: edit_bookmark: name: "북마크 수정" description: "북마크 이름을 수정하거나 알림 날짜 및 시간을 변경하십시오." + filtered_replies: + viewing_subset: "몇 개의 댓글이 접혀 있습니다." + viewing_summary: "이 글의 요약 보기" + post_number: "%{username}, 글 #%{post_number}" + show_all: "모두 보기" category: can: "허용" none: "(카테고리 없음)" @@ -2636,10 +2644,10 @@ ko: reply: "댓글" create: "만들기" no_groups_selected: "접근 권한이 부여된 그룹이 없습니다. 이 카테고리는 관리자만 볼 수 있습니다." - everyone_has_access: "이 카테고리는 공개이며, 누구나 볼 수 있고, 댓글을 작성 하고, 글을 쓸 수 있습니다. 사용 권한을 제한하려면 \"everyone\" 그룹에 부여된 사용 권한 중 하나 이상을 제거해야 합니다." + everyone_has_access: '이 카테고리는 공개이며, 누구나 볼 수 있고, 댓글을 작성 하고, 글을 쓸 수 있습니다. 사용 권한을 제한하려면 "everyone" 그룹에 부여된 사용 권한 중 하나 이상을 제거해야 합니다.' toggle_reply: "토글 댓글 권한" toggle_full: "토글 생성 권한" - inherited: "이 권한은 \"everyone\" 으로부터 상속됩니다." + inherited: '이 권한은 "everyone" 으로부터 상속됩니다.' special_warning: "경고: 이 카테고리는 사전 생성된 카테고리이기 때문에 보안 설정 변경이 불가합니다. 이 카테고리를 사용하고 싶지 않다면, 수정하지말고 삭제하세요." uncategorized_security_warning: "이 카테고리는 특별합니다. 카테고리가없는 주제의 보관 영역으로 사용됩니다. 보안 설정을 가질 수 없습니다." uncategorized_general_warning: '이 카테고리는 특별합니다. 카테고리를 선택하지 않은 새 주제의 기본 카테고리로 사용됩니다. 이 동작을 방지하고 범주를 강제로 선택 하려면 여기에서 설정을 비활성화하십시오 . 이름이나 설명을 변경하려면 사용자 정의 / 텍스트 내용으로 이동하십시오 .' @@ -4451,6 +4459,7 @@ ko: image: 이미지 icon_help: "Font Awesome 아이콘 이름을 입력하십시오 (일반 아이콘에는 접두사 'far-', 브랜드 아이콘에는 'fab-'사용)" image_help: "이미지의 URL을 입력하세요 (둘 다 설정된 경우 아이콘 필드보다 우선함)" + read_only_setting_help: "사용자 정의 텍스트" query: 배지 쿼리(SQL) target_posts: 글들을 대상으로 하는 쿼리 auto_revoke: 회수 쿼리를 매일 실행 diff --git a/config/locales/client.lt.yml b/config/locales/client.lt.yml index 32b2f4eaec..c651ba2556 100644 --- a/config/locales/client.lt.yml +++ b/config/locales/client.lt.yml @@ -1213,7 +1213,6 @@ lt: options: "Nustatymai" whisper: "šnabždesys" unlist: "neįtraukta į sąrašą" - blockquote_text: "Blokuoti citatą" add_warning: "Tai Oficialus Ispėjimas" toggle_whisper: "Įjungti Šnabždesį" toggle_unlisted: "Pažymeti iš sarašo" @@ -1256,8 +1255,7 @@ lt: link_description: "įveskite čia nuorodos aprašymą" link_dialog_title: "Įkelti nuorodą" link_optional_text: "papildoma antraštė" - quote_title: "Blokuoti citatą" - quote_text: "Blokuoti citatą" + blockquote_text: "Blokuoti citatą" code_title: "Tekstas kodui" code_text: "Tekstą kodui atitraukite per 4 tarpelius " paste_code_text: "įveskite arba ėkopijuokite kodą čia" diff --git a/config/locales/client.lv.yml b/config/locales/client.lv.yml index 7684cb06e3..cf8ec32db7 100644 --- a/config/locales/client.lv.yml +++ b/config/locales/client.lv.yml @@ -1094,7 +1094,6 @@ lv: options: "Iespējas" whisper: "čuksts" unlist: "paslēpts" - blockquote_text: "Bloka citāts" add_warning: "Šis ir oficiāls brīdinājums." toggle_whisper: "Čukstēšana" toggle_unlisted: "Paslēpšana no tēmu saraksta" @@ -1147,8 +1146,7 @@ lv: link_description: "ievadiet saites aprakstu šeit" link_dialog_title: "Ievietojiet saiti" link_optional_text: "neobligāts nosaukums" - quote_title: "Bloka citāts" - quote_text: "Ierakstiet bloka citāta saturu" + blockquote_text: "Bloka citāts" code_title: "Formatēts teksts" code_text: "piešķirt formatētajam tekstam 4 atstarpju atkāpi" paste_code_text: "ierakstiet vai ielīmējiet formatēto tekstu šeit" diff --git a/config/locales/client.nb_NO.yml b/config/locales/client.nb_NO.yml index c427f97f1d..d920c6dff4 100644 --- a/config/locales/client.nb_NO.yml +++ b/config/locales/client.nb_NO.yml @@ -1252,7 +1252,6 @@ nb_NO: options: "Alternativer" whisper: "hvisk" unlist: "skjult" - blockquote_text: "Sitatramme" add_warning: "Dette er en offisiell advarsel." toggle_whisper: "Slå på/av hvisking" toggle_unlisted: "Skjul eller gjør synlig" @@ -1310,8 +1309,7 @@ nb_NO: link_description: "beskriv lenken her" link_dialog_title: "Sett inn hyperlenke" link_optional_text: "valgfri tittel" - quote_title: "Sitatramme" - quote_text: "Sitatramme" + blockquote_text: "Sitatramme" code_title: "Kodeutsnitt" code_text: "Skriv inn preformattert tekst med 4 mellomroms innrykk." paste_code_text: "skriv inn eller kopier kode her" diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml index b4fbd511c1..4ac1bb6a1b 100644 --- a/config/locales/client.nl.yml +++ b/config/locales/client.nl.yml @@ -1689,7 +1689,6 @@ nl: options: "Opties" whisper: "fluisteren" unlist: "onzichtbaar" - blockquote_text: "Citaat" add_warning: "Dit is een officiële waarschuwing." toggle_whisper: "Fluistermodus in-/uitschakelen" toggle_unlisted: "Onzichtbaar in-/uitschakelen" @@ -1761,8 +1760,7 @@ nl: link_dialog_title: "Hyperlink invoegen" link_optional_text: "optionele titel" link_url_placeholder: "Plak een URL of typ om topics te zoeken" - quote_title: "Citaat" - quote_text: "Citaat" + blockquote_text: "Citaat" code_title: "Vooraf opgemaakte tekst" code_text: "vooraf opgemaakte tekst met 4 spaties laten inspringen" paste_code_text: "typ of plak hier code" @@ -2743,10 +2741,10 @@ nl: reply: "Antwoorden" create: "Aanmaken" no_groups_selected: "Er is geen toegang tot groepen verleend; deze categorie is alleen zichtbaar voor stafleden." - everyone_has_access: "Deze categorie is openbaar; iedereen kan berichten zien, beantwoorden en aanmaken. Verwijder een of meer van de verleende toestemmingen voor de groep 'iedereen' om toestemmingen te beperken." + everyone_has_access: 'Deze categorie is openbaar; iedereen kan berichten zien, beantwoorden en aanmaken. Verwijder een of meer van de verleende toestemmingen voor de groep ''iedereen'' om toestemmingen te beperken.' toggle_reply: "Toestemming Antwoorden in-/uitschakelen" toggle_full: "Toestemming Aanmaken in-/uitschakelen" - inherited: "Deze toestemming is overgenomen van 'iedereen'" + inherited: 'Deze toestemming is overgenomen van ''iedereen''' special_warning: "Waarschuwing: deze categorie is een vooraf geseede categorie, en de beveiligingsinstellingen kunnen niet worden bewerkt. Als u deze categorie niet wenst te gebruiken, verwijder deze dan in plaats van het doel ervan te wijzigen." uncategorized_security_warning: "Deze categorie is bijzonder. Hij is bedoeld als wachtruimte voor topics die geen categorie hebben, en kan geen beveiligingsinstellingen bevatten." uncategorized_general_warning: 'Deze categorie is bijzonder. Hij is bedoeld als de standaardcategorie voor nieuwe topics die geen selecteerde categorie hebben. Als u dit gedrag wilt voorkomen en categorieselectie wilt afdwingen, schakel de instelling dan hier uit. Als u de naam of omschrijving wilt wijzigen, ga dan naar Aanpassen / Tekstinhoud.' diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml index b52e07bec5..b5e83c9851 100644 --- a/config/locales/client.pl_PL.yml +++ b/config/locales/client.pl_PL.yml @@ -1808,7 +1808,6 @@ pl_PL: options: "Opcje" whisper: "szept" unlist: "nie widoczny" - blockquote_text: "Cytat" add_warning: "To jest oficjalne ostrzeżenie." toggle_whisper: "Przełącz szept" toggle_unlisted: "Przycisk ukrywania" @@ -1886,8 +1885,8 @@ pl_PL: link_dialog_title: "Wstaw odnośnik" link_optional_text: "opcjonalny tytuł" link_url_placeholder: "Wklej adres URL lub wpisz, aby wyszukać tematy" - quote_title: "Cytat" - quote_text: "Cytat" + blockquote_title: "Cytat blokowy" + blockquote_text: "Cytat" code_title: "Tekst sformatowany" code_text: "Sformatowany blok tekstu poprzedź 4 spacjami" paste_code_text: "wpisz lub wklej tutaj kod" @@ -2311,6 +2310,7 @@ pl_PL: select: "Użytkownicy mogą publikować w tym temacie tylko raz na:" description: "Aby promować przemyślaną dyskusję w popularnych lub spornych dyskusjach, użytkownicy muszą poczekać przed ponownym opublikowaniem odpowiedzi w tym temacie." save: "Włącz" + enabled_until: "(Opcjonalnie) Włączone do:" remove: "Wyłącz" hours: "Godziny:" minutes: "Minuty:" @@ -2713,6 +2713,7 @@ pl_PL: few: "%{count} odpowiedzi" many: "%{count} odpowiedzi" other: "%{count} odpowiedzi" + has_replies_count: "%{count}" unknown_user: "(nieznany/usunięty użytkownik)" has_likes_title: one: "%{count} osoba lajkuje ten wpis" @@ -2725,6 +2726,11 @@ pl_PL: few: "ty i %{count} inne osoby polubiły ten wpis" many: "ty i %{count} innych osób polubiło ten wpis" other: "ty i %{count} innych osób polubiło ten wpis" + filtered_replies_hint: + one: "Zobacz ten post i jego odpowiedź" + few: "Zobacz ten post i jego %{count} odpowiedzi" + many: "Zobacz ten post i jego %{count} odpowiedzi" + other: "Zobacz ten post i jego %{count} odpowiedzi" errors: create: "Przepraszamy, podczas tworzenia twojego wpisu wystąpił błąd. Spróbuj ponownie." edit: "Przepraszamy, podczas edytowania twojego wpisu wystąpił błąd. Spróbuj ponownie." @@ -2899,6 +2905,13 @@ pl_PL: edit_bookmark: name: "Edytuj zakładkę" description: "Edytuj nazwę zakładki lub zmień datę i godzinę przypomnienia" + filtered_replies: + viewing: "Przeglądanie %{reply_count} odpowiedzi do" + viewing_posts_by: "Przeglądanie %{post_count} postów autorstwa" + viewing_subset: "Niektóre odpowiedzi są zwinięte" + viewing_summary: "Przeglądanie podsumowania tego tematu" + post_number: "%{username}, post #%{post_number}" + show_all: "Pokaż wszystkie" category: can: "może… " none: "(brak kategorii)" @@ -2956,10 +2969,10 @@ pl_PL: reply: "Odpowiedz" create: "Utwórz" no_groups_selected: "Żadnej grupie nie przyznano dostępu; ta kategoria będzie widoczna tylko dla personelu." - everyone_has_access: "Ta kategoria jest publiczna, każdy może wyświetlać, odpowiadać i tworzyć posty. Aby ograniczyć uprawnienia, usuń jedno lub więcej uprawnień przyznanych grupie \"wszyscy\"." + everyone_has_access: 'Ta kategoria jest publiczna, każdy może wyświetlać, odpowiadać i tworzyć posty. Aby ograniczyć uprawnienia, usuń jedno lub więcej uprawnień przyznanych grupie "wszyscy".' toggle_reply: "Przełącz uprawnienie do odpowiedzi" toggle_full: "Przełącz uprawnienie do tworzenia" - inherited: "To uprawnienie jest dziedziczone po \"wszystkich\"" + inherited: 'To uprawnienie jest dziedziczone po "wszystkich"' special_warning: "Uwaga: Ta kategoria jest generowana automatycznie i jej ustawienia bezpieczeństwa nie mogą być edytowane. Jeśli nie zamierzasz jej używać, skasuj ją, zamiast zmieniać jej przeznaczenie." uncategorized_security_warning: "Ta kategoria ma specjalny charakter. Jest przeznaczona jako miejsce do przechowywania tematów nie przypisanych do żadnej kategorii i jako taka nie może mieć ustawień bezpieczeństwa." uncategorized_general_warning: 'Ta kategoria jest wyjątkowa. Jest używana jako domyślna kategoria dla nowych tematów, które nie mają wybranej kategorii. Jeśli chcesz zapobiec temu zachowaniu i wymusić wybór kategorii, wyłącz to ustawienie tutaj. Jeśli chcesz zmienić nazwę lub opis, przejdź do Dostosuj / Treść tekstowa.' @@ -3712,7 +3725,7 @@ pl_PL: undo_revoke: "Cofnij unieważnienie" revoke: "Unieważnij" all_users: "Wszyscy użytkownicy" - active_keys: "Aktywuj klucze API" + active_keys: "Aktywne klucze API" manage_keys: Zarządzaj kluczami show_details: Detale description: Opis @@ -4503,7 +4516,7 @@ pl_PL: staff: "Zespół" suspended: "Zawieszeni" silenced: "Wyciszony" - staged: "Wystawiany na scenie" + staged: "Etapowi" approved: "Zatwierdzam?" titles: active: "Aktywni użytkownicy" @@ -4519,7 +4532,7 @@ pl_PL: moderators: "Moderatoratorzy" silenced: "Wyciszeni użytkownicy" suspended: "Zawieszone konta" - staged: "Wystawieni użytkownicy" + staged: "Użytkownicy etapowi" not_verified: "Niezweryfikowany" check_email: title: "Wyświetl adres email tego użytkownika" @@ -4571,7 +4584,7 @@ pl_PL: moderator: "Moderator?" admin: "Admin?" suspended: "Zawieszony?" - staged: "Wystawiony?" + staged: "Etapowy?" show_admin_profile: "Admin" show_public_profile: "Pokaż profil publiczny" impersonate: "Zaloguj się na to konto" @@ -4875,6 +4888,7 @@ pl_PL: image: Grafika icon_help: "Wprowadź nazwę ikony Font Awesome (użyj prefiksu \"far-\" dla zwykłych ikon i \"fab-\" dla ikon marek)" image_help: "Wprowadź adres URL obrazu (zastępuje pole ikony, jeśli oba są ustawione)" + read_only_setting_help: "Dostosuj tekst" query: Zapytanie odznaki (SQL) target_posts: Wpisy powiązane z odznaką auto_revoke: Codziennie uruchamiaj zapytanie odbierające odznakę diff --git a/config/locales/client.pt.yml b/config/locales/client.pt.yml index 5b0aac35a7..bbd3e66780 100644 --- a/config/locales/client.pt.yml +++ b/config/locales/client.pt.yml @@ -1422,7 +1422,6 @@ pt: options: "Opções" whisper: "susurro" unlist: "não listado" - blockquote_text: "Bloco de Citação" add_warning: "Este é um aviso oficial." toggle_whisper: "Alternar Sussuro" toggle_unlisted: "Alternar Não Listado" @@ -1483,8 +1482,7 @@ pt: link_description: "insira aqui a descrição da hiperligação" link_dialog_title: "Inserir Hiperligação" link_optional_text: "título opcional" - quote_title: "Bloco de Citação" - quote_text: "Bloco de Citação" + blockquote_text: "Bloco de Citação" code_title: "Texto pré-formatado" code_text: "Indentar texto pré-formatado até 4 espaços" paste_code_text: "digite ou cole aqui o código" diff --git a/config/locales/client.pt_BR.yml b/config/locales/client.pt_BR.yml index 9e67fcc2a3..fdac6ca54c 100644 --- a/config/locales/client.pt_BR.yml +++ b/config/locales/client.pt_BR.yml @@ -1580,7 +1580,6 @@ pt_BR: options: "Opções" whisper: "sussuro" unlist: "não listado" - blockquote_text: "Bloco de Citação" add_warning: "Esta é uma advertência oficial." toggle_whisper: "Alternar Sussuro" toggle_unlisted: "Alternar Não Listado" @@ -1646,8 +1645,7 @@ pt_BR: link_dialog_title: "Inserir Hyperlink" link_optional_text: "título opcional" link_url_placeholder: "Cole uma URL ou digite para pesquisar tópicos" - quote_title: "Bloco de Citação" - quote_text: "Bloco de Citação" + blockquote_text: "Bloco de Citação" code_title: "Texto pré-formatado" code_text: "identar texto pré-formatado por 4 espaços" paste_code_text: "digite ou cole o código aqui" diff --git a/config/locales/client.ro.yml b/config/locales/client.ro.yml index 07e06a1c99..63e343dc1d 100644 --- a/config/locales/client.ro.yml +++ b/config/locales/client.ro.yml @@ -1400,7 +1400,6 @@ ro: options: "Opțiuni" whisper: "discret" unlist: "nelistat" - blockquote_text: "Bloc citat" add_warning: "Aceasta este o avertizare oficială." toggle_whisper: "Comută modul discret" toggle_unlisted: "Comută modul nelistat" @@ -1455,8 +1454,7 @@ ro: link_description: "adaugă aici descrierea link-ului" link_dialog_title: "Introdu link" link_optional_text: "titlu opțional" - quote_title: "Bloc citat" - quote_text: "Bloc citat" + blockquote_text: "Bloc citat" code_title: "Text preformatat" code_text: "indentează textul preformatat cu 4 spații" paste_code_text: "tastează sau lipește cod aici" diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml index 07851f99de..7cc2c5c318 100644 --- a/config/locales/client.ru.yml +++ b/config/locales/client.ru.yml @@ -643,9 +643,9 @@ ru: requests: title: "Запросы" reason: "Причина" - accept: "Принимать" + accept: "Принять" accepted: "принято" - deny: "Отрицать" + deny: "Отказать" denied: "отказано" undone: "запрос отменён" handle: "обрабатывать запрос на вступление" @@ -1809,7 +1809,6 @@ ru: options: "Настройки" whisper: "скрытое сообщение" unlist: "исключена из списков тем" - blockquote_text: "Цитата" add_warning: "Это официальное предупреждение." toggle_whisper: "Скрытое сообщение" toggle_unlisted: "Исключить из списка" @@ -1887,8 +1886,8 @@ ru: link_dialog_title: "Вставить ссылку" link_optional_text: "Необязательный текст ссылки" link_url_placeholder: "Вставьте URL или введите текст для поиска темы" - quote_title: "Цитата" - quote_text: "Впишите сюда текст цитаты" + blockquote_title: "Цитата" + blockquote_text: "Цитата" code_title: "Текст \"как есть\" (без применения форматирования)" code_text: "Впишите сюда текст; также отключить форматирование текста можно, начав строку с 4х пробелов" paste_code_text: "Напечатайте или вставьте сюда код" @@ -1942,6 +1941,7 @@ ru: label: "Новая тема" shared_draft: label: "Общий черновик" + desc: "Черновик темы, который будет виден только пользователям с необходимыми правами доступа" toggle_topic_bump: label: "Не поднимать тему" desc: "Ответить без изменения даты последнего ответа" @@ -2311,6 +2311,7 @@ ru: select: "Пользователи могут публиковать сообщения в этой теме не чаще чем раз в:" description: "Чтобы способствовать вдумчивому обсуждению в активных или спорных дискуссиях, пользователи должны подождать определённое время, прежде чем снова публиковать сообщения в этой теме." save: "Включить" + enabled_until: "(Необязательно) Включён до:" remove: "Отключить" hours: "Часы:" minutes: "Минуты:" @@ -2682,7 +2683,7 @@ ru: quote_share: "Поделиться" edit_reason: "Причина: " post_number: "сообщение %{number}" - ignored: "Проигнорированное содержание" + ignored: "Игнорируемое содержимое" wiki_last_edited_on: "Вики редактировалась" last_edited_on: "Последний раз сообщение редактировалось" reply_as_new_topic: "Ответить в новой связанной теме" @@ -2713,6 +2714,7 @@ ru: few: "%{count} ответа" many: "%{count} ответов" other: "%{count} ответов" + has_replies_count: "%{count}" unknown_user: "(неизвестный/удалённый пользователь)" has_likes_title: one: "Это сообщение понравилось %{count} человеку" @@ -2725,6 +2727,11 @@ ru: few: "Вам и ещё %{count} людям понравилось это сообщение" many: "Вам и ещё %{count} людям понравилось это сообщение" other: "Вам и ещё %{count} людям понравилось это сообщение" + filtered_replies_hint: + one: "Посмотреть это сообщение и ответ на него" + few: "Посмотреть это сообщение и %{count} ответа" + many: "Посмотреть это сообщение и %{count} ответов" + other: "Посмотреть это сообщение и %{count} ответов" errors: create: "К сожалению, не удалось создать сообщение из-за ошибки. Попробуйте ещё раз." edit: "К сожалению, не удалось изменить сообщение. Попробуйте ещё раз." @@ -2899,6 +2906,13 @@ ru: edit_bookmark: name: "Изменить закладку" description: "Изменение названия закладки или даты/времени напоминания." + filtered_replies: + viewing: "Просмотр %{reply_count} ответов на" + viewing_posts_by: "Просмотр %{post_count} сообщений от" + viewing_subset: "Некоторые ответы свернуты" + viewing_summary: "Просмотр сводки по этой теме" + post_number: "%{username}, сообщение #%{post_number}" + show_all: "Показать все" category: can: "может… " none: "(РАЗНОЕ)" @@ -2956,10 +2970,10 @@ ru: reply: "Ответ" create: "Создание" no_groups_selected: "Доступ не предоставлен ни одной группе; этот раздел будет виден только персоналу." - everyone_has_access: "Эта общедоступный раздел; все пользователи могут просматривать, создавать сообщения, а также отвечать на них. Чтобы ограничить разрешения, удалите одно или несколько разрешений, предоставленных группе 'все'." + everyone_has_access: 'Эта общедоступный раздел; все пользователи могут просматривать, создавать сообщения, а также отвечать на них. Чтобы ограничить разрешения, удалите одно или несколько разрешений, предоставленных группе ''все''.' toggle_reply: "Переключить разрешение 'Ответ'" toggle_full: "Переключить разрешение 'Создание'" - inherited: "Это разрешение унаследовано от группы 'все'" + inherited: 'Это разрешение унаследовано от группы ''все''' special_warning: "Внимание: данный раздел был предустановлен по умолчанию и его настройки безопасности не могут быть изменены. Если не хотите использовать этот раздел, удалите его вместо изменения." uncategorized_security_warning: "Это специальный раздел, предназначенный для хранения тем, которые не относятся к какому-либо разделу; у него не может быть настроек безопасности." uncategorized_general_warning: 'Это специальный раздел, используемый в качестве раздела по умолчанию для новых тем, для которых не был выбран конкретный раздел. Если вы хотите предотвратить такое поведение и принудительно выбирать раздел, отключите соответствующую настройку здесь. Если вы хотите изменить название или описание раздела, сделайте это в настройке Оформление / Текст.' @@ -4020,7 +4034,7 @@ ru: default_theme_tooltip: "Эта тема является темой по умолчанию" updates_available_tooltip: "Доступны обновления для этой темы" and_x_more: "и более %{count}." - collapse: Крах + collapse: Свернуть uploads: "Загрузки" no_uploads: "Вы можете загрузить различные ресурсы для темы, такие как шрифты и изображения" add_upload: "Добавить ресурс" @@ -4865,6 +4879,7 @@ ru: image: Картинка icon_help: "Введите имя иконки из коллекции Font Awesome (используйте префикс 'far-' для обычных значков и 'fab-' для значков брендов)" image_help: "Введите URL-адрес изображения (отображается вместо иконки, если указаны оба параметра)" + read_only_setting_help: "Настроить текст" query: Выборка награды (SQL) target_posts: Выборка целевых сообщений auto_revoke: Запускать ежедневно запрос на отзыв @@ -4889,7 +4904,7 @@ ru: no_grant_count: "Нет наград для выдачи." grant_count: one: "Будет выдана %{count} награда." - few: "%{count} награды будут выданы." + few: "Будут выданы %{count} награды." many: "Будут выданы %{count} наград." other: "Будут выданы %{count} наград." sample: "Пример:" diff --git a/config/locales/client.sk.yml b/config/locales/client.sk.yml index 77bd00b722..264093eccb 100644 --- a/config/locales/client.sk.yml +++ b/config/locales/client.sk.yml @@ -1202,7 +1202,6 @@ sk: more_emoji: "viac ..." options: "Možnosti" whisper: "šepot" - blockquote_text: "Úvodzovky" add_warning: "Toto je oficiálne varovanie." toggle_whisper: "Prepnúť šepot" posting_not_on_topic: "Na akú tému chcete odpovedať?" @@ -1249,8 +1248,7 @@ sk: link_description: "tu zadaj popis odkazu" link_dialog_title: "Vložte hyperlink" link_optional_text: "nepovinný názov" - quote_title: "Úvodzovky" - quote_text: "Úvodzovky" + blockquote_text: "Úvodzovky" code_title: "Preformátovaný text" code_text: "Odsaďte preformátovaný text 4 medzerami" paste_code_text: "sem zadajte alebo vložte kód" diff --git a/config/locales/client.sl.yml b/config/locales/client.sl.yml index bfa2f780de..a9d43697e1 100644 --- a/config/locales/client.sl.yml +++ b/config/locales/client.sl.yml @@ -1705,7 +1705,6 @@ sl: options: "Možnosti" whisper: "šepet" unlist: "izločeno" - blockquote_text: "Citirano" add_warning: "To je uradno opozorilo." toggle_whisper: "Preklopi šepet" toggle_unlisted: "Preklopi izločeno" @@ -1778,8 +1777,7 @@ sl: link_dialog_title: "Vstavi povezavo" link_optional_text: "neobvezen naslov" link_url_placeholder: "Za iskanje po temah prilepite ali vpišite URL" - quote_title: "Citiraj" - quote_text: "Citirano" + blockquote_text: "Citirano" code_title: "Predoblikovano besedilo" code_text: "zamakni predoblikovano besedilo s 4 presledki" paste_code_text: "vpiši ali prilepi kodo" @@ -2750,10 +2748,10 @@ sl: reply: "Odgovori" create: "Ustvari" no_groups_selected: "Dostop ni bil odobren nobeni skupini; ta kategorija bo vidna samo osebju." - everyone_has_access: "Ta kategorija je javna, vsi lahko vidijo, odgovarjajo in ustvarjajo objave. Če želite omejiti dovoljenja, odstranite eno ali več dovoljenj, dodeljenih skupini »vsi«." + everyone_has_access: 'Ta kategorija je javna, vsi lahko vidijo, odgovarjajo in ustvarjajo objave. Če želite omejiti dovoljenja, odstranite eno ali več dovoljenj, dodeljenih skupini »vsi«.' toggle_reply: "Preklopi dovoljenje za odgovor" toggle_full: "Preklopi dovoljenje za ustvarjanje" - inherited: "To dovoljenje je podedovano od \"vsi\"" + inherited: 'To dovoljenje je podedovano od "vsi"' special_warning: "Ta kategorija je prednastavljena, zato varnostnih nastavitev ni mogoče urejati. Če ne želite uporabljati te kategorije jo raje izbrišite kot uporabljajte v drug namen." uncategorized_security_warning: "Ta kategorija je posebna. Namenjena je za shranjevanje tem, ki nimajo kategorije. Zato ne more imeti varnostnih nastavitev." uncategorized_general_warning: 'Ta kategorija je posebna. Uporabi se kot privzeta kategorija za teme brez kategorije. Če hočete onemogočiti takšen način in hočete obvezno izbiro kategorije, potem onemogočite nastavitev tukaj. Če hočete spremeniti ime ali opis, pojdite Prilagodi / Vsebina besedila.' diff --git a/config/locales/client.sq.yml b/config/locales/client.sq.yml index 70189dfab0..13b664e94b 100644 --- a/config/locales/client.sq.yml +++ b/config/locales/client.sq.yml @@ -968,7 +968,6 @@ sq: options: "Opsione" whisper: "pëshpëritje" unlist: "çlistuar" - blockquote_text: "Citim" add_warning: "Ky është një paralajmërim zyrtar." toggle_whisper: "Pëshpëritje?" toggle_unlisted: "Toggle Unlisted" @@ -1017,8 +1016,7 @@ sq: link_description: "shkruaj përshkrimin e lidhjes këtu" link_dialog_title: "Vendosni një lidhje" link_optional_text: "titull fakultativ" - quote_title: "Citim" - quote_text: "Citim" + blockquote_text: "Citim" code_title: "Tekst i paraformatuar" code_text: "shkruani 4 hapësira (space) për të filluar tekstin e paraformatuar" paste_code_text: "shkruani ose ngjisni kodin këtu" diff --git a/config/locales/client.sr.yml b/config/locales/client.sr.yml index fc0a457494..a7c0e5748e 100644 --- a/config/locales/client.sr.yml +++ b/config/locales/client.sr.yml @@ -863,7 +863,6 @@ sr: emoji: "Emotikoni :)" more_emoji: "više..." options: "Opcije" - blockquote_text: "izdvojeni citat" add_warning: "Ovo je službeno upozorenje." posting_not_on_topic: "U kojoj temi želite odgovoriti?" saved_local_draft_tip: "sačuvano lokalno" @@ -904,8 +903,7 @@ sr: link_description: "Unesite opis linka ovde" link_dialog_title: "Ubacite Hiperlink" link_optional_text: "neobavezan naslov" - quote_title: "izdvojeni citat" - quote_text: "izdvojeni citat" + blockquote_text: "izdvojeni citat" code_title: "Pred-formatirani tekst" code_text: "uvuci pred-formatirani tekst za 4 mesta" paste_code_text: "unesi ili nalepi kod ovde" diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml index 14a6192388..d824a55581 100644 --- a/config/locales/client.sv.yml +++ b/config/locales/client.sv.yml @@ -1689,7 +1689,6 @@ sv: options: "Alternativ" whisper: "viska" unlist: "avlistad" - blockquote_text: "Citat" add_warning: "Det här är en officiell varning." toggle_whisper: "Växla viskning" toggle_unlisted: "Växla olistad" @@ -1761,8 +1760,8 @@ sv: link_dialog_title: "Infoga hyperlänk" link_optional_text: "valfri rubrik" link_url_placeholder: "Klistra in en URL eller skriv för att söka ämnen" - quote_title: "Citat" - quote_text: "Citat" + blockquote_title: "Citat" + blockquote_text: "Citat" code_title: "Förformatterad text" code_text: "indentera förformatterad text med 4 mellanslag" paste_code_text: "skriv eller klistra in din kod här" @@ -2152,6 +2151,7 @@ sv: select: "Användare får bara publicera i detta ämne en gång varje:" description: "För att främja tankeväckande diskussioner i snabba eller omtvistade diskussioner måste användarna vänta innan de publicerar i det här ämnet igen." save: "Aktivera" + enabled_until: "(Valfritt) Aktiverad till:" remove: "Inaktivera" hours: "Timmar:" minutes: "Minuter:" @@ -2522,6 +2522,7 @@ sv: has_replies: one: "%{count} svar" other: "%{count} svar" + has_replies_count: "%{count}" unknown_user: "(okänd/raderad användare)" has_likes_title: one: "%{count} person gillade detta inlägg" @@ -2530,6 +2531,9 @@ sv: has_likes_title_you: one: "du och %{count} annan person gillade det här inlägget" other: "du och %{count} andra personer gillade det här inlägget" + filtered_replies_hint: + one: "Visa detta inlägg och dess svar" + other: "Visa detta inlägg och dess %{count} svar" errors: create: "Tyvärr uppstod det ett fel under skapandet av ditt inlägg. Vi ber dig försöka igen." edit: "Tyvärr uppstod det ett fel under ändringen av ditt inlägg. Vi ber dig försöka igen." @@ -2686,6 +2690,13 @@ sv: edit_bookmark: name: "Redigera bokmärke" description: "Redigera bokmärkets namn eller ändra påminnelsens datum och tid." + filtered_replies: + viewing: "Visar %{reply_count} svar på" + viewing_posts_by: "Visar %{post_count} inlägg av" + viewing_subset: "Vissa svar har förminskats" + viewing_summary: "Visar en sammanfattning av detta ämne" + post_number: "%{username}, inlägg nr %{post_number}" + show_all: "Visa alla" category: can: "can… " none: "(ingen kategori)" @@ -2743,10 +2754,10 @@ sv: reply: "Svara" create: "Skapa" no_groups_selected: "Inga grupper har beviljats åtkomst; denna kategori kommer endast att vara synlig för personalen." - everyone_has_access: "Denna kategori är offentlig och alla kan se, besvara och skapa inlägg. Om du vill begränsa behörigheterna tar du bort en eller flera av de behörigheter som tilldelats till gruppen ”alla”." + everyone_has_access: 'Denna kategori är offentlig och alla kan se, besvara och skapa inlägg. Om du vill begränsa behörigheterna tar du bort en eller flera av de behörigheter som tilldelats till gruppen ”alla”.' toggle_reply: "Slå på/av behörighet att svara" toggle_full: "Slå på/av behörighet att skapa" - inherited: "Denna behörighet ärvs från \"alla\"" + inherited: 'Denna behörighet ärvs från "alla"' special_warning: "Varning: Den här kategorin är en förutbestämd kategori och säkerhetsinställningarna kan inte ändras. Om du inte vill använda kategorin tar du bort den istället för att återanvända den." uncategorized_security_warning: "Denna kategori är speciell. Den är avsedd för att innehålla ämnen som saknar kategori. Den kan inte ha säkerhetsinställningar." uncategorized_general_warning: 'Denna kategori är speciell. Den används som standardkategori för nya ämnen som inte har en vald kategori. Om du vill förhindra detta beteende och tvinga val av kategori inaktiverar du inställningen här. Om du vill ändra namn eller beskrivning går du till Anpassa / Textinnehåll.' @@ -4592,6 +4603,7 @@ sv: image: Bild icon_help: "Ange ett FA-ikonnamn (använd prefix 'far-' för reguljära ikoner samt 'fab-' för varumärkesikoner)" image_help: "Ange URL till bilden (ersätter ikonfältet om båda är angivna)" + read_only_setting_help: "Anpassa text" query: Utmärkelsesökning (SQL) target_posts: Sök målets inlägg auto_revoke: Kör återkallelsesökning dagligen diff --git a/config/locales/client.sw.yml b/config/locales/client.sw.yml index dc856b4707..93d5d7a3c9 100644 --- a/config/locales/client.sw.yml +++ b/config/locales/client.sw.yml @@ -1166,7 +1166,6 @@ sw: options: "Chaguo" whisper: "nong'ona" unlist: "ondoa kwenye orodha" - blockquote_text: "Zuianukulu" add_warning: "Hii ni onyo rasmi." toggle_whisper: "Badilisha Nong'ono" toggle_unlisted: "Badilisha Ondoa kwenye Orodha" @@ -1223,8 +1222,7 @@ sw: link_description: "andika maelezo ya kiungo hapa" link_dialog_title: "Ingiza kiungo-wavuti" link_optional_text: "kichwa cha habari kisichokuwa cha muhimu" - quote_title: "Zuianukulu" - quote_text: "Zuianukulu" + blockquote_text: "Zuianukulu" code_title: "Maneno yaliyowekwa muundo" code_text: "Maneno yaliyowekwa muundo kwa kuacha nafasi 4 kuingia ndani" paste_code_text: "andika au bandika kodi hapa" diff --git a/config/locales/client.te.yml b/config/locales/client.te.yml index 6e272934d9..fa084ffced 100644 --- a/config/locales/client.te.yml +++ b/config/locales/client.te.yml @@ -690,7 +690,6 @@ te: flags: కేతనాలు composer: options: "ఎంపికలు" - blockquote_text: "బ్లాక్ కోట్" add_warning: "ఇది ఒక అధికారిక హెచ్చరిక" posting_not_on_topic: "ఏ విషయానికి మీరు జవాబివ్వాలనుకుంటున్నారు? " saved_local_draft_tip: "స్థానికంగా భద్రం" @@ -725,8 +724,7 @@ te: link_description: "లంకె వివరణ ఇక్కడ రాయండి" link_dialog_title: "హైపర్ లంకె చొప్పించండి" link_optional_text: "ఐచ్చిక శీర్షిక" - quote_title: "బ్లాక్ కోట్" - quote_text: "బ్లాక్ కోట్" + blockquote_text: "బ్లాక్ కోట్" code_title: "ముందే అలంకరించిన పాఠ్యం" code_text: "ముందే అలంకరించిన పాఠ్యాన్ని 4 జాగాలు జరుపు" upload_title: "ఎగుమతించు" diff --git a/config/locales/client.th.yml b/config/locales/client.th.yml index 0ab4aec46a..8c9c6872e1 100644 --- a/config/locales/client.th.yml +++ b/config/locales/client.th.yml @@ -1305,7 +1305,6 @@ th: more_emoji: "อื่นๆ..." options: "ตัวเลือก" whisper: "กระซิบ" - blockquote_text: "ส่วนอ้างถึง" add_warning: "นี่คือคำเตือนอย่างเป็นทางการ" toggle_whisper: "เปิดกระซิบ" posting_not_on_topic: "กระทู้ไหนที่คุณต้องการตอบ" @@ -1358,8 +1357,7 @@ th: link_dialog_title: "เพิ่มลิงค์" link_optional_text: "ชื่อเรื่องเพิ่มเติม" link_url_placeholder: "วาง URL หรือพิมพ์เพื่อค้นหากระทู้" - quote_title: "ส่วนอ้างถึง" - quote_text: "ส่วนอ้างถึง" + blockquote_text: "ส่วนอ้างถึง" code_title: "ข้อความก่อนจัดรูปแบบ" code_text: "ข้อความก่อนจัดรูปแบบเยื้อง 4 เคาะ" paste_code_text: "พิมพ์หรือวางโค้ดที่นี่" diff --git a/config/locales/client.tr_TR.yml b/config/locales/client.tr_TR.yml index 2029025097..33e4103272 100644 --- a/config/locales/client.tr_TR.yml +++ b/config/locales/client.tr_TR.yml @@ -1483,7 +1483,6 @@ tr_TR: options: "Seçenekler" whisper: "fısıltı" unlist: "listelenmedi" - blockquote_text: "Blok-alıntı" add_warning: "Bu resmi bir uyarıdır." toggle_whisper: "Fısıldamayı Aç/Kapa" toggle_unlisted: "Listelenmemiş değişiklik" @@ -1549,8 +1548,7 @@ tr_TR: link_dialog_title: "Hyperlink ekle" link_optional_text: "isteğe bağlı başlık" link_url_placeholder: "Arama konularına bir URL yapıştırın veya yazın" - quote_title: "Blok-alıntı" - quote_text: "Blok-alıntı" + blockquote_text: "Blok-alıntı" code_title: "Önceden biçimlendirilmiş yazı" code_text: "paragraf girintisi 4 boşluktan oluşan, önceden biçimlendirilen yazı" paste_code_text: "kodu buraya gir veya yapıştır" @@ -4088,6 +4086,7 @@ tr_TR: image: Görsel icon_help: "Font Awesome simge adı girin (normal simgeler için 'far-' önünü ve marka simgeleri için 'fab-' kullanın)" image_help: "Görüntünün URL'sini gir (her ikisi de ayarlanmışsa, simge alanını geçersiz kıl)" + read_only_setting_help: "Metni özelleştir" query: Rozet Sorgusu (SQL) target_posts: Sorgu hedefleri gönderileri auto_revoke: Günlük iptal sorgusunu çalıştır diff --git a/config/locales/client.uk.yml b/config/locales/client.uk.yml index b9d2da19f5..2300936891 100644 --- a/config/locales/client.uk.yml +++ b/config/locales/client.uk.yml @@ -1795,7 +1795,6 @@ uk: options: "Налаштування" whisper: "Внутрішнє повідомлення" unlist: "Виключена зі списків тем" - blockquote_text: "Цитата" add_warning: "Це офіційне попередження." toggle_whisper: "Внутрішнє повідомлення" toggle_unlisted: "Сховати зі списків тем" @@ -1873,8 +1872,7 @@ uk: link_dialog_title: "Вставити гіперпосилання" link_optional_text: "необов'язкова назва" link_url_placeholder: "Вставте URL або введіть для пошуку теми" - quote_title: "Цитата" - quote_text: "Цитата" + blockquote_text: "Цитата" code_title: "Попередньо форматований текст" code_text: "Впишіть сюди текст; також, відключити форматування тексту можна, почавши рядок з 4х прогалин" paste_code_text: "Надрукуйте або вставте сюди код" diff --git a/config/locales/client.ur.yml b/config/locales/client.ur.yml index 724a8fac7f..53acf5534e 100644 --- a/config/locales/client.ur.yml +++ b/config/locales/client.ur.yml @@ -1416,7 +1416,6 @@ ur: options: "اختیارات" whisper: "سرگوشی" unlist: "غیر مندرج" - blockquote_text: "بلاک متن" add_warning: "یہ ایک آفیشل انتباہ ہے۔" toggle_whisper: "سرگوشی ٹَوگل کریں" toggle_unlisted: "غیر مندرج ٹَوگل کریں" @@ -1480,8 +1479,7 @@ ur: link_description: "یہاں لِنک کی تفصیل درج کریں" link_dialog_title: "ہائپرلِنک ڈالیں" link_optional_text: "اختیاری عنوان" - quote_title: "بلاک کوٹ" - quote_text: "بلاک کوٹ" + blockquote_text: "بلاک متن" code_title: "پہلے سے فارمیٹ کیا گیا ٹَیکسٹ" code_text: "حاشیہ نے ٹَیکسٹ کو پہلے سے 4 خالی جگہوں سے فارمیٹ کر دیا" paste_code_text: "کوڈ یہاں ٹائپ یا پیسٹ کریں" diff --git a/config/locales/client.vi.yml b/config/locales/client.vi.yml index c39f64937b..72396ffc24 100644 --- a/config/locales/client.vi.yml +++ b/config/locales/client.vi.yml @@ -1625,7 +1625,6 @@ vi: options: "Lựa chọn" whisper: "nói chuyện" unlist: "chưa được liệt kê" - blockquote_text: "Trích dẫn" add_warning: "Đây là một cảnh báo chính thức" toggle_whisper: "Chuyển chế độ Nói chuyện" toggle_unlisted: "Chuyển sang chế độ Không công khai" @@ -1694,8 +1693,7 @@ vi: link_dialog_title: "Chèn liên kết" link_optional_text: "tiêu đề tùy chọn" link_url_placeholder: "Dán URL hoặc nhập vào chủ đề tìm kiếm" - quote_title: "Trích dẫn" - quote_text: "Trích dẫn" + blockquote_text: "Trích dẫn" code_title: "Văn bản định dạng trước" code_text: "lùi đầu dòng bằng 4 dấu cách" paste_code_text: "gõ hoặc dẫn code vào đây" @@ -2631,10 +2629,10 @@ vi: reply: "Trả lời" create: "Tạo" no_groups_selected: "Không có nhóm nào được cấp quyền truy cập; danh mục này sẽ chỉ hiển thị cho nhân viên." - everyone_has_access: "Danh mục này là công khai, mọi người đều có thể xem, trả lời và tạo bài viết. Để hạn chế quyền, hãy xóa một hoặc nhiều quyền được cấp cho nhóm \"mọi người\"." + everyone_has_access: 'Danh mục này là công khai, mọi người đều có thể xem, trả lời và tạo bài viết. Để hạn chế quyền, hãy xóa một hoặc nhiều quyền được cấp cho nhóm "mọi người".' toggle_reply: "Chuyển đổi quyền Trả lời" toggle_full: "Chuyển đổi quyền Tạo" - inherited: "Sự cho phép này được thừa hưởng từ “tất cả mọi người”" + inherited: 'Sự cho phép này được thừa hưởng từ “tất cả mọi người”' special_warning: "Cảnh báo: Đây là chuyên mục có sẵn nên bạn không thể chỉnh sửa các thiết lập bảo mật. Nếu bạn muốn sử dụng chuyên mục này, hãy xóa nó thay vì tái sử dụng." uncategorized_security_warning: "Danh mục này là đặc biệt. Nó được thiết kế như một khu vực tổ chức cho các chủ đề không có danh mục; nó không thể có cài đặt bảo mật." uncategorized_general_warning: 'Danh mục này là đặc biệt. Nó được sử dụng làm danh mục mặc định cho các chủ đề mới chưa chọn danh mục. Nếu bạn muốn ngăn hành vi này và buộc lựa chọn danh mục, vui lòng tắt cài đặt tại đây. Nếu bạn muốn thay đổi tên hoặc mô tả, hãy chuyển đến Tùy chỉnh / Nội dung Văn bản.' diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml index d10ddd51be..4d1ddec55e 100644 --- a/config/locales/client.zh_CN.yml +++ b/config/locales/client.zh_CN.yml @@ -1629,7 +1629,6 @@ zh_CN: options: "选项" whisper: "密语" unlist: "隐藏" - blockquote_text: "引用" add_warning: "正式警告" toggle_whisper: "折叠或展开密语" toggle_unlisted: "显示/隐藏于主题列表" @@ -1698,8 +1697,8 @@ zh_CN: link_dialog_title: "插入链接" link_optional_text: "可选标题" link_url_placeholder: "粘贴 URL 或键入以搜索主题" - quote_title: "引用" - quote_text: "引用" + blockquote_title: "引用" + blockquote_text: "引用" code_title: "预格式化文本" code_text: "预格式化文本将缩进 4 格" paste_code_text: "输入或粘贴代码" @@ -2072,6 +2071,7 @@ zh_CN: select: "用户只能在这个主题中发言一次:" description: "为了提高回帖太快或有争议内容的主题的讨论质量,用户再次发言之前必须稍作等待。" save: "启用" + enabled_until: "(可选)在以下日期之前启用:" remove: "停用" hours: "小时:" minutes: "分钟:" @@ -2426,12 +2426,15 @@ zh_CN: unread: "未读帖子" has_replies: other: "%{count} 回复" + has_replies_count: "%{count}" unknown_user: "(未知或已删除的用户)" has_likes_title: other: "%{count}人赞了该贴" has_likes_title_only_you: "你赞了这个帖子" has_likes_title_you: other: "你和另外的%{count}人赞了帖" + filtered_replies_hint: + other: "查看此帖子及其 %{count} 个回复" errors: create: "抱歉,在创建你的帖子时发生了错误。请重试。" edit: "抱歉,在编辑你的帖子时发生了错误。请重试。" @@ -2579,6 +2582,13 @@ zh_CN: edit_bookmark: name: "编辑收藏" description: "编辑收藏名称或修改提醒的日期和时间" + filtered_replies: + viewing: "查看 %{reply_count} 个回复" + viewing_posts_by: "查看 %{post_count} 个帖子" + viewing_subset: "一些回复已被折叠" + viewing_summary: "查看此主题的摘要" + post_number: "%{username},帖子 #%{post_number}" + show_all: "显示全部" category: can: "能够… " none: "(未分类)" @@ -2636,10 +2646,10 @@ zh_CN: reply: "回复" create: "创建" no_groups_selected: "没有群组被授予访问权限;此类别仅对管理员可见。" - everyone_has_access: "这个分类是公开的,任何人都可以看到,回复和创建帖子。要限制权限,请删除“所有人”组的一个或多个权限。" + everyone_has_access: '这个分类是公开的,任何人都可以看到,回复和创建帖子。要限制权限,请删除“所有人”组的一个或多个权限。' toggle_reply: "切换回复权限" toggle_full: "切换创建权限" - inherited: "此权限继承自 “所有人”" + inherited: '此权限继承自 “所有人”' special_warning: "警告:这是一个预设的分类,它的安全设置不能被更改。如果你不想要使用这个分类,直接删除它,而不是另作他用。" uncategorized_security_warning: "这是个特殊的分类。如果不知道应该话题属于哪个分类,那么请使用这个分类。这个分类没有安全设置。" uncategorized_general_warning: '这个分类是特殊的。它用作未选择分类的新主题的默认分类。如果你想要避免此行为并强制选择分类,请在此处禁用该设置。如果你要修改其名称或描述,请转到自定义/文本内容。' @@ -4451,6 +4461,7 @@ zh_CN: image: 图片 icon_help: "输入一个 Font Awsome 图标的名称(使用前缀“far-”表示常规图标,“fab-”表示品牌图标)" image_help: "输入图像的 URL(如果同时设置了 URL 和图标,则 URL 会覆盖图标)" + read_only_setting_help: "自定义文本" query: 徽章查询(SQL) target_posts: 查询到的帖子 auto_revoke: 每天运行撤销查询 diff --git a/config/locales/client.zh_TW.yml b/config/locales/client.zh_TW.yml index c2ff5716e6..00fb49fddf 100644 --- a/config/locales/client.zh_TW.yml +++ b/config/locales/client.zh_TW.yml @@ -1317,7 +1317,6 @@ zh_TW: options: "選項" whisper: "密談" unlist: "不公開" - blockquote_text: "塊引用" add_warning: "這是正式警告。" toggle_whisper: "切換密談" toggle_unlisted: "切換 不公開" @@ -1377,8 +1376,7 @@ zh_TW: link_description: "在此輸入超連結的描述" link_dialog_title: "插入超連結" link_optional_text: "標題 (可選填)" - quote_title: "引用" - quote_text: "引用" + blockquote_text: "塊引用" code_title: "預先格式化文字" code_text: "以 4 格空白將文字縮排" paste_code_text: "輸入或貼上代碼" diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index bd41192715..c9b0144774 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -1700,6 +1700,7 @@ de: body_min_entropy: "Für den Text neuer Beiträge minimal erforderliche Entropie (einzigartige Zeichen)." allow_uppercase_posts: "Beiträge oder Titel von Themen mit ausschließlich Großschreibweise erlauben." max_consecutive_replies: "Anzahl an aufeinanderfolgenden Beiträgen, die ein Benutzer in einem Thema schreiben kann, bevor eine weitere Antwort verhindert wird." + enable_filtered_replies_view: "(n) Antwortschaltfläche sollte alle anderen Beiträge einklappen und nur die ausgewählten Antworten anzeigen." title_fancy_entities: "Konvertiere HTML-Entitäten in Themen-Überschriften, nach dem Smarty-Pants-Schema https://daringfireball.net/projects/smartypants/" min_title_similar_length: "Minimale Länge eines Titels, bevor nach ähnlichen Titeln gesucht wird." desktop_category_page_style: "Visueller Stil für die /categories Seite" @@ -1998,6 +1999,7 @@ de: governing_law: "Anzuwendendes Recht" city_for_disputes: "Stadt für Rechtsstreitigkeiten" shared_drafts_category: "Aktiviere die Funktion „Gemeinsame Vorlagen“, indem du eine Kategorie für Themen-Vorlagen bestimmst. Themen in dieser Kategorie werden unterdrückt in der Themen Liste für Team Mitarbeiter." + shared_drafts_min_trust_level: "Ermöglichen Sie Benutzern das Anzeigen und Bearbeiten von freigegebenen Entwürfen." push_notifications_prompt: "Zeige eine Aufforderung zur Benutzerzustimmung an." push_notifications_icon: "Das Abzeichensymbol, das in der Benachrichtigungsecke angezeigt wird. Ein 96 × 96 monochromatisches PNG mit Transparenz wird empfohlen." base_font: "Basisschriftart für die meisten Texte auf der Website. Themes können über die `--font-family` CSS-benutzerdefinierte Eigenschaft überschrieben werden." @@ -2219,6 +2221,18 @@ de: admin: email: sent_test: "gesendet!" + user: + merge_user: + updating_username: "Aktualisiere Benutzername..." + changing_post_ownership: "Ändern des Beitragbesitzers ..." + merging_given_daily_likes: "Zusammenführen gegebener täglicher Likes ..." + merging_post_timings: "Beitragszeiten zusammenführen ..." + merging_user_visits: "Zusammenführen von Benutzerbesuchen ..." + updating_site_settings: "Site-Einstellungen aktualisieren..." + updating_user_stats: "Aktualisiere Benutzerstatistik..." + merging_user_attributes: "Benutzerattribute zusammenführen..." + updating_user_ids: "Aktualisiere Benutzer-Ids..." + deleting_source_user: "Lösche Quellbenutzer..." user: deactivated: "Deaktiviert wegen zu vielen unzustellbaren E-Mails an '%{email}'." deactivated_by_staff: "Deaktiviert vom Team" diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index 72ad7195d0..75519fc4fc 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -2354,6 +2354,18 @@ he: admin: email: sent_test: "נשלח!" + user: + merge_user: + updating_username: "שם המשתמש מעודכן…" + changing_post_ownership: "הבעלות על הפוסט מתחלפת…" + merging_given_daily_likes: "הלייקים היומיים שחולקו ממוזגים…" + merging_post_timings: "תזמוני הפוסטים ממוזגים…" + merging_user_visits: "ביקורי המשתמש מתמזגים…" + updating_site_settings: "הגדרות האתר מתמזגות…" + updating_user_stats: "סטטיסטיקת המשתמש מתעדכנת…" + merging_user_attributes: "מאפייני המשתמש מתמזגים…" + updating_user_ids: "מזהי המשתמש מתעדכנים…" + deleting_source_user: "משתמש המקור נמחק…" user: deactivated: "הושבת בעקבות מיילים רבים מידי שהוחזרו ל '%{email}'." deactivated_by_staff: "הושבת על ידי הצוות" diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml index b9b6e41047..8e99a1ac03 100644 --- a/config/locales/server.ko.yml +++ b/config/locales/server.ko.yml @@ -1977,6 +1977,7 @@ ko: governing_law: "준거법" city_for_disputes: "분쟁의 도시" shared_drafts_category: "주제 초안의 범주를 지정하여 공유 초안 기능을 사용하십시오. 이 범주의 주제는 직원 사용자의 주제 목록에서 표시되지 않습니다." + shared_drafts_min_trust_level: "사용자가 공유 초안을 보고 편집할 수 있도록 허용합니다." push_notifications_prompt: "사용자 동의 프롬프트를 표시합니다." push_notifications_icon: "알림 모서리에 나타나는 배지 아이콘입니다. 투명도가 있는 96×96 단색 PNG 이미지를 사용하는 것이 좋습니다." base_font: "사이트에서 대부분의 텍스트에 사용할 기본 글꼴입니다. 테마는`--font-family` CSS 사용자 정의 속성을 통해 재정의 할 수 있습니다." @@ -2178,6 +2179,18 @@ ko: admin: email: sent_test: "전송됨!" + user: + merge_user: + updating_username: "사용자명 업데이트 중..." + changing_post_ownership: "글 작성자 변경 중..." + merging_given_daily_likes: "일일 좋아요 병합 중..." + merging_post_timings: "게시 시간 병합 중..." + merging_user_visits: "사용자 방문 병합 중..." + updating_site_settings: "사이트 설정 업데이트 중..." + updating_user_stats: "사용자 통계 업데이트 중..." + merging_user_attributes: "사용자 속성 병합 중..." + updating_user_ids: "사용자 ID 업데이트 중..." + deleting_source_user: "소스 사용자 삭제 중..." user: deactivated: "'%{email}'에 반송 이메일이 너무 많아 비활성화되었습니다." deactivated_by_staff: "운영진에 의해 비활성화됨" diff --git a/config/locales/server.pl_PL.yml b/config/locales/server.pl_PL.yml index a54efee3e2..c3026be6f3 100644 --- a/config/locales/server.pl_PL.yml +++ b/config/locales/server.pl_PL.yml @@ -94,7 +94,7 @@ pl_PL: incoming: default_subject: "Ten temat wymaga tytułu" show_trimmed_content: "Pokaż skróconą zawartość" - maximum_staged_user_per_email_reached: "Osiągnięto maksymalną ilość użytkowników zarejestrowanych przez email." + maximum_staged_user_per_email_reached: "Osiągnięto maksymalną ilość użytkowników etapowych zarejestrowanych przez email." no_subject: "(brak tematu)" no_body: "(brak treści wpisu)" missing_attachment: "(Brakuje załącznika %{filename})" @@ -1817,6 +1817,7 @@ pl_PL: body_min_entropy: "Minimalna entropia treści wpisu (liczba różnych znaków, zaleca się więcej dla języków innych niż angielski)." allow_uppercase_posts: "Zezwól na same wielkie litery w tytule tematu lub treści wpisu." max_consecutive_replies: "Liczba wpisów, które użytkownik musi wykonać w jednym rzędzie w temacie, zanim nie będzie można dodać kolejnej odpowiedzi." + enable_filtered_replies_view: "przycisk (n) odpowiedzi powinien zwinąć wszystkie inne posty i pokazywać tylko wybrane odpowiedzi." title_fancy_entities: "Konwertuj typowe znaki ASCII na fantazyjne jednostki HTML w tytułach tematów, ala SmartyPants https://daringfireball.net/projects/smartypants/" min_title_similar_length: "Minimalna długość tytułu zanim zostanie sprawdzony z podobnymi tematami." desktop_category_page_style: "Styl wizualny dla strony kategorii." @@ -1886,8 +1887,8 @@ pl_PL: delete_email_logs_after_days: "Usuń logi email po (N) dniach. 0 by trzymać w nieskończoność" disallow_reply_by_email_after_days: "Nie zezwalaj na wiadomości e-mail po (N) dniach. 0, aby zachować na czas nieokreślony" max_emails_per_day_per_user: "Maksymalna liczba maili, jakie użytkownik może wysłać w ciągu dnia. 0 wyłącza ograniczenie." - enable_staged_users: "Automatycznie twórz wystawianych użytkowników podczas przetwarzania przychodzących emaili." - maximum_staged_users_per_email: "Maksymalna liczba wystawionych stworzonych użytkowników podczas przetwarzania przychodzących emaili." + enable_staged_users: "Automatycznie twórz użytkowników etapowych podczas przetwarzania przychodzących wiadomości e-mail." + maximum_staged_users_per_email: "Maksymalna liczba użytkowników etapowych utworzonych podczas przetwarzania przychodzącej wiadomości e-mail." auto_generated_allowlist: "Lista adresów e-mail, które nie będą sprawdzane pod kątem zawartości generowanej automatycznie. Przykład: foo@bar.com|discourse@bar.com" block_auto_generated_emails: "Odrzucaj maile przychodzące zidentyfikowane jako wysłane automatycznie." ignore_by_title: "Ignoruj przychodzące wiadomości e-mail w oparciu o ich tytuł." @@ -2375,6 +2376,18 @@ pl_PL: admin: email: sent_test: "wysłany!" + user: + merge_user: + updating_username: "Aktualizuję nazwę użytkownika ..." + changing_post_ownership: "Zmiana właściciela wpisu..." + merging_given_daily_likes: "Łączenie oddanych dziennych polubień..." + merging_post_timings: "Łączenie czasów postów..." + merging_user_visits: "Łączenie odwiedzin użytkownika..." + updating_site_settings: "Aktualizowanie ustawień strony..." + updating_user_stats: "Aktualizowanie statystyk użytkownika..." + merging_user_attributes: "Łączenie atrybutów użytkownika..." + updating_user_ids: "Aktualizuję identyfikatory użytkowników..." + deleting_source_user: "Usuwanie użytkownika źródłowego..." user: deactivated: "Został dezaktywowany w związku ze zbyt dużą liczbą odrzuconych emaili na '%{email}'." deactivated_by_staff: "Wyłączone przez personel" @@ -2410,7 +2423,7 @@ pl_PL: domain_not_allowed: "Błędny adres strony internetowej. Dozwolone domeny: %{domains}" auto_rejected: "Odrzucono automatycznie ze względu na wiek. Zobacz ustawienia auto_handle_queued_age witryny." destroy_reasons: - unused_staged_user: "Nieużywany użytkownik wystawiony" + unused_staged_user: "Nieużywany użytkownik etapowy" fixed_primary_email: "Ustalony główny adres e-mail wystawionego użytkownika" same_ip_address: "Taki sam adres IP (%{ip_address}) jak inni użytkownicy" inactive_user: "Nieaktywny użytkownik" @@ -4554,7 +4567,7 @@ pl_PL: fast_typer: "Nowy użytkownik wpisał swój pierwszy post podejrzanie szybko, co sugeruje zachowanie bota lub spamera. Zobacz `min_first_post_typing_time`." auto_silence_regexp: "Nowy użytkownik, którego pierwszy post pasuje do ustawienia `auto_silence_first_post_regex`." watched_word: "Ten post zawierał obserwowane słowo. Zobacz listę obserwowanych słów." - staged: "Nowe tematy i posty dla użytkowników przejściowych muszą zostać zatwierdzone przez personel. Zobacz `approve_unless_staged`." + staged: "Nowe tematy i posty dla użytkowników etapowych muszą zostać zatwierdzone przez personel. Zobacz `approve_unless_staged`." category: "Posty w tej kategorii wymagają ręcznego zatwierdzenia przez personel. Zobacz ustawienia kategorii." must_approve_users: "Wszyscy nowi użytkownicy muszą zostać zatwierdzeni przez personel. Zobacz `must_approve_users`." invite_only: "Wszyscy nowi użytkownicy powinni zostać zaproszeni. Zobacz `invite_only`." diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml index 3c1268f303..93ff756688 100644 --- a/config/locales/server.ru.yml +++ b/config/locales/server.ru.yml @@ -272,7 +272,7 @@ ru: email_template_cant_be_modified: "Этот почтовый шаблон не может быть изменён" invalid_whisper_access: "Либо скрытые сообщения не разрешены, либо у вас нет прав на создание скрытых сообщений" not_in_group: - title_topic: "Вам нужно запросить членство в группе%{group}, чтобы увидеть эту тему." + title_topic: "Вам нужно запросить членство в группе '%{group}', чтобы увидеть эту тему." title_category: "Вы должны быть членом группы, чтобы видеть этот раздел" request_membership: "Запрос на включение в группу" join_group: "Присоединиться к группе" @@ -1816,7 +1816,8 @@ ru: title_min_entropy: "Минимальная энтропия, требуемая для названия темы. Энтропия - количество уникальных символов, причём некоторые русские буквы могут считаться за 2 символа, а не за 1, как английские)." body_min_entropy: "Минимальная энтропия, требуемая для текста новой темы. Энтропия - количество уникальных символов, причём некоторые русские буквы могут считаться за 2 символа, а не за 1, как английские)." allow_uppercase_posts: "Разрешать создавать названия тем или сообщения заглавными буквами." - max_consecutive_replies: "Количество сообщений, которые пользователь должен создать подряд в теме, прежде чем он не сможет добавить ещё один ответ." + max_consecutive_replies: "Максимальное количество сообщений, которые пользователь может создать ПОДРЯД в теме, после чего у него не будет возможности добавить ещё один ответ." + enable_filtered_replies_view: "Кнопка ответов отображает только выбранные ответы, свернув все остальные сообщения." title_fancy_entities: "В заголовках тем преобразовывать обычные символы ASCII и пунктуацию SmartyPants в объекты HTML" min_title_similar_length: "Минимальная длина названия темы, при которой название будет проверено на наличие похожих тем." desktop_category_page_style: "Визуальный стиль для секции 'Разделы'." @@ -2182,7 +2183,7 @@ ru: value: "SSO секрет" search: extreme_load_error: "Сайт сильно загружен, поиск отключен, попробуйте повторить позже" - within_post: "#%{post_number} от %{username}" + within_post: "#%{post_number} от пользователя %{username}" types: category: "Разделы" topic: "Результаты" @@ -2375,6 +2376,18 @@ ru: admin: email: sent_test: "Отправлено!" + user: + merge_user: + updating_username: "Обновление имени пользователя ..." + changing_post_ownership: "Изменение владельца сообщения..." + merging_given_daily_likes: "Объединение выданных ежедневных симпатий..." + merging_post_timings: "Объединение времени создания сообщений..." + merging_user_visits: "Объединение статистики посещений пользователей..." + updating_site_settings: "Обновление настроек сайта..." + updating_user_stats: "Обновление статистики пользователя..." + merging_user_attributes: "Объединение атрибутов пользователя..." + updating_user_ids: "Обновление идентификаторов пользователя..." + deleting_source_user: "Удаление исходного пользователя..." user: deactivated: "Был деактивирован из-за слишком большого количества возвращённых писем на адрес '%{email}'." deactivated_by_staff: "Выключено персоналом" diff --git a/config/locales/server.sv.yml b/config/locales/server.sv.yml index aac3430e73..e7adc22c4a 100644 --- a/config/locales/server.sv.yml +++ b/config/locales/server.sv.yml @@ -1700,6 +1700,7 @@ sv: body_min_entropy: "Minsta tillåtna entropi (unika tecken) som krävs för ett inläggs innehåll." allow_uppercase_posts: "Tillåt enbart versaler i ämnets rubrik eller innehåll." max_consecutive_replies: "Antal inlägg som en användare måste göra i rad inom ett ämne innan användaren hindras lägga till ytterligare ett svar." + enable_filtered_replies_view: "(n)-svarsknappen bör förminska alla andra inlägg och bara visa valda svar." title_fancy_entities: "Konvertera vanliga ASCII-tecken till häftiga HTML-enheter i ämnesrubriker, à la SmartyPants http://daringfireball.net/projects/smartypants/" min_title_similar_length: "Minsta längd för en rubrik innan den kommer att kontrolleras för liknande ämnen." desktop_category_page_style: "Visuell stil för /kategorier-sidan." @@ -2220,6 +2221,18 @@ sv: admin: email: sent_test: "skickat!" + user: + merge_user: + updating_username: "Uppdaterar användarnamn..." + changing_post_ownership: "Ändrar äganderätt till inlägget..." + merging_given_daily_likes: "Sammanslagning av dagliga gillanden..." + merging_post_timings: "Sammanslagning av tidpunkter för inlägg..." + merging_user_visits: "Sammanslagning av användarbesök..." + updating_site_settings: "Uppdaterar webbplatsinställningar..." + updating_user_stats: "Uppdaterar användarstatistik..." + merging_user_attributes: "Sammanslagning av användarattribut..." + updating_user_ids: "Uppdaterar användar-id..." + deleting_source_user: "Tar bort källanvändare..." user: deactivated: "Inaktiverades på grund av för många studsade e-postmeddelanden till '%{email}'." deactivated_by_staff: "Avaktiverades av personalen" diff --git a/config/locales/server.zh_CN.yml b/config/locales/server.zh_CN.yml index 07f14c20b1..2b4328e725 100644 --- a/config/locales/server.zh_CN.yml +++ b/config/locales/server.zh_CN.yml @@ -1672,6 +1672,7 @@ zh_CN: body_min_entropy: "在一个帖子内文中,允许的最低熵值(不同字符数,非英语字符算作多个)。" allow_uppercase_posts: "允许标题和内容全大写" max_consecutive_replies: "在阻止添加其他回复之前,用户必须在主题中连续发布的帖子数。" + enable_filtered_replies_view: "(n) 回复按钮应折叠所有其他帖子,并仅显示选定的回复。" title_fancy_entities: "将常见的ASCII字符转换为主题标题中的花哨HTML实体,ala SmartyPants https://daringfireball.net/projects/smartypants/" min_title_similar_length: "开始检查相似主题的帖子标题的最小长度。" desktop_category_page_style: "/categories 页面的视觉样式。" @@ -2173,6 +2174,18 @@ zh_CN: admin: email: sent_test: "已发送!" + user: + merge_user: + updating_username: "正在更新用户名..." + changing_post_ownership: "更改帖子所有权..." + merging_given_daily_likes: "正在合并每日喜欢..." + merging_post_timings: "正在合并帖子发布时间..." + merging_user_visits: "正在合并用户访问..." + updating_site_settings: "正在更新站点设置..." + updating_user_stats: "正在更新用户统计信息..." + merging_user_attributes: "正在合并用户属性..." + updating_user_ids: "正在更新用户ID ..." + deleting_source_user: "正在删除源用户..." user: deactivated: "因发送至“%{email}”的邮件被多次退信,取消激活" deactivated_by_staff: "被管理人员禁用" diff --git a/plugins/discourse-narrative-bot/config/locales/server.fr.yml b/plugins/discourse-narrative-bot/config/locales/server.fr.yml index 241176dbfc..5a074b27c0 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.fr.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.fr.yml @@ -12,6 +12,7 @@ fr: discourse_narrative_bot_disable_public_replies: "Désactiver les réponses publiques de l'assistant Discourse" discourse_narrative_bot_welcome_post_type: "Type de message de bienvenue envoyé par l'assistant Discourse" discourse_narrative_bot_welcome_post_delay: "Attendre (n) seconde(s) avant d'envoyer le message de bienvenue de l'assistant Discourse" + discourse_narrative_bot_skip_tutorials: "Tutoriels de l'assistant Discourse à ignorer" badges: certified: name: Certifié @@ -27,6 +28,8 @@ fr: bio: "Bonjour, je ne suis pas une personne réelle. Je suis un robot pour vous faire découvrir ce site. Pour interagir avec moi, envoyez-moi un message ou mentionnez **`@%{discobot_username}`** n'importe où." tl2_promotion_message: subject_template: "Maintenant que vous avez été promu, il est temps d’en apprendre davantage sur certaines fonctionnalités avancées !" + text_body_template: | + Répondez à ce message par `@%{discobot_username} %{reset_trigger}` pour en savoir plus sur ce que vous pouvez faire. timeout: message: |- Hey @%{username}, je viens voir si tout va bien car je n'ai pas eu de vos nouvelles depuis un moment. @@ -42,6 +45,9 @@ fr: trigger: "Jet" invalid: |- Je suis désolé, c'est mathématiquement impossible d'obtenir cette combinaison de dés. :confounded: + not_enough_dice: + one: "Je n'ai que %{count} dé(s). [Shameful](https://www.toplessrobot.com/2009/04/the_10_most_shameful_rpg_dice.php), Je sais !" + other: "Je n'ai que %{count} dés. [Shameful](https://www.toplessrobot.com/2009/04/the_10_most_shameful_rpg_dice.php), Je sais !" out_of_range: |- Saviez-vous que [le nombre maximal de face](https://www.wired.com/2016/05/mathematical-challenge-of-designing-the-worlds-most-complex-120-sided-dice) pour un dé non truqué est de 120 ? results: |- @@ -182,6 +188,23 @@ fr: Sympa la photo ! – J'ai appuyé sur le bouton :heart: J'aime pour que vous sachiez au combien je l'apprécie. :heart_eyes: like_not_found: |- Avez-vous oublié d'aimer :heart: mon [message ?](%{url}) :crying_cat_face: + not_found: |- + Il semblerait que vous n'ayez pas téléversé d'image, j'en ai donc choisi une qui vous fera _certainement_ plaisir. + + `%{image_url}` + + Essayez de téléverser cette image, ou de coller le lien sur une nouvelle ligne vide ! + likes: + instructions: |- + Voici une photo de licorne : + + + + Si vous l'aimez (et qui n'aime pas les licornes ?) allez-y, appuyez sur le bouton _J'aime_ :heart: sous ce message pour me le faire savoir. + reply: |- + Merci d'avoir apprécié mon message ! + not_found: |- + Avez-vous oublié _d'aimer_ :heart: mon [message ?](%{url}) :crying_cat_face: formatting: instructions: |- Pouvez-vous faire quelques mots en **gras** ou en _italique_ dans votre réponse ? @@ -261,6 +284,8 @@ fr: reply: |- [Notre équipe](%{base_uri}/groups/staff) sera notifié de façon privée de votre signalement. Si assez de membres de la communauté signalent un message, il sera automatiquement masqué par précaution. (Puisque je n'ai pas réellement écrit un article méchant :ange: j'ai anticipé et j'ai enlevé le signalement pour le moment.) + not_found: |- + Oh non, mon _sale_ message n'a pas encore été signalé comme inapproprié. :worried: Pouvez-vous le signaler comme inapproprié à l'aide du ** drapeau ** ? N'oubliez pas d'utiliser le bouton Afficher plus pour afficher plus d'actions pour chaque message. search: instructions: |- _psst_ … J'ai caché une surprise dans ce sujet. Si vous aimez les challenges, sélectionnez **l’icône de recherche** en haut à droite ↗ pour la trouver. diff --git a/plugins/discourse-presence/config/locales/client.fa_IR.yml b/plugins/discourse-presence/config/locales/client.fa_IR.yml index ff398c26db..43e36c60a0 100644 --- a/plugins/discourse-presence/config/locales/client.fa_IR.yml +++ b/plugins/discourse-presence/config/locales/client.fa_IR.yml @@ -7,6 +7,12 @@ fa_IR: js: presence: + replying: + one: "در حال نوشتن پاسخ" + other: "در حال نوشتن پاسخ" + editing: + one: "در حال ویرایش" + other: "در حال ویرایش" replying_to_topic: - one: "پاسخ دادن" + one: "در حال نوشتن پاسخ" other: "پاسخ دادن" diff --git a/plugins/discourse-presence/config/locales/client.fr.yml b/plugins/discourse-presence/config/locales/client.fr.yml index 3e4b43fa1d..592ce8fc92 100644 --- a/plugins/discourse-presence/config/locales/client.fr.yml +++ b/plugins/discourse-presence/config/locales/client.fr.yml @@ -7,6 +7,12 @@ fr: js: presence: + replying: + one: "en train de répondre" + other: "en train de répondre" + editing: + one: "en train de modifier" + other: "en train de modifier" replying_to_topic: one: "en train de répondre" other: "en train de répondre" diff --git a/plugins/discourse-presence/config/locales/server.fa_IR.yml b/plugins/discourse-presence/config/locales/server.fa_IR.yml index 6d9b7dae72..48808ad030 100644 --- a/plugins/discourse-presence/config/locales/server.fa_IR.yml +++ b/plugins/discourse-presence/config/locales/server.fa_IR.yml @@ -7,4 +7,4 @@ fa_IR: site_settings: presence_enabled: "کاربرانی که در حال حاضر به موضوع فعلی پاسخ می‌دهند و یا در حال ویرایش پست فعلی هستند، نمایش داده شوند؟" - presence_max_users_shown: "حداکثر تعداد کاربران نشان داده شده است." + presence_max_users_shown: "حداکثر تعداد کاربران نمایش داده شده." diff --git a/plugins/poll/config/locales/client.fr.yml b/plugins/poll/config/locales/client.fr.yml index 22fa743c62..06048a891f 100644 --- a/plugins/poll/config/locales/client.fr.yml +++ b/plugins/poll/config/locales/client.fr.yml @@ -63,6 +63,12 @@ fr: automatic_close: closes_in: "Se termine dans %{timeLeft}." age: "Fermé %{age}" + breakdown: + title: "Résultats du sondage" + votes: "%{count} votes" + breakdown: "Détails" + percentage: "Pourcentage" + count: "Nombre" error_while_toggling_status: "Désolé, il y a eu une erreur lors du changement de statut de ce sondage." error_while_casting_votes: "Désolé, il y a eu une erreur lors de l'envoi de vos votes." error_while_fetching_voters: "Désolé, il y a eu une erreur lors de l'affichage des votants." diff --git a/plugins/styleguide/config/locales/client.fa_IR.yml b/plugins/styleguide/config/locales/client.fa_IR.yml index 2b80a74fec..bda8b0784b 100644 --- a/plugins/styleguide/config/locales/client.fa_IR.yml +++ b/plugins/styleguide/config/locales/client.fa_IR.yml @@ -8,28 +8,74 @@ fa_IR: js: styleguide: welcome: "برای شروع، از فهرست سمت چپ یک گزینه را انتخاب کنید." + categories: + atoms: اتم‌ها + molecules: مولکول ها + organisms: موجودات زنده sections: typography: + title: "تایپوگرافی" example: "به سامانه گفتمان Discourse خوش آمدید!" + paragraph: "لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ، و با استفاده از طراحان گرافیک است، چاپگرها و متون بلکه روزنامه و مجله در ستون و سطرآنچنان که لازم است، و برای شرایط فعلی تکنولوژی مورد نیاز، و کاربردهای متنوع با هدف بهبود ابزارهای کاربردی می باشد، کتابهای زیادی در شصت و سه درصد گذشته حال و آینده، شناخت فراوان جامعه و متخصصان را می طلبد، تا با نرم افزارها شناخت بیشتری را برای طراحان رایانه ای علی الخصوص طراحان خلاقی، و فرهنگ پیشرو در زبان فارسی ایجاد کرد، در این صورت می توان امید داشت که تمام و دشواری موجود در ارائه راهکارها، و شرایط سخت تایپ به پایان رسد و زمان مورد نیاز شامل حروفچینی دستاوردهای اصلی، و جوابگوی سوالات پیوسته اهل دنیای موجود طراحی اساسا مورد استفاده قرار گیرد." + date_time_inputs: + title: "ورودی های تاریخ / زمان" + font_scale: + title: "فونت سیستم" colors: title: "رنگ‌ها" icons: title: "نشانه‌ها" full_list: "نمایش لیست تمامی نشانه‌های Font Awesome" + input_fields: + title: "فیلدهای ورودی" buttons: title: "دکمه ها" + dropdowns: + title: "دراپ‌داون" categories: title: "دسته‌بندی‌ها" + bread_crumbs: + title: "مسیر راهنما" navigation: title: "ناوبری" + navigation_bar: + title: "نوار ناوبری" + categories_list: + title: "لیست دسته ها" topic_link: title: "پیوند/لینک موضوع" + topic_list_item: + title: "مورد لیست سرفصل" + topic_statuses: + title: "وضعیت‌های سرفصل" topic_list: title: "فهرست موضوعات" latest_topic_list: title: "آخرین فهرست موضوعات" + footer_message: + title: "پیام پاورقی" + signup_cta: + title: "فراخوانی اقدام ثبت نام" + topic_timer_info: + title: "زمانسنج‌های سرفصل" + topic_footer_buttons: + title: "دکمه‌های پاورقی سرفصل" + topic_notifications: + title: "اعلانات سرفصل" + post: + title: "نوشته" + topic_map: + title: "نقشه سرفصل" + suggested_topics: + title: "سرفصل‌های پیشنهادی" + post_menu: + title: "منوی نوشته" modal: header: "عنوان پنجره (مودال)" footer: "پایین پنجره (مودال)" user_about: title: "جعبه درباره کاربر" + header_icons: + title: "نمادهای سربرگ" + spinners: + title: "اسپینرها" From 31fe0e91ad7e0a8f618c58087c926c887af4134a Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Tue, 15 Dec 2020 11:23:44 -0500 Subject: [PATCH 117/393] UX: Tweaks to filtered replies (#11485) Include the enable_filtered_replies_view site setting in the admin UI Adds title label to in-reply-to widget Invokes the filtered UI when using replies_to_post_number as a query parameter Replaces the "Show All" button icon Fixes grammar for "Viewing 1 reply to..." label --- app/assets/javascripts/discourse/app/controllers/topic.js | 3 ++- app/assets/javascripts/discourse/app/models/post-stream.js | 3 ++- app/assets/javascripts/discourse/app/widgets/post-stream.js | 6 +++--- app/assets/javascripts/discourse/app/widgets/post.js | 2 +- config/locales/client.en.yml | 6 +++++- config/locales/server.en.yml | 2 +- config/site_settings.yml | 1 - 7 files changed, 14 insertions(+), 9 deletions(-) diff --git a/app/assets/javascripts/discourse/app/controllers/topic.js b/app/assets/javascripts/discourse/app/controllers/topic.js index a09f99261e..e52954452b 100644 --- a/app/assets/javascripts/discourse/app/controllers/topic.js +++ b/app/assets/javascripts/discourse/app/controllers/topic.js @@ -52,7 +52,7 @@ export default Controller.extend(bufferedProperty("model"), { multiSelect: false, selectedPostIds: null, editingTopic: false, - queryParams: ["filter", "username_filters"], + queryParams: ["filter", "username_filters", "replies_to_post_number"], loadedAllPosts: or( "model.postStream.loadedAllPosts", "model.postStream.loadingLastPost" @@ -64,6 +64,7 @@ export default Controller.extend(bufferedProperty("model"), { _progressIndex: null, hasScrolled: null, username_filters: null, + replies_to_post_number: null, filter: null, quoteState: null, diff --git a/app/assets/javascripts/discourse/app/models/post-stream.js b/app/assets/javascripts/discourse/app/models/post-stream.js index 0f6fd114af..49ac6c06da 100644 --- a/app/assets/javascripts/discourse/app/models/post-stream.js +++ b/app/assets/javascripts/discourse/app/models/post-stream.js @@ -46,7 +46,8 @@ export default RestModel.extend({ stream: [], userFilters: [], summary: false, - filterRepliesToPostNumber: false, + filterRepliesToPostNumber: + parseInt(this.get("topic.replies_to_post_number"), 10) || false, filterUpwardsPostID: false, loaded: false, loadingAbove: false, diff --git a/app/assets/javascripts/discourse/app/widgets/post-stream.js b/app/assets/javascripts/discourse/app/widgets/post-stream.js index b95404a4c2..8b26c81679 100644 --- a/app/assets/javascripts/discourse/app/widgets/post-stream.js +++ b/app/assets/javascripts/discourse/app/widgets/post-stream.js @@ -90,8 +90,8 @@ createWidget("posts-filtered-notice", { return [ h( "span.filtered-replies-viewing", - I18n.t("post.filtered_replies.viewing", { - reply_count: sourcePost.reply_count, + I18n.t("post.filtered_replies_viewing", { + count: sourcePost.reply_count, }) ), h("span.filtered-user-row", [ @@ -170,7 +170,7 @@ createWidget("filter-show-all", { }, html() { - return [iconNode("far-comments"), I18n.t("post.filtered_replies.show_all")]; + return [iconNode("arrows-alt-v"), I18n.t("post.filtered_replies.show_all")]; }, click() { diff --git a/app/assets/javascripts/discourse/app/widgets/post.js b/app/assets/javascripts/discourse/app/widgets/post.js index 277dc987ef..6ee54ebbc8 100644 --- a/app/assets/javascripts/discourse/app/widgets/post.js +++ b/app/assets/javascripts/discourse/app/widgets/post.js @@ -120,7 +120,7 @@ createWidget("select-post", { createWidget("reply-to-tab", { tagName: "a.reply-to-tab", buildKey: (attrs) => `reply-to-tab-${attrs.id}`, - + title: "post.in_reply_to", defaultState() { return { loading: false }; }, diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 98d7ebdb29..deb85f1313 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -2752,6 +2752,11 @@ en: filtered_replies_hint: one: "View this post and its reply" other: "View this post and its %{count} replies" + filtered_replies_viewing: + one: "Viewing %{count} reply to" + other: "Viewing %{count} replies to" + + in_reply_to: "Load parent post" errors: create: "Sorry, there was an error creating your post. Please try again." @@ -2924,7 +2929,6 @@ en: description: "Edit the bookmark name or change the reminder date and time" filtered_replies: - viewing: "Viewing %{reply_count} replies to" viewing_posts_by: "Viewing %{post_count} posts by" viewing_subset: "Some replies are collapsed" viewing_summary: "Viewing a summary of this topic" diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index bfde2e57a0..2881faee8d 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1863,7 +1863,7 @@ en: body_min_entropy: "The minimum entropy (unique characters, non-english count for more) required for a post body." allow_uppercase_posts: "Allow all caps in a topic title or a post body." max_consecutive_replies: "Number of posts a user has to make in a row in a topic before being prevented from adding another reply." - enable_filtered_replies_view: "(n) replies button should collapse all other posts and only show the selected replies." + enable_filtered_replies_view: '"(n) replies" button collapses all other posts and only shows the current post and its replies.' title_fancy_entities: "Convert common ASCII characters to fancy HTML entities in topic titles, ala SmartyPants https://daringfireball.net/projects/smartypants/" diff --git a/config/site_settings.yml b/config/site_settings.yml index 9271511311..f5046ee86f 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -728,7 +728,6 @@ posting: enable_filtered_replies_view: default: false client: true - hidden: true title_prettify: default: true locale_default: From 2b2c8402977d2a82c43698e1daee61c8d412e5a4 Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Tue, 15 Dec 2020 12:35:14 -0500 Subject: [PATCH 118/393] DEV: Fix JS errors in styleguide (#11494) Replaces latest topic list component with basic topic list (the former no longer exists). And fixes the display of the topic footer buttons. --- .../javascripts/discourse/lib/dummy-data.js.es6 | 12 +++++++++--- .../styleguide/organisms/03-topic-footer-buttons.hbs | 4 +--- .../styleguide/organisms/basic-topic-list.hbs | 3 +++ .../styleguide/organisms/latest-topic-list.hbs | 3 --- plugins/styleguide/config/locales/client.en.yml | 4 ++-- 5 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 plugins/styleguide/assets/javascripts/discourse/templates/styleguide/organisms/basic-topic-list.hbs delete mode 100644 plugins/styleguide/assets/javascripts/discourse/templates/styleguide/organisms/latest-topic-list.hbs diff --git a/plugins/styleguide/assets/javascripts/discourse/lib/dummy-data.js.es6 b/plugins/styleguide/assets/javascripts/discourse/lib/dummy-data.js.es6 index 1ace401581..56b8b75be3 100644 --- a/plugins/styleguide/assets/javascripts/discourse/lib/dummy-data.js.es6 +++ b/plugins/styleguide/assets/javascripts/discourse/lib/dummy-data.js.es6 @@ -1,3 +1,4 @@ +import EmberObject from "@ember/object"; import NavItem from "discourse/models/nav-item"; let topicId = 2000000; @@ -114,9 +115,14 @@ export function createData(store) { }; let topic = createTopic(); - topic.set("category", categories[0]); - topic.get("details").setProperties({ - can_create_post: true, + topic.setProperties({ + details: EmberObject.create({ + can_create_post: true, + can_invite_to: false, + can_delete: false, + can_close_topic: false, + }), + category: categories[0], suggested_topics: [topic, topic, topic], }); diff --git a/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/organisms/03-topic-footer-buttons.hbs b/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/organisms/03-topic-footer-buttons.hbs index 0e415beac8..e7edad4509 100644 --- a/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/organisms/03-topic-footer-buttons.hbs +++ b/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/organisms/03-topic-footer-buttons.hbs @@ -1,7 +1,5 @@ {{#styleguide-example title="topic-footer-buttons - logged in"}} - {{topic-footer-buttons - canInviteTo=true - topic=dummy.topic}} + {{topic-footer-buttons topic=dummy.topic}} {{/styleguide-example}} {{#styleguide-example title="topic-footer-buttons - anonymous"}} diff --git a/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/organisms/basic-topic-list.hbs b/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/organisms/basic-topic-list.hbs new file mode 100644 index 0000000000..76c85a0b50 --- /dev/null +++ b/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/organisms/basic-topic-list.hbs @@ -0,0 +1,3 @@ +{{#styleguide-example title="basic-topic-list" class="half-size"}} + {{basic-topic-list topics=dummy.topics}} +{{/styleguide-example}} diff --git a/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/organisms/latest-topic-list.hbs b/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/organisms/latest-topic-list.hbs deleted file mode 100644 index 6a3d7e77c7..0000000000 --- a/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/organisms/latest-topic-list.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#styleguide-example title="latest-topic-list" class="half-size"}} - {{latest-topic-list topics=dummy.topics}} -{{/styleguide-example}} diff --git a/plugins/styleguide/config/locales/client.en.yml b/plugins/styleguide/config/locales/client.en.yml index b9e2bf77ee..1706901aff 100644 --- a/plugins/styleguide/config/locales/client.en.yml +++ b/plugins/styleguide/config/locales/client.en.yml @@ -49,8 +49,8 @@ en: title: "Topic Statuses" topic_list: title: "Topic List" - latest_topic_list: - title: "Latest Topic List" + basic_topic_list: + title: "Basic Topic List" footer_message: title: "Footer Message" signup_cta: From 8922a878f385f2b9061decbeff72e0c1a93d335a Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Tue, 15 Dec 2020 12:48:47 -0500 Subject: [PATCH 119/393] DEV: Add site header organism to styleguide (#11495) --- .../javascripts/discourse/lib/dummy-data.js.es6 | 2 +- .../styleguide/organisms/site-header.hbs | 16 ++++++++++++++++ plugins/styleguide/config/locales/client.en.yml | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 plugins/styleguide/assets/javascripts/discourse/templates/styleguide/organisms/site-header.hbs diff --git a/plugins/styleguide/assets/javascripts/discourse/lib/dummy-data.js.es6 b/plugins/styleguide/assets/javascripts/discourse/lib/dummy-data.js.es6 index 56b8b75be3..f334cdbbda 100644 --- a/plugins/styleguide/assets/javascripts/discourse/lib/dummy-data.js.es6 +++ b/plugins/styleguide/assets/javascripts/discourse/lib/dummy-data.js.es6 @@ -114,7 +114,7 @@ export function createData(store) { ); }; - let topic = createTopic(); + let topic = createTopic({ tags: ["example", "apple"] }); topic.setProperties({ details: EmberObject.create({ can_create_post: true, diff --git a/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/organisms/site-header.hbs b/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/organisms/site-header.hbs new file mode 100644 index 0000000000..7a119db322 --- /dev/null +++ b/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/organisms/site-header.hbs @@ -0,0 +1,16 @@ +{{#styleguide-example title="site header - in topic - scrolled"}} +
+
+
+
+ {{mount-widget widget="home-logo" args=(hash minimized=true)}} + {{mount-widget widget="header-topic-info" args=dummy}} +
+ {{mount-widget widget="header-icons" args=(hash user=dummy.user)}} +
+
+
+
+
+{{/styleguide-example}} + diff --git a/plugins/styleguide/config/locales/client.en.yml b/plugins/styleguide/config/locales/client.en.yml index 1706901aff..c806d5669d 100644 --- a/plugins/styleguide/config/locales/client.en.yml +++ b/plugins/styleguide/config/locales/client.en.yml @@ -65,6 +65,8 @@ en: title: "Post" topic_map: title: "Topic Map" + site_header: + title: "Site Header" suggested_topics: title: "Suggested Topics" post_menu: From 745a5d84d2fae1993489f77e27b796d2fbd33b64 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 15 Dec 2020 15:48:16 -0500 Subject: [PATCH 120/393] FEATURE: Allow IP anonymization via admin user controller API (#11497) * FEATURE: Allow IP anonymization via admin user controller API Co-authored-by: Penar Musaraj --- app/controllers/admin/users_controller.rb | 5 ++++- spec/requests/admin/users_controller_spec.rb | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index d44c38dc4d..63d97b4f8c 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -489,7 +489,10 @@ class Admin::UsersController < Admin::AdminController def anonymize guardian.ensure_can_anonymize_user!(@user) - if user = UserAnonymizer.new(@user, current_user).make_anonymous + opts = {} + opts[:anonymize_ip] = params[:anonymize_ip] if params[:anonymize_ip].present? + + if user = UserAnonymizer.new(@user, current_user, opts).make_anonymous render json: success_json.merge(username: user.username) else render json: failed_json.merge(user: AdminDetailedUserSerializer.new(user, root: false).as_json) diff --git a/spec/requests/admin/users_controller_spec.rb b/spec/requests/admin/users_controller_spec.rb index 06219ebebc..6115c878e8 100644 --- a/spec/requests/admin/users_controller_spec.rb +++ b/spec/requests/admin/users_controller_spec.rb @@ -1103,4 +1103,21 @@ RSpec.describe Admin::UsersController do end end + describe "#anonymize" do + it "will make the user anonymous" do + put "/admin/users/#{user.id}/anonymize.json" + expect(response.status).to eq(200) + expect(response.parsed_body['username']).to be_present + end + + it "supports `anonymize_ip`" do + Jobs.run_immediately! + sl = Fabricate(:search_log, user_id: user.id) + put "/admin/users/#{user.id}/anonymize.json?anonymize_ip=127.0.0.2" + expect(response.status).to eq(200) + expect(response.parsed_body['username']).to be_present + expect(sl.reload.ip_address).to eq('127.0.0.2') + end + end + end From 7588910ee6eaca671918efcdde2bac81d2cb1338 Mon Sep 17 00:00:00 2001 From: Kris Date: Tue, 15 Dec 2020 16:12:46 -0500 Subject: [PATCH 121/393] UX: remove timeline from print view, fix header in crawler view (#11489) --- app/assets/stylesheets/common/base/crawler_layout.scss | 1 - app/assets/stylesheets/common/printer-friendly.scss | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/common/base/crawler_layout.scss b/app/assets/stylesheets/common/base/crawler_layout.scss index af37402c79..942484506d 100644 --- a/app/assets/stylesheets/common/base/crawler_layout.scss +++ b/app/assets/stylesheets/common/base/crawler_layout.scss @@ -1,7 +1,6 @@ body.crawler { > header { width: 100%; - position: absolute; top: 0; z-index: z("max"); background-color: #fff; diff --git a/app/assets/stylesheets/common/printer-friendly.scss b/app/assets/stylesheets/common/printer-friendly.scss index ce0d4687d3..658f99adff 100644 --- a/app/assets/stylesheets/common/printer-friendly.scss +++ b/app/assets/stylesheets/common/printer-friendly.scss @@ -35,7 +35,8 @@ .badge-category-bg, .badge-notification.clicks, .crawler-nav, - .powered-by-link { + .powered-by-link, + .timeline-container { display: none !important; } /* For readability */ From 6dd3f986b2fdf3b25df5d1d522223e375821ac2c Mon Sep 17 00:00:00 2001 From: Krzysztof Kotlarek Date: Wed, 16 Dec 2020 09:30:21 +1100 Subject: [PATCH 122/393] FIX: no email when the category is muted and mailing list is on (#11490) When `mute_all_categories_by_default` setting is enabled we should not send mailing list until category, tag or topic is explicitly watched. --- .../notify_mailing_list_subscribers.rb | 4 +++ app/models/topic_tracking_state.rb | 6 +--- app/models/user.rb | 7 +++++ .../notify_mailing_list_subscribers_spec.rb | 29 +++++++++++++++++++ 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/app/jobs/regular/notify_mailing_list_subscribers.rb b/app/jobs/regular/notify_mailing_list_subscribers.rb index 7cf01bf5d4..3f71efb343 100644 --- a/app/jobs/regular/notify_mailing_list_subscribers.rb +++ b/app/jobs/regular/notify_mailing_list_subscribers.rb @@ -65,6 +65,10 @@ module Jobs users = users.where(approved: true) end + if SiteSetting.mute_all_categories_by_default + users = users.watching_topic_when_mute_categories_by_default(post.topic) + end + DiscourseEvent.trigger(:notify_mailing_list_subscribers, users, post) users.find_each do |user| if Guardian.new(user).can_see?(post) diff --git a/app/models/topic_tracking_state.rb b/app/models/topic_tracking_state.rb index e0fa47889b..9e24edab59 100644 --- a/app/models/topic_tracking_state.rb +++ b/app/models/topic_tracking_state.rb @@ -107,11 +107,7 @@ class TopicTrackingState def self.publish_unmuted(topic) return if !SiteSetting.mute_all_categories_by_default - user_ids = User - .joins(DB.sql_fragment("LEFT JOIN category_users ON category_users.user_id = users.id AND category_users.category_id = :category_id", category_id: topic.category_id)) - .joins(DB.sql_fragment("LEFT JOIN topic_users ON topic_users.user_id = users.id AND topic_users.topic_id = :topic_id", topic_id: topic.id)) - .joins("LEFT JOIN tag_users ON tag_users.user_id = users.id AND tag_users.tag_id IN (#{topic.tag_ids.join(",").presence || 'NULL'})") - .where("category_users.notification_level > 0 OR topic_users.notification_level > 0 OR tag_users.notification_level > 0") + user_ids = User.watching_topic_when_mute_categories_by_default(topic) .where("users.last_seen_at > ?", 7.days.ago) .order("users.last_seen_at DESC") .limit(100) diff --git a/app/models/user.rb b/app/models/user.rb index d2d35bbc16..dd1be3bb50 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -234,6 +234,13 @@ class User < ActiveRecord::Base end end + scope :watching_topic_when_mute_categories_by_default, ->(topic) do + joins(DB.sql_fragment("LEFT JOIN category_users ON category_users.user_id = users.id AND category_users.category_id = :category_id", category_id: topic.category_id)) + .joins(DB.sql_fragment("LEFT JOIN topic_users ON topic_users.user_id = users.id AND topic_users.topic_id = :topic_id", topic_id: topic.id)) + .joins("LEFT JOIN tag_users ON tag_users.user_id = users.id AND tag_users.tag_id IN (#{topic.tag_ids.join(",").presence || 'NULL'})") + .where("category_users.notification_level > 0 OR topic_users.notification_level > 0 OR tag_users.notification_level > 0") + end + module NewTopicDuration ALWAYS = -1 LAST_VISIT = -2 diff --git a/spec/jobs/notify_mailing_list_subscribers_spec.rb b/spec/jobs/notify_mailing_list_subscribers_spec.rb index 8b09123a44..d0d2f758fd 100644 --- a/spec/jobs/notify_mailing_list_subscribers_spec.rb +++ b/spec/jobs/notify_mailing_list_subscribers_spec.rb @@ -137,6 +137,35 @@ describe Jobs::NotifyMailingListSubscribers do include_examples "no emails" end + context "mute all categories by default setting" do + before { SiteSetting.mute_all_categories_by_default = true } + include_examples "no emails" + end + + context "mute all categories by default setting but user is watching category" do + before do + SiteSetting.mute_all_categories_by_default = true + CategoryUser.create(user: mailing_list_user, category: post.topic.category, notification_level: CategoryUser.notification_levels[:watching]) + end + include_examples "one email" + end + + context "mute all categories by default setting but user is watching tag" do + before do + SiteSetting.mute_all_categories_by_default = true + TagUser.create(user: mailing_list_user, tag: tag, notification_level: TagUser.notification_levels[:watching]) + end + include_examples "one email" + end + + context "mute all categories by default setting but user is watching topic" do + before do + SiteSetting.mute_all_categories_by_default = true + TopicUser.create(user: mailing_list_user, topic: post.topic, notification_level: TopicUser.notification_levels[:watching]) + end + include_examples "one email" + end + context "from a muted tag" do before { TagUser.create(user: mailing_list_user, tag: tag, notification_level: TagUser.notification_levels[:muted]) } include_examples "no emails" From 6ae60256ef5ddba74ab23aa617f9df378be356f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Dec 2020 16:40:03 +1100 Subject: [PATCH 123/393] DEV: Bump json from 2.3.1 to 2.4.0 (#11500) Bumps [json](https://github.com/flori/json) from 2.3.1 to 2.4.0. - [Release notes](https://github.com/flori/json/releases) - [Changelog](https://github.com/flori/json/blob/master/CHANGES.md) - [Commits](https://github.com/flori/json/compare/v2.3.1...v2.4.0) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9933355e50..8e67d1acb7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -154,7 +154,7 @@ GEM rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - json (2.3.1) + json (2.4.0) json-schema (2.8.1) addressable (>= 2.4) jwt (2.2.2) From 407591719cb77fddbd0c0e735deac910a776860a Mon Sep 17 00:00:00 2001 From: Kris Date: Wed, 16 Dec 2020 00:40:30 -0500 Subject: [PATCH 124/393] UX: When input placeholders are too long, truncate with ellipsis (#11504) --- app/assets/stylesheets/common/base/discourse.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/assets/stylesheets/common/base/discourse.scss b/app/assets/stylesheets/common/base/discourse.scss index cc0485062a..1690bb0312 100644 --- a/app/assets/stylesheets/common/base/discourse.scss +++ b/app/assets/stylesheets/common/base/discourse.scss @@ -227,6 +227,10 @@ input { } } +::placeholder { + text-overflow: ellipsis; +} + .input { &-prepend, &-append { From f450ab6b5d406e6bc28611f1cd107fc83dc210ee Mon Sep 17 00:00:00 2001 From: Kris Date: Wed, 16 Dec 2020 00:41:36 -0500 Subject: [PATCH 125/393] UX: Make theme install modal more responsive (#11503) * UX: Make theme install modal more responsive * chrome fix --- .../common/admin/customize-install-theme.scss | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/common/admin/customize-install-theme.scss b/app/assets/stylesheets/common/admin/customize-install-theme.scss index d7f3077029..70e65ae656 100644 --- a/app/assets/stylesheets/common/admin/customize-install-theme.scss +++ b/app/assets/stylesheets/common/admin/customize-install-theme.scss @@ -1,6 +1,22 @@ +.admin-install-theme-modal { + .modal-inner-container { + width: 100%; + } +} + .install-theme { - min-width: 650px; display: flex; + @include breakpoint(mobile-extra-large) { + .install-theme-items { + flex: 0 0 150px; + } + .install-theme-content { + flex: 1 1 100%; + } + .select-kit { + width: 100%; + } + } } .install-theme-items { @@ -48,6 +64,10 @@ .install-theme-content { padding: 0px 0px 10px 20px; width: calc(100% - 200px); + input[type="file"] { + width: 100%; + overflow: hidden; // Chrome needs this + } } .repo { From 9a66f24703b5dee6e241703d6f3868a2b1363e8e Mon Sep 17 00:00:00 2001 From: Kris Date: Wed, 16 Dec 2020 00:43:01 -0500 Subject: [PATCH 126/393] UX: Add title attribute to watched word input (#11505) --- .../admin/addon/templates/components/watched-word-form.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/admin/addon/templates/components/watched-word-form.hbs b/app/assets/javascripts/admin/addon/templates/components/watched-word-form.hbs index 0aa201b602..eba5ecabda 100644 --- a/app/assets/javascripts/admin/addon/templates/components/watched-word-form.hbs +++ b/app/assets/javascripts/admin/addon/templates/components/watched-word-form.hbs @@ -1,5 +1,5 @@ {{i18n "admin.watched_words.form.label"}} -{{text-field value=word disabled=formSubmitted class="watched-word-input" autocorrect="off" autocapitalize="off" placeholderKey=placeholderKey}} +{{text-field value=word disabled=formSubmitted class="watched-word-input" autocorrect="off" autocapitalize="off" placeholderKey=placeholderKey title=(i18n placeholderKey)}} {{d-button class="btn-default" action=(action "submit") disabled=formSubmitted label="admin.watched_words.form.add"}} {{#if showMessage}} From d870c80516a9e3ce5eb31bdd8d981e9b4bf50868 Mon Sep 17 00:00:00 2001 From: Kris Date: Wed, 16 Dec 2020 00:43:47 -0500 Subject: [PATCH 127/393] UX: Don't wrap menu text under icon (#11502) --- app/assets/stylesheets/common/base/popup-menu.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/stylesheets/common/base/popup-menu.scss b/app/assets/stylesheets/common/base/popup-menu.scss index c3524c7393..56f2a0bc2c 100644 --- a/app/assets/stylesheets/common/base/popup-menu.scss +++ b/app/assets/stylesheets/common/base/popup-menu.scss @@ -19,6 +19,7 @@ } .btn { + display: flex; text-align: left; background: none; width: 100%; From c1ba3d786cdd9d3ff3991ba612ac6be85bd9dc25 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Dec 2020 16:44:50 +1100 Subject: [PATCH 128/393] DEV: Bump chunky_png from 1.3.14 to 1.3.15 (#11499) Bumps [chunky_png](https://github.com/wvanbergen/chunky_png) from 1.3.14 to 1.3.15. - [Release notes](https://github.com/wvanbergen/chunky_png/releases) - [Changelog](https://github.com/wvanbergen/chunky_png/blob/master/CHANGELOG.rdoc) - [Commits](https://github.com/wvanbergen/chunky_png/compare/v1.3.14...v1.3.15) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8e67d1acb7..414426f5ee 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -81,7 +81,7 @@ GEM byebug (11.1.3) cbor (0.5.9.6) certified (1.0.0) - chunky_png (1.3.14) + chunky_png (1.3.15) coderay (1.1.3) colored2 (3.1.2) concurrent-ruby (1.1.7) From 89bf64c0bf4c4e1f14eea8fe8b81a919a058005d Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Wed, 16 Dec 2020 00:46:40 -0500 Subject: [PATCH 129/393] DEV: Trigger events when filtering replies (#11498) --- .../javascripts/discourse/app/models/post-stream.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/assets/javascripts/discourse/app/models/post-stream.js b/app/assets/javascripts/discourse/app/models/post-stream.js index 49ac6c06da..810f6a3303 100644 --- a/app/assets/javascripts/discourse/app/models/post-stream.js +++ b/app/assets/javascripts/discourse/app/models/post-stream.js @@ -254,6 +254,10 @@ export default RestModel.extend({ filterReplies(postNumber) { this.cancelFilter(); this.set("filterRepliesToPostNumber", postNumber); + this.appEvents.trigger("post-stream:filter-replies", { + topic_id: this.get("topic.id"), + post_number: postNumber, + }); return this.refresh({ refreshInPlace: true }).then(() => { const element = document.querySelector(`#post_${postNumber}`); @@ -280,6 +284,10 @@ export default RestModel.extend({ filterUpwards(postID) { this.cancelFilter(); this.set("filterUpwardsPostID", postID); + this.appEvents.trigger("post-stream:filter-upwards", { + topic_id: this.get("topic.id"), + post_id: postID, + }); return this.refresh({ refreshInPlace: true }).then(() => { this.appEvents.trigger("post-stream:refresh"); From 38b6b098bceb9feac8059311e8f3f49c7d9ddb07 Mon Sep 17 00:00:00 2001 From: Alan Guo Xiang Tan Date: Wed, 16 Dec 2020 13:47:46 +0800 Subject: [PATCH 130/393] FIX: Bypass `AnonymousCache` for `/srv/status` route. (#11491) `/srv/status` routes should not be cached at all. Also, we want to decouple the route from Redis which `AnonymouseCache` relies on. The `/srv/status` should continue to return a success response even if Redis is down. --- lib/middleware/anonymous_cache.rb | 1 + spec/components/middleware/anonymous_cache_spec.rb | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/lib/middleware/anonymous_cache.rb b/lib/middleware/anonymous_cache.rb index 6fc70fb720..ca869abb97 100644 --- a/lib/middleware/anonymous_cache.rb +++ b/lib/middleware/anonymous_cache.rb @@ -163,6 +163,7 @@ module Middleware def no_cache_bypass request = Rack::Request.new(@env) request.cookies['_bypass_cache'].nil? && + (request.path != '/srv/status') && request[Auth::DefaultCurrentUserProvider::API_KEY].nil? && @env[Auth::DefaultCurrentUserProvider::USER_API_KEY].nil? end diff --git a/spec/components/middleware/anonymous_cache_spec.rb b/spec/components/middleware/anonymous_cache_spec.rb index dd410bb86b..e2beddc40a 100644 --- a/spec/components/middleware/anonymous_cache_spec.rb +++ b/spec/components/middleware/anonymous_cache_spec.rb @@ -26,6 +26,10 @@ describe Middleware::AnonymousCache do it "is false if it has an auth cookie" do expect(new_helper("HTTP_COOKIE" => "jack=1; _t=#{"1" * 32}; jill=2").cacheable?).to eq(false) end + + it "is false for srv/status routes" do + expect(new_helper("PATH_INFO" => "/srv/status").cacheable?).to eq(false) + end end context "per theme cache" do From 1d024f77a614177bf2cdaa18f7518b35eb5423fb Mon Sep 17 00:00:00 2001 From: David Taylor Date: Wed, 16 Dec 2020 09:43:39 +0000 Subject: [PATCH 131/393] FEATURE: Allow plugins to register demon processes (#11493) This allows plugins to call `register_demon_process` with a Class inheriting from Demon::Base. The unicorn master process will take care of spawning, monitoring and restarting the process. This API should be used with extreme caution, but it is significantly cleaner than spawning processes/threads in an `after_initialize` block. This commit also cleans up the demon spawning logging so that it uses the same format as unicorn worker logging. It also switches to the block form of `fork` to ensure that Demons exit after running, rather than returning execution to where the fork took place. --- config/unicorn.conf.rb | 13 +++++++++++-- lib/demon/base.rb | 14 ++++++-------- lib/discourse_plugin_registry.rb | 1 + lib/plugin/instance.rb | 9 +++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/config/unicorn.conf.rb b/config/unicorn.conf.rb index 373e235b3f..3271f82466 100644 --- a/config/unicorn.conf.rb +++ b/config/unicorn.conf.rb @@ -82,7 +82,7 @@ before_fork do |server, worker| sidekiqs = ENV['UNICORN_SIDEKIQS'].to_i if sidekiqs > 0 - puts "Starting up #{sidekiqs} supervised sidekiqs" + server.logger.info "starting #{sidekiqs} supervised sidekiqs" require 'demon/sidekiq' Demon::Sidekiq.after_fork do @@ -105,7 +105,7 @@ before_fork do |server, worker| end if ENV['DISCOURSE_ENABLE_EMAIL_SYNC_DEMON'] == 'true' - puts "Starting up EmailSync demon" + server.logger.info "starting up EmailSync demon" Demon::EmailSync.start Signal.trap("SIGTSTP") do STDERR.puts "#{Time.now}: Issuing stop to EmailSync" @@ -113,6 +113,11 @@ before_fork do |server, worker| end end + DiscoursePluginRegistry.demon_processes.each do |demon_class| + server.logger.info "starting #{demon_class.prefix} demon" + demon_class.start + end + class ::Unicorn::HttpServer alias :master_sleep_orig :master_sleep @@ -230,6 +235,10 @@ before_fork do |server, worker| check_email_sync_heartbeat end + DiscoursePluginRegistry.demon_processes.each do |demon_class| + demon_class.ensure_running + end + master_sleep_orig(sec) end end diff --git a/lib/demon/base.rb b/lib/demon/base.rb index 008a17d07c..2d6d46e295 100644 --- a/lib/demon/base.rb +++ b/lib/demon/base.rb @@ -141,15 +141,13 @@ class Demon::Base end def run - if @pid = fork - write_pid_file - return + @pid = fork do + Process.setproctitle("discourse #{self.class.prefix}") + monitor_parent + establish_app + after_fork end - - Process.setproctitle("discourse #{self.class.prefix}") - monitor_parent - establish_app - after_fork + write_pid_file end def already_running? diff --git a/lib/discourse_plugin_registry.rb b/lib/discourse_plugin_registry.rb index 890165a315..3970591c88 100644 --- a/lib/discourse_plugin_registry.rb +++ b/lib/discourse_plugin_registry.rb @@ -68,6 +68,7 @@ class DiscoursePluginRegistry define_register :vendored_pretty_text, Set define_register :vendored_core_pretty_text, Set define_register :seedfu_filter, Set + define_register :demon_processes, Set define_filtered_register :staff_user_custom_fields define_filtered_register :public_user_custom_fields diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb index f449a19593..5af08b24e5 100644 --- a/lib/plugin/instance.rb +++ b/lib/plugin/instance.rb @@ -861,6 +861,15 @@ class Plugin::Instance ), self) end + # Register a new demon process to be forked by the Unicorn master. + # The demon_class should inherit from Demon::Base. + # With great power comes great responsibility - this method should + # be used with extreme caution. See `config/unicorn.conf.rb`. + def register_demon_process(demon_class) + raise "Not a demon class" if !demon_class.ancestors.include?(Demon::Base) + DiscoursePluginRegistry.demon_processes << demon_class + end + protected def self.js_path From dda98a1f7d21a143dcecbbf543e99fab175c8183 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Dec 2020 11:05:35 +0000 Subject: [PATCH 132/393] Build(deps): Bump rails_failover from 0.6.4 to 0.6.5 (#11506) Bumps rails_failover from 0.6.4 to 0.6.5. Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 414426f5ee..e74ccf5f28 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -276,7 +276,7 @@ GEM nokogiri (>= 1.6) rails-html-sanitizer (1.3.0) loofah (~> 2.3) - rails_failover (0.6.4) + rails_failover (0.6.5) activerecord (~> 6.0) concurrent-ruby railties (~> 6.0) From 1e7d6ebb0fc438f376a4d1bb584048d6902d78a8 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 16 Dec 2020 18:40:58 +0530 Subject: [PATCH 133/393] DEV: no need to iterate through each tag for rendering (#11508) This commit allows discourse-assign plugin to show assigned user next to tags. --- .../discourse/app/templates/full-page-search.hbs | 6 +++--- app/assets/stylesheets/common/base/search.scss | 11 +++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/app/templates/full-page-search.hbs b/app/assets/javascripts/discourse/app/templates/full-page-search.hbs index 6cd5dfc767..946d324389 100644 --- a/app/assets/javascripts/discourse/app/templates/full-page-search.hbs +++ b/app/assets/javascripts/discourse/app/templates/full-page-search.hbs @@ -104,9 +104,9 @@ {{category-link result.topic.category.parentCategory}} {{/if}} {{category-link result.topic.category hideParent=true}} - {{#each result.topic.tags as |tag|}} - {{discourse-tag tag isPrivateMessage=isPrivateMessage}} - {{/each}} + {{#if result.topic.tags}} + {{discourse-tags result.topic}} + {{/if}} {{plugin-outlet name="full-page-search-category" args=(hash result=result)}} diff --git a/app/assets/stylesheets/common/base/search.scss b/app/assets/stylesheets/common/base/search.scss index e4d85303ac..a6154bfc19 100644 --- a/app/assets/stylesheets/common/base/search.scss +++ b/app/assets/stylesheets/common/base/search.scss @@ -226,6 +226,17 @@ } } + .discourse-tags { + flex-wrap: wrap; + display: inline-flex; + font-weight: normal; + + .discourse-tag.simple { + font-size: $font-down-1; + margin-right: 0.25em; + } + } + input[type="checkbox"] { margin-top: 0; margin-left: 0; From d1058f4e4cc86d4077b75213972aa31400c05111 Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Wed, 16 Dec 2020 09:38:51 -0500 Subject: [PATCH 134/393] UX: Blend header colors (#11422) --- .../foundation/color_transformations.scss | 37 +++---------------- .../common/foundation/variables.scss | 4 ++ 2 files changed, 9 insertions(+), 32 deletions(-) diff --git a/app/assets/stylesheets/common/foundation/color_transformations.scss b/app/assets/stylesheets/common/foundation/color_transformations.scss index 9272280438..1f9957d789 100644 --- a/app/assets/stylesheets/common/foundation/color_transformations.scss +++ b/app/assets/stylesheets/common/foundation/color_transformations.scss @@ -10,38 +10,11 @@ $primary-medium: dark-light-diff($primary, $secondary, 50%, -35%) !default; $primary-high: dark-light-diff($primary, $secondary, 30%, -25%) !default; $primary-very-high: dark-light-diff($primary, $secondary, 15%, -10%) !default; -//header_primary -$header_primary-low: dark-light-diff( - $header_primary, - $header_background, - 90%, - -78% -) !default; -$header_primary-low-mid: dark-light-diff( - $header_primary, - $header_background, - 70%, - -45% -) !default; - -$header_primary-medium: dark-light-diff( - $header_primary, - $header_background, - 50%, - -35% -) !default; -$header_primary-high: dark-light-diff( - $header_primary, - $header_background, - 30%, - -25% -) !default; -$header_primary-very-high: dark-light-diff( - $header_primary, - $header_background, - 15%, - -10% -) !default; +$header_primary-low: blend-header-primary-background(10%) !default; +$header_primary-low-mid: blend-header-primary-background(35%) !default; +$header_primary-medium: blend-header-primary-background(55%) !default; +$header_primary-high: blend-header-primary-background(70%) !default; +$header_primary-very-high: blend-header-primary-background(90%) !default; //secondary $secondary-low: dark-light-diff($secondary, $primary, 70%, -70%) !default; diff --git a/app/assets/stylesheets/common/foundation/variables.scss b/app/assets/stylesheets/common/foundation/variables.scss index 021a689a02..0d95119654 100644 --- a/app/assets/stylesheets/common/foundation/variables.scss +++ b/app/assets/stylesheets/common/foundation/variables.scss @@ -192,6 +192,10 @@ $box-shadow: ( @return srgb-scale($primary, $secondary, $percent); } +@function blend-header-primary-background($percent) { + @return srgb-scale($header_primary, $header_background, $percent); +} + @function dark-light-diff( $adjusted-color, $comparison-color, From 230fe0427e0862690cb3c4b3421877697d6475a1 Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Wed, 16 Dec 2020 12:11:01 -0500 Subject: [PATCH 135/393] DEV: More events for filtered replies (#11511) --- app/assets/javascripts/discourse/app/models/post-stream.js | 3 ++- app/assets/javascripts/discourse/app/widgets/post-gap.js | 3 +++ app/assets/javascripts/discourse/app/widgets/post-stream.js | 4 ++++ app/assets/javascripts/discourse/app/widgets/post.js | 2 +- .../discourse/tests/unit/models/post-stream-test.js | 2 +- 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/app/models/post-stream.js b/app/assets/javascripts/discourse/app/models/post-stream.js index 810f6a3303..80fe6b2a64 100644 --- a/app/assets/javascripts/discourse/app/models/post-stream.js +++ b/app/assets/javascripts/discourse/app/models/post-stream.js @@ -251,12 +251,13 @@ export default RestModel.extend({ return this.refreshAndJumptoSecondVisible(); }, - filterReplies(postNumber) { + filterReplies(postNumber, postId) { this.cancelFilter(); this.set("filterRepliesToPostNumber", postNumber); this.appEvents.trigger("post-stream:filter-replies", { topic_id: this.get("topic.id"), post_number: postNumber, + post_id: postId, }); return this.refresh({ refreshInPlace: true }).then(() => { const element = document.querySelector(`#post_${postNumber}`); diff --git a/app/assets/javascripts/discourse/app/widgets/post-gap.js b/app/assets/javascripts/discourse/app/widgets/post-gap.js index d1a3b060f4..6fc769bbe4 100644 --- a/app/assets/javascripts/discourse/app/widgets/post-gap.js +++ b/app/assets/javascripts/discourse/app/widgets/post-gap.js @@ -29,6 +29,9 @@ export default createWidget("post-gap", { args ).then(() => { state.loading = false; + this.appEvents.trigger("post-stream:gap-expanded", { + post_id: this.model.id, + }); }); }, }); diff --git a/app/assets/javascripts/discourse/app/widgets/post-stream.js b/app/assets/javascripts/discourse/app/widgets/post-stream.js index 8b26c81679..d0f45a907c 100644 --- a/app/assets/javascripts/discourse/app/widgets/post-stream.js +++ b/app/assets/javascripts/discourse/app/widgets/post-stream.js @@ -175,6 +175,10 @@ createWidget("filter-show-all", { click() { this.sendWidgetAction("cancelFilter", this.attrs.streamFilters); + this.appEvents.trigger( + "post-stream:filter-show-all", + this.attrs.streamFilters + ); }, }); diff --git a/app/assets/javascripts/discourse/app/widgets/post.js b/app/assets/javascripts/discourse/app/widgets/post.js index 6ee54ebbc8..e90befbc42 100644 --- a/app/assets/javascripts/discourse/app/widgets/post.js +++ b/app/assets/javascripts/discourse/app/widgets/post.js @@ -439,7 +439,7 @@ createWidget("post-contents", { const controller = this.register.lookup("controller:topic"); post .get("topic.postStream") - .filterReplies(this.attrs.post_number) + .filterReplies(post.post_number, post.id) .then(() => { controller.updateQueryParams(); }); diff --git a/app/assets/javascripts/discourse/tests/unit/models/post-stream-test.js b/app/assets/javascripts/discourse/tests/unit/models/post-stream-test.js index 1a5c4b4b94..78151c3355 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/post-stream-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/post-stream-test.js @@ -320,7 +320,7 @@ module("Unit | Model | post-stream", function () { "by default no replies are filtered" ); - postStream.filterReplies(3); + postStream.filterReplies(3, 2); assert.equal( postStream.get("filterRepliesToPostNumber"), 3, From 4d1bc3a491b0213679377d06cb2c03350ff6e767 Mon Sep 17 00:00:00 2001 From: Roman Rizzi Date: Wed, 16 Dec 2020 15:23:12 -0300 Subject: [PATCH 136/393] FIX: Scroll to the last position when navigating back to the tag topic list. (#11496) Scrolling was not working as expected after clicking the browser back button and navigating back to the tag topic list. We need to wrap the scroll inside a debounce function to ensure that the "window.pageYOffset" property is populated before our function runs. --- .../discourse/app/components/topic-list.js | 14 ++++++++++++-- .../discourse/app/templates/tags/show.hbs | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/topic-list.js b/app/assets/javascripts/discourse/app/components/topic-list.js index 8c5919afe4..31f187628a 100644 --- a/app/assets/javascripts/discourse/app/components/topic-list.js +++ b/app/assets/javascripts/discourse/app/components/topic-list.js @@ -1,9 +1,9 @@ import { alias, reads } from "@ember/object/computed"; +import { debounce, schedule } from "@ember/runloop"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; import Component from "@ember/component"; import LoadMore from "discourse/mixins/load-more"; import { on } from "@ember/object/evented"; -import { schedule } from "@ember/runloop"; export default Component.extend(LoadMore, { tagName: "table", @@ -73,7 +73,17 @@ export default Component.extend(LoadMore, { let scrollTo = this.session.get("topicListScrollPosition"); if (scrollTo && scrollTo >= 0) { - schedule("afterRender", () => $(window).scrollTop(scrollTo + 1)); + schedule("afterRender", () => { + debounce( + this, + function () { + if (this.element && !this.isDestroying && !this.isDestroyed) { + $(window).scrollTop(scrollTo + 1); + } + }, + 0 + ); + }); } }, diff --git a/app/assets/javascripts/discourse/app/templates/tags/show.hbs b/app/assets/javascripts/discourse/app/templates/tags/show.hbs index a064771eb2..38f50fab9b 100644 --- a/app/assets/javascripts/discourse/app/templates/tags/show.hbs +++ b/app/assets/javascripts/discourse/app/templates/tags/show.hbs @@ -59,6 +59,7 @@ order=order ascending=ascending changeSort=(action "changeSort") + scrollOnLoad=true }} {{/discovery-topics-list}} {{/if}} From e7b837e7e1a0f2e4634ca4534582625e5658f333 Mon Sep 17 00:00:00 2001 From: Bmorrical Date: Wed, 16 Dec 2020 09:13:15 -0600 Subject: [PATCH 137/393] Have doubled the size of the Watched Words Per Action Limit --- app/models/watched_word.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/watched_word.rb b/app/models/watched_word.rb index 40d716a4aa..fb4ad35c73 100644 --- a/app/models/watched_word.rb +++ b/app/models/watched_word.rb @@ -11,7 +11,7 @@ class WatchedWord < ActiveRecord::Base ) end - MAX_WORDS_PER_ACTION = 1000 + MAX_WORDS_PER_ACTION = 2000 before_validation do self.word = self.class.normalize_word(self.word) From 9870a0b6a1ba86e1e6192d32145507acbd53d43a Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Wed, 16 Dec 2020 15:52:34 -0500 Subject: [PATCH 138/393] FIX: missing default notification level on group creation (#11512) --- .../app/components/groups-form-interaction-fields.js | 8 ++++++++ .../components/groups-form-interaction-fields.hbs | 3 ++- .../discourse/tests/acceptance/groups-new-test.js | 7 +++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/app/components/groups-form-interaction-fields.js b/app/assets/javascripts/discourse/app/components/groups-form-interaction-fields.js index ca271caa98..b063865786 100644 --- a/app/assets/javascripts/discourse/app/components/groups-form-interaction-fields.js +++ b/app/assets/javascripts/discourse/app/components/groups-form-interaction-fields.js @@ -1,5 +1,6 @@ import Component from "@ember/component"; import I18n from "I18n"; +import { NotificationLevels } from "discourse/lib/notification-levels"; import discourseComputed from "discourse-common/utils/decorators"; import { or } from "@ember/object/computed"; @@ -46,6 +47,8 @@ export default Component.extend({ { name: I18n.t("groups.alias_levels.owners_mods_and_admins"), value: 4 }, { name: I18n.t("groups.alias_levels.everyone"), value: 99 }, ]; + + this.watchingNotificationLevel = NotificationLevels.WATCHING; }, membersVisibilityLevel: or( @@ -63,6 +66,11 @@ export default Component.extend({ "aliasLevelOptions.firstObject.value" ), + defaultNotificationLevel: or( + "model.default_notification_level", + "watchingNotificationLevel" + ), + @discourseComputed( "siteSettings.email_in", "model.automatic", diff --git a/app/assets/javascripts/discourse/app/templates/components/groups-form-interaction-fields.hbs b/app/assets/javascripts/discourse/app/templates/components/groups-form-interaction-fields.hbs index 12bcf7b137..82725adc49 100644 --- a/app/assets/javascripts/discourse/app/templates/components/groups-form-interaction-fields.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/groups-form-interaction-fields.hbs @@ -94,10 +94,11 @@ {{notifications-button - value=model.default_notification_level + value=defaultNotificationLevel class="groups-form-default-notification-level" options=(hash i18nPrefix="groups.notifications" ) + onChange=(action (mut model.default_notification_level)) }} diff --git a/app/assets/javascripts/discourse/tests/acceptance/groups-new-test.js b/app/assets/javascripts/discourse/tests/acceptance/groups-new-test.js index 1b020084b3..421add93b5 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/groups-new-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/groups-new-test.js @@ -74,5 +74,12 @@ acceptance("New Group - Authenticated", function (needs) { 0, "it should disable the membership requests checkbox" ); + + assert.ok( + queryAll(".groups-form-default-notification-level .selected-name .name") + .text() + .trim() === I18n.t("groups.notifications.watching.title"), + "it has a default selection for notification level" + ); }); }); From c54217f33d3703b55711ec69dd60a5e3385e3eb5 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Thu, 17 Dec 2020 00:02:41 +0000 Subject: [PATCH 139/393] FIX: Clear in-process theme cache after clearing DB cache (#11517) If we clear the in-process cache first, it might get re-filled from the DB before we clear the DB cache. This would be more likely on high-traffic sites. --- app/models/theme_translation_override.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/theme_translation_override.rb b/app/models/theme_translation_override.rb index 93ba1f2bca..ec639c2731 100644 --- a/app/models/theme_translation_override.rb +++ b/app/models/theme_translation_override.rb @@ -4,9 +4,9 @@ class ThemeTranslationOverride < ActiveRecord::Base belongs_to :theme after_commit do + theme.theme_fields.where(target_id: Theme.targets[:translations]).update_all(value_baked: nil) theme.clear_cached_settings! theme.remove_from_cache! - theme.theme_fields.where(target_id: Theme.targets[:translations]).update_all(value_baked: nil) end end From 8c9675c913ba89efa4736ac0b2c10225bbbe0c17 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 16 Dec 2020 19:18:45 -0500 Subject: [PATCH 140/393] DEV: Upgrade oj gem (#11516) --- Gemfile.lock | 2 +- spec/support/sidekiq_helpers.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index e74ccf5f28..d8b148d567 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -213,7 +213,7 @@ GEM multi_json (~> 1.3) multi_xml (~> 0.5) rack (>= 1.2, < 3) - oj (3.10.16) + oj (3.10.17) omniauth (1.9.1) hashie (>= 3.4.6) rack (>= 1.6.2, < 3) diff --git a/spec/support/sidekiq_helpers.rb b/spec/support/sidekiq_helpers.rb index 790bbaf59e..815badebe7 100644 --- a/spec/support/sidekiq_helpers.rb +++ b/spec/support/sidekiq_helpers.rb @@ -77,8 +77,8 @@ module SidekiqHelpers matched_job ||= args.all? do |key, value| value = value.to_s if value.is_a?(Symbol) - if key == :at && !job_args.has_key?(:at) - value == job_args[:enqueued_at] + if key == :at + value.to_f == (job_args[:at] || job_args[:enqueued_at]).to_f else value == job_args[key] end From 6eee731bf91029ddf27bd05000c496d8fda029cd Mon Sep 17 00:00:00 2001 From: Osama Sayegh Date: Thu, 17 Dec 2020 03:19:13 +0300 Subject: [PATCH 141/393] FEATURE: Include post number in inline Onebox titles (#11515) --- config/locales/server.en.yml | 7 +++-- lib/inline_oneboxer.rb | 29 +++++++++++++++++ lib/topic_view.rb | 17 ++++++++++ spec/components/inline_oneboxer_spec.rb | 31 ++++++++++++++++++ spec/components/topic_view_spec.rb | 42 +++++++++++++++++++++++++ 5 files changed, 124 insertions(+), 2 deletions(-) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 2881faee8d..297ae1a02f 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -59,6 +59,9 @@ en: redirect_warning: "We were unable to verify that the link you selected was actually posted to the forum. If you wish to proceed anyway, select the link below." on_another_topic: "On another topic" + inline_oneboxer: + topic_page_title_post_number: "#%{post_number}" + topic_page_title_post_number_by_user: "#%{post_number} by %{username}" themes: bad_color_scheme: "Can not update theme, invalid color palette" other_error: "Something went wrong updating theme" @@ -210,8 +213,8 @@ en: invalid_address: "Sorry, we were unable to generate a preview for this web page, because the server '%{hostname}' could not be found. Instead of a preview, only a link will appear in your post. :cry:" error_response: "Sorry, we were unable to generate a preview for this web page, because the web server returned an error code of %{status_code}. Instead of a preview, only a link will appear in your post. :cry:" missing_data: - one: "Sorry, we were unable to generate a preview for this web page, because the following oEmbed / OpenGraph tag could not be found: %{missing_attributes}" - other: "Sorry, we were unable to generate a preview for this web page, because the following oEmbed / OpenGraph tags could not be found: %{missing_attributes}" + one: "Sorry, we were unable to generate a preview for this web page, because the following oEmbed / OpenGraph tag could not be found: %{missing_attributes}" + other: "Sorry, we were unable to generate a preview for this web page, because the following oEmbed / OpenGraph tags could not be found: %{missing_attributes}" word_connector: # Connects words with a comma. Example: "foo, bar" diff --git a/lib/inline_oneboxer.rb b/lib/inline_oneboxer.rb index 48c0171519..9536b17061 100644 --- a/lib/inline_oneboxer.rb +++ b/lib/inline_oneboxer.rb @@ -36,6 +36,11 @@ class InlineOneboxer if route[:controller] == "topics" if topic = Oneboxer.local_topic(url, route, opts) opts[:skip_cache] = true + post_number = [route[:post_number].to_i, topic.highest_post_number].min + if post_number > 1 + opts[:post_number] = post_number + opts[:post_author] = post_author_for_title(topic, post_number) + end return onebox_for(url, topic.title, opts) end end @@ -65,6 +70,22 @@ class InlineOneboxer private def self.onebox_for(url, title, opts) + title = title && Emoji.gsub_emoji_to_unicode(title) + if title && opts[:post_number] + title += " - " + if opts[:post_author] + title += I18n.t( + "inline_oneboxer.topic_page_title_post_number_by_user", + post_number: opts[:post_number], + username: opts[:post_author] + ) + else + title += I18n.t( + "inline_oneboxer.topic_page_title_post_number", + post_number: opts[:post_number] + ) + end + end onebox = { url: url, title: title && Emoji.gsub_emoji_to_unicode(title) } Discourse.cache.write(cache_key(url), onebox, expires_in: 1.day) if !opts[:skip_cache] onebox @@ -74,4 +95,12 @@ class InlineOneboxer "inline_onebox:#{url}" end + def self.post_author_for_title(topic, post_number) + guardian = Guardian.new + post = topic.posts.find_by(post_number: post_number) + author = post&.user + if author && guardian.can_see_post?(post) && post.post_type == Post.types[:regular] + author.username + end + end end diff --git a/lib/topic_view.rb b/lib/topic_view.rb index e88a505795..4a3549e0a2 100644 --- a/lib/topic_view.rb +++ b/lib/topic_view.rb @@ -178,6 +178,23 @@ class TopicView def page_title title = @topic.title + if @post_number > 1 + title += " - " + post = @topic.posts.find_by(post_number: @post_number) + author = post&.user + if author && @guardian.can_see_post?(post) + title += I18n.t( + "inline_oneboxer.topic_page_title_post_number_by_user", + post_number: @post_number, + username: author.username + ) + else + title += I18n.t( + "inline_oneboxer.topic_page_title_post_number", + post_number: @post_number + ) + end + end if SiteSetting.topic_page_title_includes_category if @topic.category_id != SiteSetting.uncategorized_category_id && @topic.category_id && @topic.category title += " - #{@topic.category.name}" diff --git a/spec/components/inline_oneboxer_spec.rb b/spec/components/inline_oneboxer_spec.rb index d00c9822cc..7043aa1146 100644 --- a/spec/components/inline_oneboxer_spec.rb +++ b/spec/components/inline_oneboxer_spec.rb @@ -116,6 +116,37 @@ describe InlineOneboxer do expect(onebox[:title]).to eq("Hello 🍕 with an emoji") end + it "will append the post number post auther's username to the title" do + topic = Fabricate(:topic, title: "Inline oneboxer") + Fabricate(:post, topic: topic) # OP + Fabricate(:post, topic: topic) + lookup = -> (number) do + InlineOneboxer.lookup( + "#{topic.url}/#{number}", + skip_cache: true + )[:title] + end + posts = topic.reload.posts.order("post_number ASC") + + expect(lookup.call(0)).to eq("Inline oneboxer") + expect(lookup.call(1)).to eq("Inline oneboxer") + expect(lookup.call(2)).to eq("Inline oneboxer - #2 by #{posts[1].user.username}") + + Fabricate(:post, topic: topic, post_type: Post.types[:whisper]) + posts = topic.reload.posts.order("post_number ASC") + # because the last post in the topic is a whisper, the onebox title + # will be the first regular post directly before our whisper + expect(lookup.call(3)).to eq("Inline oneboxer - #2 by #{posts[1].user.username}") + expect(lookup.call(99)).to eq("Inline oneboxer - #2 by #{posts[1].user.username}") + + Fabricate(:post, topic: topic) + posts = topic.reload.posts.order("post_number ASC") + # username not appended to whisper posts + expect(lookup.call(3)).to eq("Inline oneboxer - #3") + expect(lookup.call(4)).to eq("Inline oneboxer - #4 by #{posts[3].user.username}") + expect(lookup.call(99)).to eq("Inline oneboxer - #4 by #{posts[3].user.username}") + end + it "will not crawl domains that aren't allowlisted" do onebox = InlineOneboxer.lookup("https://eviltrout.com", skip_cache: true) expect(onebox).to be_blank diff --git a/spec/components/topic_view_spec.rb b/spec/components/topic_view_spec.rb index e3a159ded3..489bcdc865 100644 --- a/spec/components/topic_view_spec.rb +++ b/spec/components/topic_view_spec.rb @@ -621,9 +621,51 @@ describe TopicView do context "page_title" do fab!(:tag1) { Fabricate(:tag) } fab!(:tag2) { Fabricate(:tag, topic_count: 2) } + fab!(:op_post) { Fabricate(:post, topic: topic) } + fab!(:post1) { Fabricate(:post, topic: topic) } + fab!(:whisper) { Fabricate(:post, topic: topic, post_type: Post.types[:whisper]) } subject { TopicView.new(topic.id, evil_trout).page_title } + context "when a post number is specified" do + context "admins" do + it "see post number and username for all posts" do + title = TopicView.new(topic.id, admin, post_number: 0).page_title + expect(title).to eq(topic.title) + title = TopicView.new(topic.id, admin, post_number: 1).page_title + expect(title).to eq(topic.title) + + title = TopicView.new(topic.id, admin, post_number: 2).page_title + expect(title).to eq("#{topic.title} - #2 by #{post1.user.username}") + title = TopicView.new(topic.id, admin, post_number: 3).page_title + expect(title).to eq("#{topic.title} - #3 by #{whisper.user.username}") + end + end + + context "regular users" do + it "see post number and username for regular posts" do + title = TopicView.new(topic.id, evil_trout, post_number: 0).page_title + expect(title).to eq(topic.title) + title = TopicView.new(topic.id, evil_trout, post_number: 1).page_title + expect(title).to eq(topic.title) + + title = TopicView.new(topic.id, evil_trout, post_number: 2).page_title + expect(title).to eq("#{topic.title} - #2 by #{post1.user.username}") + end + + it "see only post number for whisper posts" do + title = TopicView.new(topic.id, evil_trout, post_number: 3).page_title + expect(title).to eq("#{topic.title} - #3") + post2 = Fabricate(:post, topic: topic) + topic.reload + title = TopicView.new(topic.id, evil_trout, post_number: 3).page_title + expect(title).to eq("#{topic.title} - #3") + title = TopicView.new(topic.id, evil_trout, post_number: 4).page_title + expect(title).to eq("#{topic.title} - #4 by #{post2.user.username}") + end + end + end + context "uncategorized topic" do context "topic_page_title_includes_category is false" do before { SiteSetting.topic_page_title_includes_category = false } From 4b1d98e878d7f640c5133e0adc8e953b76238537 Mon Sep 17 00:00:00 2001 From: Joe Date: Thu, 17 Dec 2020 23:08:38 +0800 Subject: [PATCH 142/393] DEV: Adds raw plugin outlets to topic list headers (#11519) --- .../javascripts/discourse/app/templates/topic-list-header.hbr | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/assets/javascripts/discourse/app/templates/topic-list-header.hbr b/app/assets/javascripts/discourse/app/templates/topic-list-header.hbr index ed554fa15f..2f785f6065 100644 --- a/app/assets/javascripts/discourse/app/templates/topic-list-header.hbr +++ b/app/assets/javascripts/discourse/app/templates/topic-list-header.hbr @@ -1,3 +1,4 @@ +{{~raw-plugin-outlet name="topic-list-header-before"~}} {{#if bulkSelectEnabled}}
+ + {{#if usernameDisabled}} {{accountUsername}} @@ -52,7 +66,14 @@ {{#if fullnameRequired}}
- + {{#if nameDisabled}} @@ -83,7 +104,14 @@ {{#if passwordRequired}}
+ + {{password-field value=accountPassword type="password" id="new-account-password" capsLockOn=capsLockOn}} {{#if canBulkSelect}} @@ -18,3 +19,4 @@ {{/if}} {{raw "topic-list-header-column" sortable=sortable number='true' order='views' name='views'}} {{raw "topic-list-header-column" sortable=sortable number='true' order='activity' name='activity'}} +{{~raw-plugin-outlet name="topic-list-header-after"~}} From 29c7655221aaa6ecf6f9a7267b1ad08da34efbfc Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Thu, 17 Dec 2020 21:59:10 +0530 Subject: [PATCH 143/393] FEATURE: allow plugins to preload custom data on search (#11518) This commit allows discourse-assign plugin to show assigned users on search result topic list. --- lib/search.rb | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/search.rb b/lib/search.rb index c3f083b00f..5f3d733918 100644 --- a/lib/search.rb +++ b/lib/search.rb @@ -7,6 +7,16 @@ class Search cattr_accessor :preloaded_topic_custom_fields self.preloaded_topic_custom_fields = Set.new + def self.on_preload(&blk) + (@preload ||= Set.new) << blk + end + + def self.preload(results, object) + if @preload + @preload.each { |preload| preload.call(results, object) } + end + end + def self.per_facet 5 end @@ -164,7 +174,7 @@ class Search end attr_accessor :term - attr_reader :clean_term + attr_reader :clean_term, :guardian def initialize(term, opts = nil) @opts = opts || {} @@ -282,6 +292,8 @@ class Search Topic.preload_custom_fields(topics, preloaded_topic_custom_fields) end + Search.preload(@results, self) + @results end From 6380a0a250f21cf55e85c6d8d8c3f159bc82b9bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Dec 2020 16:45:53 -0500 Subject: [PATCH 144/393] Build(deps): Bump tzinfo from 1.2.8 to 1.2.9 (#11522) Bumps [tzinfo](https://github.com/tzinfo/tzinfo) from 1.2.8 to 1.2.9. - [Release notes](https://github.com/tzinfo/tzinfo/releases) - [Changelog](https://github.com/tzinfo/tzinfo/blob/master/CHANGES.md) - [Commits](https://github.com/tzinfo/tzinfo/compare/v1.2.8...v1.2.9) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index d8b148d567..63e01cab2d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -407,7 +407,7 @@ GEM thor (1.0.1) thread_safe (0.3.6) tilt (2.0.10) - tzinfo (1.2.8) + tzinfo (1.2.9) thread_safe (~> 0.1) uglifier (4.2.0) execjs (>= 0.3.0, < 3) From 2d667a3bd05cb370c8d3356d69cadb44e5c8ae72 Mon Sep 17 00:00:00 2001 From: Osama Sayegh Date: Fri, 18 Dec 2020 02:27:32 +0300 Subject: [PATCH 145/393] FEATURE: Enable inline onebox for all domains by default (#11523) --- config/site_settings.yml | 2 +- lib/inline_oneboxer.rb | 3 +++ spec/components/inline_oneboxer_spec.rb | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/config/site_settings.yml b/config/site_settings.yml index f5046ee86f..eb1b37c580 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -1605,7 +1605,7 @@ onebox: type: list list_type: compact enable_inline_onebox_on_all_domains: - default: false + default: true force_custom_user_agent_hosts: default: "http://codepen.io" type: list diff --git a/lib/inline_oneboxer.rb b/lib/inline_oneboxer.rb index 9536b17061..303a2c47d0 100644 --- a/lib/inline_oneboxer.rb +++ b/lib/inline_oneboxer.rb @@ -42,6 +42,9 @@ class InlineOneboxer opts[:post_author] = post_author_for_title(topic, post_number) end return onebox_for(url, topic.title, opts) + else + # not permitted to see topic + return nil end end end diff --git a/spec/components/inline_oneboxer_spec.rb b/spec/components/inline_oneboxer_spec.rb index 7043aa1146..fc4c328835 100644 --- a/spec/components/inline_oneboxer_spec.rb +++ b/spec/components/inline_oneboxer_spec.rb @@ -148,6 +148,7 @@ describe InlineOneboxer do end it "will not crawl domains that aren't allowlisted" do + SiteSetting.enable_inline_onebox_on_all_domains = false onebox = InlineOneboxer.lookup("https://eviltrout.com", skip_cache: true) expect(onebox).to be_blank end From 4558d91bbb17512258ba37b64d6ff99c804e617b Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 18 Dec 2020 14:50:50 +1100 Subject: [PATCH 146/393] UX: adjust default menu width (#11526) The notification panel gets resized and the JS uses maxWidth of 320. This tends to fight with the CSS causing notifications to "jump" a bit when a new one lands. --- app/assets/stylesheets/common/base/menu-panel.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/common/base/menu-panel.scss b/app/assets/stylesheets/common/base/menu-panel.scss index 494119400f..2122876ae9 100644 --- a/app/assets/stylesheets/common/base/menu-panel.scss +++ b/app/assets/stylesheets/common/base/menu-panel.scss @@ -28,7 +28,7 @@ background-color: var(--secondary); z-index: z("header"); padding: 0.5em; - width: 300px; + width: 320px; overflow: hidden; display: flex; flex-direction: column; From 2b8b252249ce5c7827b9216174deb957ae332493 Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Thu, 17 Dec 2020 22:51:13 -0500 Subject: [PATCH 147/393] UX: Move reply filter button on mobile (#11524) --- app/assets/javascripts/discourse/app/widgets/post-menu.js | 6 +++++- app/assets/stylesheets/mobile/topic-post.scss | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/app/widgets/post-menu.js b/app/assets/javascripts/discourse/app/widgets/post-menu.js index 29aa0de195..bbdb2f3c64 100644 --- a/app/assets/javascripts/discourse/app/widgets/post-menu.js +++ b/app/assets/javascripts/discourse/app/widgets/post-menu.js @@ -558,7 +558,11 @@ export default createWidget("post-menu", { const repliesButton = this.attachButton("replies", attrs); if (repliesButton) { - postControls.push(repliesButton); + if (!this.site.mobileView) { + postControls.push(repliesButton); + } else { + visibleButtons.splice(-1, 0, repliesButton); + } } const extraControls = applyDecorators(this, "extra-controls", attrs, state); diff --git a/app/assets/stylesheets/mobile/topic-post.scss b/app/assets/stylesheets/mobile/topic-post.scss index 7f778d1e66..a10d75c209 100644 --- a/app/assets/stylesheets/mobile/topic-post.scss +++ b/app/assets/stylesheets/mobile/topic-post.scss @@ -106,9 +106,12 @@ span.badge-posts { display: flex; align-items: center; .show-replies { + margin-left: auto; display: flex; - padding: 8px; font-size: $font-up-1; + + .reply { + margin-left: 0; + } .d-icon { padding-left: 8px; } From 843f8c67b225cb77a2471ab6de2743961b6afee6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Dec 2020 14:52:04 +1100 Subject: [PATCH 148/393] Build(deps): Bump json from 2.4.0 to 2.4.1 (#11521) Bumps [json](https://github.com/flori/json) from 2.4.0 to 2.4.1. - [Release notes](https://github.com/flori/json/releases) - [Changelog](https://github.com/flori/json/blob/master/CHANGES.md) - [Commits](https://github.com/flori/json/compare/v2.4.0...v2.4.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 63e01cab2d..6d9ffe6355 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -154,7 +154,7 @@ GEM rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - json (2.4.0) + json (2.4.1) json-schema (2.8.1) addressable (>= 2.4) jwt (2.2.2) From f296ca4b4a7e9491cb4a90a00f3c661919c36545 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Fri, 18 Dec 2020 09:42:42 +0530 Subject: [PATCH 149/393] FEATURE: allow plugins to show custom HTML via renderTags (#11520) This commit allows discourse-assign plugin to show custom HTML via renderTags even if topic has no tags. --- .../javascripts/discourse/app/templates/full-page-search.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/app/templates/full-page-search.hbs b/app/assets/javascripts/discourse/app/templates/full-page-search.hbs index 946d324389..d438b390b4 100644 --- a/app/assets/javascripts/discourse/app/templates/full-page-search.hbs +++ b/app/assets/javascripts/discourse/app/templates/full-page-search.hbs @@ -104,7 +104,7 @@ {{category-link result.topic.category.parentCategory}} {{/if}} {{category-link result.topic.category hideParent=true}} - {{#if result.topic.tags}} + {{#if result.topic}} {{discourse-tags result.topic}} {{/if}} {{plugin-outlet name="full-page-search-category" args=(hash result=result)}} From 142e0ae06203c95bfb23e6609392abc4f98a7d61 Mon Sep 17 00:00:00 2001 From: Roman Rizzi Date: Fri, 18 Dec 2020 10:18:52 -0300 Subject: [PATCH 150/393] Revert "Revert "DEV: Wrap `Ember.run.debounce`. (#11352)"" (#11509) * Revert "Revert "DEV: Wrap `Ember.run.debounce`. (#11352)" (#11465)" This reverts commit aa0d4ea764959bd7ec5127f78dbec68de4dc8337. * Correctly debounce onScroll function --- .../addon/components/admin-backups-logs.js | 14 +- .../addon/components/admin-report-chart.js | 7 +- .../components/admin-report-stacked-chart.js | 7 +- .../controllers/admin-dashboard-reports.js | 4 +- .../addon/controllers/admin-email-bounced.js | 8 +- .../addon/controllers/admin-email-received.js | 8 +- .../addon/controllers/admin-email-rejected.js | 8 +- .../addon/controllers/admin-email-sent.js | 8 +- .../addon/controllers/admin-email-skipped.js | 8 +- .../admin-logs-screened-ip-addresses.js | 12 +- .../addon/controllers/admin-permalinks.js | 12 +- .../addon/controllers/admin-site-settings.js | 22 +-- .../controllers/admin-site-text-index.js | 6 +- .../controllers/admin-users-list-show.js | 8 +- .../addon/controllers/admin-watched-words.js | 16 ++- .../discourse-common/addon/lib/debounce.js | 15 +++ .../app/components/choose-message.js | 55 ++++---- .../discourse/app/components/choose-topic.js | 65 +++++---- .../discourse/app/components/composer-body.js | 12 +- .../app/components/composer-editor.js | 9 +- .../app/components/composer-title.js | 7 +- .../discourse/app/components/d-editor.js | 5 +- .../app/components/group-flair-inputs.js | 4 +- .../components/groups-form-profile-fields.js | 74 ++++++----- .../discourse/app/components/quote-button.js | 9 +- .../app/components/scrolling-post-stream.js | 8 +- .../discourse/app/components/text-field.js | 9 +- .../discourse/app/components/topic-list.js | 5 +- .../app/components/topic-navigation.js | 5 +- .../discourse/app/controllers/composer.js | 11 +- .../discourse/app/controllers/group-index.js | 14 +- .../app/controllers/group-requests.js | 14 +- .../discourse/app/controllers/groups-index.js | 4 +- .../app/controllers/insert-hyperlink.js | 5 +- .../discourse/app/controllers/topic.js | 23 ++-- .../app/controllers/user-invited-show.js | 22 +-- .../discourse/app/controllers/users.js | 14 +- .../discourse/app/lib/autocomplete.js | 5 +- .../discourse/app/lib/category-tag-search.js | 71 +++++----- .../discourse/app/lib/reports-loader.js | 9 +- .../discourse/app/lib/safari-hacks.js | 24 ++-- .../discourse/app/lib/user-search.js | 29 +++- .../discourse/app/mixins/docking.js | 5 +- .../app/mixins/mobile-scroll-direction.js | 12 +- .../discourse/app/mixins/scrolling.js | 13 +- .../app/mixins/username-validation.js | 125 ++++++++++-------- .../discourse/app/widgets/post-stream.js | 4 +- .../discourse/app/widgets/search-menu.js | 4 +- .../pretty-text/addon/upload-short-url.js | 4 +- .../select-kit/addon/components/select-kit.js | 12 +- .../discourse-local-dates-create-form.js.es6 | 30 +++-- 51 files changed, 526 insertions(+), 358 deletions(-) create mode 100644 app/assets/javascripts/discourse-common/addon/lib/debounce.js diff --git a/app/assets/javascripts/admin/addon/components/admin-backups-logs.js b/app/assets/javascripts/admin/addon/components/admin-backups-logs.js index 2531919aa2..f691f3ffc6 100644 --- a/app/assets/javascripts/admin/addon/components/admin-backups-logs.js +++ b/app/assets/javascripts/admin/addon/components/admin-backups-logs.js @@ -1,7 +1,7 @@ import { observes, on } from "discourse-common/utils/decorators"; import Component from "@ember/component"; import I18n from "I18n"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { scheduleOnce } from "@ember/runloop"; export default Component.extend({ @@ -33,9 +33,7 @@ export default Component.extend({ } }, - @on("init") - @observes("logs.[]") - _updateFormattedLogs: discourseDebounce(function () { + _updateFormattedLogsFunc: function () { const logs = this.logs; if (logs.length === 0) { return; @@ -57,7 +55,13 @@ export default Component.extend({ this.renderLogs(); scheduleOnce("afterRender", this, this._scrollDown); - }, 150), + }, + + @on("init") + @observes("logs.[]") + _updateFormattedLogs() { + discourseDebounce(this, this._updateFormattedLogsFunc, 150); + }, renderLogs() { const formattedLogs = this.formattedLogs; diff --git a/app/assets/javascripts/admin/addon/components/admin-report-chart.js b/app/assets/javascripts/admin/addon/components/admin-report-chart.js index 40f927f55d..8a894b9562 100644 --- a/app/assets/javascripts/admin/addon/components/admin-report-chart.js +++ b/app/assets/javascripts/admin/addon/components/admin-report-chart.js @@ -1,8 +1,9 @@ -import { debounce, schedule } from "@ember/runloop"; import Component from "@ember/component"; +import discourseDebounce from "discourse-common/lib/debounce"; import loadScript from "discourse/lib/load-script"; import { makeArray } from "discourse-common/lib/helpers"; import { number } from "discourse/lib/formatter"; +import { schedule } from "@ember/runloop"; export default Component.extend({ classNames: ["admin-report-chart"], @@ -14,7 +15,7 @@ export default Component.extend({ this._super(...arguments); this.resizeHandler = () => - debounce(this, this._scheduleChartRendering, 500); + discourseDebounce(this, this._scheduleChartRendering, 500); }, didInsertElement() { @@ -34,7 +35,7 @@ export default Component.extend({ didReceiveAttrs() { this._super(...arguments); - debounce(this, this._scheduleChartRendering, 100); + discourseDebounce(this, this._scheduleChartRendering, 100); }, _scheduleChartRendering() { diff --git a/app/assets/javascripts/admin/addon/components/admin-report-stacked-chart.js b/app/assets/javascripts/admin/addon/components/admin-report-stacked-chart.js index b07a8261c8..4cac3b15db 100644 --- a/app/assets/javascripts/admin/addon/components/admin-report-stacked-chart.js +++ b/app/assets/javascripts/admin/addon/components/admin-report-stacked-chart.js @@ -1,8 +1,9 @@ -import { debounce, schedule } from "@ember/runloop"; import Component from "@ember/component"; +import discourseDebounce from "discourse-common/lib/debounce"; import loadScript from "discourse/lib/load-script"; import { makeArray } from "discourse-common/lib/helpers"; import { number } from "discourse/lib/formatter"; +import { schedule } from "@ember/runloop"; export default Component.extend({ classNames: ["admin-report-chart", "admin-report-stacked-chart"], @@ -11,7 +12,7 @@ export default Component.extend({ this._super(...arguments); this.resizeHandler = () => - debounce(this, this._scheduleChartRendering, 500); + discourseDebounce(this, this._scheduleChartRendering, 500); }, didInsertElement() { @@ -31,7 +32,7 @@ export default Component.extend({ didReceiveAttrs() { this._super(...arguments); - debounce(this, this._scheduleChartRendering, 100); + discourseDebounce(this, this._scheduleChartRendering, 100); }, _scheduleChartRendering() { diff --git a/app/assets/javascripts/admin/addon/controllers/admin-dashboard-reports.js b/app/assets/javascripts/admin/addon/controllers/admin-dashboard-reports.js index 445eb667d8..ab10591c80 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-dashboard-reports.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-dashboard-reports.js @@ -1,7 +1,7 @@ import Controller from "@ember/controller"; import { INPUT_DELAY } from "discourse-common/config/environment"; -import { debounce } from "@ember/runloop"; import discourseComputed from "discourse-common/utils/decorators"; +import discourseDebounce from "discourse-common/lib/debounce"; const { get } = Ember; @@ -34,7 +34,7 @@ export default Controller.extend({ actions: { filterReports(filter) { - debounce(this, this._performFiltering, filter, INPUT_DELAY); + discourseDebounce(this, this._performFiltering, filter, INPUT_DELAY); }, }, diff --git a/app/assets/javascripts/admin/addon/controllers/admin-email-bounced.js b/app/assets/javascripts/admin/addon/controllers/admin-email-bounced.js index 874b7147fb..1500549564 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-email-bounced.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-email-bounced.js @@ -1,11 +1,11 @@ import AdminEmailLogsController from "admin/controllers/admin-email-logs"; import { INPUT_DELAY } from "discourse-common/config/environment"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { observes } from "discourse-common/utils/decorators"; export default AdminEmailLogsController.extend({ @observes("filter.{status,user,address,type}") - filterEmailLogs: discourseDebounce(function () { - this.loadLogs(); - }, INPUT_DELAY), + filterEmailLogs() { + discourseDebounce(this, this.loadLogs, INPUT_DELAY); + }, }); diff --git a/app/assets/javascripts/admin/addon/controllers/admin-email-received.js b/app/assets/javascripts/admin/addon/controllers/admin-email-received.js index 8b977c4d50..0a2933fa23 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-email-received.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-email-received.js @@ -1,14 +1,14 @@ import AdminEmailLogsController from "admin/controllers/admin-email-logs"; import { INPUT_DELAY } from "discourse-common/config/environment"; import IncomingEmail from "admin/models/incoming-email"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { observes } from "discourse-common/utils/decorators"; export default AdminEmailLogsController.extend({ @observes("filter.{status,from,to,subject}") - filterIncomingEmails: discourseDebounce(function () { - this.loadLogs(IncomingEmail); - }, INPUT_DELAY), + filterIncomingEmails() { + discourseDebounce(this, this.loadLogs, IncomingEmail, INPUT_DELAY); + }, actions: { loadMore() { diff --git a/app/assets/javascripts/admin/addon/controllers/admin-email-rejected.js b/app/assets/javascripts/admin/addon/controllers/admin-email-rejected.js index 5be59e6ab8..89c67f3cf9 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-email-rejected.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-email-rejected.js @@ -1,14 +1,14 @@ import AdminEmailLogsController from "admin/controllers/admin-email-logs"; import { INPUT_DELAY } from "discourse-common/config/environment"; import IncomingEmail from "admin/models/incoming-email"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { observes } from "discourse-common/utils/decorators"; export default AdminEmailLogsController.extend({ @observes("filter.{status,from,to,subject,error}") - filterIncomingEmails: discourseDebounce(function () { - this.loadLogs(IncomingEmail); - }, INPUT_DELAY), + filterIncomingEmails() { + discourseDebounce(this, this.loadLogs, IncomingEmail, INPUT_DELAY); + }, actions: { loadMore() { diff --git a/app/assets/javascripts/admin/addon/controllers/admin-email-sent.js b/app/assets/javascripts/admin/addon/controllers/admin-email-sent.js index 660f681c62..5cc83109f8 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-email-sent.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-email-sent.js @@ -1,11 +1,11 @@ import AdminEmailLogsController from "admin/controllers/admin-email-logs"; import { INPUT_DELAY } from "discourse-common/config/environment"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { observes } from "discourse-common/utils/decorators"; export default AdminEmailLogsController.extend({ @observes("filter.{status,user,address,type,reply_key}") - filterEmailLogs: discourseDebounce(function () { - this.loadLogs(); - }, INPUT_DELAY), + filterEmailLogs() { + discourseDebounce(this, this.loadLogs, INPUT_DELAY); + }, }); diff --git a/app/assets/javascripts/admin/addon/controllers/admin-email-skipped.js b/app/assets/javascripts/admin/addon/controllers/admin-email-skipped.js index 874b7147fb..1500549564 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-email-skipped.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-email-skipped.js @@ -1,11 +1,11 @@ import AdminEmailLogsController from "admin/controllers/admin-email-logs"; import { INPUT_DELAY } from "discourse-common/config/environment"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { observes } from "discourse-common/utils/decorators"; export default AdminEmailLogsController.extend({ @observes("filter.{status,user,address,type}") - filterEmailLogs: discourseDebounce(function () { - this.loadLogs(); - }, INPUT_DELAY), + filterEmailLogs() { + discourseDebounce(this, this.loadLogs, INPUT_DELAY); + }, }); diff --git a/app/assets/javascripts/admin/addon/controllers/admin-logs-screened-ip-addresses.js b/app/assets/javascripts/admin/addon/controllers/admin-logs-screened-ip-addresses.js index 32ed7ad944..fb923131ed 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-logs-screened-ip-addresses.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-logs-screened-ip-addresses.js @@ -3,7 +3,7 @@ import I18n from "I18n"; import { INPUT_DELAY } from "discourse-common/config/environment"; import ScreenedIpAddress from "admin/models/screened-ip-address"; import bootbox from "bootbox"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { exportEntity } from "discourse/lib/export-csv"; import { observes } from "discourse-common/utils/decorators"; import { outputExportResult } from "discourse/lib/export-result"; @@ -13,13 +13,17 @@ export default Controller.extend({ filter: null, savedIpAddress: null, - @observes("filter") - show: discourseDebounce(function () { + _debouncedShow() { this.set("loading", true); ScreenedIpAddress.findAll(this.filter).then((result) => { this.setProperties({ model: result, loading: false }); }); - }, INPUT_DELAY), + }, + + @observes("filter") + show() { + discourseDebounce(this, this._debouncedShow, INPUT_DELAY); + }, actions: { allow(record) { diff --git a/app/assets/javascripts/admin/addon/controllers/admin-permalinks.js b/app/assets/javascripts/admin/addon/controllers/admin-permalinks.js index 2aaf42ff3e..b11b397311 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-permalinks.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-permalinks.js @@ -3,20 +3,24 @@ import I18n from "I18n"; import { INPUT_DELAY } from "discourse-common/config/environment"; import Permalink from "admin/models/permalink"; import bootbox from "bootbox"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { observes } from "discourse-common/utils/decorators"; export default Controller.extend({ loading: false, filter: null, - @observes("filter") - show: discourseDebounce(function () { + _debouncedShow() { Permalink.findAll(this.filter).then((result) => { this.set("model", result); this.set("loading", false); }); - }, INPUT_DELAY), + }, + + @observes("filter") + show() { + discourseDebounce(this, this._debouncedShow, INPUT_DELAY); + }, actions: { recordAdded(arg) { diff --git a/app/assets/javascripts/admin/addon/controllers/admin-site-settings.js b/app/assets/javascripts/admin/addon/controllers/admin-site-settings.js index 7dea3a237c..58859ae933 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-site-settings.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-site-settings.js @@ -2,7 +2,7 @@ import Controller from "@ember/controller"; import I18n from "I18n"; import { INPUT_DELAY } from "discourse-common/config/environment"; import { alias } from "@ember/object/computed"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { isEmpty } from "@ember/utils"; import { observes } from "discourse-common/utils/decorators"; @@ -112,13 +112,19 @@ export default Controller.extend({ }, @observes("filter", "onlyOverridden", "model") - filterContent: discourseDebounce(function () { - if (this._skipBounce) { - this.set("_skipBounce", false); - } else { - this.filterContentNow(this.categoryNameKey); - } - }, INPUT_DELAY), + filterContent() { + discourseDebounce( + this, + () => { + if (this._skipBounce) { + this.set("_skipBounce", false); + } else { + this.filterContentNow(this.categoryNameKey); + } + }, + INPUT_DELAY + ); + }, actions: { clearFilter() { diff --git a/app/assets/javascripts/admin/addon/controllers/admin-site-text-index.js b/app/assets/javascripts/admin/addon/controllers/admin-site-text-index.js index fb1a238c3e..289c49da87 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-site-text-index.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-site-text-index.js @@ -1,5 +1,5 @@ import Controller from "@ember/controller"; -import { debounce } from "@ember/runloop"; +import discourseDebounce from "discourse-common/lib/debounce"; let lastSearch; export default Controller.extend({ @@ -28,14 +28,14 @@ export default Controller.extend({ toggleOverridden() { this.toggleProperty("overridden"); this.set("searching", true); - debounce(this, this._performSearch, 400); + discourseDebounce(this, this._performSearch, 400); }, search() { const q = this.q; if (q !== lastSearch) { this.set("searching", true); - debounce(this, this._performSearch, 400); + discourseDebounce(this, this._performSearch, 400); lastSearch = q; } }, diff --git a/app/assets/javascripts/admin/addon/controllers/admin-users-list-show.js b/app/assets/javascripts/admin/addon/controllers/admin-users-list-show.js index 0c2952e929..b0b25706e5 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-users-list-show.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-users-list-show.js @@ -4,7 +4,7 @@ import CanCheckEmails from "discourse/mixins/can-check-emails"; import Controller from "@ember/controller"; import I18n from "I18n"; import { INPUT_DELAY } from "discourse-common/config/environment"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { i18n } from "discourse/lib/computed"; export default Controller.extend(CanCheckEmails, { @@ -32,9 +32,9 @@ export default Controller.extend(CanCheckEmails, { }, @observes("listFilter") - _filterUsers: discourseDebounce(function () { - this.resetFilters(); - }, INPUT_DELAY), + _filterUsers() { + discourseDebounce(this, this.resetFilters, INPUT_DELAY); + }, resetFilters() { this._page = 1; diff --git a/app/assets/javascripts/admin/addon/controllers/admin-watched-words.js b/app/assets/javascripts/admin/addon/controllers/admin-watched-words.js index 3ed8bee62f..cfd86c6c22 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-watched-words.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-watched-words.js @@ -2,7 +2,7 @@ import Controller from "@ember/controller"; import EmberObject from "@ember/object"; import { INPUT_DELAY } from "discourse-common/config/environment"; import { alias } from "@ember/object/computed"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { isEmpty } from "@ember/utils"; import { observes } from "discourse-common/utils/decorators"; @@ -48,10 +48,16 @@ export default Controller.extend({ }, @observes("filter") - filterContent: discourseDebounce(function () { - this.filterContentNow(); - this.set("filtered", !isEmpty(this.filter)); - }, INPUT_DELAY), + filterContent() { + discourseDebounce( + this, + function () { + this.filterContentNow(); + this.set("filtered", !isEmpty(this.filter)); + }, + INPUT_DELAY + ); + }, actions: { clearFilter() { diff --git a/app/assets/javascripts/discourse-common/addon/lib/debounce.js b/app/assets/javascripts/discourse-common/addon/lib/debounce.js new file mode 100644 index 0000000000..541498fda6 --- /dev/null +++ b/app/assets/javascripts/discourse-common/addon/lib/debounce.js @@ -0,0 +1,15 @@ +import { debounce, run } from "@ember/runloop"; +import { isTesting } from "discourse-common/config/environment"; +/** + Debounce a Javascript function. This means if it's called many times in a time limit it + should only be executed once (at the end of the limit counted from the last call made). + Original function will be called with the context and arguments from the last call made. +**/ + +export default function () { + if (isTesting()) { + return run(...arguments); + } else { + return debounce(...arguments); + } +} diff --git a/app/assets/javascripts/discourse/app/components/choose-message.js b/app/assets/javascripts/discourse/app/components/choose-message.js index 22833e61f5..09d9a9123c 100644 --- a/app/assets/javascripts/discourse/app/components/choose-message.js +++ b/app/assets/javascripts/discourse/app/components/choose-message.js @@ -1,5 +1,5 @@ import Component from "@ember/component"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { get } from "@ember/object"; import { isEmpty } from "@ember/utils"; import { next } from "@ember/runloop"; @@ -30,31 +30,38 @@ export default Component.extend({ this.set("loading", false); }, - search: discourseDebounce(function (title) { - const currentTopicId = this.currentTopicId; + search(title) { + discourseDebounce( + this, + function () { + const currentTopicId = this.currentTopicId; - if (isEmpty(title)) { - this.setProperties({ messages: null, loading: false }); - return; - } + if (isEmpty(title)) { + this.setProperties({ messages: null, loading: false }); + return; + } - searchForTerm(title, { - typeFilter: "private_messages", - searchForId: true, - restrictToArchetype: "private_message", - }).then((results) => { - if (results && results.posts && results.posts.length > 0) { - this.set( - "messages", - results.posts - .mapBy("topic") - .filter((t) => t.get("id") !== currentTopicId) - ); - } else { - this.setProperties({ messages: null, loading: false }); - } - }); - }, 300), + searchForTerm(title, { + typeFilter: "private_messages", + searchForId: true, + restrictToArchetype: "private_message", + }).then((results) => { + if (results && results.posts && results.posts.length > 0) { + this.set( + "messages", + results.posts + .mapBy("topic") + .filter((t) => t.get("id") !== currentTopicId) + ); + } else { + this.setProperties({ messages: null, loading: false }); + } + }); + }, + title, + 300 + ); + }, actions: { chooseMessage(message) { diff --git a/app/assets/javascripts/discourse/app/components/choose-topic.js b/app/assets/javascripts/discourse/app/components/choose-topic.js index 01352333ae..ab0bc966bf 100644 --- a/app/assets/javascripts/discourse/app/components/choose-topic.js +++ b/app/assets/javascripts/discourse/app/components/choose-topic.js @@ -1,6 +1,6 @@ import discourseComputed, { observes } from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { isEmpty } from "@ember/utils"; import { next } from "@ember/runloop"; import { searchForTerm } from "discourse/lib/search"; @@ -64,37 +64,46 @@ export default Component.extend({ this.set("loading", false); }, - search: discourseDebounce(function (title) { - if (!this.element || this.isDestroying || this.isDestroyed) { - return; - } + search(title) { + discourseDebounce( + this, + function () { + if (!this.element || this.isDestroying || this.isDestroyed) { + return; + } - if (isEmpty(title) && isEmpty(this.additionalFilters)) { - this.setProperties({ topics: null, loading: false }); - return; - } + if (isEmpty(title) && isEmpty(this.additionalFilters)) { + this.setProperties({ topics: null, loading: false }); + return; + } - const currentTopicId = this.currentTopicId; - const titleWithFilters = `${title} ${this.additionalFilters}`; - let searchParams = {}; + const currentTopicId = this.currentTopicId; + const titleWithFilters = `${title} ${this.additionalFilters}`; + let searchParams = {}; - if (!isEmpty(title)) { - searchParams.typeFilter = "topic"; - searchParams.restrictToArchetype = "regular"; - searchParams.searchForId = true; - } + if (!isEmpty(title)) { + searchParams.typeFilter = "topic"; + searchParams.restrictToArchetype = "regular"; + searchParams.searchForId = true; + } - searchForTerm(titleWithFilters, searchParams).then((results) => { - if (results && results.posts && results.posts.length > 0) { - this.set( - "topics", - results.posts.mapBy("topic").filter((t) => t.id !== currentTopicId) - ); - } else { - this.setProperties({ topics: null, loading: false }); - } - }); - }, 300), + searchForTerm(titleWithFilters, searchParams).then((results) => { + if (results && results.posts && results.posts.length > 0) { + this.set( + "topics", + results.posts + .mapBy("topic") + .filter((t) => t.id !== currentTopicId) + ); + } else { + this.setProperties({ topics: null, loading: false }); + } + }); + }, + title, + 300 + ); + }, actions: { chooseTopic(topic) { diff --git a/app/assets/javascripts/discourse/app/components/composer-body.js b/app/assets/javascripts/discourse/app/components/composer-body.js index 24f978c687..4301331e15 100644 --- a/app/assets/javascripts/discourse/app/components/composer-body.js +++ b/app/assets/javascripts/discourse/app/components/composer-body.js @@ -1,16 +1,10 @@ -import { - cancel, - debounce, - later, - run, - schedule, - throttle, -} from "@ember/runloop"; +import { cancel, later, run, schedule, throttle } from "@ember/runloop"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; import Component from "@ember/component"; import Composer from "discourse/models/composer"; import KeyEnterEscape from "discourse/mixins/key-enter-escape"; import afterTransition from "discourse/lib/after-transition"; +import discourseDebounce from "discourse-common/lib/debounce"; import { headerHeight } from "discourse/components/site-header"; import { iOSWithVisualViewport } from "discourse/lib/utilities"; import positioningWorkaround from "discourse/lib/safari-hacks"; @@ -76,7 +70,7 @@ export default Component.extend(KeyEnterEscape, { return; } - debounce(this, this.debounceMove, 300); + discourseDebounce(this, this.debounceMove, 300); }); }, diff --git a/app/assets/javascripts/discourse/app/components/composer-editor.js b/app/assets/javascripts/discourse/app/components/composer-editor.js index bc90e6bf8c..45dc0da37f 100644 --- a/app/assets/javascripts/discourse/app/components/composer-editor.js +++ b/app/assets/javascripts/discourse/app/components/composer-editor.js @@ -15,7 +15,6 @@ import { inCodeBlock, tinyAvatar, } from "discourse/lib/utilities"; -import { debounce, later, next, run, schedule, throttle } from "@ember/runloop"; import discourseComputed, { observes, on, @@ -28,12 +27,14 @@ import { fetchUnseenMentions, linkSeenMentions, } from "discourse/lib/link-mentions"; +import { later, next, run, schedule, throttle } from "@ember/runloop"; import Component from "@ember/component"; import Composer from "discourse/models/composer"; import EmberObject from "@ember/object"; import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; import bootbox from "bootbox"; +import discourseDebounce from "discourse-common/lib/debounce"; import { findRawTemplate } from "discourse-common/lib/raw-templates"; import getURL from "discourse-common/lib/get-url"; import { iconHTML } from "discourse-common/lib/icon-library"; @@ -905,7 +906,7 @@ export default Component.extend({ // Paint mentions const unseenMentions = linkSeenMentions($preview, this.siteSettings); if (unseenMentions.length) { - debounce( + discourseDebounce( this, this._renderUnseenMentions, $preview, @@ -920,7 +921,7 @@ export default Component.extend({ // Paint category and tag hashtags const unseenHashtags = linkSeenHashtags($preview); if (unseenHashtags.length > 0) { - debounce(this, this._renderUnseenHashtags, $preview, 450); + discourseDebounce(this, this._renderUnseenHashtags, $preview, 450); } // Paint oneboxes @@ -947,7 +948,7 @@ export default Component.extend({ } }; - debounce(this, paintFunc, 450); + discourseDebounce(this, paintFunc, 450); // Short upload urls need resolution resolveAllShortUrls(ajax, this.siteSettings, $preview[0]); diff --git a/app/assets/javascripts/discourse/app/components/composer-title.js b/app/assets/javascripts/discourse/app/components/composer-title.js index 25895f9ea3..7aca53f07c 100644 --- a/app/assets/javascripts/discourse/app/components/composer-title.js +++ b/app/assets/javascripts/discourse/app/components/composer-title.js @@ -1,10 +1,11 @@ import { alias, or } from "@ember/object/computed"; -import { debounce, next, schedule } from "@ember/runloop"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import { next, schedule } from "@ember/runloop"; import Component from "@ember/component"; import EmberObject from "@ember/object"; import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; +import discourseDebounce from "discourse-common/lib/debounce"; import { isTesting } from "discourse-common/config/environment"; import { load } from "pretty-text/oneboxer"; import { lookupCache } from "pretty-text/oneboxer-cache"; @@ -22,7 +23,7 @@ export default Component.extend({ } if (this.get("composer.titleLength") > 0) { - debounce(this, this._titleChanged, 10); + discourseDebounce(this, this._titleChanged, 10); } }, @@ -83,7 +84,7 @@ export default Component.extend({ this._checkForUrl() ); } else { - debounce(this, this._checkForUrl, 500); + discourseDebounce(this, this._checkForUrl, 500); } }, diff --git a/app/assets/javascripts/discourse/app/components/d-editor.js b/app/assets/javascripts/discourse/app/components/d-editor.js index 9fd17ad9de..c5c636ab67 100644 --- a/app/assets/javascripts/discourse/app/components/d-editor.js +++ b/app/assets/javascripts/discourse/app/components/d-editor.js @@ -5,13 +5,13 @@ import { inCodeBlock, safariHacksDisabled, } from "discourse/lib/utilities"; -import { debounce, later, next, schedule, scheduleOnce } from "@ember/runloop"; import discourseComputed, { observes, on, } from "discourse-common/utils/decorators"; import { emojiSearch, isSkinTonableEmoji } from "pretty-text/emoji"; import { emojiUrlFor, generateCookFunction } from "discourse/lib/text"; +import { later, next, schedule, scheduleOnce } from "@ember/runloop"; import Component from "@ember/component"; import I18n from "I18n"; import Mousetrap from "mousetrap"; @@ -19,6 +19,7 @@ import { Promise } from "rsvp"; import { SKIP } from "discourse/lib/autocomplete"; import { categoryHashtagTriggerRule } from "discourse/lib/category-hashtags"; import deprecated from "discourse-common/lib/deprecated"; +import discourseDebounce from "discourse-common/lib/debounce"; import { findRawTemplate } from "discourse-common/lib/raw-templates"; import { getRegister } from "discourse-common/lib/get-owner"; import { isEmpty } from "@ember/utils"; @@ -414,7 +415,7 @@ export default Component.extend({ if (isTesting()) { this._updatePreview(); } else { - debounce(this, this._updatePreview, 30); + discourseDebounce(this, this._updatePreview, 30); } }, diff --git a/app/assets/javascripts/discourse/app/components/group-flair-inputs.js b/app/assets/javascripts/discourse/app/components/group-flair-inputs.js index 465940927b..5a53a6f740 100644 --- a/app/assets/javascripts/discourse/app/components/group-flair-inputs.js +++ b/app/assets/javascripts/discourse/app/components/group-flair-inputs.js @@ -7,7 +7,7 @@ import I18n from "I18n"; import { action } from "@ember/object"; import { ajax } from "discourse/lib/ajax"; import { convertIconClass } from "discourse-common/lib/icon-library"; -import { debounce } from "@ember/runloop"; +import discourseDebounce from "discourse-common/lib/debounce"; import { escapeExpression } from "discourse/lib/utilities"; import getURL from "discourse-common/lib/get-url"; import { htmlSafe } from "@ember/template"; @@ -34,7 +34,7 @@ export default Component.extend({ @observes("model.flair_icon") _loadSVGIcon(flairIcon) { if (flairIcon) { - debounce(this, this._loadIcon, 1000); + discourseDebounce(this, this._loadIcon, 1000); } }, diff --git a/app/assets/javascripts/discourse/app/components/groups-form-profile-fields.js b/app/assets/javascripts/discourse/app/components/groups-form-profile-fields.js index 23672bc5b8..d2a439ed54 100644 --- a/app/assets/javascripts/discourse/app/components/groups-form-profile-fields.js +++ b/app/assets/javascripts/discourse/app/components/groups-form-profile-fields.js @@ -3,7 +3,7 @@ import Component from "@ember/component"; import EmberObject from "@ember/object"; import Group from "discourse/models/group"; import I18n from "I18n"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { isEmpty } from "@ember/utils"; import { not } from "@ember/object/computed"; import { popupAjaxError } from "discourse/lib/ajax-error"; @@ -64,40 +64,46 @@ export default Component.extend({ ); }, - checkGroupName: discourseDebounce(function () { - if (isEmpty(this.nameInput)) { - return; - } - - Group.checkName(this.nameInput) - .then((response) => { - const validationName = "uniqueNameValidation"; - - if (response.available) { - this.set( - validationName, - EmberObject.create({ - ok: true, - reason: I18n.t("admin.groups.new.name.available"), - }) - ); - - this.set("disableSave", false); - this.set("model.name", this.nameInput); - } else { - let reason; - - if (response.errors) { - reason = response.errors.join(" "); - } else { - reason = I18n.t("admin.groups.new.name.not_available"); - } - - this.set(validationName, this._failedInputValidation(reason)); + checkGroupName() { + discourseDebounce( + this, + function () { + if (isEmpty(this.nameInput)) { + return; } - }) - .catch(popupAjaxError); - }, 500), + + Group.checkName(this.nameInput) + .then((response) => { + const validationName = "uniqueNameValidation"; + + if (response.available) { + this.set( + validationName, + EmberObject.create({ + ok: true, + reason: I18n.t("admin.groups.new.name.available"), + }) + ); + + this.set("disableSave", false); + this.set("model.name", this.nameInput); + } else { + let reason; + + if (response.errors) { + reason = response.errors.join(" "); + } else { + reason = I18n.t("admin.groups.new.name.not_available"); + } + + this.set(validationName, this._failedInputValidation(reason)); + } + }) + .catch(popupAjaxError); + }, + 500 + ); + }, _failedInputValidation(reason) { this.set("disableSave", true); diff --git a/app/assets/javascripts/discourse/app/components/quote-button.js b/app/assets/javascripts/discourse/app/components/quote-button.js index 6a7393775e..45ba617836 100644 --- a/app/assets/javascripts/discourse/app/components/quote-button.js +++ b/app/assets/javascripts/discourse/app/components/quote-button.js @@ -9,7 +9,7 @@ import Sharing from "discourse/lib/sharing"; import { action } from "@ember/object"; import { alias } from "@ember/object/computed"; import discourseComputed from "discourse-common/utils/decorators"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { getAbsoluteURL } from "discourse-common/lib/get-url"; import { schedule } from "@ember/runloop"; import toMarkdown from "discourse/lib/to-markdown"; @@ -183,10 +183,9 @@ export default Component.extend({ const { isWinphone, isAndroid } = this.capabilities; const wait = isWinphone || isAndroid ? INPUT_DELAY : 25; - const onSelectionChanged = discourseDebounce( - () => this._selectionChanged(), - wait - ); + const onSelectionChanged = () => { + discourseDebounce(this, this._selectionChanged, wait); + }; $(document) .on("mousedown.quote-button", (e) => { diff --git a/app/assets/javascripts/discourse/app/components/scrolling-post-stream.js b/app/assets/javascripts/discourse/app/components/scrolling-post-stream.js index 614e2251ec..612766c807 100644 --- a/app/assets/javascripts/discourse/app/components/scrolling-post-stream.js +++ b/app/assets/javascripts/discourse/app/components/scrolling-post-stream.js @@ -1,7 +1,8 @@ import { cloak, uncloak } from "discourse/widgets/post-stream"; -import { debounce, next, scheduleOnce } from "@ember/runloop"; +import { next, scheduleOnce } from "@ember/runloop"; import DiscourseURL from "discourse/lib/url"; import MountWidget from "discourse/components/mount-widget"; +import discourseDebounce from "discourse-common/lib/debounce"; import { isWorkaroundActive } from "discourse/lib/safari-hacks"; import offsetCalculator from "discourse/lib/offset-calculator"; import { inject as service } from "@ember/service"; @@ -313,14 +314,13 @@ export default MountWidget.extend({ }, _debouncedScroll() { - debounce(this, this._scrollTriggered, DEBOUNCE_DELAY); + discourseDebounce(this, this._scrollTriggered, DEBOUNCE_DELAY); }, didInsertElement() { this._super(...arguments); - const debouncedScroll = () => - debounce(this, this._scrollTriggered, DEBOUNCE_DELAY); + discourseDebounce(this, this._scrollTriggered, DEBOUNCE_DELAY); this._previouslyNearby = {}; this.appEvents.on("post-stream:refresh", this, "_debouncedScroll"); diff --git a/app/assets/javascripts/discourse/app/components/text-field.js b/app/assets/javascripts/discourse/app/components/text-field.js index 187a1661b4..6561aed20e 100644 --- a/app/assets/javascripts/discourse/app/components/text-field.js +++ b/app/assets/javascripts/discourse/app/components/text-field.js @@ -1,8 +1,9 @@ -import { cancel, debounce, next } from "@ember/runloop"; +import { cancel, next } from "@ember/runloop"; import { isLTR, isRTL, siteDir } from "discourse/lib/text-direction"; import I18n from "I18n"; import TextField from "@ember/component/text-field"; import discourseComputed from "discourse-common/utils/decorators"; +import discourseDebounce from "discourse-common/lib/debounce"; const DEBOUNCE_MS = 500; @@ -38,7 +39,11 @@ export default TextField.extend({ } if (this.onChange) { cancel(this._timer); - this._timer = debounce(this, this._debouncedChange, DEBOUNCE_MS); + this._timer = discourseDebounce( + this, + this._debouncedChange, + DEBOUNCE_MS + ); } } }, diff --git a/app/assets/javascripts/discourse/app/components/topic-list.js b/app/assets/javascripts/discourse/app/components/topic-list.js index 31f187628a..2f1270844f 100644 --- a/app/assets/javascripts/discourse/app/components/topic-list.js +++ b/app/assets/javascripts/discourse/app/components/topic-list.js @@ -1,9 +1,10 @@ import { alias, reads } from "@ember/object/computed"; -import { debounce, schedule } from "@ember/runloop"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; import Component from "@ember/component"; import LoadMore from "discourse/mixins/load-more"; +import discourseDebounce from "discourse-common/lib/debounce"; import { on } from "@ember/object/evented"; +import { schedule } from "@ember/runloop"; export default Component.extend(LoadMore, { tagName: "table", @@ -74,7 +75,7 @@ export default Component.extend(LoadMore, { let scrollTo = this.session.get("topicListScrollPosition"); if (scrollTo && scrollTo >= 0) { schedule("afterRender", () => { - debounce( + discourseDebounce( this, function () { if (this.element && !this.isDestroying && !this.isDestroyed) { diff --git a/app/assets/javascripts/discourse/app/components/topic-navigation.js b/app/assets/javascripts/discourse/app/components/topic-navigation.js index bacc74415e..5b58ff9147 100644 --- a/app/assets/javascripts/discourse/app/components/topic-navigation.js +++ b/app/assets/javascripts/discourse/app/components/topic-navigation.js @@ -3,9 +3,10 @@ import PanEvents, { SWIPE_VELOCITY, SWIPE_VELOCITY_THRESHOLD, } from "discourse/mixins/pan-events"; -import { debounce, later } from "@ember/runloop"; import Component from "@ember/component"; import EmberObject from "@ember/object"; +import discourseDebounce from "discourse-common/lib/debounce"; +import { later } from "@ember/runloop"; import { observes } from "discourse-common/utils/decorators"; import showModal from "discourse/lib/show-modal"; @@ -53,7 +54,7 @@ export default Component.extend(PanEvents, { }, _checkSize() { - debounce(this, this._performCheckSize, 300, true); + discourseDebounce(this, this._performCheckSize, 300, true); }, // we need to store this so topic progress has something to init with diff --git a/app/assets/javascripts/discourse/app/controllers/composer.js b/app/assets/javascripts/discourse/app/controllers/composer.js index 2d1c9a0e89..afdf82bb26 100644 --- a/app/assets/javascripts/discourse/app/controllers/composer.js +++ b/app/assets/javascripts/discourse/app/controllers/composer.js @@ -6,7 +6,7 @@ import { authorizesOneOrMoreExtensions, uploadIcon, } from "discourse/lib/uploads"; -import { cancel, debounce, run } from "@ember/runloop"; +import { cancel, run } from "@ember/runloop"; import { cannotPostAgain, durationTextFromSeconds, @@ -22,6 +22,7 @@ import { Promise } from "rsvp"; import bootbox from "bootbox"; import { buildQuote } from "discourse/lib/quote"; import deprecated from "discourse-common/lib/deprecated"; +import discourseDebounce from "discourse-common/lib/debounce"; import { emojiUnescape } from "discourse/lib/text"; import { escapeExpression } from "discourse/lib/utilities"; import { getOwner } from "discourse-common/lib/get-owner"; @@ -1162,7 +1163,11 @@ export default Controller.extend({ // in test debounce is Ember.run, this will cause // an infinite loop if (!isTesting()) { - this._saveDraftDebounce = debounce(this, this._saveDraft, 2000); + this._saveDraftDebounce = discourseDebounce( + this, + this._saveDraft, + 2000 + ); } } else { this._saveDraftPromise = model.saveDraft().finally(() => { @@ -1188,7 +1193,7 @@ export default Controller.extend({ if (Date.now() - this._lastDraftSaved > 15000) { this._saveDraft(); } else { - let method = isTesting() ? run : debounce; + let method = isTesting() ? run : discourseDebounce; this._saveDraftDebounce = method(this, this._saveDraft, 2000); } } diff --git a/app/assets/javascripts/discourse/app/controllers/group-index.js b/app/assets/javascripts/discourse/app/controllers/group-index.js index fd37fe892d..b11eb199c5 100644 --- a/app/assets/javascripts/discourse/app/controllers/group-index.js +++ b/app/assets/javascripts/discourse/app/controllers/group-index.js @@ -1,7 +1,7 @@ import Controller, { inject as controller } from "@ember/controller"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; import { action } from "@ember/object"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { gt } from "@ember/object/computed"; import { popupAjaxError } from "discourse/lib/ajax-error"; @@ -19,9 +19,15 @@ export default Controller.extend({ showActions: false, @observes("filterInput") - _setFilter: discourseDebounce(function () { - this.set("filter", this.filterInput); - }, 500), + _setFilter() { + discourseDebounce( + this, + function () { + this.set("filter", this.filterInput); + }, + 500 + ); + }, @observes("order", "asc", "filter") _filtersChanged() { diff --git a/app/assets/javascripts/discourse/app/controllers/group-requests.js b/app/assets/javascripts/discourse/app/controllers/group-requests.js index 791da19ee0..73da360192 100644 --- a/app/assets/javascripts/discourse/app/controllers/group-requests.js +++ b/app/assets/javascripts/discourse/app/controllers/group-requests.js @@ -1,7 +1,7 @@ import Controller, { inject as controller } from "@ember/controller"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; import { ajax } from "discourse/lib/ajax"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ @@ -17,9 +17,15 @@ export default Controller.extend({ loading: false, @observes("filterInput") - _setFilter: discourseDebounce(function () { - this.set("filter", this.filterInput); - }, 500), + _setFilter() { + discourseDebounce( + this, + function () { + this.set("filter", this.filterInput); + }, + 500 + ); + }, @observes("order", "desc", "filter") _filtersChanged() { diff --git a/app/assets/javascripts/discourse/app/controllers/groups-index.js b/app/assets/javascripts/discourse/app/controllers/groups-index.js index a68dbedf58..fdc3f90900 100644 --- a/app/assets/javascripts/discourse/app/controllers/groups-index.js +++ b/app/assets/javascripts/discourse/app/controllers/groups-index.js @@ -2,8 +2,8 @@ import Controller, { inject as controller } from "@ember/controller"; import I18n from "I18n"; import { INPUT_DELAY } from "discourse-common/config/environment"; import { action } from "@ember/object"; -import { debounce } from "@ember/runloop"; import discourseComputed from "discourse-common/utils/decorators"; +import discourseDebounce from "discourse-common/lib/debounce"; export default Controller.extend({ application: controller(), @@ -45,7 +45,7 @@ export default Controller.extend({ @action onFilterChanged(filter) { - debounce(this, this._debouncedFilter, filter, INPUT_DELAY); + discourseDebounce(this, this._debouncedFilter, filter, INPUT_DELAY); }, @action diff --git a/app/assets/javascripts/discourse/app/controllers/insert-hyperlink.js b/app/assets/javascripts/discourse/app/controllers/insert-hyperlink.js index 3d4b3babad..42c3deeb32 100644 --- a/app/assets/javascripts/discourse/app/controllers/insert-hyperlink.js +++ b/app/assets/javascripts/discourse/app/controllers/insert-hyperlink.js @@ -1,7 +1,8 @@ -import { cancel, debounce, schedule } from "@ember/runloop"; +import { cancel, schedule } from "@ember/runloop"; import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { bind } from "discourse-common/utils/decorators"; +import discourseDebounce from "discourse-common/lib/debounce"; import { isEmpty } from "@ember/utils"; import { prefixProtocol } from "discourse/lib/url"; import { searchForTerm } from "discourse/lib/search"; @@ -177,7 +178,7 @@ export default Controller.extend(ModalFunctionality, { } }, search() { - this._debounced = debounce(this, this.triggerSearch, 400); + this._debounced = discourseDebounce(this, this.triggerSearch, 400); }, }, }); diff --git a/app/assets/javascripts/discourse/app/controllers/topic.js b/app/assets/javascripts/discourse/app/controllers/topic.js index e52954452b..a27429cfcc 100644 --- a/app/assets/javascripts/discourse/app/controllers/topic.js +++ b/app/assets/javascripts/discourse/app/controllers/topic.js @@ -18,7 +18,7 @@ import bootbox from "bootbox"; import { bufferedProperty } from "discourse/mixins/buffered-content"; import { buildQuote } from "discourse/lib/quote"; import { deepMerge } from "discourse-common/lib/object"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { escapeExpression } from "discourse/lib/utilities"; import { extractLinkMeta } from "discourse/lib/render-topic-featured-link"; import isElementInViewport from "discourse/lib/is-element-in-viewport"; @@ -1529,15 +1529,22 @@ export default Controller.extend(bufferedProperty("model"), { ); }, - _scrollToPost: discourseDebounce(function (postNumber) { - const $post = $(`.topic-post article#post_${postNumber}`); + _scrollToPost(postNumber) { + discourseDebounce( + this, + function () { + const $post = $(`.topic-post article#post_${postNumber}`); - if ($post.length === 0 || isElementInViewport($post)) { - return; - } + if ($post.length === 0 || isElementInViewport($post)) { + return; + } - $("html, body").animate({ scrollTop: $post.offset().top }, 1000); - }, 500), + $("html, body").animate({ scrollTop: $post.offset().top }, 1000); + }, + postNumber, + 500 + ); + }, unsubscribe() { // never unsubscribe when navigating from topic to topic diff --git a/app/assets/javascripts/discourse/app/controllers/user-invited-show.js b/app/assets/javascripts/discourse/app/controllers/user-invited-show.js index 9781e87007..eb93383535 100644 --- a/app/assets/javascripts/discourse/app/controllers/user-invited-show.js +++ b/app/assets/javascripts/discourse/app/controllers/user-invited-show.js @@ -5,7 +5,7 @@ import I18n from "I18n"; import { INPUT_DELAY } from "discourse-common/config/environment"; import Invite from "discourse/models/invite"; import bootbox from "bootbox"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ @@ -26,13 +26,19 @@ export default Controller.extend({ }, @observes("searchTerm") - _searchTermChanged: discourseDebounce(function () { - Invite.findInvitedBy( - this.user, - this.filter, - this.searchTerm - ).then((invites) => this.set("model", invites)); - }, INPUT_DELAY), + _searchTermChanged() { + discourseDebounce( + this, + function () { + Invite.findInvitedBy( + this.user, + this.filter, + this.searchTerm + ).then((invites) => this.set("model", invites)); + }, + INPUT_DELAY + ); + }, inviteRedeemed: equal("filter", "redeemed"), invitePending: equal("filter", "pending"), diff --git a/app/assets/javascripts/discourse/app/controllers/users.js b/app/assets/javascripts/discourse/app/controllers/users.js index a0b180a164..8ebaf7adf6 100644 --- a/app/assets/javascripts/discourse/app/controllers/users.js +++ b/app/assets/javascripts/discourse/app/controllers/users.js @@ -1,5 +1,5 @@ import Controller, { inject as controller } from "@ember/controller"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { equal } from "@ember/object/computed"; import { longDate } from "discourse/lib/formatter"; import { observes } from "discourse-common/utils/decorators"; @@ -37,9 +37,15 @@ export default Controller.extend({ }, @observes("nameInput") - _setName: discourseDebounce(function () { - this.set("name", this.nameInput); - }, 500), + _setName() { + discourseDebounce( + this, + function () { + this.set("name", this.nameInput); + }, + 500 + ); + }, @observes("model.canLoadMore") _showFooter: function () { diff --git a/app/assets/javascripts/discourse/app/lib/autocomplete.js b/app/assets/javascripts/discourse/app/lib/autocomplete.js index f08c7851d2..a5aab45575 100644 --- a/app/assets/javascripts/discourse/app/lib/autocomplete.js +++ b/app/assets/javascripts/discourse/app/lib/autocomplete.js @@ -1,7 +1,8 @@ -import { cancel, debounce, later } from "@ember/runloop"; +import { cancel, later } from "@ember/runloop"; import { caretPosition, setCaretPosition } from "discourse/lib/utilities"; import { INPUT_DELAY } from "discourse-common/config/environment"; import Site from "discourse/models/site"; +import discourseDebounce from "discourse-common/lib/debounce"; import { iconHTML } from "discourse-common/lib/icon-library"; /** @@ -422,7 +423,7 @@ export default function (options) { $(this).on("keyup.autocomplete", function (e) { if (options.debounced) { - debounce(this, performAutocomplete, e, INPUT_DELAY); + discourseDebounce(this, performAutocomplete, e, INPUT_DELAY); } else { performAutocomplete(e); } diff --git a/app/assets/javascripts/discourse/app/lib/category-tag-search.js b/app/assets/javascripts/discourse/app/lib/category-tag-search.js index 95fcdab9e0..d2e1fd5c83 100644 --- a/app/assets/javascripts/discourse/app/lib/category-tag-search.js +++ b/app/assets/javascripts/discourse/app/lib/category-tag-search.js @@ -4,7 +4,7 @@ import Category from "discourse/models/category"; import { Promise } from "rsvp"; import { SEPARATOR } from "discourse/lib/category-hashtags"; import { TAG_HASHTAG_POSTFIX } from "discourse/lib/tag-hashtags"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import getURL from "discourse-common/lib/get-url"; import { isTesting } from "discourse-common/config/environment"; @@ -27,38 +27,47 @@ function searchTags(term, categories, limit) { isTesting() ? 50 : 5000 ); - const debouncedSearch = discourseDebounce((q, cats, resultFunc) => { - oldSearch = $.ajax(getURL("/tags/filter/search"), { - type: "GET", - cache: true, - data: { limit: limit, q }, - }); - - var returnVal = CANCELLED_STATUS; - - oldSearch - .then((r) => { - const categoryNames = cats.map((c) => c.model.get("name")); - - const tags = r.results.map((tag) => { - const tagName = tag.text; - - return { - name: tagName, - text: categoryNames.includes(tagName) - ? `${tagName}${TAG_HASHTAG_POSTFIX}` - : tagName, - count: tag.count, - }; + const debouncedSearch = (q, cats, resultFunc) => { + discourseDebounce( + this, + function () { + oldSearch = $.ajax(getURL("/tags/filter/search"), { + type: "GET", + cache: true, + data: { limit: limit, q }, }); - returnVal = cats.concat(tags); - }) - .always(() => { - oldSearch = null; - resultFunc(returnVal); - }); - }, 300); + var returnVal = CANCELLED_STATUS; + + oldSearch + .then((r) => { + const categoryNames = cats.map((c) => c.model.get("name")); + + const tags = r.results.map((tag) => { + const tagName = tag.text; + + return { + name: tagName, + text: categoryNames.includes(tagName) + ? `${tagName}${TAG_HASHTAG_POSTFIX}` + : tagName, + count: tag.count, + }; + }); + + returnVal = cats.concat(tags); + }) + .always(() => { + oldSearch = null; + resultFunc(returnVal); + }); + }, + q, + cats, + resultFunc, + 300 + ); + }; debouncedSearch(term, categories, (result) => { cancel(clearPromise); diff --git a/app/assets/javascripts/discourse/app/lib/reports-loader.js b/app/assets/javascripts/discourse/app/lib/reports-loader.js index e0b108b7c7..afd0b132ee 100644 --- a/app/assets/javascripts/discourse/app/lib/reports-loader.js +++ b/app/assets/javascripts/discourse/app/lib/reports-loader.js @@ -1,6 +1,5 @@ import { ajax } from "discourse/lib/ajax"; -import { run } from "@ember/runloop"; -const { debounce } = run; +import discourseDebounce from "discourse-common/lib/debounce"; let _queue = []; let _processing = 0; @@ -33,7 +32,7 @@ export default { _queue.push({ runnable: () => callback, type, params }); - debounce(this, this._processQueue, DEBOUNCING_DELAY); + discourseDebounce(this, this._processQueue, DEBOUNCING_DELAY); }, _processQueue() { @@ -50,7 +49,7 @@ export default { // if queue has still jobs after splice, we request a future processing if (_queue.length > 0) { - debounce(this, this._processQueue, DEBOUNCING_DELAY); + discourseDebounce(this, this._processQueue, DEBOUNCING_DELAY); } let reports = {}; @@ -79,7 +78,7 @@ export default { .finally(() => { _processing--; - debounce(this, this._processQueue, DEBOUNCING_DELAY); + discourseDebounce(this, this._processQueue, DEBOUNCING_DELAY); }); }, diff --git a/app/assets/javascripts/discourse/app/lib/safari-hacks.js b/app/assets/javascripts/discourse/app/lib/safari-hacks.js index 7ecdb18b89..99c8b335e1 100644 --- a/app/assets/javascripts/discourse/app/lib/safari-hacks.js +++ b/app/assets/javascripts/discourse/app/lib/safari-hacks.js @@ -3,7 +3,7 @@ import { safariHacksDisabled, } from "discourse/lib/utilities"; import { INPUT_DELAY } from "discourse-common/config/environment"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { helperContext } from "discourse-common/lib/helpers"; import { later } from "@ember/runloop"; @@ -145,7 +145,9 @@ function positioningWorkaround($fixedElement) { positioningWorkaround.blur(evt); }; - var blurred = discourseDebounce(blurredNow, INPUT_DELAY); + var blurred = function (evt) { + discourseDebounce(this, blurredNow, evt, INPUT_DELAY); + }; var positioningHack = function (evt) { let _this = this; @@ -214,13 +216,19 @@ function positioningWorkaround($fixedElement) { } } - const checkForInputs = discourseDebounce(function () { - attachTouchStart(fixedElement, lastTouched); + const checkForInputs = function () { + discourseDebounce( + this, + function () { + attachTouchStart(fixedElement, lastTouched); - $fixedElement.find("input[type=text],textarea").each(function () { - attachTouchStart(this, positioningHack); - }); - }, 100); + $fixedElement.find("input[type=text],textarea").each(function () { + attachTouchStart(this, positioningHack); + }); + }, + 100 + ); + }; positioningWorkaround.touchstartEvent = function (element) { var triggerHack = positioningHack.bind(element); diff --git a/app/assets/javascripts/discourse/app/lib/user-search.js b/app/assets/javascripts/discourse/app/lib/user-search.js index b68e0755e8..c77c5c6cd7 100644 --- a/app/assets/javascripts/discourse/app/lib/user-search.js +++ b/app/assets/javascripts/discourse/app/lib/user-search.js @@ -1,7 +1,7 @@ import { cancel, later } from "@ember/runloop"; import { CANCELLED_STATUS } from "discourse/lib/autocomplete"; import { Promise } from "rsvp"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { emailValid } from "discourse/lib/utilities"; import { isTesting } from "discourse-common/config/environment"; import { userPath } from "discourse/lib/url"; @@ -81,7 +81,32 @@ function performSearch( }); } -var debouncedSearch = discourseDebounce(performSearch, 300); +var debouncedSearch = function ( + term, + topicId, + categoryId, + includeGroups, + includeMentionableGroups, + includeMessageableGroups, + allowedUsers, + groupMembersOf, + resultsFn +) { + discourseDebounce( + this, + performSearch, + term, + topicId, + categoryId, + includeGroups, + includeMentionableGroups, + includeMessageableGroups, + allowedUsers, + groupMembersOf, + resultsFn, + 300 + ); +}; function organizeResults(r, options) { if (r === CANCELLED_STATUS) { diff --git a/app/assets/javascripts/discourse/app/mixins/docking.js b/app/assets/javascripts/discourse/app/mixins/docking.js index 4147ae94de..fee3e73b26 100644 --- a/app/assets/javascripts/discourse/app/mixins/docking.js +++ b/app/assets/javascripts/discourse/app/mixins/docking.js @@ -1,5 +1,6 @@ -import { debounce, later } from "@ember/runloop"; import Mixin from "@ember/object/mixin"; +import discourseDebounce from "discourse-common/lib/debounce"; +import { later } from "@ember/runloop"; const helper = { offset() { @@ -15,7 +16,7 @@ export default Mixin.create({ init() { this._super(...arguments); this.queueDockCheck = () => { - debounce(this, this.safeDockCheck, 5); + discourseDebounce(this, this.safeDockCheck, 5); }; }, diff --git a/app/assets/javascripts/discourse/app/mixins/mobile-scroll-direction.js b/app/assets/javascripts/discourse/app/mixins/mobile-scroll-direction.js index 2be71c0d63..f751216c97 100644 --- a/app/assets/javascripts/discourse/app/mixins/mobile-scroll-direction.js +++ b/app/assets/javascripts/discourse/app/mixins/mobile-scroll-direction.js @@ -1,5 +1,5 @@ import Mixin from "@ember/object/mixin"; -import { debounce } from "@ember/runloop"; +import discourseDebounce from "discourse-common/lib/debounce"; // Small buffer so that very tiny scrolls don't trigger mobile header switch const MOBILE_SCROLL_TOLERANCE = 5; @@ -47,9 +47,13 @@ export default Mixin.create({ // If the user reaches the very bottom of the topic, we only want to reset // this scroll direction after a second scrolldown. This is a nicer event // similar to what Safari and Chrome do. - debounce(() => { - this._bottomHit = 1; - }, 1000); + discourseDebounce( + this, + function () { + this._bottomHit = 1; + }, + 1000 + ); if (this._bottomHit === 1) { this.set("mobileScrollDirection", null); diff --git a/app/assets/javascripts/discourse/app/mixins/scrolling.js b/app/assets/javascripts/discourse/app/mixins/scrolling.js index f1df25463a..d0c61af38b 100644 --- a/app/assets/javascripts/discourse/app/mixins/scrolling.js +++ b/app/assets/javascripts/discourse/app/mixins/scrolling.js @@ -1,5 +1,5 @@ import Mixin from "@ember/object/mixin"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { scheduleOnce } from "@ember/runloop"; import { inject as service } from "@ember/service"; @@ -41,14 +41,19 @@ const Scrolling = Mixin.create({ if (microLib.activeTransition) { return; } + return scheduleOnce("afterRender", this, "scrolled"); }; if (opts.debounce) { - onScrollMethod = discourseDebounce(onScrollMethod, opts.debounce); - } + let debouncedScrollMethod = () => { + discourseDebounce(this, onScrollMethod, opts.debounce); + }; - ScrollingDOMMethods.bindOnScroll(onScrollMethod, opts.name); + ScrollingDOMMethods.bindOnScroll(debouncedScrollMethod, opts.name); + } else { + ScrollingDOMMethods.bindOnScroll(onScrollMethod, opts.name); + } }, screenNotFull: () => ScrollingDOMMethods.screenNotFull(), diff --git a/app/assets/javascripts/discourse/app/mixins/username-validation.js b/app/assets/javascripts/discourse/app/mixins/username-validation.js index 9d26b91cea..0749bd70f9 100644 --- a/app/assets/javascripts/discourse/app/mixins/username-validation.js +++ b/app/assets/javascripts/discourse/app/mixins/username-validation.js @@ -3,7 +3,7 @@ import I18n from "I18n"; import Mixin from "@ember/object/mixin"; import User from "discourse/models/user"; import discourseComputed from "discourse-common/utils/decorators"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { isEmpty } from "@ember/utils"; import { setting } from "discourse/lib/computed"; @@ -14,20 +14,26 @@ export default Mixin.create({ minUsernameLength: setting("min_username_length"), - fetchExistingUsername: discourseDebounce(function () { - User.checkUsername(null, this.accountEmail).then((result) => { - if ( - result.suggestion && - (isEmpty(this.accountUsername) || - this.accountUsername === this.get("authOptions.username")) - ) { - this.setProperties({ - accountUsername: result.suggestion, - prefilledUsername: result.suggestion, + fetchExistingUsername() { + discourseDebounce( + this, + function () { + User.checkUsername(null, this.accountEmail).then((result) => { + if ( + result.suggestion && + (isEmpty(this.accountUsername) || + this.accountUsername === this.get("authOptions.username")) + ) { + this.setProperties({ + accountUsername: result.suggestion, + prefilledUsername: result.suggestion, + }); + } }); - } - }); - }, 500), + }, + 500 + ); + }, @discourseComputed("accountUsername") basicUsernameValidation(accountUsername) { @@ -87,54 +93,61 @@ export default Mixin.create({ ); }, - checkUsernameAvailability: discourseDebounce(function () { - if (this.shouldCheckUsernameAvailability()) { - return User.checkUsername(this.accountUsername, this.accountEmail).then( - (result) => { - this.set("isDeveloper", false); - if (result.available) { - if (result.is_developer) { - this.set("isDeveloper", true); - } - return this.set( - "uniqueUsernameValidation", - EmberObject.create({ - ok: true, - reason: I18n.t("user.username.available"), - }) - ); - } else { - const failedAttrs = { - failed: true, - element: document.querySelector("#new-account-username"), - }; - - if (result.suggestion) { + checkUsernameAvailability() { + discourseDebounce( + this, + function () { + if (this.shouldCheckUsernameAvailability()) { + return User.checkUsername( + this.accountUsername, + this.accountEmail + ).then((result) => { + this.set("isDeveloper", false); + if (result.available) { + if (result.is_developer) { + this.set("isDeveloper", true); + } return this.set( "uniqueUsernameValidation", - EmberObject.create( - Object.assign(failedAttrs, { - reason: I18n.t("user.username.not_available", result), - }) - ) + EmberObject.create({ + ok: true, + reason: I18n.t("user.username.available"), + }) ); } else { - return this.set( - "uniqueUsernameValidation", - EmberObject.create( - Object.assign(failedAttrs, { - reason: result.errors - ? result.errors.join(" ") - : I18n.t("user.username.not_available_no_suggestion"), - }) - ) - ); + const failedAttrs = { + failed: true, + element: document.querySelector("#new-account-username"), + }; + + if (result.suggestion) { + return this.set( + "uniqueUsernameValidation", + EmberObject.create( + Object.assign(failedAttrs, { + reason: I18n.t("user.username.not_available", result), + }) + ) + ); + } else { + return this.set( + "uniqueUsernameValidation", + EmberObject.create( + Object.assign(failedAttrs, { + reason: result.errors + ? result.errors.join(" ") + : I18n.t("user.username.not_available_no_suggestion"), + }) + ) + ); + } } - } + }); } - ); - } - }, 500), + }, + 500 + ); + }, // Actually wait for the async name check before we're 100% sure we're good to go @discourseComputed("uniqueUsernameValidation", "basicUsernameValidation") diff --git a/app/assets/javascripts/discourse/app/widgets/post-stream.js b/app/assets/javascripts/discourse/app/widgets/post-stream.js index d0f45a907c..fd55936347 100644 --- a/app/assets/javascripts/discourse/app/widgets/post-stream.js +++ b/app/assets/javascripts/discourse/app/widgets/post-stream.js @@ -4,7 +4,7 @@ import { Placeholder } from "discourse/lib/posts-with-placeholders"; import { addWidgetCleanCallback } from "discourse/components/mount-widget"; import { avatarFor } from "discourse/widgets/post"; import { createWidget } from "discourse/widgets/widget"; -import { debounce } from "@ember/runloop"; +import discourseDebounce from "discourse-common/lib/debounce"; import { h } from "virtual-dom"; import { iconNode } from "discourse-common/lib/icon-library"; import { isTesting } from "discourse-common/config/environment"; @@ -46,7 +46,7 @@ export function cloak(post, component) { _heights[post.id] = $post.outerHeight(); component.dirtyKeys.keyDirty(`post-${post.id}`); - debounce(component, "queueRerender", 1000); + discourseDebounce(component, "queueRerender", 1000); } export function uncloak(post, component) { diff --git a/app/assets/javascripts/discourse/app/widgets/search-menu.js b/app/assets/javascripts/discourse/app/widgets/search-menu.js index 999e063742..28d8ce506b 100644 --- a/app/assets/javascripts/discourse/app/widgets/search-menu.js +++ b/app/assets/javascripts/discourse/app/widgets/search-menu.js @@ -1,7 +1,7 @@ import { isValidSearchTerm, searchForTerm } from "discourse/lib/search"; import DiscourseURL from "discourse/lib/url"; import { createWidget } from "discourse/widgets/widget"; -import { debounce } from "@ember/runloop"; +import discourseDebounce from "discourse-common/lib/debounce"; import { get } from "@ember/object"; import getURL from "discourse-common/lib/get-url"; import { h } from "virtual-dom"; @@ -284,7 +284,7 @@ export default createWidget("search-menu", { searchData.noResults = false; this.searchService().set("highlightTerm", searchData.term); searchData.loading = true; - debounce(SearchHelper, SearchHelper.perform, this, 400); + discourseDebounce(SearchHelper, SearchHelper.perform, this, 400); }, moreOfType(type) { diff --git a/app/assets/javascripts/pretty-text/addon/upload-short-url.js b/app/assets/javascripts/pretty-text/addon/upload-short-url.js index 5080a52ec8..febcbaf319 100644 --- a/app/assets/javascripts/pretty-text/addon/upload-short-url.js +++ b/app/assets/javascripts/pretty-text/addon/upload-short-url.js @@ -1,5 +1,5 @@ import I18n from "I18n"; -import { debounce } from "@ember/runloop"; +import discourseDebounce from "discourse-common/lib/debounce"; let _cache = {}; @@ -184,7 +184,7 @@ export function resolveAllShortUrls(ajax, siteSettings, scope, opts) { shortUploadElements = scope.querySelectorAll(attributes); if (shortUploadElements.length > 0) { // this is carefully batched so we can do a leading debounce (trigger right away) - return debounce( + return discourseDebounce( null, _loadShortUrls, shortUploadElements, diff --git a/app/assets/javascripts/select-kit/addon/components/select-kit.js b/app/assets/javascripts/select-kit/addon/components/select-kit.js index a440f8d096..54fbe4100b 100644 --- a/app/assets/javascripts/select-kit/addon/components/select-kit.js +++ b/app/assets/javascripts/select-kit/addon/components/select-kit.js @@ -3,14 +3,7 @@ import PluginApiMixin, { applyContentPluginApiCallbacks, applyOnChangePluginApiCallbacks, } from "select-kit/mixins/plugin-api"; -import { - bind, - cancel, - debounce, - next, - schedule, - throttle, -} from "@ember/runloop"; +import { bind, cancel, next, schedule, throttle } from "@ember/runloop"; import { isEmpty, isNone, isPresent } from "@ember/utils"; import Component from "@ember/component"; import I18n from "I18n"; @@ -19,6 +12,7 @@ import { Promise } from "rsvp"; import UtilsMixin from "select-kit/mixins/utils"; import { createPopper } from "@popperjs/core"; import deprecated from "discourse-common/lib/deprecated"; +import discourseDebounce from "discourse-common/lib/debounce"; import { guidFor } from "@ember/object/internals"; import { makeArray } from "discourse-common/lib/helpers"; @@ -386,7 +380,7 @@ export default Component.extend( cancel(this._searchPromise); } - debounce(this, this._debouncedInput, event.target.value, 200); + discourseDebounce(this, this._debouncedInput, event.target.value, 200); }, _debouncedInput(filter) { diff --git a/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js.es6 b/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js.es6 index 581b502781..454bf9ea9a 100644 --- a/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js.es6 +++ b/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js.es6 @@ -6,7 +6,7 @@ import I18n from "I18n"; import { INPUT_DELAY } from "discourse-common/config/environment"; import { Promise } from "rsvp"; import { cookAsync } from "discourse/lib/text"; -import discourseDebounce from "discourse/lib/debounce"; +import discourseDebounce from "discourse-common/lib/debounce"; import { isEmpty } from "@ember/utils"; import loadScript from "discourse/lib/load-script"; import { notEmpty } from "@ember/object/computed"; @@ -56,18 +56,24 @@ export default Component.extend({ }, @observes("markup") - _renderPreview: discourseDebounce(function () { - const markup = this.markup; + _renderPreview() { + discourseDebounce( + this, + function () { + const markup = this.markup; - if (markup) { - cookAsync(markup).then((result) => { - this.set("currentPreview", result); - schedule("afterRender", () => - this.$(".preview .discourse-local-date").applyLocalDates() - ); - }); - } - }, INPUT_DELAY), + if (markup) { + cookAsync(markup).then((result) => { + this.set("currentPreview", result); + schedule("afterRender", () => + this.$(".preview .discourse-local-date").applyLocalDates() + ); + }); + } + }, + INPUT_DELAY + ); + }, @computed("date", "toDate", "toTime") isRange(date, toDate, toTime) { From 806f05f8513d4aabd1727ed5e35c89accbc8329c Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Fri, 18 Dec 2020 16:05:01 +0200 Subject: [PATCH 151/393] FIX: Make find_by_slug_path work with default slugs (#11501) Default slugs are generated by adding '-category' to category ID. --- .../discourse/app/models/category.js | 6 ---- .../tests/helpers/create-pretender.js | 4 +++ app/models/category.rb | 11 ++++--- spec/models/category_spec.rb | 32 +++++++++++++++++++ 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/app/assets/javascripts/discourse/app/models/category.js b/app/assets/javascripts/discourse/app/models/category.js index 2f60ce8350..2340a7213d 100644 --- a/app/assets/javascripts/discourse/app/models/category.js +++ b/app/assets/javascripts/discourse/app/models/category.js @@ -495,12 +495,6 @@ Category.reopenClass({ }, reloadCategoryWithPermissions(params, store, site) { - if (params.slug && params.slug.match(/^\d+-category/)) { - const id = parseInt(params.slug, 10); - return this.reloadById(id).then((result) => - this._includePermissions(result.category, store, site) - ); - } return this.reloadBySlugPath(params.slug).then((result) => this._includePermissions(result.category, store, site) ); diff --git a/app/assets/javascripts/discourse/tests/helpers/create-pretender.js b/app/assets/javascripts/discourse/tests/helpers/create-pretender.js index 5665df651d..084658ff56 100644 --- a/app/assets/javascripts/discourse/tests/helpers/create-pretender.js +++ b/app/assets/javascripts/discourse/tests/helpers/create-pretender.js @@ -313,6 +313,10 @@ export function applyDefaultHandlers(pretender) { response(fixturesByUrl["/c/1/show.json"]) ); + pretender.get("/c/1-category/find_by_slug.json", () => + response(fixturesByUrl["/c/1/show.json"]) + ); + pretender.put("/categories/:category_id", (request) => { const category = parsePostData(request.requestBody); category.id = parseInt(request.params.category_id, 10); diff --git a/app/models/category.rb b/app/models/category.rb index e62bf40671..09cf67d47f 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -801,10 +801,13 @@ class Category < ActiveRecord::Base query = slug_path.inject(nil) do |parent_id, slug| - Category.where( - slug: slug, - parent_category_id: parent_id, - ).select(:id) + category = Category.where(slug: slug, parent_category_id: parent_id) + + if match_id = /^(\d+)-category/.match(slug).presence + category = category.or(Category.where(id: match_id[1], parent_category_id: parent_id)) + end + + category.select(:id) end Category.find_by_id(query) diff --git a/spec/models/category_spec.rb b/spec/models/category_spec.rb index 1dc75ddfac..29c8d554bb 100644 --- a/spec/models/category_spec.rb +++ b/spec/models/category_spec.rb @@ -1185,4 +1185,36 @@ describe Category do end end + describe "#find_by_slug_path" do + it 'works for categories with slugs' do + category = Fabricate(:category, slug: 'cat1') + + expect(Category.find_by_slug_path(['cat1'])).to eq(category) + end + + it 'works for categories without slugs' do + SiteSetting.slug_generation_method = 'none' + + category = Fabricate(:category, slug: 'cat1') + + expect(Category.find_by_slug_path(["#{category.id}-category"])).to eq(category) + end + + it 'works for subcategories with slugs' do + category = Fabricate(:category, slug: 'cat1') + subcategory = Fabricate(:category, slug: 'cat2', parent_category: category) + + expect(Category.find_by_slug_path(['cat1', 'cat2'])).to eq(subcategory) + end + + it 'works for subcategories without slugs' do + SiteSetting.slug_generation_method = 'none' + + category = Fabricate(:category, slug: 'cat1') + subcategory = Fabricate(:category, slug: 'cat2', parent_category: category) + + expect(Category.find_by_slug_path(['cat1', "#{subcategory.id}-category"])).to eq(subcategory) + expect(Category.find_by_slug_path(["#{category.id}-category", "#{subcategory.id}-category"])).to eq(subcategory) + end + end end From 649ed24bb4db3b733c8b9b5397a70cc519304d4b Mon Sep 17 00:00:00 2001 From: Mark VanLandingham Date: Fri, 18 Dec 2020 09:03:51 -0600 Subject: [PATCH 152/393] FEATURE: Do not disturb (#11484) --- .../discourse/app/components/site-header.js | 23 ++++ .../app/controllers/do-not-disturb.js | 36 ++++++ .../subscribe-user-notifications.js | 6 +- .../app/lib/desktop-notifications.js | 5 +- .../discourse/app/lib/push-notifications.js | 1 + .../javascripts/discourse/app/models/user.js | 31 +++++ .../app/templates/components/tap-tile.hbs | 4 +- .../app/templates/modal/bookmark.hbs | 2 +- .../app/templates/modal/do-not-disturb.hbs | 24 ++++ .../discourse/app/widgets/do-not-disturb.js | 54 ++++++++ .../discourse/app/widgets/header.js | 117 +++++++++--------- .../app/widgets/quick-access-notifications.js | 1 + .../app/widgets/quick-access-panel.js | 7 +- .../tests/acceptance/do-not-disturb-test.js | 71 +++++++++++ .../discourse/tests/helpers/qunit-helpers.js | 5 + .../stylesheets/common/base/discourse.scss | 79 ++++++++++++ .../stylesheets/common/base/menu-panel.scss | 6 +- app/controllers/do_not_disturb_controller.rb | 44 +++++++ app/models/do_not_disturb_timing.rb | 13 ++ app/models/notification.rb | 3 +- app/models/user.rb | 14 +++ app/serializers/current_user_serializer.rb | 7 +- app/services/post_alerter.rb | 2 + config/locales/client.en.yml | 15 ++- config/routes.rb | 3 + ...210151635_create_do_not_disturb_timings.rb | 14 +++ lib/svg_sprite/svg_sprite.rb | 1 + spec/fabricators/do_not_disturb_fabricator.rb | 7 ++ spec/models/do_not_disturb_timing_spec.rb | 16 +++ spec/models/notification_spec.rb | 18 +++ spec/models/user_spec.rb | 12 ++ .../do_not_disturb_controller_spec.rb | 46 +++++++ spec/services/post_alerter_spec.rb | 15 +++ 33 files changed, 635 insertions(+), 67 deletions(-) create mode 100644 app/assets/javascripts/discourse/app/controllers/do-not-disturb.js create mode 100644 app/assets/javascripts/discourse/app/templates/modal/do-not-disturb.hbs create mode 100644 app/assets/javascripts/discourse/app/widgets/do-not-disturb.js create mode 100644 app/assets/javascripts/discourse/tests/acceptance/do-not-disturb-test.js create mode 100644 app/controllers/do_not_disturb_controller.rb create mode 100644 app/models/do_not_disturb_timing.rb create mode 100644 db/migrate/20201210151635_create_do_not_disturb_timings.rb create mode 100644 spec/fabricators/do_not_disturb_fabricator.rb create mode 100644 spec/models/do_not_disturb_timing_spec.rb create mode 100644 spec/requests/do_not_disturb_controller_spec.rb diff --git a/app/assets/javascripts/discourse/app/components/site-header.js b/app/assets/javascripts/discourse/app/components/site-header.js index 578a4a4e47..0a6b8aa4f0 100644 --- a/app/assets/javascripts/discourse/app/components/site-header.js +++ b/app/assets/javascripts/discourse/app/components/site-header.js @@ -6,6 +6,7 @@ import PanEvents, { import { cancel, later, schedule } from "@ember/runloop"; import Docking from "discourse/mixins/docking"; import MountWidget from "discourse/components/mount-widget"; +import { isTesting } from "discourse-common/config/environment"; import { observes } from "discourse-common/utils/decorators"; import { topicTitleDecorators } from "discourse/components/topic-title"; @@ -13,6 +14,7 @@ const SiteHeaderComponent = MountWidget.extend(Docking, PanEvents, { widget: "header", docAt: null, dockedHeader: null, + _listenToDoNotDisturbLoop: null, _animate: false, _isPanning: false, _panMenuOrigin: "right", @@ -194,12 +196,32 @@ const SiteHeaderComponent = MountWidget.extend(Docking, PanEvents, { } }, + listenForDoNotDisturbChanges() { + if (this.currentUser && !this.currentUser.isInDoNotDisturb()) { + this.queueRerender(); + } else { + cancel(this._listenToDoNotDisturbLoop); + this._listenToDoNotDisturbLoop = later( + this, + () => { + this.listenForDoNotDisturbChanges(); + }, + 10000 + ); + } + }, + didInsertElement() { this._super(...arguments); $(window).on("resize.discourse-menu-panel", () => this.afterRender()); this.appEvents.on("header:show-topic", this, "setTopic"); this.appEvents.on("header:hide-topic", this, "setTopic"); + this.appEvents.on("do-not-disturb:changed", () => this.queueRerender()); + + if (!isTesting()) { + this.listenForDoNotDisturbChanges(); + } this.dispatch("notifications:changed", "user-notifications"); this.dispatch("header:keyboard-trigger", "header"); @@ -250,6 +272,7 @@ const SiteHeaderComponent = MountWidget.extend(Docking, PanEvents, { this.appEvents.off("dom:clean", this, "_cleanDom"); cancel(this._scheduledRemoveAnimate); + cancel(this._listenToDoNotDisturbLoop); window.cancelAnimationFrame(this._scheduledMovingAnimation); document.removeEventListener("click", this._dismissFirstNotification); diff --git a/app/assets/javascripts/discourse/app/controllers/do-not-disturb.js b/app/assets/javascripts/discourse/app/controllers/do-not-disturb.js new file mode 100644 index 0000000000..1bf02bafdd --- /dev/null +++ b/app/assets/javascripts/discourse/app/controllers/do-not-disturb.js @@ -0,0 +1,36 @@ +import Controller from "@ember/controller"; +import ModalFunctionality from "discourse/mixins/modal-functionality"; +import { action } from "@ember/object"; +import discourseComputed from "discourse-common/utils/decorators"; +import { extractError } from "discourse/lib/ajax-error"; + +export default Controller.extend(ModalFunctionality, { + duration: null, + saving: false, + + @discourseComputed("saving", "duration") + saveDisabled(saving, duration) { + return saving || !duration; + }, + + @action + setDuration(duration) { + this.set("duration", duration); + }, + + @action + save() { + this.set("saving", true); + this.currentUser + .enterDoNotDisturbFor(this.duration) + .then(() => { + this.send("closeModal"); + }) + .catch((e) => { + this.flash(extractError(e), "error"); + }) + .finally(() => { + this.set("saving", false); + }); + }, +}); diff --git a/app/assets/javascripts/discourse/app/initializers/subscribe-user-notifications.js b/app/assets/javascripts/discourse/app/initializers/subscribe-user-notifications.js index 4559df7e55..2e93d643ea 100644 --- a/app/assets/javascripts/discourse/app/initializers/subscribe-user-notifications.js +++ b/app/assets/javascripts/discourse/app/initializers/subscribe-user-notifications.js @@ -113,6 +113,10 @@ export default { user.notification_channel_position ); + bus.subscribe(`/do-not-disturb/${user.get("id")}`, (data) => { + user.updateDoNotDisturbStatus(data.ends_at); + }); + const site = container.lookup("site:main"); const siteSettings = container.lookup("site-settings:main"); const router = container.lookup("router:main"); @@ -130,7 +134,7 @@ export default { if (!isTesting()) { bus.subscribe(alertChannel(user), (data) => - onNotification(data, siteSettings) + onNotification(data, siteSettings, user) ); initDesktopNotifications(bus, appEvents); diff --git a/app/assets/javascripts/discourse/app/lib/desktop-notifications.js b/app/assets/javascripts/discourse/app/lib/desktop-notifications.js index 5513b021ee..5e6053b43b 100644 --- a/app/assets/javascripts/discourse/app/lib/desktop-notifications.js +++ b/app/assets/javascripts/discourse/app/lib/desktop-notifications.js @@ -136,7 +136,7 @@ function isIdle() { } // Call-in point from message bus -function onNotification(data, siteSettings) { +function onNotification(data, siteSettings, user) { if (!liveEnabled) { return; } @@ -146,6 +146,9 @@ function onNotification(data, siteSettings) { if (!isIdle()) { return; } + if (user.isInDoNotDisturb()) { + return; + } if (keyValueStore.getItem("notifications-disabled")) { return; } diff --git a/app/assets/javascripts/discourse/app/lib/push-notifications.js b/app/assets/javascripts/discourse/app/lib/push-notifications.js index 4c21b86e3f..b9ed09fe9b 100644 --- a/app/assets/javascripts/discourse/app/lib/push-notifications.js +++ b/app/assets/javascripts/discourse/app/lib/push-notifications.js @@ -75,6 +75,7 @@ export function isPushNotificationsSupported(mobileView) { export function isPushNotificationsEnabled(user, mobileView) { return ( user && + !user.isInDoNotDisturb() && isPushNotificationsSupported(mobileView) && keyValueStore.getItem(userSubscriptionKey(user)) ); diff --git a/app/assets/javascripts/discourse/app/models/user.js b/app/assets/javascripts/discourse/app/models/user.js index 0a1a94e422..8e9a844ebe 100644 --- a/app/assets/javascripts/discourse/app/models/user.js +++ b/app/assets/javascripts/discourse/app/models/user.js @@ -958,6 +958,37 @@ const User = RestModel.extend({ return muted_ids.filter((existing_id) => existing_id !== id); } }, + + enterDoNotDisturbFor(duration) { + return ajax({ + url: "/do-not-disturb.json", + type: "POST", + data: { duration }, + }).then((response) => { + return this.updateDoNotDisturbStatus(response.ends_at); + }); + }, + + leaveDoNotDisturb() { + return ajax({ + url: "/do-not-disturb.json", + type: "DELETE", + }).then(() => { + this.updateDoNotDisturbStatus(null); + }); + }, + + updateDoNotDisturbStatus(ends_at) { + this.set("do_not_disturb_until", ends_at); + this.appEvents.trigger("do-not-disturb:changed", this.do_not_disturb_until); + }, + + isInDoNotDisturb() { + return ( + this.do_not_disturb_until && + new Date(this.do_not_disturb_until) >= new Date() + ); + }, }); User.reopenClass(Singleton, { diff --git a/app/assets/javascripts/discourse/app/templates/components/tap-tile.hbs b/app/assets/javascripts/discourse/app/templates/components/tap-tile.hbs index df17a2fd98..1789711e15 100644 --- a/app/assets/javascripts/discourse/app/templates/components/tap-tile.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/tap-tile.hbs @@ -1,2 +1,4 @@ -{{d-icon icon}} +{{#if icon}} + {{d-icon icon}} +{{/if}} {{ yield }} diff --git a/app/assets/javascripts/discourse/app/templates/modal/bookmark.hbs b/app/assets/javascripts/discourse/app/templates/modal/bookmark.hbs index 14f3bc88c9..ba19e49d42 100644 --- a/app/assets/javascripts/discourse/app/templates/modal/bookmark.hbs +++ b/app/assets/javascripts/discourse/app/templates/modal/bookmark.hbs @@ -38,7 +38,7 @@ {{#if userHasTimezoneSet}} {{#tap-tile-grid activeTile=selectedReminderType as |grid|}} {{#if showLaterToday}} - {{#tap-tile icon="far-moon" tileId=reminderTypes.LATER_TODAY activeTile=grid.activeTile onChange=(action "selectReminderType")}} + {{#tap-tile icon="angle-right" tileId=reminderTypes.LATER_TODAY activeTile=grid.activeTile onChange=(action "selectReminderType")}}
{{i18n "bookmarks.reminders.later_today"}}
{{laterTodayFormatted}}
{{/tap-tile}} diff --git a/app/assets/javascripts/discourse/app/templates/modal/do-not-disturb.hbs b/app/assets/javascripts/discourse/app/templates/modal/do-not-disturb.hbs new file mode 100644 index 0000000000..ab1e378d77 --- /dev/null +++ b/app/assets/javascripts/discourse/app/templates/modal/do-not-disturb.hbs @@ -0,0 +1,24 @@ +{{#d-modal-body title="do_not_disturb.title"}} + {{#tap-tile-grid activeTile=duration as |grid|}} + {{#tap-tile class="do-not-disturb-tile" tileId="30" activeTile=grid.activeTile onChange=(action "setDuration")}} + {{i18n "do_not_disturb.options.half_hour"}} + {{/tap-tile}} + {{#tap-tile class="do-not-disturb-tile" tileId="60" activeTile=grid.activeTile onChange=(action "setDuration")}} + {{i18n "do_not_disturb.options.one_hour"}} + {{/tap-tile}} + {{#tap-tile class="do-not-disturb-tile" tileId="120" activeTile=grid.activeTile onChange=(action "setDuration")}} + {{i18n "do_not_disturb.options.two_hours"}} + {{/tap-tile}} + {{#tap-tile class="do-not-disturb-tile" tileId="tomorrow" activeTile=grid.activeTile onChange=(action "setDuration")}} + {{i18n "do_not_disturb.options.tomorrow"}} + {{/tap-tile}} + {{/tap-tile-grid}} +{{/d-modal-body}} + diff --git a/app/assets/javascripts/discourse/app/widgets/do-not-disturb.js b/app/assets/javascripts/discourse/app/widgets/do-not-disturb.js new file mode 100644 index 0000000000..57b153f549 --- /dev/null +++ b/app/assets/javascripts/discourse/app/widgets/do-not-disturb.js @@ -0,0 +1,54 @@ +import I18n from "I18n"; +import { createWidget } from "discourse/widgets/widget"; +import { h } from "virtual-dom"; +import { iconNode } from "discourse-common/lib/icon-library"; +import showModal from "discourse/lib/show-modal"; + +export default createWidget("do-not-disturb", { + tagName: "div.btn.do-not-disturb-btn", + saving: false, + + html() { + if (this.currentUser.isInDoNotDisturb()) { + let remainingTime = moment() + .to(moment(this.currentUser.do_not_disturb_until)) + .split(" ") + .slice(1) + .join(" "); // The first word is "in" and we don't want that. + return [ + h("div.do-not-disturb-inner-container", [ + h("div.do-not-disturb-background", iconNode("moon")), + + h("span.do-not-disturb-label", [ + h("span", I18n.t("do_not_disturb.label")), + h( + "span.time-remaining", + I18n.t("do_not_disturb.remaining", { remaining: remainingTime }) + ), + ]), + ]), + ]; + } else { + return [ + iconNode("far-moon"), + h("span.do-not-disturb-label", I18n.t("do_not_disturb.label")), + ]; + } + }, + + click() { + if (this.saving) { + return; + } + + this.saving = true; + if (this.currentUser.do_not_disturb_until) { + return this.currentUser.leaveDoNotDisturb().then(() => { + this.saving = false; + }); + } else { + this.saving = false; + return showModal("do-not-disturb"); + } + }, +}); diff --git a/app/assets/javascripts/discourse/app/widgets/header.js b/app/assets/javascripts/discourse/app/widgets/header.js index a76108cb5b..f8747fa552 100644 --- a/app/assets/javascripts/discourse/app/widgets/header.js +++ b/app/assets/javascripts/discourse/app/widgets/header.js @@ -64,66 +64,69 @@ createWidget("header-notifications", { ), ]; - const unreadNotifications = user.get("unread_notifications"); - if (!!unreadNotifications) { - contents.push( - this.attach("link", { - action: attrs.action, - className: "badge-notification unread-notifications", - rawLabel: unreadNotifications, - omitSpan: true, - title: "notifications.tooltip.regular", - titleOptions: { count: unreadNotifications }, - }) - ); - } - - const unreadHighPriority = user.get("unread_high_priority_notifications"); - if (!!unreadHighPriority) { - // highlight the avatar if the first ever PM is not read - if ( - !user.get("read_first_notification") && - !user.get("enforcedSecondFactor") - ) { - if (!attrs.active && attrs.ringBackdrop) { - contents.push(h("span.ring")); - contents.push(h("span.ring-backdrop-spotlight")); - contents.push( - h( - "span.ring-backdrop", - {}, - h("h1.ring-first-notification", {}, [ - h("span", {}, I18n.t("user.first_notification")), - h("span", {}, [ - I18n.t("user.skip_new_user_tips.not_first_time"), - " ", - this.attach("link", { - action: "skipNewUserTips", - className: "skip-new-user-tips", - label: "user.skip_new_user_tips.skip_link", - title: "user.skip_new_user_tips.description", - omitSpan: true, - }), - ]), - ]) - ) - ); - } + if (user.isInDoNotDisturb()) { + contents.push(h("div.do-not-disturb-background", iconNode("moon"))); + } else { + const unreadNotifications = user.get("unread_notifications"); + if (!!unreadNotifications) { + contents.push( + this.attach("link", { + action: attrs.action, + className: "badge-notification unread-notifications", + rawLabel: unreadNotifications, + omitSpan: true, + title: "notifications.tooltip.regular", + titleOptions: { count: unreadNotifications }, + }) + ); } - // add the counter for the unread high priority - contents.push( - this.attach("link", { - action: attrs.action, - className: "badge-notification unread-high-priority-notifications", - rawLabel: unreadHighPriority, - omitSpan: true, - title: "notifications.tooltip.high_priority", - titleOptions: { count: unreadHighPriority }, - }) - ); - } + const unreadHighPriority = user.get("unread_high_priority_notifications"); + if (!!unreadHighPriority) { + // highlight the avatar if the first ever PM is not read + if ( + !user.get("read_first_notification") && + !user.get("enforcedSecondFactor") + ) { + if (!attrs.active && attrs.ringBackdrop) { + contents.push(h("span.ring")); + contents.push(h("span.ring-backdrop-spotlight")); + contents.push( + h( + "span.ring-backdrop", + {}, + h("h1.ring-first-notification", {}, [ + h("span", {}, I18n.t("user.first_notification")), + h("span", {}, [ + I18n.t("user.skip_new_user_tips.not_first_time"), + " ", + this.attach("link", { + action: "skipNewUserTips", + className: "skip-new-user-tips", + label: "user.skip_new_user_tips.skip_link", + title: "user.skip_new_user_tips.description", + omitSpan: true, + }), + ]), + ]) + ) + ); + } + } + // add the counter for the unread high priority + contents.push( + this.attach("link", { + action: attrs.action, + className: "badge-notification unread-high-priority-notifications", + rawLabel: unreadHighPriority, + omitSpan: true, + title: "notifications.tooltip.high_priority", + titleOptions: { count: unreadHighPriority }, + }) + ); + } + } return contents; }, }); diff --git a/app/assets/javascripts/discourse/app/widgets/quick-access-notifications.js b/app/assets/javascripts/discourse/app/widgets/quick-access-notifications.js index 98a1c1b7d3..490fde0402 100644 --- a/app/assets/javascripts/discourse/app/widgets/quick-access-notifications.js +++ b/app/assets/javascripts/discourse/app/widgets/quick-access-notifications.js @@ -5,6 +5,7 @@ import { createWidgetFrom } from "discourse/widgets/widget"; createWidgetFrom(QuickAccessPanel, "quick-access-notifications", { buildKey: () => "quick-access-notifications", emptyStatePlaceholderItemKey: "notifications.empty", + showDoNotDisturb: true, markReadRequest() { return ajax("/notifications/mark-read", { type: "PUT" }); diff --git a/app/assets/javascripts/discourse/app/widgets/quick-access-panel.js b/app/assets/javascripts/discourse/app/widgets/quick-access-panel.js index 18feb59dd1..907615529c 100644 --- a/app/assets/javascripts/discourse/app/widgets/quick-access-panel.js +++ b/app/assets/javascripts/discourse/app/widgets/quick-access-panel.js @@ -95,12 +95,17 @@ export default createWidget("quick-access-panel", { return [h("div.spinner-container", h("div.spinner"))]; } - let bottomItems = []; const items = this.getItems().length ? this.getItems().map((item) => this.itemHtml(item)) : [this.emptyStatePlaceholderItem()]; + let bottomItems = []; + if (!this.hideBottomItems()) { + if (this.showDoNotDisturb) { + bottomItems.push(this.attach("do-not-disturb")); + } + bottomItems.push( // intentionally a link so it can be ctrl clicked this.attach("link", { diff --git a/app/assets/javascripts/discourse/tests/acceptance/do-not-disturb-test.js b/app/assets/javascripts/discourse/tests/acceptance/do-not-disturb-test.js new file mode 100644 index 0000000000..c16a8de9dc --- /dev/null +++ b/app/assets/javascripts/discourse/tests/acceptance/do-not-disturb-test.js @@ -0,0 +1,71 @@ +import { + acceptance, + exists, + queryAll, + updateCurrentUser, +} from "discourse/tests/helpers/qunit-helpers"; +import { click, visit } from "@ember/test-helpers"; +import { test } from "qunit"; + +acceptance("Do not disturb", function (needs) { + needs.user(); + needs.pretender((server, helper) => { + server.post("/do-not-disturb.json", () => { + let now = new Date(); + now.setHours(now.getHours() + 1); + return helper.response({ ends_at: now }); + }); + server.delete("/do-not-disturb.json", () => + helper.response({ success: true }) + ); + }); + + test("when turned off, it is turned on from modal", async function (assert) { + updateCurrentUser({ do_not_disturb_until: null }); + + await visit("/"); + await click(".header-dropdown-toggle.current-user"); + + await click(".do-not-disturb-btn"); + + assert.ok(exists(".do-not-disturb-modal"), "modal to choose time appears"); + + let tiles = queryAll(".do-not-disturb-tile"); + assert.ok(tiles.length === 4, "There are 4 duration choices"); + + await click(tiles[0]); + await click(".modal-footer .btn.btn-primary"); + + assert.ok( + queryAll(".do-not-disturb-modal")[0].style.display === "none", + "modal is hidden" + ); + + assert.ok( + exists(".header-dropdown-toggle .do-not-disturb-background"), + "moon icon is present in header" + ); + }); + + test("when turned on, it can be turned off", async function (assert) { + let now = new Date(); + now.setHours(now.getHours() + 1); + updateCurrentUser({ do_not_disturb_until: now }); + + await visit("/"); + await click(".header-dropdown-toggle.current-user"); + + assert.ok( + queryAll(".do-not-disturb-btn .time-remaining")[0].textContent === + "an hour remaining", + "The remaining time is displayed" + ); + + await click(".do-not-disturb-btn"); + + assert.ok( + queryAll(".do-not-disturb-background").length === 0, + "The active moon icons are removed" + ); + }); +}); diff --git a/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js b/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js index 64a66c7774..a38e25dac4 100644 --- a/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js +++ b/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js @@ -205,6 +205,11 @@ export function acceptance(name, optionsOrCallback) { getApplication().reset(); this.container = getOwner(this); + if (loggedIn) { + updateCurrentUser({ + appEvents: this.container.lookup("service:app-events"), + }); + } setURLContainer(this.container); setDefaultOwner(this.container); diff --git a/app/assets/stylesheets/common/base/discourse.scss b/app/assets/stylesheets/common/base/discourse.scss index 1690bb0312..50e82535db 100644 --- a/app/assets/stylesheets/common/base/discourse.scss +++ b/app/assets/stylesheets/common/base/discourse.scss @@ -416,6 +416,85 @@ table { } } +.d-header .header-dropdown-toggle .do-not-disturb-background { + position: absolute; + left: 2px; + bottom: -1px; + z-index: 1002; +} + +.do-not-disturb-background { + display: flex; + align-items: center; + justify-content: center; + width: 1.25em; + background-color: var(--tertiary-med-or-tertiary); + border-radius: 50%; + height: 1.25em; + + .d-icon.d-icon-moon { + color: var(--tertiary-or-white) !important; + line-height: unset; + font-size: 0.875em; + margin: 0; + } +} + +.do-not-disturb-btn { + display: flex; + flex: 0 0 100%; + flex-wrap: wrap; + align-items: center; + justify-content: center; + margin-bottom: 0.5em; + + .do-not-disturb-inner-container { + display: flex; + align-items: center; + + .do-not-disturb-label { + display: flex; + flex-direction: column; + padding-top: 2px; + margin-left: 0.6em; + } + + .time-remaining { + text-align: left; + font-size: $font-down-3; + margin-top: 0.3em; + color: var(--primary-medium); + } + .do-not-disturb-background { + width: 1.75em; + height: 1.75em; + + .d-icon-far-moon { + margin-right: 0; + } + } + } +} + +.do-not-disturb-modal { + .do-not-disturb-choice { + display: grid; + grid-template-columns: 2em 1fr auto; + grid-template-rows: auto auto; + align-items: center; + cursor: pointer; + padding: 0.5em 0; + + &:hover { + background-color: var(--tertiary-low); + } + + label { + margin-bottom: 0; + } + } +} + .ring-backdrop-spotlight { position: absolute; width: 80px; diff --git a/app/assets/stylesheets/common/base/menu-panel.scss b/app/assets/stylesheets/common/base/menu-panel.scss index 2122876ae9..8126f872fc 100644 --- a/app/assets/stylesheets/common/base/menu-panel.scss +++ b/app/assets/stylesheets/common/base/menu-panel.scss @@ -65,6 +65,8 @@ display: flex; flex: 1 0 0%; // safari height fix margin-top: 0.5em; + flex-wrap: wrap; + .show-all { flex: 1 1 auto; button { @@ -236,7 +238,7 @@ color: var(--primary); } - span.double-user, + span.double-user, // e.g., "username, username2" span.multi-user // e.g., "username, username2, and n others" @@ -247,7 +249,7 @@ white-space: nowrap; } - span.multi-user + span.multi-user // e.g., "username, username2, and n others" { span.multi-username:nth-of-type(2) { diff --git a/app/controllers/do_not_disturb_controller.rb b/app/controllers/do_not_disturb_controller.rb new file mode 100644 index 0000000000..cd22eb033f --- /dev/null +++ b/app/controllers/do_not_disturb_controller.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +class DoNotDisturbController < ApplicationController + requires_login + + def create + raise Discourse::InvalidParameters.new(:duration) if params[:duration].blank? + + duration_minutes = (Integer(params[:duration]) rescue false) + + ends_at = duration_minutes ? + ends_at_from_minutes(duration_minutes) : + ends_at_from_string(params[:duration]) + + new_timing = current_user.do_not_disturb_timings.new(starts_at: Time.zone.now, ends_at: ends_at) + + if new_timing.save + current_user.publish_do_not_disturb(ends_at: ends_at) + render json: { ends_at: ends_at } + else + render_json_error(new_timing) + end + end + + def destroy + current_user.active_do_not_disturb_timings.destroy_all + current_user.publish_do_not_disturb(ends_at: nil) + render json: success_json + end + + private + + def ends_at_from_minutes(duration) + duration.minutes.from_now + end + + def ends_at_from_string(string) + if string == 'tomorrow' + Time.now.end_of_day.utc + else + raise Discourse::InvalidParameters.new(:duration) + end + end +end diff --git a/app/models/do_not_disturb_timing.rb b/app/models/do_not_disturb_timing.rb new file mode 100644 index 0000000000..38119c5a87 --- /dev/null +++ b/app/models/do_not_disturb_timing.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class DoNotDisturbTiming < ActiveRecord::Base + belongs_to :user + + validate :ends_at_greater_thans_starts_at + + def ends_at_greater_thans_starts_at + if starts_at > ends_at + errors.add(:ends_at, :invalid) + end + end +end diff --git a/app/models/notification.rb b/app/models/notification.rb index 8b731c5a48..3fd94b7335 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -282,7 +282,8 @@ class Notification < ActiveRecord::Base end def send_email - NotificationEmailer.process_notification(self) if !skip_send_email + return if skip_send_email || user.do_not_disturb? # TODO: 'shelve' emails rather than skipping them entirely + NotificationEmailer.process_notification(self) end end diff --git a/app/models/user.rb b/app/models/user.rb index dd1be3bb50..279d11a4fb 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -59,6 +59,7 @@ class User < ActiveRecord::Base has_many :group_requests, dependent: :delete_all has_many :muted_user_records, class_name: 'MutedUser', dependent: :delete_all has_many :ignored_user_records, class_name: 'IgnoredUser', dependent: :delete_all + has_many :do_not_disturb_timings, dependent: :delete_all # dependent deleting handled via before_destroy (special cases) has_many :user_actions @@ -635,6 +636,10 @@ class User < ActiveRecord::Base MessageBus.publish("/notification/#{id}", payload, user_ids: [id]) end + def publish_do_not_disturb(ends_at: nil) + MessageBus.publish("/do-not-disturb/#{id}", { ends_at: ends_at }, user_ids: [id]) + end + def password=(password) # special case for passwordless accounts unless password.blank? @@ -1365,6 +1370,15 @@ class User < ActiveRecord::Base UrlHelper.encode_component(lower ? username_lower : username) end + def do_not_disturb? + active_do_not_disturb_timings.exists? + end + + def active_do_not_disturb_timings + now = Time.zone.now + do_not_disturb_timings.where('starts_at <= ? AND ends_at > ?', now, now) + end + protected def badge_grant diff --git a/app/serializers/current_user_serializer.rb b/app/serializers/current_user_serializer.rb index 1eafd22221..4b7c1bcf6f 100644 --- a/app/serializers/current_user_serializer.rb +++ b/app/serializers/current_user_serializer.rb @@ -49,7 +49,8 @@ class CurrentUserSerializer < BasicUserSerializer :title_count_mode, :timezone, :featured_topic, - :skip_new_user_tips + :skip_new_user_tips, + :do_not_disturb_until, def groups object.visible_groups.pluck(:id, :name).map { |id, name| { id: id, name: name } } @@ -237,4 +238,8 @@ class CurrentUserSerializer < BasicUserSerializer def featured_topic object.user_profile.featured_topic end + + def do_not_disturb_until + object.active_do_not_disturb_timings.maximum(:ends_at) + end end diff --git a/app/services/post_alerter.rb b/app/services/post_alerter.rb index 9817abebd1..01d9d18fad 100644 --- a/app/services/post_alerter.rb +++ b/app/services/post_alerter.rb @@ -464,6 +464,8 @@ class PostAlerter end def push_notification(user, payload) + return if user.do_not_disturb? + if user.push_subscriptions.exists? Jobs.enqueue(:send_push_notification, user_id: user.id, payload: payload) end diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index deb85f1313..5d9a663ddf 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -932,7 +932,7 @@ en: perm_denied_expl: "You denied permission for notifications. Allow notifications via your browser settings." disable: "Disable Notifications" enable: "Enable Notifications" - each_browser_note: "Note: You have to change this setting on every browser you use." + each_browser_note: 'Note: You have to change this setting on every browser you use. All notifications will be disabled when in "do not disturb", regardless of this setting.' consent_prompt: "Do you want live notifications when people reply to your posts?" dismiss: "Dismiss" dismiss_notifications: "Dismiss All" @@ -3538,6 +3538,19 @@ en: image_removed: "(image removed)" + do_not_disturb: + title: "Do not disturb for..." + save: "Save" + label: "Do not disturb" + remaining: "%{remaining} remaining" + options: + half_hour: "30 minutes" + one_hour: "1 hour" + two_hours: "2 hours" + tomorrow: "Until tomorrow" + custom: "Custom" + + # This section is exported to the javascript for i18n in the admin section admin_js: type_to_filter: "type to filter..." diff --git a/config/routes.rb b/config/routes.rb index 897c35f6ac..e30b0a7d2c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -960,6 +960,9 @@ Discourse::Application.routes.draw do get "/permalink-check", to: 'permalinks#check' + post "/do-not-disturb" => "do_not_disturb#create" + delete "/do-not-disturb" => "do_not_disturb#destroy" + get "*url", to: 'permalinks#show', constraints: PermalinkConstraint.new end end diff --git a/db/migrate/20201210151635_create_do_not_disturb_timings.rb b/db/migrate/20201210151635_create_do_not_disturb_timings.rb new file mode 100644 index 0000000000..af308bc050 --- /dev/null +++ b/db/migrate/20201210151635_create_do_not_disturb_timings.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +class CreateDoNotDisturbTimings < ActiveRecord::Migration[6.0] + def change + create_table :do_not_disturb_timings do |t| + t.integer :user_id, null: false + t.datetime :starts_at, null: false + t.datetime :ends_at, null: false + end + add_index :do_not_disturb_timings, [:user_id], unique: false + add_index :do_not_disturb_timings, [:starts_at], unique: false + add_index :do_not_disturb_timings, [:ends_at], unique: false + end +end diff --git a/lib/svg_sprite/svg_sprite.rb b/lib/svg_sprite/svg_sprite.rb index 33d15da2cb..1d93f77857 100644 --- a/lib/svg_sprite/svg_sprite.rb +++ b/lib/svg_sprite/svg_sprite.rb @@ -148,6 +148,7 @@ module SvgSprite "minus", "minus-circle", "mobile-alt", + "moon", "paint-brush", "paper-plane", "pencil-alt", diff --git a/spec/fabricators/do_not_disturb_fabricator.rb b/spec/fabricators/do_not_disturb_fabricator.rb new file mode 100644 index 0000000000..3aafa6fa86 --- /dev/null +++ b/spec/fabricators/do_not_disturb_fabricator.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +Fabricator(:do_not_disturb_timing) do + user + starts_at { Time.zone.now } + ends_at { 1.hour.from_now } +end diff --git a/spec/models/do_not_disturb_timing_spec.rb b/spec/models/do_not_disturb_timing_spec.rb new file mode 100644 index 0000000000..306c2c82bd --- /dev/null +++ b/spec/models/do_not_disturb_timing_spec.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe DoNotDisturbTiming do + fab!(:user) { Fabricate(:user) } + + describe "validations" do + it 'is invalid when ends_at is before starts_at' do + freeze_time + timing = DoNotDisturbTiming.new(user: user, starts_at: Time.zone.now, ends_at: 1.hour.ago) + timing.valid? + expect(timing.errors[:ends_at]).to be_present + end + end +end diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb index 1bde8f4e05..e87bff865c 100644 --- a/spec/models/notification_spec.rb +++ b/spec/models/notification_spec.rb @@ -373,6 +373,24 @@ describe Notification do end end + describe "do not disturb" do + it "calls NotificationEmailer.process_notification when user is not in 'do not disturb'" do + user = Fabricate(:user) + notification = Notification.new(read: false, user_id: user.id, topic_id: 2, post_number: 1, data: '{}', notification_type: 1) + NotificationEmailer.expects(:process_notification).with(notification) + notification.save! + end + + it "doesn't call NotificationEmailer.process_notification when user is in 'do not disturb'" do + freeze_time + user = Fabricate(:user) + Fabricate(:do_not_disturb_timing, user: user, starts_at: Time.zone.now, ends_at: 1.day.from_now) + + notification = Notification.new(read: false, user_id: user.id, topic_id: 2, post_number: 1, data: '{}', notification_type: 1) + NotificationEmailer.expects(:process_notification).with(notification).never + notification.save! + end + end end # pulling this out cause I don't want an observer diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 3e69f08afa..3a7a609765 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -2481,4 +2481,16 @@ describe User do end end end + + describe "#do_not_disturb?" do + it "is true when a dnd timing is present for the current time" do + Fabricate(:do_not_disturb_timing, user: user, starts_at: Time.zone.now, ends_at: 1.day.from_now) + expect(user.do_not_disturb?).to eq(true) + end + + it "is false when no dnd timing is present for the current time" do + Fabricate(:do_not_disturb_timing, user: user, starts_at: Time.zone.now - 2.day, ends_at: 1.minute.ago) + expect(user.do_not_disturb?).to eq(false) + end + end end diff --git a/spec/requests/do_not_disturb_controller_spec.rb b/spec/requests/do_not_disturb_controller_spec.rb new file mode 100644 index 0000000000..9893daafb0 --- /dev/null +++ b/spec/requests/do_not_disturb_controller_spec.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe DoNotDisturbController do + it 'requires you to be logged in' do + post "/do-not-disturb.json", params: { duration: 30 } + expect(response.status).to eq(403) + end + + describe 'logged in' do + fab!(:user) { Fabricate(:user) } + + before do + sign_in(user) + end + + it 'returns a 400 when a duration is not passed in' do + post "/do-not-disturb.json" + expect(response.status).to eq(400) + end + + it 'works properly with integer minute durations' do + freeze_time + post "/do-not-disturb.json", params: { duration: 30 } + + expect(response.status).to eq(200) + expect(user.do_not_disturb_timings.last.ends_at).to eq_time(30.minutes.from_now) + end + + it 'works properly with integer minute durations' do + post "/do-not-disturb.json", params: { duration: -30 } + expect(response.status).to eq(422) + expect(response.parsed_body).to eq({ "errors" => ["Ends at is invalid"] }) + end + + include ActiveSupport::Testing::TimeHelpers + it "works properly with duration of 'tomorrow'" do + travel_to Time.new(2020, 11, 24, 01, 04, 44) do + post "/do-not-disturb.json", params: { duration: 'tomorrow' } + expect(response.status).to eq(200) + expect(user.do_not_disturb_timings.last.ends_at.to_i).to eq(Time.new(2020, 11, 24, 23, 59, 59).utc.to_i) + end + end + end +end diff --git a/spec/services/post_alerter_spec.rb b/spec/services/post_alerter_spec.rb index 0b8ab126d9..ebed546c44 100644 --- a/spec/services/post_alerter_spec.rb +++ b/spec/services/post_alerter_spec.rb @@ -731,6 +731,21 @@ describe PostAlerter do expect { mention_post }.to_not change { Jobs::PushNotification.jobs.count } end + it "pushes nothing when the user is in 'do not disturb'" do + SiteSetting.allowed_user_api_push_urls = "https://site.com/push|https://site2.com/push" + 2.times do |i| + UserApiKey.create!(user_id: evil_trout.id, + client_id: "xxx#{i}", + application_name: "iPhone#{i}", + scopes: ['notifications'].map { |name| UserApiKeyScope.new(name: name) }, + push_url: "https://site2.com/push") + end + + Fabricate(:do_not_disturb_timing, user: evil_trout, starts_at: Time.zone.now, ends_at: 1.day.from_now) + + expect { mention_post }.to_not change { Jobs::PushNotification.jobs.count } + end + it "correctly pushes notifications if configured correctly" do Jobs.run_immediately! SiteSetting.allowed_user_api_push_urls = "https://site.com/push|https://site2.com/push" From d8e2b497f78e2a054406775b4bcde3bcfab8bad1 Mon Sep 17 00:00:00 2001 From: Mark VanLandingham Date: Fri, 18 Dec 2020 10:35:43 -0600 Subject: [PATCH 153/393] DEV: Move rerender on 'do not disturb' change to mixin (#11529) --- .../discourse/app/components/site-header.js | 703 +++++++++--------- .../rerender-on-do-not-disturb-change.js | 36 + 2 files changed, 379 insertions(+), 360 deletions(-) create mode 100644 app/assets/javascripts/discourse/app/mixins/rerender-on-do-not-disturb-change.js diff --git a/app/assets/javascripts/discourse/app/components/site-header.js b/app/assets/javascripts/discourse/app/components/site-header.js index 0a6b8aa4f0..d66f49fca0 100644 --- a/app/assets/javascripts/discourse/app/components/site-header.js +++ b/app/assets/javascripts/discourse/app/components/site-header.js @@ -6,404 +6,387 @@ import PanEvents, { import { cancel, later, schedule } from "@ember/runloop"; import Docking from "discourse/mixins/docking"; import MountWidget from "discourse/components/mount-widget"; -import { isTesting } from "discourse-common/config/environment"; +import RerenderOnDoNotDisturbChange from "discourse/mixins/rerender-on-do-not-disturb-change"; import { observes } from "discourse-common/utils/decorators"; import { topicTitleDecorators } from "discourse/components/topic-title"; -const SiteHeaderComponent = MountWidget.extend(Docking, PanEvents, { - widget: "header", - docAt: null, - dockedHeader: null, - _listenToDoNotDisturbLoop: null, - _animate: false, - _isPanning: false, - _panMenuOrigin: "right", - _panMenuOffset: 0, - _scheduledMovingAnimation: null, - _scheduledRemoveAnimate: null, - _topic: null, +const SiteHeaderComponent = MountWidget.extend( + Docking, + PanEvents, + RerenderOnDoNotDisturbChange, + { + widget: "header", + docAt: null, + dockedHeader: null, + _animate: false, + _isPanning: false, + _panMenuOrigin: "right", + _panMenuOffset: 0, + _scheduledMovingAnimation: null, + _scheduledRemoveAnimate: null, + _topic: null, - @observes( - "currentUser.unread_notifications", - "currentUser.unread_high_priority_notifications", - "currentUser.reviewable_count" - ) - notificationsChanged() { - this.queueRerender(); - }, - - _animateOpening($panel) { - $panel.css({ right: "", left: "" }); - this._panMenuOffset = 0; - }, - - _animateClosing($panel, menuOrigin, windowWidth) { - $panel.css(menuOrigin, -windowWidth); - this._animate = true; - schedule("afterRender", () => { - this.eventDispatched("dom:clean", "header"); - this._panMenuOffset = 0; - }); - }, - - _isRTL() { - return $("html").css("direction") === "rtl"; - }, - - _leftMenuClass() { - return this._isRTL() ? ".user-menu" : ".hamburger-panel"; - }, - - _leftMenuAction() { - return this._isRTL() ? "toggleUserMenu" : "toggleHamburger"; - }, - - _rightMenuAction() { - return this._isRTL() ? "toggleHamburger" : "toggleUserMenu"; - }, - - _handlePanDone(offset, event) { - const $window = $(window); - const windowWidth = $window.width(); - const $menuPanels = $(".menu-panel"); - const menuOrigin = this._panMenuOrigin; - this._shouldMenuClose(event, menuOrigin) - ? (offset += SWIPE_VELOCITY) - : (offset -= SWIPE_VELOCITY); - $menuPanels.each((idx, panel) => { - const $panel = $(panel); - const $headerCloak = $(".header-cloak"); - $panel.css(menuOrigin, -offset); - $headerCloak.css("opacity", Math.min(0.5, (300 - offset) / 600)); - if (offset > windowWidth) { - this._animateClosing($panel, menuOrigin, windowWidth); - } else if (offset <= 0) { - this._animateOpening($panel); - } else { - //continue to open or close menu - this._scheduledMovingAnimation = window.requestAnimationFrame(() => - this._handlePanDone(offset, event) - ); - } - }); - }, - - _shouldMenuClose(e, menuOrigin) { - // menu should close after a pan either: - // if a user moved the panel closed past a threshold and away and is NOT swiping back open - // if a user swiped to close fast enough regardless of distance - if (menuOrigin === "right") { - return ( - (e.deltaX > SWIPE_DISTANCE_THRESHOLD && - e.velocityX > -SWIPE_VELOCITY_THRESHOLD) || - e.velocityX > 0 - ); - } else { - return ( - (e.deltaX < -SWIPE_DISTANCE_THRESHOLD && - e.velocityX < SWIPE_VELOCITY_THRESHOLD) || - e.velocityX < 0 - ); - } - }, - - panStart(e) { - const center = e.center; - const $centeredElement = $(document.elementFromPoint(center.x, center.y)); - if ( - ($centeredElement.hasClass("panel-body") || - $centeredElement.hasClass("header-cloak") || - $centeredElement.parents(".panel-body").length) && - (e.direction === "left" || e.direction === "right") - ) { - e.originalEvent.preventDefault(); - this._isPanning = true; - } else { - this._isPanning = false; - } - }, - - panEnd(e) { - if (!this._isPanning) { - return; - } - this._isPanning = false; - $(".menu-panel").each((idx, panel) => { - const $panel = $(panel); - let offset = $panel.css("right"); - if (this._panMenuOrigin === "left") { - offset = $panel.css("left"); - } - offset = Math.abs(parseInt(offset, 10)); - this._handlePanDone(offset, e); - }); - }, - - panMove(e) { - if (!this._isPanning) { - return; - } - const $menuPanels = $(".menu-panel"); - $menuPanels.each((idx, panel) => { - const $panel = $(panel); - const $headerCloak = $(".header-cloak"); - if (this._panMenuOrigin === "right") { - const pxClosed = Math.min(0, -e.deltaX + this._panMenuOffset); - $panel.css("right", pxClosed); - $headerCloak.css("opacity", Math.min(0.5, (300 + pxClosed) / 600)); - } else { - const pxClosed = Math.min(0, e.deltaX + this._panMenuOffset); - $panel.css("left", pxClosed); - $headerCloak.css("opacity", Math.min(0.5, (300 + pxClosed) / 600)); - } - }); - }, - - dockCheck(info) { - const $header = $("header.d-header"); - - if (this.docAt === null) { - if (!($header && $header.length === 1)) { - return; - } - this.docAt = $header.offset().top; - } - - const $body = $("body"); - const offset = info.offset(); - if (offset >= this.docAt) { - if (!this.dockedHeader) { - $body.addClass("docked"); - this.dockedHeader = true; - } - } else { - if (this.dockedHeader) { - $body.removeClass("docked"); - this.dockedHeader = false; - } - } - }, - - setTopic(topic) { - this.eventDispatched("dom:clean", "header"); - this._topic = topic; - this.queueRerender(); - }, - - willRender() { - if (this.get("currentUser.staff")) { - $("body").addClass("staff"); - } - }, - - listenForDoNotDisturbChanges() { - if (this.currentUser && !this.currentUser.isInDoNotDisturb()) { + @observes( + "currentUser.unread_notifications", + "currentUser.unread_high_priority_notifications", + "currentUser.reviewable_count" + ) + notificationsChanged() { this.queueRerender(); - } else { - cancel(this._listenToDoNotDisturbLoop); - this._listenToDoNotDisturbLoop = later( - this, - () => { - this.listenForDoNotDisturbChanges(); - }, - 10000 - ); - } - }, + }, - didInsertElement() { - this._super(...arguments); - $(window).on("resize.discourse-menu-panel", () => this.afterRender()); + _animateOpening($panel) { + $panel.css({ right: "", left: "" }); + this._panMenuOffset = 0; + }, - this.appEvents.on("header:show-topic", this, "setTopic"); - this.appEvents.on("header:hide-topic", this, "setTopic"); - this.appEvents.on("do-not-disturb:changed", () => this.queueRerender()); + _animateClosing($panel, menuOrigin, windowWidth) { + $panel.css(menuOrigin, -windowWidth); + this._animate = true; + schedule("afterRender", () => { + this.eventDispatched("dom:clean", "header"); + this._panMenuOffset = 0; + }); + }, - if (!isTesting()) { - this.listenForDoNotDisturbChanges(); - } + _isRTL() { + return $("html").css("direction") === "rtl"; + }, - this.dispatch("notifications:changed", "user-notifications"); - this.dispatch("header:keyboard-trigger", "header"); - this.dispatch("search-autocomplete:after-complete", "search-term"); + _leftMenuClass() { + return this._isRTL() ? ".user-menu" : ".hamburger-panel"; + }, - this.appEvents.on("dom:clean", this, "_cleanDom"); + _leftMenuAction() { + return this._isRTL() ? "toggleUserMenu" : "toggleHamburger"; + }, - // Allow first notification to be dismissed on a click anywhere - if ( - this.currentUser && - !this.get("currentUser.read_first_notification") && - !this.get("currentUser.enforcedSecondFactor") - ) { - this._dismissFirstNotification = (e) => { - if ( - !e.target.closest("#current-user") && - !e.target.closest(".ring-backdrop") && - this.currentUser && - !this.get("currentUser.read_first_notification") && - !this.get("currentUser.enforcedSecondFactor") - ) { - this.eventDispatched( - "header:dismiss-first-notification-mask", - "header" + _rightMenuAction() { + return this._isRTL() ? "toggleHamburger" : "toggleUserMenu"; + }, + + _handlePanDone(offset, event) { + const $window = $(window); + const windowWidth = $window.width(); + const $menuPanels = $(".menu-panel"); + const menuOrigin = this._panMenuOrigin; + this._shouldMenuClose(event, menuOrigin) + ? (offset += SWIPE_VELOCITY) + : (offset -= SWIPE_VELOCITY); + $menuPanels.each((idx, panel) => { + const $panel = $(panel); + const $headerCloak = $(".header-cloak"); + $panel.css(menuOrigin, -offset); + $headerCloak.css("opacity", Math.min(0.5, (300 - offset) / 600)); + if (offset > windowWidth) { + this._animateClosing($panel, menuOrigin, windowWidth); + } else if (offset <= 0) { + this._animateOpening($panel); + } else { + //continue to open or close menu + this._scheduledMovingAnimation = window.requestAnimationFrame(() => + this._handlePanDone(offset, event) ); } - }; - document.addEventListener("click", this._dismissFirstNotification, { - once: true, }); - } - }, + }, - _cleanDom() { - // For performance, only trigger a re-render if any menu panels are visible - if (this.element.querySelector(".menu-panel")) { - this.eventDispatched("dom:clean", "header"); - } - }, - - willDestroyElement() { - this._super(...arguments); - $("body").off("keydown.header"); - $(window).off("resize.discourse-menu-panel"); - - this.appEvents.off("header:show-topic", this, "setTopic"); - this.appEvents.off("header:hide-topic", this, "setTopic"); - this.appEvents.off("dom:clean", this, "_cleanDom"); - - cancel(this._scheduledRemoveAnimate); - cancel(this._listenToDoNotDisturbLoop); - window.cancelAnimationFrame(this._scheduledMovingAnimation); - - document.removeEventListener("click", this._dismissFirstNotification); - }, - - buildArgs() { - return { - topic: this._topic, - canSignUp: this.canSignUp, - }; - }, - - afterRender() { - const headerTitle = document.querySelector(".header-title .topic-link"); - if (headerTitle && this._topic) { - topicTitleDecorators.forEach((cb) => - cb(this._topic, headerTitle, "header-title") - ); - } - - const $menuPanels = $(".menu-panel"); - if ($menuPanels.length === 0) { - if (this.site.mobileView) { - this._animate = true; + _shouldMenuClose(e, menuOrigin) { + // menu should close after a pan either: + // if a user moved the panel closed past a threshold and away and is NOT swiping back open + // if a user swiped to close fast enough regardless of distance + if (menuOrigin === "right") { + return ( + (e.deltaX > SWIPE_DISTANCE_THRESHOLD && + e.velocityX > -SWIPE_VELOCITY_THRESHOLD) || + e.velocityX > 0 + ); + } else { + return ( + (e.deltaX < -SWIPE_DISTANCE_THRESHOLD && + e.velocityX < SWIPE_VELOCITY_THRESHOLD) || + e.velocityX < 0 + ); } - return; - } + }, - const $window = $(window); - const windowWidth = $window.width(); - - const headerWidth = $("#main-outlet .container").width() || 1100; - const remaining = (windowWidth - headerWidth) / 2; - const viewMode = remaining < 50 ? "slide-in" : "drop-down"; - - $menuPanels.each((idx, panel) => { - const $panel = $(panel); - const $headerCloak = $(".header-cloak"); - let width = parseInt($panel.attr("data-max-width"), 10) || 300; - if (windowWidth - width < 50) { - width = windowWidth - 50; - } - if (this._panMenuOffset) { - this._panMenuOffset = -width; + panStart(e) { + const center = e.center; + const $centeredElement = $(document.elementFromPoint(center.x, center.y)); + if ( + ($centeredElement.hasClass("panel-body") || + $centeredElement.hasClass("header-cloak") || + $centeredElement.parents(".panel-body").length) && + (e.direction === "left" || e.direction === "right") + ) { + e.originalEvent.preventDefault(); + this._isPanning = true; + } else { + this._isPanning = false; } + }, - $panel.removeClass("drop-down slide-in").addClass(viewMode); - if (this._animate || this._panMenuOffset !== 0) { - $headerCloak.css("opacity", 0); - if ( - this.site.mobileView && - $panel.parent(this._leftMenuClass()).length > 0 - ) { - this._panMenuOrigin = "left"; - $panel.css("left", -windowWidth); - } else { - this._panMenuOrigin = "right"; - $panel.css("right", -windowWidth); + panEnd(e) { + if (!this._isPanning) { + return; + } + this._isPanning = false; + $(".menu-panel").each((idx, panel) => { + const $panel = $(panel); + let offset = $panel.css("right"); + if (this._panMenuOrigin === "left") { + offset = $panel.css("left"); } + offset = Math.abs(parseInt(offset, 10)); + this._handlePanDone(offset, e); + }); + }, + + panMove(e) { + if (!this._isPanning) { + return; } + const $menuPanels = $(".menu-panel"); + $menuPanels.each((idx, panel) => { + const $panel = $(panel); + const $headerCloak = $(".header-cloak"); + if (this._panMenuOrigin === "right") { + const pxClosed = Math.min(0, -e.deltaX + this._panMenuOffset); + $panel.css("right", pxClosed); + $headerCloak.css("opacity", Math.min(0.5, (300 + pxClosed) / 600)); + } else { + const pxClosed = Math.min(0, e.deltaX + this._panMenuOffset); + $panel.css("left", pxClosed); + $headerCloak.css("opacity", Math.min(0.5, (300 + pxClosed) / 600)); + } + }); + }, - const $panelBody = $(".panel-body", $panel); + dockCheck(info) { + const $header = $("header.d-header"); - // We use a mutationObserver to check for style changes, so it's important - // we don't set it if it doesn't change. Same goes for the $panelBody! - const style = $panel.prop("style"); - - if (viewMode === "drop-down") { - const $buttonPanel = $("header ul.icons"); - if ($buttonPanel.length === 0) { + if (this.docAt === null) { + if (!($header && $header.length === 1)) { return; } + this.docAt = $header.offset().top; + } - // These values need to be set here, not in the css file - this is to deal with the - // possibility of the window being resized and the menu changing from .slide-in to .drop-down. - if (style.top !== "100%" || style.height !== "auto") { - $panel.css({ top: "100%", height: "auto" }); + const $body = $("body"); + const offset = info.offset(); + if (offset >= this.docAt) { + if (!this.dockedHeader) { + $body.addClass("docked"); + this.dockedHeader = true; } - - $("body").addClass("drop-down-mode"); } else { - if (this.site.mobileView) { - $headerCloak.show(); + if (this.dockedHeader) { + $body.removeClass("docked"); + this.dockedHeader = false; } + } + }, - const menuTop = this.site.mobileView ? headerTop() : headerHeight(); + setTopic(topic) { + this.eventDispatched("dom:clean", "header"); + this._topic = topic; + this.queueRerender(); + }, - const winHeightOffset = 16; - let initialWinHeight = window.innerHeight - ? window.innerHeight - : $(window).height(); - const winHeight = initialWinHeight - winHeightOffset; + willRender() { + if (this.get("currentUser.staff")) { + $("body").addClass("staff"); + } + }, - let height; - if (this.site.mobileView) { - height = winHeight - menuTop; - } + didInsertElement() { + this._super(...arguments); + $(window).on("resize.discourse-menu-panel", () => this.afterRender()); - const isIPadApp = document.body.classList.contains("footer-nav-ipad"), - heightProp = isIPadApp ? "max-height" : "height", - iPadOffset = 10; + this.appEvents.on("header:show-topic", this, "setTopic"); + this.appEvents.on("header:hide-topic", this, "setTopic"); - if (isIPadApp) { - height = winHeight - menuTop - iPadOffset; - } + this.dispatch("notifications:changed", "user-notifications"); + this.dispatch("header:keyboard-trigger", "header"); + this.dispatch("search-autocomplete:after-complete", "search-term"); - if ($panelBody.prop("style").height !== "100%") { - $panelBody.height("100%"); - } - if (style.top !== menuTop + "px" || style[heightProp] !== height) { - $panel.css({ top: menuTop + "px", [heightProp]: height }); - $(".header-cloak").css({ top: menuTop + "px" }); - } - $("body").removeClass("drop-down-mode"); + this.appEvents.on("dom:clean", this, "_cleanDom"); + + // Allow first notification to be dismissed on a click anywhere + if ( + this.currentUser && + !this.get("currentUser.read_first_notification") && + !this.get("currentUser.enforcedSecondFactor") + ) { + this._dismissFirstNotification = (e) => { + if ( + !e.target.closest("#current-user") && + !e.target.closest(".ring-backdrop") && + this.currentUser && + !this.get("currentUser.read_first_notification") && + !this.get("currentUser.enforcedSecondFactor") + ) { + this.eventDispatched( + "header:dismiss-first-notification-mask", + "header" + ); + } + }; + document.addEventListener("click", this._dismissFirstNotification, { + once: true, + }); + } + }, + + _cleanDom() { + // For performance, only trigger a re-render if any menu panels are visible + if (this.element.querySelector(".menu-panel")) { + this.eventDispatched("dom:clean", "header"); + } + }, + + willDestroyElement() { + this._super(...arguments); + $("body").off("keydown.header"); + $(window).off("resize.discourse-menu-panel"); + + this.appEvents.off("header:show-topic", this, "setTopic"); + this.appEvents.off("header:hide-topic", this, "setTopic"); + this.appEvents.off("dom:clean", this, "_cleanDom"); + + cancel(this._scheduledRemoveAnimate); + window.cancelAnimationFrame(this._scheduledMovingAnimation); + + document.removeEventListener("click", this._dismissFirstNotification); + }, + + buildArgs() { + return { + topic: this._topic, + canSignUp: this.canSignUp, + }; + }, + + afterRender() { + const headerTitle = document.querySelector(".header-title .topic-link"); + if (headerTitle && this._topic) { + topicTitleDecorators.forEach((cb) => + cb(this._topic, headerTitle, "header-title") + ); } - $panel.width(width); - if (this._animate) { - $panel.addClass("animate"); - $headerCloak.addClass("animate"); - this._scheduledRemoveAnimate = later(() => { - $panel.removeClass("animate"); - $headerCloak.removeClass("animate"); - }, 200); + const $menuPanels = $(".menu-panel"); + if ($menuPanels.length === 0) { + if (this.site.mobileView) { + this._animate = true; + } + return; } - $panel.css({ right: "", left: "" }); - $headerCloak.css("opacity", 0.5); - this._animate = false; - }); - }, -}); + + const $window = $(window); + const windowWidth = $window.width(); + + const headerWidth = $("#main-outlet .container").width() || 1100; + const remaining = (windowWidth - headerWidth) / 2; + const viewMode = remaining < 50 ? "slide-in" : "drop-down"; + + $menuPanels.each((idx, panel) => { + const $panel = $(panel); + const $headerCloak = $(".header-cloak"); + let width = parseInt($panel.attr("data-max-width"), 10) || 300; + if (windowWidth - width < 50) { + width = windowWidth - 50; + } + if (this._panMenuOffset) { + this._panMenuOffset = -width; + } + + $panel.removeClass("drop-down slide-in").addClass(viewMode); + if (this._animate || this._panMenuOffset !== 0) { + $headerCloak.css("opacity", 0); + if ( + this.site.mobileView && + $panel.parent(this._leftMenuClass()).length > 0 + ) { + this._panMenuOrigin = "left"; + $panel.css("left", -windowWidth); + } else { + this._panMenuOrigin = "right"; + $panel.css("right", -windowWidth); + } + } + + const $panelBody = $(".panel-body", $panel); + + // We use a mutationObserver to check for style changes, so it's important + // we don't set it if it doesn't change. Same goes for the $panelBody! + const style = $panel.prop("style"); + + if (viewMode === "drop-down") { + const $buttonPanel = $("header ul.icons"); + if ($buttonPanel.length === 0) { + return; + } + + // These values need to be set here, not in the css file - this is to deal with the + // possibility of the window being resized and the menu changing from .slide-in to .drop-down. + if (style.top !== "100%" || style.height !== "auto") { + $panel.css({ top: "100%", height: "auto" }); + } + + $("body").addClass("drop-down-mode"); + } else { + if (this.site.mobileView) { + $headerCloak.show(); + } + + const menuTop = this.site.mobileView ? headerTop() : headerHeight(); + + const winHeightOffset = 16; + let initialWinHeight = window.innerHeight + ? window.innerHeight + : $(window).height(); + const winHeight = initialWinHeight - winHeightOffset; + + let height; + if (this.site.mobileView) { + height = winHeight - menuTop; + } + + const isIPadApp = document.body.classList.contains("footer-nav-ipad"), + heightProp = isIPadApp ? "max-height" : "height", + iPadOffset = 10; + + if (isIPadApp) { + height = winHeight - menuTop - iPadOffset; + } + + if ($panelBody.prop("style").height !== "100%") { + $panelBody.height("100%"); + } + if (style.top !== menuTop + "px" || style[heightProp] !== height) { + $panel.css({ top: menuTop + "px", [heightProp]: height }); + $(".header-cloak").css({ top: menuTop + "px" }); + } + $("body").removeClass("drop-down-mode"); + } + + $panel.width(width); + if (this._animate) { + $panel.addClass("animate"); + $headerCloak.addClass("animate"); + this._scheduledRemoveAnimate = later(() => { + $panel.removeClass("animate"); + $headerCloak.removeClass("animate"); + }, 200); + } + $panel.css({ right: "", left: "" }); + $headerCloak.css("opacity", 0.5); + this._animate = false; + }); + }, + } +); export default SiteHeaderComponent.extend({ classNames: ["d-header-wrap"], diff --git a/app/assets/javascripts/discourse/app/mixins/rerender-on-do-not-disturb-change.js b/app/assets/javascripts/discourse/app/mixins/rerender-on-do-not-disturb-change.js new file mode 100644 index 0000000000..dd73d650f1 --- /dev/null +++ b/app/assets/javascripts/discourse/app/mixins/rerender-on-do-not-disturb-change.js @@ -0,0 +1,36 @@ +import { cancel, later } from "@ember/runloop"; +import Mixin from "@ember/object/mixin"; +import { isTesting } from "discourse-common/config/environment"; + +export default Mixin.create({ + _listenToDoNotDisturbLoop: null, + + listenForDoNotDisturbChanges() { + if (this.currentUser && !this.currentUser.isInDoNotDisturb()) { + this.queueRerender(); + } else { + cancel(this._listenToDoNotDisturbLoop); + this._listenToDoNotDisturbLoop = later( + this, + () => { + this.listenForDoNotDisturbChanges(); + }, + 10000 + ); + } + }, + + didInsertElement() { + this._super(...arguments); + + this.appEvents.on("do-not-disturb:changed", () => this.queueRerender()); + if (!isTesting()) { + this.listenForDoNotDisturbChanges(); + } + }, + + willDestroyElement() { + this._super(...arguments); + cancel(this._listenToDoNotDisturbLoop); + }, +}); From aff68f47d9d94edcb6a89d1c31647afbe47aec90 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Dec 2020 10:37:31 +1100 Subject: [PATCH 154/393] DEV: Bump ffi from 1.13.1 to 1.14.1 (#11539) Bumps [ffi](https://github.com/ffi/ffi) from 1.13.1 to 1.14.1. - [Release notes](https://github.com/ffi/ffi/releases) - [Changelog](https://github.com/ffi/ffi/blob/master/CHANGELOG.md) - [Commits](https://github.com/ffi/ffi/compare/1.13.1...1.14.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> This brings us 1 step closer to working on the new ARM Macs natively. --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6d9ffe6355..914fd9448d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -132,7 +132,7 @@ GEM fast_blank (1.0.0) fast_xs (0.8.0) fastimage (2.2.0) - ffi (1.13.1) + ffi (1.14.1) flamegraph (0.9.5) fspath (3.1.2) gc_tracer (1.5.1) From bd414008fcb1b3dc0ceb96290744c93d30543fc8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Dec 2020 10:38:22 +1100 Subject: [PATCH 155/393] DEV: Bump webmock from 3.10.0 to 3.11.0 (#11538) Bumps [webmock](https://github.com/bblimke/webmock) from 3.10.0 to 3.11.0. - [Release notes](https://github.com/bblimke/webmock/releases) - [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md) - [Commits](https://github.com/bblimke/webmock/compare/v3.10.0...v3.11.0) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 914fd9448d..6276331a53 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -419,7 +419,7 @@ GEM kgio (~> 2.6) raindrops (~> 0.7) uniform_notifier (1.13.0) - webmock (3.10.0) + webmock (3.11.0) addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) From 84dbe7a5c521d9002c8c6747984c37d2f135aa00 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 20 Dec 2020 21:02:50 +0000 Subject: [PATCH 156/393] Build(deps): Bump rubocop-rspec from 2.0.1 to 2.1.0 Bumps [rubocop-rspec](https://github.com/rubocop-hq/rubocop-rspec) from 2.0.1 to 2.1.0. - [Release notes](https://github.com/rubocop-hq/rubocop-rspec/releases) - [Changelog](https://github.com/rubocop-hq/rubocop-rspec/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop-hq/rubocop-rspec/compare/v2.0.1...v2.1.0) Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6276331a53..7dcebe80f8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -356,7 +356,7 @@ GEM rubocop-discourse (2.4.1) rubocop (>= 1.1.0) rubocop-rspec (>= 2.0.0) - rubocop-rspec (2.0.1) + rubocop-rspec (2.1.0) rubocop (~> 1.0) rubocop-ast (>= 1.1.0) ruby-prof (1.4.2) From 9dad7588db5587c6905d6bd4bd7d165a28bd0ef3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 20 Dec 2020 21:01:05 +0000 Subject: [PATCH 157/393] Build(deps): Bump docile from 1.3.2 to 1.3.3 Bumps [docile](https://github.com/ms-ati/docile) from 1.3.2 to 1.3.3. - [Release notes](https://github.com/ms-ati/docile/releases) - [Changelog](https://github.com/ms-ati/docile/blob/master/HISTORY.md) - [Commits](https://github.com/ms-ati/docile/compare/v1.3.2...v1.3.3) Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 7dcebe80f8..2f2da31b93 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -112,7 +112,7 @@ GEM image_size (~> 1.5) in_threads (~> 1.3) progress (~> 3.0, >= 3.0.1) - docile (1.3.2) + docile (1.3.3) email_reply_trimmer (0.1.13) ember-data-source (3.0.2) ember-source (>= 2, < 3.0) From 504b1562d5bb308259a4cabf6e7aa3ae3097d694 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 20 Dec 2020 21:01:15 +0000 Subject: [PATCH 158/393] Build(deps): Bump rake from 13.0.1 to 13.0.2 Bumps [rake](https://github.com/ruby/rake) from 13.0.1 to 13.0.2. - [Release notes](https://github.com/ruby/rake/releases) - [Changelog](https://github.com/ruby/rake/blob/master/History.rdoc) - [Commits](https://github.com/ruby/rake/compare/v13.0.1...v13.0.2) Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2f2da31b93..401a500ac2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -291,7 +291,7 @@ GEM thor (>= 0.20.3, < 2.0) rainbow (3.0.0) raindrops (0.19.1) - rake (13.0.1) + rake (13.0.2) rb-fsevent (0.10.4) rb-inotify (0.10.1) ffi (~> 1.0) From d2a04621862aa7f7fc283112d542648e9f3fcab8 Mon Sep 17 00:00:00 2001 From: Alan Guo Xiang Tan Date: Fri, 18 Dec 2020 09:36:59 +0800 Subject: [PATCH 159/393] FIX: Re-run remove flag and queued post web hook migrations. There have been production instances where the migrations has run but the records that were meant to be deleted have not been deleted. The root cause is unknown but the migration is safe and simple to re-run. The problem is not reproducible locally so we're not spending too much time on digging up the root. Time vs business cost tradeoff. Follow-up fb15da43da1a4f8f733812dc4af455f27e756418 --- ...g_web_hooks.rb => 20201218000000_remove_flag_web_hooks.rb} | 4 ++-- ...ooks.rb => 20201218000001_remove_queued_post_web_hooks.rb} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename db/migrate/{20200514075356_remove_flag_web_hooks.rb => 20201218000000_remove_flag_web_hooks.rb} (91%) rename db/migrate/{20200514075407_remove_queued_post_web_hooks.rb => 20201218000001_remove_queued_post_web_hooks.rb} (91%) diff --git a/db/migrate/20200514075356_remove_flag_web_hooks.rb b/db/migrate/20201218000000_remove_flag_web_hooks.rb similarity index 91% rename from db/migrate/20200514075356_remove_flag_web_hooks.rb rename to db/migrate/20201218000000_remove_flag_web_hooks.rb index 448b7fb771..82cfe095ad 100644 --- a/db/migrate/20200514075356_remove_flag_web_hooks.rb +++ b/db/migrate/20201218000000_remove_flag_web_hooks.rb @@ -4,12 +4,12 @@ class RemoveFlagWebHooks < ActiveRecord::Migration[6.0] def up flag_event_type_id = 7 - DB.exec <<~SQL + execute <<~SQL DELETE FROM web_hook_event_types_hooks WHERE web_hook_event_type_id = #{flag_event_type_id} SQL - DB.exec <<~SQL + execute <<~SQL DELETE FROM web_hook_event_types WHERE id = #{flag_event_type_id} SQL diff --git a/db/migrate/20200514075407_remove_queued_post_web_hooks.rb b/db/migrate/20201218000001_remove_queued_post_web_hooks.rb similarity index 91% rename from db/migrate/20200514075407_remove_queued_post_web_hooks.rb rename to db/migrate/20201218000001_remove_queued_post_web_hooks.rb index 632e5013dc..835054ef81 100644 --- a/db/migrate/20200514075407_remove_queued_post_web_hooks.rb +++ b/db/migrate/20201218000001_remove_queued_post_web_hooks.rb @@ -4,12 +4,12 @@ class RemoveQueuedPostWebHooks < ActiveRecord::Migration[6.0] def up queued_post_event_type_id = 8 - DB.exec <<~SQL + execute <<~SQL DELETE FROM web_hook_event_types_hooks WHERE web_hook_event_type_id = #{queued_post_event_type_id} SQL - DB.exec <<~SQL + execute <<~SQL DELETE FROM web_hook_event_types WHERE id = #{queued_post_event_type_id} SQL From bbf6cc4f1895d64260e8c182b8a42d795c800b62 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Mon, 21 Dec 2020 11:01:06 +0530 Subject: [PATCH 160/393] DEV: require fileutils gem on boot (#11542) --- bin/unicorn | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/unicorn b/bin/unicorn index a9b9e04efb..6437aced5e 100755 --- a/bin/unicorn +++ b/bin/unicorn @@ -9,6 +9,7 @@ RAILS_ROOT = File.expand_path("../../", Pathname.new(__FILE__).realpath) require 'rubygems' require 'bundler/setup' require 'digest' +require 'fileutils' dev_mode = false From 38950840e072886e5d79a520268131b5249ce12d Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Mon, 21 Dec 2020 12:26:51 +0200 Subject: [PATCH 161/393] FIX: Show restricted tags in bulk select (#11531) Navigating to a category and tag page, selecting topics and attempting to bulk append a tag showed all but the tags restricted to the category. --- app/assets/javascripts/discourse/app/templates/tags/show.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/app/templates/tags/show.hbs b/app/assets/javascripts/discourse/app/templates/tags/show.hbs index 38f50fab9b..3fa58ca55e 100644 --- a/app/assets/javascripts/discourse/app/templates/tags/show.hbs +++ b/app/assets/javascripts/discourse/app/templates/tags/show.hbs @@ -48,7 +48,7 @@ {{#unless loading}} {{#if list.topics}} {{#discovery-topics-list model=list refresh=(action "refresh")}} - {{bulk-select-button selected=selected action=(action "refresh")}} + {{bulk-select-button selected=selected action=(action "refresh") category=category}} {{topic-list topics=list.topics canBulkSelect=canBulkSelect From c4552e9c10db8b91634f96112efd6e34a77e77e7 Mon Sep 17 00:00:00 2001 From: Rafael dos Santos Silva Date: Mon, 21 Dec 2020 14:55:00 -0300 Subject: [PATCH 162/393] FIX: Autoplay videos must always be muted (#11533) This automatically adds the muted attribute if it's missing in a video tag. Co-authored-by: David Taylor --- .../tests/unit/lib/sanitizer-test.js | 32 +++++++++++++++++++ .../pretty-text/addon/allow-lister.js | 2 +- .../pretty-text/addon/sanitizer.js | 6 ++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/tests/unit/lib/sanitizer-test.js b/app/assets/javascripts/discourse/tests/unit/lib/sanitizer-test.js index ea7898f33c..aa0efbf80e 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/sanitizer-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/sanitizer-test.js @@ -168,6 +168,38 @@ module("Unit | Utility | sanitizer", function () { ); }); + test("autoplay videos must be muted", function (assert) { + let pt = new PrettyText(buildOptions({ siteSettings: {} })); + assert.ok( + pt + .sanitize( + `

Hey