diff --git a/app/assets/javascripts/discourse/app/components/edit-category-settings.js b/app/assets/javascripts/discourse/app/components/edit-category-settings.js index 5844e45d0c4..c811ce2db6e 100644 --- a/app/assets/javascripts/discourse/app/components/edit-category-settings.js +++ b/app/assets/javascripts/discourse/app/components/edit-category-settings.js @@ -68,6 +68,13 @@ export default buildCategoryPanel("settings", { ); }, + @discourseComputed + availableListFilters() { + return ["all", "none"].map(p => { + return { name: I18n.t(`category.list_filters.${p}`), value: p }; + }); + }, + @discourseComputed searchPrioritiesOptions() { const options = []; diff --git a/app/assets/javascripts/discourse/app/models/category.js b/app/assets/javascripts/discourse/app/models/category.js index 2c0442a4703..7d950cae2c4 100644 --- a/app/assets/javascripts/discourse/app/models/category.js +++ b/app/assets/javascripts/discourse/app/models/category.js @@ -188,7 +188,8 @@ const Category = RestModel.extend({ ), search_priority: this.search_priority, reviewable_by_group_name: this.reviewable_by_group_name, - read_only_banner: this.read_only_banner + read_only_banner: this.read_only_banner, + default_list_filter: this.default_list_filter }, type: id ? "PUT" : "POST" }); 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 9c96d01e429..47626918f03 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 @@ -13,6 +13,7 @@ export default { app.DiscoveryCategoryController = DiscoverySortableController.extend(); app.DiscoveryParentCategoryController = DiscoverySortableController.extend(); app.DiscoveryCategoryNoneController = DiscoverySortableController.extend(); + app.DiscoveryCategoryAllController = DiscoverySortableController.extend(); app.DiscoveryCategoryWithIDController = DiscoverySortableController.extend(); app.DiscoveryCategoryRoute = buildCategoryRoute("default"); @@ -20,6 +21,9 @@ export default { app.DiscoveryCategoryNoneRoute = buildCategoryRoute("default", { no_subcategories: true }); + app.DiscoveryCategoryAllRoute = buildCategoryRoute("default", { + no_subcategories: false + }); app.DiscoveryCategoryWithIDRoute = buildCategoryRoute("default"); const site = Site.current(); 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 fb13822bb26..9057ff2fe50 100644 --- a/app/assets/javascripts/discourse/app/routes/app-route-map.js +++ b/app/assets/javascripts/discourse/app/routes/app-route-map.js @@ -70,6 +70,7 @@ export default function() { // default filter for a category this.route("categoryNone", { path: "/c/*category_slug_path_with_id/none" }); + this.route("categoryAll", { path: "/c/*category_slug_path_with_id/all" }); this.route("category", { path: "/c/*category_slug_path_with_id" }); }); 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 eac84d84849..58e5584fd21 100644 --- a/app/assets/javascripts/discourse/app/routes/build-category-route.js +++ b/app/assets/javascripts/discourse/app/routes/build-category-route.js @@ -30,6 +30,11 @@ export default (filterArg, params) => { category, category_slug_path_with_id }); + } else if (modelParams.id === "all") { + modelParams.category_slug_path_with_id = [ + modelParams.parentSlug, + modelParams.slug + ].join("/"); } else { modelParams.category_slug_path_with_id = [ modelParams.parentSlug, @@ -76,10 +81,24 @@ export default (filterArg, params) => { return; } - this._setupNavigation(model.category); + const { category, modelParams } = model; + + if ( + category.default_list_filter === "none" && + filterArg === "default" && + modelParams && + modelParams.id !== "all" + ) { + this.replaceWith("discovery.categoryNone", { + category, + category_slug_path_with_id: modelParams.category_slug_path_with_id + }); + } + + this._setupNavigation(category); return all([ - this._createSubcategoryList(model.category), - this._retrieveTopicList(model.category, transition, model.modelParams) + this._createSubcategoryList(category), + this._retrieveTopicList(category, transition, modelParams) ]); }, diff --git a/app/assets/javascripts/discourse/app/templates/components/edit-category-settings.hbs b/app/assets/javascripts/discourse/app/templates/components/edit-category-settings.hbs index ab17a307c33..a569876fd8c 100644 --- a/app/assets/javascripts/discourse/app/templates/components/edit-category-settings.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/edit-category-settings.hbs @@ -196,6 +196,21 @@ {{/unless}} + +
+ +
+ {{combo-box + id="category-default-filter" + valueProperty="value" + content=availableListFilters + value=category.default_list_filter + }} +
+
+ {{#if isParentCategory}}