u
This commit is contained in:
@@ -323,6 +323,64 @@ export function appendArticlesToCategoryViews({ categoryId, articles }) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates an article in all loaded category views.
|
||||
*
|
||||
* @param {object} article Article detail or row with at least `sku`.
|
||||
* @returns {void}
|
||||
*/
|
||||
export function updateArticleInCategoryViews(article) {
|
||||
if (!article || article.sku == null) return;
|
||||
const sku = String(article.sku);
|
||||
const targetCategoryIds = Array.isArray(article.categoryIds)
|
||||
? new Set(article.categoryIds.map(String))
|
||||
: null;
|
||||
|
||||
for (const [slug, item] of categoryViews._items.entries()) {
|
||||
if (!item?.data) continue;
|
||||
const viewCatId = String(item.data.categoryId);
|
||||
const existingIndex = (item.data.articles || []).findIndex((r) => String(r.sku) === sku);
|
||||
|
||||
if (existingIndex >= 0) {
|
||||
if (targetCategoryIds && !targetCategoryIds.has(viewCatId)) {
|
||||
// Article moved out of this category
|
||||
categoryViews.key(slug).set({
|
||||
...item.data,
|
||||
articles: item.data.articles.filter((r) => String(r.sku) !== sku),
|
||||
});
|
||||
} else {
|
||||
// Update in-place
|
||||
const existing = item.data.articles[existingIndex];
|
||||
const updatedArticles = [...item.data.articles];
|
||||
updatedArticles[existingIndex] = {
|
||||
...existing,
|
||||
...article,
|
||||
name: article.name ?? existing.name,
|
||||
price: article.price ?? (Array.isArray(article.prices) ? article.prices[0]?.net : null) ?? article.net ?? existing.price,
|
||||
net: article.net ?? article.price ?? (Array.isArray(article.prices) ? article.prices[0]?.net : null) ?? existing.net,
|
||||
stock: article.stock ?? existing.stock,
|
||||
available: article.available ?? existing.available,
|
||||
warehouses: article.warehouses ?? existing.warehouses,
|
||||
brand: article.brand ?? existing.brand,
|
||||
brandName: article.brand?.name ?? article.brandName ?? existing.brandName,
|
||||
childCount: article.childCount ?? existing.childCount,
|
||||
isParent: Boolean(article.childCount > 0 || article.isParent || existing.isParent),
|
||||
};
|
||||
categoryViews.key(slug).set({
|
||||
...item.data,
|
||||
articles: updatedArticles,
|
||||
});
|
||||
}
|
||||
} else if (targetCategoryIds && targetCategoryIds.has(viewCatId)) {
|
||||
// Article added to this category
|
||||
categoryViews.key(slug).set({
|
||||
...item.data,
|
||||
articles: [...(item.data.articles || []), article],
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a deleted article from every loaded view that contains it.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user