#4752 Performance in der WA verbessert -> Details Seite

This commit is contained in:
Lorenz Hilpert
2024-05-28 15:22:23 +02:00
parent 3a9820aa54
commit 2a07341c80
7 changed files with 63 additions and 16 deletions

View File

@@ -46,7 +46,9 @@ export class PickupShelfOutDetailsComponent extends PickupShelfDetailsBaseCompon
order$ = this.store.order$; order$ = this.store.order$;
groupedItems$: Observable<Array<{ type: string; items: DBHOrderItemListItemDTO[] }>> = this.store.orderItems$.pipe( orderItems$ = this.store.orderItems$;
groupedItems$: Observable<Array<{ type: string; items: DBHOrderItemListItemDTO[] }>> = this.orderItems$.pipe(
map((items) => { map((items) => {
const groups: Array<{ type: string; items: DBHOrderItemListItemDTO[] }> = []; const groups: Array<{ type: string; items: DBHOrderItemListItemDTO[] }> = [];
@@ -66,10 +68,12 @@ export class PickupShelfOutDetailsComponent extends PickupShelfDetailsBaseCompon
}) })
); );
fetching$ = this.store.fetchingOrder$; fetchingOrder$ = this.store.fetchingOrder$;
fetchingItems$ = this.store.fetchingOrderItems$; fetchingItems$ = this.store.fetchingOrderItems$;
viewFetching$ = combineLatest([this.fetching$, this.fetchingItems$]).pipe(map(([fetching, fetchingItems]) => fetching || fetchingItems)); viewFetching$ = combineLatest([this.orderItems$, this.fetchingItems$]).pipe(
map(([orderItems, fetchingItems]) => orderItems?.length === 0 && fetchingItems)
);
selectedCompartmentInfo = this.store.selectedCompartmentInfo; selectedCompartmentInfo = this.store.selectedCompartmentInfo;

View File

@@ -7,7 +7,7 @@ import { PickupShelfIOService, PickupShelfOutService } from '@domain/pickup-shel
import { GetNameForBreadcrumbData, GetPathForBreadcrumbData, PickupShelfBaseComponent } from '../pickup-shelf-base.component'; import { GetNameForBreadcrumbData, GetPathForBreadcrumbData, PickupShelfBaseComponent } from '../pickup-shelf-base.component';
import { NavigationRoute, PickUpShelfOutNavigationService } from '@shared/services'; import { NavigationRoute, PickUpShelfOutNavigationService } from '@shared/services';
import { AsyncPipe } from '@angular/common'; import { AsyncPipe } from '@angular/common';
import { DBHOrderItemListItemDTO, ListResponseArgsOfDBHOrderItemListItemDTO } from '@swagger/oms'; import { DBHOrderItemListItemDTO } from '@swagger/oms';
import { Observable, of } from 'rxjs'; import { Observable, of } from 'rxjs';
import { take } from 'rxjs/operators'; import { take } from 'rxjs/operators';
import { provideActionHandlers } from '@core/command'; import { provideActionHandlers } from '@core/command';

View File

@@ -105,7 +105,7 @@
<div class="flex flex-row font-bold"> <div class="flex flex-row font-bold">
<shared-skeleton-loader class="w-32" *ngIf="fetchingOrder$ | async; else orderSourceTmpl"></shared-skeleton-loader> <shared-skeleton-loader class="w-32" *ngIf="fetchingOrder$ | async; else orderSourceTmpl"></shared-skeleton-loader>
<ng-template #orderSourceTmpl> <ng-template #orderSourceTmpl>
{{ order?.features?.orderSource }} {{ order()?.features?.orderSource }}
</ng-template> </ng-template>
</div> </div>
</div> </div>

View File

