124 lines
3.5 KiB
JavaScript
124 lines
3.5 KiB
JavaScript
import { filter } from "@ember/object/computed";
|
|
import Component from "@ember/component";
|
|
import discourseComputed from "discourse-common/utils/decorators";
|
|
import deprecated from "discourse-common/lib/deprecated";
|
|
|
|
// A breadcrumb including category drop downs
|
|
export default Component.extend({
|
|
classNameBindings: ["hidden:hidden", ":category-breadcrumb"],
|
|
tagName: "ol",
|
|
|
|
@discourseComputed("categories")
|
|
filteredCategories(categories) {
|
|
return categories.filter(
|
|
category =>
|
|
this.siteSettings.allow_uncategorized_topics ||
|
|
category.id !== this.site.uncategorized_category_id
|
|
);
|
|
},
|
|
|
|
@discourseComputed(
|
|
"category.ancestors",
|
|
"filteredCategories",
|
|
"noSubcategories"
|
|
)
|
|
categoryBreadcrumbs(categoryAncestors, filteredCategories, noSubcategories) {
|
|
categoryAncestors = categoryAncestors || [];
|
|
const parentCategories = [undefined, ...categoryAncestors];
|
|
const categories = [...categoryAncestors, undefined];
|
|
const zipped = parentCategories.map((x, i) => [x, categories[i]]);
|
|
|
|
return zipped.map(record => {
|
|
const [parentCategory, category] = record;
|
|
|
|
const options = filteredCategories.filter(
|
|
c =>
|
|
c.get("parentCategory.id") === (parentCategory && parentCategory.id)
|
|
);
|
|
|
|
return {
|
|
category,
|
|
parentCategory,
|
|
options,
|
|
isSubcategory: !!parentCategory,
|
|
noSubcategories: !category && noSubcategories,
|
|
hasOptions: options.length !== 0
|
|
};
|
|
});
|
|
},
|
|
|
|
@discourseComputed("category")
|
|
parentCategory(category) {
|
|
deprecated(
|
|
"The parentCategory property of the bread-crumbs component is deprecated"
|
|
);
|
|
return category && category.parentCategory;
|
|
},
|
|
|
|
parentCategories: filter("categories", function(c) {
|
|
deprecated(
|
|
"The parentCategories property of the bread-crumbs component is deprecated"
|
|
);
|
|
if (
|
|
c.id === this.site.get("uncategorized_category_id") &&
|
|
!this.siteSettings.allow_uncategorized_topics
|
|
) {
|
|
// Don't show "uncategorized" if allow_uncategorized_topics setting is false.
|
|
return false;
|
|
}
|
|
|
|
return !c.get("parentCategory");
|
|
}),
|
|
|
|
@discourseComputed("parentCategories")
|
|
parentCategoriesSorted(parentCategories) {
|
|
deprecated(
|
|
"The parentCategoriesSorted property of the bread-crumbs component is deprecated"
|
|
);
|
|
if (this.siteSettings.fixed_category_positions) {
|
|
return parentCategories;
|
|
}
|
|
|
|
return parentCategories.sortBy("totalTopicCount").reverse();
|
|
},
|
|
|
|
@discourseComputed("category")
|
|
hidden(category) {
|
|
return this.site.mobileView && !category;
|
|
},
|
|
|
|
@discourseComputed("category", "parentCategory")
|
|
firstCategory(category, parentCategory) {
|
|
deprecated(
|
|
"The firstCategory property of the bread-crumbs component is deprecated"
|
|
);
|
|
return parentCategory || category;
|
|
},
|
|
|
|
@discourseComputed("category", "parentCategory")
|
|
secondCategory(category, parentCategory) {
|
|
deprecated(
|
|
"The secondCategory property of the bread-crumbs component is deprecated"
|
|
);
|
|
return parentCategory && category;
|
|
},
|
|
|
|
@discourseComputed("firstCategory", "hideSubcategories")
|
|
childCategories(firstCategory, hideSubcategories) {
|
|
deprecated(
|
|
"The childCategories property of the bread-crumbs component is deprecated"
|
|
);
|
|
if (hideSubcategories) {
|
|
return [];
|
|
}
|
|
|
|
if (!firstCategory) {
|
|
return [];
|
|
}
|
|
|
|
return this.categories.filter(
|
|
c => c.get("parentCategory") === firstCategory
|
|
);
|
|
}
|
|
});
|