Add category management: list API, UI integration, and search updates
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
import { apiRequest, getPath } from './client.js';
|
||||
|
||||
const DEFAULT_LIST_PAGE_LIMIT = 100;
|
||||
|
||||
function unwrapListPayload(payload) {
|
||||
if (Array.isArray(payload)) {
|
||||
return payload;
|
||||
}
|
||||
|
||||
return payload?.data || payload?.entries || payload?.items || payload?.categories || [];
|
||||
}
|
||||
|
||||
function hasExplicitPagination(filters = {}) {
|
||||
return (
|
||||
(filters.limit !== undefined && filters.limit !== null)
|
||||
|| (filters.offset !== undefined && filters.offset !== null)
|
||||
);
|
||||
}
|
||||
|
||||
function buildCategoryQuery(filters = {}) {
|
||||
const query = {};
|
||||
const searchName = filters.searchName || filters.search_name;
|
||||
if (searchName) {
|
||||
query.search_name = searchName;
|
||||
}
|
||||
|
||||
if (filters.active !== undefined && filters.active !== null && filters.active !== '') {
|
||||
query.active = Boolean(filters.active);
|
||||
}
|
||||
|
||||
if (filters.orderBy || filters.order_by) {
|
||||
query.order_by = filters.orderBy || filters.order_by;
|
||||
}
|
||||
|
||||
if (filters.orderDir || filters.order_dir) {
|
||||
query.order_dir = filters.orderDir || filters.order_dir;
|
||||
}
|
||||
|
||||
if (filters.expanded !== undefined && filters.expanded !== null && filters.expanded !== '') {
|
||||
query.expanded = Boolean(filters.expanded);
|
||||
}
|
||||
|
||||
return query;
|
||||
}
|
||||
|
||||
async function fetchAllCategoryPages(store, baseQuery = {}) {
|
||||
const items = [];
|
||||
let offset = 0;
|
||||
|
||||
while (true) {
|
||||
const payload = await apiRequest(store, getPath('categories'), {
|
||||
query: {
|
||||
...baseQuery,
|
||||
limit: DEFAULT_LIST_PAGE_LIMIT,
|
||||
offset,
|
||||
},
|
||||
});
|
||||
const pageItems = unwrapListPayload(payload);
|
||||
items.push(...pageItems);
|
||||
|
||||
if (pageItems.length < DEFAULT_LIST_PAGE_LIMIT) {
|
||||
break;
|
||||
}
|
||||
|
||||
offset += DEFAULT_LIST_PAGE_LIMIT;
|
||||
}
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
export async function listCategories(store, filters = {}) {
|
||||
const baseQuery = buildCategoryQuery(filters);
|
||||
|
||||
if (hasExplicitPagination(filters)) {
|
||||
const query = { ...baseQuery };
|
||||
if (filters.limit !== undefined && filters.limit !== null) {
|
||||
query.limit = filters.limit;
|
||||
}
|
||||
if (filters.offset !== undefined && filters.offset !== null) {
|
||||
query.offset = filters.offset;
|
||||
}
|
||||
|
||||
const payload = await apiRequest(store, getPath('categories'), {
|
||||
query,
|
||||
});
|
||||
return unwrapListPayload(payload);
|
||||
}
|
||||
|
||||
return fetchAllCategoryPages(store, baseQuery);
|
||||
}
|
||||
Reference in New Issue
Block a user