@@ -13,6 +13,7 @@ import { PickupShelfProcessingStatusPipe } from '../pipes/processing-status.pipe
import { UiDatepickerModule } from '@ui/datepicker'; import { UiDatepickerModule } from '@ui/datepicker';
import { PickUpShelfDetailsHeaderNavMenuComponent } from '../pickup-shelf-details-header-nav-menu/pickup-shelf-details-header-nav-menu.component'; import { PickUpShelfDetailsHeaderNavMenuComponent } from '../pickup-shelf-details-header-nav-menu/pickup-shelf-details-header-nav-menu.component';
import { SkeletonLoaderComponent } from '@shared/components/loader'; import { SkeletonLoaderComponent } from '@shared/components/loader';
import { toSignal } from '@angular/core/rxjs-interop';
@Component({ @Component({
selector: 'page-pickup-shelf-details-header', selector: 'page-pickup-shelf-details-header',
@@ -54,13 +55,9 @@ export class PickUpShelfDetailsHeaderComponent {
fetchingOrder$ = this._store.fetchingOrder$; fetchingOrder$ = this._store.fetchingOrder$;
get order$(): Observable<OrderDTO> { order$ = this._store.order$;
return this._store.order$;
}
get order(): OrderDTO { order = toSignal(this.order$);
return this._store.order;
}
findLatestPreferredPickUpDate$: Observable<Date> = this.order$.pipe( findLatestPreferredPickUpDate$: Observable<Date> = this.order$.pipe(
withLatestFrom(this._store.selectedOrderItemIds$), withLatestFrom(this._store.selectedOrderItemIds$),
@@ -90,7 +87,7 @@ export class PickUpShelfDetailsHeaderComponent {
processId?: number; processId?: number;
get isKulturpass() { get isKulturpass() {
return this.order?.features?.orderSource === 'KulturPass'; return this.order()?.features?.orderSource === 'KulturPass';
} }
minDateDatepicker = this.dateAdapter.addCalendarDays(this.dateAdapter.today(), -1); minDateDatepicker = this.dateAdapter.addCalendarDays(this.dateAdapter.today(), -1);

View File

@@ -1,6 +1,6 @@
import { ComponentStore, tapResponse } from '@ngrx/component-store'; import { ComponentStore, tapResponse } from '@ngrx/component-store';
import { PickupShelfDetailsState } from './pickup-shelf-details.state'; import { PickupShelfDetailsState } from './pickup-shelf-details.state';
import { Observable } from 'rxjs'; import { Observable, combineLatest } from 'rxjs';
import { import {
DBHOrderItemListItemDTO, DBHOrderItemListItemDTO,
EntityDTOContainerOfOrderItemSubsetDTO, EntityDTOContainerOfOrderItemSubsetDTO,
@@ -18,7 +18,7 @@ import {
} from '@swagger/oms'; } from '@swagger/oms';
import { PickupShelfIOService, PickupShelfService } from '@domain/pickup-shelf'; import { PickupShelfIOService, PickupShelfService } from '@domain/pickup-shelf';
import { Injectable, inject } from '@angular/core'; import { Injectable, inject } from '@angular/core';
import { delayWhen, filter, mergeMap, switchMap, take, tap, withLatestFrom } from 'rxjs/operators'; import { delayWhen, filter, map, mergeMap, switchMap, take, tap, withLatestFrom } from 'rxjs/operators';
import { UiModalService } from '@ui/modal'; import { UiModalService } from '@ui/modal';
import { CrmCustomerService } from '@domain/crm'; import { CrmCustomerService } from '@domain/crm';
import * as Selectors from './pickup-shelf-details.selectors'; import * as Selectors from './pickup-shelf-details.selectors';
@@ -56,10 +56,20 @@ export class PickupShelfDetailsStore extends ComponentStore<PickupShelfDetailsSt
return this.get(Selectors.selectFetchingOrder); return this.get(Selectors.selectFetchingOrder);
} }
orderItems$ = this.select(Selectors.selectOrderItems); // orderItems$ = this.select(Selectors.selectOrderItems);
// get orderItems() {
// return this.get(Selectors.selectOrderItems);
// }
orderItems$ = combineLatest([
this.select(Selectors.selectOrderItems),
this.select((s) => s).pipe(switchMap((s) => this._listStore.itemsForPreview$(s))),
]).pipe(map(([orderItems, itemsForPreview]) => (orderItems?.length ? orderItems : itemsForPreview)));
get orderItems() { get orderItems() {
return this.get(Selectors.selectOrderItems); const orderItems = this.get(Selectors.selectOrderItems);
return orderItems?.length ? orderItems : this.get((s) => this._listStore.itemsForPreview(s));
} }
fetchingOrderItems$ = this.select(Selectors.selectFetchingOrderItems); fetchingOrderItems$ = this.select(Selectors.selectFetchingOrderItems);

View File

@@ -1,6 +1,13 @@
import { Filter } from '@shared/components/filter'; import { Filter } from '@shared/components/filter';
import { PickupShelfState } from './pickup-shelf.state'; import { PickupShelfState } from './pickup-shelf.state';
import { isEmpty } from 'lodash'; import { isEmpty } from 'lodash';
import { PickupShelfDetailsState } from './pickup-shelf-details.state';
import {
selectDisplayedCompartmentCode,
selectDisplayedCompartmentInfo,
selectDisplayedOrderItemProcessingStatus,
selectOrder,
} from './pickup-shelf-details.selectors';
export function selectProcessId(state: PickupShelfState) { export function selectProcessId(state: PickupShelfState) {
return state.processId; return state.processId;
@@ -64,3 +71,27 @@ export function selectListHits(state: PickupShelfState) {
export function selectSelectedListItems(state: PickupShelfState) { export function selectSelectedListItems(state: PickupShelfState) {
return state.selectedListItems ?? []; return state.selectedListItems ?? [];
} }
export const selectItemsForPreview = (detailsState: PickupShelfDetailsState) => (state: PickupShelfState) => {
const orderId = selectOrder(detailsState)?.id;
let items = state.list.filter((item) => item.orderId === orderId);
const processingStatus = selectDisplayedOrderItemProcessingStatus(detailsState);
if (processingStatus) {
items = items?.filter((oi) => oi.processingStatus === processingStatus);
}
const compartmentCode = selectDisplayedCompartmentCode(detailsState);
if (compartmentCode) {
items = items?.filter((oi) => oi.compartmentCode === compartmentCode);
const compartmentInfo = selectDisplayedCompartmentInfo(detailsState);
if (compartmentInfo) {
items = items?.filter((oi) => oi.compartmentInfo === compartmentInfo);
}
}
return items;
};

View File

@@ -28,6 +28,7 @@ import * as Selectors from './pickup-shelf.selectors';
import { Observable, Subject, combineLatest } from 'rxjs'; import { Observable, Subject, combineLatest } from 'rxjs';
import { CacheService } from '@core/cache'; import { CacheService } from '@core/cache';
import { Filter } from '@shared/components/filter'; import { Filter } from '@shared/components/filter';
import { PickupShelfDetailsState } from './pickup-shelf-details.state';
@Injectable() @Injectable()
export class PickupShelfStore extends ComponentStore<PickupShelfState> implements OnStoreInit { export class PickupShelfStore extends ComponentStore<PickupShelfState> implements OnStoreInit {
@@ -104,6 +105,10 @@ export class PickupShelfStore extends ComponentStore<PickupShelfState> implement
return this.get(Selectors.selectSelectedListItems); return this.get(Selectors.selectSelectedListItems);
} }
itemsForPreview$ = (state: PickupShelfDetailsState) => this.select(Selectors.selectItemsForPreview(state));
itemsForPreview = (state: PickupShelfDetailsState) => this.get(Selectors.selectItemsForPreview(state));
constructor() { constructor() {
// Nicht entfernen sonst wird der Store nicht initialisiert // Nicht entfernen sonst wird der Store nicht initialisiert
super({}); super({});