From 15db63aa1a46e18bee44f63214fbc3d48da206e6 Mon Sep 17 00:00:00 2001 From: Lorenz Hilpert Date: Thu, 26 Jun 2025 22:34:03 +0200 Subject: [PATCH] refactor(quantity-and-reason-item): improve stock fetching and caching logic Enhance the fetchAssignedStock method to utilize memory storage for caching assigned stock data. Update the resource loader to handle cached values and set new stock data accordingly. Adjust the HTML button for better readability. --- .../lib/services/remission-stock.service.ts | 1 + .../lib/quantity-and-reason-item.component.ts | 67 ++++++++++++++++--- ...ct-remi-quantity-and-reason.component.html | 10 ++- 3 files changed, 69 insertions(+), 9 deletions(-) diff --git a/libs/remission/data-access/src/lib/services/remission-stock.service.ts b/libs/remission/data-access/src/lib/services/remission-stock.service.ts index 25690ed4f..e4322497f 100644 --- a/libs/remission/data-access/src/lib/services/remission-stock.service.ts +++ b/libs/remission/data-access/src/lib/services/remission-stock.service.ts @@ -13,6 +13,7 @@ export class RemissionStockService { #memoryStorage = injectStorage(MemoryStorageProvider); async fetchAssignedStock(abortSignal?: AbortSignal): Promise { + // TODO: No caching in data-access services. Remove caching. const cached = await this.#memoryStorage.get(ASSIGNED_STOCK_STORAGE_KEY); if (cached) { diff --git a/libs/remission/shared/search-item-to-remit-dialog/src/lib/quantity-and-reason-item.component.ts b/libs/remission/shared/search-item-to-remit-dialog/src/lib/quantity-and-reason-item.component.ts index 92e4fd64b..0e2157b11 100644 --- a/libs/remission/shared/search-item-to-remit-dialog/src/lib/quantity-and-reason-item.component.ts +++ b/libs/remission/shared/search-item-to-remit-dialog/src/lib/quantity-and-reason-item.component.ts @@ -6,11 +6,16 @@ import { linkedSignal, model, resource, + ResourceStreamItem, + signal, } from '@angular/core'; import { FormsModule } from '@angular/forms'; +import { injectStorage, MemoryStorageProvider } from '@isa/core/storage'; import { + KeyValueStringAndString, RemissionReasonService, RemissionStockService, + Stock, } from '@isa/remission/data-access'; import { DropdownButtonComponent, @@ -26,6 +31,7 @@ import { imports: [DropdownButtonComponent, DropdownOptionComponent, FormsModule], }) export class QuantityAndReasonItemComponent { + #memoryStorage = injectStorage(MemoryStorageProvider); #reasonService = inject(RemissionReasonService); #stockService = inject(RemissionStockService); @@ -42,8 +48,25 @@ export class QuantityAndReasonItemComponent { }); assignedStockResource = resource({ - loader: ({ abortSignal }) => - this.#stockService.fetchAssignedStock(abortSignal), + defaultValue: undefined, + stream: async ({ abortSignal }) => { + const cached = await this.#memoryStorage.get('assigned-stock'); + const result = signal>({ + value: cached as Stock, + }); + + this.#stockService.fetchAssignedStock(abortSignal).then((stock) => { + if (stock) { + result.set({ value: stock }); + this.#memoryStorage.set('assigned-stock', stock); + } else { + result.set({ value: undefined }); + this.#memoryStorage.clear('assigned-stock'); + } + }); + + return result.asReadonly(); + }, }); reasonResource = resource({ @@ -53,12 +76,40 @@ export class QuantityAndReasonItemComponent { return []; } - return this.#reasonService.fetchReturnReasons( - { - stockId: params.id, - }, - abortSignal, - ); + const cached = (await this.#memoryStorage.get({ + key: 'assigned-stock-reasons', + params, + })) as KeyValueStringAndString[]; + + if (cached && cached.length > 0) { + return cached; + } + + return this.#reasonService + .fetchReturnReasons( + { + stockId: params.id, + }, + abortSignal, + ) + .then((reasons) => { + if (reasons && reasons.length > 0) { + this.#memoryStorage.set( + { + key: 'assigned-stock-reasons', + params, + }, + reasons, + ); + } else { + this.#memoryStorage.clear({ + key: 'assigned-stock-reasons', + params, + }); + } + + return reasons; + }); }, }); } diff --git a/libs/remission/shared/search-item-to-remit-dialog/src/lib/select-remi-quantity-and-reason.component.html b/libs/remission/shared/search-item-to-remit-dialog/src/lib/select-remi-quantity-and-reason.component.html index 11fd81347..429ad87b9 100644 --- a/libs/remission/shared/search-item-to-remit-dialog/src/lib/select-remi-quantity-and-reason.component.html +++ b/libs/remission/shared/search-item-to-remit-dialog/src/lib/select-remi-quantity-and-reason.component.html @@ -17,6 +17,14 @@
- +