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:
Barış Soner Uşaklı
2021-02-07 15:09:52 -05:00
committed by GitHub
parent 2cfab3678e
commit 47299ea587
76 changed files with 1088 additions and 1017 deletions

View File

@@ -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));