diff --git a/app/assets/javascripts/discourse/app/initializers/dynamic-route-builders.js b/app/assets/javascripts/discourse/app/initializers/dynamic-route-builders.js index cf3fede0d15..831da1e7015 100644 --- a/app/assets/javascripts/discourse/app/initializers/dynamic-route-builders.js +++ b/app/assets/javascripts/discourse/app/initializers/dynamic-route-builders.js @@ -1,6 +1,6 @@ import DiscoverySortableController from "discourse/controllers/discovery-sortable"; import Site from "discourse/models/site"; -import TagShowRoute from "discourse/routes/tag-show"; +import { buildTagRoute } from "discourse/routes/tag-show"; import buildCategoryRoute from "discourse/routes/build-category-route"; import buildTopicRoute from "discourse/routes/build-topic-route"; import { dasherize } from "@ember/string"; @@ -66,16 +66,16 @@ export default { ); }); - app.register("route:tags.show-category", TagShowRoute.extend()); + app.register("route:tags.show-category", buildTagRoute()); app.register( "route:tags.show-category-none", - TagShowRoute.extend({ + buildTagRoute({ noSubcategories: true, }) ); app.register( "route:tags.show-category-all", - TagShowRoute.extend({ + buildTagRoute({ noSubcategories: false, }) ); @@ -85,21 +85,21 @@ export default { app.register( `route:tag.show-${filterDasherized}`, - TagShowRoute.extend({ + buildTagRoute({ navMode: filter, }) ); app.register( `route:tags.show-category-${filterDasherized}`, - TagShowRoute.extend({ navMode: filter }) + buildTagRoute({ navMode: filter }) ); app.register( `route:tags.show-category-none-${filterDasherized}`, - TagShowRoute.extend({ navMode: filter, noSubcategories: true }) + buildTagRoute({ navMode: filter, noSubcategories: true }) ); app.register( `route:tags.show-category-all-${filterDasherized}`, - TagShowRoute.extend({ navMode: filter, noSubcategories: false }) + buildTagRoute({ navMode: filter, noSubcategories: false }) ); }); }, diff --git a/app/assets/javascripts/discourse/app/routes/tag-show.js b/app/assets/javascripts/discourse/app/routes/tag-show.js index f5907b8ca56..27e6c8c7a44 100644 --- a/app/assets/javascripts/discourse/app/routes/tag-show.js +++ b/app/assets/javascripts/discourse/app/routes/tag-show.js @@ -1,3 +1,4 @@ +import { inject as service } from "@ember/service"; import { filterQueryParams, findTopicList, @@ -17,21 +18,27 @@ import { setTopicList } from "discourse/lib/topic-list-tracker"; import showModal from "discourse/lib/show-modal"; import { action } from "@ember/object"; import PreloadStore from "discourse/lib/preload-store"; -import { inject as service } from "@ember/service"; const NONE = "none"; const ALL = "all"; -export default DiscourseRoute.extend({ - composer: service(), - router: service(), - currentUser: service(), - navMode: "latest", +export default class TagShowRoute extends DiscourseRoute { + @service composer; + @service router; + @service currentUser; - queryParams, + queryParams = queryParams; + controllerName = "tag.show"; + templateName = "tag.show"; + routeConfig = {}; - controllerName: "tag.show", - templateName: "tag.show", + get navMode() { + return this.routeConfig.navMode || "latest"; + } + + get noSubcategories() { + return this.routeConfig.noSubcategories; + } beforeModel() { const controller = this.controllerFor("tag.show"); @@ -39,7 +46,7 @@ export default DiscourseRoute.extend({ loading: true, showInfo: false, }); - }, + } async model(params, transition) { const tag = this.store.createRecord("tag", { @@ -138,7 +145,7 @@ export default DiscourseRoute.extend({ canCreateTopicOnCategory: category?.permission === PermissionType.FULL, canCreateTopicOnTag: !tag.staff || this.currentUser?.staff, }; - }, + } setupController(controller, model) { const noSubcategories = this.noSubcategories; @@ -166,7 +173,7 @@ export default DiscourseRoute.extend({ } else { this.searchService.searchContext = model.tag.searchContext; } - }, + } titleToken() { const filterText = I18n.t( @@ -199,17 +206,17 @@ export default DiscourseRoute.extend({ }); } } - }, + } deactivate() { - this._super(...arguments); + super.deactivate(...arguments); this.searchService.searchContext = null; - }, + } @action renameTag(tag) { showModal("rename-tag", { model: tag }); - }, + } @action createTopic() { @@ -231,13 +238,13 @@ export default DiscourseRoute.extend({ } }); } - }, + } @action dismissReadTopics(dismissTopics) { const operationType = dismissTopics ? "topics" : "posts"; this.send("dismissRead", operationType); - }, + } @action dismissRead(operationType) { @@ -256,16 +263,22 @@ export default DiscourseRoute.extend({ } controller.send("dismissRead", operationType, options); - }, + } @action resetParams(skipParams = []) { resetParams.call(this, skipParams); - }, + } _controllerTags(controller) { return [controller.get("model.id"), ...makeArray(controller.additionalTags)] .filter(Boolean) .filter((tag) => ![NONE, ALL].includes(tag)); - }, -}); + } +} + +export function buildTagRoute(routeConfig = {}) { + return class extends TagShowRoute { + routeConfig = routeConfig; + }; +} diff --git a/app/assets/javascripts/discourse/app/routes/tags-intersection.js b/app/assets/javascripts/discourse/app/routes/tags-intersection.js index 7dd65e72b1c..4d9653d50cf 100644 --- a/app/assets/javascripts/discourse/app/routes/tags-intersection.js +++ b/app/assets/javascripts/discourse/app/routes/tags-intersection.js @@ -1,6 +1,6 @@ -import TagShowRoute from "discourse/routes/tag-show"; +import { buildTagRoute } from "discourse/routes/tag-show"; -export default TagShowRoute.extend({}); +export default buildTagRoute(); // The tags-intersection route is exactly the same as the tags-show route, but the wildcard at the // end of the route (*additional_tags) will cause a match when query parameters are present,