From 5a9924362906040e5511a72e66bf946c2554080e Mon Sep 17 00:00:00 2001 From: David Taylor Date: Thu, 17 Aug 2023 12:47:08 +0100 Subject: [PATCH] DEV: Introduce declarative hide-application-footer helper (#23088) Previously, we had a `showFooter` boolean on the application controller which would be set true/false in various routes by different routes/controllers. A global `routeWillChange` hook would set it `false` before every route transition, and the destination route/controller would have to set it `true` for the footer to show correctly. This commit replaces that with a new 'declarative' system. Instead of having to set the value true/false manually, UIs which need the footer to be hidden can simply include the `{{hide-application-footer}}` helper in their template when needed. The helper/service will automatically keep track of all the current invocations of that helper, and only show the footer when there are 0 invocations. This significantly simplifies things, and removes the need for many observers and controller injections, both of which are considered 'code smells' in modern Ember applications. --- .template-lintrc.js | 3 +- .../javascripts/admin/addon/routes/admin.js | 1 - .../admin/addon/templates/admin.hbs | 1 + .../discourse/app/controllers/application.js | 15 +++++++- .../discourse/app/controllers/badges/show.js | 7 +--- .../discourse/app/controllers/discovery.js | 7 +--- .../app/controllers/discovery/topics.js | 13 ------- .../app/controllers/full-page-search.js | 6 ---- .../app/controllers/group-activity-posts.js | 6 ---- .../discourse/app/controllers/group-index.js | 17 ++++----- .../app/controllers/group-manage-logs.js | 5 --- .../app/controllers/group-requests.js | 11 +++--- .../discourse/app/controllers/groups-index.js | 7 +--- .../discourse/app/controllers/tag-show.js | 9 +---- .../discourse/app/controllers/topic.js | 11 +----- .../app/controllers/user-activity.js | 19 +--------- .../app/controllers/user-notifications.js | 10 ++---- .../discourse/app/controllers/user-posts.js | 12 ++----- .../app/controllers/user-topics-list.js | 11 ++---- .../discourse/app/controllers/users.js | 9 +---- .../app/helpers/hide-application-footer.js | 13 +++++++ .../app/instance-initializers/show-footer.js | 13 ------- .../discourse/app/models/user-stream.js | 35 ++++++++++++------- .../javascripts/discourse/app/routes/about.js | 7 ---- .../discourse/app/routes/badges-index.js | 9 ----- .../discourse/app/routes/badges-show.js | 9 ----- .../routes/build-private-messages-route.js | 6 ---- .../discourse/app/routes/discourse.js | 9 ----- .../app/routes/discovery-categories.js | 7 ---- .../discourse/app/routes/exception.js | 7 ---- .../javascripts/discourse/app/routes/faq.js | 7 ---- .../app/routes/group-activity-posts.js | 1 - .../app/routes/group-activity-topics.js | 2 -- .../app/routes/group-manage-categories.js | 2 -- .../app/routes/group-manage-email.js | 1 - .../app/routes/group-manage-index.js | 1 - .../app/routes/group-manage-interaction.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 | 1 - .../discourse/app/routes/group-permissions.js | 1 - .../discourse/app/routes/groups-new.js | 1 - .../app/routes/preferences-account.js | 2 -- .../discourse/app/routes/preferences-apps.js | 4 +-- .../app/routes/preferences-categories.js | 4 +-- .../discourse/app/routes/preferences-email.js | 2 -- .../app/routes/preferences-emails.js | 4 +-- .../discourse/app/routes/preferences-index.js | 1 - .../app/routes/preferences-interface.js | 2 -- .../app/routes/preferences-navigation-menu.js | 2 -- .../app/routes/preferences-notifications.js | 4 +-- .../app/routes/preferences-profile.js | 1 - .../app/routes/preferences-second-factor.js | 2 -- .../app/routes/preferences-security.js | 4 +-- .../discourse/app/routes/preferences-tags.js | 4 +-- .../app/routes/preferences-tracking.js | 4 +-- .../discourse/app/routes/preferences-users.js | 4 +-- .../discourse/app/routes/privacy.js | 7 ---- .../discourse/app/routes/tag-groups-edit.js | 2 -- .../discourse/app/routes/tag-groups-new.js | 1 - .../discourse/app/routes/tag-groups.js | 2 -- .../discourse/app/routes/tag-show.js | 6 ---- .../discourse/app/routes/tags-index.js | 6 ---- .../javascripts/discourse/app/routes/topic.js | 1 - .../javascripts/discourse/app/routes/tos.js | 7 ---- .../app/routes/user-activity-bookmarks.js | 6 ---- .../app/routes/user-activity-drafts.js | 7 ---- .../app/routes/user-activity-likes-given.js | 7 ---- .../app/routes/user-activity-replies.js | 7 ---- .../app/routes/user-activity-stream.js | 7 ---- .../discourse/app/routes/user-badges.js | 7 ---- .../app/routes/user-deleted-posts.js | 7 ---- .../app/routes/user-notifications.js | 7 ---- .../discourse/app/routes/user-summary.js | 2 -- .../javascripts/discourse/app/routes/users.js | 7 ---- .../discourse/app/services/footer.js | 28 +++++++++++++++ .../discourse/app/templates/badges/show.hbs | 4 +++ .../discourse/app/templates/discovery.hbs | 4 +++ .../app/templates/discovery/topics.hbs | 4 +++ .../app/templates/full-page-search.hbs | 4 +++ .../app/templates/group-activity-posts.hbs | 4 +++ .../discourse/app/templates/group-index.hbs | 4 +++ .../app/templates/group-requests.hbs | 4 +++ .../app/templates/group/manage/logs.hbs | 4 +++ .../discourse/app/templates/groups/index.hbs | 4 +++ .../discourse/app/templates/loading.hbs | 3 +- .../app/templates/mobile/discovery/topics.hbs | 6 ++++ .../discourse/app/templates/tag/show.hbs | 4 +++ .../discourse/app/templates/topic.hbs | 6 ++++ .../app/templates/user-topics-list.hbs | 4 +++ .../app/templates/user/notifications.hbs | 4 +++ .../discourse/app/templates/user/posts.hbs | 4 +++ .../discourse/app/templates/user/stream.hbs | 4 +++ .../discourse/app/templates/users.hbs | 4 +++ .../javascripts/wizard/addon/routes/wizard.js | 1 - .../wizard/addon/templates/wizard.hbs | 1 + 97 files changed, 189 insertions(+), 376 deletions(-) create mode 100644 app/assets/javascripts/discourse/app/helpers/hide-application-footer.js delete mode 100644 app/assets/javascripts/discourse/app/instance-initializers/show-footer.js create mode 100644 app/assets/javascripts/discourse/app/services/footer.js diff --git a/.template-lintrc.js b/.template-lintrc.js index b9d2db1b567..8fc14a870cf 100644 --- a/.template-lintrc.js +++ b/.template-lintrc.js @@ -16,10 +16,11 @@ module.exports = { "directory-table-header-title", "loading-spinner", "directory-item-label", + "hide-application-footer", ], }, "no-implicit-this": { - allow: ["loading-spinner"], + allow: ["loading-spinner", "hide-application-footer"], }, "require-mandatory-role-attributes": false, "require-media-caption": false, diff --git a/app/assets/javascripts/admin/addon/routes/admin.js b/app/assets/javascripts/admin/addon/routes/admin.js index 201e0284084..0d1e8d6f8ba 100644 --- a/app/assets/javascripts/admin/addon/routes/admin.js +++ b/app/assets/javascripts/admin/addon/routes/admin.js @@ -9,7 +9,6 @@ export default class AdminRoute extends DiscourseRoute { activate() { this.controllerFor("application").setProperties({ showTop: false, - showFooter: false, }); } diff --git a/app/assets/javascripts/admin/addon/templates/admin.hbs b/app/assets/javascripts/admin/addon/templates/admin.hbs index e9f9ef01ca6..ca0fbe7a1ba 100644 --- a/app/assets/javascripts/admin/addon/templates/admin.hbs +++ b/app/assets/javascripts/admin/addon/templates/admin.hbs @@ -1,3 +1,4 @@ +{{hide-application-footer}}
diff --git a/app/assets/javascripts/discourse/app/controllers/application.js b/app/assets/javascripts/discourse/app/controllers/application.js index 6ab68de881f..5df4c9cb548 100644 --- a/app/assets/javascripts/discourse/app/controllers/application.js +++ b/app/assets/javascripts/discourse/app/controllers/application.js @@ -3,6 +3,7 @@ import discourseComputed from "discourse-common/utils/decorators"; import discourseDebounce from "discourse-common/lib/debounce"; import { inject as service } from "@ember/service"; import { action } from "@ember/object"; +import deprecated from "discourse-common/lib/deprecated"; const HIDE_SIDEBAR_KEY = "sidebar-hidden"; @@ -10,8 +11,8 @@ export default Controller.extend({ queryParams: [{ navigationMenuQueryParamOverride: "navigation_menu" }], showTop: true, - showFooter: false, router: service(), + footer: service(), showSidebar: false, navigationMenuQueryParamOverride: null, sidebarDisabledRouteOverride: false, @@ -22,6 +23,18 @@ export default Controller.extend({ this.showSidebar = this.calculateShowSidebar(); }, + get showFooter() { + return this.footer.showFooter; + }, + + set showFooter(value) { + deprecated( + "showFooter state is now stored in the `footer` service, and should be controlled by adding the {{hide-application-footer}} helper to an Ember template.", + { id: "discourse.application-show-footer" } + ); + this.footer.showFooter = value; + }, + @discourseComputed canSignUp() { return ( diff --git a/app/assets/javascripts/discourse/app/controllers/badges/show.js b/app/assets/javascripts/discourse/app/controllers/badges/show.js index 3c3d9ec71d0..4b2ce1c199f 100644 --- a/app/assets/javascripts/discourse/app/controllers/badges/show.js +++ b/app/assets/javascripts/discourse/app/controllers/badges/show.js @@ -1,6 +1,6 @@ import EmberObject, { action } from "@ember/object"; import Controller, { inject as controller } from "@ember/controller"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import Badge from "discourse/models/badge"; import I18n from "I18n"; import UserBadge from "discourse/models/user-badge"; @@ -63,11 +63,6 @@ export default Controller.extend({ return !!user && grantCount > 1; }, - @observes("canLoadMore") - _showFooter() { - this.set("application.showFooter", !this.canLoadMore); - }, - @action loadMore() { if (!this.canLoadMore) { diff --git a/app/assets/javascripts/discourse/app/controllers/discovery.js b/app/assets/javascripts/discourse/app/controllers/discovery.js index 627613dc6c1..64f8e9c0793 100644 --- a/app/assets/javascripts/discourse/app/controllers/discovery.js +++ b/app/assets/javascripts/discourse/app/controllers/discovery.js @@ -1,5 +1,5 @@ import { inject as service } from "@ember/service"; -import { alias, equal, not } from "@ember/object/computed"; +import { alias, equal } from "@ember/object/computed"; import Controller, { inject as controller } from "@ember/controller"; import { action } from "@ember/object"; import Category from "discourse/models/category"; @@ -8,29 +8,24 @@ import DiscourseURL from "discourse/lib/url"; export default class DiscoveryController extends Controller { @service router; - @controller("discovery/topics") discoveryTopics; @controller("navigation/category") navigationCategory; - @controller application; @equal("router.currentRouteName", "discovery.categories") viewingCategoriesList; @alias("navigationCategory.category") category; @alias("navigationCategory.noSubcategories") noSubcategories; - @not("discoveryTopics.model.canLoadMore") loadedAllItems; loading = false; @action loadingBegan() { this.set("loading", true); - this.set("application.showFooter", false); } @action loadingComplete() { this.set("loading", false); - this.set("application.showFooter", this.loadedAllItems); } showMoreUrl(period) { diff --git a/app/assets/javascripts/discourse/app/controllers/discovery/topics.js b/app/assets/javascripts/discourse/app/controllers/discovery/topics.js index 46685faa991..c7fe6234ad7 100644 --- a/app/assets/javascripts/discourse/app/controllers/discovery/topics.js +++ b/app/assets/javascripts/discourse/app/controllers/discovery/topics.js @@ -41,19 +41,6 @@ export default class TopicsController extends DiscoveryController.extend( @equal("period", "weekly") weekly; @equal("period", "daily") daily; - // Remove these loading actions which are defined in `DiscoveryController` - // We want them to bubble in DiscoveryTopicsController - @action - loadingBegan() { - this.set("application.showFooter", false); - return true; - } - @action - loadingComplete() { - this.set("application.showFooter", this.loadedAllItems); - return true; - } - @discourseComputed("model.filter", "model.topics.length") showDismissRead(filter, topicsLength) { return this._isFilterPage(filter, "unread") && topicsLength > 0; 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 1b9d41a6121..a78bf11ec0d 100644 --- a/app/assets/javascripts/discourse/app/controllers/full-page-search.js +++ b/app/assets/javascripts/discourse/app/controllers/full-page-search.js @@ -245,11 +245,6 @@ export default Controller.extend({ ); }, - @observes("loading") - _showFooter() { - this.set("application.showFooter", !this.loading); - }, - @discourseComputed("resultCount", "noSortQ") resultCountLabel(count, term) { const plus = count % 50 === 0 ? "+" : ""; @@ -437,7 +432,6 @@ export default Controller.extend({ }, _afterTransition() { - this._showFooter(); if (Object.keys(this.model).length === 0) { this.reset(); } 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 3e73979ca83..0aa936d8d75 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,5 @@ import Controller, { inject as controller } from "@ember/controller"; import { fmt } from "discourse/lib/computed"; -import { observes } from "discourse-common/utils/decorators"; export default Controller.extend({ group: controller(), @@ -41,9 +40,4 @@ export default Controller.extend({ } }, }, - - @observes("canLoadMore") - _showFooter() { - this.set("application.showFooter", !this.canLoadMore); - }, }); diff --git a/app/assets/javascripts/discourse/app/controllers/group-index.js b/app/assets/javascripts/discourse/app/controllers/group-index.js index 55dc4fe1f31..eaf170d63d4 100644 --- a/app/assets/javascripts/discourse/app/controllers/group-index.js +++ b/app/assets/javascripts/discourse/app/controllers/group-index.js @@ -1,4 +1,4 @@ -import Controller, { inject as controller } from "@ember/controller"; +import Controller from "@ember/controller"; import discourseComputed, { debounce, observes, @@ -9,8 +9,6 @@ import { gt } from "@ember/object/computed"; import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ - application: controller(), - queryParams: ["order", "asc", "filter"], order: "", @@ -24,6 +22,10 @@ export default Controller.extend({ bulkSelection: null, + get canLoadMore() { + return this.get("model.members")?.length >= this.get("model.user_count"); + }, + @observes("filterInput") filterInputChanged() { this._setFilter(); @@ -44,18 +46,13 @@ export default Controller.extend({ return; } - if (!refresh && this.model.members.length >= this.model.user_count) { - this.set("application.showFooter", true); + if (!refresh && !this.canLoadMore) { return; } this.set("loading", true); this.model.reloadMembers(this.memberParams, refresh).finally(() => { - this.setProperties({ - "application.showFooter": - this.model.members.length >= this.model.user_count, - loading: false, - }); + this.set("loading", false); if (this.refresh) { this.set("bulkSelection", []); diff --git a/app/assets/javascripts/discourse/app/controllers/group-manage-logs.js b/app/assets/javascripts/discourse/app/controllers/group-manage-logs.js index 48cd8e2d6b2..1d11661aa59 100644 --- a/app/assets/javascripts/discourse/app/controllers/group-manage-logs.js +++ b/app/assets/javascripts/discourse/app/controllers/group-manage-logs.js @@ -42,11 +42,6 @@ export default Controller.extend({ }); }, - @observes("model.all_loaded") - _showFooter() { - this.set("application.showFooter", this.get("model.all_loaded")); - }, - reset() { this.setProperties({ offset: 0, diff --git a/app/assets/javascripts/discourse/app/controllers/group-requests.js b/app/assets/javascripts/discourse/app/controllers/group-requests.js index d8d87662cdd..51832cdbe5a 100644 --- a/app/assets/javascripts/discourse/app/controllers/group-requests.js +++ b/app/assets/javascripts/discourse/app/controllers/group-requests.js @@ -18,6 +18,10 @@ export default Controller.extend({ loading: false, + get canLoadMore() { + return this.get("model.requesters")?.length < this.get("model.user_count"); + }, + @observes("filterInput") filterInputChanged() { this._setFilter(); @@ -43,17 +47,12 @@ export default Controller.extend({ return; } - if (!refresh && model.requesters.length >= model.user_count) { - this.set("application.showFooter", true); + if (!refresh && !this.canLoadMore) { return; } this.set("loading", true); model.findRequesters(this.memberParams, refresh).finally(() => { - this.set( - "application.showFooter", - model.requesters.length >= model.user_count - ); this.set("loading", false); }); }, diff --git a/app/assets/javascripts/discourse/app/controllers/groups-index.js b/app/assets/javascripts/discourse/app/controllers/groups-index.js index c773f9f817a..dd643dba18c 100644 --- a/app/assets/javascripts/discourse/app/controllers/groups-index.js +++ b/app/assets/javascripts/discourse/app/controllers/groups-index.js @@ -1,4 +1,4 @@ -import Controller, { inject as controller } from "@ember/controller"; +import Controller from "@ember/controller"; import I18n from "I18n"; import { INPUT_DELAY } from "discourse-common/config/environment"; import { action } from "@ember/object"; @@ -8,7 +8,6 @@ import { inject as service } from "@ember/service"; export default Controller.extend({ router: service(), - application: controller(), queryParams: ["order", "asc", "filter", "type"], order: null, asc: null, @@ -37,10 +36,6 @@ export default Controller.extend({ .findAll("group", params) .then((groups) => { this.set("groups", groups); - - if (groups.canLoadMore) { - this.set("application.showFooter", !groups.canLoadMore); - } }) .finally(() => this.set("isLoading", false)); }, diff --git a/app/assets/javascripts/discourse/app/controllers/tag-show.js b/app/assets/javascripts/discourse/app/controllers/tag-show.js index 9fedd463b10..6d4cb555240 100644 --- a/app/assets/javascripts/discourse/app/controllers/tag-show.js +++ b/app/assets/javascripts/discourse/app/controllers/tag-show.js @@ -1,6 +1,5 @@ import DiscoverySortableController from "discourse/controllers/discovery-sortable"; -import { inject as controller } from "@ember/controller"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import BulkTopicSelection from "discourse/mixins/bulk-topic-selection"; import DismissTopics from "discourse/mixins/dismiss-topics"; import I18n from "I18n"; @@ -19,7 +18,6 @@ export default DiscoverySortableController.extend( DismissTopics, { - application: controller(), dialog: service(), router: service(), currentUser: service(), @@ -79,11 +77,6 @@ export default DiscoverySortableController.extend( }); }, - @observes("list.canLoadMore") - _showFooter() { - this.set("application.showFooter", !this.list?.canLoadMore); - }, - @discourseComputed("navMode", "list.topics.length", "loading") footerMessage(navMode, listTopicsLength, loading) { if (loading) { diff --git a/app/assets/javascripts/discourse/app/controllers/topic.js b/app/assets/javascripts/discourse/app/controllers/topic.js index c21434ec14a..9d5fd69deb6 100644 --- a/app/assets/javascripts/discourse/app/controllers/topic.js +++ b/app/assets/javascripts/discourse/app/controllers/topic.js @@ -1,5 +1,5 @@ import Category from "discourse/models/category"; -import Controller, { inject as controller } from "@ember/controller"; +import Controller from "@ember/controller"; import DiscourseURL, { userPath } from "discourse/lib/url"; import { alias, and, not, or } from "@ember/object/computed"; import discourseComputed, { @@ -57,7 +57,6 @@ export function registerCustomPostMessageCallback(type, callback) { export default Controller.extend(bufferedProperty("model"), { composer: service(), - application: controller(), dialog: service(), documentTitle: service(), screenTrack: service(), @@ -1806,12 +1805,4 @@ export default Controller.extend(bufferedProperty("model"), { } } }, - - @observes("model.postStream.loaded", "model.postStream.loadedAllPosts") - _showFooter() { - const showFooter = - this.get("model.postStream.loaded") && - this.get("model.postStream.loadedAllPosts"); - this.set("application.showFooter", showFooter); - }, }); diff --git a/app/assets/javascripts/discourse/app/controllers/user-activity.js b/app/assets/javascripts/discourse/app/controllers/user-activity.js index 89924171d11..1aeb7f89ed1 100644 --- a/app/assets/javascripts/discourse/app/controllers/user-activity.js +++ b/app/assets/javascripts/discourse/app/controllers/user-activity.js @@ -3,32 +3,15 @@ import I18n from "I18n"; import { alias } from "@ember/object/computed"; import { exportUserArchive } from "discourse/lib/export-csv"; import { inject as service } from "@ember/service"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend({ dialog: service(), - application: controller(), user: controller(), userActionType: null, canDownloadPosts: alias("user.viewingSelf"), - @observes("userActionType", "model.stream.itemsLoaded") - _showFooter() { - let showFooter; - if (this.userActionType) { - const stat = (this.get("model.stats") || []).find( - (s) => s.action_type === this.userActionType - ); - showFooter = stat && stat.count <= this.get("model.stream.itemsLoaded"); - } else { - showFooter = - this.get("model.statsCountNonPM") <= - this.get("model.stream.itemsLoaded"); - } - this.set("application.showFooter", showFooter); - }, - @discourseComputed("currentUser.draft_count") draftLabel(count) { return count > 0 diff --git a/app/assets/javascripts/discourse/app/controllers/user-notifications.js b/app/assets/javascripts/discourse/app/controllers/user-notifications.js index 044c710de7e..1aeb88306e9 100644 --- a/app/assets/javascripts/discourse/app/controllers/user-notifications.js +++ b/app/assets/javascripts/discourse/app/controllers/user-notifications.js @@ -1,7 +1,7 @@ -import Controller, { inject as controller } from "@ember/controller"; +import Controller from "@ember/controller"; import getURL from "discourse-common/lib/get-url"; import { iconHTML } from "discourse-common/lib/icon-library"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import { ajax } from "discourse/lib/ajax"; import I18n from "I18n"; import { htmlSafe } from "@ember/template"; @@ -10,15 +10,9 @@ import DismissNotificationConfirmationModal from "discourse/components/modal/dis export default Controller.extend({ modal: service(), - application: controller(), queryParams: ["filter"], filter: "all", - @observes("model.canLoadMore") - _showFooter() { - this.set("application.showFooter", !this.get("model.canLoadMore")); - }, - @discourseComputed("filter") isFiltered() { return this.filter && this.filter !== "all"; diff --git a/app/assets/javascripts/discourse/app/controllers/user-posts.js b/app/assets/javascripts/discourse/app/controllers/user-posts.js index 457d56d42ab..382ec20074e 100644 --- a/app/assets/javascripts/discourse/app/controllers/user-posts.js +++ b/app/assets/javascripts/discourse/app/controllers/user-posts.js @@ -1,11 +1,3 @@ -import Controller, { inject as controller } from "@ember/controller"; -import { observes } from "discourse-common/utils/decorators"; +import Controller from "@ember/controller"; -export default Controller.extend({ - application: controller(), - - @observes("model.canLoadMore") - _showFooter() { - this.set("application.showFooter", !this.get("model.canLoadMore")); - }, -}); +export default class UserPostsController extends Controller {} 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 ecee3f764b9..25c6918700a 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 Controller, { inject as controller } from "@ember/controller"; -import discourseComputed, { observes } from "discourse-common/utils/decorators"; +import Controller from "@ember/controller"; +import discourseComputed from "discourse-common/utils/decorators"; import { reads } from "@ember/object/computed"; import BulkTopicSelection from "discourse/mixins/bulk-topic-selection"; import { action } from "@ember/object"; @@ -12,8 +12,6 @@ import { // Lists of topics on a user's page. export default Controller.extend(BulkTopicSelection, { - application: controller(), - hideCategory: false, showPosters: false, channel: null, @@ -25,11 +23,6 @@ export default Controller.extend(BulkTopicSelection, { return topicsLength === 0 && incomingCount === 0; }, - @observes("model.canLoadMore") - _showFooter() { - this.set("application.showFooter", !this.get("model.canLoadMore")); - }, - @discourseComputed("filter", "model.topics.length") showResetNew(filter, hasTopics) { return filter === NEW_FILTER && hasTopics; diff --git a/app/assets/javascripts/discourse/app/controllers/users.js b/app/assets/javascripts/discourse/app/controllers/users.js index 98f16cb7d8a..b2b743bd30f 100644 --- a/app/assets/javascripts/discourse/app/controllers/users.js +++ b/app/assets/javascripts/discourse/app/controllers/users.js @@ -1,14 +1,12 @@ -import Controller, { inject as controller } from "@ember/controller"; +import Controller from "@ember/controller"; import Group from "discourse/models/group"; import { action } from "@ember/object"; import discourseDebounce from "discourse-common/lib/debounce"; import showModal from "discourse/lib/show-modal"; import { and, equal } from "@ember/object/computed"; import { longDate } from "discourse/lib/formatter"; -import { observes } from "discourse-common/utils/decorators"; export default Controller.extend({ - application: controller(), queryParams: [ "period", "order", @@ -115,11 +113,6 @@ export default Controller.extend({ this.loadUsers(); }, - @observes("model.canLoadMore") - _showFooter() { - this.set("application.showFooter", !this.get("model.canLoadMore")); - }, - @action loadMore() { this.model.loadMore(); diff --git a/app/assets/javascripts/discourse/app/helpers/hide-application-footer.js b/app/assets/javascripts/discourse/app/helpers/hide-application-footer.js new file mode 100644 index 00000000000..fa9e15f2cf7 --- /dev/null +++ b/app/assets/javascripts/discourse/app/helpers/hide-application-footer.js @@ -0,0 +1,13 @@ +import Helper from "@ember/component/helper"; +import { inject as service } from "@ember/service"; + +export default class HideApplicationFooter extends Helper { + @service footer; + + constructor() { + super(...arguments); + this.footer.registerHider(this); + } + + compute() {} +} diff --git a/app/assets/javascripts/discourse/app/instance-initializers/show-footer.js b/app/assets/javascripts/discourse/app/instance-initializers/show-footer.js deleted file mode 100644 index 82c4e6e9b9e..00000000000 --- a/app/assets/javascripts/discourse/app/instance-initializers/show-footer.js +++ /dev/null @@ -1,13 +0,0 @@ -export default { - initialize(owner) { - const router = owner.lookup("router:main"); - const application = owner.lookup("controller:application"); - - // only take care of hiding the footer here - // controllers MUST take care of displaying it - router.on("routeWillChange", () => { - application.set("showFooter", false); - return true; - }); - }, -}; diff --git a/app/assets/javascripts/discourse/app/models/user-stream.js b/app/assets/javascripts/discourse/app/models/user-stream.js index 014e78754b9..d2cca0a12a0 100644 --- a/app/assets/javascripts/discourse/app/models/user-stream.js +++ b/app/assets/javascripts/discourse/app/models/user-stream.js @@ -50,11 +50,30 @@ export default RestModel.extend({ return this.findItems(); }, + @discourseComputed("baseUrl", "filterParam", "actingUsername") + nextFindUrl() { + let findUrl = this.baseUrl; + if (this.filterParam) { + findUrl += `&filter=${this.filterParam}`; + } + + if (this.actingUsername) { + findUrl += `&acting_username=${this.actingUsername}`; + } + + return findUrl; + }, + @discourseComputed("loaded", "content.[]") noContent(loaded, content) { return loaded && content.length === 0; }, + @discourseComputed("nextFindUrl", "lastLoadedUrl") + canLoadMore() { + return this.nextFindUrl !== this.lastLoadedUrl; + }, + remove(userAction) { // 1) remove the user action from the child groups this.content.forEach((ua) => { @@ -77,21 +96,13 @@ export default RestModel.extend({ }, findItems() { - let findUrl = this.baseUrl; - if (this.filterParam) { - findUrl += `&filter=${this.filterParam}`; - } - - if (this.actingUsername) { - findUrl += `&acting_username=${this.actingUsername}`; - } - - // Don't load the same stream twice. We're probably at the end. - const lastLoadedUrl = this.lastLoadedUrl; - if (lastLoadedUrl === findUrl) { + if (!this.canLoadMore) { + // Don't load the same stream twice. We're probably at the end. return Promise.resolve(); } + const findUrl = this.nextFindUrl; + if (this.loading) { return Promise.resolve(); } diff --git a/app/assets/javascripts/discourse/app/routes/about.js b/app/assets/javascripts/discourse/app/routes/about.js index 43363375bde..e50ca8727de 100644 --- a/app/assets/javascripts/discourse/app/routes/about.js +++ b/app/assets/javascripts/discourse/app/routes/about.js @@ -1,7 +1,6 @@ import DiscourseRoute from "discourse/routes/discourse"; import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; -import { action } from "@ember/object"; export default DiscourseRoute.extend({ model() { @@ -37,10 +36,4 @@ export default DiscourseRoute.extend({ titleToken() { return I18n.t("about.simple_title"); }, - - @action - didTransition() { - this.controllerFor("application").set("showFooter", true); - return true; - }, }); diff --git a/app/assets/javascripts/discourse/app/routes/badges-index.js b/app/assets/javascripts/discourse/app/routes/badges-index.js index 1b3b34be73c..c14bde41b50 100644 --- a/app/assets/javascripts/discourse/app/routes/badges-index.js +++ b/app/assets/javascripts/discourse/app/routes/badges-index.js @@ -2,8 +2,6 @@ import Badge from "discourse/models/badge"; import DiscourseRoute from "discourse/routes/discourse"; import I18n from "I18n"; import PreloadStore from "discourse/lib/preload-store"; -import { scrollTop } from "discourse/mixins/scroll-top"; -import { action } from "@ember/object"; export default DiscourseRoute.extend({ model() { @@ -19,11 +17,4 @@ export default DiscourseRoute.extend({ titleToken() { return I18n.t("badges.title"); }, - - @action - didTransition() { - this.controllerFor("application").set("showFooter", true); - scrollTop(); - return true; - }, }); diff --git a/app/assets/javascripts/discourse/app/routes/badges-show.js b/app/assets/javascripts/discourse/app/routes/badges-show.js index 3cfc9dc7121..26e244cb8e7 100644 --- a/app/assets/javascripts/discourse/app/routes/badges-show.js +++ b/app/assets/javascripts/discourse/app/routes/badges-show.js @@ -2,9 +2,7 @@ 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 { scrollTop } from "discourse/mixins/scroll-top"; import { hash } from "rsvp"; -import { action } from "@ember/object"; export default DiscourseRoute.extend({ queryParams: { @@ -64,11 +62,4 @@ export default DiscourseRoute.extend({ controller.set("userBadges", this.userBadgesGrant); controller.set("userBadgesAll", this.userBadgesAll); }, - - @action - didTransition() { - this.controllerFor("badges/show")._showFooter(); - scrollTop(); - return true; - }, }); 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 598647bf080..ec85ccfb901 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 @@ -24,12 +24,6 @@ export default (inboxType, path, filter) => { ]; }, - @action - didTransition() { - this.controllerFor("user-topics-list")._showFooter(); - return true; - }, - model() { const topicListFilter = "topics/" + path + "/" + this.modelFor("user").get("username_lower"); diff --git a/app/assets/javascripts/discourse/app/routes/discourse.js b/app/assets/javascripts/discourse/app/routes/discourse.js index 4deca988c30..dd7da1dbca4 100644 --- a/app/assets/javascripts/discourse/app/routes/discourse.js +++ b/app/assets/javascripts/discourse/app/routes/discourse.js @@ -5,19 +5,10 @@ import { getOwner } from "discourse-common/lib/get-owner"; import deprecated from "discourse-common/lib/deprecated"; const DiscourseRoute = Route.extend({ - showFooter: false, - willTransition() { seenUser(); }, - activate() { - this._super(...arguments); - if (this.showFooter) { - this.controllerFor("application").set("showFooter", true); - } - }, - _refreshTitleOnce() { this.send("_collectTitleTokens", []); }, diff --git a/app/assets/javascripts/discourse/app/routes/discovery-categories.js b/app/assets/javascripts/discourse/app/routes/discovery-categories.js index 32206de29de..736dcd29282 100644 --- a/app/assets/javascripts/discourse/app/routes/discovery-categories.js +++ b/app/assets/javascripts/discourse/app/routes/discovery-categories.js @@ -7,7 +7,6 @@ import TopicList from "discourse/models/topic-list"; import { ajax } from "discourse/lib/ajax"; import { defaultHomepage } from "discourse/lib/utilities"; import { hash } from "rsvp"; -import { next } from "@ember/runloop"; import showModal from "discourse/lib/show-modal"; import Session from "discourse/models/session"; import { inject as service } from "@ember/service"; @@ -153,10 +152,4 @@ export default class DiscoveryCategoriesRoute extends DiscourseRoute { reorderCategories() { showModal("reorder-categories"); } - - @action - didTransition() { - next(() => this.controllerFor("application").set("showFooter", true)); - return true; - } } diff --git a/app/assets/javascripts/discourse/app/routes/exception.js b/app/assets/javascripts/discourse/app/routes/exception.js index 2bd40f18878..16c3da63605 100644 --- a/app/assets/javascripts/discourse/app/routes/exception.js +++ b/app/assets/javascripts/discourse/app/routes/exception.js @@ -1,14 +1,7 @@ import DiscourseRoute from "discourse/routes/discourse"; -import { action } from "@ember/object"; export default DiscourseRoute.extend({ serialize() { return ""; }, - - @action - didTransition() { - this.controllerFor("application").set("showFooter", true); - return true; - }, }); diff --git a/app/assets/javascripts/discourse/app/routes/faq.js b/app/assets/javascripts/discourse/app/routes/faq.js index 34c54a719f7..9e3718aca04 100644 --- a/app/assets/javascripts/discourse/app/routes/faq.js +++ b/app/assets/javascripts/discourse/app/routes/faq.js @@ -3,7 +3,6 @@ import { inject as service } from "@ember/service"; import DiscourseURL from "discourse/lib/url"; import StaticPage from "discourse/models/static-page"; import I18n from "I18n"; -import { action } from "@ember/object"; export default class FaqRoute extends DiscourseRoute { @service siteSettings; @@ -30,10 +29,4 @@ export default class FaqRoute extends DiscourseRoute { titleToken() { return I18n.t(this.pageId); } - - @action - didTransition() { - this.controllerFor("application").set("showFooter", true); - return true; - } } 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 925368a0658..1c62e8bc620 100644 --- a/app/assets/javascripts/discourse/app/routes/group-activity-posts.js +++ b/app/assets/javascripts/discourse/app/routes/group-activity-posts.js @@ -24,7 +24,6 @@ export function buildGroupPage(type) { type, canLoadMore: !loadedAll, }); - this.controllerFor("application").set("showFooter", loadedAll); }, @action 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 31e5fde47c0..291d850ccfd 100644 --- a/app/assets/javascripts/discourse/app/routes/group-activity-topics.js +++ b/app/assets/javascripts/discourse/app/routes/group-activity-topics.js @@ -2,8 +2,6 @@ import DiscourseRoute from "discourse/routes/discourse"; import I18n from "I18n"; export default DiscourseRoute.extend({ - showFooter: true, - titleToken() { return I18n.t(`groups.topics`); }, 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 2523e5f8f5d..dcc00cd5edb 100644 --- a/app/assets/javascripts/discourse/app/routes/group-manage-categories.js +++ b/app/assets/javascripts/discourse/app/routes/group-manage-categories.js @@ -2,8 +2,6 @@ import DiscourseRoute from "discourse/routes/discourse"; import I18n from "I18n"; export default DiscourseRoute.extend({ - showFooter: true, - titleToken() { return I18n.t("groups.manage.categories.title"); }, diff --git a/app/assets/javascripts/discourse/app/routes/group-manage-email.js b/app/assets/javascripts/discourse/app/routes/group-manage-email.js index 0ede9ea9840..3a4e8643320 100644 --- a/app/assets/javascripts/discourse/app/routes/group-manage-email.js +++ b/app/assets/javascripts/discourse/app/routes/group-manage-email.js @@ -4,7 +4,6 @@ import { inject as service } from "@ember/service"; export default DiscourseRoute.extend({ router: service(), - showFooter: true, beforeModel() { // cannot configure IMAP without SMTP being enabled diff --git a/app/assets/javascripts/discourse/app/routes/group-manage-index.js b/app/assets/javascripts/discourse/app/routes/group-manage-index.js index 0376b77e2d0..145c3a62d40 100644 --- a/app/assets/javascripts/discourse/app/routes/group-manage-index.js +++ b/app/assets/javascripts/discourse/app/routes/group-manage-index.js @@ -3,7 +3,6 @@ import { inject as service } from "@ember/service"; export default DiscourseRoute.extend({ router: service(), - showFooter: true, beforeModel() { this.router.transitionTo("group.manage.profile"); 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 ad993fb5cdd..fd72df7e6a4 100644 --- a/app/assets/javascripts/discourse/app/routes/group-manage-interaction.js +++ b/app/assets/javascripts/discourse/app/routes/group-manage-interaction.js @@ -2,8 +2,6 @@ import DiscourseRoute from "discourse/routes/discourse"; import I18n from "I18n"; export default DiscourseRoute.extend({ - showFooter: true, - titleToken() { return I18n.t("groups.manage.interaction.title"); }, 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 b448f867567..3ef6bc53b9d 100644 --- a/app/assets/javascripts/discourse/app/routes/group-manage-membership.js +++ b/app/assets/javascripts/discourse/app/routes/group-manage-membership.js @@ -2,8 +2,6 @@ import DiscourseRoute from "discourse/routes/discourse"; import I18n from "I18n"; export default DiscourseRoute.extend({ - showFooter: true, - titleToken() { return I18n.t("groups.manage.membership.title"); }, 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 1edb6d39d70..d2d639ee3f9 100644 --- a/app/assets/javascripts/discourse/app/routes/group-manage-profile.js +++ b/app/assets/javascripts/discourse/app/routes/group-manage-profile.js @@ -2,8 +2,6 @@ import DiscourseRoute from "discourse/routes/discourse"; import I18n from "I18n"; export default DiscourseRoute.extend({ - showFooter: true, - titleToken() { return I18n.t("groups.manage.profile.title"); }, 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 6e2523485c7..7d721bb6c7d 100644 --- a/app/assets/javascripts/discourse/app/routes/group-manage-tags.js +++ b/app/assets/javascripts/discourse/app/routes/group-manage-tags.js @@ -2,8 +2,6 @@ import DiscourseRoute from "discourse/routes/discourse"; import I18n from "I18n"; export default DiscourseRoute.extend({ - showFooter: true, - titleToken() { return I18n.t("groups.manage.tags.title"); }, diff --git a/app/assets/javascripts/discourse/app/routes/group-manage.js b/app/assets/javascripts/discourse/app/routes/group-manage.js index 399a0a5e61b..bf2c2f2c40b 100644 --- a/app/assets/javascripts/discourse/app/routes/group-manage.js +++ b/app/assets/javascripts/discourse/app/routes/group-manage.js @@ -4,7 +4,6 @@ import { inject as service } from "@ember/service"; export default DiscourseRoute.extend({ router: service(), - showFooter: true, titleToken() { return I18n.t("groups.manage.title"); diff --git a/app/assets/javascripts/discourse/app/routes/group-permissions.js b/app/assets/javascripts/discourse/app/routes/group-permissions.js index 5984360c527..6f44e4e437a 100644 --- a/app/assets/javascripts/discourse/app/routes/group-permissions.js +++ b/app/assets/javascripts/discourse/app/routes/group-permissions.js @@ -6,7 +6,6 @@ import { inject as service } from "@ember/service"; export default DiscourseRoute.extend({ router: service(), - showFooter: true, titleToken() { return I18n.t("groups.permissions.title"); diff --git a/app/assets/javascripts/discourse/app/routes/groups-new.js b/app/assets/javascripts/discourse/app/routes/groups-new.js index 6800426e928..0ccf027ac07 100644 --- a/app/assets/javascripts/discourse/app/routes/groups-new.js +++ b/app/assets/javascripts/discourse/app/routes/groups-new.js @@ -5,7 +5,6 @@ import { inject as service } from "@ember/service"; export default DiscourseRoute.extend({ router: service(), - showFooter: true, titleToken() { return I18n.t("admin.groups.new.title"); diff --git a/app/assets/javascripts/discourse/app/routes/preferences-account.js b/app/assets/javascripts/discourse/app/routes/preferences-account.js index 032ef98f34e..ec968afcdbf 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-account.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-account.js @@ -5,8 +5,6 @@ import { action } from "@ember/object"; import I18n from "I18n"; export default RestrictedUserRoute.extend({ - showFooter: true, - model() { const user = this.modelFor("user"); if (this.siteSettings.enable_badges) { diff --git a/app/assets/javascripts/discourse/app/routes/preferences-apps.js b/app/assets/javascripts/discourse/app/routes/preferences-apps.js index bfec0d17c4c..e68405a8da5 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-apps.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-apps.js @@ -1,5 +1,3 @@ import RestrictedUserRoute from "discourse/routes/restricted-user"; -export default RestrictedUserRoute.extend({ - showFooter: true, -}); +export default RestrictedUserRoute.extend({}); diff --git a/app/assets/javascripts/discourse/app/routes/preferences-categories.js b/app/assets/javascripts/discourse/app/routes/preferences-categories.js index bfec0d17c4c..e68405a8da5 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-categories.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-categories.js @@ -1,5 +1,3 @@ import RestrictedUserRoute from "discourse/routes/restricted-user"; -export default RestrictedUserRoute.extend({ - showFooter: true, -}); +export default RestrictedUserRoute.extend({}); diff --git a/app/assets/javascripts/discourse/app/routes/preferences-email.js b/app/assets/javascripts/discourse/app/routes/preferences-email.js index 375b7ff07e7..4a87b67d4f9 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-email.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-email.js @@ -1,8 +1,6 @@ import RestrictedUserRoute from "discourse/routes/restricted-user"; export default RestrictedUserRoute.extend({ - showFooter: true, - model() { return this.modelFor("user"); }, diff --git a/app/assets/javascripts/discourse/app/routes/preferences-emails.js b/app/assets/javascripts/discourse/app/routes/preferences-emails.js index bfec0d17c4c..e68405a8da5 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-emails.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-emails.js @@ -1,5 +1,3 @@ import RestrictedUserRoute from "discourse/routes/restricted-user"; -export default RestrictedUserRoute.extend({ - showFooter: true, -}); +export default RestrictedUserRoute.extend({}); diff --git a/app/assets/javascripts/discourse/app/routes/preferences-index.js b/app/assets/javascripts/discourse/app/routes/preferences-index.js index ebeff6614af..de57f942782 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-index.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-index.js @@ -3,7 +3,6 @@ import { inject as service } from "@ember/service"; export default RestrictedUserRoute.extend({ router: service(), - showFooter: true, redirect() { this.router.transitionTo("preferences.account"); diff --git a/app/assets/javascripts/discourse/app/routes/preferences-interface.js b/app/assets/javascripts/discourse/app/routes/preferences-interface.js index 2613c4357da..eaf79c91137 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-interface.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-interface.js @@ -2,8 +2,6 @@ import RestrictedUserRoute from "discourse/routes/restricted-user"; import { currentThemeId } from "discourse/lib/theme-selector"; export default RestrictedUserRoute.extend({ - showFooter: true, - setupController(controller, user) { controller.setProperties({ model: user, diff --git a/app/assets/javascripts/discourse/app/routes/preferences-navigation-menu.js b/app/assets/javascripts/discourse/app/routes/preferences-navigation-menu.js index 8f01ffdfe56..2579fff5927 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-navigation-menu.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-navigation-menu.js @@ -2,8 +2,6 @@ import RestrictedUserRoute from "discourse/routes/restricted-user"; import Category from "discourse/models/category"; export default RestrictedUserRoute.extend({ - showFooter: true, - setupController(controller, user) { const props = { model: user, diff --git a/app/assets/javascripts/discourse/app/routes/preferences-notifications.js b/app/assets/javascripts/discourse/app/routes/preferences-notifications.js index bfec0d17c4c..e68405a8da5 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-notifications.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-notifications.js @@ -1,5 +1,3 @@ import RestrictedUserRoute from "discourse/routes/restricted-user"; -export default RestrictedUserRoute.extend({ - showFooter: true, -}); +export default RestrictedUserRoute.extend({}); diff --git a/app/assets/javascripts/discourse/app/routes/preferences-profile.js b/app/assets/javascripts/discourse/app/routes/preferences-profile.js index 9d9bee55278..fdd5425c712 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-profile.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-profile.js @@ -1,7 +1,6 @@ import RestrictedUserRoute from "discourse/routes/restricted-user"; export default RestrictedUserRoute.extend({ - showFooter: true, setupController(controller, model) { controller.set("model", model); }, diff --git a/app/assets/javascripts/discourse/app/routes/preferences-second-factor.js b/app/assets/javascripts/discourse/app/routes/preferences-second-factor.js index 10a21cf12dc..7ebd81c41d1 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-second-factor.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-second-factor.js @@ -6,8 +6,6 @@ export default RestrictedUserRoute.extend({ currentUser: service(), siteSettings: service(), - showFooter: true, - model() { return this.modelFor("user"); }, diff --git a/app/assets/javascripts/discourse/app/routes/preferences-security.js b/app/assets/javascripts/discourse/app/routes/preferences-security.js index bfec0d17c4c..e68405a8da5 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-security.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-security.js @@ -1,5 +1,3 @@ import RestrictedUserRoute from "discourse/routes/restricted-user"; -export default RestrictedUserRoute.extend({ - showFooter: true, -}); +export default RestrictedUserRoute.extend({}); diff --git a/app/assets/javascripts/discourse/app/routes/preferences-tags.js b/app/assets/javascripts/discourse/app/routes/preferences-tags.js index bfec0d17c4c..e68405a8da5 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-tags.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-tags.js @@ -1,5 +1,3 @@ import RestrictedUserRoute from "discourse/routes/restricted-user"; -export default RestrictedUserRoute.extend({ - showFooter: true, -}); +export default RestrictedUserRoute.extend({}); diff --git a/app/assets/javascripts/discourse/app/routes/preferences-tracking.js b/app/assets/javascripts/discourse/app/routes/preferences-tracking.js index bfec0d17c4c..e68405a8da5 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-tracking.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-tracking.js @@ -1,5 +1,3 @@ import RestrictedUserRoute from "discourse/routes/restricted-user"; -export default RestrictedUserRoute.extend({ - showFooter: true, -}); +export default RestrictedUserRoute.extend({}); diff --git a/app/assets/javascripts/discourse/app/routes/preferences-users.js b/app/assets/javascripts/discourse/app/routes/preferences-users.js index bfec0d17c4c..e68405a8da5 100644 --- a/app/assets/javascripts/discourse/app/routes/preferences-users.js +++ b/app/assets/javascripts/discourse/app/routes/preferences-users.js @@ -1,5 +1,3 @@ import RestrictedUserRoute from "discourse/routes/restricted-user"; -export default RestrictedUserRoute.extend({ - showFooter: true, -}); +export default RestrictedUserRoute.extend({}); diff --git a/app/assets/javascripts/discourse/app/routes/privacy.js b/app/assets/javascripts/discourse/app/routes/privacy.js index dfe8646ed1a..6d7aa0456aa 100644 --- a/app/assets/javascripts/discourse/app/routes/privacy.js +++ b/app/assets/javascripts/discourse/app/routes/privacy.js @@ -3,7 +3,6 @@ import { inject as service } from "@ember/service"; import DiscourseURL from "discourse/lib/url"; import StaticPage from "discourse/models/static-page"; import I18n from "I18n"; -import { action } from "@ember/object"; export default class PrivacyRoute extends DiscourseRoute { @service siteSettings; @@ -27,10 +26,4 @@ export default class PrivacyRoute extends DiscourseRoute { titleToken() { return I18n.t("privacy"); } - - @action - didTransition() { - this.controllerFor("application").set("showFooter", true); - return true; - } } diff --git a/app/assets/javascripts/discourse/app/routes/tag-groups-edit.js b/app/assets/javascripts/discourse/app/routes/tag-groups-edit.js index fe59529b950..f0377620ea2 100644 --- a/app/assets/javascripts/discourse/app/routes/tag-groups-edit.js +++ b/app/assets/javascripts/discourse/app/routes/tag-groups-edit.js @@ -1,8 +1,6 @@ import DiscourseRoute from "discourse/routes/discourse"; export default DiscourseRoute.extend({ - showFooter: true, - model(params) { return this.store.find("tagGroup", params.id); }, 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 8225a26f41e..2fc50e9ee93 100644 --- a/app/assets/javascripts/discourse/app/routes/tag-groups-new.js +++ b/app/assets/javascripts/discourse/app/routes/tag-groups-new.js @@ -4,7 +4,6 @@ import { inject as service } from "@ember/service"; export default DiscourseRoute.extend({ router: service(), - showFooter: true, beforeModel() { if (!this.siteSettings.tagging_enabled) { diff --git a/app/assets/javascripts/discourse/app/routes/tag-groups.js b/app/assets/javascripts/discourse/app/routes/tag-groups.js index 53e95088e15..3d5edd900f7 100644 --- a/app/assets/javascripts/discourse/app/routes/tag-groups.js +++ b/app/assets/javascripts/discourse/app/routes/tag-groups.js @@ -2,8 +2,6 @@ import DiscourseRoute from "discourse/routes/discourse"; import I18n from "I18n"; export default DiscourseRoute.extend({ - showFooter: true, - model() { return this.store.findAll("tagGroup"); }, diff --git a/app/assets/javascripts/discourse/app/routes/tag-show.js b/app/assets/javascripts/discourse/app/routes/tag-show.js index 4e3bba2b9aa..71322b846fd 100644 --- a/app/assets/javascripts/discourse/app/routes/tag-show.js +++ b/app/assets/javascripts/discourse/app/routes/tag-show.js @@ -260,12 +260,6 @@ export default DiscourseRoute.extend({ resetParams.call(this, skipParams); }, - @action - didTransition() { - this.controllerFor("tag.show")._showFooter(); - return true; - }, - _controllerTags(controller) { return [controller.get("model.id"), ...makeArray(controller.additionalTags)] .filter(Boolean) diff --git a/app/assets/javascripts/discourse/app/routes/tags-index.js b/app/assets/javascripts/discourse/app/routes/tags-index.js index b3387690160..90263cf8202 100644 --- a/app/assets/javascripts/discourse/app/routes/tags-index.js +++ b/app/assets/javascripts/discourse/app/routes/tags-index.js @@ -38,12 +38,6 @@ export default DiscourseRoute.extend({ }); }, - @action - didTransition() { - this.controllerFor("application").set("showFooter", true); - return true; - }, - @action showTagGroups() { this.router.transitionTo("tagGroups"); diff --git a/app/assets/javascripts/discourse/app/routes/topic.js b/app/assets/javascripts/discourse/app/routes/topic.js index a038cfbaafe..6a4539207af 100644 --- a/app/assets/javascripts/discourse/app/routes/topic.js +++ b/app/assets/javascripts/discourse/app/routes/topic.js @@ -248,7 +248,6 @@ const TopicRoute = DiscourseRoute.extend({ @action didTransition() { const controller = this.controllerFor("topic"); - controller._showFooter(); const topicId = controller.get("model.id"); setTopicId(topicId); return true; diff --git a/app/assets/javascripts/discourse/app/routes/tos.js b/app/assets/javascripts/discourse/app/routes/tos.js index a1fdaa3c8bd..af8beacc396 100644 --- a/app/assets/javascripts/discourse/app/routes/tos.js +++ b/app/assets/javascripts/discourse/app/routes/tos.js @@ -3,7 +3,6 @@ import { inject as service } from "@ember/service"; import DiscourseURL from "discourse/lib/url"; import StaticPage from "discourse/models/static-page"; import I18n from "I18n"; -import { action } from "@ember/object"; export default class TosRoute extends DiscourseRoute { @service siteSettings; @@ -27,10 +26,4 @@ export default class TosRoute extends DiscourseRoute { titleToken() { return I18n.t("tos"); } - - @action - didTransition() { - this.controllerFor("application").set("showFooter", true); - return true; - } } 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 5e6857816ea..3931f3a7283 100644 --- a/app/assets/javascripts/discourse/app/routes/user-activity-bookmarks.js +++ b/app/assets/javascripts/discourse/app/routes/user-activity-bookmarks.js @@ -52,12 +52,6 @@ export default DiscourseRoute.extend({ return I18n.t("user_action_groups.3"); }, - @action - didTransition() { - this.controllerFor("user-activity")._showFooter(); - return true; - }, - @action triggerRefresh() { this.refresh(); 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 c3ec009a7e7..60ae7ae6e6c 100644 --- a/app/assets/javascripts/discourse/app/routes/user-activity-drafts.js +++ b/app/assets/javascripts/discourse/app/routes/user-activity-drafts.js @@ -1,6 +1,5 @@ import DiscourseRoute from "discourse/routes/discourse"; import I18n from "I18n"; -import { action } from "@ember/object"; export default DiscourseRoute.extend({ templateName: "user/stream", @@ -35,10 +34,4 @@ export default DiscourseRoute.extend({ titleToken() { return I18n.t("user_action_groups.15"); }, - - @action - didTransition() { - this.controllerFor("user-activity")._showFooter(); - return true; - }, }); 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 0965c24d57c..b2a9a89a92d 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 @@ -2,7 +2,6 @@ import UserAction from "discourse/models/user-action"; import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; import { iconHTML } from "discourse-common/lib/icon-library"; import I18n from "I18n"; -import { action } from "@ember/object"; import { htmlSafe } from "@ember/template"; export default UserActivityStreamRoute.extend({ @@ -28,10 +27,4 @@ export default UserActivityStreamRoute.extend({ titleToken() { return I18n.t("user_action_groups.1"); }, - - @action - didTransition() { - this.controllerFor("application").set("showFooter", true); - return true; - }, }); 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 04ab75c18ed..e8b4f479786 100644 --- a/app/assets/javascripts/discourse/app/routes/user-activity-replies.js +++ b/app/assets/javascripts/discourse/app/routes/user-activity-replies.js @@ -1,7 +1,6 @@ import UserAction from "discourse/models/user-action"; import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; import I18n from "I18n"; -import { action } from "@ember/object"; import { htmlSafe } from "@ember/template"; import getURL from "discourse-common/lib/get-url"; @@ -32,10 +31,4 @@ export default UserActivityStreamRoute.extend({ titleToken() { return I18n.t("user_action_groups.5"); }, - - @action - didTransition() { - this.controllerFor("application").set("showFooter", true); - return true; - }, }); diff --git a/app/assets/javascripts/discourse/app/routes/user-activity-stream.js b/app/assets/javascripts/discourse/app/routes/user-activity-stream.js index 05d81f4c46c..4a56b27cc69 100644 --- a/app/assets/javascripts/discourse/app/routes/user-activity-stream.js +++ b/app/assets/javascripts/discourse/app/routes/user-activity-stream.js @@ -1,6 +1,5 @@ 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, { @@ -37,10 +36,4 @@ export default DiscourseRoute.extend(ViewingActionType, { const body = ""; return { title, body }; }, - - @action - didTransition() { - this.controllerFor("user-activity")._showFooter(); - return true; - }, }); diff --git a/app/assets/javascripts/discourse/app/routes/user-badges.js b/app/assets/javascripts/discourse/app/routes/user-badges.js index 852bf7fa459..b26bfbc5116 100644 --- a/app/assets/javascripts/discourse/app/routes/user-badges.js +++ b/app/assets/javascripts/discourse/app/routes/user-badges.js @@ -1,7 +1,6 @@ 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, { @@ -22,10 +21,4 @@ export default DiscourseRoute.extend(ViewingActionType, { titleToken() { return I18n.t("badges.title"); }, - - @action - didTransition() { - this.controllerFor("application").set("showFooter", true); - return true; - }, }); diff --git a/app/assets/javascripts/discourse/app/routes/user-deleted-posts.js b/app/assets/javascripts/discourse/app/routes/user-deleted-posts.js index e5a9e658997..81660cdfb12 100644 --- a/app/assets/javascripts/discourse/app/routes/user-deleted-posts.js +++ b/app/assets/javascripts/discourse/app/routes/user-deleted-posts.js @@ -1,7 +1,6 @@ import DiscourseRoute from "discourse/routes/discourse"; import { emojiUnescape } from "discourse/lib/text"; import { escapeExpression } from "discourse/lib/utilities"; -import { action } from "@ember/object"; export default class UserDeletedPosts extends DiscourseRoute { templateName = "user/posts"; @@ -26,10 +25,4 @@ export default class UserDeletedPosts extends DiscourseRoute { } }); } - - @action - didTransition() { - this.controller._showFooter(); - return true; - } } diff --git a/app/assets/javascripts/discourse/app/routes/user-notifications.js b/app/assets/javascripts/discourse/app/routes/user-notifications.js index d7a02592bf7..a8fc1129131 100644 --- a/app/assets/javascripts/discourse/app/routes/user-notifications.js +++ b/app/assets/javascripts/discourse/app/routes/user-notifications.js @@ -1,18 +1,11 @@ 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", queryParams: { filter: { refreshModel: true } }, - @action - didTransition() { - this.controllerFor("user-notifications")._showFooter(); - return true; - }, - model(params) { const username = this.modelFor("user").get("username"); diff --git a/app/assets/javascripts/discourse/app/routes/user-summary.js b/app/assets/javascripts/discourse/app/routes/user-summary.js index 7f06eabd8c9..7584fcf5433 100644 --- a/app/assets/javascripts/discourse/app/routes/user-summary.js +++ b/app/assets/javascripts/discourse/app/routes/user-summary.js @@ -2,8 +2,6 @@ import DiscourseRoute from "discourse/routes/discourse"; import I18n from "I18n"; export default DiscourseRoute.extend({ - showFooter: true, - model() { const user = this.modelFor("user"); if (user.get("profile_hidden")) { diff --git a/app/assets/javascripts/discourse/app/routes/users.js b/app/assets/javascripts/discourse/app/routes/users.js index 539021b4eb7..f211253fcc4 100644 --- a/app/assets/javascripts/discourse/app/routes/users.js +++ b/app/assets/javascripts/discourse/app/routes/users.js @@ -3,7 +3,6 @@ import I18n from "I18n"; import { ajax } from "discourse/lib/ajax"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { Promise } from "rsvp"; -import { action } from "@ember/object"; export default DiscourseRoute.extend({ queryParams: { @@ -60,10 +59,4 @@ export default DiscourseRoute.extend({ controller.loadUsers(model.params), ]); }, - - @action - didTransition() { - this.controllerFor("users")._showFooter(); - return true; - }, }); diff --git a/app/assets/javascripts/discourse/app/services/footer.js b/app/assets/javascripts/discourse/app/services/footer.js new file mode 100644 index 00000000000..0715e6e9bef --- /dev/null +++ b/app/assets/javascripts/discourse/app/services/footer.js @@ -0,0 +1,28 @@ +import Service from "@ember/service"; +import { disableImplicitInjections } from "discourse/lib/implicit-injections"; +import { tracked } from "@glimmer/tracking"; +import { registerDestructor } from "@ember/destroyable"; +import { TrackedSet } from "@ember-compat/tracked-built-ins"; + +@disableImplicitInjections +export default class FooterService extends Service { + #hiders = new TrackedSet(); + @tracked _showFooterOverride = null; + + get showFooter() { + return this._showFooterOverride ?? this.#hiders.size === 0; + } + + set showFooter(value) { + if (value === true) { + this._showFooterOverride = null; + } else { + this._showFooterOverride = value; + } + } + + registerHider(destroyable) { + this.#hiders.add(destroyable); + registerDestructor(destroyable, () => this.#hiders.delete(destroyable)); + } +} diff --git a/app/assets/javascripts/discourse/app/templates/badges/show.hbs b/app/assets/javascripts/discourse/app/templates/badges/show.hbs index 504dad0e2d4..f213b44aea2 100644 --- a/app/assets/javascripts/discourse/app/templates/badges/show.hbs +++ b/app/assets/javascripts/discourse/app/templates/badges/show.hbs @@ -1,3 +1,7 @@ +{{#if this.canLoadMore}} + {{hide-application-footer}} +{{/if}} +

{{i18n "badges.title"}} diff --git a/app/assets/javascripts/discourse/app/templates/discovery.hbs b/app/assets/javascripts/discourse/app/templates/discovery.hbs index 1777b6050ea..30eedae6107 100644 --- a/app/assets/javascripts/discourse/app/templates/discovery.hbs +++ b/app/assets/javascripts/discourse/app/templates/discovery.hbs @@ -24,6 +24,10 @@ +{{#if this.loading}} + {{hide-application-footer}} +{{/if}} + diff --git a/app/assets/javascripts/discourse/app/templates/discovery/topics.hbs b/app/assets/javascripts/discourse/app/templates/discovery/topics.hbs index 2f4b89f3d8d..6a76c596813 100644 --- a/app/assets/javascripts/discourse/app/templates/discovery/topics.hbs +++ b/app/assets/javascripts/discourse/app/templates/discovery/topics.hbs @@ -1,3 +1,7 @@ +{{#if (or this.loading this.model.canLoadMore)}} + {{hide-application-footer}} +{{/if}} + {{#if this.redirectedReason}}
{{this.redirectedReason}}
{{/if}} 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 139017a085f..e7e293183f7 100644 --- a/app/assets/javascripts/discourse/app/templates/full-page-search.hbs +++ b/app/assets/javascripts/discourse/app/templates/full-page-search.hbs @@ -1,3 +1,7 @@ +{{#if this.loading}} + {{hide-application-footer}} +{{/if}} +
{{#each this.model as |post|}} diff --git a/app/assets/javascripts/discourse/app/templates/group-index.hbs b/app/assets/javascripts/discourse/app/templates/group-index.hbs index 18e4b30b172..5ff4889eaa4 100644 --- a/app/assets/javascripts/discourse/app/templates/group-index.hbs +++ b/app/assets/javascripts/discourse/app/templates/group-index.hbs @@ -1,3 +1,7 @@ +{{#if (or this.loading this.canLoadMore)}} + {{hide-application-footer}} +{{/if}} +
diff --git a/app/assets/javascripts/discourse/app/templates/group-requests.hbs b/app/assets/javascripts/discourse/app/templates/group-requests.hbs index 0767ce55f3d..882bec7e7cf 100644 --- a/app/assets/javascripts/discourse/app/templates/group-requests.hbs +++ b/app/assets/javascripts/discourse/app/templates/group-requests.hbs @@ -1,3 +1,7 @@ +{{#if (or this.loading this.canLoadMore)}} + {{hide-application-footer}} +{{/if}} +
diff --git a/app/assets/javascripts/discourse/app/templates/group/manage/logs.hbs b/app/assets/javascripts/discourse/app/templates/group/manage/logs.hbs index 662ae8669ba..ddd2a0350bc 100644 --- a/app/assets/javascripts/discourse/app/templates/group/manage/logs.hbs +++ b/app/assets/javascripts/discourse/app/templates/group/manage/logs.hbs @@ -1,3 +1,7 @@ +{{#unless this.model.all_loaded}} + {{hide-application-footer}} +{{/unless}} + {{#if this.model.logs}}
diff --git a/app/assets/javascripts/discourse/app/templates/loading.hbs b/app/assets/javascripts/discourse/app/templates/loading.hbs index 91608f973e2..867cde03563 100644 --- a/app/assets/javascripts/discourse/app/templates/loading.hbs +++ b/app/assets/javascripts/discourse/app/templates/loading.hbs @@ -1 +1,2 @@ -{{loading-spinner}} \ No newline at end of file +{{loading-spinner}} +{{hide-application-footer}} \ No newline at end of file diff --git a/app/assets/javascripts/discourse/app/templates/mobile/discovery/topics.hbs b/app/assets/javascripts/discourse/app/templates/mobile/discovery/topics.hbs index 32eb6348fbe..1e9558ffc14 100644 --- a/app/assets/javascripts/discourse/app/templates/mobile/discovery/topics.hbs +++ b/app/assets/javascripts/discourse/app/templates/mobile/discovery/topics.hbs @@ -1,3 +1,7 @@ +{{#if (or this.loading this.model.canLoadMore)}} + {{hide-application-footer}} +{{/if}} + + {{else}} + {{hide-application-footer}} {{/if}} \ No newline at end of file diff --git a/app/assets/javascripts/discourse/app/templates/tag/show.hbs b/app/assets/javascripts/discourse/app/templates/tag/show.hbs index 53289e6c310..8a9bd7ebf4c 100644 --- a/app/assets/javascripts/discourse/app/templates/tag/show.hbs +++ b/app/assets/javascripts/discourse/app/templates/tag/show.hbs @@ -1,3 +1,7 @@ +{{#if this.list.canLoadMore}} + {{hide-application-footer}} +{{/if}} +
diff --git a/app/assets/javascripts/discourse/app/templates/user/posts.hbs b/app/assets/javascripts/discourse/app/templates/user/posts.hbs index 5068aff9f17..2459802c51e 100644 --- a/app/assets/javascripts/discourse/app/templates/user/posts.hbs +++ b/app/assets/javascripts/discourse/app/templates/user/posts.hbs @@ -1 +1,5 @@ +{{#if this.model.canLoadMore}} + {{hide-application-footer}} +{{/if}} + \ No newline at end of file diff --git a/app/assets/javascripts/discourse/app/templates/user/stream.hbs b/app/assets/javascripts/discourse/app/templates/user/stream.hbs index 56759cae442..a86b9da1b85 100644 --- a/app/assets/javascripts/discourse/app/templates/user/stream.hbs +++ b/app/assets/javascripts/discourse/app/templates/user/stream.hbs @@ -1,3 +1,7 @@ +{{#if (or this.loading this.model.stream.canLoadMore)}} + {{hide-application-footer}} +{{/if}} + {{#if this.model.stream.noContent}} {{#if this.showCanvas}}