in uui-core/src/data/processing/views/tree/treeStructure/helpers/FetchingHelper.ts [195:259]
private static async loadMissingItemsAndParents<TItem, TId, TFilter>({
tree,
newItemsMap,
options,
itemsToLoad,
}: LoadMissingItemsAndParentsOptions<TItem, TId, TFilter>) {
const updatedItemsMap = cloneMap(newItemsMap);
let iteration = 0;
let prevMissingIds = new Set<TId>();
let loadedItems: TItem[] = [];
const isItemNotLoaded = (id: TId) => tree.getById(id) === NOT_FOUND_RECORD && !updatedItemsMap.has(id);
while (true) {
const missingIds = new Set<TId>();
if (itemsToLoad && itemsToLoad.length > 0) {
itemsToLoad.forEach((id) => {
if (isItemNotLoaded(id)) {
missingIds.add(id);
}
});
}
if (tree.getParams().getParentId) {
for (const [, item] of updatedItemsMap) {
const parentId = tree.getParams().getParentId(item);
if (parentId != null && isItemNotLoaded(parentId)) {
missingIds.add(parentId);
}
}
}
if (missingIds.size === 0) {
break;
} else {
const ids = Array.from(missingIds);
const response = await options.api({ ids });
if (response.items.length !== ids.length) {
console.error(`LazyTree: api does not returned requested items. Check that you handle 'ids' argument correctly.
Read more here: https://github.com/epam/UUI/issues/89`);
}
const newItems = response.items.filter((item) => {
const id = item ? tree.getParams().getId(item) : null;
return id !== null;
});
newItems.forEach((item) => {
const id = tree.getParams().getId(item);
updatedItemsMap.set(id, item);
});
loadedItems = loadedItems.concat(newItems);
if (prevMissingIds.size === missingIds.size && isEqual(prevMissingIds, missingIds)) {
break;
}
prevMissingIds = new Set([...missingIds]);
}
iteration++;
if (iteration > 1000) {
throw new Error('LazyTree: More than 1000 iterations are made to load required items and their parents by ID. Check your api implementation');
}
}
return { itemsMap: updatedItemsMap, loadedItems };
}