diff --git a/app/assets/javascripts/discourse/app/controllers/discovery-sortable.js b/app/assets/javascripts/discourse/app/controllers/discovery-sortable.js index 8d02ca3c3b4..4fab6af6fa7 100644 --- a/app/assets/javascripts/discourse/app/controllers/discovery-sortable.js +++ b/app/assets/javascripts/discourse/app/controllers/discovery-sortable.js @@ -13,6 +13,7 @@ export const queryParams = { before: { replace: true, refreshModel: true }, bumped_before: { replace: true, refreshModel: true }, f: { replace: true, refreshModel: true }, + period: { replace: true, refreshModel: true }, }; // Basic controller options diff --git a/app/assets/javascripts/discourse/app/controllers/discovery.js b/app/assets/javascripts/discourse/app/controllers/discovery.js index 9f2993a6ae2..4a09895ece9 100644 --- a/app/assets/javascripts/discourse/app/controllers/discovery.js +++ b/app/assets/javascripts/discourse/app/controllers/discovery.js @@ -37,9 +37,10 @@ export default Controller.extend({ }/l`; } - url += "/top/" + period; + url += "/top"; - const queryParams = this.router.currentRoute.queryParams; + let queryParams = this.router.currentRoute.queryParams; + queryParams.period = period; if (Object.keys(queryParams).length) { url = `${url}?` + diff --git a/app/assets/javascripts/discourse/app/controllers/discovery/topics.js b/app/assets/javascripts/discourse/app/controllers/discovery/topics.js index 99afc1dedab..35ab378f494 100644 --- a/app/assets/javascripts/discourse/app/controllers/discovery/topics.js +++ b/app/assets/javascripts/discourse/app/controllers/discovery/topics.js @@ -1,12 +1,4 @@ -import { - alias, - empty, - equal, - gt, - not, - notEmpty, - readOnly, -} from "@ember/object/computed"; +import { alias, empty, equal, gt, not, readOnly } from "@ember/object/computed"; import BulkTopicSelection from "discourse/mixins/bulk-topic-selection"; import DiscoveryController from "discourse/controllers/discovery"; import I18n from "I18n"; @@ -140,7 +132,7 @@ const controllerOpts = { allLoaded: empty("model.more_topics_url"), latest: endWith("model.filter", "latest"), new: endWith("model.filter", "new"), - top: notEmpty("period"), + top: endWith("model.filter", "top"), yearly: equal("period", "yearly"), quarterly: equal("period", "quarterly"), monthly: equal("period", "monthly"), diff --git a/app/assets/javascripts/discourse/app/controllers/tag-show.js b/app/assets/javascripts/discourse/app/controllers/tag-show.js index 76b7d070cb5..dae9fe28949 100644 --- a/app/assets/javascripts/discourse/app/controllers/tag-show.js +++ b/app/assets/javascripts/discourse/app/controllers/tag-show.js @@ -8,6 +8,7 @@ import Topic from "discourse/models/topic"; import { alias } from "@ember/object/computed"; import bootbox from "bootbox"; import { queryParams } from "discourse/controllers/discovery-sortable"; +import { endWith } from "discourse/lib/computed"; export default Controller.extend(BulkTopicSelection, FilterModeMixin, { application: controller(), @@ -27,6 +28,8 @@ export default Controller.extend(BulkTopicSelection, FilterModeMixin, { max_posts: null, q: null, showInfo: false, + top: endWith("list.filter", "top"), + period: alias("list.for_period"), @discourseComputed( "canCreateTopic", @@ -131,8 +134,30 @@ export default Controller.extend(BulkTopicSelection, FilterModeMixin, { this.setProperties({ order, ascending: false }); } + let params = { order, ascending: this.ascending }; + if (this.period) { + params.period = this.period; + } + this.transitionToRoute({ - queryParams: { order, ascending: this.ascending }, + queryParams: params, + }); + }, + + changePeriod(p) { + this.set("period", p); + + let params = { period: this.period }; + + if (!(this.order === "default" && this.ascending === false)) { + params = Object.assign(params, { + order: this.order, + ascending: this.ascending, + }); + } + + this.transitionToRoute({ + queryParams: params, }); }, diff --git a/app/assets/javascripts/discourse/app/mixins/filter-mode.js b/app/assets/javascripts/discourse/app/mixins/filter-mode.js index 22f30609688..ab5c23e6527 100644 --- a/app/assets/javascripts/discourse/app/mixins/filter-mode.js +++ b/app/assets/javascripts/discourse/app/mixins/filter-mode.js @@ -36,13 +36,7 @@ export default Mixin.create({ set(key, value) { this.set("rawFilterMode", value); - const parts = value.split("/"); - - if (parts.length >= 2 && parts[parts.length - 2] === "top") { - this.set("filterType", "top"); - } else { - this.set("filterType", parts.pop()); - } + this.set("filterType", value.split("/").pop()); return value; }, diff --git a/app/assets/javascripts/discourse/app/pre-initializers/dynamic-route-builders.js b/app/assets/javascripts/discourse/app/pre-initializers/dynamic-route-builders.js index 654d525cc2a..b408917c6ce 100644 --- a/app/assets/javascripts/discourse/app/pre-initializers/dynamic-route-builders.js +++ b/app/assets/javascripts/discourse/app/pre-initializers/dynamic-route-builders.js @@ -34,7 +34,18 @@ export default { app[ `Discovery${filterCapitalized}CategoryNoneController` ] = DiscoverySortableController.extend(); - if (filter !== "top") { + + if (filter === "top") { + app.DiscoveryTopRoute = buildTopicRoute("top", { + actions: { + willTransition() { + User.currentProp("should_be_redirected_to_top", false); + User.currentProp("redirected_to_top.reason", null); + return this._super(...arguments); + }, + }, + }); + } else { app[`Discovery${filterCapitalized}Route`] = buildTopicRoute(filter); } @@ -46,38 +57,6 @@ export default { ] = buildCategoryRoute(filter, { no_subcategories: true }); }); - app.DiscoveryTopRoute = buildTopicRoute("top", { - actions: { - willTransition() { - User.currentProp("should_be_redirected_to_top", false); - User.currentProp("redirected_to_top.reason", null); - return this._super(...arguments); - }, - }, - }); - - site.get("periods").forEach((period) => { - const periodCapitalized = period.capitalize(); - app[ - `DiscoveryTop${periodCapitalized}Controller` - ] = DiscoverySortableController.extend(); - app[ - `DiscoveryTop${periodCapitalized}CategoryController` - ] = DiscoverySortableController.extend(); - app[ - `DiscoveryTop${periodCapitalized}CategoryNoneController` - ] = DiscoverySortableController.extend(); - app[`DiscoveryTop${periodCapitalized}Route`] = buildTopicRoute( - "top/" + period - ); - app[`DiscoveryTop${periodCapitalized}CategoryRoute`] = buildCategoryRoute( - "top/" + period - ); - app[ - `DiscoveryTop${periodCapitalized}CategoryNoneRoute` - ] = buildCategoryRoute("top/" + period, { no_subcategories: true }); - }); - app["TagsShowCategoryRoute"] = TagShowRoute.extend(); app["TagsShowCategoryNoneRoute"] = TagShowRoute.extend({ noSubcategories: true, diff --git a/app/assets/javascripts/discourse/app/routes/app-route-map.js b/app/assets/javascripts/discourse/app/routes/app-route-map.js index 6ccf9c94bdd..9bbb446410b 100644 --- a/app/assets/javascripts/discourse/app/routes/app-route-map.js +++ b/app/assets/javascripts/discourse/app/routes/app-route-map.js @@ -27,14 +27,7 @@ export default function () { }); this.route("discovery", { path: "/", resetNamespace: true }, function () { - // top - this.route("top"); - this.route("topCategoryNone", { - path: "/c/*category_slug_path_with_id/none/l/top", - }); - this.route("topCategory", { path: "/c/*category_slug_path_with_id/l/top" }); - - // top by periods + // top by periods - legacy route Site.currentProp("periods").forEach((period) => { const top = "top" + period.capitalize(); @@ -47,7 +40,7 @@ export default function () { }); }); - // filters (e.g. bookmarks, posted, read, unread, latest) + // filters (e.g. bookmarks, posted, read, unread, latest, top) Site.currentProp("filters").forEach((filter) => { this.route(filter, { path: "/" + filter }); this.route(filter + "CategoryNone", { diff --git a/app/assets/javascripts/discourse/app/routes/build-category-route.js b/app/assets/javascripts/discourse/app/routes/build-category-route.js index efb6f6c5f40..838be1dc283 100644 --- a/app/assets/javascripts/discourse/app/routes/build-category-route.js +++ b/app/assets/javascripts/discourse/app/routes/build-category-route.js @@ -148,8 +148,7 @@ export default (filterArg, params) => { category = model.category, canCreateTopic = topics.get("can_create_topic"), canCreateTopicOnCategory = - canCreateTopic && category.get("permission") === PermissionType.FULL, - filter = this.filter(category); + canCreateTopic && category.get("permission") === PermissionType.FULL; this.controllerFor("navigation/category").setProperties({ canCreateTopicOnCategory: canCreateTopicOnCategory, @@ -162,7 +161,7 @@ export default (filterArg, params) => { category, period: topics.get("for_period") || - (filter.indexOf("/") > 0 ? filter.split("/")[1] : ""), + (model.modelParams && model.modelParams.period), selected: [], noSubcategories: params && !!params.no_subcategories, expandAllPinned: true, diff --git a/app/assets/javascripts/discourse/app/routes/build-topic-route.js b/app/assets/javascripts/discourse/app/routes/build-topic-route.js index 6a20e58d0fa..3905e922bbd 100644 --- a/app/assets/javascripts/discourse/app/routes/build-topic-route.js +++ b/app/assets/javascripts/discourse/app/routes/build-topic-route.js @@ -130,9 +130,7 @@ export default function (filter, extras) { const topicOpts = { model, category: null, - period: - model.get("for_period") || - (filter.indexOf("top/") >= 0 ? filter.split("/")[1] : ""), + period: model.get("for_period") || model.get("params.period"), selected: [], expandAllPinned: false, expandGloballyPinned: true, diff --git a/app/assets/javascripts/discourse/app/routes/discovery.js b/app/assets/javascripts/discourse/app/routes/discovery.js index 8c69cf10f25..053432a8ade 100644 --- a/app/assets/javascripts/discourse/app/routes/discovery.js +++ b/app/assets/javascripts/discourse/app/routes/discovery.js @@ -7,6 +7,7 @@ import OpenComposer from "discourse/mixins/open-composer"; import User from "discourse/models/user"; import { scrollTop } from "discourse/mixins/scroll-top"; import { setTopicList } from "discourse/lib/topic-list-tracker"; +import Site from "discourse/models/site"; export default DiscourseRoute.extend(OpenComposer, { queryParams: { @@ -19,6 +20,7 @@ export default DiscourseRoute.extend(OpenComposer, { beforeModel(transition) { const url = transition.intent.url; + let matches; if ( (url === "/" || url === "/latest" || url === "/categories") && transition.targetName.indexOf("discovery.top") === -1 && @@ -26,7 +28,19 @@ export default DiscourseRoute.extend(OpenComposer, { ) { User.currentProp("should_be_redirected_to_top", false); const period = User.currentProp("redirected_to_top.period") || "all"; - this.replaceWith(`discovery.top${period.capitalize()}`); + this.replaceWith("discovery.top", { + queryParams: { + period: period, + }, + }); + } else if (url && (matches = url.match(/top\/(.*)$/))) { + if (Site.currentProp("periods").includes(matches[1])) { + this.replaceWith("discovery.top", { + queryParams: { + period: matches[1], + }, + }); + } } }, diff --git a/app/assets/javascripts/discourse/app/templates/tags/show.hbs b/app/assets/javascripts/discourse/app/templates/tags/show.hbs index 3a3438dde7e..25ac3540cfb 100644 --- a/app/assets/javascripts/discourse/app/templates/tags/show.hbs +++ b/app/assets/javascripts/discourse/app/templates/tags/show.hbs @@ -45,21 +45,26 @@
{{#unless loading}} - {{#if list.topics}} - {{#discovery-topics-list - model=list - refresh=(action "refresh") - autoAddTopicsToBulkSelect=autoAddTopicsToBulkSelect - bulkSelectEnabled=bulkSelectEnabled - addTopicsToBulkSelect=(action "addTopicsToBulkSelect") - as |discoveryTopicList| + {{#discovery-topics-list + model=list + refresh=(action "refresh") + autoAddTopicsToBulkSelect=autoAddTopicsToBulkSelect + bulkSelectEnabled=bulkSelectEnabled + addTopicsToBulkSelect=(action "addTopicsToBulkSelect") + as |discoveryTopicList| + }} + {{#if top}} +
+ {{period-chooser period=period action=(action "changePeriod") fullDay=false}} +
+ {{/if}} + {{bulk-select-button + selected=selected + action=(action "refresh") + category=category }} - {{bulk-select-button - selected=selected - action=(action "refresh") - category=category - }} + {{#if list.topics}} {{topic-list topics=list.topics canBulkSelect=canBulkSelect @@ -74,8 +79,8 @@ onScroll=discoveryTopicList.saveScrollPosition scrollOnLoad=true }} - {{/discovery-topics-list}} - {{/if}} + {{/if}} + {{/discovery-topics-list}}