From f66e798ed74cb39cdcc03b007c5e227d359cb320 Mon Sep 17 00:00:00 2001 From: Kris Date: Thu, 19 Jan 2023 12:45:45 -0500 Subject: [PATCH] A11Y: more descriptive user page titles (#19819) --- .../discourse/app/controllers/preferences/emails.js | 1 + .../app/controllers/preferences/interface.js | 1 + .../app/controllers/preferences/notifications.js | 2 ++ .../discourse/app/controllers/preferences/profile.js | 1 + .../app/controllers/preferences/security.js | 2 +- .../discourse/app/controllers/preferences/sidebar.js | 1 + .../discourse/app/routes/preferences-account.js | 2 ++ .../javascripts/discourse/app/routes/preferences.js | 12 ++++++++++++ .../discourse/app/routes/user-activity-bookmarks.js | 5 +++++ .../discourse/app/routes/user-activity-drafts.js | 4 ++++ .../discourse/app/routes/user-activity-index.js | 4 ++++ .../app/routes/user-activity-likes-given.js | 4 ++++ .../discourse/app/routes/user-activity-read.js | 4 ++++ .../discourse/app/routes/user-activity-replies.js | 4 ++++ .../discourse/app/routes/user-activity-topics.js | 4 ++++ .../discourse/app/routes/user-activity.js | 5 +++++ .../javascripts/discourse/app/routes/user-badges.js | 5 +++++ .../discourse/app/routes/user-invited-show.js | 5 +++++ .../javascripts/discourse/app/routes/user-invited.js | 5 +++++ .../discourse/app/routes/user-notifications-edits.js | 5 +++++ .../discourse/app/routes/user-notifications-index.js | 5 +++++ .../app/routes/user-notifications-likes-received.js | 5 +++++ .../app/routes/user-notifications-mentions.js | 5 +++++ .../app/routes/user-notifications-responses.js | 5 +++++ .../discourse/app/routes/user-notifications.js | 5 +++++ .../javascripts/discourse/app/routes/user-summary.js | 5 +++++ app/assets/javascripts/discourse/app/routes/user.js | 5 +---- .../discourse/controllers/preferences-chat.js | 1 + 28 files changed, 107 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/emails.js b/app/assets/javascripts/discourse/app/controllers/preferences/emails.js index a332882af52..c370e6f3d16 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/emails.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/emails.js @@ -11,6 +11,7 @@ const EMAIL_LEVELS = { }; export default Controller.extend({ + subpageTitle: I18n.t("user.preferences_nav.emails"), emailMessagesLevelAway: equal( "model.user_option.email_messages_level", EMAIL_LEVELS.ONLY_WHEN_AWAY diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/interface.js b/app/assets/javascripts/discourse/app/controllers/preferences/interface.js index d1e2c253820..92c3d46c03b 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/interface.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/interface.js @@ -36,6 +36,7 @@ export default Controller.extend({ preferencesController: controller("preferences"), makeColorSchemeDefault: true, canPreviewColorScheme: propertyEqual("model.id", "currentUser.id"), + subpageTitle: I18n.t("user.preferences_nav.interface"), init() { this._super(...arguments); diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/notifications.js b/app/assets/javascripts/discourse/app/controllers/preferences/notifications.js index 6db87bbe846..468e5052b62 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/notifications.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/notifications.js @@ -5,6 +5,8 @@ import { NotificationLevels } from "discourse/lib/notification-levels"; import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ + subpageTitle: I18n.t("user.preferences_nav.notifications"), + init() { this._super(...arguments); diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/profile.js b/app/assets/javascripts/discourse/app/controllers/preferences/profile.js index f5db9651ec2..303bfe32348 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/profile.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/profile.js @@ -12,6 +12,7 @@ import { inject as service } from "@ember/service"; export default Controller.extend({ dialog: service(), + subpageTitle: I18n.t("user.preferences_nav.profile"), init() { this._super(...arguments); this.saveAttrNames = [ diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/security.js b/app/assets/javascripts/discourse/app/controllers/preferences/security.js index 800d597c651..932235db306 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/security.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/security.js @@ -15,7 +15,7 @@ const DEFAULT_AUTH_TOKENS_COUNT = 2; export default Controller.extend(CanCheckEmails, { passwordProgress: null, - + subpageTitle: I18n.t("user.preferences_nav.security"), showAllAuthTokens: false, @discourseComputed("model.is_anonymous") diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/sidebar.js b/app/assets/javascripts/discourse/app/controllers/preferences/sidebar.js index 8a2ac607227..101a29dc18b 100644 --- a/app/assets/javascripts/discourse/app/controllers/preferences/sidebar.js +++ b/app/assets/javascripts/discourse/app/controllers/preferences/sidebar.js @@ -12,6 +12,7 @@ export default class extends Controller { @tracked saved = false; @tracked selectedSidebarCategories = []; @tracked selectedSidebarTagNames = []; + subpageTitle = I18n.t("user.preferences_nav.sidebar"); saveAttrNames = [ "sidebar_category_ids", diff --git a/app/assets/javascripts/discourse/app/routes/preferences-account.js b/app/assets/javascripts/discourse/app/routes/preferences-account.js index e7516e2f208..032ef98f34e 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-account.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-account.js @@ -2,6 +2,7 @@ import RestrictedUserRoute from "discourse/routes/restricted-user"; import UserBadge from "discourse/models/user-badge"; import showModal from "discourse/lib/show-modal"; import { action } from "@ember/object"; +import I18n from "I18n"; export default RestrictedUserRoute.extend({ showFooter: true, @@ -32,6 +33,7 @@ export default RestrictedUserRoute.extend({ newPrimaryGroupInput: user.get("primary_group_id"), newFlairGroupId: user.get("flair_group_id"), newStatus: user.status, + subpageTitle: I18n.t("user.preferences_nav.account"), }); }, diff --git a/app/assets/javascripts/discourse/app/routes/preferences.js b/app/assets/javascripts/discourse/app/routes/preferences.js index 8c157859da6..83bc53b2f20 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences.js +++ b/app/assets/javascripts/discourse/app/routes/preferences.js @@ -1,7 +1,19 @@ import RestrictedUserRoute from "discourse/routes/restricted-user"; +import I18n from "I18n"; +import { inject as service } from "@ember/service"; export default RestrictedUserRoute.extend({ + router: service(), + model() { return this.modelFor("user"); }, + + titleToken() { + let controller = this.controllerFor(this.router.currentRouteName); + let subpageTitle = controller?.subpageTitle; + return subpageTitle + ? `${subpageTitle} - ${I18n.t("user.preferences")}` + : I18n.t("user.preferences"); + }, }); diff --git a/app/assets/javascripts/discourse/app/routes/user-activity-bookmarks.js b/app/assets/javascripts/discourse/app/routes/user-activity-bookmarks.js index a29d1124f47..af88f4f95c1 100644 --- a/app/assets/javascripts/discourse/app/routes/user-activity-bookmarks.js +++ b/app/assets/javascripts/discourse/app/routes/user-activity-bookmarks.js @@ -2,6 +2,7 @@ import { action } from "@ember/object"; import { ajax } from "discourse/lib/ajax"; import DiscourseRoute from "discourse/routes/discourse"; import { Promise } from "rsvp"; +import I18n from "I18n"; export default DiscourseRoute.extend({ queryParams: { @@ -50,6 +51,10 @@ export default DiscourseRoute.extend({ this.render("user_bookmarks"); }, + titleToken() { + return I18n.t("user_action_groups.3"); + }, + @action didTransition() { this.controllerFor("user-activity")._showFooter(); diff --git a/app/assets/javascripts/discourse/app/routes/user-activity-drafts.js b/app/assets/javascripts/discourse/app/routes/user-activity-drafts.js index 5a5d30507bd..c73975624e8 100644 --- a/app/assets/javascripts/discourse/app/routes/user-activity-drafts.js +++ b/app/assets/javascripts/discourse/app/routes/user-activity-drafts.js @@ -38,6 +38,10 @@ export default DiscourseRoute.extend({ this.appEvents.off("draft:destroyed", this, this.refresh); }, + titleToken() { + return I18n.t("user_action_groups.15"); + }, + @action didTransition() { this.controllerFor("user-activity")._showFooter(); diff --git a/app/assets/javascripts/discourse/app/routes/user-activity-index.js b/app/assets/javascripts/discourse/app/routes/user-activity-index.js index 88bb0b37cdb..4907997ed05 100644 --- a/app/assets/javascripts/discourse/app/routes/user-activity-index.js +++ b/app/assets/javascripts/discourse/app/routes/user-activity-index.js @@ -25,4 +25,8 @@ export default UserActivityStreamRoute.extend({ return { title, body }; }, + + titleToken() { + return I18n.t("user.filters.all"); + }, }); 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 901c890e245..0965c24d57c 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 @@ -25,6 +25,10 @@ export default UserActivityStreamRoute.extend({ return { title, body }; }, + titleToken() { + return I18n.t("user_action_groups.1"); + }, + @action didTransition() { this.controllerFor("application").set("showFooter", true); diff --git a/app/assets/javascripts/discourse/app/routes/user-activity-read.js b/app/assets/javascripts/discourse/app/routes/user-activity-read.js index 5746b96d1aa..c988fad68e5 100644 --- a/app/assets/javascripts/discourse/app/routes/user-activity-read.js +++ b/app/assets/javascripts/discourse/app/routes/user-activity-read.js @@ -42,6 +42,10 @@ export default UserTopicListRoute.extend({ return { title, body }; }, + titleToken() { + return `${I18n.t("user.read")}`; + }, + @action triggerRefresh() { this.refresh(); 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 2db4981c4f4..04ab75c18ed 100644 --- a/app/assets/javascripts/discourse/app/routes/user-activity-replies.js +++ b/app/assets/javascripts/discourse/app/routes/user-activity-replies.js @@ -29,6 +29,10 @@ export default UserActivityStreamRoute.extend({ return { title, body }; }, + titleToken() { + return I18n.t("user_action_groups.5"); + }, + @action didTransition() { this.controllerFor("application").set("showFooter", true); 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 7059e4acb8b..6e020374477 100644 --- a/app/assets/javascripts/discourse/app/routes/user-activity-topics.js +++ b/app/assets/javascripts/discourse/app/routes/user-activity-topics.js @@ -50,6 +50,10 @@ export default UserTopicListRoute.extend({ return { title, body }; }, + titleToken() { + return I18n.t("user_action_groups.4"); + }, + @action triggerRefresh() { this.refresh(); diff --git a/app/assets/javascripts/discourse/app/routes/user-activity.js b/app/assets/javascripts/discourse/app/routes/user-activity.js index 9a94a47d8df..2638e1d7afa 100644 --- a/app/assets/javascripts/discourse/app/routes/user-activity.js +++ b/app/assets/javascripts/discourse/app/routes/user-activity.js @@ -1,4 +1,5 @@ import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ model() { @@ -19,4 +20,8 @@ export default DiscourseRoute.extend({ setupController(controller, user) { this.controllerFor("user-activity").set("model", user); }, + + titleToken() { + return I18n.t("user.activity_stream"); + }, }); diff --git a/app/assets/javascripts/discourse/app/routes/user-badges.js b/app/assets/javascripts/discourse/app/routes/user-badges.js index 6feb940c502..e604e7ccb30 100644 --- a/app/assets/javascripts/discourse/app/routes/user-badges.js +++ b/app/assets/javascripts/discourse/app/routes/user-badges.js @@ -2,6 +2,7 @@ import DiscourseRoute from "discourse/routes/discourse"; import UserBadge from "discourse/models/user-badge"; import ViewingActionType from "discourse/mixins/viewing-action-type"; import { action } from "@ember/object"; +import I18n from "I18n"; export default DiscourseRoute.extend(ViewingActionType, { model() { @@ -20,6 +21,10 @@ export default DiscourseRoute.extend(ViewingActionType, { this.render("user/badges"); }, + titleToken() { + return I18n.t("badges.title"); + }, + @action didTransition() { this.controllerFor("application").set("showFooter", true); 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 af6f4a3eeb4..bfa5ce2136d 100644 --- a/app/assets/javascripts/discourse/app/routes/user-invited-show.js +++ b/app/assets/javascripts/discourse/app/routes/user-invited-show.js @@ -1,6 +1,7 @@ import DiscourseRoute from "discourse/routes/discourse"; import Invite from "discourse/models/invite"; import { action } from "@ember/object"; +import I18n from "I18n"; export default DiscourseRoute.extend({ model(params) { @@ -27,6 +28,10 @@ export default DiscourseRoute.extend({ }); }, + titleToken() { + return I18n.t("user.invited." + this.inviteFilter + "_tab"); + }, + @action triggerRefresh() { this.refresh(); diff --git a/app/assets/javascripts/discourse/app/routes/user-invited.js b/app/assets/javascripts/discourse/app/routes/user-invited.js index ae432d3ecc7..11053e16605 100644 --- a/app/assets/javascripts/discourse/app/routes/user-invited.js +++ b/app/assets/javascripts/discourse/app/routes/user-invited.js @@ -1,4 +1,5 @@ import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ setupController(controller) { @@ -10,4 +11,8 @@ export default DiscourseRoute.extend({ can_see_invite_details, }); }, + + titleToken() { + return I18n.t("user.invited.title"); + }, }); 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 8be7b15b7bb..90b469a3c4d 100644 --- a/app/assets/javascripts/discourse/app/routes/user-notifications-edits.js +++ b/app/assets/javascripts/discourse/app/routes/user-notifications-edits.js @@ -1,6 +1,11 @@ import UserAction from "discourse/models/user-action"; import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; +import I18n from "I18n"; export default UserActivityStreamRoute.extend({ userActionType: UserAction.TYPES["edits"], + + titleToken() { + return I18n.t("user_action_groups.11"); + }, }); diff --git a/app/assets/javascripts/discourse/app/routes/user-notifications-index.js b/app/assets/javascripts/discourse/app/routes/user-notifications-index.js index 45af6681c72..99709d47de6 100644 --- a/app/assets/javascripts/discourse/app/routes/user-notifications-index.js +++ b/app/assets/javascripts/discourse/app/routes/user-notifications-index.js @@ -1,4 +1,5 @@ import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ controllerName: "user-notifications", @@ -6,6 +7,10 @@ export default DiscourseRoute.extend({ this.render("user/notifications-index"); }, + titleToken() { + return I18n.t("user.filters.all"); + }, + afterModel(model) { if (!model) { this.transitionTo("userNotifications.responses"); 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 1bfaa46b844..c913ae16df2 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,6 +1,11 @@ import UserAction from "discourse/models/user-action"; import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; +import I18n from "I18n"; export default UserActivityStreamRoute.extend({ userActionType: UserAction.TYPES["likes_received"], + + titleToken() { + return I18n.t("user_action_groups.1"); + }, }); 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 2d8c2622da0..449a2dbf330 100644 --- a/app/assets/javascripts/discourse/app/routes/user-notifications-mentions.js +++ b/app/assets/javascripts/discourse/app/routes/user-notifications-mentions.js @@ -1,6 +1,11 @@ import UserAction from "discourse/models/user-action"; import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; +import I18n from "I18n"; export default UserActivityStreamRoute.extend({ userActionType: UserAction.TYPES["mentions"], + + titleToken() { + return I18n.t("user_action_groups.7"); + }, }); 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 52604ccdc54..12f43ff2c64 100644 --- a/app/assets/javascripts/discourse/app/routes/user-notifications-responses.js +++ b/app/assets/javascripts/discourse/app/routes/user-notifications-responses.js @@ -1,6 +1,11 @@ import UserAction from "discourse/models/user-action"; import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; +import I18n from "I18n"; export default UserActivityStreamRoute.extend({ userActionType: UserAction.TYPES["replies"], + + titleToken() { + return I18n.t("user_action_groups.6"); + }, }); diff --git a/app/assets/javascripts/discourse/app/routes/user-notifications.js b/app/assets/javascripts/discourse/app/routes/user-notifications.js index aeb118579cf..aa93fa7a8a7 100644 --- a/app/assets/javascripts/discourse/app/routes/user-notifications.js +++ b/app/assets/javascripts/discourse/app/routes/user-notifications.js @@ -1,6 +1,7 @@ import DiscourseRoute from "discourse/routes/discourse"; import ViewingActionType from "discourse/mixins/viewing-action-type"; import { action } from "@ember/object"; +import I18n from "I18n"; export default DiscourseRoute.extend(ViewingActionType, { controllerName: "user-notifications", @@ -31,4 +32,8 @@ export default DiscourseRoute.extend(ViewingActionType, { controller.set("user", this.modelFor("user")); this.viewingActionType(-1); }, + + titleToken() { + return I18n.t("user.notifications"); + }, }); diff --git a/app/assets/javascripts/discourse/app/routes/user-summary.js b/app/assets/javascripts/discourse/app/routes/user-summary.js index d7fefead284..7f06eabd8c9 100644 --- a/app/assets/javascripts/discourse/app/routes/user-summary.js +++ b/app/assets/javascripts/discourse/app/routes/user-summary.js @@ -1,4 +1,5 @@ import DiscourseRoute from "discourse/routes/discourse"; +import I18n from "I18n"; export default DiscourseRoute.extend({ showFooter: true, @@ -11,4 +12,8 @@ export default DiscourseRoute.extend({ return user.summary(); }, + + titleToken() { + return I18n.t("user.summary.title"); + }, }); diff --git a/app/assets/javascripts/discourse/app/routes/user.js b/app/assets/javascripts/discourse/app/routes/user.js index b3efdef6878..aa0af019790 100644 --- a/app/assets/javascripts/discourse/app/routes/user.js +++ b/app/assets/javascripts/discourse/app/routes/user.js @@ -1,5 +1,4 @@ import DiscourseRoute from "discourse/routes/discourse"; -import I18n from "I18n"; import User from "discourse/models/user"; import { action } from "@ember/object"; import { bind } from "discourse-common/utils/decorators"; @@ -98,9 +97,7 @@ export default DiscourseRoute.extend({ titleToken() { const username = this.modelFor("user").username; - if (username) { - return [I18n.t("user.profile"), username]; - } + return username ? username : null; }, @action diff --git a/plugins/chat/assets/javascripts/discourse/controllers/preferences-chat.js b/plugins/chat/assets/javascripts/discourse/controllers/preferences-chat.js index bf4ef8a8ae8..5774f44b4b5 100644 --- a/plugins/chat/assets/javascripts/discourse/controllers/preferences-chat.js +++ b/plugins/chat/assets/javascripts/discourse/controllers/preferences-chat.js @@ -22,6 +22,7 @@ const EMAIL_FREQUENCY_OPTIONS = [ export default class PreferencesChatController extends Controller { @service chatAudioManager; + subpageTitle = I18n.t("chat.admin.title"); emailFrequencyOptions = EMAIL_FREQUENCY_OPTIONS;