diff --git a/apps/domain/availability/src/lib/availability.service.ts b/apps/domain/availability/src/lib/availability.service.ts index 275fb001b..88cb62c24 100644 --- a/apps/domain/availability/src/lib/availability.service.ts +++ b/apps/domain/availability/src/lib/availability.service.ts @@ -8,7 +8,7 @@ import { StoreCheckoutSupplierService, SupplierDTO, } from '@swagger/checkout'; -import { combineLatest, Observable, of } from 'rxjs'; +import { BehaviorSubject, combineLatest, Observable, of } from 'rxjs'; import { AvailabilityRequestDTO, AvailabilityService, @@ -21,11 +21,15 @@ import { isArray, memorize } from '@utils/common'; import { LogisticianDTO, LogisticianService } from '@swagger/oms'; import { ResponseArgsOfIEnumerableOfStockInfoDTO, StockDTO, StockInfoDTO, StockService } from '@swagger/remi'; import { PriceDTO } from '@swagger/availability'; -import { AvailabilityByBranchDTO, ItemData } from './defs'; +import { AvailabilityByBranchDTO, ItemData, Ssc } from './defs'; import { Availability } from './defs/availability'; @Injectable() export class DomainAvailabilityService { + // Ticket #3378 Keep Result List Items and Details Page SSC in sync + sscs$ = new BehaviorSubject>([]); + sscsObs$ = this.sscs$.asObservable(); + constructor( private _availabilityService: AvailabilityService, private _logisticanService: LogisticianService, diff --git a/apps/domain/availability/src/lib/defs/index.ts b/apps/domain/availability/src/lib/defs/index.ts index f49ee63b5..67c0f5569 100644 --- a/apps/domain/availability/src/lib/defs/index.ts +++ b/apps/domain/availability/src/lib/defs/index.ts @@ -1,3 +1,4 @@ export * from './availability-by-branch-dto'; export * from './availability'; export * from './item-data'; +export * from './ssc'; diff --git a/apps/domain/availability/src/lib/defs/ssc.ts b/apps/domain/availability/src/lib/defs/ssc.ts new file mode 100644 index 000000000..4f5a38566 --- /dev/null +++ b/apps/domain/availability/src/lib/defs/ssc.ts @@ -0,0 +1,5 @@ +export interface Ssc { + itemId?: number; + ssc?: string; + sscText?: string; +} diff --git a/apps/page/catalog/src/lib/article-details/article-details.component.html b/apps/page/catalog/src/lib/article-details/article-details.component.html index 6b81a1dd4..c092c6421 100644 --- a/apps/page/catalog/src/lib/article-details/article-details.component.html +++ b/apps/page/catalog/src/lib/article-details/article-details.component.html @@ -234,7 +234,7 @@
-
+
{{ sscText }}
diff --git a/apps/page/catalog/src/lib/article-details/article-details.store.ts b/apps/page/catalog/src/lib/article-details/article-details.store.ts index 9a381a9c0..396dd6d65 100644 --- a/apps/page/catalog/src/lib/article-details/article-details.store.ts +++ b/apps/page/catalog/src/lib/article-details/article-details.store.ts @@ -267,7 +267,8 @@ export class ArticleDetailsStore extends ComponentStore { this.deliveryB2BAvailability$, this.downloadAvailability$, ]).pipe( - map(([item, isDownload, pickupAvailability, deliveryDigAvailability, deliveryB2BAvailability, downloadAvailability]) => { + withLatestFrom(this.domainAvailabilityService.sscs$), + map(([[item, isDownload, pickupAvailability, deliveryDigAvailability, deliveryB2BAvailability, downloadAvailability], sscs]) => { let availability: AvailabilityDTO; if (isDownload) { @@ -282,15 +283,30 @@ export class ArticleDetailsStore extends ComponentStore { } } + let ssc = ''; + let sscText = 'Keine Lieferanten vorhanden'; + if (item?.catalogAvailability?.supplier === 'S' && !isDownload) { - return [item?.catalogAvailability?.ssc, item?.catalogAvailability?.sscText].filter((f) => !!f).join(' - '); + ssc = item?.catalogAvailability?.ssc; + sscText = item?.catalogAvailability?.sscText; + + return [ssc, sscText].filter((f) => !!f).join(' - '); } if (availability?.ssc || availability?.sscText) { - return [availability?.ssc, availability?.sscText].filter((f) => !!f).join(' - '); + ssc = availability?.ssc; + sscText = availability?.sscText; + + const sscExists = !!sscs?.find((ssc) => !!item?.id && ssc?.itemId === item.id); + const sscEqualsCatalogSsc = ssc === item.catalogAvailability.ssc && sscText === item.catalogAvailability.sscText; + + // To keep result list in sync with details page + if (!sscExists && !sscEqualsCatalogSsc) { + this.domainAvailabilityService.sscs$.next([...sscs, { itemId: item?.id, ssc, sscText }]); + } } - return 'Keine Lieferanten vorhanden'; + return [ssc, sscText].filter((f) => !!f).join(' - '); }) ); diff --git a/apps/page/catalog/src/lib/article-search/search-results/search-result-item.component.html b/apps/page/catalog/src/lib/article-search/search-results/search-result-item.component.html index 8678a0359..44acb9760 100644 --- a/apps/page/catalog/src/lib/article-search/search-results/search-result-item.component.html +++ b/apps/page/catalog/src/lib/article-search/search-results/search-result-item.component.html @@ -115,10 +115,10 @@ class="page-search-result-item__item-ssc desktop-small:text-p3 w-full text-right overflow-hidden text-ellipsis whitespace-nowrap" [class.page-search-result-item__item-ssc-main]="mainOutletActive" > - - {{ item?.catalogAvailability?.ssc }} - {{ item?.catalogAvailability?.sscText }} + + + {{ ssc?.ssc }} - {{ ssc?.sscText }} +
diff --git a/apps/page/catalog/src/lib/article-search/search-results/search-result-item.component.ts b/apps/page/catalog/src/lib/article-search/search-results/search-result-item.component.ts index e1f2fb0a2..5b853694e 100644 --- a/apps/page/catalog/src/lib/article-search/search-results/search-result-item.component.ts +++ b/apps/page/catalog/src/lib/article-search/search-results/search-result-item.component.ts @@ -8,7 +8,7 @@ import { ItemDTO } from '@swagger/cat'; import { DateAdapter } from '@ui/common'; import { isEqual } from 'lodash'; import { combineLatest } from 'rxjs'; -import { debounceTime, switchMap, map, shareReplay, filter } from 'rxjs/operators'; +import { debounceTime, switchMap, map, filter } from 'rxjs/operators'; import { ArticleSearchService } from '../article-search.store'; import { ProductCatalogNavigationService } from '@shared/services'; @@ -126,6 +126,17 @@ export class SearchResultItemComponent extends ComponentStore { + const updatedSsc = sscs?.find((ssc) => this.item?.id === ssc?.itemId); + return { + ssc: updatedSsc?.ssc ?? this.item?.catalogAvailability?.ssc, + sscText: updatedSsc?.sscText ?? this.item?.catalogAvailability?.sscText, + }; + }) + ); + constructor( private _dateAdapter: DateAdapter, private _datePipe: DatePipe,