u
This commit is contained in:
@@ -34,26 +34,72 @@ import { requireArray, requireObject } from '../utils/apiShape';
|
||||
* @property {number|null} taxRate Tax rate in percent.
|
||||
*/
|
||||
|
||||
import { createChunkListAutomat } from './createChunkListAutomat';
|
||||
import authAutomat from './authAutomat';
|
||||
|
||||
/**
|
||||
* Per-SKU article change history (`GET /api/article/{sku}/history`).
|
||||
*
|
||||
* The backend returns the full list; pagination happens client-side in
|
||||
* `ArticleHistoryTab`. Keyed by SKU so several tabs can watch the same article.
|
||||
*
|
||||
* @type {KeyedAutomat<Array<ArticleHistoryEntry>>}
|
||||
* Registry of SKU-specific chunk-list automats for article history.
|
||||
* @type {Map<string, import('react-automat').Automat>}
|
||||
*/
|
||||
export const articleHistoryAutomat = new KeyedAutomat(
|
||||
null,
|
||||
{},
|
||||
{
|
||||
name: 'articleHistory',
|
||||
loader: async (sku) => {
|
||||
const res = await articleApi.getBySkuHistory(String(sku));
|
||||
requireObject(res, 'GET /api/article/:sku/history');
|
||||
return requireArray(res.history, 'history');
|
||||
},
|
||||
const skuHistoryAutomats = new Map();
|
||||
|
||||
/**
|
||||
* Gets or creates the chunk-list automat for a specific article's history.
|
||||
*
|
||||
* @param {string|number} sku Article SKU.
|
||||
* @returns {import('react-automat').Automat} Configured chunk-list automat for the SKU.
|
||||
*/
|
||||
export function getArticleHistoryAutomat(sku) {
|
||||
const key = String(sku);
|
||||
let inst = skuHistoryAutomats.get(key);
|
||||
if (!inst) {
|
||||
inst = createChunkListAutomat({
|
||||
name: `articleHistory:${key}`,
|
||||
chunkSize: 50,
|
||||
maxLruChunks: 50,
|
||||
fetchPage: (params) => articleApi.getBySkuHistory(key, params),
|
||||
});
|
||||
skuHistoryAutomats.set(key, inst);
|
||||
}
|
||||
return inst;
|
||||
}
|
||||
|
||||
/**
|
||||
* Per-SKU article change history manager (`GET /api/article/{sku}/history`).
|
||||
*
|
||||
* Backed by chunk-list automats (`createChunkListAutomat`) keyed by SKU with
|
||||
* multi-filter memory caching, LRU eviction, and infinite-scrolling / FillSpace support.
|
||||
*/
|
||||
export const articleHistoryAutomat = {
|
||||
get: getArticleHistoryAutomat,
|
||||
key: getArticleHistoryAutomat,
|
||||
has(sku) {
|
||||
return skuHistoryAutomats.has(String(sku));
|
||||
},
|
||||
);
|
||||
async load(sku) {
|
||||
const inst = getArticleHistoryAutomat(sku);
|
||||
return inst.getItems();
|
||||
},
|
||||
async reload(sku) {
|
||||
const inst = skuHistoryAutomats.get(String(sku));
|
||||
if (inst) {
|
||||
await inst.actions.reload();
|
||||
}
|
||||
},
|
||||
reset() {
|
||||
for (const inst of skuHistoryAutomats.values()) {
|
||||
inst.actions.reset();
|
||||
}
|
||||
skuHistoryAutomats.clear();
|
||||
},
|
||||
};
|
||||
|
||||
// Reset on logout or company change
|
||||
authAutomat.subscribe((auth) => {
|
||||
if (auth.status === 'anon') {
|
||||
articleHistoryAutomat.reset();
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Suppliers assigned to an article (`GET /api/article/{sku}/supplier`).
|
||||
|
||||
@@ -117,7 +117,7 @@ export { createListAutomat, selectListItems, selectListStatus } from './createLi
|
||||
|
||||
|
||||
/** Per-SKU article detail views keyed by SKU. */
|
||||
export { articleHistoryAutomat, articleSupplierAutomat } from './articleDetailAutomat';
|
||||
export { articleHistoryAutomat, getArticleHistoryAutomat, articleSupplierAutomat } from './articleDetailAutomat';
|
||||
|
||||
/** Single shared GET /api/events connection. */
|
||||
export { default as sseAutomat, invalidateArticle } from './sseAutomat';
|
||||
|
||||
Reference in New Issue
Block a user