diff --git a/apps/domain/availability/src/lib/availability.service.ts b/apps/domain/availability/src/lib/availability.service.ts index d61a6f8a6..ccf0c84a8 100644 --- a/apps/domain/availability/src/lib/availability.service.ts +++ b/apps/domain/availability/src/lib/availability.service.ts @@ -34,6 +34,11 @@ export class DomainAvailabilityService { private _branchService: StoreCheckoutBranchService ) {} + @memorize({ ttl: 10000 }) + memorizedAvailabilityShippingAvailability(request: Array) { + return this._availabilityService.AvailabilityShippingAvailability(request).pipe(shareReplay(1)); + } + @memorize() getSuppliers(): Observable { return this._supplierService.StoreCheckoutSupplierGetSuppliers({}).pipe( @@ -249,57 +254,53 @@ export class DomainAvailabilityService { @memorize({ ttl: 10000 }) getDeliveryAvailability({ item, quantity }: { item: ItemData; quantity: number }): Observable { - return this._availabilityService - .AvailabilityShippingAvailability([ - { - ean: item?.ean, - itemId: item?.itemId ? String(item?.itemId) : null, - price: item?.price, - qty: quantity, - }, - ]) - .pipe( - timeout(5000), - map((r) => this._mapToShippingAvailability(r.result)?.find((_) => true)), - shareReplay(1) - ); + return this.memorizedAvailabilityShippingAvailability([ + { + ean: item?.ean, + itemId: item?.itemId ? String(item?.itemId) : null, + price: item?.price, + qty: quantity, + }, + ]).pipe( + timeout(5000), + map((r) => this._mapToShippingAvailability(r.result)?.find((_) => true)), + shareReplay(1) + ); } @memorize({ ttl: 10000 }) getDigDeliveryAvailability({ item, quantity }: { item: ItemData; quantity: number }): Observable { - return this._availabilityService - .AvailabilityShippingAvailability([ - { - qty: quantity, - ean: item?.ean, - itemId: item?.itemId ? String(item?.itemId) : null, - price: item?.price, - }, - ]) - .pipe( - timeout(5000), - map((r) => { - const availabilities = r.result; - const preferred = availabilities?.find((f) => f.preferred === 1); + return this.memorizedAvailabilityShippingAvailability([ + { + qty: quantity, + ean: item?.ean, + itemId: item?.itemId ? String(item?.itemId) : null, + price: item?.price, + }, + ]).pipe( + timeout(5000), + map((r) => { + const availabilities = r.result; + const preferred = availabilities?.find((f) => f.preferred === 1); - const availability: AvailabilityDTO = { - availabilityType: preferred?.status, - ssc: preferred?.ssc, - sscText: preferred?.sscText, - supplier: { id: preferred?.supplierId }, - isPrebooked: preferred?.isPrebooked, - estimatedShippingDate: preferred?.requestStatusCode === '32' ? preferred?.altAt : preferred?.at, - estimatedDelivery: preferred?.estimatedDelivery, - price: preferred?.price, - logistician: { id: preferred?.logisticianId }, - supplierProductNumber: preferred?.supplierProductNumber, - supplierInfo: preferred?.requestStatusCode, - lastRequest: preferred?.requested, - }; - return availability; - }), - shareReplay(1) - ); + const availability: AvailabilityDTO = { + availabilityType: preferred?.status, + ssc: preferred?.ssc, + sscText: preferred?.sscText, + supplier: { id: preferred?.supplierId }, + isPrebooked: preferred?.isPrebooked, + estimatedShippingDate: preferred?.requestStatusCode === '32' ? preferred?.altAt : preferred?.at, + estimatedDelivery: preferred?.estimatedDelivery, + price: preferred?.price, + logistician: { id: preferred?.logisticianId }, + supplierProductNumber: preferred?.supplierProductNumber, + supplierInfo: preferred?.requestStatusCode, + lastRequest: preferred?.requested, + }; + return availability; + }), + shareReplay(1) + ); } @memorize({ ttl: 10000 }) @@ -333,37 +334,35 @@ export class DomainAvailabilityService { @memorize({ ttl: 10000 }) getDownloadAvailability({ item }: { item: ItemData }): Observable { - return this._availabilityService - .AvailabilityShippingAvailability([ - { - ean: item?.ean, - itemId: item?.itemId ? String(item?.itemId) : null, - price: item?.price, - qty: 1, - }, - ]) - .pipe( - map((r) => { - const availabilities = r.result; - const preferred = availabilities?.find((f) => f.preferred === 1); + return this.memorizedAvailabilityShippingAvailability([ + { + ean: item?.ean, + itemId: item?.itemId ? String(item?.itemId) : null, + price: item?.price, + qty: 1, + }, + ]).pipe( + map((r) => { + const availabilities = r.result; + const preferred = availabilities?.find((f) => f.preferred === 1); - const availability: AvailabilityDTO = { - availabilityType: preferred?.status, - ssc: preferred?.ssc, - sscText: preferred?.sscText, - supplier: { id: preferred?.supplierId }, - isPrebooked: preferred?.isPrebooked, - estimatedShippingDate: preferred?.requestStatusCode === '32' ? preferred?.altAt : preferred?.at, - price: preferred?.price, - supplierProductNumber: preferred?.supplierProductNumber, - logistician: { id: preferred?.logisticianId }, - supplierInfo: preferred?.requestStatusCode, - lastRequest: preferred?.requested, - }; - return availability; - }), - shareReplay(1) - ); + const availability: AvailabilityDTO = { + availabilityType: preferred?.status, + ssc: preferred?.ssc, + sscText: preferred?.sscText, + supplier: { id: preferred?.supplierId }, + isPrebooked: preferred?.isPrebooked, + estimatedShippingDate: preferred?.requestStatusCode === '32' ? preferred?.altAt : preferred?.at, + price: preferred?.price, + supplierProductNumber: preferred?.supplierProductNumber, + logistician: { id: preferred?.logisticianId }, + supplierInfo: preferred?.requestStatusCode, + lastRequest: preferred?.requested, + }; + return availability; + }), + shareReplay(1) + ); } @memorize({ ttl: 10000 }) @@ -401,7 +400,7 @@ export class DomainAvailabilityService { @memorize({ ttl: 10000 }) getDeliveryAvailabilities(payload: AvailabilityRequestDTO[]) { - return this._availabilityService.AvailabilityShippingAvailability(payload).pipe( + return this.memorizedAvailabilityShippingAvailability(payload).pipe( timeout(20000), map((response) => this._mapToShippingAvailability(response.result)) ); @@ -409,7 +408,7 @@ export class DomainAvailabilityService { @memorize({ ttl: 10000 }) getDigDeliveryAvailabilities(payload: AvailabilityRequestDTO[]) { - return this._availabilityService.AvailabilityShippingAvailability(payload).pipe( + return this.memorizedAvailabilityShippingAvailability(payload).pipe( timeout(20000), map((response) => this._mapToShippingAvailability(response.result)) ); @@ -447,6 +446,9 @@ export class DomainAvailabilityService { } isAvailable({ availability }: { availability: AvailabilityDTO }) { + if (availability?.supplier?.id === 16 && availability?.inStock == 0) { + return false; + } return [2, 32, 256, 1024, 2048, 4096].some((code) => availability?.availabilityType === code); } diff --git a/apps/domain/checkout/src/lib/checkout.service.ts b/apps/domain/checkout/src/lib/checkout.service.ts index 2afd705f8..7aa05236f 100644 --- a/apps/domain/checkout/src/lib/checkout.service.ts +++ b/apps/domain/checkout/src/lib/checkout.service.ts @@ -26,6 +26,7 @@ import { StoreCheckoutBuyerService, StoreCheckoutPayerService, StoreCheckoutBranchService, + ItemsResult, } from '@swagger/checkout'; import { DisplayOrderDTO, DisplayOrderItemDTO, OrderCheckoutService, ReorderValues } from '@swagger/oms'; import { isNullOrUndefined, memorize } from '@utils/common'; @@ -198,7 +199,15 @@ export class DomainCheckoutService { ); } - canAddItems({ processId, payload, orderType }: { processId: number; payload: ItemPayload[]; orderType: string }) { + canAddItems({ + processId, + payload, + orderType, + }: { + processId: number; + payload: ItemPayload[]; + orderType: string; + }): Observable { return this.getShoppingCart({ processId }).pipe( first(), withLatestFrom(this.store.select(DomainCheckoutSelectors.selectCustomerFeaturesByProcessId, { processId })), @@ -217,7 +226,8 @@ export class DomainCheckoutService { }) .pipe( map((response) => { - return response.result; + // TODO: remove this when the API is fixed + return (response.result as unknown) as ItemsResult[]; }) ); }) diff --git a/apps/isa-app/src/app/app.module.ts b/apps/isa-app/src/app/app.module.ts index 6e4b7db47..e7b597d32 100644 --- a/apps/isa-app/src/app/app.module.ts +++ b/apps/isa-app/src/app/app.module.ts @@ -107,6 +107,25 @@ export function _notificationsHubOptionsFactory(config: Config, auth: AuthServic aliases: [ { alias: 'd-account', name: 'account' }, { alias: 'd-no-account', name: 'package-variant-closed' }, + { name: 'isa-audio', alias: 'AU' }, + { name: 'isa-audio', alias: 'CAS' }, + { name: 'isa-audio', alias: 'DL' }, + { name: 'isa-audio', alias: 'KAS' }, + { name: 'isa-hard-cover', alias: 'BUCH' }, + { name: 'isa-hard-cover', alias: 'GEB' }, + { name: 'isa-hard-cover', alias: 'HC' }, + { name: 'isa-hard-cover', alias: 'KT' }, + { name: 'isa-ebook', alias: 'EB' }, + { name: 'isa-non-book', alias: 'GLO' }, + { name: 'isa-non-book', alias: 'HDL' }, + { name: 'isa-non-book', alias: 'NB' }, + { name: 'isa-non-book', alias: 'SPL' }, + { name: 'isa-calendar', alias: 'KA' }, + { name: 'isa-scroll', alias: 'MA' }, + { name: 'isa-software', alias: 'SW' }, + { name: 'isa-soft-cover', alias: 'TB' }, + { name: 'isa-video', alias: 'VI' }, + { name: 'isa-news-paper', alias: 'ZS' }, ], }), ], diff --git a/apps/page/catalog/src/lib/article-details/article-details.component.ts b/apps/page/catalog/src/lib/article-details/article-details.component.ts index 832035667..fc975f986 100644 --- a/apps/page/catalog/src/lib/article-details/article-details.component.ts +++ b/apps/page/catalog/src/lib/article-details/article-details.component.ts @@ -4,11 +4,9 @@ import { ApplicationService } from '@core/application'; import { DomainPrinterService } from '@domain/printer'; import { ItemDTO as PrinterItemDTO } from '@swagger/print'; import { PrintModalComponent, PrintModalData } from '@modal/printer'; -import { AvailabilityDTO, BranchDTO } from '@swagger/checkout'; +import { BranchDTO } from '@swagger/checkout'; import { UiModalService } from '@ui/modal'; import { ModalReviewsComponent } from '@modal/reviews'; -import { PurchasingOptionsModalComponent, PurchasingOptionsModalData } from 'apps/page/checkout/src/lib/modals/purchasing-options-modal'; -import { PurchasingOptions } from 'apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.store'; import { BehaviorSubject, combineLatest, Subscription } from 'rxjs'; import { debounceTime, filter, first, map, shareReplay, switchMap } from 'rxjs/operators'; import { ArticleDetailsStore } from './article-details.store'; @@ -20,6 +18,7 @@ import { BreadcrumbService } from '@core/breadcrumb'; import { ItemDTO } from '@swagger/cat'; import { DateAdapter } from '@ui/common'; import { DatePipe } from '@angular/common'; +import { PurchaseOptionsModalService } from '@shared/modals/purchase-options-modal'; import { DomainAvailabilityService } from '@domain/availability'; @Component({ @@ -125,6 +124,7 @@ export class ArticleDetailsComponent implements OnInit, OnDestroy { private _dateAdapter: DateAdapter, private _datePipe: DatePipe, public elementRef: ElementRef, + private _purchaseOptionsModalService: PurchaseOptionsModalService, private _availability: DomainAvailabilityService ) {} @@ -262,58 +262,12 @@ export class ArticleDetailsComponent implements OnInit, OnDestroy { } async showPurchasingModal(selectedBranch?: BranchDTO) { - let availableOptions: PurchasingOptions[] = []; - const availabilities: { [key: string]: AvailabilityDTO } = {}; + const item = await this.store.item$.pipe(first()).toPromise(); - const takeNow = await this.store.isTakeAwayAvailabilityAvailable$.pipe(first()).toPromise(); - if (takeNow) { - availableOptions.push('take-away'); - availabilities['take-away'] = await this.store.takeAwayAvailability$.pipe(first()).toPromise(); - } - - const download = await this.store.isDownloadAvailabilityAvailable$.pipe(first()).toPromise(); - if (download) { - availableOptions.push('download'); - availabilities['download'] = await this.store.downloadAvailability$.pipe(first()).toPromise(); - } - - const pickup = await this.store.isPickUpAvailabilityAvailable$.pipe(first()).toPromise(); - if (pickup) { - availableOptions.push('pick-up'); - availabilities['pick-up'] = await this.store.pickUpAvailability$.pipe(first()).toPromise(); - } - - const digDelivery = await this.store.isDeliveryDigAvailabilityAvailable$.pipe(first()).toPromise(); - if (digDelivery) { - availableOptions.push('dig-delivery'); - availabilities['dig-delivery'] = await this.store.deliveryDigAvailability$.pipe(first()).toPromise(); - } - - const b2b = await this.store.isDeliveryB2BAvailabilityAvailable$.pipe(first()).toPromise(); - - if (b2b) { - availableOptions.push('b2b-delivery'); - availabilities['b2b-delivery'] = await this.store.deliveryB2BAvailability$.pipe(first()).toPromise(); - } - - if (availableOptions.includes('dig-delivery') && availableOptions.includes('b2b-delivery')) { - availableOptions.push('delivery'); - availabilities['delivery'] = await this.store.deliveryAvailability$.pipe(first()).toPromise(); - availableOptions = availableOptions.filter((option) => !(option === 'dig-delivery' || option === 'b2b-delivery')); - } - - const branch = selectedBranch || (await this.store.branch$.pipe(first()).toPromise()); - - this.uiModal.open({ - content: PurchasingOptionsModalComponent, - data: { - availableOptions, - option: selectedBranch ? 'take-away' : undefined, - item: await this.store.item$.pipe(first()).toPromise(), - branchId: branch?.id, - processId: this.applicationService.activatedProcessId, - availabilities, - } as PurchasingOptionsModalData, + this._purchaseOptionsModalService.open({ + type: 'add', + processId: this.applicationService.activatedProcessId, + items: [item], }); } diff --git a/apps/page/catalog/src/lib/article-search/search-results/search-results.component.ts b/apps/page/catalog/src/lib/article-search/search-results/search-results.component.ts index 1e127f629..0729f59bc 100644 --- a/apps/page/catalog/src/lib/article-search/search-results/search-results.component.ts +++ b/apps/page/catalog/src/lib/article-search/search-results/search-results.component.ts @@ -241,6 +241,7 @@ export class ArticleSearchResultsComponent implements OnInit, OnDestroy { // Zeige Select Radio Button nicht an wenn Item Archivartikel oder Fortsetzungsartikel ist const isArchiv = item?.catalogAvailability?.status === 1; const isFortsetzung = item?.features?.find((i) => i?.key === 'PFO'); + return !(isArchiv || isFortsetzung); } diff --git a/apps/page/checkout/src/lib/checkout-review/checkout-review.component.ts b/apps/page/checkout/src/lib/checkout-review/checkout-review.component.ts index b02a54ed6..d601f9d1d 100644 --- a/apps/page/checkout/src/lib/checkout-review/checkout-review.component.ts +++ b/apps/page/checkout/src/lib/checkout-review/checkout-review.component.ts @@ -6,8 +6,6 @@ import { DomainCheckoutService } from '@domain/checkout'; import { AvailabilityDTO, DestinationDTO, NotificationChannel, ShoppingCartItemDTO, ShoppingCartDTO } from '@swagger/checkout'; import { UiErrorModalComponent, UiMessageModalComponent, UiModalService } from '@ui/modal'; import { PrintModalData, PrintModalComponent } from '@modal/printer'; -import { PurchasingOptionsModalComponent, PurchasingOptionsModalData } from '../modals/purchasing-options-modal'; -import { PurchasingOptions } from '../modals/purchasing-options-modal/purchasing-options-modal.store'; import { AuthService } from '@core/auth'; import { first, map, shareReplay, switchMap, take, takeUntil, tap, withLatestFrom } from 'rxjs/operators'; import { Subject, NEVER, combineLatest, BehaviorSubject } from 'rxjs'; @@ -15,13 +13,11 @@ import { DomainCatalogService } from '@domain/catalog'; import { BreadcrumbService } from '@core/breadcrumb'; import { DomainPrinterService } from '@domain/printer'; import { CheckoutDummyComponent } from '../checkout-dummy/checkout-dummy.component'; -import { ResponseArgsOfItemDTO } from '@swagger/cat'; import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { emailNotificationValidator, mobileNotificationValidator } from '@shared/components/notification-channel-control'; -import { PurchasingOptionsListModalComponent } from '../modals/purchasing-options-list-modal'; -import { PurchasingOptionsListModalData } from '../modals/purchasing-options-list-modal/purchasing-options-list-modal.data'; import { ComponentStore, tapResponse } from '@ngrx/component-store'; import { CheckoutDummyData } from '../checkout-dummy/checkout-dummy-data'; +import { PurchaseOptionsModalService } from '@shared/modals/purchase-options-modal'; export interface CheckoutReviewComponentState { shoppingCart: ShoppingCartDTO; @@ -242,7 +238,8 @@ export class CheckoutReviewComponent extends ComponentStore branches.find((branch) => (branchId ? branch.id === branchId : branch.branchNumber === branchNo)))) - .toPromise(); - - if (!branch) { - branch = await this.applicationService.getSelectedBranch$().pipe(take(1)).toPromise(); - } - - let catalogItem: ResponseArgsOfItemDTO; - if (Number.isInteger(shoppingCartItem?.product?.catalogProductNumber)) { - catalogItem = await this.domainCatalogService - .getDetailsById({ id: Number(shoppingCartItem.product.catalogProductNumber) }) - .toPromise(); - } else if (shoppingCartItem?.product?.ean) { - catalogItem = await this.domainCatalogService.getDetailsByEan({ ean: shoppingCartItem.product.ean }).toPromise(); - } - - let takeAwayAvailability: AvailabilityDTO; - if (!!catalogItem?.result?.product) { - takeAwayAvailability = await this.availabilityService - .getTakeAwayAvailability({ - item: { - itemId: catalogItem.result.id, - ean: catalogItem.result.product.ean, - price: catalogItem.result.catalogAvailability?.price, - }, - quantity, - }) - .toPromise(); - } - - const pickupAvailability = await this.availabilityService - .getPickUpAvailability({ - item: { - itemId: Number(shoppingCartItem.product.catalogProductNumber), - ean: shoppingCartItem.product.ean, - price: shoppingCartItem.availability.price, - }, - branch, - quantity, - }) - .toPromise(); - - const digAvailability = await this.availabilityService - .getDigDeliveryAvailability({ - item: { - itemId: Number(shoppingCartItem.product.catalogProductNumber), - ean: shoppingCartItem.product.ean, - price: shoppingCartItem.availability.price, - }, - quantity, - }) - .toPromise(); - - const b2bAvailability = await this.availabilityService - .getB2bDeliveryAvailability({ - item: { - itemId: Number(shoppingCartItem.product.catalogProductNumber), - ean: shoppingCartItem.product.ean, - price: shoppingCartItem.availability.price, - }, - quantity, - }) - .toPromise(); - - const downloadAvailability = await this.availabilityService - .getDownloadAvailability({ - item: { - itemId: Number(shoppingCartItem.product.catalogProductNumber), - ean: shoppingCartItem.product.ean, - price: shoppingCartItem.availability.price, - }, - }) - .toPromise(); - - let availableOptions: PurchasingOptions[] = []; - const availabilities: { [key: string]: AvailabilityDTO } = {}; - - if (takeAwayAvailability && this.availabilityService.isAvailable({ availability: takeAwayAvailability })) { - availableOptions.push('take-away'); - availabilities['take-away'] = takeAwayAvailability; - } - - if (downloadAvailability && this.availabilityService.isAvailable({ availability: downloadAvailability })) { - availableOptions.push('download'); - availabilities['download'] = downloadAvailability; - } - - if (pickupAvailability && this.availabilityService.isAvailable({ availability: pickupAvailability[0] })) { - if (pickupAvailability[1].availableFor) { - if ((pickupAvailability[1].availableFor & 2) === 2) { - availableOptions.push('pick-up'); - availabilities['pick-up'] = pickupAvailability[0]; - } - } else { - availableOptions.push('pick-up'); - availabilities['pick-up'] = pickupAvailability[0]; - } - - if (!customerFeatures?.webshop && this.availabilityService.isAvailable({ availability: b2bAvailability })) { - availableOptions.push('b2b-delivery'); - availabilities['b2b-delivery'] = b2bAvailability; - } - } - - if (digAvailability && this.availabilityService.isAvailable({ availability: digAvailability }) && !customerFeatures?.b2b) { - availableOptions.push('dig-delivery'); - availabilities['dig-delivery'] = digAvailability; - } - - if (availableOptions.includes('dig-delivery') && availableOptions.includes('b2b-delivery')) { - let shippingAvailability = await this.availabilityService - .getDeliveryAvailability({ - item: { - itemId: Number(shoppingCartItem.product.catalogProductNumber), - ean: shoppingCartItem.product.ean, - price: shoppingCartItem.availability.price, - }, - quantity, - }) - .toPromise(); - if (shippingAvailability && this.availabilityService.isAvailable({ availability: shippingAvailability })) { - availableOptions.push('delivery'); - availabilities['delivery'] = shippingAvailability; - availableOptions = availableOptions.filter((option) => !(option === 'dig-delivery' || option === 'b2b-delivery')); - } - } - - this.loadingOnItemChangeById$.next(undefined); - this.cdr.markForCheck(); - - const itemId = Number(shoppingCartItem.product.catalogProductNumber); - const modal = this.uiModal.open({ - content: PurchasingOptionsModalComponent, - data: { - availableOptions, - item: { - id: itemId, - itemId: itemId, - product: shoppingCartItem.product, - price: shoppingCartItem.availability.price, - catalogAvailability: { - status: shoppingCartItem.availability.availabilityType, - price: shoppingCartItem.availability.price, - }, - }, - shoppingCartItem, - branchId: branch?.id, - processId: this.applicationService.activatedProcessId, - availabilities, - } as PurchasingOptionsModalData, - }); - - modal.afterClosed$.pipe(takeUntil(this._orderCompleted)).subscribe(() => { - this.setQuantityError(shoppingCartItem, undefined, false); + this._purchaseOptionsModalService.open({ + processId: this.applicationService.activatedProcessId, + items: [shoppingCartItem], + type: 'update', }); } @@ -816,16 +652,10 @@ export class CheckoutReviewComponent extends ComponentStore - - - -

Möchten Sie die Artikel
geliefert bekommen?

-

Versandkostenfrei

diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/delivery-option/delivery-option-list.component.ts b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/delivery-option/delivery-option-list.component.ts deleted file mode 100644 index 871659b82..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/delivery-option/delivery-option-list.component.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { PurchasingOptionsListModalStore } from '../purchasing-options-list-modal.store'; - -@Component({ - selector: 'page-delivery-option-list', - templateUrl: 'delivery-option-list.component.html', - styleUrls: ['../list-options.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class DeliveryOptionListComponent { - selectedOption$ = this._store.selectedFilterOption$; - optionChipDisabled$ = this._store.fetchingAvailabilities$; - - constructor(private _store: PurchasingOptionsListModalStore) {} - - optionChange(option: string) { - if (this._store.selectedFilterOption === option) { - this._store.selectedFilterOption = undefined; - } else { - this._store.selectedFilterOption = option; - } - } -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/delivery-option/index.ts b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/delivery-option/index.ts deleted file mode 100644 index 6e41cd327..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/delivery-option/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// start:ng42.barrel -export * from './delivery-option-list.component'; -// end:ng42.barrel diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/index.ts b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/index.ts deleted file mode 100644 index 306f73a2a..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -// start:ng42.barrel -export * from './delivery-option'; -export * from './pick-up-option'; -export * from './take-away-option'; -export * from './purchasing-options-list-modal.component'; -export * from './purchasing-options-list-modal.module'; -// end:ng42.barrel diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/list-options.scss b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/list-options.scss deleted file mode 100644 index 1a3b20512..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/list-options.scss +++ /dev/null @@ -1,44 +0,0 @@ -:host { - @apply block w-72; -} - -.option-icon { - @apply text-ucla-blue mx-auto; - width: 40px; - - .truck-b2b { - margin-top: -21px; - margin-bottom: -12px; - width: 70px; - } -} - -.option-chip { - @apply rounded-full text-base px-4 py-3 bg-glitter text-inactive-customer border-none font-bold; - - &.selected { - @apply bg-active-customer text-white; - } -} - -.option-description { - @apply my-2; -} - -.option-select { - @apply mt-4 mb-4 border-2 border-solid border-brand text-brand text-cta-l font-bold bg-white rounded-full py-3 px-6; -} - -p { - @apply my-4; -} - -::ng-deep page-purchasing-options-list-modal ui-branch-dropdown .wrapper { - @apply mx-auto; - width: 80%; -} - -::ng-deep page-pick-up-option-list .option-chip:disabled, -::ng-deep page-take-away-option-list .option-chip:disabled { - @apply bg-disabled-branch border-disabled-branch text-white; -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/pick-up-option/index.ts b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/pick-up-option/index.ts deleted file mode 100644 index 10f4eeaa1..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/pick-up-option/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// start:ng42.barrel -export * from './pick-up-option-list.component'; -// end:ng42.barrel diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/pick-up-option/pick-up-option-list.component.html b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/pick-up-option/pick-up-option-list.component.html deleted file mode 100644 index 72369a4ff..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/pick-up-option/pick-up-option-list.component.html +++ /dev/null @@ -1,18 +0,0 @@ -
- -
- -

Möchten Sie die Artikel
in einer unserer Filialen
abholen?

- - diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/pick-up-option/pick-up-option-list.component.ts b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/pick-up-option/pick-up-option-list.component.ts deleted file mode 100644 index da06e40f9..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/pick-up-option/pick-up-option-list.component.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { BranchDTO } from '@swagger/checkout'; -import { combineLatest } from 'rxjs'; -import { first, map } from 'rxjs/operators'; -import { PurchasingOptionsListModalStore } from '../purchasing-options-list-modal.store'; - -@Component({ - selector: 'page-pick-up-option-list', - templateUrl: 'pick-up-option-list.component.html', - styleUrls: ['../list-options.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class PickUpOptionListComponent { - branches$ = this._store.branches$; - selectedBranch$ = this._store.selectedPickUpBranch$.pipe( - map((branch) => { - // Determins if branch is targetBranch - if (branch?.branchType === 1) { - return branch.name; - } - }) - ); - selectedOption$ = this._store.selectedFilterOption$; - optionChipDisabled$ = combineLatest([this._store.fetchingAvailabilities$, this.selectedBranch$]).pipe( - map(([fetching, selectedBranch]) => { - return fetching || !selectedBranch; - }) - ); - - constructor(private _store: PurchasingOptionsListModalStore) {} - - optionChange(option: string) { - if (this._store.selectedFilterOption === option) { - this._store.selectedFilterOption = undefined; - } else { - this._store.selectedFilterOption = option; - } - } - - async selectBranch(branch: BranchDTO) { - this._store.lastSelectedFilterOption$.next(undefined); - - this._store.selectedPickUpBranch = branch; - - const shoppingCartItems = await this._store.shoppingCartItems$.pipe(first()).toPromise(); - shoppingCartItems.forEach((item) => this._store.loadPickUpAvailability({ item })); - } -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-item/purchasing-options-list-item.component.html b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-item/purchasing-options-list-item.component.html deleted file mode 100644 index 9f0c47c25..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-item/purchasing-options-list-item.component.html +++ /dev/null @@ -1,115 +0,0 @@ -
- -
- -
- {{ item.product.contributors }} -
- -
- {{ item?.product?.name }} -
- - -
- {{ canAdd }} -
-
- -
- - {{ item?.product?.formatDetail }} -
- -
- {{ item?.product?.manufacturer | substr: 18 }} | {{ item?.product?.ean }}
- {{ item?.product?.volume }} | - {{ item?.product?.publicationDate | date: 'dd. MMMM yyyy' }} -
- -
-
- - - - Günstigerer Preis aus Hugendubel Katalog wird übernommen - - - -
{{ price?.value?.value | currency: price?.value?.currency:'code' }}
-
- -
- - -
-
- -
- -
- -
-
- - - Derzeit nicht bestellbar - - - - Verfügbar als -
- - {{ takeAwayAvailabilites?.inStock }}x ab sofort -
- -
- - {{ (pickUpAvailabilities$ | async)?.estimatedShippingDate | date: 'dd. MMMM yyyy' }} -
- -
- - - - {{ (deliveryDigAvailabilities?.estimatedDelivery?.start | date: 'EEE, dd.MM.')?.replace('.', '') }} - - {{ (deliveryDigAvailabilities?.estimatedDelivery?.stop | date: 'EEE, dd.MM.')?.replace('.', '') }} - - - {{ deliveryDigAvailabilities.estimatedShippingDate | date: 'dd. MMMM yyyy' }} - - -
- - -
- - {{ (deliveryB2bAvailabilities$ | async)?.estimatedShippingDate | date: 'dd. MMMM yyyy' }} -
-
-
-
-
diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-item/purchasing-options-list-item.component.scss b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-item/purchasing-options-list-item.component.scss deleted file mode 100644 index 17b525016..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-item/purchasing-options-list-item.component.scss +++ /dev/null @@ -1,180 +0,0 @@ -:host { - @apply text-black no-underline grid py-4; - grid-template-columns: 102px 60% auto; - grid-template-rows: auto; - grid-template-areas: - 'item-thumbnail item-contributors item-contributors' - 'item-thumbnail item-title item-price-stock' - 'item-thumbnail item-can-add item-price-stock' - 'item-thumbnail item-format item-price-stock' - 'item-thumbnail item-info item-select' - 'item-thumbnail item-date item-select' - 'item-thumbnail item-ssc item-select' - 'item-thumbnail item-availability item-select'; -} - -.item-thumbnail { - grid-area: item-thumbnail; - width: 70px; - @apply mr-8; - img { - max-width: 100%; - max-height: 150px; - @apply rounded-card shadow-cta; - } -} - -.item-contributors { - @apply font-bold no-underline; - grid-area: item-contributors; - height: 22px; - text-overflow: ellipsis; - overflow: hidden; - max-width: 600px; - white-space: nowrap; -} - -.item-title { - grid-area: item-title; - @apply font-bold text-lg mb-4; - max-height: 64px; -} - -.item-title.xl { - @apply font-bold text-xl; -} - -.item-title.lg { - @apply font-bold text-lg; -} - -.item-title.md { - @apply font-bold text-base; -} - -.item-title.sm { - @apply font-bold text-sm; -} - -.item-title.xs { - @apply font-bold text-xs; -} - -.item-format { - grid-area: item-format; - @apply flex flex-row items-center font-bold text-lg whitespace-nowrap; - - img { - @apply mr-2; - } -} - -.item-price-stock { - grid-area: item-price-stock; - @apply font-bold text-xl text-right; - - .price { - @apply flex flex-row justify-end items-center; - } - - .info-tooltip-button { - @apply border-font-customer border-solid border-2 bg-white rounded-full text-base font-bold mr-3; - border-style: outset; - width: 31px; - height: 31px; - margin-left: 10px; - } - - .quantity-btn { - @apply flex flex-row items-center p-0 w-full text-right outline-none border-none bg-transparent text-lg; - } - - .quantity-btn-icon { - @apply inline-flex ml-2; - transition: transform 200ms ease-in-out; - } - - ui-quantity-dropdown { - @apply flex justify-end mt-2; - - &.disabled { - @apply cursor-not-allowed bg-inactive-branch; - } - } -} - -.item-stock { - grid-area: item-stock; - @apply flex flex-row justify-end items-baseline font-bold text-lg; - - ui-icon { - @apply text-active-customer mr-2; - } -} - -.item-info { - grid-area: item-info; -} - -.item-availability { - @apply flex flex-row items-center mt-4 whitespace-nowrap text-sm; - grid-area: item-availability; - - .fetching { - @apply w-52 h-px-20; - background-color: #e6eff9; - animation: load 0.75s linear infinite; - } - - span { - @apply mr-4; - } - - .instock { - @apply mr-2 font-bold; - } - - ui-icon { - @apply text-dark-cerulean mx-2; - } - - div { - @apply mr-4 flex items-center; - } - - .truck { - @apply -mb-px-5 -mt-px-5; - } - - .truck-b2b { - @apply -mb-px-10 -mt-px-10; - } -} - -.item-can-add { - @apply text-xl text-dark-goldenrod font-semibold; - grid-area: item-can-add; -} - -.item-select { - @apply flex items-center justify-end; - grid-area: item-select; - - ui-select-bullet { - @apply cursor-pointer p-4 -m-4 z-dropdown; - - &.disabled { - @apply cursor-not-allowed; - } - } -} - -.hint { - @apply text-xl text-dark-goldenrod font-semibold; -} - -@screen desktop { - .item-availability { - @apply text-base; - } -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-item/purchasing-options-list-item.component.ts b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-item/purchasing-options-list-item.component.ts deleted file mode 100644 index 26d3ba2bc..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-item/purchasing-options-list-item.component.ts +++ /dev/null @@ -1,250 +0,0 @@ -import { Component, ChangeDetectionStrategy, Input } from '@angular/core'; -import { DomainAvailabilityService } from '@domain/availability'; -import { AvailabilityDTO, ShoppingCartItemDTO } from '@swagger/checkout'; -import { combineLatest, Observable } from 'rxjs'; -import { filter, map, shareReplay, withLatestFrom } from 'rxjs/operators'; -import { PurchasingOptionsListModalStore } from '../purchasing-options-list-modal.store'; - -@Component({ - selector: 'page-purchasing-options-list-item', - templateUrl: 'purchasing-options-list-item.component.html', - styleUrls: ['purchasing-options-list-item.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class PurchasingOptionsListItemComponent { - @Input() - item: ShoppingCartItemDTO; - - isSelected$ = this._store.selectedShoppingCartItems$.pipe( - map((selectedShoppingCartItems) => !!selectedShoppingCartItems?.find((item) => item.id === this.item.id)) - ); - - fetchingAvailabilities$ = combineLatest([ - this._store.takeAwayAvailabilities$, - this._store.pickUpAvailabilities$, - this._store.deliveryAvailabilities$, - this._store.deliveryDigAvailabilities$, - this._store.deliveryB2bAvailabilities$, - ]).pipe( - map( - ([takeAway, pickUp, delivery, digDelivery, b2bDelivery]) => - !takeAway || - takeAway[this.item.product.catalogProductNumber] === true || - !pickUp || - pickUp[this.item.product.catalogProductNumber] === true || - !delivery || - delivery[this.item.product.catalogProductNumber] === true || - !digDelivery || - digDelivery[this.item.product.catalogProductNumber] === true || - !b2bDelivery || - b2bDelivery[this.item.product.catalogProductNumber] === true - ) - ); - - takeAwayAvailabilities$ = this._store.takeAwayAvailabilities$.pipe( - map((takeAwayAvailabilities) => { - if (takeAwayAvailabilities) { - const availability = takeAwayAvailabilities[this.item.product?.catalogProductNumber]; - - if (typeof availability === 'boolean') { - return undefined; - } - - return availability; - } - - return undefined; - }), - shareReplay() - ); - - pickUpAvailabilities$: Observable = this._store.pickUpAvailabilities$.pipe( - map((pickUpAvailabilities) => { - if (pickUpAvailabilities) { - const availability = pickUpAvailabilities[this.item.product?.catalogProductNumber]; - - if (typeof availability === 'boolean') { - return undefined; - } - - return availability; - } - - return undefined; - }), - shareReplay() - ); - - deliveryAvailabilities$ = this._store.deliveryAvailabilities$.pipe( - map((shippingAvailabilities) => (!!shippingAvailabilities ? shippingAvailabilities[this.item.product?.catalogProductNumber] : [])), - shareReplay() - ); - - deliveryDigAvailabilities$: Observable = this._store.deliveryDigAvailabilities$.pipe( - map((shippingAvailabilities) => { - if (shippingAvailabilities) { - const availability = shippingAvailabilities[this.item.product?.catalogProductNumber]; - - if (typeof availability === 'boolean') { - return undefined; - } - - return availability; - } - - return undefined; - }), - shareReplay() - ); - - deliveryB2bAvailabilities$ = this._store.deliveryB2bAvailabilities$.pipe( - map((shippingAvailabilities) => { - if (shippingAvailabilities) { - const availability = shippingAvailabilities[this.item.product?.catalogProductNumber]; - - if (typeof availability === 'boolean') { - return undefined; - } - - return availability; - } - - return undefined; - }), - shareReplay() - ); - - notAvailable$ = combineLatest([ - this.fetchingAvailabilities$, - this.takeAwayAvailabilities$, - this.pickUpAvailabilities$, - this.deliveryAvailabilities$, - this.deliveryDigAvailabilities$, - this.deliveryB2bAvailabilities$, - ]).pipe( - map( - ([fetching, takeAway, store, delivery, deliveryDig, deliveryB2b]) => - !fetching && !takeAway && !store && !delivery && !deliveryDig && !deliveryB2b - ) - ); - - showTooltip$ = this._store.selectedFilterOption$.pipe( - withLatestFrom(this.deliveryAvailabilities$, this.deliveryDigAvailabilities$), - map(([option, delivery, deliveryDig]) => { - if (option === 'delivery') { - const deliveryAvailability = (deliveryDig as AvailabilityDTO) || (delivery as AvailabilityDTO); - - const shippingPrice = deliveryAvailability?.price?.value?.value; - const catalogPrice = this.item?.availability?.price?.value?.value; - return catalogPrice < shippingPrice; - } - return false; - }) - ); - - price$ = combineLatest([this.fetchingAvailabilities$, this._store.selectedFilterOption$]).pipe( - filter(([fetching]) => !fetching), - withLatestFrom( - this.takeAwayAvailabilities$, - this.pickUpAvailabilities$, - this.deliveryAvailabilities$, - this.deliveryDigAvailabilities$, - this.deliveryB2bAvailabilities$ - ), - map(([[_, option], takeAway, pickUp, delivery, deliveryDig, deliveryB2b]) => { - let availability; - - switch (option) { - case 'take-away': - availability = takeAway; - break; - case 'pick-up': - availability = pickUp; - break; - case 'delivery': - if (deliveryDig || delivery) { - availability = deliveryDig || delivery; - } else { - availability = deliveryB2b; - option = 'b2b-delivery'; - availability.p; - } - break; - default: - return this.item.availability?.price ?? this.item.unitPrice; - } - - return this._availabilityService.getPriceForAvailability(option, this.item.availability, availability) ?? this.item.unitPrice; - }) - ); - - selectDisabled$ = this._store.selectedFilterOption$.pipe(map((selectedFilterOption) => !selectedFilterOption)); - - selectVisible$ = combineLatest([this._store.canAdd$, this._store.selectedShoppingCartItems$]).pipe( - withLatestFrom( - this._store.selectedFilterOption$, - this._store.deliveryAvailabilities$, - this._store.deliveryDigAvailabilities$, - this._store.deliveryB2bAvailabilities$, - this._store.fetchingAvailabilities$ - ), - map(([[canAdd, items], option, delivery, deliveryDig, deliveryB2b, fetching]) => { - if (!option || fetching) { - return false; - } - - // Select immer sichtbar bei ausgewählten Items - if (items?.find((item) => item.product?.catalogProductNumber === this.item.product?.catalogProductNumber)) { - return true; - } - - // Select nur anzeigen, wenn ein anderes ausgewähltes Item die gleiche Verfügbarkeit hat (B2B Versand z.B.) - if (items?.length > 0 && option === 'delivery' && canAdd[this.item.product.catalogProductNumber]?.status < 2) { - if (items.every((item) => delivery[item.product?.catalogProductNumber]) && delivery[this.item.product?.catalogProductNumber]) { - return true; - } - - if ( - items.every((item) => deliveryDig[item.product?.catalogProductNumber]) && - deliveryDig[this.item.product?.catalogProductNumber] - ) { - return true; - } - - if ( - items.every((item) => deliveryB2b[item.product?.catalogProductNumber]) && - deliveryB2b[this.item.product?.catalogProductNumber] - ) { - return true; - } - return false; - } - - return canAdd && canAdd[this.item.product.catalogProductNumber]?.status < 2; - }) - ); - - canAdd$ = this._store.canAdd$.pipe( - filter((canAdd) => !!this.item && !!canAdd), - map((canAdd) => !!canAdd[this.item.product.catalogProductNumber]?.message) - ); - - quantityRange$ = combineLatest([this._store.selectedFilterOption$, this.takeAwayAvailabilities$]).pipe( - map(([option, availability]) => (option === 'take-away' ? (availability as AvailabilityDTO)?.inStock : 999)) - ); - - constructor(private _store: PurchasingOptionsListModalStore, private _availabilityService: DomainAvailabilityService) {} - - selected(value: boolean) { - this._store.selectShoppingCartItem([this.item], value); - } - - changeQuantity(quantity: number) { - if (quantity === 0) { - this._store.removeShoppingCartItem(this.item); - } else { - this._store.updateItemQuantity({ itemId: this.item.id, quantity }); - this._store.loadAvailabilities({ items: [{ ...this.item, quantity }] }); - } - } -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.component.html b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.component.html deleted file mode 100644 index 458c5d87e..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.component.html +++ /dev/null @@ -1,49 +0,0 @@ -
- - - -
- -
-
- - - - - - - - -
- {{ (selectedShoppingCartItems$ | async)?.length || 0 }} von {{ shoppingCartItems?.length || 0 }} Artikeln -
- -
-
- - -
-
-
- - -
Keine Artikel für die ausgewählte Kaufoption verfügbar
-
-
- -
- -
diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.component.scss b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.component.scss deleted file mode 100644 index 6ef913335..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.component.scss +++ /dev/null @@ -1,49 +0,0 @@ -:host { - @apply block box-border; -} - -.options { - @apply flex flex-row box-border text-center justify-center mt-4; -} - -.items { - min-height: 440px; - - .item-actions { - @apply text-right; - - .cta-select-all { - @apply text-brand bg-transparent text-base font-bold outline-none border-none px-4 py-4 -mr-4; - - &:disabled { - @apply text-inactive-branch; - } - } - } - - .item-list { - @apply overflow-y-scroll overflow-x-hidden -ml-4; - max-height: calc(100vh - 580px); - width: calc(100% + 2rem); - - page-purchasing-options-list-item { - @apply px-4; - } - } - - .empty-message { - @apply text-inactive-branch my-8 text-center font-bold; - } -} - -.actions { - @apply flex justify-center mt-8; - - .cta-apply { - @apply text-white border-2 border-solid border-brand bg-brand font-bold text-lg px-4 py-2 rounded-full; - - &:disabled { - @apply bg-inactive-branch border-inactive-branch; - } - } -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.component.ts b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.component.ts deleted file mode 100644 index 9de532964..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.component.ts +++ /dev/null @@ -1,266 +0,0 @@ -import { Component, ChangeDetectionStrategy, OnInit } from '@angular/core'; -import { DomainAvailabilityService } from '@domain/availability'; -import { DomainCheckoutService } from '@domain/checkout'; -import { ShoppingCartItemDTO, UpdateShoppingCartItemDTO } from '@swagger/checkout'; -import { UiErrorModalComponent, UiModalRef, UiModalService } from '@ui/modal'; -import { BehaviorSubject, combineLatest, Subject } from 'rxjs'; -import { debounceTime, filter, first, map, shareReplay, takeUntil, withLatestFrom } from 'rxjs/operators'; -import { PurchasingOptionsListModalData } from './purchasing-options-list-modal.data'; -import { PurchasingOptionsListModalStore } from './purchasing-options-list-modal.store'; - -@Component({ - selector: 'page-purchasing-options-list-modal', - templateUrl: 'purchasing-options-list-modal.component.html', - styleUrls: ['purchasing-options-list-modal.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [PurchasingOptionsListModalStore], -}) -export class PurchasingOptionsListModalComponent implements OnInit { - private _onDestroy$ = new Subject(); - - addItemsLoader$ = new BehaviorSubject(false); - - shoppingCartItems$ = combineLatest([ - this._store.fetchingAvailabilities$, - this._store.selectedFilterOption$, - this._store.shoppingCartItems$, - ]).pipe( - withLatestFrom( - this._store.takeAwayAvailabilities$, - this._store.pickUpAvailabilities$, - this._store.deliveryAvailabilities$, - this._store.deliveryDigAvailabilities$, - this._store.deliveryB2bAvailabilities$ - ), - map( - ([ - [_, selectedFilterOption, shoppingCartItems], - takeAwayAvailability, - pickUpAvailability, - deliveryAvailability, - deliveryDigAvailability, - deliveryB2bAvailability, - ]) => { - if (!!takeAwayAvailability && !!pickUpAvailability && !!deliveryAvailability) { - switch (selectedFilterOption) { - case 'take-away': - return shoppingCartItems.filter((item) => !!takeAwayAvailability[item.product?.catalogProductNumber]); - case 'pick-up': - return shoppingCartItems.filter((item) => !!pickUpAvailability[item.product?.catalogProductNumber]); - case 'delivery': - return shoppingCartItems.filter( - (item) => - !!deliveryAvailability[item.product?.catalogProductNumber] || - !!deliveryDigAvailability[item.product?.catalogProductNumber] || - !!deliveryB2bAvailability[item.product?.catalogProductNumber] - ); - } - } - return shoppingCartItems; - } - ), - map((shoppingCartItems) => shoppingCartItems?.sort((a, b) => a.product?.name.localeCompare(b.product?.name))), - shareReplay() - ); - - selectedShoppingCartItems$ = this._store.selectedShoppingCartItems$; - - allShoppingCartItemsSelected$ = combineLatest([this.shoppingCartItems$, this.selectedShoppingCartItems$]).pipe( - map( - ([shoppingCartItems, selectedShoppingCartItems]) => - shoppingCartItems.every((item) => selectedShoppingCartItems.find((i) => item.id === i.id)) && shoppingCartItems?.length > 0 - ) - ); - - canAddItems$ = this._store.canAdd$.pipe( - map((canAdd) => { - for (const key in canAdd) { - if (Object.prototype.hasOwnProperty.call(canAdd, key)) { - if (!!canAdd[key]?.message) { - return false; - } - } - } - return true; - }), - shareReplay() - ); - - selectAllCtaDisabled$ = combineLatest([this._store.selectedFilterOption$, this.canAddItems$]).pipe( - withLatestFrom(this.shoppingCartItems$), - map(([[selectedFilterOption, canAddItems], items]) => !selectedFilterOption || items?.length === 0 || !canAddItems) - ); - - applyCtaDisabled$ = combineLatest([this.addItemsLoader$, this._store.selectedFilterOption$, this._store.selectedShoppingCartItems$]).pipe( - withLatestFrom(this.shoppingCartItems$), - map( - ([[addItemsLoader, selectedFilterOption, selectedShoppingCartItems], shoppingCartItems]) => - addItemsLoader || !selectedFilterOption || shoppingCartItems?.length === 0 || selectedShoppingCartItems?.length === 0 - ) - ); - - constructor( - private _modalRef: UiModalRef, - private _modal: UiModalService, - private _store: PurchasingOptionsListModalStore, - private _availability: DomainAvailabilityService, - private _checkout: DomainCheckoutService - ) { - this._store.shoppingCartItems = _modalRef.data.shoppingCartItems; - this._store.customerFeatures = _modalRef.data.customerFeatures; - this._store.processId = _modalRef.data.processId; - } - - ngOnInit() { - this._store.loadBranches(); - - // Beim Wechsel der ausgewählten Filteroption oder der Branches die Auswahl leeren - combineLatest([this._store.selectedFilterOption$, this._store.selectedTakeAwayBranch$, this._store.selectedPickUpBranch$]) - .pipe(takeUntil(this._onDestroy$)) - .subscribe(() => this._store.clearSelectedShoppingCartItems()); - - this._store.selectedFilterOption$ - .pipe(takeUntil(this._onDestroy$), withLatestFrom(this.shoppingCartItems$)) - .subscribe(([option, items]) => this.checkCanAdd(option, items)); - - this._store.fetchingAvailabilities$ - .pipe( - takeUntil(this._onDestroy$), - debounceTime(250), - filter((fetching) => !fetching), - withLatestFrom(this.shoppingCartItems$, this._store.selectedFilterOption$) - ) - .subscribe(([_, items, option]) => this.checkCanAdd(option, items)); - - this.canAddItems$ - .pipe(takeUntil(this._onDestroy$), withLatestFrom(this.shoppingCartItems$, this._store.selectedFilterOption$)) - .subscribe(([showSelectAll, items, option]) => { - if (items?.length > 0 && this._store.lastSelectedFilterOption$.value !== option) { - this.selectAll(items, showSelectAll && !!option); - } - - // Nach dem Übernehmen von Items wird eine neue CanAdd Abfrage ausgeführt, in diesem Fall soll aber nicht alles ausgewählt werden - this._store.lastSelectedFilterOption$.next(option); - }); - } - - checkCanAdd(selectedFilterOption: string, items: ShoppingCartItemDTO[]) { - if (!!selectedFilterOption && items?.length > 0) { - this._store.checkCanAddItems(items); - } else { - this._store.patchState({ canAdd: {} }); - } - } - - async selectAll(items: ShoppingCartItemDTO[], value: boolean) { - this._store.selectShoppingCartItem(items, value); - } - - async apply() { - this.addItemsLoader$.next(true); - - try { - const shoppingCartItems = await this._store.shoppingCartItems$.pipe(first()).toPromise(); - const items = await this._store.selectedShoppingCartItems$.pipe(first()).toPromise(); - const takeAwayAvailabilities = await this._store.takeAwayAvailabilities$.pipe(first()).toPromise(); - const pickupAvailabilities = await this._store.pickUpAvailabilities$.pipe(first()).toPromise(); - const deliveryAvailabilities = await this._store.deliveryAvailabilities$.pipe(first()).toPromise(); - const deliveryB2bAvailabilities = await this._store.deliveryB2bAvailabilities$.pipe(first()).toPromise(); - const deliveryDigAvailabilities = await this._store.deliveryDigAvailabilities$.pipe(first()).toPromise(); - const selectedTakeAwayBranch = await this._store.selectedTakeAwayBranch$.pipe(first()).toPromise(); - const selectedPickUpBranch = await this._store.selectedPickUpBranch$.pipe(first()).toPromise(); - let option = this._store.selectedFilterOption; - - for (const item of items) { - let availability; - switch (this._store.selectedFilterOption) { - case 'take-away': - availability = takeAwayAvailabilities[item.product.catalogProductNumber]; - break; - case 'pick-up': - availability = pickupAvailabilities[item.product.catalogProductNumber]; - break; - case 'delivery': - if ( - deliveryDigAvailabilities[item.product.catalogProductNumber] && - deliveryB2bAvailabilities[item.product.catalogProductNumber] && - deliveryAvailabilities[item.product.catalogProductNumber] - ) { - availability = deliveryAvailabilities[item.product.catalogProductNumber]; - } else if (deliveryDigAvailabilities[item.product.catalogProductNumber]) { - availability = deliveryDigAvailabilities[item.product.catalogProductNumber]; - } else if (deliveryB2bAvailabilities[item.product.catalogProductNumber]) { - availability = deliveryB2bAvailabilities[item.product.catalogProductNumber]; - option = 'b2b-delivery'; - } - break; - } - - const price = this._availability.getPriceForAvailability(option, item.availability, availability); - - // Negative Preise und nicht vorhandene Availability ignorieren - if (price?.value?.value < 0 || !availability) { - continue; - } - - const updateItem: UpdateShoppingCartItemDTO = { - quantity: item.quantity, - availability: { - ...availability, - price: price ? price : item.unitPrice, - }, - promotion: item?.promotion?.points ? { points: item.promotion.points } : undefined, - }; - - switch (this._store.selectedFilterOption) { - case 'take-away': - updateItem.destination = { - data: { target: 1, targetBranch: { id: selectedTakeAwayBranch.id } }, - }; - break; - case 'pick-up': - updateItem.destination = { - data: { target: 1, targetBranch: { id: selectedPickUpBranch.id } }, - }; - break; - case 'delivery': - case 'dig-delivery': - case 'b2b-delivery': - updateItem.destination = { - data: { target: 2, logistician: availability?.logistician }, - }; - break; - } - - await this._checkout - .updateItemInShoppingCart({ - processId: this._modalRef.data.processId, - shoppingCartItemId: item.id, - update: { - ...updateItem, - }, - }) - .toPromise(); - } - - const remainingItems = shoppingCartItems.filter((i) => !items.find((j) => i.id === j.id)); - this._store.shoppingCartItems = [...remainingItems]; - - this._store.clearSelectedShoppingCartItems(); - - if (remainingItems?.length === 0) { - this._modalRef.close(); - } - } catch (error) { - console.error(error); - this._modal.open({ content: UiErrorModalComponent, data: error, title: 'Fehler beim Hinzufügen zum Warenkorb' }); - } finally { - this.addItemsLoader$.next(false); - } - - const shoppingCartItems = await this.shoppingCartItems$.pipe(first()).toPromise(); - if (shoppingCartItems?.length > 0) { - this._store.checkCanAddItems(shoppingCartItems); - } - } -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.data.ts b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.data.ts deleted file mode 100644 index dcf3a5d78..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.data.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ShoppingCartItemDTO } from '@swagger/checkout'; - -export interface PurchasingOptionsListModalData { - processId: number; - shoppingCartItems?: ShoppingCartItemDTO[]; - customerFeatures: { [key: string]: string }; -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.module.ts b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.module.ts deleted file mode 100644 index 6d9eecd90..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.module.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { PurchasingOptionsListModalComponent } from './purchasing-options-list-modal.component'; -import { UiIconModule } from '@ui/icon'; -import { ProductImageModule } from '@cdn/product-image'; -import { UiCommonModule } from '@ui/common'; -import { UiSelectBulletModule } from '@ui/select-bullet'; -import { UiQuantityDropdownModule } from '@ui/quantity-dropdown'; -import { PickUpOptionListComponent } from './pick-up-option/pick-up-option-list.component'; -import { TakeAwayOptionListComponent } from './take-away-option/take-away-option-list.component'; -import { DeliveryOptionListComponent } from './delivery-option/delivery-option-list.component'; -import { PurchasingOptionsListItemComponent } from './purchasing-options-list-item/purchasing-options-list-item.component'; -import { FormsModule } from '@angular/forms'; -import { UiBranchDropdownModule } from '@ui/branch-dropdown'; -import { UiTooltipModule } from '@ui/tooltip'; -import { UiSpinnerModule } from 'apps/ui/spinner/src/lib/ui-spinner.module'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - UiCommonModule, - UiIconModule, - UiSelectBulletModule, - UiQuantityDropdownModule, - ProductImageModule, - UiBranchDropdownModule, - UiTooltipModule, - UiSpinnerModule, - ], - exports: [PurchasingOptionsListModalComponent], - declarations: [ - PurchasingOptionsListModalComponent, - PurchasingOptionsListItemComponent, - PickUpOptionListComponent, - TakeAwayOptionListComponent, - DeliveryOptionListComponent, - ], -}) -export class PurchasingOptionsListModalModule {} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.store.ts b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.store.ts deleted file mode 100644 index e9c8b7c27..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/purchasing-options-list-modal.store.ts +++ /dev/null @@ -1,598 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ComponentStore, tapResponse } from '@ngrx/component-store'; -import { AvailabilityDTO, BranchDTO, ShoppingCartItemDTO } from '@swagger/checkout'; -import { map, mergeMap, switchMap, withLatestFrom } from 'rxjs/operators'; -import { DomainAvailabilityService } from '@domain/availability'; -import { BehaviorSubject, combineLatest, Observable } from 'rxjs'; -import { DomainCheckoutService } from '@domain/checkout'; -import { ApplicationService } from '@core/application'; - -interface PurchasingOptionsListModalState { - processId: number; - shoppingCartItems: ShoppingCartItemDTO[]; - selectedFilterOption: string; - takeAwayAvailabilities: { [key: string]: AvailabilityDTO | true }; - pickUpAvailabilities: { [key: string]: AvailabilityDTO | true }; - deliveryAvailabilities: { [key: string]: AvailabilityDTO | true }; - deliveryB2bAvailabilities: { [key: string]: AvailabilityDTO | true }; - deliveryDigAvailabilities: { [key: string]: AvailabilityDTO | true }; - customerFeatures: { [key: string]: string }; - canAdd: { [key: string]: { message: string; status: number } }; - selectedShoppingCartItems: ShoppingCartItemDTO[]; - branches: BranchDTO[]; - currentBranch: BranchDTO; - selectedTakeAwayBranch: BranchDTO; - selectedPickUpBranch: BranchDTO; -} - -@Injectable() -export class PurchasingOptionsListModalStore extends ComponentStore { - lastSelectedFilterOption$ = new BehaviorSubject(undefined); - - branches$ = this.select((s) => s.branches); - currentBranch$ = this.select((s) => s.currentBranch); - takeAwayAvailabilities$ = this.select((s) => s.takeAwayAvailabilities); - pickUpAvailabilities$ = this.select((s) => s.pickUpAvailabilities); - deliveryAvailabilities$ = this.select((s) => s.deliveryAvailabilities); - deliveryB2bAvailabilities$ = this.select((s) => s.deliveryB2bAvailabilities); - canAdd$ = this.select((s) => s.canAdd); - deliveryDigAvailabilities$ = this.select((s) => s.deliveryDigAvailabilities); - - shoppingCartItems$ = this.select((s) => s.shoppingCartItems); - - set shoppingCartItems(shoppingCartItems: ShoppingCartItemDTO[]) { - shoppingCartItems = shoppingCartItems.sort((a, b) => a.product?.name.localeCompare(b.product.name)); - this.patchState({ shoppingCartItems }); - } - - processId$ = this.select((s) => s.processId); - - set processId(processId: number) { - this.patchState({ processId }); - } - - customerFeatures$ = this.select((s) => s.customerFeatures); - - set customerFeatures(customerFeatures: { [key: string]: string }) { - this.patchState({ customerFeatures }); - } - - selectedFilterOption$ = this.select((s) => s.selectedFilterOption); - - set selectedFilterOption(selectedFilterOption: string) { - this.patchState({ selectedFilterOption }); - } - - get selectedFilterOption() { - return this.get((s) => s.selectedFilterOption); - } - - selectedShoppingCartItems$ = this.select((s) => s.selectedShoppingCartItems); - - get selectedShoppingCartItems() { - return this.get((s) => s.selectedShoppingCartItems); - } - - selectedTakeAwayBranch$ = this.select((s) => s.selectedTakeAwayBranch); - - set selectedTakeAwayBranch(selectedTakeAwayBranch: BranchDTO) { - this.patchState({ selectedTakeAwayBranch }); - } - - selectedPickUpBranch$ = this.select((s) => s.selectedPickUpBranch); - - set selectedPickUpBranch(selectedPickUpBranch: BranchDTO) { - this.patchState({ selectedPickUpBranch }); - } - - fetchingAvailabilities$ = combineLatest([this.takeAwayAvailabilities$, this.pickUpAvailabilities$, this.deliveryAvailabilities$]).pipe( - map(([takeAway, pickUp, delivery]) => { - const fetchingCheck = (obj) => { - for (const key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - const element = obj[key]; - if (typeof element === 'boolean') { - return true; - } - } - } - return false; - }; - return !takeAway || fetchingCheck(takeAway) || !pickUp || fetchingCheck(pickUp) || !delivery || fetchingCheck(delivery); - }) - ); - - constructor( - private _availabilityService: DomainAvailabilityService, - private _checkoutService: DomainCheckoutService, - private _application: ApplicationService - ) { - super({ - processId: undefined, - shoppingCartItems: [], - selectedFilterOption: undefined, - pickUpAvailabilities: undefined, - deliveryAvailabilities: undefined, - takeAwayAvailabilities: undefined, - deliveryB2bAvailabilities: undefined, - deliveryDigAvailabilities: undefined, - selectedShoppingCartItems: [], - branches: [], - currentBranch: undefined, - selectedTakeAwayBranch: undefined, - selectedPickUpBranch: undefined, - customerFeatures: undefined, - canAdd: undefined, - }); - } - - loadAvailabilities(options: { items?: ShoppingCartItemDTO[] }) { - const shoppingCartItems = options.items ?? this.get((s) => s.shoppingCartItems); - - for (const item of shoppingCartItems) { - this.loadTakeAwayAvailability({ item }); - this.loadPickUpAvailability({ item }); - this.loadDeliveryAvailability({ item }); - this.loadDeliveryB2bAvailability({ item }); - this.loadDeliveryDigAvailability({ item }); - } - } - - readonly setAvailabilityFetching = this.updater((state, { name, id, fetching }: { name: string; id: string; fetching?: boolean }) => { - const availability = { ...state[name] }; - - if (fetching) { - availability[id] = fetching; - } else { - delete availability[id]; - } - - return { - ...state, - [name]: { - ...availability, - }, - }; - }); - - readonly setAvailability = this.updater((state, { name, availability }: { name: string; availability: any }) => { - const av = { ...state[name] }; - - if (this._availabilityService.isAvailable({ availability })) { - av[availability.itemId] = availability; - } - - return { - ...state, - [name]: av, - }; - }); - - loadPickUpAvailability = this.effect((options$: Observable<{ item?: ShoppingCartItemDTO }>) => - options$.pipe( - withLatestFrom(this.selectedPickUpBranch$), - mergeMap(([options, branch]) => { - this.setAvailabilityFetching({ - name: 'pickUpAvailabilities', - id: options.item.product.catalogProductNumber, - fetching: true, - }); - - return this._availabilityService - .getPickUpAvailability({ - item: { - itemId: +options.item.product.catalogProductNumber, - ean: options.item.product.ean, - price: options.item.availability.price, - }, - branch, - quantity: options.item.quantity, - }) - .pipe( - map((av) => { - if (av?.length > 0) { - if (av[1].availableFor) { - if ((av[1].availableFor & 2) === 2) { - return av[0]; - } else { - return undefined; - } - } else { - return av[0]; - } - } - }), - tapResponse( - (availability) => { - this.setAvailabilityFetching({ - name: 'pickUpAvailabilities', - id: options.item.product.catalogProductNumber, - }); - this.setAvailability({ - name: 'pickUpAvailabilities', - availability: { ...availability, itemId: options.item.product.catalogProductNumber }, - }); - }, - () => { - this.setAvailabilityFetching({ - name: 'pickUpAvailabilities', - id: options.item.product.catalogProductNumber, - fetching: false, - }); - this.setAvailability({ name: 'pickUpAvailabilities', availability: {} }); - } - ) - ); - }) - ) - ); - - loadDeliveryAvailability = this.effect((options$: Observable<{ item?: ShoppingCartItemDTO }>) => - options$.pipe( - mergeMap((options) => { - this.setAvailabilityFetching({ - name: 'deliveryAvailabilities', - id: options.item.product.catalogProductNumber, - fetching: true, - }); - - return this._availabilityService - .getDeliveryAvailability({ - item: { - itemId: +options.item.product.catalogProductNumber, - ean: options.item.product.ean, - price: options.item.availability.price, - }, - quantity: options.item.quantity, - }) - .pipe( - tapResponse( - (availability) => { - this.setAvailabilityFetching({ - name: 'deliveryAvailabilities', - id: options.item.product.catalogProductNumber, - }); - this.setAvailability({ - name: 'deliveryAvailabilities', - availability: { ...availability, itemId: options.item.product.catalogProductNumber }, - }); - }, - () => { - this.setAvailabilityFetching({ - name: 'deliveryAvailabilities', - id: options.item.product.catalogProductNumber, - fetching: false, - }); - this.setAvailability({ name: 'deliveryAvailabilities', availability: {} }); - } - ) - ); - }) - ) - ); - - loadDeliveryB2bAvailability = this.effect((options$: Observable<{ item?: ShoppingCartItemDTO }>) => - options$.pipe( - mergeMap((options) => { - this.setAvailabilityFetching({ - name: 'deliveryB2bAvailabilities', - id: options.item.product.catalogProductNumber, - fetching: true, - }); - - return this._availabilityService - .getB2bDeliveryAvailability({ - item: { - itemId: +options.item.product.catalogProductNumber, - ean: options.item.product.ean, - price: options.item.availability.price, - }, - quantity: options.item.quantity, - }) - .pipe( - tapResponse( - (availability) => { - this.setAvailabilityFetching({ - name: 'deliveryB2bAvailabilities', - id: options.item.product.catalogProductNumber, - }); - - this.setAvailability({ - name: 'deliveryB2bAvailabilities', - availability: { ...availability, itemId: options.item.product.catalogProductNumber }, - }); - }, - () => { - this.setAvailabilityFetching({ - name: 'deliveryB2bAvailabilities', - id: options.item.product.catalogProductNumber, - fetching: false, - }); - this.setAvailability({ name: 'deliveryB2bAvailabilities', availability: {} }); - } - ) - ); - }) - ) - ); - - loadDeliveryDigAvailability = this.effect((options$: Observable<{ item?: ShoppingCartItemDTO }>) => - options$.pipe( - mergeMap((options) => { - this.setAvailabilityFetching({ - name: 'deliveryDigAvailabilities', - id: options.item.product.catalogProductNumber, - fetching: true, - }); - - return this._availabilityService - .getDigDeliveryAvailability({ - item: { - itemId: +options.item.product.catalogProductNumber, - ean: options.item.product.ean, - price: options.item.availability.price, - }, - quantity: options.item.quantity, - }) - .pipe( - tapResponse( - (availability) => { - this.setAvailabilityFetching({ - name: 'deliveryDigAvailabilities', - id: options.item.product.catalogProductNumber, - }); - this.setAvailability({ - name: 'deliveryDigAvailabilities', - availability: { ...availability, itemId: options.item.product.catalogProductNumber }, - }); - }, - () => { - this.setAvailabilityFetching({ - name: 'deliveryDigAvailabilities', - id: options.item.product.catalogProductNumber, - fetching: false, - }); - this.setAvailability({ name: 'deliveryDigAvailabilities', availability: {} }); - } - ) - ); - }) - ) - ); - - loadTakeAwayAvailability = this.effect((options$: Observable<{ item?: ShoppingCartItemDTO }>) => - options$.pipe( - withLatestFrom(this.selectedTakeAwayBranch$), - mergeMap(([options, branch]) => { - this.setAvailabilityFetching({ - name: 'takeAwayAvailabilities', - id: options.item.product.catalogProductNumber, - fetching: true, - }); - - return this._availabilityService - .getTakeAwayAvailabilityByBranch({ - itemId: +options.item.product.catalogProductNumber, - price: options.item.availability.price, - quantity: options.item.quantity, - branch, - }) - .pipe( - tapResponse( - (availability) => { - this.setAvailabilityFetching({ - name: 'takeAwayAvailabilities', - id: options.item.product.catalogProductNumber, - }); - this.setAvailability({ - name: 'takeAwayAvailabilities', - availability: { ...availability, itemId: options.item.product.catalogProductNumber }, - }); - }, - () => { - this.setAvailabilityFetching({ - name: 'takeAwayAvailabilities', - id: options.item.product.catalogProductNumber, - fetching: false, - }); - this.setAvailability({ name: 'takeAwayAvailabilities', availability: {} }); - } - ) - ); - }) - ) - ); - - getCurrentBranch() { - return combineLatest([this._application.getSelectedBranch$(), this._availabilityService.getDefaultBranch()]).pipe( - map(([selectedBranch, defaultBranch]) => selectedBranch || defaultBranch) - ); - } - - loadBranches = this.effect(($) => - $.pipe( - switchMap(() => - this._availabilityService.getBranches().pipe( - map((branches) => - branches.filter( - (branch) => branch.status === 1 && branch.branchType === 1 && branch.isOnline === true && branch.isShippingEnabled === true - ) - ), - withLatestFrom(this.getCurrentBranch()), - tapResponse( - ([branches, currentBranch]) => { - this.patchState({ - branches, - selectedTakeAwayBranch: currentBranch, - selectedPickUpBranch: currentBranch, - currentBranch, - }); - this.loadAvailabilities({}); - }, - () => - this.patchState({ - branches: [], - selectedTakeAwayBranch: undefined, - selectedPickUpBranch: undefined, - currentBranch: undefined, - }) - ) - ) - ) - ) - ); - - checkCanAddItems = this.effect((items$: Observable) => - items$.pipe( - withLatestFrom( - this.processId$, - this.selectedFilterOption$, - this.takeAwayAvailabilities$, - this.pickUpAvailabilities$, - this.deliveryAvailabilities$, - this.deliveryB2bAvailabilities$, - this.deliveryDigAvailabilities$ - ), - mergeMap(([items, processId, selectedOption, takeAway, pickUp, delivery, deliveryB2b, deliveryDig]) => { - let orderType: string; - const payload = items.map((item) => { - switch (selectedOption) { - case 'take-away': - orderType = 'Rücklage'; - return { - availabilities: [this.getOlaAvailability(takeAway[item.product.catalogProductNumber], item)], - id: item.product.catalogProductNumber, - }; - case 'pick-up': - orderType = 'Abholung'; - return { - availabilities: [this.getOlaAvailability(pickUp[item.product.catalogProductNumber], item)], - id: item.product.catalogProductNumber, - }; - case 'delivery': - orderType = 'Versand'; - if ( - deliveryDig[item.product.catalogProductNumber] && - deliveryB2b[item.product.catalogProductNumber] && - delivery[item.product.catalogProductNumber] - ) { - return { - availabilities: [this.getOlaAvailability(delivery[item.product.catalogProductNumber], item)], - id: item.product.catalogProductNumber, - }; - } else if (deliveryDig[item.product.catalogProductNumber]) { - return { - availabilities: [this.getOlaAvailability(deliveryDig[item.product.catalogProductNumber], item)], - id: item.product.catalogProductNumber, - }; - } else if (deliveryB2b[item.product.catalogProductNumber]) { - return { - availabilities: [this.getOlaAvailability(deliveryB2b[item.product.catalogProductNumber], item)], - id: item.product.catalogProductNumber, - }; - } - break; - } - }); - - return this._checkoutService.canAddItems({ processId, payload, orderType }).pipe( - tapResponse( - (result: any) => { - const canAdd = {}; - - result?.forEach((r) => { - canAdd[r.id] = { message: r.message, status: r.status }; - }); - - this.patchState({ canAdd }); - }, - (error: Error) => { - const canAdd = {}; - - items?.forEach((i) => { - canAdd[i.product?.catalogProductNumber] = { message: error?.message }; - }); - - this.patchState({ canAdd }); - } - ) - ); - }) - ) - ); - - getOlaAvailability(availability: AvailabilityDTO, item: ShoppingCartItemDTO) { - return { - qty: item.quantity, - ean: item.product.ean, - itemId: item.product.catalogProductNumber, - format: item.product.format, - at: availability?.estimatedShippingDate, - isPrebooked: availability?.isPrebooked, - status: availability?.availabilityType, - logisticianId: availability?.logistician?.id, - price: availability?.price, - ssc: availability?.ssc, - sscText: availability?.sscText, - supplierId: availability?.supplier?.id, - }; - } - - readonly updateItemQuantity = this.updater((state, value: { itemId: number; quantity: number }) => { - const itemToUpdate = state.shoppingCartItems.find((item) => item.id === value.itemId); - const otherItems = state.shoppingCartItems.filter((item) => item.id !== value.itemId); - const updatedItem = { ...itemToUpdate, quantity: value.quantity }; - const shoppingCartItems = [...otherItems, updatedItem].sort((a, b) => a.product?.name.localeCompare(b.product.name)); - - // Ausgewählte Items auch aktualisieren - let selectedShoppingCartItems = state.selectedShoppingCartItems; - if (state.selectedShoppingCartItems.find((item) => item.id === value.itemId)) { - const selectedItems = state.selectedShoppingCartItems.filter((item) => item.id !== value.itemId); - selectedShoppingCartItems = [...selectedItems, updatedItem].sort((a, b) => a.product?.name.localeCompare(b.product.name)); - } - - return { - ...state, - shoppingCartItems, - selectedShoppingCartItems, - }; - }); - - async removeShoppingCartItem(item: ShoppingCartItemDTO) { - const items = this.get((s) => s.shoppingCartItems); - const processId = this.get((s) => s.processId); - - await this._checkoutService - .updateItemInShoppingCart({ - processId, - shoppingCartItemId: item.id, - update: { - quantity: 0, - availability: null, - }, - }) - .toPromise(); - this.selectShoppingCartItem([item], false); - const shoppingCartItems = items.filter((i) => i.id !== item.id); - this.patchState({ shoppingCartItems }); - } - - selectShoppingCartItem(shoppingCartItems: ShoppingCartItemDTO[], selected: boolean) { - if (selected) { - this.patchState({ - selectedShoppingCartItems: [ - ...this.selectedShoppingCartItems.filter((item) => !shoppingCartItems.find((i) => item.id === i.id)), - ...shoppingCartItems, - ], - }); - } else { - this.patchState({ - selectedShoppingCartItems: this.selectedShoppingCartItems.filter((item) => !shoppingCartItems.find((i) => item.id === i.id)), - }); - } - } - - clearSelectedShoppingCartItems() { - this.patchState({ selectedShoppingCartItems: [] }); - } -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/take-away-option/index.ts b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/take-away-option/index.ts deleted file mode 100644 index 4f6a53709..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/take-away-option/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// start:ng42.barrel -export * from './take-away-option-list.component'; -// end:ng42.barrel diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/take-away-option/take-away-option-list.component.html b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/take-away-option/take-away-option-list.component.html deleted file mode 100644 index 30a81f526..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/take-away-option/take-away-option-list.component.html +++ /dev/null @@ -1,18 +0,0 @@ -
- -
- -

Möchten Sie die Artikel
zurücklegen lassen oder
sofort mitnehmen?

- - diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/take-away-option/take-away-option-list.component.ts b/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/take-away-option/take-away-option-list.component.ts deleted file mode 100644 index 2331374bf..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-list-modal/take-away-option/take-away-option-list.component.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { BranchDTO } from '@swagger/checkout'; -import { combineLatest } from 'rxjs'; -import { first, map } from 'rxjs/operators'; -import { PurchasingOptionsListModalStore } from '../purchasing-options-list-modal.store'; - -@Component({ - selector: 'page-take-away-option-list', - templateUrl: 'take-away-option-list.component.html', - styleUrls: ['../list-options.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class TakeAwayOptionListComponent { - branches$ = this._store.branches$; - selectedBranch$ = this._store.selectedTakeAwayBranch$.pipe( - map((branch) => { - // Determins if branch is targetBranch - if (branch?.branchType === 1) { - return branch.name; - } - }) - ); - selectedOption$ = this._store.selectedFilterOption$; - optionChipDisabled$ = combineLatest([this._store.fetchingAvailabilities$, this.selectedBranch$]).pipe( - map(([fetching, selectedBranch]) => { - return fetching || !selectedBranch; - }) - ); - - constructor(private _store: PurchasingOptionsListModalStore) {} - - optionChange(option: string) { - if (this._store.selectedFilterOption === option) { - this._store.selectedFilterOption = undefined; - } else { - this._store.selectedFilterOption = option; - } - } - - async selectBranch(branch: BranchDTO) { - this._store.lastSelectedFilterOption$.next(undefined); - - this._store.selectedTakeAwayBranch = branch; - - const shoppingCartItems = await this._store.shoppingCartItems$.pipe(first()).toPromise(); - shoppingCartItems.forEach((item) => this._store.loadTakeAwayAvailability({ item })); - } -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/b2b-delivery-option/b2b-delivery-option.component.html b/apps/page/checkout/src/lib/modals/purchasing-options-modal/b2b-delivery-option/b2b-delivery-option.component.html deleted file mode 100644 index aaee41162..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/b2b-delivery-option/b2b-delivery-option.component.html +++ /dev/null @@ -1,23 +0,0 @@ - - -
- -
- -

B2B Versand

-

- Als B2B Kunde können wir Ihnen den Artikel auch liefern. -

- {{ price?.value?.value | currency: price?.value?.currency:'code' }} -
- Versandkostenfrei - Versanddatum {{ availability?.estimatedShippingDate | date: 'shortDate' }} -
- -
-
-
diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/b2b-delivery-option/b2b-delivery-option.component.scss b/apps/page/checkout/src/lib/modals/purchasing-options-modal/b2b-delivery-option/b2b-delivery-option.component.scss deleted file mode 100644 index 12edba0f5..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/b2b-delivery-option/b2b-delivery-option.component.scss +++ /dev/null @@ -1,9 +0,0 @@ -.option-icon { - margin-top: -12px; - width: 70px; -} - -h4 { - @apply font-bold; - margin-top: -2px; -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/b2b-delivery-option/b2b-delivery-option.component.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/b2b-delivery-option/b2b-delivery-option.component.ts deleted file mode 100644 index 12b020c0d..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/b2b-delivery-option/b2b-delivery-option.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { DomainAvailabilityService } from '@domain/availability'; -import { combineLatest } from 'rxjs'; -import { map } from 'rxjs/operators'; -import { PurchasingOptionsModalStore } from '../purchasing-options-modal.store'; - -@Component({ - selector: 'page-b2b-delivery-option', - templateUrl: 'b2b-delivery-option.component.html', - styleUrls: ['../option.scss', 'b2b-delivery-option.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class B2BDeliveryOptionComponent { - readonly item$ = this._purchasingOptionsModalStore.selectItem; - - readonly availability$ = this._purchasingOptionsModalStore.selectAvailabilities.pipe(map((ava) => ava['b2b-delivery'])); - - readonly price$ = combineLatest([this.availability$, this.item$]).pipe( - map(([availability, item]) => this._availabilityService.getPriceForAvailability('b2b-delivery', item.catalogAvailability, availability)) - ); - - constructor(private _purchasingOptionsModalStore: PurchasingOptionsModalStore, private _availabilityService: DomainAvailabilityService) {} - - select() { - this._purchasingOptionsModalStore.setOption('b2b-delivery'); - } -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/b2b-delivery-option/index.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/b2b-delivery-option/index.ts deleted file mode 100644 index 53694b9d2..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/b2b-delivery-option/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// start:ng42.barrel -export * from './b2b-delivery-option.component'; -// end:ng42.barrel diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/delivery-option/delivery-option.component.html b/apps/page/checkout/src/lib/modals/purchasing-options-modal/delivery-option/delivery-option.component.html deleted file mode 100644 index 25c6ab8dc..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/delivery-option/delivery-option.component.html +++ /dev/null @@ -1,41 +0,0 @@ - - -
- -
-

Versand

-

- Möchten Sie den Artikel geliefert bekommen? -

-
- {{ price?.value?.value | currency: price?.value?.currency:'code' }} - - - - Günstigerer Preis aus Hugendubel Katalog wird übernommen - - -
-
- Versandkostenfrei - - Zustellung zwischen
- {{ (availability?.estimatedDelivery?.start | date: 'EEE, dd.MM.')?.replace('.', '') }} und - {{ (availability?.estimatedDelivery?.stop | date: 'EEE, dd.MM.')?.replace('.', '') }} -
- - - Versanddatum {{ availability?.estimatedShippingDate | date }} - - -
- -
-
-
diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/delivery-option/delivery-option.component.scss b/apps/page/checkout/src/lib/modals/purchasing-options-modal/delivery-option/delivery-option.component.scss deleted file mode 100644 index 66b02bbf6..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/delivery-option/delivery-option.component.scss +++ /dev/null @@ -1,15 +0,0 @@ -.price-wrapper { - @apply mt-2; -} - -.info-tooltip-button { - @apply border-font-customer border-solid border-2 bg-white rounded-full text-base font-bold; - border-style: outset; - width: 31px; - height: 31px; - margin-left: 10px; -} - -h4 { - @apply font-bold; -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/delivery-option/delivery-option.component.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/delivery-option/delivery-option.component.ts deleted file mode 100644 index 0dff4497b..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/delivery-option/delivery-option.component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { DomainAvailabilityService } from '@domain/availability'; -import { combineLatest } from 'rxjs'; -import { map } from 'rxjs/operators'; -import { PurchasingOptionsModalStore } from '../purchasing-options-modal.store'; - -@Component({ - selector: 'page-delivery-option', - templateUrl: 'delivery-option.component.html', - styleUrls: ['../option.scss', 'delivery-option.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class DeliveryOptionComponent { - readonly item$ = this._purchasingOptionsModalStore.selectItem; - - readonly availability$ = this._purchasingOptionsModalStore.selectAvailabilities.pipe(map((ava) => ava['delivery'])); - - readonly showTooltip$ = combineLatest([this.availability$, this.item$]).pipe( - map(([availability, item]) => { - const shippingPrice = availability?.price?.value?.value; - const catalogPrice = item?.catalogAvailability?.price?.value?.value; - return catalogPrice < shippingPrice; - }) - ); - - readonly price$ = combineLatest([this.availability$, this.item$]).pipe( - map(([availability, item]) => this._availabilityService.getPriceForAvailability('delivery', item.catalogAvailability, availability)) - ); - - constructor(private _purchasingOptionsModalStore: PurchasingOptionsModalStore, private _availabilityService: DomainAvailabilityService) {} - - select() { - this._purchasingOptionsModalStore.setOption('delivery'); - } -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/delivery-option/index.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/delivery-option/index.ts deleted file mode 100644 index e60e17abc..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/delivery-option/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// start:ng42.barrel -export * from './delivery-option.component'; -// end:ng42.barrel diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/dig-delivery-option/dig-delivery-option.component.html b/apps/page/checkout/src/lib/modals/purchasing-options-modal/dig-delivery-option/dig-delivery-option.component.html deleted file mode 100644 index 1b4b36579..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/dig-delivery-option/dig-delivery-option.component.html +++ /dev/null @@ -1,40 +0,0 @@ - - -
- -
-

DIG Versand

-

Möchten Sie den Artikel geliefert bekommen?

-
- {{ price?.value?.value | currency: price?.value?.currency:'code' }} - - - - Günstigerer Preis aus Hugendubel Katalog wird übernommen - - -
-
- Versandkostenfrei - - Zustellung zwischen
- {{ (availability?.estimatedDelivery?.start | date: 'EEE, dd.MM.')?.replace('.', '') }} und - {{ (availability?.estimatedDelivery?.stop | date: 'EEE, dd.MM.')?.replace('.', '') }} -
- - - Versanddatum {{ availability?.estimatedShippingDate | date }} - - - -
- -
-
-
diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/dig-delivery-option/dig-delivery-option.component.scss b/apps/page/checkout/src/lib/modals/purchasing-options-modal/dig-delivery-option/dig-delivery-option.component.scss deleted file mode 100644 index a1016c46f..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/dig-delivery-option/dig-delivery-option.component.scss +++ /dev/null @@ -1,15 +0,0 @@ -.price-wrapper { - @apply mt-2; -} - -.info-tooltip-button { - @apply border-font-customer bg-white rounded-full text-base font-bold; - border-style: outset; - width: 31px; - height: 31px; - margin-left: 10px; -} - -h4 { - @apply font-bold; -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/dig-delivery-option/dig-delivery-option.component.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/dig-delivery-option/dig-delivery-option.component.ts deleted file mode 100644 index d2fc840b3..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/dig-delivery-option/dig-delivery-option.component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { DomainAvailabilityService } from '@domain/availability'; -import { combineLatest } from 'rxjs'; -import { map } from 'rxjs/operators'; -import { PurchasingOptionsModalStore } from '../purchasing-options-modal.store'; - -@Component({ - selector: 'page-dig-delivery-option', - templateUrl: 'dig-delivery-option.component.html', - styleUrls: ['../option.scss', 'dig-delivery-option.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class DigDeliveryOptionComponent { - readonly item$ = this._purchasingOptionsModalStore.selectItem; - - readonly availability$ = this._purchasingOptionsModalStore.selectAvailabilities.pipe(map((ava) => ava['dig-delivery'])); - - readonly showTooltip$ = combineLatest([this.availability$, this.item$]).pipe( - map(([availability, item]) => { - const shippingPrice = availability?.price?.value?.value; - const catalogPrice = item?.catalogAvailability?.price?.value?.value; - return catalogPrice < shippingPrice; - }) - ); - - readonly price$ = combineLatest([this.availability$, this.item$]).pipe( - map(([availability, item]) => this._availabilityService.getPriceForAvailability('dig-delivery', item.catalogAvailability, availability)) - ); - - constructor(private _purchasingOptionsModalStore: PurchasingOptionsModalStore, private _availabilityService: DomainAvailabilityService) {} - - select() { - this._purchasingOptionsModalStore.setOption('dig-delivery'); - } -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/dig-delivery-option/index.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/dig-delivery-option/index.ts deleted file mode 100644 index 7975b4515..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/dig-delivery-option/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// start:ng42.barrel -export * from './dig-delivery-option.component'; -// end:ng42.barrel diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/index.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/index.ts deleted file mode 100644 index bfd065315..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -// start:ng42.barrel -export * from './options'; -export * from './purchasing-options-modal.component'; -export * from './purchasing-options-modal.data'; -export * from './purchasing-options-modal.module'; -// end:ng42.barrel diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/option.scss b/apps/page/checkout/src/lib/modals/purchasing-options-modal/option.scss deleted file mode 100644 index ee3272cf4..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/option.scss +++ /dev/null @@ -1,41 +0,0 @@ -:host { - @apply flex flex-col box-border text-center; - width: 202px; -} - -.option-icon { - @apply text-ucla-blue mx-auto; - width: 40px; -} - -h4 { - @apply text-2xl mt-4 mb-0; -} - -p { - @apply my-2; -} - -.price { - @apply font-bold my-2; -} - -.delivery { - @apply text-regular mb-px-5; -} - -.date { - @apply text-cta-l whitespace-nowrap; -} - -.grow { - @apply flex-grow; -} - -.select-option { - @apply mt-4 mb-4 border-2 border-solid border-brand text-brand text-cta-l font-bold bg-white rounded-full py-3 px-6; -} - -.select-option:disabled { - @apply bg-disabled-branch border-disabled-branch text-white; -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/options.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/options.ts deleted file mode 100644 index 632226693..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/options.ts +++ /dev/null @@ -1,7 +0,0 @@ -// start:ng42.barrel -export * from './b2b-delivery-option'; -export * from './delivery-option'; -export * from './dig-delivery-option'; -export * from './pick-up-option'; -export * from './take-away-option'; -// end:ng42.barrel diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/pick-up-option/index.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/pick-up-option/index.ts deleted file mode 100644 index 2a3a21483..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/pick-up-option/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// start:ng42.barrel -export * from './pick-up-option.component'; -// end:ng42.barrel diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/pick-up-option/pick-up-option.component.html b/apps/page/checkout/src/lib/modals/purchasing-options-modal/pick-up-option/pick-up-option.component.html deleted file mode 100644 index 33bdf3630..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/pick-up-option/pick-up-option.component.html +++ /dev/null @@ -1,32 +0,0 @@ - - -
- -
-

Abholung

-

- Möchten Sie den Artikel in einer unserer Filialen abholen? -

- {{ price?.value?.value | currency: price?.value?.currency:'code' }} - - Abholung ab {{ (availability$ | async)?.estimatedShippingDate | date: 'shortDate' }} -
-
- -
-
-
diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/pick-up-option/pick-up-option.component.scss b/apps/page/checkout/src/lib/modals/purchasing-options-modal/pick-up-option/pick-up-option.component.scss deleted file mode 100644 index f06ca392f..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/pick-up-option/pick-up-option.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -h4 { - @apply font-bold; -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/pick-up-option/pick-up-option.component.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/pick-up-option/pick-up-option.component.ts deleted file mode 100644 index 6f50cd560..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/pick-up-option/pick-up-option.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { DomainAvailabilityService } from '@domain/availability'; -import { BranchDTO } from '@swagger/checkout'; -import { combineLatest, Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; -import { PurchasingOptionsModalStore } from '../purchasing-options-modal.store'; - -@Component({ - selector: 'page-pick-up-option', - templateUrl: 'pick-up-option.component.html', - styleUrls: ['../option.scss', 'pick-up-option.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class PickUpOptionComponent { - branches$: Observable = this._purchasingOptionsModalStore.selectAvailableBranches; - selected$: Observable = this._purchasingOptionsModalStore.selectBranch.pipe( - map((branch) => { - // Determins if branch is targetBranch - if (branch?.branchType === 1) { - return branch.name; - } - }) - ); - - readonly item$ = this._purchasingOptionsModalStore.selectItem; - - readonly availability$ = this._purchasingOptionsModalStore.selectAvailabilities.pipe(map((ava) => ava['pick-up'])); - - readonly price$ = combineLatest([this.availability$, this.item$]).pipe( - map(([availability, item]) => this._availabilityService.getPriceForAvailability('pick-up', item.catalogAvailability, availability)) - ); - - constructor(private _purchasingOptionsModalStore: PurchasingOptionsModalStore, private _availabilityService: DomainAvailabilityService) {} - - select() { - this._purchasingOptionsModalStore.setOption('pick-up'); - } - - selectBranch(branch: BranchDTO) { - this._purchasingOptionsModalStore.setBranch(branch); - } -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/price-input/purchasing-options-modal-price-input.component.html b/apps/page/checkout/src/lib/modals/purchasing-options-modal/price-input/purchasing-options-modal-price-input.component.html deleted file mode 100644 index ce41b2434..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/price-input/purchasing-options-modal-price-input.component.html +++ /dev/null @@ -1,11 +0,0 @@ -
- - - - - - - - - -
diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/price-input/purchasing-options-modal-price-input.component.scss b/apps/page/checkout/src/lib/modals/purchasing-options-modal/price-input/purchasing-options-modal-price-input.component.scss deleted file mode 100644 index 5ad437f6a..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/price-input/purchasing-options-modal-price-input.component.scss +++ /dev/null @@ -1,11 +0,0 @@ -form { - @apply grid grid-flow-col items-center justify-end gap-4 mb-2; -} - -ui-form-control { - @apply w-32; -} - -::ng-deep page-purchasing-options-modal-price-input ui-form-control .input-wrapper input { - @apply w-20; -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/price-input/purchasing-options-modal-price-input.component.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/price-input/purchasing-options-modal-price-input.component.ts deleted file mode 100644 index 097aad1f0..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/price-input/purchasing-options-modal-price-input.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; -import { DomainOmsService } from '@domain/oms'; -import { VATType } from '@swagger/checkout'; -import { VATDTO } from '@swagger/oms'; -import { Observable, Subscription } from 'rxjs'; -import { shareReplay } from 'rxjs/operators'; - -@Component({ - selector: 'page-purchasing-options-modal-price-input', - templateUrl: 'purchasing-options-modal-price-input.component.html', - styleUrls: ['purchasing-options-modal-price-input.component.scss'], - providers: [UntypedFormBuilder], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class PurchasingOptionsModalPriceInputComponent implements OnInit { - control: UntypedFormGroup; - - vats$: Observable = this._omsService.getVATs().pipe(shareReplay()); - - @Output() - priceChanged = new EventEmitter(); - - @Output() - vatChanged = new EventEmitter(); - - private _subscriptions = new Subscription(); - - @Input() - hideVat = false; - - @Input() - maxValue = 99999; - - constructor(private _omsService: DomainOmsService, private _fb: UntypedFormBuilder) {} - - ngOnInit() { - this.initForm(); - } - - initForm() { - const fb = this._fb; - this.control = fb.group({ - price: fb.control(undefined, [Validators.required, Validators.pattern(/^\d+([\,]\d{1,2})?$/), Validators.max(this.maxValue)]), - vat: fb.control(0, [Validators.required]), - }); - - this._subscriptions.add( - this.control.get('price').valueChanges.subscribe((price) => this.priceChanged.emit(Number(String(price).replace(',', '.')))) - ); - this._subscriptions.add(this.control.get('vat').valueChanges.subscribe(this.vatChanged)); - - this.control.markAllAsTouched(); - } -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/price-input/purchasing-options-modal-price-input.module.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/price-input/purchasing-options-modal-price-input.module.ts deleted file mode 100644 index c03d43e7d..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/price-input/purchasing-options-modal-price-input.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { UiFormControlModule } from '@ui/form-control'; -import { UiInputModule } from '@ui/input'; -import { UiSelectModule } from '@ui/select'; - -import { PurchasingOptionsModalPriceInputComponent } from './purchasing-options-modal-price-input.component'; - -@NgModule({ - imports: [CommonModule, UiFormControlModule, UiInputModule, UiSelectModule, FormsModule, ReactiveFormsModule], - exports: [PurchasingOptionsModalPriceInputComponent], - declarations: [PurchasingOptionsModalPriceInputComponent], - providers: [], -}) -export class PurchasingOptionsModalPriceInputModule {} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.component.html b/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.component.html deleted file mode 100644 index e718dfeb3..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.component.html +++ /dev/null @@ -1,140 +0,0 @@ - - - -
- - - - - - - - -

Derzeit nicht bestellbar

-
-
-
- - - - -
-
-
- - - - - {{ option | purchaseOptionName }} -
- - in der Filiale: - {{ (branch$ | async)?.name }} - -
-
-
- -
-
{{ item?.product?.contributors }} - {{ item?.product?.name }}
- {{ canAddError }} -
-
- - {{ item?.product?.formatDetail }} -
- -
- {{ price$ | async | currency: item?.catalogAvailability?.price?.value?.currency || 'EUR':'code' }} -
-
- - Abholung ab {{ (getAvailability(option) | async)?.estimatedShippingDate | date: 'shortDate' }} - - - - - Zustellung zwischen {{ (availability?.estimatedDelivery?.start | date: 'EEE, dd.MM.')?.replace('.', '') }} und - {{ (availability?.estimatedDelivery?.stop | date: 'EEE, dd.MM.')?.replace('.', '') }} - - Versanddatum {{ availability?.estimatedShippingDate | date: 'shortDate' }} - - -
-
-
-
- - - -
-
{{ message }}
-
-
-
- - -
-
-
-
- {{ quantity }} Artikel - | {{ promoPoints }} Lesepunkte -
-
- Zwischensumme - {{ (price$ | async) * quantity | currency: item?.catalogAvailability?.price?.value?.currency || 'EUR':'code' }} -
- ohne Versandkosten -
-
-
-
-
- - - - - -
-
diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.component.scss b/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.component.scss deleted file mode 100644 index b63acc650..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.component.scss +++ /dev/null @@ -1,124 +0,0 @@ -:host { - @apply block box-border; -} - -.modal-title { - @apply text-center mt-2 text-xl font-bold; -} - -.cta-modify { - @apply self-end bg-transparent text-brand font-bold text-lg outline-none border-none ml-4; -} - -.options-wrapper { - @apply flex flex-row justify-evenly items-stretch mt-2; -} - -.option-product-summary { - @apply flex flex-col box-border; - - hr { - @apply my-4; - } -} - -.option-name { - @apply flex flex-row items-center font-bold text-card-sub mb-2 mt-1; - - ui-icon { - @apply mr-2 text-ucla-blue; - } -} - -.option-branch { - @apply font-bold; -} - -.product-row { - @apply flex flex-row items-center; -} - -.summary-row { - @apply flex flex-row justify-between font-bold; -} - -.reading-points { - @apply text-ucla-blue; -} - -.subtotal { - @apply text-lg; -} - -.shipping-cost { - @apply text-sm text-right font-normal; -} - -img.thumbnail { - height: 100px; -} - -.grow { - @apply flex-grow; -} - -.details { - @apply ml-4 flex flex-col font-bold self-stretch flex-grow; - - .title { - @apply text-base m-0; - } -} - -.format { - @apply flex flex-row items-center whitespace-nowrap; - - img { - @apply mr-2; - } -} - -.quantity { - @apply self-end flex flex-col justify-end; - - .row { - @apply flex flex-row justify-end; - } -} - -.actions { - @apply flex flex-row justify-end items-center mt-8; -} - -.cta-continue-shopping { - @apply text-brand border-2 border-solid border-brand bg-white font-bold text-lg px-4 py-2 rounded-full; - - ::ng-deep.spin { - @apply text-brand; - } - - &:disabled { - @apply text-inactive-branch border-inactive-branch cursor-not-allowed; - } -} - -.cta-continue, -.cta-upgrade-customer { - @apply text-white bg-brand font-bold text-lg px-4 py-2 rounded-full border-none ml-4 no-underline; - - &:disabled { - @apply bg-inactive-branch cursor-not-allowed; - } -} - -.can-add-error { - @apply text-xl text-dark-goldenrod mt-2; -} - -.quantity-error { - @apply text-dark-goldenrod font-bold text-sm mt-2; -} - -.hint { - @apply text-dark-goldenrod font-bold text-xl; -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.component.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.component.ts deleted file mode 100644 index 976b3d960..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.component.ts +++ /dev/null @@ -1,396 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { Router } from '@angular/router'; -import { ApplicationService } from '@core/application'; -import { DomainCheckoutService } from '@domain/checkout'; -import { AddToShoppingCartDTO, AvailabilityDTO, ItemType, VATType } from '@swagger/checkout'; -import { UiModalRef } from '@ui/modal'; -import { shareReplay, debounceTime, first, map, switchMap, withLatestFrom } from 'rxjs/operators'; -import { combineLatest, Observable } from 'rxjs'; -import { PurchasingOptionsModalData } from './purchasing-options-modal.data'; -import { PurchasingOptionsModalStore } from './purchasing-options-modal.store'; -import { DomainCatalogService } from '@domain/catalog'; -import { BreadcrumbService } from '@core/breadcrumb'; -import { - encodeFormData, - mapCustomerDtoToCustomerCreateFormData, -} from 'apps/page/customer/src/lib/create-customer/customer-create-form-data'; -import { isNumber } from '@utils/common'; - -@Component({ - selector: 'page-purchasing-options-modal', - templateUrl: 'purchasing-options-modal.component.html', - styleUrls: ['purchasing-options-modal.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, - providers: [PurchasingOptionsModalStore], -}) -export class PurchasingOptionsModalComponent { - readonly item$ = this.purchasingOptionsModalStore.selectItem; - - readonly availableOptions$ = this.purchasingOptionsModalStore.selectAvailableOptions.pipe(shareReplay()); - - readonly option$ = this.purchasingOptionsModalStore.selectOption; - - readonly hasOption$ = this.purchasingOptionsModalStore.selectHasOption; - - readonly quantity$ = this.purchasingOptionsModalStore.selectQuantity; - - readonly canAdd$ = this.purchasingOptionsModalStore.selectCanAdd; - - readonly canAddError$ = this.purchasingOptionsModalStore.selectCanAddError; - - readonly canUpgrade$ = this.purchasingOptionsModalStore.selectCanUpgrade; - - readonly availability$ = this.purchasingOptionsModalStore.selectAvailability; - - readonly branch$ = this.purchasingOptionsModalStore.selectBranch; - - readonly canContinueShopping$ = this.purchasingOptionsModalStore.selectCanContinueShopping; - - readonly canContinueShoppingIsLoading$ = this.purchasingOptionsModalStore.selectCanContinueShoppingIsLoading; - - readonly quantityError$ = this.purchasingOptionsModalStore.selectQuantityError; - - readonly showCustomPrice$ = this.purchasingOptionsModalStore.selectAvailabilities.pipe( - withLatestFrom(this.option$), - map(([availabilities, option]) => !availabilities[option]?.price?.value?.value) - ); - - readonly customPriceInvalid$ = combineLatest([ - this.item$, - this.showCustomPrice$, - this.purchasingOptionsModalStore.selectCustomPrice, - this.purchasingOptionsModalStore.selectCustomVat, - ]).pipe( - map(([item, showCustomPrice, customPrice, customVat]) => { - if (!showCustomPrice) { - return false; - } - - if ((item.type as any) === 66560) { - return !isNumber(customPrice) || customPrice < 1 || customPrice > 200; - } - - return !customPrice || !customVat; - }) - ); - - readonly showTakeAwayButton$ = combineLatest([ - this.option$, - this.purchasingOptionsModalStore.selectFetchingAvailability, - this.purchasingOptionsModalStore.selectCheckingCanAdd, - this.canAdd$, - this.canUpgrade$, - ]).pipe( - map(([option, fetchingAvailability, checkingCanAdd, canAdd, canUpgrade]) => { - if (option !== 'take-away') { - return false; - } - - if (!fetchingAvailability && !checkingCanAdd && !canAdd) { - return false; - } - - return !canUpgrade; - }) - ); - - readonly showDefaultContinueButton$ = combineLatest([ - this.option$, - this.purchasingOptionsModalStore.selectFetchingAvailability, - this.purchasingOptionsModalStore.selectCheckingCanAdd, - this.canAdd$, - this.canUpgrade$, - ]).pipe( - map(([option, fetchingAvailability, checkingCanAdd, canAdd, canUpgrade]) => { - if (option === 'take-away') { - return false; - } - - if (!fetchingAvailability && !checkingCanAdd && !canAdd) { - return false; - } - - return !canUpgrade; - }) - ); - - readonly showContinueWithoutAdding$ = combineLatest([this.showTakeAwayButton$, this.showDefaultContinueButton$, this.canUpgrade$]).pipe( - map(([showTakeAway, showDefault, canUpgrade]) => !canUpgrade && !(showTakeAway || showDefault)) - ); - - readonly showDeliveryInfo$ = this.option$.pipe(map((option) => ['delivery', 'b2b-delivery', 'dig-delivery'].indexOf(option) > -1)); - - readonly fetching$ = combineLatest([ - this.purchasingOptionsModalStore.selectFetchingAvailability, - this.purchasingOptionsModalStore.selectCheckingCanAdd, - ]).pipe(map(([fetching, checking]) => fetching || checking)); - - customerFeatures$ = this.application.activatedProcessId$.pipe( - switchMap((processId) => this.checkoutService.getCustomerFeatures({ processId })) - ); - - readonly customer$ = this.application.activatedProcessId$.pipe(switchMap((processId) => this.checkoutService.getCustomer({ processId }))); - - price$ = combineLatest([ - this.purchasingOptionsModalStore.selectAvailabilities, - this.option$, - this.purchasingOptionsModalStore.selectCustomPrice, - ]).pipe( - map(([availabilities, option, customPrice]) => { - if (option && !!availabilities[option]) { - if (availabilities[option]?.price?.value?.value) { - return availabilities[option]?.price?.value?.value; - } - return availabilities[option]?.price?.value?.value ?? customPrice; - } else { - const key = Object.keys(availabilities).find((key) => !!availabilities[key]?.price?.value?.value); - return availabilities[key]?.price?.value?.value ?? customPrice; - } - }) - ); - - vat$ = combineLatest([ - this.purchasingOptionsModalStore.selectAvailabilities, - this.option$, - this.purchasingOptionsModalStore.selectCustomVat, - ]).pipe( - map(([availabilities, option, customVat]) => { - if (option && !!availabilities[option]) { - if (availabilities[option]?.price?.vat?.vatType) { - return availabilities[option]?.price?.vat?.vatType; - } - return availabilities[option]?.price?.vat?.vatType ?? customVat; - } else { - const key = Object.keys(availabilities).find((key) => !!availabilities[key]?.price?.vat?.vatType); - return availabilities[key]?.price?.vat?.vatType ?? customVat; - } - }) - ); - - readonly promoPoints$ = combineLatest([this.item$, this.quantity$, this.price$]).pipe( - debounceTime(250), - switchMap(([item, quantity, price]) => - this.domainCatalogService - .getPromotionPoints({ - items: [ - { - id: item.id, - quantity: quantity, - price: price, - }, - ], - }) - .pipe(map((res) => res.result[item.id])) - ) - ); - - quantityRange$ = combineLatest([this.option$, this.availability$]).pipe( - map(([option, availability]) => (option === 'take-away' && availability?.inStock ? availability.inStock : 999)) - ); - - activeSpinner: string; - - constructor( - public modalRef: UiModalRef, - public purchasingOptionsModalStore: PurchasingOptionsModalStore, - private application: ApplicationService, - private router: Router, - private checkoutService: DomainCheckoutService, - private domainCatalogService: DomainCatalogService, - private breadcrumb: BreadcrumbService - ) { - this.purchasingOptionsModalStore.setShoppingCartItem(this.modalRef.data.shoppingCartItem); - this.purchasingOptionsModalStore.setItem(this.modalRef.data.item); - this.purchasingOptionsModalStore.setProcessId(this.modalRef.data.processId || this.application.activatedProcessId); - this.purchasingOptionsModalStore.setAvailabilities(this.modalRef.data.availabilities || {}); - this.purchasingOptionsModalStore.setQuantity(this.modalRef?.data?.shoppingCartItem?.quantity || 1); - this.purchasingOptionsModalStore.setOption(this.modalRef.data.option); - this.purchasingOptionsModalStore.setAvailableOptions(this.modalRef.data.availableOptions); - - if ( - this.modalRef.data.availableOptions?.some((option) => option === 'pick-up' || option === 'take-away') || - ['take-away', 'pick-up'].includes(this.modalRef.data.option) - ) { - this.purchasingOptionsModalStore.loadBranches(this.modalRef?.data?.branchId); - } - } - - changeCustomVat(vat: VATType) { - this.purchasingOptionsModalStore.setCustomVat(vat); - } - - changeCustomPrice(price: number) { - this.purchasingOptionsModalStore.setCustomPrice(price); - } - - backToSetOptions() { - this.purchasingOptionsModalStore.setOption(undefined); - } - - getAvailability(option: string): Observable { - return this.purchasingOptionsModalStore.selectAvailabilities.pipe(map((ava) => ava[option])); - } - - async changeQuantity(quantity: number = 1) { - this.purchasingOptionsModalStore.setQuantity(quantity); - - if (quantity === 0) { - this.modalRef.close(); - } - } - - async continue(navigate: 'continue' | 'continue-shopping' | 'add-customer-data' = 'continue') { - this.activeSpinner = navigate ? 'continue-shopping' : 'continue'; - try { - const processId = await this.purchasingOptionsModalStore.selectProcessId.pipe(first()).toPromise(); - const buyer = await this.checkoutService.getBuyer({ processId }).pipe(first()).toPromise(); - const item = await this.item$.pipe(first()).toPromise(); - const quantity = await this.quantity$.pipe(first()).toPromise(); - const availability = await this.availability$.pipe(first()).toPromise(); - const option = await this.option$.pipe(first()).toPromise(); - const branch = await this.branch$.pipe(first()).toPromise(); - const shoppingCartItem = await this.purchasingOptionsModalStore.selectShoppingCartItem.pipe(first()).toPromise(); - const canAdd = await this.canAdd$.pipe(first()).toPromise(); - const customPrice = await this.purchasingOptionsModalStore.selectCustomPrice.pipe(first()).toPromise(); - const customVat = (await this.purchasingOptionsModalStore.selectCustomVat.pipe(first()).toPromise()) ?? 0; - const customer = await this.checkoutService.getCustomer({ processId }).pipe(first()).toPromise(); - - if (canAdd || navigate === 'add-customer-data') { - const newItem: AddToShoppingCartDTO = { - quantity, - availability, - product: { - catalogProductNumber: '', - ...item.product, - }, - promotion: { points: item.promoPoints }, - itemType: item.type, - }; - - newItem.product.catalogProductNumber = String(item.id); - - if (!!customPrice && !!customVat) { - newItem.availability.price = { - value: { - value: customPrice, - currency: 'EUR', - }, - vat: { - vatType: customVat, - }, - }; - } else { - const price = await this.price$.pipe(first()).toPromise(); - const vat = await this.vat$.pipe(first()).toPromise(); - newItem.availability.price = { - value: { - value: price, - currency: 'EUR', - }, - vat: { - vatType: vat, - }, - }; - } - - switch (option) { - case 'take-away': - case 'pick-up': - newItem.destination = { - data: { target: 1, targetBranch: { id: branch.id } }, - }; - break; - case 'delivery': - case 'dig-delivery': - case 'b2b-delivery': - newItem.destination = { - data: { target: 2, logistician: availability.logistician }, - }; - break; - case 'download': - newItem.destination = { - data: { target: 16, logistician: availability.logistician }, - }; - break; - } - - if (shoppingCartItem) { - await this.checkoutService - .updateItemInShoppingCart({ - processId, - shoppingCartItemId: shoppingCartItem?.id, - update: { - availability: newItem.availability, - quantity: newItem.quantity, - destination: newItem.destination, - }, - }) - .toPromise(); - } else { - await this.checkoutService - .addItemToShoppingCart({ - processId, - items: [newItem], - }) - .toPromise(); - } - } - - this.modalRef.close(); - - if (shoppingCartItem) { - return; - } - - if (navigate === 'continue-shopping') { - const crumbs = await this.breadcrumb - .getBreadcrumbsByKeyAndTags$(processId, ['catalog', 'filter', 'results']) - .pipe(first()) - .toPromise(); - if (!!crumbs && crumbs.length > 0) { - const queryParams = crumbs[0].params; - this.router.navigate(['/kunde', this.application.activatedProcessId, 'product', 'search', 'results'], { queryParams }); - } else { - // Route back to search if no result page was loaded (f.e. When searching Article and landing directly on details page) - this.router.navigate(['/kunde', this.application.activatedProcessId, 'product', 'search']); - } - } else if (navigate === 'continue') { - // Set filter for navigation to customer search if customer is not set - let filter: { [key: string]: string }; - if (!buyer) { - filter = await this.customerFeatures$ - .pipe( - first(), - switchMap((customerFeatures) => { - return this.checkoutService.canSetCustomer({ processId, customerFeatures }); - }), - map((res) => res.filter) - ) - .toPromise(); - this.router.navigate(['/kunde', this.application.activatedProcessId, 'customer', 'search'], { - queryParams: { filter_customertype: filter.customertype }, - }); - } else { - this.router.navigate(['/kunde', this.application.activatedProcessId, 'cart', 'review']); - } - } else if (navigate === 'add-customer-data') { - if (customer?.attributes.some((attr) => attr.data.key === 'p4mUser')) { - this.router.navigate(['/kunde', this.application.activatedProcessId, 'customer', 'create', 'webshop-p4m'], { - queryParams: { formData: encodeFormData(mapCustomerDtoToCustomerCreateFormData(customer)) }, - }); - } else { - this.router.navigate(['/kunde', this.application.activatedProcessId, 'customer', 'create', 'webshop'], { - queryParams: { formData: encodeFormData(mapCustomerDtoToCustomerCreateFormData(customer)) }, - }); - } - } - } catch (error) { - console.log('PurchasingOptionsModalComponent.continue', error); - } - this.activeSpinner = undefined; - } - - isGiftCard(itemType: ItemType): boolean { - return (itemType as any) === 66560; - } -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.data.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.data.ts deleted file mode 100644 index f7ab8f326..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.data.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ItemDTO } from '@swagger/cat'; -import { AvailabilityDTO, ShoppingCartItemDTO } from '@swagger/checkout'; -import { PurchasingOptions } from './purchasing-options-modal.store'; - -export interface PurchasingOptionsModalData { - item: ItemDTO; - availableOptions: PurchasingOptions[]; - processId?: number; - option?: PurchasingOptions; - shoppingCartItem?: ShoppingCartItemDTO; - availabilities?: { [key: string]: AvailabilityDTO }; - branchId?: number; -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.module.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.module.ts deleted file mode 100644 index 1b5e63277..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.module.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { OverlayModule } from '@angular/cdk/overlay'; - -import { UiIconModule } from '@ui/icon'; - -import { - B2BDeliveryOptionComponent, - TakeAwayOptionComponent, - PickUpOptionComponent, - DeliveryOptionComponent, - DigDeliveryOptionComponent, -} from './options'; - -import { PurchasingOptionsModalComponent } from './purchasing-options-modal.component'; -import { PageCheckoutPipeModule } from '../../pipes/page-checkout-pipe.module'; -import { ProductImageModule } from 'apps/cdn/product-image/src/public-api'; -import { UiSpinnerModule } from 'apps/ui/spinner/src/lib/ui-spinner.module'; -import { KeyNavigationModule } from '../../shared/key-navigation/key-navigation.module'; -import { RouterModule } from '@angular/router'; -import { UiQuantityDropdownModule } from '@ui/quantity-dropdown'; -import { PurchasingOptionsModalPriceInputModule } from './price-input/purchasing-options-modal-price-input.module'; -import { UiTooltipModule } from '@ui/tooltip'; -import { UiCommonModule } from '@ui/common'; -import { UiBranchDropdownModule } from '@ui/branch-dropdown'; - -@NgModule({ - imports: [ - CommonModule, - UiCommonModule, - FormsModule, - UiIconModule, - OverlayModule, - PageCheckoutPipeModule, - ProductImageModule, - UiQuantityDropdownModule, - UiSpinnerModule, - KeyNavigationModule, - RouterModule, - PurchasingOptionsModalPriceInputModule, - UiTooltipModule, - UiBranchDropdownModule, - ], - exports: [PurchasingOptionsModalComponent], - declarations: [ - PurchasingOptionsModalComponent, - B2BDeliveryOptionComponent, - TakeAwayOptionComponent, - PickUpOptionComponent, - DeliveryOptionComponent, - DigDeliveryOptionComponent, - ], -}) -export class PurchasingOptionsModalModule {} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.store.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.store.ts deleted file mode 100644 index 14c248e02..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/purchasing-options-modal.store.ts +++ /dev/null @@ -1,498 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ApplicationService } from '@core/application'; -import { DomainAvailabilityService } from '@domain/availability'; -import { DomainCheckoutService } from '@domain/checkout'; -import { CrmCustomerService } from '@domain/crm'; -import { ComponentStore, tapResponse } from '@ngrx/component-store'; -import { ItemDTO } from '@swagger/cat'; -import { AvailabilityDTO, BranchDTO, OLAAvailabilityDTO, ShoppingCartItemDTO, VATType } from '@swagger/checkout'; -import { isBoolean, isNullOrUndefined, isString } from '@utils/common'; -import { NEVER, Observable } from 'rxjs'; -import { delay, filter, map, switchMap, tap, withLatestFrom } from 'rxjs/operators'; - -export type PurchasingOptions = 'take-away' | 'pick-up' | 'delivery' | 'dig-delivery' | 'b2b-delivery' | 'download'; - -interface PurchasingOptionsModalState { - item?: ItemDTO; - shoppingCartItem?: ShoppingCartItemDTO; - option?: PurchasingOptions; - defaultBranch?: BranchDTO; - branch?: BranchDTO; - processId?: number; - fetchingAvailability: boolean; - availableOptions: PurchasingOptions[]; - availableBranches: BranchDTO[]; - quantity: number; - maxQuantityError: boolean; - checkingCanAdd: boolean; - canAdd: boolean; - canAddError?: string; - canUpgrade: boolean; - availabilities: { [key: string]: AvailabilityDTO }; - customPrice?: number; - customVat?: VATType; -} - -@Injectable() -export class PurchasingOptionsModalStore extends ComponentStore { - readonly selectItem = this.select((s) => s.item); - - readonly selectShoppingCartItem = this.select((s) => s.shoppingCartItem); - - readonly selectOption = this.select((s) => s.option); - - readonly selectOrderType = this.select(this.selectOption, (option) => { - switch (option) { - case 'take-away': - return 'Rücklage'; - case 'pick-up': - return 'Abholung'; - case 'delivery': - return 'Versand'; - case 'b2b-delivery': - return 'B2B-Versand'; - case 'dig-delivery': - return 'DIG-Versand'; - case 'download': - return 'Download'; - } - }); - - readonly selectHasOption = this.select((s) => !!s.option); - - readonly selectBranch = this.select((s) => { - return s.branch || s.defaultBranch; - }); - - readonly selectQuantity = this.select((s) => s.quantity); - - readonly selectCustomPrice = this.select((s) => s.customPrice); - - readonly selectCustomVat = this.select((s) => s.customVat); - - readonly selectAvailabilities = this.select((s) => s.availabilities); - - readonly selectAvailability = this.select((s) => s.availabilities[s.option]); - - readonly selectAvailabilityIsValid = this.select(this.selectAvailability, (availability) => - this.availabilityService.isAvailable({ availability }) - ); - - readonly selectAvailableOptions = this.select((s) => s.availableOptions); - - readonly selectAvailableBranches = this.select((s) => s.availableBranches); - - readonly selectProcessId = this.select((s) => s.processId); - - readonly selectCheckingCanAdd = this.select((s) => s.checkingCanAdd); - - readonly selectCanAdd = this.select( - this.selectAvailability, - this.select((s) => s.canAdd), - (availability, canAdd) => canAdd && this.availabilityService.isAvailable({ availability }) - ); - - readonly selectCanAddError = this.select((s) => s.canAddError); - - readonly selectFetchingAvailability = this.select((s) => s.fetchingAvailability); - - readonly selectMaxQuantityError = this.select((s) => s.maxQuantityError); - - readonly selectQuantityError = this.select( - this.selectQuantity, - this.selectOption, - this.selectAvailability, - this.selectFetchingAvailability, - this.selectMaxQuantityError, - (quantity, option, availability, fetching, maxQuantityError) => { - if (!fetching) { - if (maxQuantityError) { - return `Achtung, Maximal 999 Exemplare bestellbar.`; - } - - if (availability?.inStock < quantity) { - if (option === 'pick-up') { - return `${availability?.inStock} Exemplare sofort lieferbar.`; - } - if (option === 'take-away') { - return `${availability?.inStock} Exemplare sofort lieferbar.`; - } - } - - if (!this.availabilityService.isAvailable({ availability })) { - return availability?.sscText; - } - } - - return undefined; - } - ); - - readonly selectOlaAvailability = this.select( - (s): OLAAvailabilityDTO => - this.availabilityService.mapToOlaAvailability({ - availability: s.availabilities[s.option], - item: s.item, - quantity: s.quantity, - }) - ); - - readonly selectCanUpgrade = this.select((s) => s.canUpgrade); - - readonly selectCanContinueShopping = this.select( - this.selectFetchingAvailability, - this.selectCanAdd, - this.selectOption, - this.selectQuantityError, - this.selectQuantity, - this.selectCanUpgrade, - (fetching, canAdd, option, quantityError, quantity, canUpgrade) => { - let hasError = !!quantityError; - - if (option === 'pick-up' && quantity <= 999) { - hasError = false; - } - return !fetching && (canAdd || canUpgrade); - } - ).pipe(delay(1)); - - readonly selectCanContinueShoppingIsLoading = this.select(this.selectFetchingAvailability, this.selectCanAdd, (fetching, canAdd) => { - return fetching; - }); - - constructor( - private checkoutService: DomainCheckoutService, - private availabilityService: DomainAvailabilityService, - private customerService: CrmCustomerService, - private applicationService: ApplicationService - ) { - super({ - availableBranches: [], - availableOptions: [], - quantity: 1, - canAdd: false, - canUpgrade: false, - availabilities: {}, - checkingCanAdd: false, - fetchingAvailability: false, - maxQuantityError: false, - }); - - this.loadDefaultBranch(); - } - - readonly setItem = this.updater((state, item: ItemDTO) => { - this.loadAvailability(); - return { - ...state, - item, - availability: undefined, - canAdd: false, - canAddError: undefined, - }; - }); - - readonly setShoppingCartItem = this.updater((state, shoppingCartItem: ShoppingCartItemDTO) => { - this.loadAvailability(); - return { - ...state, - shoppingCartItem, - }; - }); - - readonly setOption = this.updater((state, option: PurchasingOptions) => { - this.loadAvailability(); - return { - ...state, - option, - availability: undefined, - canAdd: false, - canAddError: undefined, - }; - }); - - readonly setBranch = this.updater((state, branch: BranchDTO) => { - this.loadAvailability(); - return { - ...state, - branch, - availability: undefined, - canAdd: false, - canAddError: undefined, - }; - }); - - readonly setBranchId = this.updater((state, branchId: number) => { - const branch = state.availableBranches.find((branch) => branch.id === branchId); - - this.loadAvailability(); - return { - ...state, - branchId, - branch, - }; - }); - - readonly setAvailability = this.updater( - (state, { availability, option, item }: { availability: AvailabilityDTO; option: PurchasingOptions; item: ItemDTO }) => { - this.checkCanAdd(); - let updatedAvailability = availability; - if ((option && option === 'delivery') || option === 'dig-delivery') { - const catalogPrice = item?.catalogAvailability?.price?.value?.value; - const availabilityPrice = availability?.price?.value?.value; - const updatedPrice = catalogPrice <= availabilityPrice ? catalogPrice : availabilityPrice; - updatedAvailability = { - ...availability, - price: { - ...availability.price, - value: { - ...availability.price.value, - value: updatedPrice, - }, - }, - }; - } - return { - ...state, - availabilities: { - ...state.availabilities, - [option]: updatedAvailability, - }, - }; - } - ); - - readonly setQuantity = this.updater((state, quantity: number = 1) => { - let qty = quantity; - if (quantity > 999) { - qty = 999; - this.patchState({ maxQuantityError: true }); - } else { - this.patchState({ maxQuantityError: false }); - } - - this.loadAvailability(); - return { - ...state, - quantity: qty, - canAdd: false, - canAddError: undefined, - }; - }); - - readonly setCustomPrice = this.updater((state, customPrice: number) => { - return { - ...state, - customPrice, - }; - }); - - readonly setCustomVat = this.updater((state, customVat: VATType) => { - return { - ...state, - customVat, - }; - }); - - readonly setAvailableOptions = this.updater((state, availableOptions: PurchasingOptions[]) => { - let option = state.option; - if (availableOptions?.length === 1 && availableOptions[0] === 'download') { - option = availableOptions[0]; - } - - return { - ...state, - availableOptions, - option, - }; - }); - - readonly setAvailableBranches = this.updater((state, availableBranches: BranchDTO[]) => { - const branch = state.branch || state.defaultBranch; - return { - ...state, - availableBranches, - branch, - }; - }); - - readonly setProcessId = this.updater((state, processId: number) => ({ - ...state, - processId, - })); - - readonly setCanAdd = this.updater((state, canAddItem: true | string) => { - let canAdd = isBoolean(canAddItem) ? Boolean(canAddItem) : false; - if (!canAdd) { - this.checkCanUpgrade(); - } - return { ...state, canAdd, canAddError: isString(canAddItem) ? String(canAddItem) : undefined }; - }); - - readonly setAvailabilities = this.updater((state, availabilities: { [key: string]: AvailabilityDTO }) => { - this.checkCanAdd(); - return { - ...state, - availabilities: { - ...state.availabilities, - ...availabilities, - }, - }; - }); - - loadBranches = this.effect((branchId$: Observable) => - branchId$.pipe( - switchMap((branchId) => - this.checkoutService.getBranches().pipe( - tapResponse( - (branches: BranchDTO[]) => { - this.setAvailableBranches(branches); - this.setBranchId(branchId); - }, - () => this.setAvailableBranches([]) - ) - ) - ) - ) - ); - - loadAvailability = this.effect(($) => - $.pipe( - delay(10), - withLatestFrom(this.selectItem, this.selectQuantity, this.selectOption, this.selectBranch), - switchMap(([_, item, quantity, option, branch]) => { - let availability$: Observable = NEVER; - - if (!isNullOrUndefined(item) && quantity > 0 && isString(option)) { - this.patchState({ fetchingAvailability: true }); - switch (option) { - case 'take-away': - availability$ = this.availabilityService.getTakeAwayAvailabilityByBranch({ - itemId: item.id, - price: item.catalogAvailability.price, - quantity, - branch, - }); - break; - case 'pick-up': - if (!isNullOrUndefined(branch)) { - availability$ = this.availabilityService - .getPickUpAvailability({ - item: { itemId: item.id, ean: item.product.ean, price: item.catalogAvailability.price }, - quantity, - branch, - }) - .pipe( - map((av) => { - if (av?.length > 0) { - if (av[1].availableFor) { - if ((av[1].availableFor & 2) === 2) { - return av[0]; - } else { - undefined; - } - } else { - return av[0]; - } - } - }) - ); - } - break; - case 'delivery': - availability$ = this.availabilityService.getDeliveryAvailability({ - item: { itemId: item.id, ean: item.product.ean, price: item.catalogAvailability.price }, - quantity, - }); - break; - case 'dig-delivery': - availability$ = this.availabilityService.getDigDeliveryAvailability({ - item: { itemId: item.id, ean: item.product.ean, price: item.catalogAvailability.price }, - quantity, - }); - break; - case 'b2b-delivery': - if (!isNullOrUndefined(branch)) { - availability$ = this.availabilityService.getB2bDeliveryAvailability({ - item: { itemId: item.id, ean: item.product.ean, price: item.catalogAvailability.price }, - quantity, - }); - } - break; - case 'download': - availability$ = this.availabilityService.getDownloadAvailability({ - item: { itemId: item.id, ean: item.product.ean, price: item.catalogAvailability.price }, - }); - break; - } - } - return availability$.pipe( - tapResponse( - (availability) => { - this.setAvailability({ option, availability, item }); - this.patchState({ fetchingAvailability: false }); - }, - () => { - this.setAvailability(null); - this.patchState({ fetchingAvailability: false }); - } - ) - ); - }) - ) - ); - - checkCanAdd = this.effect(($) => - $.pipe( - delay(10), - withLatestFrom(this.selectOlaAvailability, this.selectProcessId, this.selectOrderType), - switchMap(([_, availability, processId, orderType]) => { - this.patchState({ checkingCanAdd: true }); - return this.checkoutService.canAddItems({ processId, payload: [{ availabilities: [availability] }], orderType }).pipe( - tapResponse( - (response: any) => { - this.setCanAdd(response?.find((_) => true)?.status === 0 ? true : response?.find((_) => true)?.message); - }, - (error: Error) => this.setCanAdd(error?.message) - ), - tap((_) => this.patchState({ checkingCanAdd: false })) - ); - }) - ) - ); - - checkCanUpgrade = this.effect(($) => - $.pipe( - withLatestFrom(this.applicationService.activatedProcessId$), - switchMap(([_, processId]) => this.checkoutService.getBuyer({ processId })), - map((buyer) => buyer?.source), - filter((customerId) => !isNaN(customerId)), - switchMap((customerId) => - this.customerService.canUpgrade(customerId).pipe( - tapResponse( - (response) => { - let canUpgrade = response.options?.values?.some((u) => u.value === 'webshop'); - this.patchState({ canUpgrade }); - }, - (error) => { - this.patchState({ canUpgrade: false }); - } - ) - ) - ) - ) - ); - - readonly loadDefaultBranch = this.effect(($) => - $.pipe( - switchMap((_) => - this.availabilityService.getDefaultBranch().pipe( - tapResponse( - (defaultBranch) => this.patchState({ defaultBranch }), - (err) => {} - ) - ) - ) - ) - ); -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/take-away-option/index.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/take-away-option/index.ts deleted file mode 100644 index 39caf4cff..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/take-away-option/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// start:ng42.barrel -export * from './take-away-option.component'; -// end:ng42.barrel diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/take-away-option/take-away-option.component.html b/apps/page/checkout/src/lib/modals/purchasing-options-modal/take-away-option/take-away-option.component.html deleted file mode 100644 index c3505b902..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/take-away-option/take-away-option.component.html +++ /dev/null @@ -1,18 +0,0 @@ - - -
- -
-

Rücklage / Filialentnahme

-

- Möchten Sie den Artikel zurücklegen lassen oder sofort mitnehmen? -

- {{ price?.value?.value | currency: price?.value?.currency:'code' }} -
-
- -
-
-
diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/take-away-option/take-away-option.component.scss b/apps/page/checkout/src/lib/modals/purchasing-options-modal/take-away-option/take-away-option.component.scss deleted file mode 100644 index f06ca392f..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/take-away-option/take-away-option.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -h4 { - @apply font-bold; -} diff --git a/apps/page/checkout/src/lib/modals/purchasing-options-modal/take-away-option/take-away-option.component.ts b/apps/page/checkout/src/lib/modals/purchasing-options-modal/take-away-option/take-away-option.component.ts deleted file mode 100644 index c7131d496..000000000 --- a/apps/page/checkout/src/lib/modals/purchasing-options-modal/take-away-option/take-away-option.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Component, ChangeDetectionStrategy } from '@angular/core'; -import { DomainAvailabilityService } from '@domain/availability'; -import { combineLatest } from 'rxjs'; -import { map } from 'rxjs/operators'; -import { PurchasingOptionsModalStore } from '../purchasing-options-modal.store'; - -@Component({ - selector: 'page-take-away-option', - templateUrl: 'take-away-option.component.html', - styleUrls: ['../option.scss', 'take-away-option.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class TakeAwayOptionComponent { - readonly item$ = this._purchasingOptionsModalStore.selectItem; - - readonly availability$ = this._purchasingOptionsModalStore.selectAvailabilities.pipe(map((ava) => ava['take-away'])); - - readonly price$ = combineLatest([this.availability$, this.item$]).pipe( - map(([availability, item]) => this._availabilityService.getPriceForAvailability('take-away', item.catalogAvailability, availability)) - ); - - constructor(private _purchasingOptionsModalStore: PurchasingOptionsModalStore, private _availabilityService: DomainAvailabilityService) {} - - select() { - this._purchasingOptionsModalStore.setOption('take-away'); - } -} diff --git a/apps/page/checkout/src/lib/page-checkout-modals.module.ts b/apps/page/checkout/src/lib/page-checkout-modals.module.ts deleted file mode 100644 index 70aa1b78b..000000000 --- a/apps/page/checkout/src/lib/page-checkout-modals.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NgModule } from '@angular/core'; -import { PurchasingOptionsListModalModule } from './modals/purchasing-options-list-modal'; - -import { PurchasingOptionsModalModule } from './modals/purchasing-options-modal'; - -@NgModule({ - imports: [PurchasingOptionsModalModule, PurchasingOptionsListModalModule], - exports: [PurchasingOptionsModalModule, PurchasingOptionsListModalModule], -}) -export class PageCheckoutModalsModule {} diff --git a/apps/page/checkout/src/lib/page-checkout.module.ts b/apps/page/checkout/src/lib/page-checkout.module.ts index 93c870e89..e1004e19d 100644 --- a/apps/page/checkout/src/lib/page-checkout.module.ts +++ b/apps/page/checkout/src/lib/page-checkout.module.ts @@ -4,14 +4,12 @@ import { ShellBreadcrumbModule } from '@shell/breadcrumb'; import { CheckoutDummyModule } from './checkout-dummy/checkout-dummy.module'; import { CheckoutReviewModule } from './checkout-review/checkout-review.module'; import { CheckoutSummaryModule } from './checkout-summary/checkout-summary.module'; -import { PageCheckoutModalsModule } from './page-checkout-modals.module'; import { PageCheckoutRoutingModule } from './page-checkout-routing.module'; import { PageCheckoutComponent } from './page-checkout.component'; @NgModule({ imports: [ CommonModule, - PageCheckoutModalsModule, CheckoutSummaryModule, PageCheckoutRoutingModule, CheckoutReviewModule, @@ -19,6 +17,6 @@ import { PageCheckoutComponent } from './page-checkout.component'; ShellBreadcrumbModule, ], declarations: [PageCheckoutComponent], - exports: [PageCheckoutModalsModule], + exports: [], }) export class PageCheckoutModule {} diff --git a/apps/shared/components/branch-selector/src/lib/branch-selector.component.scss b/apps/shared/components/branch-selector/src/lib/branch-selector.component.scss index 741e33e52..24e6de150 100644 --- a/apps/shared/components/branch-selector/src/lib/branch-selector.component.scss +++ b/apps/shared/components/branch-selector/src/lib/branch-selector.component.scss @@ -20,7 +20,7 @@ ::ng-deep shared-branch-selector ui-autocomplete .ui-autocomplete-output-wrapper { @apply overflow-hidden overflow-y-auto max-w-content rounded-b-md; - max-height: 500px; + max-height: 350px; width: 100%; left: unset; box-shadow: 0px 14px 14px rgba(206, 212, 219, 0.2); diff --git a/apps/shared/components/branch-selector/src/lib/branch-selector.component.ts b/apps/shared/components/branch-selector/src/lib/branch-selector.component.ts index 4dc617324..1598f19df 100644 --- a/apps/shared/components/branch-selector/src/lib/branch-selector.component.ts +++ b/apps/shared/components/branch-selector/src/lib/branch-selector.component.ts @@ -20,7 +20,7 @@ import { UiAutocompleteComponent, UiAutocompleteModule } from '@ui/autocomplete' import { UiCommonModule } from '@ui/common'; import { UiIconModule } from '@ui/icon'; import { isNaN } from 'lodash'; -import { combineLatest, Subject } from 'rxjs'; +import { asapScheduler, combineLatest, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { BranchSelectorStore } from './branch-selector.store'; @@ -79,6 +79,13 @@ export class BranchSelectorComponent implements OnInit, OnDestroy, AfterViewInit onChange = (value: BranchDTO) => {}; onTouched = () => {}; + @ViewChild('branchInput') + branchInput: ElementRef; + + get isOpen() { + return this.autocompleteComponent?.open ?? false; + } + constructor(public store: BranchSelectorStore, private _elementRef: ElementRef) {} writeValue(obj: any): void { @@ -188,6 +195,13 @@ export class BranchSelectorComponent implements OnInit, OnDestroy, AfterViewInit this.complete.next(''); } + focus() { + asapScheduler.schedule(() => { + this.branchInput?.nativeElement?.focus(); + this.openComplete(); + }); + } + @HostListener('focusout', ['$event']) closeAutocomplete(event?: FocusEvent) { // Soll bei Klick auf den Branch-Selector und auf die Scrollbar das Autocomplete nicht schließen diff --git a/apps/shared/components/input-control/ng-package.json b/apps/shared/components/input-control/ng-package.json new file mode 100644 index 000000000..5b6ba62cc --- /dev/null +++ b/apps/shared/components/input-control/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/apps/shared/components/input-control/src/lib/error.component.ts b/apps/shared/components/input-control/src/lib/error.component.ts new file mode 100644 index 000000000..aa8bc3387 --- /dev/null +++ b/apps/shared/components/input-control/src/lib/error.component.ts @@ -0,0 +1,18 @@ +import { ChangeDetectionStrategy, Component, Input, TemplateRef, ViewChild } from '@angular/core'; + +@Component({ + selector: 'shared-input-control-error', + template: ` +
+ +
+
`, + changeDetection: ChangeDetectionStrategy.Default, +}) +export class ErrorComponent { + @Input() error: string; + + @ViewChild('template', { static: true }) tempalteRef: TemplateRef; + + constructor() {} +} diff --git a/apps/shared/components/input-control/src/lib/indicator.component.ts b/apps/shared/components/input-control/src/lib/indicator.component.ts new file mode 100644 index 000000000..1be18f002 --- /dev/null +++ b/apps/shared/components/input-control/src/lib/indicator.component.ts @@ -0,0 +1,37 @@ +import { ChangeDetectionStrategy, Component, Input, TemplateRef, ViewChild } from '@angular/core'; + +@Component({ + selector: 'shared-input-control-indicator', + template: ` +
+ +
+
`, + changeDetection: ChangeDetectionStrategy.Default, +}) +export class IndicatorComponent { + @Input() + invalid: boolean | undefined; + + @Input() + valid: boolean | undefined; + + @Input() + dirty: boolean | undefined; + + @Input() + disabled: boolean | undefined; + + @Input() + enabled: boolean | undefined; + + @Input() + pristine: boolean | undefined; + + @Input() + pending: boolean | undefined; + + @ViewChild('template', { static: true }) tempalteRef: TemplateRef; + + constructor() {} +} diff --git a/apps/shared/components/input-control/src/lib/input-control.component.css b/apps/shared/components/input-control/src/lib/input-control.component.css new file mode 100644 index 000000000..6be554cd5 --- /dev/null +++ b/apps/shared/components/input-control/src/lib/input-control.component.css @@ -0,0 +1,44 @@ +.shared-input-control { + @apply relative leading-[21px] text-base font-bold; +} + +.shared-input-control:has(input.ng-invalid.ng-dirty) { + @apply text-[#F70400]; +} + +.shared-input-control-wrapper { + @apply flex flex-row items-center grow border border-solid border-[#AEB7C1] rounded-[5px] p-4; +} + +.shared-input-control-wrapper:has(input.ng-invalid.ng-dirty) { + @apply border-[#F70400] text-[#F70400]; +} + +.shared-input-control-input { + @apply outline-none grow truncate; +} + +.shared-input-control-input.ng-invalid.ng-dirty::placeholder { + @apply text-[#F70400]; +} + +.shared-input-control-indicator { + @apply absolute -left-2 top-4 -translate-x-full; +} + +.shared-input-control-prefix, +.shared-input-control-suffix { + @apply inline-block grow-0; +} + +.shared-input-control-prefix { + @apply -ml-2 mr-2; +} + +.shared-input-control-suffix { + @apply -mr-2 ml-2; +} + +.shared-input-control-error { + @apply text-left mt-[2px]; +} diff --git a/apps/shared/components/input-control/src/lib/input-control.component.html b/apps/shared/components/input-control/src/lib/input-control.component.html new file mode 100644 index 000000000..703f75d44 --- /dev/null +++ b/apps/shared/components/input-control/src/lib/input-control.component.html @@ -0,0 +1,10 @@ + +
+ + + + + +
+ + diff --git a/apps/shared/components/input-control/src/lib/input-control.component.ts b/apps/shared/components/input-control/src/lib/input-control.component.ts new file mode 100644 index 000000000..5f0e22654 --- /dev/null +++ b/apps/shared/components/input-control/src/lib/input-control.component.ts @@ -0,0 +1,119 @@ +import { OnDestroy, TemplateRef } from '@angular/core'; +import { QueryList } from '@angular/core'; +import { ContentChildren } from '@angular/core'; +import { Component, ChangeDetectionStrategy, ViewEncapsulation, AfterContentInit, ContentChild, ViewChild } from '@angular/core'; +import { Subscription } from 'rxjs'; +import { ErrorComponent } from './error.component'; +import { IndicatorComponent } from './indicator.component'; +import { InputDirective } from './input.directive'; +import { OutletDirective } from './outlet.directive'; + +@Component({ + selector: 'shared-input-control', + templateUrl: 'input-control.component.html', + styleUrls: ['input-control.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, + host: { class: 'shared-input-control' }, + encapsulation: ViewEncapsulation.None, +}) +export class InputControlComponent implements AfterContentInit, OnDestroy { + @ContentChild(InputDirective, { static: false, read: InputDirective }) + inputDirective: InputDirective; + + @ViewChild('errorOutlet', { read: OutletDirective, static: true }) + errorOutlet: OutletDirective; + + @ViewChild('indicatorOutlet', { read: OutletDirective, static: true }) + indicatorOutlet: OutletDirective; + + @ContentChildren(ErrorComponent, { read: ErrorComponent }) + errorTemplates: QueryList; + + @ContentChildren(IndicatorComponent, { read: IndicatorComponent }) + indicatorTemplates: QueryList; + + currentError: ErrorComponent; + + currentIndicator: IndicatorComponent; + + private _subscriptions = new Subscription(); + + constructor() {} + + renderError(): void { + const errors = this.inputDirective?.control.errors; + + if (!errors || this.inputDirective?.control.pristine) { + this.errorOutlet.viewContainerRef.clear(); + return; + } + + const errorTemplate = this.errorTemplates.find((x) => x.error in errors); + + const tempalteChanged = errorTemplate !== this.currentError; + + if (tempalteChanged) { + this.errorOutlet.viewContainerRef.clear(); + + if (errorTemplate) { + this.errorOutlet.viewContainerRef.createEmbeddedView(errorTemplate.tempalteRef); + } + } + + this.currentError = errorTemplate; + } + + renderIndicator(): void { + const { invalid, valid, dirty, disabled, enabled, pristine, pending } = this.inputDirective?.control; + + const indicatorTemplate = this.indicatorTemplates.find((i) => { + // find the first indicator that matches the current state of the control + // id state is undefined then it will not be checked + return ( + (i.invalid === invalid || i.invalid === undefined) && + (i.valid === valid || i.valid === undefined) && + (i.dirty === dirty || i.dirty === undefined) && + (i.disabled === disabled || i.disabled === undefined) && + (i.enabled === enabled || i.enabled === undefined) && + (i.pristine === pristine || i.pristine === undefined) && + (i.pending === pending || i.pending === undefined) + ); + }); + + const tempalteChanged = indicatorTemplate !== this.currentIndicator; + + if (tempalteChanged) { + this.indicatorOutlet.viewContainerRef.clear(); + + if (indicatorTemplate) { + this.indicatorOutlet.viewContainerRef.createEmbeddedView(indicatorTemplate.tempalteRef); + } + } + + this.currentIndicator = indicatorTemplate; + } + + ngAfterContentInit(): void { + if (!this.inputDirective) { + console.error(new Error(`No input[sharedInput] found in \`\` component`)); + } + + const statusChangesSub = this.inputDirective.control.statusChanges.subscribe(() => { + this.renderError(); + this.renderIndicator(); + }); + const tempalteChangesSub = this.errorTemplates.changes.subscribe(() => { + this.renderError(); + this.renderIndicator(); + }); + this.renderError(); + this.renderIndicator(); + + this._subscriptions.add(statusChangesSub); + this._subscriptions.add(tempalteChangesSub); + } + + ngOnDestroy(): void { + this._subscriptions.unsubscribe(); + } +} diff --git a/apps/shared/components/input-control/src/lib/input-control.module.ts b/apps/shared/components/input-control/src/lib/input-control.module.ts new file mode 100644 index 000000000..95be7115e --- /dev/null +++ b/apps/shared/components/input-control/src/lib/input-control.module.ts @@ -0,0 +1,25 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { InputControlComponent } from './input-control.component'; +import { InputDirective } from './input.directive'; +import { PrefixDirective } from './prefix.directive'; +import { SuffixDirective } from './suffix.directive'; +import { ErrorComponent } from './error.component'; +import { OutletDirective } from './outlet.directive'; +import { IndicatorComponent } from './indicator.component'; + +@NgModule({ + imports: [CommonModule], + exports: [InputControlComponent, InputDirective, PrefixDirective, SuffixDirective, ErrorComponent, IndicatorComponent], + declarations: [ + InputControlComponent, + InputDirective, + PrefixDirective, + SuffixDirective, + ErrorComponent, + OutletDirective, + IndicatorComponent, + ], +}) +export class InputControlModule {} diff --git a/apps/shared/components/input-control/src/lib/input.directive.ts b/apps/shared/components/input-control/src/lib/input.directive.ts new file mode 100644 index 000000000..c54602289 --- /dev/null +++ b/apps/shared/components/input-control/src/lib/input.directive.ts @@ -0,0 +1,57 @@ +import { OnInit } from '@angular/core'; +import { OnDestroy } from '@angular/core'; +import { Optional, Directive, Self } from '@angular/core'; +import { AbstractFormGroupDirective, NgControl, ValidationErrors } from '@angular/forms'; +import { SharedInputControlStatus } from './types'; + +@Directive({ + selector: 'input[sharedInputControlInput]:not([type=radio]):not([type=checkbox])', + host: { class: 'shared-input-control-input' }, +}) +export class InputDirective implements OnInit, OnDestroy { + get control(): NgControl | AbstractFormGroupDirective | null { + return this._ngControl; + } + + get errors(): ValidationErrors | null { + return this.control?.errors; + } + + get status(): SharedInputControlStatus { + return this.control?.status as SharedInputControlStatus; + } + + constructor(@Self() @Optional() private _ngControl: NgControl) {} + + ngOnInit(): void {} + + ngOnDestroy(): void {} + + private _getControlStatus({ status, dirty, touched }: { status: string; dirty: boolean; touched: boolean }): SharedInputControlStatus[] { + const result: SharedInputControlStatus[] = []; + + if (status === 'VALID') { + result.push('valid'); + } else if (status === 'INVALID') { + result.push('invalid'); + } else if (status === 'DISABLED') { + result.push('disabled'); + } else if (status === 'PENDING') { + result.push('pending'); + } + + if (dirty) { + result.push('dirty'); + } else { + result.push('pristine'); + } + + if (touched) { + result.push('touched'); + } else { + result.push('untouched'); + } + + return result; + } +} diff --git a/apps/shared/components/input-control/src/lib/outlet.directive.ts b/apps/shared/components/input-control/src/lib/outlet.directive.ts new file mode 100644 index 000000000..d842a5b99 --- /dev/null +++ b/apps/shared/components/input-control/src/lib/outlet.directive.ts @@ -0,0 +1,6 @@ +import { Directive, ViewContainerRef } from '@angular/core'; + +@Directive({ selector: '[sharedInputControlOutlet]' }) +export class OutletDirective { + constructor(public viewContainerRef: ViewContainerRef) {} +} diff --git a/apps/shared/components/input-control/src/lib/prefix.directive.ts b/apps/shared/components/input-control/src/lib/prefix.directive.ts new file mode 100644 index 000000000..96e1802b1 --- /dev/null +++ b/apps/shared/components/input-control/src/lib/prefix.directive.ts @@ -0,0 +1,6 @@ +import { Directive } from '@angular/core'; + +@Directive({ selector: 'sharedinput-control-prefix', host: { class: 'shared-input-control-prefix' } }) +export class PrefixDirective { + constructor() {} +} diff --git a/apps/shared/components/input-control/src/lib/suffix.directive.ts b/apps/shared/components/input-control/src/lib/suffix.directive.ts new file mode 100644 index 000000000..183b9dc13 --- /dev/null +++ b/apps/shared/components/input-control/src/lib/suffix.directive.ts @@ -0,0 +1,6 @@ +import { Directive } from '@angular/core'; + +@Directive({ selector: 'shared-input-control-suffix', host: { class: 'shared-input-control-suffix' } }) +export class SuffixDirective { + constructor() {} +} diff --git a/apps/shared/components/input-control/src/lib/types.ts b/apps/shared/components/input-control/src/lib/types.ts new file mode 100644 index 000000000..77aef908c --- /dev/null +++ b/apps/shared/components/input-control/src/lib/types.ts @@ -0,0 +1 @@ +export type SharedInputControlStatus = 'valid' | 'invalid' | 'disabled' | 'pending' | 'dirty' | 'pristine' | 'touched' | 'untouched'; diff --git a/apps/shared/components/input-control/src/public-api.ts b/apps/shared/components/input-control/src/public-api.ts new file mode 100644 index 000000000..c07058dda --- /dev/null +++ b/apps/shared/components/input-control/src/public-api.ts @@ -0,0 +1,3 @@ +export * from './lib/input-control.component'; +export * from './lib/input.directive'; +export * from './lib/input-control.module'; diff --git a/apps/shared/modals/purchase-options-modal/ng-package.json b/apps/shared/modals/purchase-options-modal/ng-package.json new file mode 100644 index 000000000..5b6ba62cc --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/apps/shared/modals/purchase-options-modal/src/lib/constants.ts b/apps/shared/modals/purchase-options-modal/src/lib/constants.ts new file mode 100644 index 000000000..638ee140f --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/constants.ts @@ -0,0 +1,22 @@ +import { ItemType, PriceDTO, PriceValueDTO, VATValueDTO } from '@swagger/checkout'; +import { OrderType, PurchaseOption } from './store'; + +export const PURCHASE_OPTIONS: PurchaseOption[] = ['in-store', 'pickup', 'delivery', 'dig-delivery', 'b2b-delivery', 'download']; + +export const DELIVERY_PURCHASE_OPTIONS: PurchaseOption[] = ['delivery', 'dig-delivery', 'b2b-delivery']; + +export const PURCHASE_OPTION_TO_ORDER_TYPE: { [purchaseOption: string]: OrderType } = { + 'in-store': 'Rücklage', + pickup: 'Abholung', + delivery: 'Versand', + 'dig-delivery': 'Versand', + 'b2b-delivery': 'Versand', +}; + +export const GIFT_CARD_TYPE = 66560 as ItemType; + +export const DEFAULT_PRICE_DTO: PriceDTO = { value: { value: undefined }, vat: { vatType: 0 } }; + +export const DEFAULT_PRICE_VALUE: PriceValueDTO = { value: 0, currency: 'EUR' }; + +export const DEFAULT_VAT_VALUE: VATValueDTO = { value: 0 }; diff --git a/apps/shared/modals/purchase-options-modal/src/lib/helpers.ts b/apps/shared/modals/purchase-options-modal/src/lib/helpers.ts new file mode 100644 index 000000000..df0c37c5f --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/helpers.ts @@ -0,0 +1,19 @@ +import { ItemDTO } from '@swagger/cat'; +import { ShoppingCartItemDTO } from '@swagger/checkout'; +import { ActionType } from './types'; + +export function isItemDTO(item: any, type: ActionType): item is ItemDTO { + return type === 'add'; +} + +export function isItemDTOArray(items: any, type: ActionType): items is ItemDTO[] { + return type === 'add'; +} + +export function isShoppingCartItemDTO(item: any, type: ActionType): item is ShoppingCartItemDTO { + return type === 'update'; +} + +export function isShoppingCartItemDTOArray(items: any, type: ActionType): items is ShoppingCartItemDTO[] { + return type === 'update'; +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-header/index.ts b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-header/index.ts new file mode 100644 index 000000000..d955a9b7e --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-header/index.ts @@ -0,0 +1 @@ +export * from './purchase-options-list-header.component'; diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-header/purchase-options-list-header.component.css b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-header/purchase-options-list-header.component.css new file mode 100644 index 000000000..fb66aa54f --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-header/purchase-options-list-header.component.css @@ -0,0 +1,3 @@ +:host { + @apply mt-4 mb-2 flex flex-row justify-end; +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-header/purchase-options-list-header.component.html b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-header/purchase-options-list-header.component.html new file mode 100644 index 000000000..122ccb342 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-header/purchase-options-list-header.component.html @@ -0,0 +1,5 @@ +
+ + + {{ selectedItemsCount$ | async }} von {{ itemsCount$ | async }} Artikel +
diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-header/purchase-options-list-header.component.ts b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-header/purchase-options-list-header.component.ts new file mode 100644 index 000000000..2a04ac8b4 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-header/purchase-options-list-header.component.ts @@ -0,0 +1,37 @@ +import { CommonModule } from '@angular/common'; +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { combineLatest } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { PurchaseOptionsStore } from '../store'; + +@Component({ + selector: 'shared-purchase-options-list-header', + templateUrl: 'purchase-options-list-header.component.html', + styleUrls: ['purchase-options-list-header.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule], +}) +export class PurchaseOptionsListHeaderComponent { + itemsCount$ = this.store.itemsForList$.pipe(map((items) => items.length)); + + selectedItemsCount$ = this.store.selectedItemIds$.pipe(map((ids) => ids.length)); + + unselectButton$ = combineLatest([this.itemsCount$, this.selectedItemsCount$]).pipe( + map(([itemsCount, selectedItemsCount]) => itemsCount === selectedItemsCount) + ); + + selectButton$ = this.unselectButton$.pipe(map((unselectButton) => !unselectButton)); + + hideHeader$ = this.store.items$.pipe(map((items) => items?.length === 1)); + + constructor(public store: PurchaseOptionsStore) {} + + selectAll() { + // this.store.setSelectedForSelectableItems(true); + } + + unselectAll() { + // this._store.setSelectedForSelectableItems(false); + } +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-item/index.ts b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-item/index.ts new file mode 100644 index 000000000..061bcb9c2 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-item/index.ts @@ -0,0 +1 @@ +export * from './purchase-options-list-item.component'; diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-item/purchase-options-list-item.component.css b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-item/purchase-options-list-item.component.css new file mode 100644 index 000000000..4730259d2 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-item/purchase-options-list-item.component.css @@ -0,0 +1,49 @@ +:host { + @apply block; +} + +.fancy-checkbox { + @apply relative appearance-none w-8 h-8; +} + +.fancy-checkbox::before { + @apply absolute; + @apply block; + @apply rounded-full; + @apply bg-[#AEB7C1]; + @apply cursor-pointer; + @apply transition-all; + @apply duration-200; + @apply ease-in-out; + content: ''; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.fancy-checkbox:hover::before { + @apply bg-[#778490]; +} + +.fancy-checkbox:checked::before { + @apply bg-[#596470]; +} + +.fancy-checkbox::after { + content: ''; + background-image: url("data:image/svg+xml,%3Csvg width='100%25' height='100%25' viewBox='0 0 24 24' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xml:space='preserve' xmlns:serif='http://www.serif.com/'%3E%3Cpath fill='white' d='M21.432,3.715C21.432,3.715 21.432,3.715 21.432,3.715C21.115,3.76 20.823,3.911 20.604,4.143C16.03,8.727 12.603,12.511 8.244,16.932C8.244,16.932 3.297,12.754 3.297,12.754C2.909,12.424 2.374,12.327 1.895,12.499C1.895,12.499 1.895,12.499 1.895,12.499C1.415,12.672 1.065,13.088 0.975,13.589C0.885,14.091 1.072,14.602 1.463,14.929L7.415,19.966C7.981,20.441 8.818,20.403 9.338,19.877C14.251,14.954 17.761,11.007 22.616,6.141C23.057,5.714 23.172,5.051 22.903,4.499C22.903,4.499 22.903,4.499 22.903,4.499C22.633,3.948 22.04,3.631 21.432,3.715Z'/%3E%3C/svg%3E%0A"); + @apply absolute; + top: 0.4rem; + left: 0.4rem; + bottom: 0.4rem; + right: 0.4rem; + @apply cursor-pointer opacity-0; + @apply transition-all; + @apply duration-200; + @apply ease-in-out; +} + +.fancy-checkbox:checked::after { + @apply opacity-100; +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-item/purchase-options-list-item.component.html b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-item/purchase-options-list-item.component.html new file mode 100644 index 000000000..9f503c083 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-item/purchase-options-list-item.component.html @@ -0,0 +1,96 @@ +
+
+ +
+
+
+ {{ product?.contributors }} +
+
+ {{ product?.name }} +
+
+ + {{ product?.formatDetail }} +
+
+ {{ product?.manufacturer }} + | + {{ product?.ean }} +
+
+ {{ product?.volume }} + | + {{ product?.publicationDate | date: 'dd. MMMM yyyy' }} +
+
+
Verfügbar als
+
+
+ + + {{ availability.data.estimatedDelivery?.start | date: 'EE dd.MM.' }} + - + {{ availability.data.estimatedDelivery?.stop | date: 'EE dd.MM.' }} + + + + {{ availability.data.estimatedDelivery?.start | date: 'EE dd.MM.' }} + - + {{ availability.data.estimatedDelivery?.stop | date: 'EE dd.MM.' }} + + + + {{ availability.data.estimatedShippingDate | date: 'dd. MMMM yyyy' }} + + + + {{ availability.data.estimatedShippingDate | date: 'dd. MMMM yyyy' }} + + + + {{ availability.data.inStock }}x ab sofort + + + + Download + +
+
+
+
+
+
+ {{ priceValue$ | async | currency: 'EUR':'code' }} +
+
+
+ + + + + + EUR + Preis ist ungültig + Preis ist ungültig + +
+
+ + +
+
+
+
+
+
diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-item/purchase-options-list-item.component.ts b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-item/purchase-options-list-item.component.ts new file mode 100644 index 000000000..8114aef96 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-list-item/purchase-options-list-item.component.ts @@ -0,0 +1,173 @@ +import { CommonModule } from '@angular/common'; +import { Component, ChangeDetectionStrategy, Input, OnInit, OnDestroy, OnChanges, SimpleChanges } from '@angular/core'; +import { FormControl, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms'; +import { ProductImageModule } from '@cdn/product-image'; +import { InputControlModule } from '@shared/components/input-control'; +import { AvailabilityDTO } from '@swagger/checkout'; +import { UiIconModule } from '@ui/icon'; +import { UiQuantityDropdownModule } from '@ui/quantity-dropdown'; +import { UiSpinnerModule } from '@ui/spinner'; +import { combineLatest, Observable, ReplaySubject, Subscription } from 'rxjs'; +import { map, startWith, switchMap } from 'rxjs/operators'; +import { Item, mapToItemData, PurchaseOptionsService, PurchaseOptionsStore } from '../store'; + +@Component({ + selector: 'shared-purchase-options-list-item', + templateUrl: 'purchase-options-list-item.component.html', + styleUrls: ['purchase-options-list-item.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [ + CommonModule, + UiQuantityDropdownModule, + ProductImageModule, + UiIconModule, + UiSpinnerModule, + ReactiveFormsModule, + InputControlModule, + FormsModule, + ], + host: { class: 'shared-purchase-options-list-item' }, +}) +export class PurchaseOptionsListItemComponent implements OnInit, OnDestroy, OnChanges { + private _subscriptions = new Subscription(); + + private _itemSubject = new ReplaySubject(1); + + @Input() item: Item; + + get item$() { + return this._itemSubject.asObservable(); + } + + get product() { + return this.item.product; + } + + quantityFormControl = new FormControl(null); + + priceFormControl = new FormControl(null, [Validators.required, Validators.pattern(/^\d+(,\d{1,2})?$/)]); + + selectedFormControl = new FormControl(false); + + maxSelectableQuantity$: Observable; + + availabilities$ = this.item$.pipe(switchMap((item) => this._store.getAvailabilitiesForItem$(item.id))); + + availability$: Observable; + + price$ = this.item$.pipe(switchMap((item) => this._store.getPrice$(item.id))); + + priceValue$ = this.price$.pipe(map((price) => price?.value?.value)); + + priceVat$ = this.price$.pipe(map((price) => price?.vat?.value)); + + canEditPrice$ = this.item$.pipe(switchMap((item) => this._store.getCanEditPrice$(item.id))); + + hideCheckbox$ = combineLatest([this._store.items$, this._store.purchaseOption$]).pipe( + map(([items, purchaseOption]) => purchaseOption == undefined || items?.length === 1) + ); + + canAddResult$ = this.item$.pipe(switchMap((item) => this._store.getCanAddResultForItemAndCurrentPurchaseOption$(item.id))); + + constructor(private _store: PurchaseOptionsStore, private _service: PurchaseOptionsService) {} + + initAvailability$() { + combineLatest([this.item$, this._store.purchaseOption$]); + + this.availability$ = combineLatest([this.item$, this._store.purchaseOption$, this._store.inStoreBranch$]).pipe( + switchMap(([item, purchaseOption, inStoreBranch]) => { + const itemData = mapToItemData(item, this._store.type); + + if (purchaseOption === 'in-store' && inStoreBranch) { + return this._service.fetchInStoreAvailability(itemData, item.quantity, inStoreBranch); + } + + return []; + }) + ); + + this.maxSelectableQuantity$ = combineLatest([this._store.purchaseOption$, this.availability$]).pipe( + map(([purchaseOption, availability]) => { + if (purchaseOption === 'in-store') { + return availability?.inStock; + } + + return 999; + }), + startWith(999) + ); + } + + ngOnInit(): void { + this.initQuantitySubscription(); + this.initPriceSubscription(); + this.initSelectedSubscription(); + this.initAvailability$(); + } + + ngOnChanges({ item }: SimpleChanges) { + if (item) { + this._itemSubject.next(this.item); + } + } + + ngOnDestroy(): void { + this._itemSubject.complete(); + this._subscriptions.unsubscribe(); + } + + initQuantitySubscription() { + const sub = this.item$.subscribe((item) => { + if (this.quantityFormControl.value !== item.quantity) { + this.quantityFormControl.setValue(item.quantity); + } + }); + + const valueChangesSub = this.quantityFormControl.valueChanges.subscribe((quantity) => { + if (this.item.quantity !== quantity) { + this._store.setItemQuantity(this.item.id, quantity); + } + }); + + this._subscriptions.add(sub); + this._subscriptions.add(valueChangesSub); + } + + initPriceSubscription() { + const sub = this.price$.subscribe((price) => { + if (this.priceFormControl.value !== price?.value?.value) { + this.priceFormControl.setValue(price?.value?.value); + } + }); + + const valueChangesSub = this.priceFormControl.valueChanges.subscribe((value) => { + if (this.priceFormControl.valid) { + const price = this._store.getPrice(this.item.id); + if (price[this.item.id] !== value) { + this._store.setPrice(this.item.id, value); + } + } + }); + this._subscriptions.add(sub); + this._subscriptions.add(valueChangesSub); + } + + initSelectedSubscription() { + const sub = this.item$ + .pipe(switchMap((item) => this._store.selectedItemIds$.pipe(map((ids) => ids.includes(item.id))))) + .subscribe((selected) => { + if (this.selectedFormControl.value !== selected) { + this.selectedFormControl.setValue(selected); + } + }); + const valueChangesSub = this.selectedFormControl.valueChanges.subscribe((selected) => { + const current = this._store.selectedItemIds.includes(this.item.id); + if (current !== selected) { + this._store.setSelectedItem(this.item.id, selected); + } + }); + this._subscriptions.add(sub); + this._subscriptions.add(valueChangesSub); + } +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-modal.component.css b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-modal.component.css new file mode 100644 index 000000000..df91bb803 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-modal.component.css @@ -0,0 +1,10 @@ +:host { + display: grid; + grid-template-rows: auto auto auto auto 1fr auto; + max-height: 85vh; + @apply pt-6; +} + +.shared-purchase-options-modal__items { + overflow: scroll; +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-modal.component.html b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-modal.component.html new file mode 100644 index 000000000..289426fb2 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-modal.component.html @@ -0,0 +1,43 @@ +

Lieferung auswählen

+

+ Wie möchten Sie die Artikel erhalten? +

+
+ + + + + + + + + +
+ +
+ +
+
+ + + + + + + +
diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-modal.component.ts b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-modal.component.ts new file mode 100644 index 000000000..7f01044ae --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-modal.component.ts @@ -0,0 +1,88 @@ +import { Component, ChangeDetectionStrategy, OnInit, OnDestroy, TrackByFunction } from '@angular/core'; +import { UiModalRef } from '@ui/modal'; +import { PurchaseOptionsModalData } from './purchase-options-modal.data'; + +import { PurchaseOptionsListHeaderComponent } from './purchase-options-list-header'; +import { PurchaseOptionsListItemComponent } from './purchase-options-list-item'; +import { CommonModule } from '@angular/common'; +import { of, Subject } from 'rxjs'; +import { + DeliveryPurchaseOptionTileComponent, + DownloadPurchaseOptionTileComponent, + InStorePurchaseOptionTileComponent, + PickupPurchaseOptionTileComponent, +} from './purchase-options-tile'; +import { AddToShoppingCartDTO } from '@swagger/checkout'; +import { Item, PurchaseOptionsStore } from './store'; +import { map, shareReplay } from 'rxjs/operators'; + +@Component({ + selector: 'shared-purchase-options-modal', + templateUrl: 'purchase-options-modal.component.html', + styleUrls: ['purchase-options-modal.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + providers: [PurchaseOptionsStore], + imports: [ + CommonModule, + PurchaseOptionsListHeaderComponent, + PurchaseOptionsListItemComponent, + DeliveryPurchaseOptionTileComponent, + InStorePurchaseOptionTileComponent, + PickupPurchaseOptionTileComponent, + DownloadPurchaseOptionTileComponent, + ], +}) +export class PurchaseOptionsModalComponent implements OnInit, OnDestroy { + get type() { + return this._uiModalRef.data.type; + } + + items$ = this.store.items$; + + purchasingOptions$ = this.store.getPurchaseOptionsInAvailabilities$; + + isDownloadOnly$ = this.purchasingOptions$.pipe( + map((purchasingOptions) => purchasingOptions.length === 1 && purchasingOptions[0] === 'download') + ); + + hasDownload$ = this.purchasingOptions$.pipe(map((purchasingOptions) => purchasingOptions.includes('download'))); + + canContinue$ = this.store.canContinue$.pipe(shareReplay(1)); + + private _onDestroy$ = new Subject(); + + saving = false; + + constructor(private _uiModalRef: UiModalRef, public store: PurchaseOptionsStore) { + this.store.initialize(this._uiModalRef.data); + } + + ngOnInit(): void {} + + ngOnDestroy(): void { + this._onDestroy$.next(); + this._onDestroy$.complete(); + } + + itemTrackBy: TrackByFunction = (_, item) => item.id; + + async save() { + if (this.saving) { + return; + } + this.saving = true; + + try { + await this.store.save(); + + if (this.store.items.length === 0) { + this._uiModalRef.close(); + } + } catch (error) { + console.error(error); + } + + this.saving = false; + } +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-modal.data.ts b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-modal.data.ts new file mode 100644 index 000000000..5502bfbe4 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-modal.data.ts @@ -0,0 +1,9 @@ +import { ItemDTO } from '@swagger/cat'; +import { ShoppingCartItemDTO, BranchDTO } from '@swagger/checkout'; +import { ActionType } from './store'; + +export interface PurchaseOptionsModalData { + processId: number; + type: ActionType; + items: Array; +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-modal.service.ts b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-modal.service.ts new file mode 100644 index 000000000..63dd3fe2c --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-modal.service.ts @@ -0,0 +1,16 @@ +import { Injectable } from '@angular/core'; +import { UiModalRef, UiModalService } from '@ui/modal'; +import { PurchaseOptionsModalComponent } from './purchase-options-modal.component'; +import { PurchaseOptionsModalData } from './purchase-options-modal.data'; + +@Injectable({ providedIn: 'root' }) +export class PurchaseOptionsModalService { + constructor(private _uiModal: UiModalService) {} + + open(data: PurchaseOptionsModalData): UiModalRef { + return this._uiModal.open({ + content: PurchaseOptionsModalComponent, + data, + }); + } +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/base-purchase-option.directive.ts b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/base-purchase-option.directive.ts new file mode 100644 index 000000000..498756dc5 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/base-purchase-option.directive.ts @@ -0,0 +1,27 @@ +import { ChangeDetectorRef, Directive, HostBinding, HostListener } from '@angular/core'; +import { asapScheduler } from 'rxjs'; +import { PurchaseOption, PurchaseOptionsStore } from '../store'; + +@Directive({}) +export abstract class BasePurchaseOptionDirective { + protected abstract store: PurchaseOptionsStore; + protected abstract cdr: ChangeDetectorRef; + + @HostBinding('class.selected') + get selected() { + return this.store.purchaseOption === this.purchaseOption; + } + + constructor(protected purchaseOption: PurchaseOption) {} + + @HostListener('click') + setPurchaseOptions() { + this.store.setPurchaseOption(this.purchaseOption); + this.store.resetSelectedItems(); + asapScheduler.schedule(() => { + const items = this.store.getItemsThatHaveAnAvailabilityAndCanAddForPurchaseOption(this.purchaseOption); + items.forEach((item) => this.store.setSelectedItem(item.id, true)); + }); + this.cdr.markForCheck(); + } +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/delivery-purchase-options-tile.component.html b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/delivery-purchase-options-tile.component.html new file mode 100644 index 000000000..cbc5a1d80 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/delivery-purchase-options-tile.component.html @@ -0,0 +1,12 @@ +
+
+ +
+ Versand +
+
+ Artikel geliefert bekommen? +
+
+ Versandkostenfrei +
diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/delivery-purchase-options-tile.component.ts b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/delivery-purchase-options-tile.component.ts new file mode 100644 index 000000000..d75a0cbec --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/delivery-purchase-options-tile.component.ts @@ -0,0 +1,19 @@ +import { CommonModule } from '@angular/common'; +import { Component, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; +import { UiIconModule } from '@ui/icon'; +import { PurchaseOptionsStore } from '../store'; +import { BasePurchaseOptionDirective } from './base-purchase-option.directive'; + +@Component({ + selector: 'app-delivery-purchase-options-tile', + templateUrl: 'delivery-purchase-options-tile.component.html', + styleUrls: ['purchase-options-tile.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, UiIconModule], +}) +export class DeliveryPurchaseOptionTileComponent extends BasePurchaseOptionDirective { + constructor(protected store: PurchaseOptionsStore, protected cdr: ChangeDetectorRef) { + super('delivery'); + } +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/download-purchase-options-tile.component.html b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/download-purchase-options-tile.component.html new file mode 100644 index 000000000..3a867f880 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/download-purchase-options-tile.component.html @@ -0,0 +1,12 @@ +
+
+ +
+ Download +
+
+ Für den Kauf benötigen Sie ein Onlinekonto +
+
+ Sofort verfügbar +
diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/download-purchase-options-tile.component.ts b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/download-purchase-options-tile.component.ts new file mode 100644 index 000000000..3bf9ffd3d --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/download-purchase-options-tile.component.ts @@ -0,0 +1,19 @@ +import { CommonModule } from '@angular/common'; +import { Component, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; +import { UiIconModule } from '@ui/icon'; +import { PurchaseOptionsStore } from '../store'; +import { BasePurchaseOptionDirective } from './base-purchase-option.directive'; + +@Component({ + selector: 'app-download-purchase-options-tile', + templateUrl: 'download-purchase-options-tile.component.html', + styleUrls: ['purchase-options-tile.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, UiIconModule], +}) +export class DownloadPurchaseOptionTileComponent extends BasePurchaseOptionDirective { + constructor(protected store: PurchaseOptionsStore, protected cdr: ChangeDetectorRef) { + super('download'); + } +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/in-store-purchase-options-tile.component.html b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/in-store-purchase-options-tile.component.html new file mode 100644 index 000000000..302dba5fe --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/in-store-purchase-options-tile.component.html @@ -0,0 +1,24 @@ +
+
+ +
+ Rücklage +
+
+ Artikel zurücklegen lassen oder sofort mitnehmen? +
+
+ + +
diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/in-store-purchase-options-tile.component.ts b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/in-store-purchase-options-tile.component.ts new file mode 100644 index 000000000..d321893dd --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/in-store-purchase-options-tile.component.ts @@ -0,0 +1,29 @@ +import { CommonModule } from '@angular/common'; +import { Component, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { BranchSelectorComponent } from '@shared/components/branch-selector'; +import { BranchNamePipe } from '@shared/pipes/branch'; +import { BranchDTO } from '@swagger/checkout'; +import { UiIconModule } from '@ui/icon'; +import { PurchaseOptionsStore } from '../store'; +import { BasePurchaseOptionDirective } from './base-purchase-option.directive'; + +@Component({ + selector: 'app-in-store-purchase-options-tile', + templateUrl: 'in-store-purchase-options-tile.component.html', + styleUrls: ['purchase-options-tile.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, UiIconModule, BranchSelectorComponent, FormsModule, BranchNamePipe], +}) +export class InStorePurchaseOptionTileComponent extends BasePurchaseOptionDirective { + inStoreBranch$ = this.store.inStoreBranch$; + + constructor(protected store: PurchaseOptionsStore, protected cdr: ChangeDetectorRef) { + super('in-store'); + } + + setInStoreBranch(branch?: BranchDTO) { + this.store.setInStoreBranch(branch); + } +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/index.ts b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/index.ts new file mode 100644 index 000000000..3fbccfc1a --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/index.ts @@ -0,0 +1,5 @@ +export * from './base-purchase-option.directive'; +export * from './delivery-purchase-options-tile.component'; +export * from './download-purchase-options-tile.component'; +export * from './in-store-purchase-options-tile.component'; +export * from './pickup-purchase-options-tile.component'; diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/pickup-purchase-options-tile.component.html b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/pickup-purchase-options-tile.component.html new file mode 100644 index 000000000..9097ce724 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/pickup-purchase-options-tile.component.html @@ -0,0 +1,24 @@ +
+
+ +
+ Abholung +
+
+ Artikel in einer unserer Filialen abholen? +
+
+ + +
diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/pickup-purchase-options-tile.component.ts b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/pickup-purchase-options-tile.component.ts new file mode 100644 index 000000000..7c6a039e9 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/pickup-purchase-options-tile.component.ts @@ -0,0 +1,29 @@ +import { CommonModule } from '@angular/common'; +import { Component, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { BranchSelectorComponent } from '@shared/components/branch-selector'; +import { BranchNamePipe } from '@shared/pipes/branch'; +import { BranchDTO } from '@swagger/checkout'; +import { UiIconModule } from '@ui/icon'; +import { PurchaseOptionsStore } from '../store'; +import { BasePurchaseOptionDirective } from './base-purchase-option.directive'; + +@Component({ + selector: 'app-pickup-purchase-options-tile', + templateUrl: 'pickup-purchase-options-tile.component.html', + styleUrls: ['purchase-options-tile.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, UiIconModule, BranchSelectorComponent, FormsModule, BranchNamePipe], +}) +export class PickupPurchaseOptionTileComponent extends BasePurchaseOptionDirective { + pickupBranch$ = this.store.pickupBranch$; + + constructor(protected store: PurchaseOptionsStore, protected cdr: ChangeDetectorRef) { + super('pickup'); + } + + setPickupBranch(branch?: BranchDTO) { + this.store.setPickupBranch(branch); + } +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/purchase-options-tile.component.css b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/purchase-options-tile.component.css new file mode 100644 index 000000000..ff9c440d2 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/purchase-options-tile/purchase-options-tile.component.css @@ -0,0 +1,42 @@ +:host { + @apply border border-solid border-[#C6CBD0] p-2 rounded w-[192px] h-[158px] grid grid-rows-3 cursor-pointer; +} + +:host.selected { + @apply bg-[#D8DFE5] border-[#0556B4]; +} + +.purchase-options-tile__heading { + @apply flex flex-row justify-center items-center; +} + +.purchase-options-tile__heading .icon-wrapper { + @apply bg-[#D8DFE5] w-[36px] h-[36px] rounded grid items-center justify-center; +} + +.purchase-options-tile__heading .purchase-option-name { + @apply ml-3 font-bold text-lg; +} + +.purchase-options-tile__body { + @apply text-center text-sm; +} + +.purchase-options-tile__actions { + @apply text-center font-bold; +} + +::ng-deep app-pickup-purchase-options-tile shared-branch-selector .shared-branch-selector-input-container, +::ng-deep app-in-store-purchase-options-tile shared-branch-selector .shared-branch-selector-input-container { + @apply rounded-card; +} + +::ng-deep app-pickup-purchase-options-tile shared-branch-selector.shared-branch-selector-opend .shared-branch-selector-input-container, +::ng-deep app-in-store-purchase-options-tile shared-branch-selector.shared-branch-selector-opend .shared-branch-selector-input-container { + @apply shadow-card; +} + +::ng-deep app-pickup-purchase-options-tile shared-branch-selector ui-autocomplete .ui-autocomplete-output-wrapper, +::ng-deep app-in-store-purchase-options-tile shared-branch-selector ui-autocomplete .ui-autocomplete-output-wrapper { + @apply max-h-[320px]; +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/store/index.ts b/apps/shared/modals/purchase-options-modal/src/lib/store/index.ts new file mode 100644 index 000000000..a5375f577 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/store/index.ts @@ -0,0 +1,6 @@ +export * from './purchase-options.helpers'; +export * from './purchase-options.selectors'; +export * from './purchase-options.service'; +export * from './purchase-options.state'; +export * from './purchase-options.store'; +export * from './purchase-options.types'; diff --git a/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.helpers.ts b/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.helpers.ts new file mode 100644 index 000000000..e3a62d1ef --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.helpers.ts @@ -0,0 +1,141 @@ +import { PriceDTO } from '@swagger/availability'; +import { ItemDTO } from '@swagger/cat'; +import { AvailabilityDTO, OLAAvailabilityDTO, ShoppingCartItemDTO } from '@swagger/checkout'; +import { GIFT_CARD_TYPE } from '../constants'; +import { ActionType, Item, ItemData, ItemPayloadWithSourceId, OrderType, PurchaseOption } from './purchase-options.types'; + +export function isItemDTO(item: any, type: ActionType): item is ItemDTO { + return type === 'add'; +} + +export function isItemDTOArray(items: any, type: ActionType): items is ItemDTO[] { + return type === 'add'; +} + +export function isShoppingCartItemDTO(item: any, type: ActionType): item is ShoppingCartItemDTO { + return type === 'update'; +} + +export function isShoppingCartItemDTOArray(items: any, type: ActionType): items is ShoppingCartItemDTO[] { + return type === 'update'; +} + +export function mapToItemData(item: Item, type: ActionType): ItemData { + const price: PriceDTO = {}; + + if (isItemDTO(item, type)) { + price.value = item?.catalogAvailability?.price?.value ?? {}; + price.vat = item?.catalogAvailability?.price?.vat ?? {}; + + return { + ean: item.product.ean, + itemId: item.id, + price, + sourceId: item.id, + }; + } else { + price.value = item?.unitPrice?.value ?? {}; + price.vat = item?.unitPrice?.vat ?? {}; + + return { + ean: item.product.ean, + itemId: Number(item.product.catalogProductNumber), + price, + sourceId: item.id, + }; + } +} + +export function isDownload(item: Item): boolean { + return item.product.format === 'DL' || item.product.format === 'EB'; +} + +export function isGiftCard(item: Item, type: ActionType): boolean { + if (isItemDTO(item, type)) { + return item?.type === GIFT_CARD_TYPE; + } else { + return item?.itemType === GIFT_CARD_TYPE; + } +} + +export function mapToItemPayload({ + item, + quantity, + availability, + type, +}: { + item: ItemDTO | ShoppingCartItemDTO; + quantity: number; + availability: AvailabilityDTO; + type: ActionType; +}): ItemPayloadWithSourceId { + return { + availabilities: [mapToOlaAvailability({ item, quantity, availability, type })], + id: String(getCatalogId(item, type)), + sourceId: item.id, + }; +} + +export function getCatalogId(item: ItemDTO | ShoppingCartItemDTO, type: ActionType): number | string { + return isItemDTO(item, type) ? item.id : item.product.catalogProductNumber; +} + +export function mapToOlaAvailability({ + availability, + item, + quantity, + type, +}: { + availability: AvailabilityDTO; + item: ItemDTO | ShoppingCartItemDTO; + quantity: number; + type: ActionType; +}): OLAAvailabilityDTO { + return { + status: availability?.availabilityType, + at: availability?.estimatedShippingDate, + ean: item?.product?.ean, + itemId: Number(getCatalogId(item, type)), + format: item?.product?.format, + isPrebooked: availability?.isPrebooked, + logisticianId: availability?.logistician?.id, + price: availability?.price, + qty: quantity, + ssc: availability?.ssc, + sscText: availability?.sscText, + supplierId: availability?.supplier?.id, + supplierProductNumber: availability?.supplierProductNumber, + }; +} + +export function getOrderTypeForPurchaseOption(purchaseOption: PurchaseOption): OrderType | undefined { + switch (purchaseOption) { + case 'delivery': + case 'dig-delivery': + case 'b2b-delivery': + return 'Versand'; + case 'pickup': + return 'Abholung'; + case 'in-store': + return 'Rücklage'; + case 'download': + return 'Download'; + default: + return undefined; + } +} + +export function getPurchaseOptionForOrderType(orderType: OrderType): PurchaseOption | undefined { + switch (orderType) { + case 'Versand': + return 'delivery'; + case 'Abholung': + return 'pickup'; + case 'Rücklage': + return 'in-store'; + case 'Download': + return 'download'; + default: + return undefined; + } +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.selectors.ts b/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.selectors.ts new file mode 100644 index 000000000..42e924b41 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.selectors.ts @@ -0,0 +1,328 @@ +import { PriceDTO, PriceValueDTO } from '@swagger/checkout'; +import { DEFAULT_PRICE_DTO, DEFAULT_PRICE_VALUE, GIFT_CARD_TYPE, PURCHASE_OPTIONS } from '../constants'; +import { isGiftCard, isItemDTO } from './purchase-options.helpers'; +import { PurchaseOptionsState } from './purchase-options.state'; +import { ActionType, Availability, Branch, CanAdd, Item, PurchaseOption } from './purchase-options.types'; + +export function getType(state: PurchaseOptionsState): ActionType { + return state.type; +} + +export function getProcessId(state: PurchaseOptionsState): number { + return state.processId; +} + +export function getItems(state: PurchaseOptionsState): Item[] { + return state.items; +} + +export function getPurchaseOption(state: PurchaseOptionsState): PurchaseOption { + return state.purchaseOption; +} + +export function getSelectedItemIds(state: PurchaseOptionsState): number[] { + return state.selectedItemIds; +} + +export function getDefaultBranch(state: PurchaseOptionsState): Branch { + return state.defaultBranch; +} + +export function getPickupBranch(state: PurchaseOptionsState): Branch { + const branch = state.pickupBranch || state.defaultBranch; + + if (branch?.branchType === 1) { + return branch; + } + + return undefined; +} + +export function getInStoreBranch(state: PurchaseOptionsState): Branch { + const branch = state.inStoreBranch || state.defaultBranch; + + if (branch?.branchType === 1) { + return branch; + } + + return undefined; +} + +export function getAvailabilities(state: PurchaseOptionsState): Availability[] { + return state.availabilities; +} + +export function getPrices(state: PurchaseOptionsState): { [itemId: number]: PriceDTO } { + return state.prices; +} + +export function getCanAddResults(state: PurchaseOptionsState): CanAdd[] { + return state.canAddResults; +} + +export function getCanAddForItemWithPurchaseOption( + itemId: number, + purchaseOption: PurchaseOption +): (state: PurchaseOptionsState) => CanAdd { + return (state: PurchaseOptionsState) => { + const canAddResults = getCanAddResults(state); + return canAddResults[itemId] && canAddResults[itemId][purchaseOption]; + }; +} + +export function getPurchasingOptions(state: PurchaseOptionsState): PurchaseOption[] { + const availabilities = getAvailabilities(state); + const purchaseOptions = availabilities.map((availability) => availability.purchaseOption); + return Array.from(new Set(purchaseOptions)).sort((a, b) => PURCHASE_OPTIONS.indexOf(a) - PURCHASE_OPTIONS.indexOf(b)); +} + +export function getPurchaseOptionsInAvailabilities(state: PurchaseOptionsState): PurchaseOption[] { + const availabilities = getAvailabilities(state); + let purchaseOptions = availabilities.map((availability) => availability.purchaseOption); + + purchaseOptions = Array.from(new Set(purchaseOptions)); + + // if 'delivery' is not present but 'dig-delivery' or 'b2b-delivery' is present, add 'delivery' to the list + if (!purchaseOptions.includes('delivery') && (purchaseOptions.includes('dig-delivery') || purchaseOptions.includes('b2b-delivery'))) { + purchaseOptions.push('delivery'); + } + + // if remove 'dig-delivery' and 'b2b-delivery' + purchaseOptions = purchaseOptions.filter((purchaseOption) => purchaseOption !== 'dig-delivery' && purchaseOption !== 'b2b-delivery'); + + return purchaseOptions.sort((a, b) => PURCHASE_OPTIONS.indexOf(a) - PURCHASE_OPTIONS.indexOf(b)); +} + +export function getItemsThatHaveAnAvailabilityForPurchaseOption(purchaseOption: PurchaseOption): (state: PurchaseOptionsState) => Item[] { + return (state) => { + const availabilities = getAvailabilities(state); + const items = getItems(state); + + const itemIds = availabilities + .filter((availability) => { + if (purchaseOption === 'delivery') { + return ( + availability.purchaseOption === purchaseOption || + availability.purchaseOption === 'dig-delivery' || + availability.purchaseOption === 'b2b-delivery' + ); + } + return availability.purchaseOption === purchaseOption; + }) + .map((availability) => availability.itemId); + return items.filter((item) => itemIds.includes(item.id)); + }; +} + +export function getItemsThatHaveAnAvailabilityAndCanAddForPurchaseOption(purchaseOption: PurchaseOption) { + return (state: PurchaseOptionsState): Item[] => { + const items = getItemsThatHaveAnAvailabilityForPurchaseOption(purchaseOption)(state); + + const canAddResults = getCanAddResults(state); + + return items.filter((item) => + canAddResults.some((canAdd) => canAdd.itemId === item.id && canAdd.purchaseOption === purchaseOption && canAdd.canAdd) + ); + }; +} + +export function getItemsForList(state: PurchaseOptionsState): Item[] { + const purchaseOption = getPurchaseOption(state); + const items = getItems(state); + + if (purchaseOption == undefined) { + return items; + } + + const availabilities = getAvailabilities(state); + + const itemIds = availabilities + .filter((availability) => { + if (purchaseOption === 'delivery') { + return ( + availability.purchaseOption === purchaseOption || + availability.purchaseOption === 'dig-delivery' || + availability.purchaseOption === 'b2b-delivery' + ); + } + return availability.purchaseOption === purchaseOption; + }) + .map((availability) => availability.itemId); + return items.filter((item) => itemIds.includes(item.id)); +} + +export function getAvailabilitiesForItem(itemId: number): (state: PurchaseOptionsState) => Availability[] { + return (state) => { + let availabilities = getAvailabilities(state); + availabilities = availabilities.filter((availability) => availability.itemId === itemId); + + // if 'delivery', 'dig-delivery' and 'b2b-delivery' are present remove 'dig-delivery' and 'b2b-delivery' + + if (availabilities.some((availability) => availability.purchaseOption === 'delivery')) { + availabilities = availabilities.filter( + (availability) => availability.purchaseOption !== 'dig-delivery' && availability.purchaseOption !== 'b2b-delivery' + ); + } + + return availabilities; + }; +} + +export function getCanEditPrice(itemId: number): (state: PurchaseOptionsState) => boolean { + return (state) => { + const item = getItems(state).find((item) => item.id === itemId); + + return isGiftCard(item, getType(state)); + }; +} + +export function getPriceForPurchaseOption(itemId: number, purchaseOption: PurchaseOption): (state: PurchaseOptionsState) => PriceDTO { + return (state) => { + const price = getPrices(state)[itemId]; + + if (price) { + return price; + } + + let availabilities = getAvailabilitiesForItem(itemId)(state); + + let availability = availabilities.find((availability) => availability.purchaseOption === purchaseOption); + + if (purchaseOption === 'delivery') { + const digAvailability = availabilities.find((availability) => availability.purchaseOption === 'dig-delivery'); + const b2bAvailability = availabilities.find((availability) => availability.purchaseOption === 'b2b-delivery'); + + if (isDigCustomer(state)) { + availability = digAvailability; + } else if (isB2bCustomer(state)) { + availability = b2bAvailability; + } + + availability = availability || digAvailability || b2bAvailability; + } + + if (availability) { + return availability.data.price; + } + + if (availability === undefined) { + const item = getItems(state).find((item) => item.id === itemId); + const type = getType(state); + + if (isItemDTO(item, type)) { + return item.catalogAvailability?.price ?? DEFAULT_PRICE_DTO; + } else { + return item?.unitPrice ?? DEFAULT_PRICE_DTO; + } + } + + return DEFAULT_PRICE_DTO; + }; +} + +export function getCanAddResultForItemAndCurrentPurchaseOption(itemId: number): (state: PurchaseOptionsState) => CanAdd { + return (state) => { + const purchaseOption = getPurchaseOption(state); + const canAddResults = getCanAddResults(state); + return canAddResults.find((canAddResult) => canAddResult.itemId === itemId && canAddResult.purchaseOption === purchaseOption); + }; +} + +export function getAvailabilityWithPurchaseOption( + itemId: number, + purchaseOption: PurchaseOption +): (state: PurchaseOptionsState) => Availability { + return (state) => { + let availabilities = getAvailabilitiesForItem(itemId)(state); + + let availability = availabilities.find((availability) => availability.purchaseOption === purchaseOption); + + if (purchaseOption === 'delivery') { + const digAvailability = availabilities.find((availability) => availability.purchaseOption === 'dig-delivery'); + const b2bAvailability = availabilities.find((availability) => availability.purchaseOption === 'b2b-delivery'); + + availability = availability || digAvailability || b2bAvailability; + } + + return availability; + }; +} + +export function getCanAddResultWithPurchaseOption(itemId: number, purchaseOption: PurchaseOption): (state: PurchaseOptionsState) => CanAdd { + return (state) => { + const canAddResults = getCanAddResults(state); + return canAddResults.find((canAddResult) => canAddResult.itemId === itemId && canAddResult.purchaseOption === purchaseOption); + }; +} + +export function canContinue(state: PurchaseOptionsState): boolean { + const purchaseOption = getPurchaseOption(state); + + if (purchaseOption === undefined) { + return false; + } + + if (purchaseOption === 'pickup' && getPickupBranch(state) === undefined) { + return false; + } + + if (purchaseOption === 'in-store' && getInStoreBranch(state) === undefined) { + return false; + } + + const items = getItems(state); + + if (items.length === 0) { + return false; + } + + const selectedItemIds = getSelectedItemIds(state); + + if (selectedItemIds.length === 0) { + return false; + } + + const selectedItems = items.filter((item) => selectedItemIds.includes(item.id)); + + if (selectedItems.length === 0) { + return false; + } + + for (const item of selectedItems) { + if (item.quantity > 0) { + return true; + } + + const price = getPriceForPurchaseOption(item.id, purchaseOption)(state); + + if (price === undefined) { + return false; + } + + if (price?.value?.value > 0 && !(price?.vat?.value >= 0)) { + return false; + } + + let availability = getAvailabilityWithPurchaseOption(item.id, purchaseOption)(state); + + if (availability === undefined) { + return false; + } + + const canAddResult = getCanAddResultWithPurchaseOption(item.id, purchaseOption)(state); + + if (canAddResult === undefined || !canAddResult.canAdd) { + return false; + } + } + + return true; +} + +export function isDigCustomer(state: PurchaseOptionsState): boolean { + return !!state.customerFeatures['webshop']; +} + +export function isB2bCustomer(state: PurchaseOptionsState): boolean { + return !!state.customerFeatures['b2b']; +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.service.ts b/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.service.ts new file mode 100644 index 000000000..afffa9315 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.service.ts @@ -0,0 +1,146 @@ +import { Injectable } from '@angular/core'; +import { ApplicationService } from '@core/application'; +import { DomainAvailabilityService } from '@domain/availability'; +import { DomainCheckoutService } from '@domain/checkout'; +import { + AddToShoppingCartDTO, + AvailabilityDTO, + EntityDTOContainerOfDestinationDTO, + ItemPayload, + ItemsResult, + ShoppingCartDTO, + UpdateShoppingCartItemDTO, +} from '@swagger/checkout'; +import { Observable } from 'rxjs'; +import { map, shareReplay, take } from 'rxjs/operators'; +import { Branch, ItemData } from './purchase-options.types'; + +@Injectable({ providedIn: 'root' }) +export class PurchaseOptionsService { + constructor( + private _availabilityService: DomainAvailabilityService, + private _checkoutService: DomainCheckoutService, + private _appService: ApplicationService + ) {} + + getSelectedBranchForProcess(processId: number): Observable { + return this._appService.getSelectedBranch$(processId).pipe(take(1), shareReplay(1)); + } + + getCustomerFeatures(processId: number): Observable> { + return this._checkoutService.getCustomerFeatures({ processId }).pipe(take(1), shareReplay(1)); + } + + fetchDefaultBranch(): Observable { + return this._availabilityService.getDefaultBranch(); + } + + fetchPickupAvailability(item: ItemData, quantity: number, branch: Branch): Observable { + return this._availabilityService + .getPickUpAvailability({ + branch, + quantity, + item, + }) + .pipe(map((res) => res[0])); + } + + fetchInStoreAvailability(item: ItemData, quantity: number, branch: Branch): Observable { + return this._availabilityService.getTakeAwayAvailability({ + item, + quantity, + branch, + }); + } + + fetchDeliveryAvailability(item: ItemData, quantity: number): Observable { + return this._availabilityService.getDeliveryAvailability({ + item, + quantity, + }); + } + + fetchDigDeliveryAvailability(item: ItemData, quantity: number): Observable { + return this._availabilityService.getDigDeliveryAvailability({ + item, + quantity, + }); + } + + fetchB2bDeliveryAvailability(item: ItemData, quantity: number): Observable { + return this._availabilityService.getB2bDeliveryAvailability({ + item, + quantity, + }); + } + + fetchDownloadAvailability(item: ItemData): Observable { + return this._availabilityService.getDownloadAvailability({ + item, + }); + } + + isAvailable(availability: AvailabilityDTO): boolean { + return this._availabilityService.isAvailable({ availability }); + } + + fetchCanAdd(processId: number, orderType: string, payload: ItemPayload[]): Observable { + return this._checkoutService.canAddItems({ + processId, + orderType, + payload, + }); + } + + removeItemFromShoppingCart(processId: number, shoppingCartItemId: number): Promise { + return this._checkoutService + .updateItemInShoppingCart({ + processId, + shoppingCartItemId, + update: { + availability: null, + quantity: 0, + }, + }) + .toPromise(); + } + + getInStoreDestination(branch: Branch): EntityDTOContainerOfDestinationDTO { + return { + data: { target: 1, targetBranch: { id: branch.id } }, + }; + } + + getPickupDestination(branch: Branch): EntityDTOContainerOfDestinationDTO { + return { + data: { target: 1, targetBranch: { id: branch.id } }, + }; + } + + getDeliveryDestination(availability: AvailabilityDTO): EntityDTOContainerOfDestinationDTO { + return { + data: { target: 2, logistician: availability?.logistician }, + }; + } + + getDownloadDestination(): EntityDTOContainerOfDestinationDTO { + return { + data: { target: 16 }, + }; + } + + addItemToShoppingCart(processId: number, items: AddToShoppingCartDTO[]) { + return this._checkoutService.addItemToShoppingCart({ + processId, + items, + }); + } + + updateItemInShoppingCart(processId: number, shoppingCartItemId: number, payload: UpdateShoppingCartItemDTO) { + return this._checkoutService.updateItemInShoppingCart({ + processId, + shoppingCartItemId, + update: payload, + }); + } +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.state.ts b/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.state.ts new file mode 100644 index 000000000..06c2090b3 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.state.ts @@ -0,0 +1,28 @@ +import { PriceDTO } from '@swagger/checkout'; +import { ActionType, Availability, Branch, CanAdd, Item, PurchaseOption } from './purchase-options.types'; + +export interface PurchaseOptionsState { + type: ActionType; + + processId: number; + + items: Item[]; + + availabilities: Availability[]; + + canAddResults: CanAdd[]; + + purchaseOption: PurchaseOption; + + selectedItemIds: number[]; + + prices: { [itemId: number]: PriceDTO }; + + defaultBranch: Branch; + + pickupBranch: Branch; + + inStoreBranch: Branch; + + customerFeatures: Record; +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.store.ts b/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.store.ts new file mode 100644 index 000000000..75035d1d3 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.store.ts @@ -0,0 +1,670 @@ +import { Injectable } from '@angular/core'; +import { ComponentStore } from '@ngrx/component-store'; +import { PurchaseOptionsModalData } from '../purchase-options-modal.data'; +import { PurchaseOptionsService } from './purchase-options.service'; +import { PurchaseOptionsState } from './purchase-options.state'; +import { Availability, Branch, CanAdd, Item, ItemData, ItemPayloadWithSourceId, OrderType, PurchaseOption } from './purchase-options.types'; +import * as Selectors from './purchase-options.selectors'; +import { + getPurchaseOptionForOrderType, + isDownload, + isGiftCard, + isItemDTO, + isShoppingCartItemDTO, + mapToItemData, + mapToItemPayload, +} from './purchase-options.helpers'; +import { Observable } from 'rxjs'; +import { switchMap } from 'rxjs/operators'; +import { DEFAULT_PRICE_DTO, DEFAULT_PRICE_VALUE } from '../constants'; +import { AddToShoppingCartDTO, EntityDTOContainerOfDestinationDTO, UpdateShoppingCartItemDTO } from '@swagger/checkout'; + +@Injectable() +export class PurchaseOptionsStore extends ComponentStore { + get type() { + return this.get(Selectors.getType); + } + + type$ = this.select(Selectors.getType); + + get processId() { + return this.get(Selectors.getProcessId); + } + + processId$ = this.select(Selectors.getProcessId); + + get items() { + return this.get(Selectors.getItems); + } + + items$ = this.select(Selectors.getItems); + + get purchaseOption() { + return this.get(Selectors.getPurchaseOption); + } + + purchaseOption$ = this.select(Selectors.getPurchaseOption); + + get availabilities() { + return this.get(Selectors.getAvailabilities); + } + + availabilities$ = this.select(Selectors.getAvailabilities); + + get defaultBranch() { + return this.get(Selectors.getDefaultBranch); + } + + defaultBranch$ = this.select(Selectors.getDefaultBranch); + + get pickupBranch() { + return this.get(Selectors.getPickupBranch); + } + + pickupBranch$ = this.select(Selectors.getPickupBranch); + + get inStoreBranch() { + return this.get(Selectors.getInStoreBranch); + } + + inStoreBranch$ = this.select(Selectors.getInStoreBranch); + + get purchasingOptions() { + return this.get(Selectors.getPurchasingOptions); + } + + purchasingOptions$ = this.select(Selectors.getPurchasingOptions); + + get selectedItemIds() { + return this.get(Selectors.getSelectedItemIds); + } + + selectedItemIds$ = this.select(Selectors.getSelectedItemIds); + + get purchaseOptionsInAvailabilities(): PurchaseOption[] { + return this.get(Selectors.getPurchaseOptionsInAvailabilities); + } + + getPurchaseOptionsInAvailabilities$ = this.select(Selectors.getPurchaseOptionsInAvailabilities); + + get itemsForList() { + return this.get(Selectors.getItemsForList); + } + + itemsForList$ = this.select(Selectors.getItemsForList); + + get prices() { + return this.get(Selectors.getPrices); + } + + prices$ = this.select(Selectors.getPrices); + + get canAddResults() { + return this.get(Selectors.getCanAddResults); + } + + canAddResults$ = this.select(Selectors.getCanAddResults); + + get canContinue() { + return this.get(Selectors.canContinue); + } + + canContinue$ = this.select(Selectors.canContinue); + + constructor(private _service: PurchaseOptionsService) { + super({ + defaultBranch: undefined, + inStoreBranch: undefined, + items: [], + pickupBranch: undefined, + processId: undefined, + purchaseOption: undefined, + selectedItemIds: [], + type: undefined, + availabilities: [], + prices: {}, + canAddResults: [], + customerFeatures: {}, + }); + } + + async initialize({ items, processId, type }: PurchaseOptionsModalData) { + const branch = await this._service.getSelectedBranchForProcess(processId).toPromise(); + const customerFeatures = await this._service.getCustomerFeatures(processId).toPromise(); + + this.patchState({ + processId: processId, + type: type, + items: items.map((item) => ({ ...item, quantity: item['quantity'] ?? 1 })), + defaultBranch: undefined, + pickupBranch: branch, + inStoreBranch: branch, + customerFeatures, + }); + + await this._loadDefaultBranch(); + await this._loadAvailabilities(); + await this._loadCanAdd(); + } + + // #region Private funtions for loading and setting Branches and Availabilities + + private async _loadDefaultBranch(): Promise { + try { + const branch = await this._service.fetchDefaultBranch().toPromise(); + this.patchState({ defaultBranch: branch }); + } catch (err) { + console.error('_loadDefaultBranchError', err); + } + } + + private async _loadAvailabilities() { + const items = this.items; + + const promises: Promise[] = []; + + items.forEach((item) => { + const itemData = mapToItemData(item, this.type); + if (isDownload(item)) { + promises.push(this._loadDownloadAvailability(itemData)); + } else { + if (!isGiftCard(item, this.type)) { + promises.push(this._loadPickupAvailability(itemData)); + promises.push(this._loadInStoreAvailability(itemData)); + promises.push(this._loadDeliveryAvailability(itemData)); + promises.push(this._loadDigDeliveryAvailability(itemData)); + } + promises.push(this._loadB2bDeliveryAvailability(itemData)); + } + }); + + await Promise.all(promises); + } + + private async _loadPickupAvailability(itemData: ItemData) { + const branch = this.pickupBranch; + if (!branch) return Promise.resolve(); + + try { + const res = await this._service.fetchPickupAvailability(itemData, 1, branch).toPromise(); + + const availability: Availability = { + itemId: itemData.sourceId, + purchaseOption: 'pickup', + data: res, + }; + + this._checkAndSetAvailability(availability); + } catch (err) { + console.error('_loadPickupAvailability', err); + } + } + + private async _loadInStoreAvailability(itemData: ItemData) { + const branch = this.inStoreBranch; + if (!branch) return Promise.resolve(); + + try { + const res = await this._service.fetchInStoreAvailability(itemData, 1, branch).toPromise(); + + const availability: Availability = { + itemId: itemData.sourceId, + purchaseOption: 'in-store', + data: res, + }; + + this._checkAndSetAvailability(availability); + } catch (err) { + console.error('_loadInStoreAvailability', err); + } + } + + private async _loadDeliveryAvailability(itemData: ItemData) { + try { + const res = await this._service.fetchDeliveryAvailability(itemData, 1).toPromise(); + + const availability: Availability = { + itemId: itemData.sourceId, + purchaseOption: 'delivery', + data: res, + }; + + this._checkAndSetAvailability(availability); + } catch (error) { + console.error('_loadDeliveryAvailability', error); + } + } + + private async _loadDigDeliveryAvailability(itemData: ItemData) { + try { + const res = await this._service.fetchDigDeliveryAvailability(itemData, 1).toPromise(); + + const availability: Availability = { + itemId: itemData.sourceId, + purchaseOption: 'dig-delivery', + data: res, + }; + + this._checkAndSetAvailability(availability); + } catch (error) { + console.error('_loadDigDeliveryAvailability', error); + } + } + + private async _loadB2bDeliveryAvailability(itemData: ItemData) { + try { + const res = await this._service.fetchB2bDeliveryAvailability(itemData, 1).toPromise(); + + const availability: Availability = { + itemId: itemData.sourceId, + purchaseOption: 'b2b-delivery', + data: res, + }; + + this._checkAndSetAvailability(availability); + } catch (error) { + console.error('_loadB2bDeliveryAvailability', error); + } + } + + private async _loadDownloadAvailability(itemData: ItemData) { + try { + const res = await this._service.fetchDownloadAvailability(itemData).toPromise(); + + const availability: Availability = { + itemId: itemData.sourceId, + purchaseOption: 'download', + data: res, + }; + + this._checkAndSetAvailability(availability); + } catch (error) { + console.error('_loadDownloadAvailability', error); + } + } + + private _checkAndSetAvailability(availability: Availability) { + if (this._service.isAvailable(availability.data)) { + const availabilities = this.availabilities; + + const index = availabilities.findIndex((a) => a.itemId === availability.itemId && a.purchaseOption === availability.purchaseOption); + + if (index > -1) { + availabilities[index] = availability; + } else { + availabilities.push(availability); + } + + this.patchState({ availabilities }); + } + } + + private _addCanAddResult(canAdd: CanAdd) { + let canAddResults = this.canAddResults; + canAddResults = canAddResults.filter((c) => !(c.itemId === canAdd.itemId && c.purchaseOption === canAdd.purchaseOption)); + canAddResults.push(canAdd); + this.patchState({ canAddResults }); + } + + private async _loadCanAdd() { + const payloads: Record = { + Abholung: [], + Rücklage: [], + Versand: [], + Download: [], + }; + + this.items.forEach((item) => { + // Get Rücklage availability + const inStoreAvailability = this.availabilities.find((a) => a.itemId === item.id && a.purchaseOption === 'in-store'); + if (inStoreAvailability) { + payloads['Rücklage'].push( + mapToItemPayload({ + item, + availability: inStoreAvailability.data, + quantity: item.quantity ?? 1, + type: this.type, + }) + ); + } + + // Get Versand availability + let deliveryAvailability = this.availabilities.find((a) => a.itemId === item.id && a.purchaseOption === 'delivery'); + const digDeliveryAvailability = this.availabilities.find((a) => a.itemId === item.id && a.purchaseOption === 'dig-delivery'); + const b2bDeliveryAvailability = this.availabilities.find((a) => a.itemId === item.id && a.purchaseOption === 'b2b-delivery'); + deliveryAvailability = deliveryAvailability || digDeliveryAvailability || b2bDeliveryAvailability; + if (deliveryAvailability) { + payloads['Versand'].push( + mapToItemPayload({ + item, + availability: deliveryAvailability.data, + quantity: item.quantity ?? 1, + type: this.type, + }) + ); + } + + // Get Abholung availability + let pickupAvailability = this.availabilities.find((a) => a.itemId === item.id && a.purchaseOption === 'pickup'); + if (pickupAvailability) { + payloads['Abholung'].push( + mapToItemPayload({ + item, + availability: pickupAvailability.data, + quantity: item.quantity ?? 1, + type: this.type, + }) + ); + } + + // Get Download availability + const downloadAvailability = this.availabilities.find((a) => a.itemId === item.id && a.purchaseOption === 'download'); + if (downloadAvailability) { + payloads['Versand'].push( + mapToItemPayload({ + item, + availability: downloadAvailability.data, + quantity: item.quantity ?? 1, + type: this.type, + }) + ); + } + }); + + for (const key in payloads) { + const itemPayloads = payloads[key]; + if (itemPayloads.length > 0) { + try { + const res = await this._service.fetchCanAdd(this.processId, key, itemPayloads).toPromise(); + res.forEach((canAdd) => { + const item = itemPayloads.find((i) => i.id === canAdd.id); + this._addCanAddResult({ + canAdd: canAdd.status === 0, + itemId: item.sourceId, + purchaseOption: getPurchaseOptionForOrderType(key as OrderType), + message: canAdd.message, + }); + }); + } catch (error) { + console.error('_loadCanAdd', error); + } + } + } + } + + // #endregion + + setPurchaseOption(purchaseOption: PurchaseOption) { + if (purchaseOption !== this.purchaseOption) { + this.patchState({ purchaseOption }); + } + } + + setSelectedItem(itemId: number, value: boolean) { + const selectedItemIds = this.selectedItemIds; + if (value && !selectedItemIds.includes(itemId)) { + this.patchState({ selectedItemIds: [...selectedItemIds, itemId] }); + } else if (!value && selectedItemIds.includes(itemId)) { + this.patchState({ selectedItemIds: selectedItemIds.filter((id) => id !== itemId) }); + } + } + + resetSelectedItems() { + this.patchState({ selectedItemIds: [] }); + } + + getItemsThatHaveAnAvailabilityForPurchaseOption(purchaseOption: PurchaseOption): Item[] { + return this.get(Selectors.getItemsThatHaveAnAvailabilityForPurchaseOption(purchaseOption)); + } + + getItemsThatHaveAnAvailabilityForPurchaseOption$(purchaseOption: PurchaseOption): Observable { + return this.select(Selectors.getItemsThatHaveAnAvailabilityForPurchaseOption(purchaseOption)); + } + + getItemsThatHaveAnAvailabilityAndCanAddForPurchaseOption(purchaseOption: PurchaseOption): Item[] { + return this.get(Selectors.getItemsThatHaveAnAvailabilityAndCanAddForPurchaseOption(purchaseOption)); + } + + getItemsThatHaveAnAvailabilityAndCanAddForPurchaseOption$(purchaseOption: PurchaseOption): Observable { + return this.select(Selectors.getItemsThatHaveAnAvailabilityAndCanAddForPurchaseOption(purchaseOption)); + } + + getAvailabilitiesForItem(itemId: number): Availability[] { + return this.get(Selectors.getAvailabilitiesForItem(itemId)); + } + + getAvailabilitiesForItem$(itemId: number): Observable { + return this.select(Selectors.getAvailabilitiesForItem(itemId)); + } + + setInStoreBranch(branch: Branch | undefined) { + if (this.inStoreBranch !== branch) { + this.patchState({ inStoreBranch: branch }); + + if (this.inStoreBranch) { + const promises = this.items.map((item) => { + const itemData = mapToItemData(item, this.type); + return this._loadInStoreAvailability(itemData); + }); + + Promise.all(promises).then(() => { + this._loadCanAdd(); + }); + } + } + } + + setPickupBranch(branch: Branch | undefined) { + if (this.pickupBranch !== branch) { + this.patchState({ pickupBranch: branch }); + + if (this.pickupBranch) { + const promises = this.items.map((item) => { + const itemData = mapToItemData(item, this.type); + return this._loadPickupAvailability(itemData); + }); + + Promise.all(promises).then(() => { + this._loadCanAdd(); + }); + } + } + } + + async removeItem(itemId: number, removeFromShoppingCart: boolean) { + const item = this.items.find((i) => i.id === itemId); + + if (removeFromShoppingCart && isShoppingCartItemDTO(item, this.type)) { + this.removeItemFromShoppingCart(item); + } + + const items = this.items.filter((i) => i.id !== itemId); + this.setSelectedItem(itemId, false); + this.patchState({ items }); + } + + async removeItemFromShoppingCart(item: Item) { + try { + await this._service.removeItemFromShoppingCart(this.processId, item.id); + } catch (error) { + console.error('removeItem', error); + } + } + + setItemQuantity(itemId: number, quantity: number) { + const items = this.items; + if (quantity <= 0) { + this.removeItem(itemId, true); + } + + const index = items.findIndex((item) => item.id === itemId); + if (index > -1 && items[index].quantity !== quantity) { + items[index].quantity = quantity; + this.patchState({ items }); + } + } + + getPrice(itemId: number) { + return this.getPriceForPurchaseOption(itemId, this.purchaseOption); + } + + getPrice$(itemId: number) { + return this.purchaseOption$.pipe(switchMap((po) => this.getPriceForPurchaseOption$(itemId, po))); + } + + getPriceForPurchaseOption(itemId: number, purchaseOption: PurchaseOption) { + return this.get(Selectors.getPriceForPurchaseOption(itemId, purchaseOption)); + } + + getPriceForPurchaseOption$(itemId: number, purchaseOption: PurchaseOption) { + return this.select(Selectors.getPriceForPurchaseOption(itemId, purchaseOption)); + } + + getCanEditPrice(itemId: number) { + return this.get(Selectors.getCanEditPrice(itemId)); + } + + getCanEditPrice$(itemId: number) { + return this.select(Selectors.getCanEditPrice(itemId)); + } + + setPrice(itemId: number, value: number) { + const prices = this.prices; + let price = prices[itemId]; + if (price?.value?.value !== value) { + if (!price) { + price = { ...DEFAULT_PRICE_DTO, value: { ...DEFAULT_PRICE_VALUE, value } }; + } else { + price = { ...price, value: { ...price.value, value } }; + } + + this.patchState({ prices: { ...prices, [itemId]: price } }); + } + } + + getCanAddResultForItemAndCurrentPurchaseOption(itemId: number) { + return this.get(Selectors.getCanAddResultForItemAndCurrentPurchaseOption(itemId)); + } + + getCanAddResultForItemAndCurrentPurchaseOption$(itemId: number) { + return this.select(Selectors.getCanAddResultForItemAndCurrentPurchaseOption(itemId)); + } + + getAvailabilityWithPurchaseOption(itemId: number, purchaseOption: PurchaseOption) { + return this.get(Selectors.getAvailabilityWithPurchaseOption(itemId, purchaseOption)); + } + + getAvailabilityWithPurchaseOption$(itemId: number, purchaseOption: PurchaseOption) { + return this.select(Selectors.getAvailabilityWithPurchaseOption(itemId, purchaseOption)); + } + + getCanAddResultWithPurchaseOption(itemId: number, purchaseOption: PurchaseOption) { + return this.get(Selectors.getCanAddResultWithPurchaseOption(itemId, purchaseOption)); + } + + getCanAddResultWithPurchaseOption$(itemId: number, purchaseOption: PurchaseOption) { + return this.select(Selectors.getCanAddResultWithPurchaseOption(itemId, purchaseOption)); + } + + addItemsToShoppingCart() { + if (!this.canContinue || this.type !== 'add') { + return; + } + } + + getAddToShoppingCartDTOForItem(itemId: number, purchaseOption: PurchaseOption): AddToShoppingCartDTO { + const item = this.items.find((i) => i.id === itemId); + const price = this.getPriceForPurchaseOption(itemId, this.purchaseOption); + const availability = this.getAvailabilityWithPurchaseOption(itemId, purchaseOption); + + if (!isItemDTO(item, this.type)) { + throw new Error('Invalid item'); + } + + let destination: EntityDTOContainerOfDestinationDTO; + if (purchaseOption === 'delivery') { + destination = this._service.getDeliveryDestination(availability.data); + } else if (purchaseOption === 'pickup') { + destination = this._service.getPickupDestination(this.pickupBranch); + } else if (purchaseOption === 'in-store') { + destination = this._service.getInStoreDestination(this.inStoreBranch); + } else if (purchaseOption === 'download') { + destination = this._service.getDownloadDestination(); + } + + return { + quantity: item.quantity, + availability: availability.data, + destination, + itemType: item.type, + product: item.product, + promotion: { points: item.promoPoints }, + retailPrice: { + value: price.value.value, + currency: price.value.currency, + vatType: price.vat.vatType, + }, + shopItemId: item.id, + }; + } + + getUpdateShoppingCartItemDTOForItem(itemId: number, purchaseOption: PurchaseOption): UpdateShoppingCartItemDTO { + const item = this.items.find((i) => i.id === itemId); + const price = this.getPriceForPurchaseOption(itemId, this.purchaseOption); + const availability = this.getAvailabilityWithPurchaseOption(itemId, purchaseOption); + + if (!isShoppingCartItemDTO(item, this.type)) { + throw new Error('Invalid item'); + } + + let destination: EntityDTOContainerOfDestinationDTO; + if (purchaseOption === 'delivery') { + destination = this._service.getDeliveryDestination(availability.data); + } else if (purchaseOption === 'pickup') { + destination = this._service.getPickupDestination(this.pickupBranch); + } else if (purchaseOption === 'in-store') { + destination = this._service.getInStoreDestination(this.inStoreBranch); + } else if (purchaseOption === 'download') { + destination = this._service.getDownloadDestination(); + } + + return { + quantity: item.quantity, + availability: availability.data, + destination, + retailPrice: { + value: price.value.value, + currency: price.value.currency, + vatType: price.vat.vatType, + }, + }; + } + + async save() { + if (!this.canContinue) { + return; + } + const type = this.type; + const purchaseOption = this.purchaseOption; + + if (type === 'add') { + const payloads = this.selectedItemIds.map((itemId) => this.getAddToShoppingCartDTOForItem(itemId, purchaseOption)); + await this._service.addItemToShoppingCart(this.processId, payloads).toPromise(); + } else if (type === 'update') { + const payloads = this.selectedItemIds.map((itemId) => this.getUpdateShoppingCartItemDTOForItem(itemId, purchaseOption)); + + for (const itemId of this.selectedItemIds) { + const item = this.items.find((i) => i.id === itemId); + const payload = this.getUpdateShoppingCartItemDTOForItem(itemId, purchaseOption); + await this._service.updateItemInShoppingCart(this.processId, item.id, payload).toPromise(); + } + } else { + throw new Error('Invalid type'); + } + + this.selectedItemIds.forEach((itemId) => { + this.removeItem(itemId, false); + this.resetSelectedItems(); + }); + } +} diff --git a/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.types.ts b/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.types.ts new file mode 100644 index 000000000..dcf95193f --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/lib/store/purchase-options.types.ts @@ -0,0 +1,27 @@ +import { ItemData as AvailabilityItemData } from '@domain/availability'; +import { ItemDTO } from '@swagger/cat'; +import { AvailabilityDTO, BranchDTO, ItemPayload, ShoppingCartItemDTO } from '@swagger/checkout'; + +export type ActionType = 'add' | 'update'; + +export type PurchaseOption = 'delivery' | 'dig-delivery' | 'b2b-delivery' | 'pickup' | 'in-store' | 'download'; + +export type OrderType = 'Rücklage' | 'Abholung' | 'Versand' | 'Download'; + +export type ItemDTOWithQuantity = ItemDTO & { quantity?: number }; + +export type Item = ItemDTOWithQuantity | ShoppingCartItemDTO; + +export type Branch = BranchDTO; + +export type Availability = { + itemId: number; + purchaseOption: PurchaseOption; + data: AvailabilityDTO; +}; + +export type ItemData = AvailabilityItemData & { sourceId: number }; + +export type ItemPayloadWithSourceId = ItemPayload & { sourceId: number }; + +export type CanAdd = { itemId: number; purchaseOption: PurchaseOption; canAdd: boolean; message?: string }; diff --git a/apps/shared/modals/purchase-options-modal/src/public-api.ts b/apps/shared/modals/purchase-options-modal/src/public-api.ts new file mode 100644 index 000000000..24fd8b822 --- /dev/null +++ b/apps/shared/modals/purchase-options-modal/src/public-api.ts @@ -0,0 +1,3 @@ +export * from './lib/purchase-options-modal.component'; +export * from './lib/purchase-options-modal.data'; +export * from './lib/purchase-options-modal.service'; diff --git a/apps/shared/pipes/branch/ng-package.json b/apps/shared/pipes/branch/ng-package.json new file mode 100644 index 000000000..5b6ba62cc --- /dev/null +++ b/apps/shared/pipes/branch/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/apps/shared/pipes/branch/src/lib/branch-name.pipe.ts b/apps/shared/pipes/branch/src/lib/branch-name.pipe.ts new file mode 100644 index 000000000..04c9a7236 --- /dev/null +++ b/apps/shared/pipes/branch/src/lib/branch-name.pipe.ts @@ -0,0 +1,29 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { BranchDTO } from '@swagger/checkout'; + +export type BranchNameFormat = 'key' | 'name' | 'key-name'; + +@Pipe({ + name: 'branchName', + standalone: true, + pure: true, +}) +export class BranchNamePipe implements PipeTransform { + transform(value: BranchDTO, format: BranchNameFormat = 'key-name'): any { + if (!value) return 'Filiale auswählen'; + + if (format === 'key-name') { + return `${value.key} - ${value.name}`; + } + + if (format === 'name') { + return value.name; + } + + if (format === 'key') { + return value.key; + } + + return ''; + } +} diff --git a/apps/shared/pipes/branch/src/public-api.ts b/apps/shared/pipes/branch/src/public-api.ts new file mode 100644 index 000000000..565fcd6ce --- /dev/null +++ b/apps/shared/pipes/branch/src/public-api.ts @@ -0,0 +1 @@ +export * from './lib/branch-name.pipe'; diff --git a/apps/ui/icon/src/lib/icons.ts b/apps/ui/icon/src/lib/icons.ts new file mode 100644 index 000000000..bd8f9b4e5 --- /dev/null +++ b/apps/ui/icon/src/lib/icons.ts @@ -0,0 +1,47 @@ +export const isaAudio = + 'M3.629,12.777C2.165,12.924 1,14.153 1,15.664L1,19.358C1,20.969 2.326,22.275 3.926,22.275L6.418,22.275C7.061,22.275 7.602,21.756 7.602,21.114L7.602,13.908C7.602,13.264 7.063,12.762 6.418,12.762L5.959,12.762C5.959,12.762 5.959,10.214 5.959,10.214C5.959,6.818 8.675,4.056 12.023,4.056C15.371,4.056 18.088,6.822 18.088,10.214C18.088,10.214 18.088,12.762 18.088,12.762C18.088,12.762 17.629,12.762 17.629,12.762C16.984,12.762 16.445,13.264 16.445,13.908C16.445,13.908 16.445,21.114 16.445,21.114C16.445,21.756 16.986,22.275 17.629,22.275L20.121,22.275C21.724,22.275 23,20.972 23,19.358C23,19.358 23,15.664 23,15.664C23,14.151 21.879,12.924 20.418,12.777L20.418,10.214C20.418,5.531 16.651,1.725 12.023,1.725C7.396,1.725 3.629,5.531 3.629,10.214L3.629,12.777ZM5.272,19.944L3.926,19.944C3.607,19.944 3.33,19.685 3.33,19.358C3.33,19.358 3.33,15.664 3.33,15.664C3.33,15.339 3.608,15.092 3.926,15.092C3.926,15.092 5.272,15.092 5.272,15.092L5.272,19.944ZM20.67,19.359C20.669,19.68 20.435,19.944 20.121,19.944C20.121,19.944 18.775,19.944 18.775,19.944C18.775,19.944 18.775,15.092 18.775,15.092C18.775,15.092 20.121,15.092 20.121,15.092C20.433,15.092 20.67,15.347 20.67,15.664L20.67,19.359Z'; + +export const isaEbook = + 'M18.637,1L5.363,1C4.058,1 2.991,2.067 2.991,3.372L2.991,20.628C2.991,21.933 4.058,23 5.363,23C5.363,23 18.637,23 18.637,23C19.942,23 21.009,21.933 21.009,20.628L21.009,3.372C21.009,2.028 19.942,1 18.637,1ZM18.92,20.628C18.92,20.784 18.793,20.911 18.637,20.911C18.637,20.911 5.363,20.911 5.363,20.911C5.207,20.911 5.08,20.784 5.08,20.628L5.08,3.372C5.08,3.216 5.207,3.089 5.363,3.089C5.363,3.089 18.637,3.089 18.637,3.089C18.793,3.089 18.92,3.216 18.92,3.372C18.92,3.372 18.92,20.628 18.92,20.628ZM12,16.324C11.061,16.324 10.292,17.093 10.292,18.032C10.292,18.971 11.061,19.74 12,19.74C12.939,19.74 13.708,18.971 13.708,18.032C13.708,17.05 12.939,16.324 12,16.324ZM13.181,4.26L10.643,4.26C10.09,4.26 9.628,4.725 9.628,5.304C9.628,5.883 10.09,6.349 10.643,6.349L13.181,6.349C13.735,6.349 14.196,5.883 14.196,5.304C14.196,4.673 13.735,4.26 13.181,4.26Z'; + +export const isaNonBook = + 'M11.215,5.282L9.049,1L6.884,5.282L6.884,7.704C6.081,8.012 5.499,8.385 5.14,8.786C4.803,9.164 4.641,9.575 4.641,10.002L4.641,19.873C4.641,20.614 5.183,21.34 6.218,21.883C7.504,22.558 9.591,23 12,23C14.408,23 16.495,22.558 17.781,21.888C18.818,21.349 19.359,20.627 19.359,19.896L19.359,10.025C19.359,9.262 18.765,8.483 17.588,7.918C17.588,7.918 17.588,1.437 17.588,1.437L13.257,1.437L13.257,6.947C12.577,6.901 11.896,6.891 11.215,6.917C11.215,6.917 11.215,5.282 11.215,5.282ZM12,21.506C9.805,21.506 8.048,21.14 6.994,20.626C6.691,20.478 6.453,20.322 6.293,20.156C6.207,20.067 6.14,19.987 6.14,19.896L6.14,11.96C7.444,12.655 9.564,13.129 12,13.129C14.436,13.129 16.556,12.655 17.859,11.96C17.86,11.96 17.86,19.873 17.86,19.873C17.86,19.968 17.793,20.054 17.705,20.147C17.545,20.315 17.307,20.473 17.004,20.622C15.951,21.141 14.194,21.506 12,21.506ZM13.257,8.446L13.257,11.606C12.864,11.635 12.448,11.658 12.008,11.659C12.008,11.659 11.215,11.63 11.215,11.63C11.215,11.63 11.215,8.43 11.215,8.43C11.895,8.396 12.577,8.401 13.257,8.446L13.257,8.446ZM9.047,4.321L9.716,5.644C9.716,5.644 9.716,11.502 9.716,11.502C9.267,11.44 8.822,11.353 8.383,11.242C8.383,11.242 8.383,5.622 8.383,5.622L9.047,4.321ZM16.089,11.122C15.652,11.256 15.206,11.362 14.756,11.439C14.756,11.439 14.756,5.731 14.756,5.731C14.756,5.731 16.089,5.731 16.089,5.731L16.089,11.122ZM6.884,9.354L6.884,10.721C6.7,10.626 6.543,10.524 6.416,10.418C6.257,10.286 6.14,10.166 6.14,10.025C6.14,9.887 6.261,9.775 6.418,9.649C6.546,9.546 6.702,9.447 6.884,9.354L6.884,9.354ZM17.86,10.025C17.86,10.127 17.779,10.214 17.678,10.312C17.65,10.339 17.62,10.365 17.588,10.392C17.588,10.391 17.588,9.659 17.588,9.659C17.62,9.685 17.65,9.712 17.678,9.739C17.779,9.837 17.86,9.923 17.86,10.025ZM16.089,2.931L16.089,4.238C16.089,4.238 14.756,4.238 14.756,4.238C14.756,4.238 14.756,2.931 14.756,2.931L16.089,2.931Z'; + +export const isaHardCover = + 'M4.109,3.168L4.105,3.169C3.708,3.207 3.407,3.545 3.408,3.951C3.408,3.95 3.408,5.027 3.408,5.027L1.696,5.028C1.3,5.066 0.998,5.404 1,5.81C1,5.809 1,18.512 1,18.512C1,18.945 1.344,19.294 1.765,19.294L9.319,19.294C10.324,19.294 10.957,19.658 11.317,20.403L11.318,20.404C11.449,20.668 11.713,20.833 12,20.833C12.287,20.833 12.551,20.668 12.682,20.404L12.682,20.404C13.043,19.658 13.676,19.294 14.681,19.294L22.235,19.294C22.656,19.294 23,18.945 23,18.512L23,5.809C23,5.376 22.656,5.027 22.235,5.027L20.592,5.027C20.592,5.027 20.592,3.95 20.592,3.95C20.592,3.517 20.248,3.168 19.827,3.168L14.681,3.168C13.615,3.168 12.642,3.708 12,4.512C11.357,3.708 10.385,3.168 9.319,3.168L4.109,3.168ZM2.529,6.592L3.408,6.592C3.408,6.592 3.408,16.343 3.408,16.343C3.408,16.777 3.752,17.125 4.173,17.125L8.34,17.125C9.144,17.125 9.811,17.347 10.302,17.782C10.332,17.808 10.36,17.834 10.388,17.862C10.048,17.774 9.69,17.73 9.319,17.73C9.319,17.73 2.529,17.73 2.529,17.73L2.529,6.592ZM20.592,6.592L21.471,6.592C21.471,6.592 21.471,17.73 21.471,17.73C21.471,17.73 14.681,17.73 14.681,17.73C14.31,17.73 13.951,17.774 13.614,17.861C13.64,17.834 13.668,17.808 13.698,17.782C14.189,17.347 14.856,17.125 15.66,17.125L19.827,17.125C20.248,17.125 20.592,16.777 20.592,16.343L20.592,6.592ZM11.235,16.536C10.449,15.875 9.427,15.561 8.34,15.561L4.938,15.561L4.938,4.733L9.319,4.733C9.891,4.733 10.467,5.071 10.838,5.517C11.078,5.805 11.234,6.14 11.235,6.462L11.235,16.536ZM12.765,16.536L12.765,6.466C12.765,6.144 12.921,5.807 13.162,5.517C13.533,5.071 14.109,4.733 14.681,4.733L19.062,4.733C19.062,4.733 19.062,15.561 19.062,15.561C19.062,15.561 15.66,15.561 15.66,15.561C14.573,15.561 13.551,15.875 12.765,16.536ZM6.419,12.826L6.419,12.826C6.419,13.215 6.734,13.531 7.123,13.531C7.123,13.531 9.291,13.531 9.291,13.531C9.68,13.531 9.995,13.215 9.995,12.826L9.995,12.795C9.995,12.406 9.68,12.09 9.291,12.09L7.123,12.09C6.734,12.09 6.419,12.406 6.419,12.795L6.581,12.957C6.581,12.957 6.419,12.796 6.419,12.796L6.419,12.826ZM14.005,12.826L14.005,12.826C14.005,13.215 14.32,13.531 14.709,13.531C14.709,13.531 16.877,13.531 16.877,13.531C17.266,13.531 17.581,13.215 17.581,12.826L17.581,12.795C17.581,12.406 17.266,12.09 16.877,12.09L14.709,12.09C14.32,12.09 14.005,12.406 14.005,12.795L14.167,12.957C14.167,12.957 14.005,12.796 14.005,12.796L14.005,12.826ZM9.82,12.944L9.82,12.944L9.833,12.957L9.82,12.944ZM17.406,12.944L17.406,12.944L17.419,12.957L17.406,12.944ZM14.005,10.596L14.005,10.596C14.005,10.985 14.32,11.3 14.709,11.3L16.877,11.3C17.266,11.3 17.581,10.985 17.581,10.596L17.581,10.564C17.581,10.175 17.266,9.86 16.877,9.86L14.709,9.86C14.32,9.86 14.005,10.175 14.005,10.564L14.167,10.727C14.167,10.727 14.005,10.565 14.005,10.565L14.005,10.596ZM6.419,10.596L6.419,10.596C6.419,10.985 6.734,11.3 7.123,11.3L9.291,11.3C9.68,11.3 9.995,10.985 9.995,10.596L9.995,10.564C9.995,10.175 9.68,9.86 9.291,9.86L7.123,9.86C6.734,9.86 6.419,10.175 6.419,10.564L6.581,10.727C6.581,10.727 6.419,10.565 6.419,10.565L6.419,10.596ZM9.82,10.714L9.82,10.714L9.833,10.727L9.82,10.714ZM17.406,10.714L17.406,10.714L17.419,10.727L17.406,10.714ZM6.419,8.365L6.419,8.365C6.419,8.754 6.734,9.069 7.123,9.069L9.291,9.069C9.68,9.069 9.995,8.754 9.995,8.365L9.995,8.333C9.995,7.944 9.68,7.629 9.291,7.629L7.123,7.629C6.734,7.629 6.419,7.944 6.419,8.333L6.581,8.496C6.581,8.496 6.419,8.334 6.419,8.334L6.419,8.365ZM14.005,8.365L14.005,8.365C14.005,8.754 14.32,9.069 14.709,9.069L16.877,9.069C17.266,9.069 17.581,8.754 17.581,8.365L17.581,8.333C17.581,7.944 17.266,7.629 16.877,7.629L14.709,7.629C14.32,7.629 14.005,7.944 14.005,8.333L14.167,8.496C14.167,8.496 14.005,8.334 14.005,8.334L14.005,8.365ZM17.406,8.483L17.406,8.483L17.419,8.496L17.406,8.483ZM9.82,8.483L9.82,8.483L9.833,8.496L9.82,8.483Z'; + +export const isaCalendar = + 'M1,8.937C1,8.955 1,8.974 1.001,8.993C1,8.983 1,19.761 1,19.761C1,21.539 2.464,23 4.241,23C4.241,23 19.767,23 19.767,23C21.544,23 23,21.54 23,19.761L23,8.907C23,8.911 23,6.101 23,6.101C23,4.322 21.543,2.862 19.767,2.862C19.767,2.862 17.768,2.862 17.768,2.862C17.768,2.862 17.768,2.075 17.768,2.075C17.772,1.795 17.66,1.517 17.455,1.312L17.455,1.312C17.251,1.108 16.972,0.995 16.684,1C16.4,1.004 16.131,1.121 15.934,1.324C15.737,1.528 15.628,1.801 15.633,2.084C15.633,2.075 15.633,2.862 15.633,2.862C15.633,2.862 8.294,2.862 8.294,2.862C8.294,2.862 8.294,2.075 8.294,2.075C8.298,1.795 8.185,1.517 7.981,1.312L7.981,1.312C7.781,1.113 7.511,1 7.228,1L7.11,1.003C6.559,1.064 6.147,1.534 6.159,2.088C6.159,2.075 6.159,2.862 6.159,2.862C6.159,2.862 4.241,2.862 4.241,2.862C2.465,2.862 1,4.322 1,6.101L1,8.879L1.595,9.473L1,8.88L1,8.937ZM3.135,10.042L20.865,10.042C20.865,10.042 20.865,19.761 20.865,19.761C20.865,20.369 20.373,20.865 19.767,20.865L4.241,20.865C3.634,20.865 3.135,20.37 3.135,19.761L3.135,10.042ZM4.241,4.996L6.159,4.996C6.159,4.996 6.159,5.783 6.159,5.783C6.158,6.164 6.361,6.517 6.692,6.708C7.022,6.9 7.43,6.9 7.761,6.708C8.091,6.517 8.295,6.164 8.294,5.782C8.294,5.783 8.294,4.996 8.294,4.996C8.294,4.996 15.633,4.996 15.633,4.996C15.633,4.996 15.633,5.783 15.633,5.783C15.632,6.164 15.835,6.517 16.166,6.708C16.496,6.9 16.904,6.9 17.235,6.708C17.565,6.517 17.769,6.164 17.768,5.782C17.768,5.783 17.768,4.996 17.768,4.996C17.768,4.996 19.767,4.996 19.767,4.996C20.373,4.996 20.865,5.492 20.865,6.101C20.865,6.101 20.865,7.907 20.865,7.907C20.865,7.907 3.135,7.907 3.135,7.907C3.135,7.907 3.135,6.101 3.135,6.101C3.135,5.492 3.634,4.996 4.241,4.996Z'; + +export const isaScroll = + 'M20.88,16.904L20.88,4.048C20.88,2.365 19.515,1 17.831,1L4.048,1C2.365,1 1,2.365 1,4.048L1,7.096L5.241,7.096C5.241,7.096 5.241,19.952 5.241,19.952C5.241,21.635 6.606,23 8.289,23C8.289,23 19.952,23 19.952,23C21.635,23 23,21.635 23,19.952C23,19.952 23,16.904 23,16.904L20.88,16.904ZM9.482,19.952C9.482,20.61 8.947,21.145 8.289,21.145C7.631,21.145 7.096,20.61 7.096,19.952L7.096,4.048C7.096,3.623 7.007,3.221 6.848,2.856C6.847,2.855 17.831,2.855 17.831,2.855C18.489,2.855 19.024,3.39 19.024,4.048C19.024,4.048 19.024,16.904 19.024,16.904C19.024,16.904 9.482,16.904 9.482,16.904L9.482,19.952ZM21.145,19.952C21.145,20.61 20.61,21.145 19.952,21.145L11.088,21.145C11.248,20.779 11.337,20.377 11.337,19.952L11.337,18.759C11.337,18.759 21.145,18.759 21.145,18.759C21.145,18.759 21.145,19.952 21.145,19.952ZM5.241,5.241L2.855,5.241C2.855,5.241 2.855,4.048 2.855,4.048C2.855,3.39 3.39,2.855 4.048,2.855C4.706,2.855 5.241,3.39 5.241,4.048L5.241,5.241Z'; + +export const isaSoftware = + 'M12,23C18.075,23 23,18.075 23,12C23,5.925 18.075,1 12,1C5.925,1 1,5.925 1,12C1,18.075 5.925,23 12,23ZM12,21.248C6.892,21.248 2.752,17.108 2.752,12C2.752,6.892 6.892,2.752 12,2.752C17.108,2.752 21.248,6.892 21.248,12C21.248,17.108 17.108,21.248 12,21.248ZM11.991,16.481C14.526,16.481 16.589,14.418 16.589,11.884C16.589,9.349 14.526,7.286 11.991,7.286C9.456,7.286 7.393,9.349 7.393,11.884C7.393,14.418 9.456,16.481 11.991,16.481ZM11.991,9.065C13.528,9.065 14.758,10.294 14.758,11.831C14.758,13.368 13.528,14.598 11.991,14.598C10.454,14.598 9.224,13.368 9.224,11.831C9.224,10.294 10.454,9.065 11.991,9.065ZM11.991,14.153C13.229,14.153 14.261,13.122 14.261,11.884C14.261,10.646 13.229,9.614 11.991,9.614C10.753,9.614 9.721,10.646 9.721,11.884C9.721,13.122 10.753,14.153 11.991,14.153ZM11.991,11.257C12.337,11.257 12.618,11.538 12.618,11.884C12.618,12.23 12.337,12.511 11.991,12.511C11.645,12.511 11.364,12.23 11.364,11.884C11.364,11.538 11.645,11.257 11.991,11.257ZM15.795,4.606L15.927,4.081C17.745,5.06 19.191,6.645 20.03,8.509L20.249,8.995L18.673,9.671L18.46,9.207C17.76,7.682 16.609,6.361 15.126,5.578L15.342,5.692C15.342,5.692 14.909,4.866 14.909,4.866L15.217,4.294L15.53,4.818L15.611,4.668L15.615,4.651L15.619,4.653L15.679,4.542C15.717,4.563 15.756,4.585 15.795,4.606Z'; + +export const isaSoftCover = + 'M18.963,17.967C19.451,17.954 19.842,17.555 19.842,17.064C19.842,17.064 19.842,1.904 19.842,1.904C19.842,1.405 19.437,1 18.938,1L6.154,1C5.047,1.005 4.154,1.905 4.158,3.011C4.158,3.009 4.158,18.545 4.158,18.545C4.16,19.862 5.226,20.928 6.542,20.93L7.479,20.93C7.479,20.93 7.479,22.095 7.479,22.095C7.477,22.443 7.68,22.764 7.997,22.914C8.315,23.064 8.691,23.016 8.961,22.791C8.96,22.792 9.643,22.226 9.643,22.226C9.643,22.226 10.324,22.788 10.324,22.788C10.592,23.011 10.968,23.059 11.286,22.909C11.604,22.759 11.806,22.438 11.804,22.087C11.804,22.09 11.804,20.925 11.804,20.925C11.804,20.925 18.938,20.925 18.938,20.925C19.437,20.925 19.842,20.521 19.842,20.021C19.842,19.531 19.451,19.132 18.964,19.118C18.665,19.094 18.434,18.844 18.434,18.543C18.434,18.247 18.657,18.001 18.948,17.969L18.963,17.967ZM9.287,20.217C9.513,20.12 9.77,20.12 9.997,20.217L9.997,19.449C9.997,19.449 9.287,19.449 9.287,19.449L9.287,20.217ZM7.684,17.973C7.556,18.128 7.479,18.328 7.479,18.545L7.479,19.125C7.479,19.125 6.53,19.125 6.53,19.125C6.305,19.135 6.105,19.027 5.996,18.845C5.886,18.663 5.886,18.435 5.996,18.252C6.105,18.07 6.305,17.962 6.518,17.972L7.684,17.973ZM16.626,19.12L11.804,19.12C11.804,19.12 11.804,18.545 11.804,18.545C11.804,18.328 11.727,18.128 11.6,17.973L16.628,17.973C16.533,18.349 16.533,18.744 16.626,19.12ZM6.543,16.16C6.35,16.161 6.16,16.185 5.975,16.232C5.975,16.232 5.975,3.007 5.975,3.007C5.974,2.902 6.054,2.816 6.156,2.808C6.165,2.807 18.035,2.807 18.035,2.807C18.035,2.807 18.035,16.16 18.035,16.16L6.543,16.16Z'; + +export const isaVideo = + 'M12,23C18.075,23 23,18.075 23,12C23,5.925 18.075,1 12,1C5.925,1 1,5.925 1,12C1,18.075 5.925,23 12,23ZM12,2.784C17.09,2.784 21.216,6.91 21.216,12C21.216,17.09 17.09,21.216 12,21.216C6.91,21.216 2.784,17.09 2.784,12C2.784,6.91 6.91,2.784 12,2.784ZM15.786,10.998L9.84,7.431C9.566,7.262 9.226,7.26 8.941,7.42C8.655,7.581 8.492,7.875 8.492,8.197C8.492,8.197 8.492,15.332 8.492,15.332C8.492,15.652 8.66,15.946 8.943,16.107C9.079,16.187 9.231,16.224 9.384,16.224C9.545,16.224 9.706,16.179 9.84,16.098C9.84,16.098 15.786,12.531 15.786,12.531C16.059,12.372 16.222,12.077 16.222,11.764C16.222,11.451 16.059,11.157 15.782,10.996L15.786,10.998ZM10.276,13.755L10.276,9.769C10.276,9.769 13.598,11.764 13.598,11.764L10.276,13.755Z'; + +export const isaNewsPaper = + 'M12.022,5.892L12.009,5.896L3.216,1.669L3.19,1.66C3.008,1.599 2.769,1.609 2.582,1.722L2.585,1.72C2.386,1.831 2.238,2.09 2.238,2.301L2.238,2.534C2.092,2.518 1.946,2.55 1.8,2.648L1.764,2.672L1.734,2.702C1.614,2.822 1.506,3.053 1.506,3.232L1.506,3.626C1.415,3.652 1.332,3.698 1.262,3.759C1.074,3.897 1,4.096 1,4.3L1,19.336C1,19.675 1.207,19.943 1.543,20.014C1.543,20.014 11.9,22.378 11.9,22.378L12.099,22.378L22.457,20.039C22.793,19.968 23,19.701 23,19.361L23,4.326C23,4.138 22.896,3.941 22.772,3.816C22.695,3.739 22.599,3.682 22.494,3.651L22.494,3.187C22.494,2.973 22.413,2.765 22.2,2.622L22.2,2.622C22.062,2.53 21.924,2.497 21.787,2.507L21.787,2.301C21.787,2.094 21.673,1.874 21.467,1.736C21.277,1.61 21.025,1.597 20.835,1.66L20.809,1.669L12.022,5.892ZM21.624,18.812L12.688,20.842C12.688,20.842 12.688,7.204 12.688,7.204C12.688,7.204 21.624,5.174 21.624,5.174L21.624,18.812ZM2.376,5.174L11.312,7.204C11.312,7.204 11.312,20.842 11.312,20.842C11.312,20.842 2.376,18.812 2.376,18.812L2.376,5.174ZM17.542,11.044L16.99,11.541C16.99,11.541 16.484,11.339 16.484,11.339C16.139,11.2 15.734,11.358 15.592,11.7C15.595,11.694 15.262,12.42 15.262,12.42C15.262,12.42 14.545,12.556 14.545,12.556C14.202,12.625 13.991,12.894 13.991,13.236L14.03,13.94C14.03,13.94 13.356,14.451 13.356,14.451L13.335,14.472C13.202,14.605 13.107,14.758 13.107,14.957C13.107,15.091 13.139,15.276 13.261,15.416C13.26,15.415 13.553,15.787 13.553,15.787C13.553,15.787 13.192,16.454 13.192,16.454L13.18,16.49C13.124,16.658 13.124,16.825 13.18,16.993L13.198,17.048L13.23,17.097C13.342,17.264 13.464,17.364 13.632,17.42L14.083,17.541C14.083,17.541 14.067,18.064 14.067,18.064C14.067,18.284 14.149,18.492 14.362,18.635C14.558,18.766 14.76,18.802 14.956,18.74C14.956,18.74 15.494,18.582 15.494,18.582C15.494,18.582 15.707,18.928 15.707,18.928C15.802,19.143 16.036,19.29 16.271,19.29L16.336,19.29C16.527,19.283 16.668,19.222 16.801,19.044C16.8,19.045 17.322,18.575 17.322,18.575C17.322,18.575 17.828,18.778 17.828,18.778C18.169,18.915 18.569,18.763 18.715,18.428C18.715,18.428 19.044,17.748 19.044,17.748C19.044,17.748 19.767,17.612 19.767,17.612C20.111,17.543 20.321,17.273 20.321,16.931L20.282,16.227C20.282,16.227 20.956,15.716 20.956,15.716L20.977,15.695C21.11,15.562 21.205,15.41 21.205,15.21C21.205,15.077 21.173,14.891 21.052,14.751L20.759,14.381L21.121,13.713L21.133,13.677C21.188,13.509 21.188,13.342 21.133,13.174L21.114,13.119L21.082,13.071C20.97,12.903 20.848,12.803 20.681,12.747L20.23,12.626C20.23,12.626 20.245,12.103 20.245,12.103C20.245,11.883 20.164,11.675 19.95,11.532L19.95,11.532C19.754,11.402 19.552,11.366 19.356,11.427C19.356,11.427 18.818,11.585 18.818,11.585C18.818,11.585 18.606,11.239 18.606,11.239C18.521,11.048 18.324,10.909 18.116,10.882C17.9,10.833 17.689,10.904 17.542,11.044ZM9.936,8.583L3.9,7.206L3.851,7.206C3.673,7.206 3.507,7.244 3.379,7.349L3.394,7.339C3.191,7.481 3.113,7.685 3.113,7.894L3.113,17.133C3.113,17.472 3.32,17.739 3.656,17.811C3.656,17.811 9.691,19.188 9.691,19.188L9.791,19.188C9.905,19.188 10.024,19.148 10.137,19.091L10.162,19.079L10.184,19.064C10.397,18.922 10.479,18.713 10.479,18.5C10.479,18.5 10.479,9.261 10.479,9.261C10.479,8.922 10.272,8.654 9.936,8.583L9.936,8.583ZM9.078,17.652L4.463,16.608C4.463,16.608 4.463,8.767 4.463,8.767C4.463,8.767 9.078,9.811 9.078,9.811L9.078,17.652ZM17.942,16.814L17.736,17.269C17.736,17.269 17.427,17.154 17.427,17.154C17.21,17.081 16.932,17.097 16.722,17.307L16.734,17.296L16.479,17.522L16.406,17.399C16.276,17.203 16.012,17.079 15.817,17.079C15.723,17.079 15.634,17.09 15.543,17.144C15.547,17.142 15.468,17.164 15.468,17.164C15.468,17.164 15.468,17.064 15.468,17.064C15.511,16.724 15.253,16.436 14.972,16.36C14.972,16.36 14.87,16.332 14.87,16.332C14.87,16.332 15.014,16.071 15.014,16.071C15.147,15.803 15.095,15.543 14.965,15.349L14.786,15.114C14.786,15.114 15.164,14.827 15.164,14.827C15.353,14.693 15.443,14.445 15.443,14.248L15.415,13.786C15.415,13.786 15.848,13.694 15.848,13.694C16.123,13.674 16.283,13.478 16.357,13.329L16.576,12.848C16.576,12.848 16.885,12.963 16.885,12.963C17.08,13.028 17.336,12.989 17.524,12.864L17.545,12.849L17.853,12.587L17.931,12.717C18.068,12.922 18.405,13.068 18.677,13L18.849,12.952C18.849,12.952 18.845,13.043 18.845,13.043C18.798,13.388 19.057,13.68 19.34,13.756C19.34,13.756 19.434,13.783 19.434,13.783L19.294,14.029C19.165,14.288 19.217,14.548 19.347,14.742L19.526,14.977C19.526,14.977 19.148,15.264 19.148,15.264L19.151,15.262C18.959,15.399 18.869,15.647 18.869,15.843L18.897,16.305C18.897,16.305 18.407,16.41 18.407,16.41L18.383,16.418C18.191,16.482 18.017,16.627 17.942,16.814ZM14.098,11.073L14.191,11.073L20.49,9.606C20.806,9.537 21.004,9.283 21.004,8.958C21.004,8.958 21.004,7.344 21.004,7.344C21.004,7.167 20.909,6.979 20.792,6.861C20.642,6.707 20.416,6.634 20.19,6.701C20.193,6.7 13.957,8.153 13.957,8.153C13.641,8.221 13.443,8.475 13.443,8.801L13.443,10.414C13.443,10.592 13.539,10.779 13.655,10.898L13.705,10.949L13.768,10.981C13.876,11.036 13.99,11.073 14.098,11.073ZM17.542,11.044L17.531,11.055L17.542,11.044ZM14.752,9.325L19.696,8.162C19.696,8.162 19.696,8.412 19.696,8.412C19.696,8.412 14.752,9.574 14.752,9.574L14.752,9.325ZM21.473,3.574L21.553,3.973L21.554,3.973L21.554,3.541L21.473,3.574Z'; + +export const isaShoppingBag = + 'M6.951,6.624L6.951,6.118C6.951,3.279 9.232,1 12.022,1C14.811,1 17.092,3.279 17.092,6.118L17.092,6.624L19.88,6.624C20.242,6.628 20.593,6.863 20.677,7.225C20.696,7.301 20.699,7.378 20.693,7.456L20.692,7.467L20.692,21.036C20.692,22.107 19.824,23 18.728,23L5.268,23C4.197,23 3.304,22.133 3.304,21.036L3.304,7.482C3.304,6.996 3.676,6.624 4.163,6.624L6.951,6.624ZM6.951,8.317L5.021,8.317L5.021,21.012C5.021,21.162 5.141,21.283 5.292,21.283L18.751,21.283C18.902,21.283 19.022,21.162 19.022,21.012L19.022,8.317L17.092,8.317L17.092,10.635C17.092,11.122 16.72,11.493 16.234,11.493C15.747,11.493 15.375,11.122 15.375,10.635L15.375,8.317L8.668,8.317L8.668,10.635C8.668,11.122 8.296,11.493 7.809,11.493C7.323,11.493 6.951,11.122 6.951,10.635L6.951,8.317ZM15.375,6.6L15.375,6.094C15.375,4.225 13.868,2.693 12.022,2.693C10.175,2.693 8.668,4.225 8.668,6.094L8.668,6.6L15.375,6.6Z'; + +export const isaTruck = + 'M2.594,5.338L2.595,5.331L14.918,5.331C15.872,5.331 16.655,6.101 16.655,7.034L16.655,8.275L19.667,8.276C19.88,8.277 20.08,8.378 20.205,8.548L22.827,12.107C22.879,12.165 22.921,12.231 22.95,12.304L22.957,12.316L22.962,12.337C22.964,12.345 22.967,12.353 22.969,12.359C22.996,12.446 23.006,12.537 22.996,12.626L22.996,15.665C22.996,16.447 22.34,17.096 21.538,17.096L21.467,17.096C21.145,18.008 20.259,18.669 19.222,18.669C18.185,18.669 17.298,18.008 16.977,17.096L8.627,17.096C8.306,18.008 7.419,18.669 6.381,18.669C5.344,18.669 4.458,18.008 4.136,17.096L2.737,17.096C1.783,17.096 1,16.325 1,15.393L1,7.035C1,6.149 1.706,5.41 2.594,5.338ZM6.435,15.323L6.381,15.323C5.802,15.323 5.338,15.773 5.338,16.344C5.338,16.344 5.338,16.347 5.338,16.346C5.34,16.912 5.802,17.36 6.381,17.36C6.955,17.36 7.413,16.921 7.425,16.368L7.425,16.342C7.425,15.789 6.989,15.349 6.435,15.323ZM19.222,15.322C19.802,15.322 20.265,15.772 20.265,16.342C20.265,16.909 19.801,17.36 19.222,17.36C18.642,17.36 18.178,16.909 18.178,16.342C18.178,15.772 18.642,15.322 19.222,15.322ZM15.324,15.787L15.324,7.035C15.324,6.814 15.143,6.641 14.918,6.641L2.737,6.641C2.511,6.641 2.33,6.814 2.33,7.035L2.33,15.393C2.33,15.613 2.511,15.787 2.737,15.787L4.077,15.787C4.332,14.773 5.271,14.013 6.381,14.013C7.492,14.013 8.431,14.773 8.687,15.787L15.324,15.787ZM19.447,9.751L19.327,9.587L16.655,9.585L16.655,15.787L16.917,15.787C17.173,14.773 18.111,14.012 19.222,14.012C20.332,14.012 21.272,14.773 21.527,15.787L21.538,15.787C21.609,15.787 21.665,15.733 21.665,15.665L21.665,12.762L21.32,12.294C21.425,12.482 21.429,12.713 21.326,12.907C21.212,13.123 20.984,13.26 20.736,13.26L17.353,13.26C16.985,13.26 16.687,12.967 16.687,12.605L16.687,10.262C16.687,9.9 16.985,9.607 17.353,9.607L19.032,9.607C19.185,9.607 19.331,9.659 19.447,9.751ZM6.967,10.866C6.727,10.863 6.505,10.987 6.384,11.189C6.263,11.394 6.263,11.647 6.384,11.852C6.505,12.055 6.727,12.178 6.967,12.175C6.964,12.175 13.997,12.175 13.997,12.175C14.235,12.178 14.456,12.055 14.577,11.852C14.699,11.647 14.699,11.394 14.577,11.189C14.456,10.987 14.235,10.863 13.995,10.866C13.997,10.866 6.964,10.866 6.964,10.866L6.967,10.866ZM18.018,10.916L18.018,11.951L19.442,11.951L18.69,10.916L18.018,10.916ZM9.174,8.705C8.935,8.703 8.712,8.826 8.592,9.029C8.47,9.234 8.47,9.486 8.592,9.691C8.712,9.894 8.935,10.017 9.174,10.015C9.172,10.015 13.997,10.015 13.997,10.015C14.235,10.017 14.456,9.894 14.577,9.691C14.699,9.486 14.699,9.234 14.577,9.029C14.456,8.826 14.235,8.703 13.995,8.705C13.997,8.705 9.172,8.705 9.172,8.705L9.174,8.705Z'; + +export const isaB2bTruck = + 'M16.813,7.717C17.496,7.717 18.051,8.266 18.051,8.943L18.051,9.426C18.183,9.378 18.322,9.353 18.463,9.352L20.496,9.352C20.909,9.353 21.294,9.556 21.524,9.896L22.794,11.805C22.925,12.001 22.996,12.23 23,12.464L23,13.85C23,14.527 22.446,15.077 21.763,15.077L21.705,15.077C21.51,15.789 20.857,16.283 20.113,16.283C19.368,16.283 18.716,15.789 18.521,15.077L16.755,15.077C16.56,15.789 15.908,16.283 15.163,16.283C14.419,16.283 13.767,15.789 13.571,15.077L13.513,15.077C12.83,15.077 12.276,14.527 12.276,13.85L12.276,13.582C12.276,13.356 12.461,13.173 12.689,13.173C12.916,13.173 13.101,13.356 13.101,13.582L13.101,13.85C13.101,14.076 13.286,14.259 13.513,14.259L13.567,14.259C13.762,13.546 14.415,13.052 15.159,13.052C15.904,13.052 16.556,13.546 16.751,14.259L17.226,14.259L17.226,8.943C17.226,8.718 17.041,8.534 16.813,8.534L8.564,8.534C8.336,8.534 8.152,8.351 8.152,8.126C8.152,7.9 8.336,7.717 8.564,7.717L16.813,7.717ZM15.163,13.85C14.708,13.85 14.338,14.216 14.338,14.668L14.34,14.718C14.366,15.146 14.724,15.485 15.163,15.485C15.619,15.485 15.988,15.119 15.988,14.668C15.988,14.216 15.619,13.85 15.163,13.85ZM20.113,13.85C19.657,13.85 19.288,14.216 19.288,14.668L19.289,14.718C19.315,15.146 19.674,15.485 20.113,15.485C20.569,15.485 20.938,15.119 20.938,14.668C20.938,14.216 20.569,13.85 20.113,13.85ZM20.496,10.17L18.463,10.17C18.235,10.17 18.051,10.353 18.051,10.579L18.051,14.259L18.517,14.259C18.712,13.546 19.364,13.052 20.109,13.052C20.853,13.052 21.506,13.546 21.701,14.259L21.763,14.259C21.99,14.259 22.175,14.076 22.175,13.85L22.179,12.46C22.178,12.381 22.154,12.304 22.109,12.239L20.839,10.35C20.762,10.237 20.634,10.17 20.496,10.17ZM2.173,10.01L2.271,10.01C2.755,10.019 3.111,10.095 3.337,10.238C3.578,10.39 3.699,10.632 3.699,10.963C3.699,11.189 3.646,11.373 3.541,11.518C3.435,11.662 3.294,11.749 3.119,11.778L3.119,11.804L3.189,11.821C3.392,11.877 3.541,11.971 3.636,12.103C3.741,12.249 3.795,12.443 3.795,12.685C3.795,13.029 3.67,13.297 3.422,13.49C3.174,13.682 2.836,13.778 2.41,13.778L1,13.778L1,10.01L2.173,10.01ZM5.62,9.955C5.855,9.955 6.063,9.998 6.243,10.084C6.424,10.17 6.564,10.29 6.664,10.445C6.763,10.6 6.813,10.777 6.813,10.976C6.813,11.15 6.783,11.313 6.722,11.465C6.661,11.617 6.566,11.773 6.438,11.933C6.31,12.093 6.084,12.32 5.761,12.616L5.277,13.072L5.277,13.108L6.919,13.108L6.919,13.778L4.284,13.778L4.284,13.224L5.23,12.268L5.289,12.208C5.536,11.953 5.7,11.774 5.779,11.671C5.865,11.56 5.927,11.458 5.965,11.363C6.003,11.268 6.022,11.17 6.022,11.069C6.022,10.918 5.98,10.805 5.897,10.731C5.813,10.657 5.702,10.62 5.563,10.62C5.417,10.62 5.275,10.654 5.138,10.721C5,10.788 4.857,10.884 4.707,11.007L4.274,10.494L4.342,10.437C4.498,10.309 4.629,10.216 4.735,10.159C4.858,10.094 4.991,10.044 5.135,10.008C5.279,9.973 5.441,9.955 5.62,9.955ZM8.733,10.01L8.832,10.01C9.316,10.019 9.671,10.095 9.898,10.238C10.139,10.39 10.26,10.632 10.26,10.963C10.26,11.189 10.207,11.373 10.101,11.518C9.996,11.662 9.855,11.749 9.68,11.778L9.68,11.804L9.749,11.821C9.952,11.877 10.101,11.971 10.196,12.103C10.302,12.249 10.355,12.443 10.355,12.685C10.355,13.029 10.231,13.297 9.983,13.49C9.734,13.682 9.397,13.778 8.971,13.778L7.561,13.778L7.561,10.01L8.733,10.01ZM2.294,12.136L1.799,12.136L1.799,13.119L2.32,13.119C2.54,13.119 2.702,13.076 2.807,12.992C2.912,12.908 2.964,12.779 2.964,12.606C2.964,12.293 2.741,12.136 2.294,12.136ZM8.855,12.136L8.36,12.136L8.36,13.119L8.88,13.119C9.1,13.119 9.263,13.076 9.368,12.992C9.473,12.908 9.525,12.779 9.525,12.606C9.525,12.293 9.302,12.136 8.855,12.136ZM20.041,10.491C20.142,10.491 20.237,10.54 20.295,10.622L21.377,12.143C21.445,12.238 21.453,12.364 21.4,12.467C21.346,12.571 21.239,12.637 21.122,12.637L18.974,12.637C18.802,12.637 18.662,12.497 18.662,12.324L18.662,10.803C18.662,10.631 18.802,10.491 18.974,10.491L20.041,10.491ZM19.88,11.116L19.287,11.116L19.287,12.012L20.517,12.012L19.88,11.116ZM2.219,10.664L1.799,10.664L1.799,11.502L2.263,11.502C2.48,11.502 2.637,11.469 2.734,11.402C2.831,11.335 2.879,11.224 2.879,11.069C2.879,10.925 2.826,10.821 2.721,10.758C2.615,10.696 2.448,10.664 2.219,10.664ZM8.78,10.664L8.36,10.664L8.36,11.502L8.824,11.502C9.04,11.502 9.197,11.469 9.294,11.402C9.391,11.335 9.44,11.224 9.44,11.069C9.44,10.925 9.387,10.821 9.281,10.758C9.176,10.696 9.009,10.664 8.78,10.664ZM16.294,10.758C16.406,10.757 16.511,10.816 16.568,10.913C16.624,11.01 16.624,11.131 16.568,11.228C16.511,11.325 16.406,11.384 16.294,11.383L11.828,11.383C11.716,11.384 11.611,11.325 11.555,11.228C11.498,11.131 11.498,11.01 11.555,10.913C11.611,10.816 11.716,10.757 11.828,10.758L16.294,10.758ZM16.294,9.356C16.406,9.355 16.511,9.414 16.568,9.511C16.624,9.609 16.624,9.729 16.568,9.826C16.511,9.923 16.406,9.982 16.294,9.981L13.23,9.981C13.118,9.982 13.013,9.923 12.956,9.826C12.9,9.729 12.9,9.609 12.956,9.511C13.013,9.414 13.118,9.355 13.23,9.356L16.294,9.356Z'; + +export const isaBoxOut = + 'M21.493,7.072L18.338,1.618C18.118,1.237 17.707,1 17.267,1L6.734,1C6.293,1 5.882,1.237 5.661,1.62L2.551,7.016C2.523,7.065 2.502,7.115 2.489,7.167C2.445,7.286 2.421,7.413 2.421,7.546L2.421,21.484C2.421,22.32 3.101,23 3.937,23L20.063,23C20.899,23 21.579,22.32 21.579,21.484L21.579,7.496C21.579,7.476 21.579,7.458 21.577,7.44C21.587,7.315 21.56,7.188 21.493,7.072ZM20.289,21.484C20.289,21.609 20.189,21.71 20.063,21.71L3.937,21.71C3.811,21.71 3.711,21.609 3.711,21.484L3.711,7.741L20.289,7.741L20.289,21.484ZM12.782,9.731C12.739,9.668 12.688,9.608 12.628,9.553C12.548,9.482 12.46,9.427 12.367,9.388C12.249,9.338 12.125,9.314 12,9.315C11.776,9.313 11.552,9.392 11.372,9.553C11.313,9.608 11.261,9.668 11.218,9.731L7.59,13.762C7.246,14.143 7.277,14.73 7.658,15.073C8.039,15.416 8.627,15.385 8.97,15.005L11.065,12.677L11.065,19.579C11.065,20.091 11.48,20.508 11.994,20.508C12.506,20.508 12.921,20.091 12.921,19.579L12.921,12.662L15.031,15.005C15.373,15.385 15.961,15.416 16.342,15.073C16.723,14.73 16.754,14.143 16.411,13.762L12.782,9.731ZM12.666,2.29L17.237,2.29L19.644,6.452L12.666,6.452L12.666,2.29ZM6.764,2.29L11.378,2.29L11.378,6.452L4.364,6.452L6.764,2.29Z'; + +export const isaDownload = + 'M12,23C18.071,23 23,18.071 23,12C23,5.929 18.071,1 12,1C5.929,1 1,5.929 1,12C1,18.071 5.929,23 12,23ZM12,20.412C7.358,20.412 3.588,16.642 3.588,12C3.588,7.358 7.358,3.588 12,3.588C16.642,3.588 20.412,7.358 20.412,12C20.412,16.642 16.642,20.412 12,20.412ZM10.958,13.034L10.958,8.541C10.958,7.956 11.429,7.487 12,7.487C12.571,7.487 13.043,7.956 13.043,8.541L13.043,13.034L14.341,11.701C14.547,11.491 14.815,11.388 15.085,11.388C15.353,11.388 15.622,11.491 15.828,11.701C16.225,12.11 16.225,12.77 15.828,13.179L12.743,16.344C12.333,16.765 11.667,16.765 11.257,16.344C11.257,16.344 8.173,13.179 8.172,13.179C7.775,12.77 7.776,12.11 8.173,11.701C8.378,11.491 8.647,11.387 8.916,11.387L8.967,11.388C9.219,11.401 9.467,11.504 9.659,11.701L10.958,13.034Z'; + +export const matInfo = + 'M11 17h2v-6h-2Zm1-8q.425 0 .713-.288Q13 8.425 13 8t-.287-.713Q12.425 7 12 7t-.712.287Q11 7.575 11 8t.288.712Q11.575 9 12 9Zm0 13q-2.075 0-3.9-.788-1.825-.787-3.175-2.137-1.35-1.35-2.137-3.175Q2 14.075 2 12t.788-3.9q.787-1.825 2.137-3.175 1.35-1.35 3.175-2.138Q9.925 2 12 2t3.9.787q1.825.788 3.175 2.138 1.35 1.35 2.137 3.175Q22 9.925 22 12t-.788 3.9q-.787 1.825-2.137 3.175-1.35 1.35-3.175 2.137Q14.075 22 12 22Zm0-2q3.35 0 5.675-2.325Q20 15.35 20 12q0-3.35-2.325-5.675Q15.35 4 12 4 8.65 4 6.325 6.325 4 8.65 4 12q0 3.35 2.325 5.675Q8.65 20 12 20Zm0-8Z'; diff --git a/apps/ui/icon/src/lib/ui-icon.module.ts b/apps/ui/icon/src/lib/ui-icon.module.ts index 54fb6c299..685d24626 100644 --- a/apps/ui/icon/src/lib/ui-icon.module.ts +++ b/apps/ui/icon/src/lib/ui-icon.module.ts @@ -15,12 +15,33 @@ import { mdiChevronRight, mdiFilterVariant, mdiClose, + mdiMenuDown, + mdiMenuUp, mdiClipboardCheckOutline, mdiShapeOutline, mdiBugOutline, } from '@mdi/js'; import { matRemove } from './mat-icons'; +import { + isaAudio, + isaCalendar, + isaEbook, + isaHardCover, + isaNewsPaper, + isaNonBook, + isaScroll, + isaSoftCover, + isaVideo, + isaSoftware, + isaShoppingBag, + isaB2bTruck, + isaTruck, + isaBoxOut, + isaDownload, + matInfo, +} from './icons'; + export function _rootIconRegistryFactory(config: UiIconConfig): IconRegistry { const registry = new IconRegistry(); @@ -47,6 +68,25 @@ const DEFAULT_ICON_CONFIG: UiIconConfig = { { name: 'chevron-right', data: mdiChevronRight }, { name: 'filter-variant', data: mdiFilterVariant }, { name: 'close', data: mdiClose }, + { name: 'menu-down', data: mdiMenuDown }, + { name: 'menu-up', data: mdiMenuUp }, + { name: 'isa-audio', data: isaAudio }, + { name: 'isa-calendar', data: isaCalendar }, + { name: 'isa-ebook', data: isaEbook }, + { name: 'isa-hard-cover', data: isaHardCover }, + { name: 'isa-news-paper', data: isaNewsPaper }, + { name: 'isa-non-book', data: isaNonBook }, + { name: 'isa-scroll', data: isaScroll }, + { name: 'isa-soft-cover', data: isaSoftCover }, + { name: 'isa-video', data: isaVideo }, + { name: 'isa-software', data: isaSoftware }, + { name: 'isa-shopping-bag', data: isaShoppingBag }, + { name: 'isa-truck', data: isaTruck }, + { name: 'isa-b2b-truck', data: isaB2bTruck }, + { name: 'isa-box-out', data: isaBoxOut }, + { name: 'isa-download', data: isaDownload }, + { name: 'mat-info', data: matInfo }, + { name: 'UNKNOWN', data: '' }, { name: 'clipboard-check-outline', data: mdiClipboardCheckOutline }, { name: 'shape-outline', data: mdiShapeOutline }, { name: 'bug-outline', data: mdiBugOutline }, diff --git a/apps/ui/modal/src/lib/modal.service.ts b/apps/ui/modal/src/lib/modal.service.ts index 65918a8ca..943283479 100644 --- a/apps/ui/modal/src/lib/modal.service.ts +++ b/apps/ui/modal/src/lib/modal.service.ts @@ -1,6 +1,6 @@ import { GlobalPositionStrategy, Overlay } from '@angular/cdk/overlay'; import { ComponentPortal } from '@angular/cdk/portal'; -import { Injectable, Injector, TemplateRef, Type } from '@angular/core'; +import { Injectable, Injector, StaticProvider, TemplateRef, Type } from '@angular/core'; import { UiModalConfig } from './defs/modal-config'; import { UiModalRef } from './defs/modal-ref'; import { UiErrorModalComponent } from './error-modal'; @@ -15,11 +15,13 @@ export class UiModalService { title, data, config, + providers, }: { content: TemplateRef | Type; title?: string; data?: T; config?: UiModalConfig; + providers?: StaticProvider[]; }): UiModalRef { const configs = new UiModalConfig({ positionStrategy: new GlobalPositionStrategy().centerHorizontally().centerVertically(), @@ -38,7 +40,7 @@ export class UiModalService { const modalRef = new UiModalRef(overlay, content, title, configs, data); - const injector = this.createInjector(modalRef); + const injector = this.createInjector(modalRef, providers); overlay.attach(new ComponentPortal(UiModalComponent, null, injector)); if (configs.backdropClose) { @@ -48,9 +50,9 @@ export class UiModalService { return modalRef; } - createInjector(ref: UiModalRef): Injector { + createInjector(ref: UiModalRef, additionalProviders: StaticProvider[] = []): Injector { return Injector.create({ - providers: [{ provide: UiModalRef, useValue: ref }], + providers: [{ provide: UiModalRef, useValue: ref }, ...additionalProviders], parent: this.injector, }); } diff --git a/apps/ui/quantity-dropdown/src/lib/quantity-dropdown.component.scss b/apps/ui/quantity-dropdown/src/lib/quantity-dropdown.component.scss index d2468c9c1..f4c4d234c 100644 --- a/apps/ui/quantity-dropdown/src/lib/quantity-dropdown.component.scss +++ b/apps/ui/quantity-dropdown/src/lib/quantity-dropdown.component.scss @@ -1,5 +1,5 @@ :host { - @apply flex flex-row box-border items-center text-base; + @apply inline-flex flex-row box-border items-center text-base; } .backdrop { diff --git a/apps/ui/quantity-dropdown/src/lib/quantity-dropdown.component.ts b/apps/ui/quantity-dropdown/src/lib/quantity-dropdown.component.ts index 5ff47402b..3a43be537 100644 --- a/apps/ui/quantity-dropdown/src/lib/quantity-dropdown.component.ts +++ b/apps/ui/quantity-dropdown/src/lib/quantity-dropdown.component.ts @@ -16,7 +16,7 @@ import { NG_VALUE_ACCESSOR } from '@angular/forms'; templateUrl: 'quantity-dropdown.component.html', styleUrls: ['quantity-dropdown.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, - providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => QuantityDropdownComponent), multi: true }], + providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: QuantityDropdownComponent, multi: true }], }) export class QuantityDropdownComponent implements ControlValueAccessor { @ViewChild('quantity', { read: ElementRef, static: false }) diff --git a/package-lock.json b/package-lock.json index dc568b9b3..271826eb0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -105,11 +105,11 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1500.4", + "version": "0.1500.5", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "15.0.4", + "@angular-devkit/core": "15.0.5", "rxjs": "6.6.7" }, "engines": { @@ -119,14 +119,14 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "15.0.4", + "version": "15.0.5", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.2.0", - "@angular-devkit/architect": "0.1500.4", - "@angular-devkit/build-webpack": "0.1500.4", - "@angular-devkit/core": "15.0.4", + "@angular-devkit/architect": "0.1500.5", + "@angular-devkit/build-webpack": "0.1500.5", + "@angular-devkit/core": "15.0.5", "@babel/core": "7.20.2", "@babel/generator": "7.20.4", "@babel/helper-annotate-as-pure": "7.18.6", @@ -137,7 +137,7 @@ "@babel/runtime": "7.20.1", "@babel/template": "7.18.10", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "15.0.4", + "@ngtools/webpack": "15.0.5", "ansi-colors": "4.1.3", "autoprefixer": "10.4.13", "babel-loader": "9.1.0", @@ -226,117 +226,6 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { - "version": "7.20.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.2", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.1", - "@babel/parser": "^7.20.2", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/generator": { - "version": "7.20.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.2", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/esbuild": { - "version": "0.15.13", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.13", - "@esbuild/linux-loong64": "0.15.13", - "esbuild-android-64": "0.15.13", - "esbuild-android-arm64": "0.15.13", - "esbuild-darwin-64": "0.15.13", - "esbuild-darwin-arm64": "0.15.13", - "esbuild-freebsd-64": "0.15.13", - "esbuild-freebsd-arm64": "0.15.13", - "esbuild-linux-32": "0.15.13", - "esbuild-linux-64": "0.15.13", - "esbuild-linux-arm": "0.15.13", - "esbuild-linux-arm64": "0.15.13", - "esbuild-linux-mips64le": "0.15.13", - "esbuild-linux-ppc64le": "0.15.13", - "esbuild-linux-riscv64": "0.15.13", - "esbuild-linux-s390x": "0.15.13", - "esbuild-netbsd-64": "0.15.13", - "esbuild-openbsd-64": "0.15.13", - "esbuild-sunos-64": "0.15.13", - "esbuild-windows-32": "0.15.13", - "esbuild-windows-64": "0.15.13", - "esbuild-windows-arm64": "0.15.13" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/postcss": { "version": "8.4.19", "dev": true, @@ -397,26 +286,12 @@ "node": ">=12.0.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/semver": { - "version": "7.3.8", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1500.4", + "version": "0.1500.5", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1500.4", + "@angular-devkit/architect": "0.1500.5", "rxjs": "6.6.7" }, "engines": { @@ -430,7 +305,7 @@ } }, "node_modules/@angular-devkit/core": { - "version": "15.0.4", + "version": "15.0.5", "dev": true, "license": "MIT", "dependencies": { @@ -455,11 +330,11 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "15.0.4", + "version": "15.0.5", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "15.0.4", + "@angular-devkit/core": "15.0.5", "jsonc-parser": "3.2.0", "magic-string": "0.26.7", "ora": "5.4.1", @@ -485,7 +360,7 @@ } }, "node_modules/@angular/cdk": { - "version": "15.0.3", + "version": "15.0.4", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -500,14 +375,14 @@ } }, "node_modules/@angular/cli": { - "version": "15.0.4", + "version": "15.0.5", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1500.4", - "@angular-devkit/core": "15.0.4", - "@angular-devkit/schematics": "15.0.4", - "@schematics/angular": "15.0.4", + "@angular-devkit/architect": "0.1500.5", + "@angular-devkit/core": "15.0.5", + "@angular-devkit/schematics": "15.0.5", + "@schematics/angular": "15.0.5", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "3.0.1", @@ -532,31 +407,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@angular/cli/node_modules/semver": { - "version": "7.3.8", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@angular/common": { "version": "15.0.4", "license": "MIT", @@ -617,16 +467,6 @@ "typescript": ">=4.8.2 <4.9" } }, - "node_modules/@angular/compiler-cli/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@angular/compiler-cli/node_modules/magic-string": { "version": "0.27.0", "license": "MIT", @@ -637,19 +477,6 @@ "node": ">=12" } }, - "node_modules/@angular/compiler-cli/node_modules/semver": { - "version": "7.3.8", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@angular/core": { "version": "15.0.4", "license": "MIT", @@ -709,6 +536,41 @@ "@angular/compiler-cli": "15.0.4" } }, + "node_modules/@angular/localize/node_modules/@babel/core": { + "version": "7.19.3", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.3", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.3", + "@babel/types": "^7.19.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/localize/node_modules/semver": { + "version": "6.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@angular/platform-browser": { "version": "15.0.4", "license": "MIT", @@ -794,26 +656,26 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.20.5", + "version": "7.20.10", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.19.3", + "version": "7.20.2", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -828,11 +690,18 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/generator": { - "version": "7.20.5", + "version": "7.20.4", "license": "MIT", "dependencies": { - "@babel/types": "^7.20.5", + "@babel/types": "^7.20.2", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -876,12 +745,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.0", + "version": "7.20.7", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.20.0", + "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "engines": { @@ -891,17 +761,25 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.20.5", + "version": "7.20.12", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/helper-split-export-declaration": "^7.18.6" }, "engines": { @@ -942,6 +820,14 @@ "@babel/core": "^7.4.0-0" } }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-environment-visitor": { "version": "7.18.9", "license": "MIT", @@ -982,11 +868,11 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.9", + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -1003,7 +889,7 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.2", + "version": "7.20.11", "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", @@ -1011,9 +897,21 @@ "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -1056,15 +954,29 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.19.1", + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/template": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -1137,12 +1049,24 @@ } }, "node_modules/@babel/helpers": { - "version": "7.20.6", + "version": "7.20.7", "license": "MIT", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/template": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -1161,7 +1085,7 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.5", + "version": "7.20.7", "license": "MIT", "bin": { "parser": "bin/babel-parser.js" @@ -1185,13 +1109,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -1233,12 +1157,12 @@ } }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1294,11 +1218,11 @@ } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1339,15 +1263,15 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.2", + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.1" + "@babel/plugin-transform-parameters": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -1372,12 +1296,12 @@ } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1612,11 +1536,11 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1656,7 +1580,7 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.20.5", + "version": "7.20.11", "dev": true, "license": "MIT", "dependencies": { @@ -1670,17 +1594,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.20.2", + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, @@ -1692,11 +1616,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.18.9", + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -1705,8 +1630,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.20.2", + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { @@ -1822,12 +1760,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.19.6", + "version": "7.20.11", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1837,13 +1775,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", + "version": "7.20.11", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1853,13 +1791,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", + "version": "7.20.11", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-identifier": "^7.19.1" }, "engines": { @@ -1929,7 +1867,7 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.5", + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { @@ -2004,6 +1942,14 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.18.6", "dev": true, @@ -2019,12 +1965,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.19.0", + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" }, "engines": { "node": ">=6.9.0" @@ -2192,6 +2138,14 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/preset-modules": { "version": "0.1.5", "dev": true, @@ -2219,7 +2173,7 @@ } }, "node_modules/@babel/runtime-corejs2": { - "version": "7.20.6", + "version": "7.20.7", "license": "MIT", "dependencies": { "core-js": "^2.6.12", @@ -2242,17 +2196,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.20.5", + "version": "7.20.12", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", + "@babel/generator": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.5", - "@babel/types": "^7.20.5", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2260,8 +2214,32 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/types": { - "version": "7.20.5", + "version": "7.20.7", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.19.4", @@ -2280,6 +2258,32 @@ "node": ">=0.1.90" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "dev": true, @@ -2289,7 +2293,7 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.16.10", + "version": "0.16.16", "cpu": [ "x64" ], @@ -2432,8 +2436,7 @@ }, "node_modules/@ngrx/component-store": { "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@ngrx/component-store/-/component-store-15.1.0.tgz", - "integrity": "sha512-aqNxZHWdHAgnxz5cdBLKmWq83PVKw9F4ZMVddsZ7d8Ow2j3BWZiYP65hPVgVpzTHuigpE4OX0cutwGC38iu1GA==", + "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -2444,8 +2447,7 @@ }, "node_modules/@ngrx/effects": { "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-15.1.0.tgz", - "integrity": "sha512-/8YnhzyAOTdI9RYJAqmIIvh8ip4M4x4DrRyrdDDc62oFM3TrVOvknUUpMp5NxKpKph8hSpevAwaeEBDWGnKkjg==", + "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -2457,8 +2459,7 @@ }, "node_modules/@ngrx/entity": { "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@ngrx/entity/-/entity-15.1.0.tgz", - "integrity": "sha512-CvE51HR+m5Nhbh4Sr3rDcm93kGZBkbrsVsRf1HR0V7e03Y87IycAEM2loveT7pELLO3+LlZAwWUxVl1HIO/7hg==", + "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -2470,8 +2471,7 @@ }, "node_modules/@ngrx/store": { "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-15.1.0.tgz", - "integrity": "sha512-Wxjme7yJnxD6il6fGZdFTdSs9gL+6OFW8/II9vApFokUb0E7UQBm8RYb9dYJ2IQJvWXwO+2ItSaecRUZgt39kA==", + "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -2482,8 +2482,7 @@ }, "node_modules/@ngrx/store-devtools": { "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-15.1.0.tgz", - "integrity": "sha512-InEFdjg2cE0nLgdWWcjXa50SFlzxSVOoeudRqkqQlJlpJ/0RPljlRXHXT63E5cUpryTxYdK2QcE4n5vngq/48g==", + "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -2493,7 +2492,7 @@ } }, "node_modules/@ngtools/webpack": { - "version": "15.0.4", + "version": "15.0.5", "dev": true, "license": "MIT", "engines": { @@ -2550,31 +2549,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/fs/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.3.8", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@npmcli/git": { "version": "4.0.3", "dev": true, @@ -2594,6 +2568,25 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.14.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@npmcli/git/node_modules/proc-log": { "version": "3.0.0", "dev": true, @@ -2602,31 +2595,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/git/node_modules/semver": { - "version": "7.3.8", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/git/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@npmcli/git/node_modules/which": { "version": "3.0.0", "dev": true, @@ -2668,6 +2636,17 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@npmcli/node-gyp": { "version": "3.0.0", "dev": true, @@ -2797,18 +2776,13 @@ } } }, - "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/@schematics/angular": { - "version": "15.0.4", + "version": "15.0.5", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "15.0.4", - "@angular-devkit/schematics": "15.0.4", + "@angular-devkit/core": "15.0.5", + "@angular-devkit/schematics": "15.0.5", "jsonc-parser": "3.2.0" }, "engines": { @@ -2848,13 +2822,13 @@ } }, "node_modules/@testing-library/dom": { - "version": "8.19.0", + "version": "8.19.1", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", + "@types/aria-query": "^5.0.1", "aria-query": "^5.0.0", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", @@ -2937,8 +2911,40 @@ "node": ">= 10" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/@types/aria-query": { - "version": "4.2.2", + "version": "5.0.1", "dev": true, "license": "MIT" }, @@ -3006,7 +3012,7 @@ } }, "node_modules/@types/estree": { - "version": "0.0.51", + "version": "1.0.0", "dev": true, "license": "MIT" }, @@ -3022,7 +3028,7 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.31", + "version": "4.17.32", "dev": true, "license": "MIT", "dependencies": { @@ -3095,7 +3101,7 @@ } }, "node_modules/@types/node": { - "version": "18.11.17", + "version": "18.11.18", "license": "MIT" }, "node_modules/@types/normalize-package-data": { @@ -3179,7 +3185,7 @@ "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.5.3", + "version": "8.5.4", "dev": true, "license": "MIT", "dependencies": { @@ -3364,7 +3370,7 @@ } }, "node_modules/acorn": { - "version": "8.8.1", + "version": "7.4.1", "dev": true, "license": "MIT", "bin": { @@ -3374,14 +3380,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-node": { "version": "1.8.2", "dev": true, @@ -3392,17 +3390,6 @@ "xtend": "^4.0.2" } }, - "node_modules/acorn-node/node_modules/acorn": { - "version": "7.4.1", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/acorn-walk": { "version": "7.2.0", "dev": true, @@ -3648,6 +3635,11 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/argparse/node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/aria-query": { "version": "5.1.3", "dev": true, @@ -3779,7 +3771,7 @@ } }, "node_modules/aws4": { - "version": "1.11.0", + "version": "1.12.0", "dev": true, "license": "MIT" }, @@ -3835,6 +3827,14 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.6.0", "dev": true, @@ -3972,14 +3972,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "dev": true, @@ -4143,33 +4135,8 @@ "semver": "^7.0.0" } }, - "node_modules/builtins/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/builtins/node_modules/semver": { - "version": "7.3.8", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/bytes": { - "version": "3.0.0", + "version": "3.1.2", "dev": true, "license": "MIT", "engines": { @@ -4199,6 +4166,14 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.14.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/call-bind": { "version": "1.0.2", "dev": true, @@ -4257,7 +4232,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001439", + "version": "1.0.30001442", "funding": [ { "type": "opencollective", @@ -4500,6 +4475,11 @@ "commander": "^2.11.0" } }, + "node_modules/codelyzer/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, "node_modules/codelyzer/node_modules/source-map": { "version": "0.5.7", "dev": true, @@ -4508,11 +4488,6 @@ "node": ">=0.10.0" } }, - "node_modules/codelyzer/node_modules/sprintf-js": { - "version": "1.1.2", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/codelyzer/node_modules/tslib": { "version": "1.14.1", "dev": true, @@ -4567,9 +4542,12 @@ } }, "node_modules/commander": { - "version": "2.20.3", + "version": "9.5.0", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } }, "node_modules/commondir": { "version": "1.0.1", @@ -4609,6 +4587,14 @@ "node": ">= 0.8.0" } }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "dev": true, @@ -4676,47 +4662,11 @@ "ms": "2.0.0" } }, - "node_modules/connect/node_modules/finalhandler": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/connect/node_modules/ms": { "version": "2.0.0", "dev": true, "license": "MIT" }, - "node_modules/connect/node_modules/on-finished": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/statuses": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/console-control-strings": { "version": "1.1.0", "dev": true, @@ -4809,7 +4759,7 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.26.1", + "version": "3.27.1", "dev": true, "license": "MIT", "dependencies": { @@ -4821,7 +4771,7 @@ } }, "node_modules/core-util-is": { - "version": "1.0.3", + "version": "1.0.2", "dev": true, "license": "MIT" }, @@ -4851,6 +4801,14 @@ "node": ">=10" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/critters": { "version": "0.0.16", "dev": true, @@ -4934,16 +4892,26 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", + "version": "6.0.5", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, "engines": { - "node": ">= 8" + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, "node_modules/css-loader": { @@ -4971,31 +4939,6 @@ "webpack": "^5.0.0" } }, - "node_modules/css-loader/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.3.8", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/css-select": { "version": "4.3.0", "dev": true, @@ -5135,7 +5078,7 @@ } }, "node_modules/deep-equal": { - "version": "2.1.0", + "version": "2.2.0", "dev": true, "license": "MIT", "dependencies": { @@ -5143,8 +5086,10 @@ "es-get-iterator": "^1.1.2", "get-intrinsic": "^1.1.3", "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", "is-date-object": "^1.0.5", "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", "isarray": "^2.0.5", "object-is": "^1.1.5", "object-keys": "^1.1.1", @@ -5153,17 +5098,12 @@ "side-channel": "^1.0.4", "which-boxed-primitive": "^1.0.2", "which-collection": "^1.0.1", - "which-typed-array": "^1.1.8" + "which-typed-array": "^1.1.9" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, "node_modules/deep-freeze-strict": { "version": "1.1.1", "dev": true, @@ -5188,6 +5128,104 @@ "node": ">= 10" } }, + "node_modules/default-gateway/node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/default-gateway/node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-gateway/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/defaults": { "version": "1.0.4", "dev": true, @@ -5449,7 +5487,7 @@ } }, "node_modules/dom-accessibility-api": { - "version": "0.5.14", + "version": "0.5.15", "dev": true, "license": "MIT" }, @@ -5477,14 +5515,6 @@ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/domelementtype": { "version": "2.3.0", "dev": true, @@ -5612,7 +5642,7 @@ } }, "node_modules/engine.io-parser": { - "version": "5.0.4", + "version": "5.0.5", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -5655,12 +5685,9 @@ "license": "MIT" }, "node_modules/entities": { - "version": "4.4.0", + "version": "2.2.0", + "dev": true, "license": "BSD-2-Clause", - "optional": true, - "engines": { - "node": ">=0.12" - }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -5699,26 +5726,31 @@ } }, "node_modules/es-abstract": { - "version": "1.20.5", + "version": "1.21.0", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.0", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.0", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", @@ -5727,7 +5759,9 @@ "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" @@ -5754,16 +5788,24 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, "node_modules/es-module-lexer": { "version": "0.9.3", "dev": true, "license": "MIT" }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "dev": true, @@ -5798,6 +5840,43 @@ "es6-promise": "^4.0.3" } }, + "node_modules/esbuild": { + "version": "0.15.13", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.13", + "@esbuild/linux-loong64": "0.15.13", + "esbuild-android-64": "0.15.13", + "esbuild-android-arm64": "0.15.13", + "esbuild-darwin-64": "0.15.13", + "esbuild-darwin-arm64": "0.15.13", + "esbuild-freebsd-64": "0.15.13", + "esbuild-freebsd-arm64": "0.15.13", + "esbuild-linux-32": "0.15.13", + "esbuild-linux-64": "0.15.13", + "esbuild-linux-arm": "0.15.13", + "esbuild-linux-arm64": "0.15.13", + "esbuild-linux-mips64le": "0.15.13", + "esbuild-linux-ppc64le": "0.15.13", + "esbuild-linux-riscv64": "0.15.13", + "esbuild-linux-s390x": "0.15.13", + "esbuild-netbsd-64": "0.15.13", + "esbuild-openbsd-64": "0.15.13", + "esbuild-sunos-64": "0.15.13", + "esbuild-windows-32": "0.15.13", + "esbuild-windows-64": "0.15.13", + "esbuild-windows-arm64": "0.15.13" + } + }, "node_modules/esbuild-wasm": { "version": "0.15.13", "dev": true, @@ -5929,6 +6008,7 @@ }, "node_modules/eventemitter3": { "version": "4.0.7", + "dev": true, "license": "MIT" }, "node_modules/events": { @@ -5947,25 +6027,76 @@ } }, "node_modules/execa": { - "version": "5.1.1", + "version": "2.1.0", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", + "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=10" + "node": "^8.12.0 || >=9.7.0" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "engines": { + "node": ">= 8" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/execa/node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/execall": { @@ -6048,11 +6179,36 @@ "ms": "2.0.0" } }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "dev": true, "license": "MIT" }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/extend": { "version": "3.0.2", "dev": true, @@ -6118,7 +6274,7 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.14.0", + "version": "1.15.0", "dev": true, "license": "ISC", "dependencies": { @@ -6180,16 +6336,16 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", + "version": "1.1.2", "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.3.0", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~1.5.0", "unpipe": "~1.0.0" }, "engines": { @@ -6209,6 +6365,17 @@ "dev": true, "license": "MIT" }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-cache-dir": { "version": "3.3.2", "dev": true, @@ -6362,14 +6529,6 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/fs-minipass": { "version": "2.1.0", "dev": true, @@ -6390,17 +6549,6 @@ "version": "1.0.0", "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.2", - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.1", "dev": true, @@ -6496,11 +6644,14 @@ } }, "node_modules/get-stream": { - "version": "6.0.1", + "version": "5.2.0", "dev": true, "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6579,7 +6730,7 @@ } }, "node_modules/global-agent/node_modules/core-js": { - "version": "3.26.1", + "version": "3.27.1", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -6588,31 +6739,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/global-agent/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/global-agent/node_modules/semver": { - "version": "7.3.8", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/global-modules": { "version": "2.0.0", "dev": true, @@ -6642,17 +6768,6 @@ "dev": true, "license": "ISC" }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/global-tunnel-ng": { "version": "2.7.1", "dev": true, @@ -6858,6 +6973,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "dev": true, @@ -6914,6 +7040,14 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.14.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/howler": { "version": "2.2.3", "license": "MIT" @@ -6929,6 +7063,11 @@ "wbuf": "^1.1.0" } }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.7", "dev": true, @@ -7071,6 +7210,14 @@ "node": ">= 0.8" } }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/http-parser-js": { "version": "0.5.8", "dev": true, @@ -7125,6 +7272,17 @@ } } }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/http-signature": { "version": "1.2.0", "dev": true, @@ -7414,7 +7572,7 @@ "license": "MIT" }, "node_modules/immutable": { - "version": "4.1.0", + "version": "4.2.2", "dev": true, "license": "MIT" }, @@ -7658,6 +7816,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-array-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "dev": true, @@ -7916,14 +8087,11 @@ } }, "node_modules/is-plain-obj": { - "version": "3.0.0", + "version": "1.1.0", "dev": true, "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/is-plain-object": { @@ -8100,7 +8268,7 @@ } }, "node_modules/isarray": { - "version": "1.0.0", + "version": "2.0.5", "dev": true, "license": "MIT" }, @@ -8156,6 +8324,14 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/istanbul-lib-report": { "version": "3.0.0", "dev": true, @@ -8433,7 +8609,7 @@ "license": "ISC" }, "node_modules/json5": { - "version": "2.2.2", + "version": "2.2.3", "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -8495,6 +8671,11 @@ "setimmediate": "^1.0.5" } }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, "node_modules/jszip/node_modules/readable-stream": { "version": "2.3.7", "dev": true, @@ -8567,17 +8748,6 @@ "which": "^1.2.1" } }, - "node_modules/karma-chrome-launcher/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/karma-coverage": { "version": "2.2.0", "dev": true, @@ -8683,6 +8853,14 @@ "node": "*" } }, + "node_modules/karma-coverage-istanbul-reporter/node_modules/pify": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/karma-coverage-istanbul-reporter/node_modules/rimraf": { "version": "2.7.1", "dev": true, @@ -8815,17 +8993,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/karma/node_modules/mime": { - "version": "2.6.0", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/karma/node_modules/minimatch": { "version": "3.1.2", "dev": true, @@ -8837,17 +9004,6 @@ "node": "*" } }, - "node_modules/karma/node_modules/mkdirp": { - "version": "0.5.6", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/karma/node_modules/source-map": { "version": "0.6.1", "dev": true, @@ -8903,14 +9059,6 @@ "node": ">=10" } }, - "node_modules/karma/node_modules/yargs-parser": { - "version": "20.2.9", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/kind-of": { "version": "6.0.3", "dev": true, @@ -8989,6 +9137,27 @@ "node": ">=6" } }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/less/node_modules/pify": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/less/node_modules/semver": { "version": "5.7.1", "dev": true, @@ -9070,14 +9239,6 @@ "node": ">=4" } }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/loader-runner": { "version": "4.3.0", "dev": true, @@ -9223,11 +9384,10 @@ } }, "node_modules/lru-cache": { - "version": "7.14.1", - "dev": true, + "version": "5.1.1", "license": "ISC", - "engines": { - "node": ">=12" + "dependencies": { + "yallist": "^3.0.2" } }, "node_modules/lz-string": { @@ -9263,6 +9423,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/make-error": { "version": "1.3.6", "dev": true, @@ -9334,26 +9502,20 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/make-fetch-happen/node_modules/semver": { - "version": "7.3.8", + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.14.1", "dev": true, "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/make-fetch-happen/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", + "node_modules/make-fetch-happen/node_modules/mkdirp": { + "version": "1.0.4", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { "node": ">=10" @@ -9485,7 +9647,7 @@ } }, "node_modules/memfs": { - "version": "3.4.12", + "version": "3.4.13", "dev": true, "license": "Unlicense", "dependencies": { @@ -9563,20 +9725,6 @@ "node": ">=10" } }, - "node_modules/meow/node_modules/semver": { - "version": "7.3.8", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/meow/node_modules/type-fest": { "version": "0.18.1", "dev": true, @@ -9588,13 +9736,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "20.2.9", + "node_modules/meow/node_modules/yallist": { + "version": "4.0.0", "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } + "license": "ISC" }, "node_modules/merge-descriptors": { "version": "1.0.1", @@ -9654,14 +9799,14 @@ } }, "node_modules/mime": { - "version": "1.6.0", + "version": "2.6.0", "dev": true, "license": "MIT", "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4" + "node": ">=4.0.0" } }, "node_modules/mime-db": { @@ -9721,7 +9866,7 @@ "license": "ISC" }, "node_modules/minimatch": { - "version": "5.1.1", + "version": "5.1.2", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -9759,14 +9904,6 @@ "node": ">=0.10.0" } }, - "node_modules/minimist-options/node_modules/is-plain-obj": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/minipass": { "version": "3.3.6", "dev": true, @@ -9847,6 +9984,11 @@ "node": ">=8" } }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, "node_modules/minizlib": { "version": "2.1.2", "dev": true, @@ -9859,15 +10001,20 @@ "node": ">= 8" } }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, "node_modules/mkdirp": { - "version": "1.0.4", + "version": "0.5.6", "dev": true, "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, "bin": { "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/moment": { @@ -10014,7 +10161,7 @@ "license": "MIT" }, "node_modules/ng-mocks": { - "version": "14.5.0", + "version": "14.5.2", "dev": true, "license": "MIT", "funding": { @@ -10077,21 +10224,13 @@ } } }, - "node_modules/ng-packagr/node_modules/commander": { - "version": "9.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, "node_modules/ng-packagr/node_modules/convert-source-map": { "version": "2.0.0", "dev": true, "license": "MIT" }, "node_modules/ng-packagr/node_modules/esbuild": { - "version": "0.16.10", + "version": "0.16.16", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -10103,32 +10242,32 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.16.10", - "@esbuild/android-arm64": "0.16.10", - "@esbuild/android-x64": "0.16.10", - "@esbuild/darwin-arm64": "0.16.10", - "@esbuild/darwin-x64": "0.16.10", - "@esbuild/freebsd-arm64": "0.16.10", - "@esbuild/freebsd-x64": "0.16.10", - "@esbuild/linux-arm": "0.16.10", - "@esbuild/linux-arm64": "0.16.10", - "@esbuild/linux-ia32": "0.16.10", - "@esbuild/linux-loong64": "0.16.10", - "@esbuild/linux-mips64el": "0.16.10", - "@esbuild/linux-ppc64": "0.16.10", - "@esbuild/linux-riscv64": "0.16.10", - "@esbuild/linux-s390x": "0.16.10", - "@esbuild/linux-x64": "0.16.10", - "@esbuild/netbsd-x64": "0.16.10", - "@esbuild/openbsd-x64": "0.16.10", - "@esbuild/sunos-x64": "0.16.10", - "@esbuild/win32-arm64": "0.16.10", - "@esbuild/win32-ia32": "0.16.10", - "@esbuild/win32-x64": "0.16.10" + "@esbuild/android-arm": "0.16.16", + "@esbuild/android-arm64": "0.16.16", + "@esbuild/android-x64": "0.16.16", + "@esbuild/darwin-arm64": "0.16.16", + "@esbuild/darwin-x64": "0.16.16", + "@esbuild/freebsd-arm64": "0.16.16", + "@esbuild/freebsd-x64": "0.16.16", + "@esbuild/linux-arm": "0.16.16", + "@esbuild/linux-arm64": "0.16.16", + "@esbuild/linux-ia32": "0.16.16", + "@esbuild/linux-loong64": "0.16.16", + "@esbuild/linux-mips64el": "0.16.16", + "@esbuild/linux-ppc64": "0.16.16", + "@esbuild/linux-riscv64": "0.16.16", + "@esbuild/linux-s390x": "0.16.16", + "@esbuild/linux-x64": "0.16.16", + "@esbuild/netbsd-x64": "0.16.16", + "@esbuild/openbsd-x64": "0.16.16", + "@esbuild/sunos-x64": "0.16.16", + "@esbuild/win32-arm64": "0.16.16", + "@esbuild/win32-ia32": "0.16.16", + "@esbuild/win32-x64": "0.16.16" } }, "node_modules/ng-packagr/node_modules/esbuild-wasm": { - "version": "0.16.10", + "version": "0.16.16", "dev": true, "license": "MIT", "bin": { @@ -10270,17 +10409,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/node-gyp/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-gyp/node_modules/minimatch": { "version": "3.1.2", "dev": true, @@ -10292,18 +10420,18 @@ "node": "*" } }, - "node_modules/node-gyp/node_modules/semver": { - "version": "7.3.8", + "node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", "dev": true, "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" + "isexe": "^2.0.0" }, "bin": { - "semver": "bin/semver.js" + "node-which": "bin/node-which" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, "node_modules/node-releases": { @@ -10349,29 +10477,12 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.3.8", + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "7.14.1", "dev": true, "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/normalize-path": { @@ -10417,14 +10528,6 @@ "node": ">=4" } }, - "node_modules/npm-conf/node_modules/pify": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/npm-install-checks": { "version": "6.0.0", "dev": true, @@ -10436,31 +10539,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-install-checks/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-install-checks/node_modules/semver": { - "version": "7.3.8", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/npm-normalize-package-bin": { "version": "3.0.0", "dev": true, @@ -10483,31 +10561,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm-package-arg/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.3.8", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/npm-packlist": { "version": "7.0.4", "dev": true, @@ -10544,6 +10597,14 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/npm-pick-manifest/node_modules/lru-cache": { + "version": "7.14.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/npm-pick-manifest/node_modules/npm-package-arg": { "version": "10.1.0", "dev": true, @@ -10566,31 +10627,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-pick-manifest/node_modules/semver": { - "version": "7.3.8", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-pick-manifest/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/npm-pick-manifest/node_modules/validate-npm-package-name": { "version": "5.0.0", "dev": true, @@ -10630,6 +10666,14 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "7.14.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { "version": "11.0.2", "dev": true, @@ -10705,31 +10749,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-registry-fetch/node_modules/semver": { - "version": "7.3.8", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-registry-fetch/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/npm-registry-fetch/node_modules/validate-npm-package-name": { "version": "5.0.0", "dev": true, @@ -10741,6 +10760,11 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/npm-registry-fetch/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, "node_modules/npm-run-all": { "version": "4.1.5", "dev": true, @@ -10774,21 +10798,6 @@ "concat-map": "0.0.1" } }, - "node_modules/npm-run-all/node_modules/cross-spawn": { - "version": "6.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, "node_modules/npm-run-all/node_modules/minimatch": { "version": "3.1.2", "dev": true, @@ -10800,54 +10809,8 @@ "node": "*" } }, - "node_modules/npm-run-all/node_modules/path-key": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/npm-run-all/node_modules/shebang-command": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-all/node_modules/shebang-regex": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-all/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/npm-run-path": { - "version": "4.0.1", + "version": "3.1.0", "dev": true, "license": "MIT", "dependencies": { @@ -10857,6 +10820,14 @@ "node": ">=8" } }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/npmlog": { "version": "6.0.2", "dev": true, @@ -11192,6 +11163,14 @@ "node": ">=8" } }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/p-try": { "version": "2.2.0", "dev": true, @@ -11241,6 +11220,14 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/pacote/node_modules/lru-cache": { + "version": "7.14.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/pacote/node_modules/npm-package-arg": { "version": "10.1.0", "dev": true, @@ -11263,31 +11250,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/pacote/node_modules/semver": { - "version": "7.3.8", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pacote/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/pacote/node_modules/validate-npm-package-name": { "version": "5.0.0", "dev": true, @@ -11408,6 +11370,17 @@ "dev": true, "license": "MIT" }, + "node_modules/parse5/node_modules/entities": { + "version": "4.4.0", + "license": "BSD-2-Clause", + "optional": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "dev": true, @@ -11438,11 +11411,11 @@ "license": "(WTFPL OR MIT)" }, "node_modules/path-key": { - "version": "3.1.1", + "version": "2.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/path-parse": { @@ -11510,11 +11483,11 @@ } }, "node_modules/pify": { - "version": "4.0.1", + "version": "3.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/pinkie": { @@ -11569,7 +11542,7 @@ } }, "node_modules/postcss": { - "version": "8.4.20", + "version": "8.4.21", "dev": true, "funding": [ { @@ -11677,34 +11650,6 @@ "node": ">=0.10.0" } }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, "node_modules/postcss-loader": { "version": "4.3.0", "dev": true, @@ -11769,17 +11714,6 @@ "node": ">=8.9.0" } }, - "node_modules/postcss-loader/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/postcss-loader/node_modules/schema-utils": { "version": "3.1.1", "dev": true, @@ -11797,20 +11731,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.3.8", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/postcss-media-query-parser": { "version": "0.2.3", "dev": true, @@ -12128,50 +12048,6 @@ "prettier": ">=1.8.0" } }, - "node_modules/pretty-quick/node_modules/execa": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^3.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": "^8.12.0 || >=9.7.0" - } - }, - "node_modules/pretty-quick/node_modules/get-stream": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-quick/node_modules/npm-run-path": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/proc-log": { "version": "2.0.1", "dev": true, @@ -12202,14 +12078,6 @@ "node": ">=10" } }, - "node_modules/promise-retry/node_modules/retry": { - "version": "0.12.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/proto-list": { "version": "1.2.4", "dev": true, @@ -12348,11 +12216,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/protractor/node_modules/ini": { - "version": "1.3.8", - "dev": true, - "license": "ISC" - }, "node_modules/protractor/node_modules/minimatch": { "version": "3.1.2", "dev": true, @@ -12364,25 +12227,6 @@ "node": "*" } }, - "node_modules/protractor/node_modules/rimraf": { - "version": "2.7.1", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/protractor/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/protractor/node_modules/source-map": { "version": "0.5.7", "dev": true, @@ -12418,30 +12262,6 @@ "node": ">=0.8.0" } }, - "node_modules/protractor/node_modules/webdriver-manager": { - "version": "12.1.8", - "dev": true, - "license": "MIT", - "dependencies": { - "adm-zip": "^0.4.9", - "chalk": "^1.1.1", - "del": "^2.2.0", - "glob": "^7.0.3", - "ini": "^1.3.4", - "minimist": "^1.2.0", - "q": "^1.4.1", - "request": "^2.87.0", - "rimraf": "^2.5.2", - "semver": "^5.3.0", - "xml2js": "^0.4.17" - }, - "bin": { - "webdriver-manager": "bin/webdriver-manager" - }, - "engines": { - "node": ">=6.9.x" - } - }, "node_modules/protractor/node_modules/wrap-ansi": { "version": "6.2.0", "dev": true, @@ -12664,14 +12484,6 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/react-is": { "version": "17.0.2", "dev": true, @@ -12845,14 +12657,6 @@ "node": ">=4" } }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/read-pkg/node_modules/semver": { "version": "5.7.1", "dev": true, @@ -13180,14 +12984,6 @@ "node": ">=10" } }, - "node_modules/replace-in-file/node_modules/yargs-parser": { - "version": "20.2.9", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/request": { "version": "2.88.2", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", @@ -13345,7 +13141,7 @@ } }, "node_modules/retry": { - "version": "0.13.1", + "version": "0.12.0", "dev": true, "license": "MIT", "engines": { @@ -13435,13 +13231,8 @@ "node": ">=8.0" } }, - "node_modules/roarr/node_modules/sprintf-js": { - "version": "1.1.2", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/rollup": { - "version": "3.7.5", + "version": "3.9.1", "dev": true, "license": "MIT", "bin": { @@ -13636,23 +13427,27 @@ "license": "ISC" }, "node_modules/scandit-sdk": { - "version": "5.12.1", + "version": "5.12.2", "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@babel/runtime-corejs2": "^7.18.9", - "@juggle/resize-observer": "^3.3.1", - "csstype": "^3.1.0", - "eventemitter3": "^4.0.7", + "@babel/runtime-corejs2": "^7.20.7", + "@juggle/resize-observer": "^3.4.0", + "csstype": "^3.1.1", + "eventemitter3": "^5.0.0", "howler": "^2.2.3", "js-cookie": "^3.0.1", "objectFitPolyfill": "^2.3.5", - "tslib": "^2.4.0", - "ua-parser-js": "^1.0.2" + "tslib": "^2.4.1", + "ua-parser-js": "^1.0.32" }, "engines": { "node": ">=10.18" } }, + "node_modules/scandit-sdk/node_modules/eventemitter3": { + "version": "5.0.0", + "license": "MIT" + }, "node_modules/schema-utils": { "version": "4.0.0", "dev": true, @@ -13763,10 +13558,16 @@ } }, "node_modules/semver": { - "version": "6.3.0", + "version": "7.3.8", "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/semver-compare": { @@ -13801,6 +13602,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, "node_modules/send": { "version": "0.18.0", "dev": true, @@ -13837,11 +13652,30 @@ "dev": true, "license": "MIT" }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "dev": true, "license": "MIT" }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/serialize-error": { "version": "7.0.1", "dev": true, @@ -13937,14 +13771,6 @@ "dev": true, "license": "ISC" }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/serve-static": { "version": "1.15.0", "dev": true, @@ -13990,22 +13816,22 @@ } }, "node_modules/shebang-command": { - "version": "2.0.0", + "version": "1.2.0", "dev": true, "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "shebang-regex": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/shebang-regex": { - "version": "3.0.0", + "version": "1.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/shell-quote": { @@ -14300,7 +14126,7 @@ } }, "node_modules/sprintf-js": { - "version": "1.0.3", + "version": "1.1.2", "dev": true, "license": "BSD-3-Clause" }, @@ -14350,16 +14176,21 @@ "node": ">=8" } }, + "node_modules/ssri/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, "node_modules/statuses": { - "version": "2.0.1", + "version": "1.5.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, "node_modules/streamroller": { - "version": "3.1.3", + "version": "3.1.4", "dev": true, "license": "MIT", "dependencies": { @@ -14841,11 +14672,44 @@ "postcss": "^8.0.9" } }, + "node_modules/tailwindcss/node_modules/acorn": { + "version": "8.8.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/tailwindcss/node_modules/acorn-walk": { + "version": "8.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/tailwindcss/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, + "node_modules/tailwindcss/node_modules/diff": { + "version": "4.0.2", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/tailwindcss/node_modules/glob-parent": { "version": "6.0.2", "dev": true, @@ -14857,6 +14721,34 @@ "node": ">=10.13.0" } }, + "node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "3.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, "node_modules/tailwindcss/node_modules/quick-lru": { "version": "5.1.1", "dev": true, @@ -14868,6 +14760,67 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tailwindcss/node_modules/ts-node": { + "version": "10.9.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tailwindcss/node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/tailwindcss/node_modules/yn": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/tapable": { "version": "2.2.1", "dev": true, @@ -14903,6 +14856,22 @@ "node": ">=8" } }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, "node_modules/terser": { "version": "5.15.1", "dev": true, @@ -14998,6 +14967,22 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/terser/node_modules/acorn": { + "version": "8.8.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, "node_modules/test-exclude": { "version": "6.0.0", "dev": true, @@ -15114,6 +15099,13 @@ "node": ">=6" } }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/tr46": { "version": "0.0.3", "license": "MIT" @@ -15172,17 +15164,6 @@ "node": ">=0.10.0" } }, - "node_modules/ts-node/node_modules/mkdirp": { - "version": "0.5.6", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/tslib": { "version": "2.4.1", "license": "0BSD" @@ -15234,6 +15215,11 @@ "node": ">=0.10.0" } }, + "node_modules/tslint/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, "node_modules/tslint/node_modules/diff": { "version": "4.0.2", "dev": true, @@ -15272,17 +15258,6 @@ "node": "*" } }, - "node_modules/tslint/node_modules/mkdirp": { - "version": "0.5.6", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/tslint/node_modules/semver": { "version": "5.7.1", "dev": true, @@ -15359,6 +15334,19 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-assert": { "version": "1.0.9", "dev": true, @@ -15542,7 +15530,8 @@ } }, "node_modules/universalify": { - "version": "0.2.0", + "version": "0.1.2", + "dev": true, "license": "MIT", "engines": { "node": ">= 4.0.0" @@ -15621,6 +15610,14 @@ "dev": true, "license": "MIT" }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "dev": true, @@ -15661,11 +15658,6 @@ "extsprintf": "^1.2.0" } }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, "node_modules/vfile": { "version": "4.2.1", "dev": true, @@ -15754,6 +15746,143 @@ "node": ">=6.9.x" } }, + "node_modules/webdriver-manager": { + "version": "12.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + }, + "bin": { + "webdriver-manager": "bin/webdriver-manager" + }, + "engines": { + "node": ">=6.9.x" + } + }, + "node_modules/webdriver-manager/node_modules/ansi-regex": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webdriver-manager/node_modules/ansi-styles": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webdriver-manager/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/webdriver-manager/node_modules/chalk": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webdriver-manager/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/webdriver-manager/node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/webdriver-manager/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/webdriver-manager/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webdriver-manager/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/webdriver-manager/node_modules/strip-ansi": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webdriver-manager/node_modules/supports-color": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "license": "BSD-2-Clause" @@ -15881,7 +16010,7 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.11.0", + "version": "8.12.0", "dev": true, "license": "MIT", "engines": { @@ -15889,7 +16018,7 @@ }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -15940,6 +16069,30 @@ } } }, + "node_modules/webpack/node_modules/@types/estree": { + "version": "0.0.51", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.8.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/acorn-import-assertions": { + "version": "1.8.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/webpack/node_modules/ajv": { "version": "6.12.6", "dev": true, @@ -16015,17 +16168,14 @@ } }, "node_modules/which": { - "version": "2.0.2", + "version": "1.3.1", "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" + "which": "bin/which" } }, "node_modules/which-boxed-primitive": { @@ -16230,7 +16380,7 @@ } }, "node_modules/yallist": { - "version": "4.0.0", + "version": "3.1.1", "license": "ISC" }, "node_modules/yaml": { @@ -16258,6 +16408,14 @@ } }, "node_modules/yargs-parser": { + "version": "20.2.9", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", "license": "ISC", "engines": { @@ -16309,21 +16467,21 @@ } }, "@angular-devkit/architect": { - "version": "0.1500.4", + "version": "0.1500.5", "dev": true, "requires": { - "@angular-devkit/core": "15.0.4", + "@angular-devkit/core": "15.0.5", "rxjs": "6.6.7" } }, "@angular-devkit/build-angular": { - "version": "15.0.4", + "version": "15.0.5", "dev": true, "requires": { "@ampproject/remapping": "2.2.0", - "@angular-devkit/architect": "0.1500.4", - "@angular-devkit/build-webpack": "0.1500.4", - "@angular-devkit/core": "15.0.4", + "@angular-devkit/architect": "0.1500.5", + "@angular-devkit/build-webpack": "0.1500.5", + "@angular-devkit/core": "15.0.5", "@babel/core": "7.20.2", "@babel/generator": "7.20.4", "@babel/helper-annotate-as-pure": "7.18.6", @@ -16334,7 +16492,7 @@ "@babel/runtime": "7.20.1", "@babel/template": "7.18.10", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "15.0.4", + "@ngtools/webpack": "15.0.5", "ansi-colors": "4.1.3", "autoprefixer": "10.4.13", "babel-loader": "9.1.0", @@ -16382,87 +16540,6 @@ "webpack-subresource-integrity": "5.1.0" }, "dependencies": { - "@babel/core": { - "version": "7.20.2", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.2", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.1", - "@babel/parser": "^7.20.2", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.20.4", - "dev": true, - "requires": { - "@babel/types": "^7.20.2", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "esbuild": { - "version": "0.15.13", - "dev": true, - "optional": true, - "requires": { - "@esbuild/android-arm": "0.15.13", - "@esbuild/linux-loong64": "0.15.13", - "esbuild-android-64": "0.15.13", - "esbuild-android-arm64": "0.15.13", - "esbuild-darwin-64": "0.15.13", - "esbuild-darwin-arm64": "0.15.13", - "esbuild-freebsd-64": "0.15.13", - "esbuild-freebsd-arm64": "0.15.13", - "esbuild-linux-32": "0.15.13", - "esbuild-linux-64": "0.15.13", - "esbuild-linux-arm": "0.15.13", - "esbuild-linux-arm64": "0.15.13", - "esbuild-linux-mips64le": "0.15.13", - "esbuild-linux-ppc64le": "0.15.13", - "esbuild-linux-riscv64": "0.15.13", - "esbuild-linux-s390x": "0.15.13", - "esbuild-netbsd-64": "0.15.13", - "esbuild-openbsd-64": "0.15.13", - "esbuild-sunos-64": "0.15.13", - "esbuild-windows-32": "0.15.13", - "esbuild-windows-64": "0.15.13", - "esbuild-windows-arm64": "0.15.13" - } - }, - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "postcss": { "version": "8.4.19", "dev": true, @@ -16489,26 +16566,19 @@ "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" } - }, - "semver": { - "version": "7.3.8", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } } } }, "@angular-devkit/build-webpack": { - "version": "0.1500.4", + "version": "0.1500.5", "dev": true, "requires": { - "@angular-devkit/architect": "0.1500.4", + "@angular-devkit/architect": "0.1500.5", "rxjs": "6.6.7" } }, "@angular-devkit/core": { - "version": "15.0.4", + "version": "15.0.5", "dev": true, "requires": { "ajv": "8.11.0", @@ -16519,10 +16589,10 @@ } }, "@angular-devkit/schematics": { - "version": "15.0.4", + "version": "15.0.5", "dev": true, "requires": { - "@angular-devkit/core": "15.0.4", + "@angular-devkit/core": "15.0.5", "jsonc-parser": "3.2.0", "magic-string": "0.26.7", "ora": "5.4.1", @@ -16536,20 +16606,20 @@ } }, "@angular/cdk": { - "version": "15.0.3", + "version": "15.0.4", "requires": { "parse5": "^7.1.2", "tslib": "^2.3.0" } }, "@angular/cli": { - "version": "15.0.4", + "version": "15.0.5", "dev": true, "requires": { - "@angular-devkit/architect": "0.1500.4", - "@angular-devkit/core": "15.0.4", - "@angular-devkit/schematics": "15.0.4", - "@schematics/angular": "15.0.4", + "@angular-devkit/architect": "0.1500.5", + "@angular-devkit/core": "15.0.5", + "@angular-devkit/schematics": "15.0.5", + "@schematics/angular": "15.0.5", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "3.0.1", @@ -16564,22 +16634,6 @@ "semver": "7.3.8", "symbol-observable": "4.0.0", "yargs": "17.6.2" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "@angular/common": { @@ -16609,23 +16663,11 @@ "yargs": "^17.2.1" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "requires": { - "yallist": "^4.0.0" - } - }, "magic-string": { "version": "0.27.0", "requires": { "@jridgewell/sourcemap-codec": "^1.4.13" } - }, - "semver": { - "version": "7.3.8", - "requires": { - "lru-cache": "^6.0.0" - } } } }, @@ -16651,6 +16693,31 @@ "@babel/core": "7.19.3", "glob": "8.0.3", "yargs": "^17.2.1" + }, + "dependencies": { + "@babel/core": { + "version": "7.19.3", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.3", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.3", + "@babel/types": "^7.19.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.0" + } } }, "@angular/platform-browser": { @@ -16688,32 +16755,37 @@ } }, "@babel/compat-data": { - "version": "7.20.5" + "version": "7.20.10" }, "@babel/core": { - "version": "7.19.3", + "version": "7.20.2", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.1", "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0" + } } }, "@babel/generator": { - "version": "7.20.5", + "version": "7.20.4", "requires": { - "@babel/types": "^7.20.5", + "@babel/types": "^7.20.2", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -16744,24 +16816,31 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.20.0", + "version": "7.20.7", "requires": { - "@babel/compat-data": "^7.20.0", + "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0" + } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.20.5", + "version": "7.20.12", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/helper-split-export-declaration": "^7.18.6" } }, @@ -16783,6 +16862,12 @@ "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "dev": true + } } }, "@babel/helper-environment-visitor": { @@ -16809,10 +16894,10 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", + "version": "7.20.7", "dev": true, "requires": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.20.7" } }, "@babel/helper-module-imports": { @@ -16822,16 +16907,26 @@ } }, "@babel/helper-module-transforms": { - "version": "7.20.2", + "version": "7.20.11", "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + }, + "dependencies": { + "@babel/template": { + "version": "7.20.7", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + } + } } }, "@babel/helper-optimise-call-expression": { @@ -16856,14 +16951,26 @@ } }, "@babel/helper-replace-supers": { - "version": "7.19.1", + "version": "7.20.7", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "dependencies": { + "@babel/template": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + } + } } }, "@babel/helper-simple-access": { @@ -16905,11 +17012,21 @@ } }, "@babel/helpers": { - "version": "7.20.6", + "version": "7.20.7", "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "dependencies": { + "@babel/template": { + "version": "7.20.7", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + } + } } }, "@babel/highlight": { @@ -16921,7 +17038,7 @@ } }, "@babel/parser": { - "version": "7.20.5" + "version": "7.20.7" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", @@ -16931,12 +17048,12 @@ } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", + "version": "7.20.7", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" } }, "@babel/plugin-proposal-async-generator-functions": { @@ -16958,11 +17075,11 @@ } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", + "version": "7.20.7", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, @@ -16991,10 +17108,10 @@ } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", + "version": "7.20.7", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, @@ -17015,14 +17132,14 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.2", + "version": "7.20.7", "dev": true, "requires": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.1" + "@babel/plugin-transform-parameters": "^7.20.7" } }, "@babel/plugin-proposal-optional-catch-binding": { @@ -17034,11 +17151,11 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", + "version": "7.20.7", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, @@ -17174,10 +17291,10 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", + "version": "7.20.7", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-async-to-generator": { @@ -17197,36 +17314,48 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.20.5", + "version": "7.20.11", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-classes": { - "version": "7.20.2", + "version": "7.20.7", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.18.9", + "version": "7.20.7", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" + }, + "dependencies": { + "@babel/template": { + "version": "7.20.7", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + } + } } }, "@babel/plugin-transform-destructuring": { - "version": "7.20.2", + "version": "7.20.7", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2" @@ -17286,29 +17415,29 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.19.6", + "version": "7.20.11", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", + "version": "7.20.11", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", + "version": "7.20.11", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-identifier": "^7.19.1" } }, @@ -17344,7 +17473,7 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.20.5", + "version": "7.20.7", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2" @@ -17382,6 +17511,12 @@ "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "dev": true + } } }, "@babel/plugin-transform-shorthand-properties": { @@ -17392,11 +17527,11 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.19.0", + "version": "7.20.7", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" } }, "@babel/plugin-transform-sticky-regex": { @@ -17514,6 +17649,12 @@ "babel-plugin-polyfill-regenerator": "^0.4.1", "core-js-compat": "^3.25.1", "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "dev": true + } } }, "@babel/preset-modules": { @@ -17535,7 +17676,7 @@ } }, "@babel/runtime-corejs2": { - "version": "7.20.6", + "version": "7.20.7", "requires": { "core-js": "^2.6.12", "regenerator-runtime": "^0.13.11" @@ -17550,22 +17691,40 @@ } }, "@babel/traverse": { - "version": "7.20.5", + "version": "7.20.12", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", + "@babel/generator": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.5", - "@babel/types": "^7.20.5", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.20.7", + "requires": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } } }, "@babel/types": { - "version": "7.20.5", + "version": "7.20.7", "requires": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", @@ -17576,12 +17735,37 @@ "version": "1.5.0", "dev": true }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, "@discoveryjs/json-ext": { "version": "0.5.7", "dev": true }, "@esbuild/win32-x64": { - "version": "0.16.10", + "version": "0.16.16", "dev": true, "optional": true }, @@ -17678,46 +17862,36 @@ }, "@ngrx/component-store": { "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@ngrx/component-store/-/component-store-15.1.0.tgz", - "integrity": "sha512-aqNxZHWdHAgnxz5cdBLKmWq83PVKw9F4ZMVddsZ7d8Ow2j3BWZiYP65hPVgVpzTHuigpE4OX0cutwGC38iu1GA==", "requires": { "tslib": "^2.0.0" } }, "@ngrx/effects": { "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-15.1.0.tgz", - "integrity": "sha512-/8YnhzyAOTdI9RYJAqmIIvh8ip4M4x4DrRyrdDDc62oFM3TrVOvknUUpMp5NxKpKph8hSpevAwaeEBDWGnKkjg==", "requires": { "tslib": "^2.0.0" } }, "@ngrx/entity": { "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@ngrx/entity/-/entity-15.1.0.tgz", - "integrity": "sha512-CvE51HR+m5Nhbh4Sr3rDcm93kGZBkbrsVsRf1HR0V7e03Y87IycAEM2loveT7pELLO3+LlZAwWUxVl1HIO/7hg==", "requires": { "tslib": "^2.0.0" } }, "@ngrx/store": { "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-15.1.0.tgz", - "integrity": "sha512-Wxjme7yJnxD6il6fGZdFTdSs9gL+6OFW8/II9vApFokUb0E7UQBm8RYb9dYJ2IQJvWXwO+2ItSaecRUZgt39kA==", "requires": { "tslib": "^2.0.0" } }, "@ngrx/store-devtools": { "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-15.1.0.tgz", - "integrity": "sha512-InEFdjg2cE0nLgdWWcjXa50SFlzxSVOoeudRqkqQlJlpJ/0RPljlRXHXT63E5cUpryTxYdK2QcE4n5vngq/48g==", "requires": { "tslib": "^2.0.0" } }, "@ngtools/webpack": { - "version": "15.0.4", + "version": "15.0.5", "dev": true, "requires": {} }, @@ -17746,22 +17920,6 @@ "dev": true, "requires": { "semver": "^7.3.5" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "@npmcli/git": { @@ -17779,26 +17937,18 @@ "which": "^3.0.0" }, "dependencies": { + "lru-cache": { + "version": "7.14.1", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "dev": true + }, "proc-log": { "version": "3.0.0", "dev": true }, - "semver": { - "version": "7.3.8", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, "which": { "version": "3.0.0", "dev": true, @@ -17822,6 +17972,12 @@ "requires": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "dev": true + } } }, "@npmcli/node-gyp": { @@ -17893,20 +18049,14 @@ "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^2.3.1" - }, - "dependencies": { - "@types/estree": { - "version": "1.0.0", - "dev": true - } } }, "@schematics/angular": { - "version": "15.0.4", + "version": "15.0.5", "dev": true, "requires": { - "@angular-devkit/core": "15.0.4", - "@angular-devkit/schematics": "15.0.4", + "@angular-devkit/core": "15.0.5", + "@angular-devkit/schematics": "15.0.5", "jsonc-parser": "3.2.0" } }, @@ -17929,12 +18079,12 @@ } }, "@testing-library/dom": { - "version": "8.19.0", + "version": "8.19.1", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", + "@types/aria-query": "^5.0.1", "aria-query": "^5.0.0", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", @@ -17985,8 +18135,40 @@ "version": "2.0.0", "dev": true }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true, + "optional": true, + "peer": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "optional": true, + "peer": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "optional": true, + "peer": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true, + "optional": true, + "peer": true + }, "@types/aria-query": { - "version": "4.2.2", + "version": "5.0.1", "dev": true }, "@types/body-parser": { @@ -18045,7 +18227,7 @@ } }, "@types/estree": { - "version": "0.0.51", + "version": "1.0.0", "dev": true }, "@types/express": { @@ -18059,7 +18241,7 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.31", + "version": "4.17.32", "dev": true, "requires": { "@types/node": "*", @@ -18120,7 +18302,7 @@ } }, "@types/node": { - "version": "18.11.17" + "version": "18.11.18" }, "@types/normalize-package-data": { "version": "2.4.1", @@ -18189,7 +18371,7 @@ "dev": true }, "@types/ws": { - "version": "8.5.3", + "version": "8.5.4", "dev": true, "requires": { "@types/node": "*" @@ -18345,14 +18527,9 @@ } }, "acorn": { - "version": "8.8.1", + "version": "7.4.1", "dev": true }, - "acorn-import-assertions": { - "version": "1.8.0", - "dev": true, - "requires": {} - }, "acorn-node": { "version": "1.8.2", "dev": true, @@ -18360,12 +18537,6 @@ "acorn": "^7.0.0", "acorn-walk": "^7.0.0", "xtend": "^4.0.2" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "dev": true - } } }, "acorn-walk": { @@ -18518,6 +18689,12 @@ "dev": true, "requires": { "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "dev": true + } } }, "aria-query": { @@ -18591,7 +18768,7 @@ "dev": true }, "aws4": { - "version": "1.11.0", + "version": "1.12.0", "dev": true }, "axobject-query": { @@ -18627,6 +18804,12 @@ "@babel/compat-data": "^7.17.7", "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "dev": true + } } }, "babel-plugin-polyfill-corejs3": { @@ -18710,10 +18893,6 @@ "unpipe": "1.0.0" }, "dependencies": { - "bytes": { - "version": "3.1.2", - "dev": true - }, "debug": { "version": "2.6.9", "dev": true, @@ -18818,26 +18997,10 @@ "dev": true, "requires": { "semver": "^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "bytes": { - "version": "3.0.0", + "version": "3.1.2", "dev": true }, "cacache": { @@ -18857,6 +19020,12 @@ "ssri": "^10.0.0", "tar": "^6.1.11", "unique-filename": "^3.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "7.14.1", + "dev": true + } } }, "call-bind": { @@ -18893,7 +19062,7 @@ } }, "caniuse-lite": { - "version": "1.0.30001439" + "version": "1.0.30001442" }, "caseless": { "version": "0.12.0", @@ -19033,12 +19202,12 @@ "commander": "^2.11.0" } }, - "source-map": { - "version": "0.5.7", + "commander": { + "version": "2.20.3", "dev": true }, - "sprintf-js": { - "version": "1.1.2", + "source-map": { + "version": "0.5.7", "dev": true }, "tslib": { @@ -19080,7 +19249,7 @@ } }, "commander": { - "version": "2.20.3", + "version": "9.5.0", "dev": true }, "commondir": { @@ -19111,6 +19280,10 @@ "vary": "~1.1.2" }, "dependencies": { + "bytes": { + "version": "3.0.0", + "dev": true + }, "debug": { "version": "2.6.9", "dev": true, @@ -19163,33 +19336,9 @@ "ms": "2.0.0" } }, - "finalhandler": { - "version": "1.1.2", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, "ms": { "version": "2.0.0", "dev": true - }, - "on-finished": { - "version": "2.3.0", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "statuses": { - "version": "1.5.0", - "dev": true } } }, @@ -19254,14 +19403,14 @@ "version": "2.6.12" }, "core-js-compat": { - "version": "3.26.1", + "version": "3.27.1", "dev": true, "requires": { "browserslist": "^4.21.4" } }, "core-util-is": { - "version": "1.0.3", + "version": "1.0.2", "dev": true }, "cors": { @@ -19282,6 +19431,14 @@ "yaml": "^1.10.0" } }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "optional": true, + "peer": true + }, "critters": { "version": "0.0.16", "dev": true, @@ -19338,12 +19495,20 @@ } }, "cross-spawn": { - "version": "7.0.3", + "version": "6.0.5", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "dev": true + } } }, "css-loader": { @@ -19358,22 +19523,6 @@ "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "css-select": { @@ -19461,15 +19610,17 @@ } }, "deep-equal": { - "version": "2.1.0", + "version": "2.2.0", "dev": true, "requires": { "call-bind": "^1.0.2", "es-get-iterator": "^1.1.2", "get-intrinsic": "^1.1.3", "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", "is-date-object": "^1.0.5", "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", "isarray": "^2.0.5", "object-is": "^1.1.5", "object-keys": "^1.1.1", @@ -19478,13 +19629,7 @@ "side-channel": "^1.0.4", "which-boxed-primitive": "^1.0.2", "which-collection": "^1.0.1", - "which-typed-array": "^1.1.8" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "dev": true - } + "which-typed-array": "^1.1.9" } }, "deep-freeze-strict": { @@ -19500,6 +19645,65 @@ "dev": true, "requires": { "execa": "^5.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "5.1.1", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "dev": true + }, + "which": { + "version": "2.0.2", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "defaults": { @@ -19668,7 +19872,7 @@ } }, "dom-accessibility-api": { - "version": "0.5.14", + "version": "0.5.15", "dev": true }, "dom-serialize": { @@ -19688,12 +19892,6 @@ "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" - }, - "dependencies": { - "entities": { - "version": "2.2.0", - "dev": true - } } }, "domelementtype": { @@ -19790,7 +19988,7 @@ } }, "engine.io-parser": { - "version": "5.0.4" + "version": "5.0.5" }, "enhanced-resolve": { "version": "5.12.0", @@ -19805,8 +20003,8 @@ "dev": true }, "entities": { - "version": "4.4.0", - "optional": true + "version": "2.2.0", + "dev": true }, "env-paths": { "version": "2.2.1", @@ -19832,25 +20030,30 @@ } }, "es-abstract": { - "version": "1.20.5", + "version": "1.21.0", "dev": true, "requires": { "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.0", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.0", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", @@ -19859,7 +20062,9 @@ "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" } }, "es-get-iterator": { @@ -19874,18 +20079,21 @@ "is-set": "^2.0.2", "is-string": "^1.0.5", "isarray": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "dev": true - } } }, "es-module-lexer": { "version": "0.9.3", "dev": true }, + "es-set-tostringtag": { + "version": "2.0.1", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, "es-to-primitive": { "version": "1.2.1", "dev": true, @@ -19910,6 +20118,35 @@ "es6-promise": "^4.0.3" } }, + "esbuild": { + "version": "0.15.13", + "dev": true, + "optional": true, + "requires": { + "@esbuild/android-arm": "0.15.13", + "@esbuild/linux-loong64": "0.15.13", + "esbuild-android-64": "0.15.13", + "esbuild-android-arm64": "0.15.13", + "esbuild-darwin-64": "0.15.13", + "esbuild-darwin-arm64": "0.15.13", + "esbuild-freebsd-64": "0.15.13", + "esbuild-freebsd-arm64": "0.15.13", + "esbuild-linux-32": "0.15.13", + "esbuild-linux-64": "0.15.13", + "esbuild-linux-arm": "0.15.13", + "esbuild-linux-arm64": "0.15.13", + "esbuild-linux-mips64le": "0.15.13", + "esbuild-linux-ppc64le": "0.15.13", + "esbuild-linux-riscv64": "0.15.13", + "esbuild-linux-s390x": "0.15.13", + "esbuild-netbsd-64": "0.15.13", + "esbuild-openbsd-64": "0.15.13", + "esbuild-sunos-64": "0.15.13", + "esbuild-windows-32": "0.15.13", + "esbuild-windows-64": "0.15.13", + "esbuild-windows-arm64": "0.15.13" + } + }, "esbuild-wasm": { "version": "0.15.13", "dev": true @@ -19978,7 +20215,8 @@ "dev": true }, "eventemitter3": { - "version": "4.0.7" + "version": "4.0.7", + "dev": true }, "events": { "version": "3.3.0", @@ -19988,18 +20226,51 @@ "version": "2.0.2" }, "execa": { - "version": "5.1.1", + "version": "2.1.0", "dev": true, "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", + "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "dev": true + }, + "which": { + "version": "2.0.2", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "execall": { @@ -20065,9 +20336,26 @@ "ms": "2.0.0" } }, + "finalhandler": { + "version": "1.2.0", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, "ms": { "version": "2.0.0", "dev": true + }, + "statuses": { + "version": "2.0.1", + "dev": true } } }, @@ -20116,7 +20404,7 @@ "dev": true }, "fastq": { - "version": "1.14.0", + "version": "1.15.0", "dev": true, "requires": { "reusify": "^1.0.4" @@ -20157,15 +20445,15 @@ } }, "finalhandler": { - "version": "1.2.0", + "version": "1.1.2", "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.3.0", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~1.5.0", "unpipe": "~1.0.0" }, "dependencies": { @@ -20179,6 +20467,13 @@ "ms": { "version": "2.0.0", "dev": true + }, + "on-finished": { + "version": "2.3.0", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } } } }, @@ -20265,12 +20560,6 @@ "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" - }, - "dependencies": { - "universalify": { - "version": "0.1.2", - "dev": true - } } }, "fs-minipass": { @@ -20287,10 +20576,6 @@ "fs.realpath": { "version": "1.0.0" }, - "fsevents": { - "version": "2.3.2", - "optional": true - }, "function-bind": { "version": "1.1.1", "dev": true @@ -20347,8 +20632,11 @@ "dev": true }, "get-stream": { - "version": "6.0.1", - "dev": true + "version": "5.2.0", + "dev": true, + "requires": { + "pump": "^3.0.0" + } }, "get-symbol-description": { "version": "1.0.0", @@ -20399,22 +20687,8 @@ }, "dependencies": { "core-js": { - "version": "3.26.1", + "version": "3.27.1", "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } } } }, @@ -20437,13 +20711,6 @@ "ini": { "version": "1.3.8", "dev": true - }, - "which": { - "version": "1.3.1", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -20573,6 +20840,10 @@ "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "dev": true + }, "has-symbols": { "version": "1.0.3", "dev": true @@ -20606,6 +20877,12 @@ "dev": true, "requires": { "lru-cache": "^7.5.1" + }, + "dependencies": { + "lru-cache": { + "version": "7.14.1", + "dev": true + } } }, "howler": { @@ -20621,6 +20898,10 @@ "wbuf": "^1.1.0" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "dev": true + }, "readable-stream": { "version": "2.3.7", "dev": true, @@ -20733,6 +21014,12 @@ "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" + }, + "dependencies": { + "statuses": { + "version": "2.0.1", + "dev": true + } } }, "http-parser-js": { @@ -20766,6 +21053,12 @@ "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", "micromatch": "^4.0.2" + }, + "dependencies": { + "is-plain-obj": { + "version": "3.0.0", + "dev": true + } } }, "http-signature": { @@ -20928,7 +21221,7 @@ "dev": true }, "immutable": { - "version": "4.1.0", + "version": "4.2.2", "dev": true }, "import-fresh": { @@ -21086,6 +21379,15 @@ "has-tostringtag": "^1.0.0" } }, + "is-array-buffer": { + "version": "3.0.1", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + } + }, "is-arrayish": { "version": "0.2.1", "dev": true @@ -21213,7 +21515,7 @@ } }, "is-plain-obj": { - "version": "3.0.0", + "version": "1.1.0", "dev": true }, "is-plain-object": { @@ -21314,7 +21616,7 @@ } }, "isarray": { - "version": "1.0.0", + "version": "2.0.5", "dev": true }, "isbinaryfile": { @@ -21346,6 +21648,12 @@ "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "dev": true + } } }, "istanbul-lib-report": { @@ -21544,7 +21852,7 @@ "dev": true }, "json5": { - "version": "2.2.2" + "version": "2.2.3" }, "jsonc-parser": { "version": "3.2.0", @@ -21584,6 +21892,10 @@ "setimmediate": "^1.0.5" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "dev": true + }, "readable-stream": { "version": "2.3.7", "dev": true, @@ -21669,10 +21981,6 @@ "path-is-absolute": "^1.0.0" } }, - "mime": { - "version": "2.6.0", - "dev": true - }, "minimatch": { "version": "3.1.2", "dev": true, @@ -21680,13 +21988,6 @@ "brace-expansion": "^1.1.7" } }, - "mkdirp": { - "version": "0.5.6", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, "source-map": { "version": "0.6.1", "dev": true @@ -21716,10 +22017,6 @@ "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } - }, - "yargs-parser": { - "version": "20.2.9", - "dev": true } } }, @@ -21728,15 +22025,6 @@ "dev": true, "requires": { "which": "^1.2.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "karma-coverage": { @@ -21831,6 +22119,10 @@ "brace-expansion": "^1.1.7" } }, + "pify": { + "version": "4.0.1", + "dev": true + }, "rimraf": { "version": "2.7.1", "dev": true, @@ -21912,6 +22204,16 @@ "semver": "^5.6.0" } }, + "mime": { + "version": "1.6.0", + "dev": true, + "optional": true + }, + "pify": { + "version": "4.0.1", + "dev": true, + "optional": true + }, "semver": { "version": "5.7.1", "dev": true, @@ -21970,10 +22272,6 @@ "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } - }, - "pify": { - "version": "3.0.0", - "dev": true } } }, @@ -22066,8 +22364,10 @@ "dev": true }, "lru-cache": { - "version": "7.14.1", - "dev": true + "version": "5.1.1", + "requires": { + "yallist": "^3.0.2" + } }, "lz-string": { "version": "1.4.4", @@ -22085,6 +22385,12 @@ "dev": true, "requires": { "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "dev": true + } } }, "make-error": { @@ -22145,21 +22451,13 @@ "unique-filename": "^2.0.0" } }, - "semver": { - "version": "7.3.8", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } + "lru-cache": { + "version": "7.14.1", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "dev": true }, "ssri": { "version": "9.0.1", @@ -22237,7 +22535,7 @@ "dev": true }, "memfs": { - "version": "3.4.12", + "version": "3.4.13", "dev": true, "requires": { "fs-monkey": "^1.0.3" @@ -22289,19 +22587,12 @@ "validate-npm-package-license": "^3.0.1" } }, - "semver": { - "version": "7.3.8", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, "type-fest": { "version": "0.18.1", "dev": true }, - "yargs-parser": { - "version": "20.2.9", + "yallist": { + "version": "4.0.0", "dev": true } } @@ -22339,7 +22630,7 @@ } }, "mime": { - "version": "1.6.0", + "version": "2.6.0", "dev": true }, "mime-db": { @@ -22371,7 +22662,7 @@ "dev": true }, "minimatch": { - "version": "5.1.1", + "version": "5.1.2", "requires": { "brace-expansion": "^2.0.1" } @@ -22392,10 +22683,6 @@ "arrify": { "version": "1.0.1", "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "dev": true } } }, @@ -22404,6 +22691,12 @@ "dev": true, "requires": { "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "dev": true + } } }, "minipass-collect": { @@ -22458,11 +22751,20 @@ "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "dev": true + } } }, "mkdirp": { - "version": "1.0.4", - "dev": true + "version": "0.5.6", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } }, "moment": { "version": "2.29.4" @@ -22558,7 +22860,7 @@ "dev": true }, "ng-mocks": { - "version": "14.5.0", + "version": "14.5.2", "dev": true, "requires": {} }, @@ -22592,45 +22894,41 @@ "sass": "^1.55.0" }, "dependencies": { - "commander": { - "version": "9.4.1", - "dev": true - }, "convert-source-map": { "version": "2.0.0", "dev": true }, "esbuild": { - "version": "0.16.10", + "version": "0.16.16", "dev": true, "optional": true, "requires": { - "@esbuild/android-arm": "0.16.10", - "@esbuild/android-arm64": "0.16.10", - "@esbuild/android-x64": "0.16.10", - "@esbuild/darwin-arm64": "0.16.10", - "@esbuild/darwin-x64": "0.16.10", - "@esbuild/freebsd-arm64": "0.16.10", - "@esbuild/freebsd-x64": "0.16.10", - "@esbuild/linux-arm": "0.16.10", - "@esbuild/linux-arm64": "0.16.10", - "@esbuild/linux-ia32": "0.16.10", - "@esbuild/linux-loong64": "0.16.10", - "@esbuild/linux-mips64el": "0.16.10", - "@esbuild/linux-ppc64": "0.16.10", - "@esbuild/linux-riscv64": "0.16.10", - "@esbuild/linux-s390x": "0.16.10", - "@esbuild/linux-x64": "0.16.10", - "@esbuild/netbsd-x64": "0.16.10", - "@esbuild/openbsd-x64": "0.16.10", - "@esbuild/sunos-x64": "0.16.10", - "@esbuild/win32-arm64": "0.16.10", - "@esbuild/win32-ia32": "0.16.10", - "@esbuild/win32-x64": "0.16.10" + "@esbuild/android-arm": "0.16.16", + "@esbuild/android-arm64": "0.16.16", + "@esbuild/android-x64": "0.16.16", + "@esbuild/darwin-arm64": "0.16.16", + "@esbuild/darwin-x64": "0.16.16", + "@esbuild/freebsd-arm64": "0.16.16", + "@esbuild/freebsd-x64": "0.16.16", + "@esbuild/linux-arm": "0.16.16", + "@esbuild/linux-arm64": "0.16.16", + "@esbuild/linux-ia32": "0.16.16", + "@esbuild/linux-loong64": "0.16.16", + "@esbuild/linux-mips64el": "0.16.16", + "@esbuild/linux-ppc64": "0.16.16", + "@esbuild/linux-riscv64": "0.16.16", + "@esbuild/linux-s390x": "0.16.16", + "@esbuild/linux-x64": "0.16.16", + "@esbuild/netbsd-x64": "0.16.16", + "@esbuild/openbsd-x64": "0.16.16", + "@esbuild/sunos-x64": "0.16.16", + "@esbuild/win32-arm64": "0.16.16", + "@esbuild/win32-ia32": "0.16.16", + "@esbuild/win32-x64": "0.16.16" } }, "esbuild-wasm": { - "version": "0.16.10", + "version": "0.16.16", "dev": true }, "rxjs": { @@ -22718,13 +23016,6 @@ "path-is-absolute": "^1.0.0" } }, - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "minimatch": { "version": "3.1.2", "dev": true, @@ -22732,11 +23023,11 @@ "brace-expansion": "^1.1.7" } }, - "semver": { - "version": "7.3.8", + "which": { + "version": "2.0.2", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "isexe": "^2.0.0" } } } @@ -22768,21 +23059,9 @@ "lru-cache": "^7.5.1" } }, - "semver": { - "version": "7.3.8", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } + "lru-cache": { + "version": "7.14.1", + "dev": true } } }, @@ -22810,12 +23089,6 @@ "requires": { "config-chain": "^1.1.11", "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "dev": true - } } }, "npm-install-checks": { @@ -22823,22 +23096,6 @@ "dev": true, "requires": { "semver": "^7.1.1" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "npm-normalize-package-bin": { @@ -22853,22 +23110,6 @@ "proc-log": "^2.0.1", "semver": "^7.3.5", "validate-npm-package-name": "^4.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "npm-packlist": { @@ -22895,6 +23136,10 @@ "lru-cache": "^7.5.1" } }, + "lru-cache": { + "version": "7.14.1", + "dev": true + }, "npm-package-arg": { "version": "10.1.0", "dev": true, @@ -22909,22 +23154,6 @@ "version": "3.0.0", "dev": true }, - "semver": { - "version": "7.3.8", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, "validate-npm-package-name": { "version": "5.0.0", "dev": true, @@ -22954,6 +23183,10 @@ "lru-cache": "^7.5.1" } }, + "lru-cache": { + "version": "7.14.1", + "dev": true + }, "make-fetch-happen": { "version": "11.0.2", "dev": true, @@ -23007,28 +23240,16 @@ "version": "3.0.0", "dev": true }, - "semver": { - "version": "7.3.8", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, "validate-npm-package-name": { "version": "5.0.0", "dev": true, "requires": { "builtins": "^5.0.0" } + }, + "yallist": { + "version": "4.0.0", + "dev": true } } }, @@ -23055,57 +23276,26 @@ "concat-map": "0.0.1" } }, - "cross-spawn": { - "version": "6.0.5", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, "minimatch": { "version": "3.1.2", "dev": true, "requires": { "brace-expansion": "^1.1.7" } - }, - "path-key": { - "version": "2.0.1", - "dev": true - }, - "semver": { - "version": "5.7.1", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "dev": true - }, - "which": { - "version": "1.3.1", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, "npm-run-path": { - "version": "4.0.1", + "version": "3.1.0", "dev": true, "requires": { "path-key": "^3.0.0" + }, + "dependencies": { + "path-key": { + "version": "3.1.1", + "dev": true + } } }, "npmlog": { @@ -23306,6 +23496,12 @@ "requires": { "@types/retry": "0.12.0", "retry": "^0.13.1" + }, + "dependencies": { + "retry": { + "version": "0.13.1", + "dev": true + } } }, "p-try": { @@ -23342,6 +23538,10 @@ "lru-cache": "^7.5.1" } }, + "lru-cache": { + "version": "7.14.1", + "dev": true + }, "npm-package-arg": { "version": "10.1.0", "dev": true, @@ -23356,22 +23556,6 @@ "version": "3.0.0", "dev": true }, - "semver": { - "version": "7.3.8", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, "validate-npm-package-name": { "version": "5.0.0", "dev": true, @@ -23423,6 +23607,12 @@ "optional": true, "requires": { "entities": "^4.4.0" + }, + "dependencies": { + "entities": { + "version": "4.4.0", + "optional": true + } } }, "parse5-html-rewriting-stream": { @@ -23482,7 +23672,7 @@ "dev": true }, "path-key": { - "version": "3.1.1", + "version": "2.0.1", "dev": true }, "path-parse": { @@ -23519,7 +23709,7 @@ "dev": true }, "pify": { - "version": "4.0.1", + "version": "3.0.0", "dev": true }, "pinkie": { @@ -23558,7 +23748,7 @@ } }, "postcss": { - "version": "8.4.20", + "version": "8.4.21", "dev": true, "requires": { "nanoid": "^3.3.4", @@ -23614,14 +23804,6 @@ } } }, - "postcss-load-config": { - "version": "3.1.4", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - } - }, "postcss-loader": { "version": "4.3.0", "dev": true, @@ -23661,13 +23843,6 @@ "json5": "^2.1.2" } }, - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "schema-utils": { "version": "3.1.1", "dev": true, @@ -23676,13 +23851,6 @@ "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } - }, - "semver": { - "version": "7.3.8", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } } } }, @@ -23868,37 +24036,6 @@ "ignore": "^5.1.4", "mri": "^1.1.4", "multimatch": "^4.0.0" - }, - "dependencies": { - "execa": { - "version": "2.1.0", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^3.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "npm-run-path": { - "version": "3.1.0", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - } } }, "proc-log": { @@ -23919,12 +24056,6 @@ "requires": { "err-code": "^2.0.2", "retry": "^0.12.0" - }, - "dependencies": { - "retry": { - "version": "0.12.0", - "dev": true - } } }, "proto-list": { @@ -24024,10 +24155,6 @@ "path-is-absolute": "^1.0.0" } }, - "ini": { - "version": "1.3.8", - "dev": true - }, "minimatch": { "version": "3.1.2", "dev": true, @@ -24035,17 +24162,6 @@ "brace-expansion": "^1.1.7" } }, - "rimraf": { - "version": "2.7.1", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "dev": true - }, "source-map": { "version": "0.5.7", "dev": true @@ -24068,23 +24184,6 @@ "version": "2.0.0", "dev": true }, - "webdriver-manager": { - "version": "12.1.8", - "dev": true, - "requires": { - "adm-zip": "^0.4.9", - "chalk": "^1.1.1", - "del": "^2.2.0", - "glob": "^7.0.3", - "ini": "^1.3.4", - "minimist": "^1.2.0", - "q": "^1.4.1", - "request": "^2.87.0", - "rimraf": "^2.5.2", - "semver": "^5.3.0", - "xml2js": "^0.4.17" - } - }, "wrap-ansi": { "version": "6.2.0", "dev": true, @@ -24223,12 +24322,6 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "dev": true - } } }, "react-is": { @@ -24308,10 +24401,6 @@ "pify": "^3.0.0" } }, - "pify": { - "version": "3.0.0", - "dev": true - }, "semver": { "version": "5.7.1", "dev": true @@ -24577,10 +24666,6 @@ "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } - }, - "yargs-parser": { - "version": "20.2.9", - "dev": true } } }, @@ -24690,7 +24775,7 @@ } }, "retry": { - "version": "0.13.1", + "version": "0.12.0", "dev": true }, "reusify": { @@ -24747,16 +24832,10 @@ "json-stringify-safe": "^5.0.1", "semver-compare": "^1.0.0", "sprintf-js": "^1.1.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.1.2", - "dev": true - } } }, "rollup": { - "version": "3.7.5", + "version": "3.9.1", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -24854,17 +24933,22 @@ "dev": true }, "scandit-sdk": { - "version": "5.12.1", + "version": "5.12.2", "requires": { - "@babel/runtime-corejs2": "^7.18.9", - "@juggle/resize-observer": "^3.3.1", - "csstype": "^3.1.0", - "eventemitter3": "^4.0.7", + "@babel/runtime-corejs2": "^7.20.7", + "@juggle/resize-observer": "^3.4.0", + "csstype": "^3.1.1", + "eventemitter3": "^5.0.0", "howler": "^2.2.3", "js-cookie": "^3.0.1", "objectFitPolyfill": "^2.3.5", - "tslib": "^2.4.0", - "ua-parser-js": "^1.0.2" + "tslib": "^2.4.1", + "ua-parser-js": "^1.0.32" + }, + "dependencies": { + "eventemitter3": { + "version": "5.0.0" + } } }, "schema-utils": { @@ -24942,7 +25026,21 @@ } }, "semver": { - "version": "6.3.0" + "version": "7.3.8", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0" + } + } }, "semver-compare": { "version": "1.0.0", @@ -24997,9 +25095,17 @@ } } }, + "mime": { + "version": "1.6.0", + "dev": true + }, "ms": { "version": "2.1.3", "dev": true + }, + "statuses": { + "version": "2.0.1", + "dev": true } } }, @@ -25068,10 +25174,6 @@ "setprototypeof": { "version": "1.1.0", "dev": true - }, - "statuses": { - "version": "1.5.0", - "dev": true } } }, @@ -25108,14 +25210,14 @@ } }, "shebang-command": { - "version": "2.0.0", + "version": "1.2.0", "dev": true, "requires": { - "shebang-regex": "^3.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { - "version": "3.0.0", + "version": "1.0.0", "dev": true }, "shell-quote": { @@ -25315,7 +25417,7 @@ "dev": true }, "sprintf-js": { - "version": "1.0.3", + "version": "1.1.2", "dev": true }, "sshpk": { @@ -25346,15 +25448,19 @@ "requires": { "yallist": "^4.0.0" } + }, + "yallist": { + "version": "4.0.0", + "dev": true } } }, "statuses": { - "version": "2.0.1", + "version": "1.5.0", "dev": true }, "streamroller": { - "version": "3.1.3", + "version": "3.1.4", "dev": true, "requires": { "date-format": "^4.0.14", @@ -25673,10 +25779,28 @@ "resolve": "^1.22.1" }, "dependencies": { + "acorn": { + "version": "8.8.1", + "dev": true, + "optional": true, + "peer": true + }, + "acorn-walk": { + "version": "8.2.0", + "dev": true, + "optional": true, + "peer": true + }, "color-name": { "version": "1.1.4", "dev": true }, + "diff": { + "version": "4.0.2", + "dev": true, + "optional": true, + "peer": true + }, "glob-parent": { "version": "6.0.2", "dev": true, @@ -25684,9 +25808,52 @@ "is-glob": "^4.0.3" } }, + "postcss-load-config": { + "version": "3.1.4", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + }, "quick-lru": { "version": "5.1.1", "dev": true + }, + "ts-node": { + "version": "10.9.1", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "arg": { + "version": "4.1.3", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "yn": { + "version": "3.1.1", + "dev": true, + "optional": true, + "peer": true } } }, @@ -25712,6 +25879,14 @@ "requires": { "yallist": "^4.0.0" } + }, + "mkdirp": { + "version": "1.0.4", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "dev": true } } }, @@ -25723,6 +25898,16 @@ "acorn": "^8.5.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" + }, + "dependencies": { + "acorn": { + "version": "8.8.1", + "dev": true + }, + "commander": { + "version": "2.20.3", + "dev": true + } } }, "terser-webpack-plugin": { @@ -25843,6 +26028,11 @@ "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0" + } } }, "tr46": { @@ -25877,13 +26067,6 @@ "arrify": { "version": "1.0.1", "dev": true - }, - "mkdirp": { - "version": "0.5.6", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } } } }, @@ -25921,6 +26104,10 @@ "version": "1.1.1", "dev": true }, + "commander": { + "version": "2.20.3", + "dev": true + }, "diff": { "version": "4.0.2", "dev": true @@ -25944,13 +26131,6 @@ "brace-expansion": "^1.1.7" } }, - "mkdirp": { - "version": "0.5.6", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, "semver": { "version": "5.7.1", "dev": true @@ -26001,6 +26181,15 @@ "mime-types": "~2.1.24" } }, + "typed-array-length": { + "version": "1.0.4", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, "typed-assert": { "version": "1.0.9", "dev": true @@ -26104,7 +26293,8 @@ } }, "universalify": { - "version": "0.2.0" + "version": "0.1.2", + "dev": true }, "unpipe": { "version": "1.0.0", @@ -26146,6 +26336,14 @@ "version": "2.3.0", "dev": true }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "optional": true, + "peer": true + }, "validate-npm-package-license": { "version": "3.0.4", "dev": true, @@ -26171,12 +26369,6 @@ "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "dev": true - } } }, "vfile": { @@ -26239,6 +26431,97 @@ "selenium-webdriver": "^3.0.1" } }, + "webdriver-manager": { + "version": "12.1.8", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chalk": { + "version": "1.1.3", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "glob": { + "version": "7.2.3", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "ini": { + "version": "1.3.8", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "rimraf": { + "version": "2.7.1", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "dev": true + } + } + }, "webidl-conversions": { "version": "3.0.1" }, @@ -26272,6 +26555,19 @@ "webpack-sources": "^3.2.3" }, "dependencies": { + "@types/estree": { + "version": "0.0.51", + "dev": true + }, + "acorn": { + "version": "8.8.1", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.8.0", + "dev": true, + "requires": {} + }, "ajv": { "version": "6.12.6", "dev": true, @@ -26349,7 +26645,7 @@ }, "dependencies": { "ws": { - "version": "8.11.0", + "version": "8.12.0", "dev": true, "requires": {} } @@ -26395,7 +26691,7 @@ } }, "which": { - "version": "2.0.2", + "version": "1.3.1", "dev": true, "requires": { "isexe": "^2.0.0" @@ -26528,7 +26824,7 @@ "version": "5.0.8" }, "yallist": { - "version": "4.0.0" + "version": "3.1.1" }, "yaml": { "version": "1.10.2", @@ -26544,10 +26840,16 @@ "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" + }, + "dependencies": { + "yargs-parser": { + "version": "21.1.1" + } } }, "yargs-parser": { - "version": "21.1.1" + "version": "20.2.9", + "dev": true }, "yn": { "version": "2.0.0", diff --git a/tailwind-plugins/button.plugin.js b/tailwind-plugins/button.plugin.js index 01c95ce32..6321c82a7 100644 --- a/tailwind-plugins/button.plugin.js +++ b/tailwind-plugins/button.plugin.js @@ -33,7 +33,7 @@ module.exports = plugin(function ({ addComponents, theme }) { width: theme('spacing.7'), height: theme('spacing.7'), }, - '.isa-button-primary:disabled': { + '.isa-button:disabled, .isa-cta-button:disabled, .isa-icon-button:disabled': { backgroundColor: '#596470', borderColor: '#596470', color: theme('colors.white'), diff --git a/tailwind-plugins/input.plugin.js b/tailwind-plugins/input.plugin.js new file mode 100644 index 000000000..e69de29bb diff --git a/tailwind.config.js b/tailwind.config.js index 9c10cdc20..63cf8b96d 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -117,6 +117,7 @@ module.exports = { plugins: [ require('./tailwind-plugins/label.plugin.js'), require('./tailwind-plugins/button.plugin.js'), + require('./tailwind-plugins/input.plugin'), require('./tailwind-plugins/select-bullet.plugin.js'), ], }; diff --git a/tsconfig.json b/tsconfig.json index 417f04607..43c56fcb1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -102,6 +102,9 @@ "@shared/components/*": [ "apps/shared/components/*/src/public-api.ts" ], + "@shared/modals/*": [ + "apps/shared/modals/*/src/public-api.ts" + ], "@shared/directives/*": [ "apps/shared/directives/*/src/public-api.ts" ],