mirror of
https://github.com/TronoSfera/Law.git
synced 2026-05-19 02:23:45 +03:00
82 lines
2.6 KiB
JavaScript
82 lines
2.6 KiB
JavaScript
import { normalizeReferenceMeta } from "../shared/utils.js";
|
|
|
|
export function useAdminCatalogLoaders({ api, setStatus, setTableState, setReferenceRowsMap, buildUniversalQuery }) {
|
|
const { useCallback } = React;
|
|
|
|
const loadAvailableTables = useCallback(
|
|
async (tokenOverride) => {
|
|
setStatus("availableTables", "Загрузка...", "");
|
|
try {
|
|
const data = await api("/api/admin/crud/meta/available-tables", {}, tokenOverride);
|
|
const rows = Array.isArray(data.rows) ? data.rows : [];
|
|
setTableState("availableTables", {
|
|
filters: [],
|
|
sort: null,
|
|
offset: 0,
|
|
total: rows.length,
|
|
showAll: true,
|
|
rows,
|
|
});
|
|
setStatus("availableTables", "Список обновлен", "ok");
|
|
return true;
|
|
} catch (error) {
|
|
setStatus("availableTables", "Ошибка: " + error.message, "error");
|
|
return false;
|
|
}
|
|
},
|
|
[api, setStatus, setTableState]
|
|
);
|
|
|
|
const loadReferenceRows = useCallback(
|
|
async (catalogRows, tokenOverride) => {
|
|
const rows = Array.isArray(catalogRows) ? catalogRows : [];
|
|
const byTable = {};
|
|
rows.forEach((item) => {
|
|
const table = String(item?.table || "");
|
|
if (!table) return;
|
|
byTable[table] = item;
|
|
});
|
|
const references = new Set();
|
|
rows.forEach((item) => {
|
|
(item?.columns || []).forEach((column) => {
|
|
const meta = normalizeReferenceMeta(column?.reference);
|
|
if (meta?.table) references.add(meta.table);
|
|
});
|
|
});
|
|
if (!references.size) {
|
|
setReferenceRowsMap({});
|
|
return;
|
|
}
|
|
const nextMap = {};
|
|
await Promise.all(
|
|
Array.from(references.values()).map(async (table) => {
|
|
const meta = byTable[table];
|
|
const endpoint = String(meta?.query_endpoint || ("/api/admin/crud/" + table + "/query"));
|
|
const sort = Array.isArray(meta?.default_sort) && meta.default_sort.length ? meta.default_sort : [{ field: "created_at", dir: "desc" }];
|
|
try {
|
|
const data = await api(
|
|
endpoint,
|
|
{
|
|
method: "POST",
|
|
body: buildUniversalQuery([], sort, 500, 0),
|
|
},
|
|
tokenOverride
|
|
);
|
|
nextMap[table] = Array.isArray(data?.rows) ? data.rows : [];
|
|
} catch (_) {
|
|
nextMap[table] = [];
|
|
}
|
|
})
|
|
);
|
|
setReferenceRowsMap(nextMap);
|
|
},
|
|
[api, buildUniversalQuery, setReferenceRowsMap]
|
|
);
|
|
|
|
return {
|
|
loadAvailableTables,
|
|
loadReferenceRows,
|
|
};
|
|
}
|
|
|
|
export default useAdminCatalogLoaders;
|