mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-10 16:05:49 +01:00
Categories refactor (#9257)
* feat: wip categories pagination * feat: add subCategoriesPerPage setting * feat: add load more sub categories button to category page * fix: openapi spec * feat: show sub categories left on category page hide button when no more categories left * breaking: rename categories to allCategories on /search categories contains the search results * fix: spec * refactor: remove cidsPerPage * fix: tests * feat: use component for subcategories * fix: prevent negative subCategoriesLeft * feat: new category filter/search WIP * feat: remove categories from /tag * fix: dont load all categories when showing move modal * feat: allow adding custom categories to list * breaking: dont load entire category tree on post queue removed unused code add hooks to filter/selector add options to filter/selector * feat: make selector modal work again * feat: replace old search module * fix: topic move selector * feat: dont load all categories on create category modal * fix: fix more categorySelectors * feat: dont load entire category tree on group details page * feat: dont load all categories on home page and user settings page * feat: add pagination to /user/:userslug/categories * fix: update schemas * fix: more tests * fix: test * feat: flags page, dont return entire category tree * fix: flag test * feat: categories manage page dont load all categories allow changing root category clear caches properly * fix: spec * feat: admins&mods page dont load all categories * fix: spec * fix: dont load all children when opening dropdown * fix: on search results dont return all children * refactor: pass all options, rename options.cids to options.selectedCids * fix: #9266 * fix: index 0 * fix: spec * feat: #9265, add setObjectBulk * refactor: shoter updateOrder * feat: selectors on categories/category * fix: tests and search filter * fix: category update test * feat: pagination on acp categories page show order in set order modal * fix: allow drag&drop on pages > 1 in /admin/manage/categories * fix: teasers for deep nested categories fix sub category display on /category page * fix: spec * refactor: use eslint-disable-next-line * refactor: shorter
This commit is contained in:
committed by
GitHub
parent
2cfab3678e
commit
47299ea587
@@ -71,6 +71,7 @@ Categories.getAllCidsFromSet = async function (key) {
|
||||
}
|
||||
|
||||
cids = await db.getSortedSetRange(key, 0, -1);
|
||||
cids = cids.map(cid => parseInt(cid, 10));
|
||||
cache.set(key, cids);
|
||||
return cids.slice();
|
||||
};
|
||||
@@ -229,6 +230,19 @@ async function getChildrenTree(category, uid) {
|
||||
|
||||
Categories.getChildrenTree = getChildrenTree;
|
||||
|
||||
Categories.getParentCids = async function (currentCid) {
|
||||
let cid = currentCid;
|
||||
const parents = [];
|
||||
while (parseInt(cid, 10)) {
|
||||
// eslint-disable-next-line
|
||||
cid = await Categories.getCategoryField(cid, 'parentCid');
|
||||
if (cid) {
|
||||
parents.unshift(cid);
|
||||
}
|
||||
}
|
||||
return parents;
|
||||
};
|
||||
|
||||
Categories.getChildrenCids = async function (rootCid) {
|
||||
let allCids = [];
|
||||
async function recursive(keys) {
|
||||
@@ -243,7 +257,7 @@ Categories.getChildrenCids = async function (rootCid) {
|
||||
await recursive(keys);
|
||||
}
|
||||
const key = 'cid:' + rootCid + ':children';
|
||||
const cacheKey = 'cache:' + key;
|
||||
const cacheKey = key + ':all';
|
||||
const childrenCids = cache.get(cacheKey);
|
||||
if (childrenCids) {
|
||||
return childrenCids.slice();
|
||||
@@ -311,10 +325,17 @@ Categories.getTree = function (categories, parentCid) {
|
||||
}
|
||||
});
|
||||
function sortTree(tree) {
|
||||
tree.sort((a, b) => a.order - b.order);
|
||||
if (tree.children) {
|
||||
sortTree(tree.children);
|
||||
}
|
||||
tree.sort((a, b) => {
|
||||
if (a.order !== b.order) {
|
||||
return a.order - b.order;
|
||||
}
|
||||
return a.cid - b.cid;
|
||||
});
|
||||
tree.forEach((category) => {
|
||||
if (category && Array.isArray(category.children)) {
|
||||
sortTree(category.children);
|
||||
}
|
||||
});
|
||||
}
|
||||
sortTree(tree);
|
||||
|
||||
@@ -338,7 +359,7 @@ async function getSelectData(cids, fields) {
|
||||
return Categories.buildForSelectCategories(tree, fields);
|
||||
}
|
||||
|
||||
Categories.buildForSelectCategories = function (categories, fields) {
|
||||
Categories.buildForSelectCategories = function (categories, fields, parentCid) {
|
||||
function recursive(category, categoriesData, level, depth) {
|
||||
const bullet = level ? '• ' : '';
|
||||
category.value = category.cid;
|
||||
@@ -350,10 +371,10 @@ Categories.buildForSelectCategories = function (categories, fields) {
|
||||
category.children.forEach(child => recursive(child, categoriesData, ' ' + level, depth + 1));
|
||||
}
|
||||
}
|
||||
|
||||
parentCid = parentCid || 0;
|
||||
const categoriesData = [];
|
||||
|
||||
const rootCategories = categories.filter(category => category && !category.parentCid);
|
||||
const rootCategories = categories.filter(category => category && category.parentCid === parentCid);
|
||||
|
||||
rootCategories.forEach(category => recursive(category, categoriesData, '', 0));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user