UNPKG

@spartacus/order

Version:

Order feature library for Spartacus

720 lines (701 loc) 162 kB
import * as i0 from '@angular/core'; import { Component, ChangeDetectionStrategy, Input, HostBinding, NgModule, Injectable, HostListener, ViewChild } from '@angular/core'; import * as i1 from '@spartacus/core'; import { UrlModule, I18nModule, FeaturesConfigModule, GlobalMessageType, provideDefaultConfig, AuthGuard, PromotionLocation, isNotUndefined, provideConfig } from '@spartacus/core'; import * as i3 from '@angular/router'; import { RouterModule } from '@angular/router'; import * as i4 from '@angular/common'; import { CommonModule, formatCurrency, getCurrencySymbol } from '@angular/common'; import * as i5 from '@angular/forms'; import { FormGroup, FormControl, Validators, ReactiveFormsModule, FormsModule } from '@angular/forms'; import { map, distinctUntilChanged, tap, shareReplay, switchMap, filter, first, take, startWith } from 'rxjs/operators'; import * as i2 from '@spartacus/order/root'; import * as i3$1 from '@spartacus/storefront'; import { MediaModule, ItemCounterModule, FormErrorsModule, CartSharedModule, CardModule, PromotionsModule, OrderOverviewModule, SpinnerModule, OrderDetailsServiceTransitionalToken, ListNavigationModule, KeyboardFocusModule, DIALOG_TYPE } from '@spartacus/storefront'; import * as i1$1 from '@ng-bootstrap/ng-bootstrap'; import { NgSelectModule } from '@ng-select/ng-select'; import { combineLatest, Subscription } from 'rxjs'; class AmendOrderActionsComponent { constructor(routingService) { this.routingService = routingService; this.styles = 'row'; } continue(event) { if (this.amendOrderForm.valid) { this.routingService.go({ cxRoute: this.forwardRoute, params: { code: this.orderCode }, }); } else { this.amendOrderForm.markAllAsTouched(); event.stopPropagation(); } } } AmendOrderActionsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: AmendOrderActionsComponent, deps: [{ token: i1.RoutingService }], target: i0.ɵɵFactoryTarget.Component }); AmendOrderActionsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: AmendOrderActionsComponent, selector: "cx-amend-order-actions", inputs: { orderCode: "orderCode", amendOrderForm: "amendOrderForm", backRoute: "backRoute", forwardRoute: "forwardRoute" }, host: { properties: { "class": "this.styles" } }, ngImport: i0, template: "<div class=\"col-xs-12 col-md-4 col-lg-3\">\n <a\n [routerLink]=\"\n {\n cxRoute: backRoute,\n params: { code: orderCode }\n } | cxUrl\n \"\n class=\"btn btn-block btn-action\"\n >\n {{ 'common.back' | cxTranslate }}\n </a>\n</div>\n<div class=\"col-xs-12 col-md-4 col-lg-3\">\n <button\n *ngIf=\"forwardRoute\"\n class=\"btn btn-block btn-primary\"\n (click)=\"continue($event)\"\n >\n {{ 'common.continue' | cxTranslate }}\n </button>\n\n <button *ngIf=\"!forwardRoute\" class=\"btn btn-block btn-primary\" type=\"submit\">\n {{ 'orderDetails.cancellationAndReturn.submit' | cxTranslate }}\n </button>\n</div>\n", directives: [{ type: i3.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["routerLink", "target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "cxUrl": i1.UrlPipe, "cxTranslate": i1.TranslatePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: AmendOrderActionsComponent, decorators: [{ type: Component, args: [{ selector: 'cx-amend-order-actions', templateUrl: './amend-order-actions.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }] }], ctorParameters: function () { return [{ type: i1.RoutingService }]; }, propDecorators: { orderCode: [{ type: Input }], amendOrderForm: [{ type: Input }], backRoute: [{ type: Input }], forwardRoute: [{ type: Input }], styles: [{ type: HostBinding, args: ['class'] }] } }); class AmendOrderActionsModule { } AmendOrderActionsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: AmendOrderActionsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); AmendOrderActionsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: AmendOrderActionsModule, declarations: [AmendOrderActionsComponent], imports: [CommonModule, RouterModule, UrlModule, I18nModule], exports: [AmendOrderActionsComponent] }); AmendOrderActionsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: AmendOrderActionsModule, imports: [[CommonModule, RouterModule, UrlModule, I18nModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: AmendOrderActionsModule, decorators: [{ type: NgModule, args: [{ imports: [CommonModule, RouterModule, UrlModule, I18nModule], declarations: [AmendOrderActionsComponent], exports: [AmendOrderActionsComponent], }] }] }); var AmendOrderType; (function (AmendOrderType) { AmendOrderType[AmendOrderType["CANCEL"] = 0] = "CANCEL"; AmendOrderType[AmendOrderType["RETURN"] = 1] = "RETURN"; })(AmendOrderType || (AmendOrderType = {})); class OrderDetailsService { constructor(userOrderService, routingService) { this.userOrderService = userOrderService; this.routingService = routingService; this.orderCode$ = this.routingService.getRouterState().pipe(map((routingData) => routingData.state.params.orderCode), distinctUntilChanged()); this.orderLoad$ = this.orderCode$.pipe(tap((orderCode) => { if (orderCode) { this.userOrderService.loadOrderDetails(orderCode); } else { this.userOrderService.clearOrderDetails(); } }), shareReplay({ bufferSize: 1, refCount: true })); } getOrderDetails() { return this.orderLoad$.pipe(switchMap(() => this.userOrderService.getOrderDetails())); } } OrderDetailsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderDetailsService, deps: [{ token: i2.OrderFacade }, { token: i1.RoutingService }], target: i0.ɵɵFactoryTarget.Injectable }); OrderDetailsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderDetailsService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderDetailsService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: i2.OrderFacade }, { type: i1.RoutingService }]; } }); function ValidateQuantityToCancel(control) { if (!control.value) { return null; } const quantity = Object.values(control.value).reduce((acc, val) => acc + val, 0); return quantity > 0 ? null : { cxNoSelectedItemToCancel: true }; } class OrderAmendService { constructor(orderDetailsService) { this.orderDetailsService = orderDetailsService; } /** * Returns entries with an amended quantity. */ getAmendedEntries() { return this.getForm().pipe(switchMap((form) => { return this.getEntries().pipe(map((entries) => entries.filter((entry) => this.getFormControl(form, entry).value > 0))); })); } getOrder() { return this.orderDetailsService.getOrderDetails(); } /** * returns the form with form data at runtime */ getForm() { return this.getOrder().pipe(tap((order) => { var _a; if (!this.form || ((_a = this.form.get('orderCode')) === null || _a === void 0 ? void 0 : _a.value) !== order.code) { this.buildForm(order); } }), map(() => this.form)); } buildForm(order) { this.form = new FormGroup({}); this.form.addControl('orderCode', new FormControl(order.code)); const entryGroup = new FormGroup({}, { validators: [ValidateQuantityToCancel] }); this.form.addControl('entries', entryGroup); (order.entries || []).forEach((entry) => { var _a, _b; const key = (_b = (_a = entry === null || entry === void 0 ? void 0 : entry.entryNumber) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : ''; entryGroup.addControl(key, new FormControl(0, { validators: [ Validators.min(0), Validators.max(this.getMaxAmendQuantity(entry)), ], })); }); } getFormControl(form, entry) { var _a, _b, _c; return ((_a = form.get('entries')) === null || _a === void 0 ? void 0 : _a.get((_c = (_b = entry.entryNumber) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : '')); } /** * As discussed, this calculation is moved to SPA side. * The calculation and validation should be in backend facade layer. */ getAmendedPrice(entry) { var _a, _b, _c; const amendedQuantity = this.getFormControl(this.form, entry).value; const amendedPrice = Object.assign({}, entry.basePrice); amendedPrice.value = Math.round(((_b = (_a = entry.basePrice) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : 0) * amendedQuantity * 100) / 100; amendedPrice.formattedValue = formatCurrency(amendedPrice.value, // TODO: user current language 'en', getCurrencySymbol((_c = amendedPrice.currencyIso) !== null && _c !== void 0 ? _c : '', 'narrow'), amendedPrice.currencyIso); return amendedPrice; } getMaxAmendQuantity(entry) { return ((this.isCancellation() ? entry.cancellableQuantity : entry.returnableQuantity) || entry.quantity || 0); } isCancellation() { return this.amendType === AmendOrderType.CANCEL; } } OrderAmendService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderAmendService, deps: [{ token: OrderDetailsService }], target: i0.ɵɵFactoryTarget.Injectable }); OrderAmendService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderAmendService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderAmendService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: OrderDetailsService }]; } }); class CancelOrReturnItemsComponent { constructor(orderAmendService) { this.orderAmendService = orderAmendService; this.isConfirmation = false; this.form$ = this.orderAmendService.getForm(); } getControl(form, entry) { var _a, _b, _c; const control = ((_a = form.get('entries')) === null || _a === void 0 ? void 0 : _a.get((_c = (_b = entry.entryNumber) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : '')); return control; } setAll(form) { this.entries.forEach((entry) => this.getControl(form, entry).setValue(this.getMaxAmendQuantity(entry))); } getItemPrice(entry) { return this.orderAmendService.getAmendedPrice(entry); } getMaxAmendQuantity(entry) { return this.orderAmendService.getMaxAmendQuantity(entry); } isCancellation() { return this.orderAmendService.isCancellation(); } } CancelOrReturnItemsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CancelOrReturnItemsComponent, deps: [{ token: OrderAmendService }], target: i0.ɵɵFactoryTarget.Component }); CancelOrReturnItemsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: CancelOrReturnItemsComponent, selector: "cx-amend-order-items", inputs: { entries: "entries", isConfirmation: "isConfirmation" }, ngImport: i0, template: "<div *ngIf=\"form$ | async as form\">\n <button\n *ngIf=\"!isConfirmation\"\n class=\"btn btn-link cx-action-link\"\n (click)=\"setAll(form)\"\n >\n {{ 'orderDetails.cancellationAndReturn.setAll' | cxTranslate }}\n </button>\n\n <div class=\"d-none d-md-block cx-item-list-header\">\n <div class=\"row\">\n <div class=\"text-left col-6\">\n {{ 'orderDetails.cancellationAndReturn.item' | cxTranslate }}\n </div>\n <div class=\"text-center col-2\">\n {{ 'orderDetails.cancellationAndReturn.itemPrice' | cxTranslate }}\n </div>\n <div *ngIf=\"!isConfirmation\" class=\"text-center col-2\">\n {{ 'orderDetails.cancellationAndReturn.quantity' | cxTranslate }}\n </div>\n <div class=\"cx-item-list-qty col-2 text-right\">\n {{\n (isCancellation()\n ? 'orderDetails.cancellationAndReturn.cancelQty'\n : 'orderDetails.cancellationAndReturn.returnQty'\n ) | cxTranslate\n }}\n </div>\n <div *ngIf=\"isConfirmation\" class=\"cx-item-list-total col-2\">\n {{ 'orderDetails.cancellationAndReturn.totalPrice' | cxTranslate }}\n </div>\n </div>\n </div>\n\n <div class=\"cx-item-list-row\" *ngFor=\"let item of entries; let i = index\">\n <div class=\"row cx-item-list-items\">\n <!-- Item Image -->\n <cx-media\n class=\"col-2\"\n [container]=\"item.product.images?.PRIMARY\"\n format=\"thumbnail\"\n ></cx-media>\n\n <!-- Item Information -->\n <div class=\"cx-info col-10\">\n <div class=\"cx-info-container row\">\n <!-- Item Description -->\n <div class=\"col-md-4 col-xl-5 cx-list-item-desc\">\n <div *ngIf=\"item.product.name\" class=\"cx-name\">\n {{ item.product.name }}\n </div>\n <div *ngIf=\"item.product.code\" class=\"cx-code\">\n {{ 'cartItems.id' | cxTranslate }} {{ item.product.code }}\n </div>\n <!-- Variants -->\n <ng-container *ngIf=\"item.product.baseOptions?.length\">\n <div\n *ngFor=\"\n let variant of item.product.baseOptions[0]?.selected\n ?.variantOptionQualifiers\n \"\n class=\"cx-property\"\n >\n <div class=\"cx-label\" *ngIf=\"variant.name\">\n {{ variant.name }}:\n </div>\n <div class=\"cx-value\" *ngIf=\"variant.value\">\n {{ variant.value }}\n </div>\n </div>\n </ng-container>\n </div>\n <!-- Price -->\n <div\n *ngIf=\"item.basePrice\"\n class=\"cx-price col-md-3 col-lg-3 col-xl-2\"\n >\n <div class=\"cx-label d-block d-md-none d-lg-none d-xl-none\">\n {{ 'orderDetails.cancellationAndReturn.itemPrice' | cxTranslate }}\n </div>\n <div *ngIf=\"item.basePrice\" class=\"cx-value\">\n {{ item.basePrice?.formattedValue }}\n </div>\n </div>\n <!-- item Quantity -->\n <div *ngIf=\"!isConfirmation\" class=\"cx-request-qty col-md-3\">\n <div\n class=\"cx-label d-block d-md-none d-lg-none d-xl-none\"\n placement=\"left\"\n title=\"{{ 'cartItems.quantityTitle' | cxTranslate }}\"\n >\n {{ 'orderDetails.cancellationAndReturn.quantity' | cxTranslate }}\n </div>\n <div class=\"cx-value\">\n {{ getMaxAmendQuantity(item) }}\n </div>\n </div>\n <!-- Amended Quantity -->\n <div class=\"cx-quantity col-xs-12 col-md-2 col-sm-12\">\n <div class=\"cx-label d-block d-md-none d-lg-none d-xl-none\">\n {{\n (isCancellation()\n ? 'orderDetails.cancellationAndReturn.cancelQty'\n : 'orderDetails.cancellationAndReturn.returnQty'\n ) | cxTranslate\n }}\n </div>\n\n <div\n *ngIf=\"isConfirmation\"\n class=\"w-100 text-center cx-order-quantity-value\"\n >\n {{ getControl(form, item).value }}\n </div>\n <cx-item-counter\n *ngIf=\"!isConfirmation\"\n [min]=\"0\"\n [max]=\"getMaxAmendQuantity(item)\"\n [control]=\"getControl(form, item)\"\n >\n </cx-item-counter>\n </div>\n <!-- Total Price -->\n <div *ngIf=\"isConfirmation\" class=\"cx-total col-3\">\n <div class=\"cx-label d-block d-md-none\">\n {{\n 'orderDetails.cancellationAndReturn.totalPrice' | cxTranslate\n }}\n </div>\n <div class=\"cx-value\">\n {{ getItemPrice(item)?.formattedValue }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", components: [{ type: i3$1.MediaComponent, selector: "cx-media", inputs: ["container", "format", "alt", "role", "loading"], outputs: ["loaded"] }, { type: i3$1.ItemCounterComponent, selector: "cx-item-counter", inputs: ["control", "min", "max", "step", "allowZero", "readonly"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i4.AsyncPipe, "cxTranslate": i1.TranslatePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CancelOrReturnItemsComponent, decorators: [{ type: Component, args: [{ selector: 'cx-amend-order-items', templateUrl: './amend-order-items.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }] }], ctorParameters: function () { return [{ type: OrderAmendService }]; }, propDecorators: { entries: [{ type: Input }], isConfirmation: [{ type: Input }] } }); class AmendOrderItemsModule { } AmendOrderItemsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: AmendOrderItemsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); AmendOrderItemsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: AmendOrderItemsModule, declarations: [CancelOrReturnItemsComponent], imports: [CommonModule, ReactiveFormsModule, I18nModule, MediaModule, ItemCounterModule, FeaturesConfigModule, FormErrorsModule], exports: [CancelOrReturnItemsComponent] }); AmendOrderItemsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: AmendOrderItemsModule, imports: [[ CommonModule, ReactiveFormsModule, I18nModule, MediaModule, ItemCounterModule, FeaturesConfigModule, FormErrorsModule, ]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: AmendOrderItemsModule, decorators: [{ type: NgModule, args: [{ imports: [ CommonModule, ReactiveFormsModule, I18nModule, MediaModule, ItemCounterModule, FeaturesConfigModule, FormErrorsModule, ], declarations: [CancelOrReturnItemsComponent], exports: [CancelOrReturnItemsComponent], }] }] }); class CancelOrderConfirmationComponent { constructor(orderAmendService) { this.orderAmendService = orderAmendService; this.form$ = this.orderAmendService .getForm() .pipe(tap((form) => (this.orderCode = form.value.orderCode))); this.entries$ = this.orderAmendService.getAmendedEntries(); } submit(form) { if (form.valid) { this.orderAmendService.save(); } else { form.markAllAsTouched(); } } } CancelOrderConfirmationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CancelOrderConfirmationComponent, deps: [{ token: OrderAmendService }], target: i0.ɵɵFactoryTarget.Component }); CancelOrderConfirmationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: CancelOrderConfirmationComponent, selector: "cx-cancel-order-confirmation", ngImport: i0, template: "<form\n *ngIf=\"form$ | async as form\"\n [formGroup]=\"form\"\n (ngSubmit)=\"submit(form)\"\n>\n <ng-container *ngTemplateOutlet=\"actions\"></ng-container>\n\n <cx-amend-order-items\n *ngIf=\"entries$ | async as entries\"\n [entries]=\"entries\"\n [isConfirmation]=\"true\"\n >\n </cx-amend-order-items>\n\n <ng-container *ngTemplateOutlet=\"actions\"></ng-container>\n\n <ng-template #actions>\n <cx-amend-order-actions\n *ngIf=\"orderCode\"\n [orderCode]=\"orderCode\"\n [amendOrderForm]=\"form\"\n backRoute=\"orderCancel\"\n ></cx-amend-order-actions>\n </ng-template>\n</form>\n", components: [{ type: CancelOrReturnItemsComponent, selector: "cx-amend-order-items", inputs: ["entries", "isConfirmation"] }, { type: AmendOrderActionsComponent, selector: "cx-amend-order-actions", inputs: ["orderCode", "amendOrderForm", "backRoute", "forwardRoute"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "async": i4.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CancelOrderConfirmationComponent, decorators: [{ type: Component, args: [{ selector: 'cx-cancel-order-confirmation', templateUrl: './cancel-order-confirmation.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }] }], ctorParameters: function () { return [{ type: OrderAmendService }]; } }); class OrderCancellationService extends OrderAmendService { constructor(orderDetailsService, userOrderService, routing, globalMessageService) { super(orderDetailsService); this.orderDetailsService = orderDetailsService; this.userOrderService = userOrderService; this.routing = routing; this.globalMessageService = globalMessageService; this.amendType = AmendOrderType.CANCEL; } /** * Return cancellable order entries. */ getEntries() { return this.getOrder().pipe(filter((order) => !!(order === null || order === void 0 ? void 0 : order.entries)), map((order) => { var _a, _b; return (_b = (_a = order.entries) === null || _a === void 0 ? void 0 : _a.filter((entry) => entry.entryNumber !== -1 && entry.cancellableQuantity && entry.cancellableQuantity > 0)) !== null && _b !== void 0 ? _b : []; })); } save() { const orderCode = this.form.value.orderCode; const entries = this.form.value.entries; const inputs = Object.keys(entries) .filter((entryNumber) => entries[entryNumber] > 0) .map((entryNumber) => ({ orderEntryNumber: Number(entryNumber), quantity: entries[entryNumber], })); this.form.reset(); this.userOrderService.cancelOrder(orderCode, { cancellationRequestEntryInputs: inputs, }); this.userOrderService .getCancelOrderSuccess() .pipe(first(Boolean)) .subscribe(() => this.afterSave(orderCode)); } afterSave(orderCode) { this.userOrderService.resetCancelOrderProcessState(); this.globalMessageService.add({ key: 'orderDetails.cancellationAndReturn.cancelSuccess', params: { orderCode }, }, GlobalMessageType.MSG_TYPE_CONFIRMATION); this.routing.go({ cxRoute: 'orders', }); } } OrderCancellationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderCancellationService, deps: [{ token: OrderDetailsService }, { token: i2.OrderFacade }, { token: i1.RoutingService }, { token: i1.GlobalMessageService }], target: i0.ɵɵFactoryTarget.Injectable }); OrderCancellationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderCancellationService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderCancellationService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: OrderDetailsService }, { type: i2.OrderFacade }, { type: i1.RoutingService }, { type: i1.GlobalMessageService }]; } }); class OrderCancellationGuard { constructor(orderAmendService, semanticPathService, router) { this.orderAmendService = orderAmendService; this.semanticPathService = semanticPathService; this.router = router; } canActivate() { return this.orderAmendService.getForm().pipe(map((form) => { if (!form.valid) { // the order code is not available in the route // as long as we're inside a guard, hence we redirect // to the common orders page. return this.router.parseUrl(this.semanticPathService.get('orders')); } else { return true; } })); } } OrderCancellationGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderCancellationGuard, deps: [{ token: OrderCancellationService }, { token: i1.SemanticPathService }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Injectable }); OrderCancellationGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderCancellationGuard, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderCancellationGuard, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: OrderCancellationService }, { type: i1.SemanticPathService }, { type: i3.Router }]; } }); class CancelOrderConfirmationModule { } CancelOrderConfirmationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CancelOrderConfirmationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); CancelOrderConfirmationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CancelOrderConfirmationModule, declarations: [CancelOrderConfirmationComponent], imports: [CommonModule, ReactiveFormsModule, AmendOrderItemsModule, AmendOrderActionsModule], exports: [CancelOrderConfirmationComponent] }); CancelOrderConfirmationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CancelOrderConfirmationModule, providers: [ provideDefaultConfig({ cmsComponents: { CancelOrderConfirmationComponent: { component: CancelOrderConfirmationComponent, guards: [AuthGuard, OrderCancellationGuard], providers: [ { provide: OrderAmendService, useExisting: OrderCancellationService, }, ], }, }, }), ], imports: [[ CommonModule, ReactiveFormsModule, AmendOrderItemsModule, AmendOrderActionsModule, ]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CancelOrderConfirmationModule, decorators: [{ type: NgModule, args: [{ imports: [ CommonModule, ReactiveFormsModule, AmendOrderItemsModule, AmendOrderActionsModule, ], providers: [ provideDefaultConfig({ cmsComponents: { CancelOrderConfirmationComponent: { component: CancelOrderConfirmationComponent, guards: [AuthGuard, OrderCancellationGuard], providers: [ { provide: OrderAmendService, useExisting: OrderCancellationService, }, ], }, }, }), ], declarations: [CancelOrderConfirmationComponent], exports: [CancelOrderConfirmationComponent], }] }] }); class CancelOrderComponent { constructor(orderAmendService) { this.orderAmendService = orderAmendService; this.form$ = this.orderAmendService .getForm() .pipe(tap((form) => (this.orderCode = form.value.orderCode))); this.entries$ = this.orderAmendService.getEntries(); } } CancelOrderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CancelOrderComponent, deps: [{ token: OrderAmendService }], target: i0.ɵɵFactoryTarget.Component }); CancelOrderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: CancelOrderComponent, selector: "cx-cancel-order", ngImport: i0, template: "<ng-container *ngIf=\"form$ | async as form\">\n <ng-container *ngTemplateOutlet=\"actions\"></ng-container>\n\n <cx-amend-order-items *ngIf=\"entries$ | async as entries\" [entries]=\"entries\">\n </cx-amend-order-items>\n\n <cx-form-errors\n aria-live=\"assertive\"\n aria-atomic=\"true\"\n [control]=\"form.get('entries')\"\n ></cx-form-errors>\n\n <ng-container *ngTemplateOutlet=\"actions\"></ng-container>\n\n <ng-template #actions>\n <cx-amend-order-actions\n *ngIf=\"orderCode\"\n [orderCode]=\"orderCode\"\n [amendOrderForm]=\"form\"\n backRoute=\"orderDetails\"\n forwardRoute=\"orderCancelConfirmation\"\n ></cx-amend-order-actions>\n </ng-template>\n</ng-container>\n", components: [{ type: CancelOrReturnItemsComponent, selector: "cx-amend-order-items", inputs: ["entries", "isConfirmation"] }, { type: i3$1.FormErrorsComponent, selector: "cx-form-errors", inputs: ["prefix", "translationParams", "control"] }, { type: AmendOrderActionsComponent, selector: "cx-amend-order-actions", inputs: ["orderCode", "amendOrderForm", "backRoute", "forwardRoute"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "async": i4.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CancelOrderComponent, decorators: [{ type: Component, args: [{ selector: 'cx-cancel-order', templateUrl: './cancel-order.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }] }], ctorParameters: function () { return [{ type: OrderAmendService }]; } }); class CancelOrderModule { } CancelOrderModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CancelOrderModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); CancelOrderModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CancelOrderModule, declarations: [CancelOrderComponent], imports: [CommonModule, AmendOrderItemsModule, AmendOrderActionsModule, FormErrorsModule], exports: [CancelOrderComponent] }); CancelOrderModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CancelOrderModule, providers: [ provideDefaultConfig({ cmsComponents: { CancelOrderComponent: { component: CancelOrderComponent, guards: [AuthGuard], providers: [ { provide: OrderAmendService, useExisting: OrderCancellationService, }, ], }, }, }), ], imports: [[ CommonModule, AmendOrderItemsModule, AmendOrderActionsModule, FormErrorsModule, ]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: CancelOrderModule, decorators: [{ type: NgModule, args: [{ imports: [ CommonModule, AmendOrderItemsModule, AmendOrderActionsModule, FormErrorsModule, ], providers: [ provideDefaultConfig({ cmsComponents: { CancelOrderComponent: { component: CancelOrderComponent, guards: [AuthGuard], providers: [ { provide: OrderAmendService, useExisting: OrderCancellationService, }, ], }, }, }), ], declarations: [CancelOrderComponent], exports: [CancelOrderComponent], }] }] }); class OrderCancellationModule { } OrderCancellationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderCancellationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); OrderCancellationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderCancellationModule, imports: [CancelOrderModule, CancelOrderConfirmationModule] }); OrderCancellationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderCancellationModule, imports: [[CancelOrderModule, CancelOrderConfirmationModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderCancellationModule, decorators: [{ type: NgModule, args: [{ imports: [CancelOrderModule, CancelOrderConfirmationModule], }] }] }); class OrderReturnService extends OrderAmendService { constructor(orderDetailsService, returnRequestService, routing, globalMessageService) { super(orderDetailsService); this.orderDetailsService = orderDetailsService; this.returnRequestService = returnRequestService; this.routing = routing; this.globalMessageService = globalMessageService; this.amendType = AmendOrderType.RETURN; } getEntries() { return this.getOrder().pipe(filter((order) => !!order.entries), map((order) => { var _a, _b; return (_b = (_a = order.entries) === null || _a === void 0 ? void 0 : _a.filter((entry) => entry.entryNumber !== -1 && entry.returnableQuantity && entry.returnableQuantity > 0)) !== null && _b !== void 0 ? _b : []; })); } save() { const orderCode = this.form.value.orderCode; const entries = this.form.value.entries; const inputs = Object.keys(entries) .filter((entryNumber) => entries[entryNumber] > 0) .map((entryNumber) => ({ orderEntryNumber: Number(entryNumber), quantity: entries[entryNumber], })); this.form.reset(); this.returnRequestService.createOrderReturnRequest({ orderCode, returnRequestEntryInputs: inputs, }); this.returnRequestService .getReturnRequestSuccess() .pipe(first(Boolean)) .subscribe(() => this.afterSave()); } afterSave() { this.returnRequestService .getOrderReturnRequest() .pipe(first((r) => !!r)) .subscribe((returnRequest) => { const rma = returnRequest.rma; this.globalMessageService.add({ key: 'orderDetails.cancellationAndReturn.returnSuccess', params: { rma }, }, GlobalMessageType.MSG_TYPE_CONFIRMATION); this.routing.go({ cxRoute: 'returnRequestDetails', params: { rma }, }); }); } } OrderReturnService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderReturnService, deps: [{ token: OrderDetailsService }, { token: i2.OrderReturnRequestFacade }, { token: i1.RoutingService }, { token: i1.GlobalMessageService }], target: i0.ɵɵFactoryTarget.Injectable }); OrderReturnService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderReturnService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderReturnService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: OrderDetailsService }, { type: i2.OrderReturnRequestFacade }, { type: i1.RoutingService }, { type: i1.GlobalMessageService }]; } }); class OrderReturnGuard { constructor(orderAmendService, semanticPathService, router) { this.orderAmendService = orderAmendService; this.semanticPathService = semanticPathService; this.router = router; } canActivate() { return this.orderAmendService.getForm().pipe(map((form) => { if (!form.valid) { // the order code is not available in the route // as long as we're inside a guard, hence we redirect // to the common orders page. return this.router.parseUrl(this.semanticPathService.get('orders')); } else { return true; } })); } } OrderReturnGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderReturnGuard, deps: [{ token: OrderReturnService }, { token: i1.SemanticPathService }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Injectable }); OrderReturnGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderReturnGuard, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: OrderReturnGuard, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: OrderReturnService }, { type: i1.SemanticPathService }, { type: i3.Router }]; } }); class ReturnOrderConfirmationComponent { constructor(orderAmendService) { this.orderAmendService = orderAmendService; this.form$ = this.orderAmendService .getForm() .pipe(tap((form) => (this.orderCode = form.value.orderCode))); this.entries$ = this.orderAmendService.getAmendedEntries(); } submit(form) { form.disable(); this.orderAmendService.save(); } } ReturnOrderConfirmationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ReturnOrderConfirmationComponent, deps: [{ token: OrderAmendService }], target: i0.ɵɵFactoryTarget.Component }); ReturnOrderConfirmationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: ReturnOrderConfirmationComponent, selector: "cx-return-order-confirmation", ngImport: i0, template: "<form\n *ngIf=\"form$ | async as form\"\n [formGroup]=\"form\"\n (ngSubmit)=\"submit(form)\"\n>\n <ng-container *ngTemplateOutlet=\"actions\"></ng-container>\n\n <cx-amend-order-items\n *ngIf=\"entries$ | async as entries\"\n [entries]=\"entries\"\n [isConfirmation]=\"true\"\n >\n </cx-amend-order-items>\n\n <ng-container *ngTemplateOutlet=\"actions\"></ng-container>\n\n <ng-template #actions>\n <cx-amend-order-actions\n *ngIf=\"orderCode\"\n [orderCode]=\"orderCode\"\n [amendOrderForm]=\"form\"\n backRoute=\"orderReturn\"\n ></cx-amend-order-actions>\n </ng-template>\n</form>\n", components: [{ type: CancelOrReturnItemsComponent, selector: "cx-amend-order-items", inputs: ["entries", "isConfirmation"] }, { type: AmendOrderActionsComponent, selector: "cx-amend-order-actions", inputs: ["orderCode", "amendOrderForm", "backRoute", "forwardRoute"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "async": i4.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ReturnOrderConfirmationComponent, decorators: [{ type: Component, args: [{ selector: 'cx-return-order-confirmation', templateUrl: './return-order-confirmation.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }] }], ctorParameters: function () { return [{ type: OrderAmendService }]; } }); class ReturnOrderConfirmationModule { } ReturnOrderConfirmationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ReturnOrderConfirmationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); ReturnOrderConfirmationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ReturnOrderConfirmationModule, declarations: [ReturnOrderConfirmationComponent], imports: [CommonModule, AmendOrderItemsModule, I18nModule, ReactiveFormsModule, AmendOrderActionsModule], exports: [ReturnOrderConfirmationComponent] }); ReturnOrderConfirmationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ReturnOrderConfirmationModule, providers: [ provideDefaultConfig({ cmsComponents: { ReturnOrderConfirmationComponent: { component: ReturnOrderConfirmationComponent, guards: [AuthGuard, OrderReturnGuard], providers: [ { provide: OrderAmendService, useExisting: OrderReturnService, }, ], }, }, }), ], imports: [[ CommonModule, AmendOrderItemsModule, I18nModule, ReactiveFormsModule, AmendOrderActionsModule, ]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ReturnOrderConfirmationModule, decorators: [{ type: NgModule, args: [{ imports: [ CommonModule, AmendOrderItemsModule, I18nModule, ReactiveFormsModule, AmendOrderActionsModule, ], providers: [ provideDefaultConfig({ cmsComponents: { ReturnOrderConfirmationComponent: { component: ReturnOrderConfirmationComponent, guards: [AuthGuard, OrderReturnGuard], providers: [ { provide: OrderAmendService, useExisting: OrderReturnService, }, ], }, }, }), ], declarations: [ReturnOrderConfirmationComponent], exports: [ReturnOrderConfirmationComponent], }] }] }); class ReturnOrderComponent { constructor(orderAmendService) { this.orderAmendService = orderAmendService; this.form$ = this.orderAmendService .getForm() .pipe(tap((form) => (this.orderCode = form.value.orderCode))); this.entries$ = this.orderAmendService.getEntries(); } } ReturnOrderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ReturnOrderComponent, deps: [{ token: OrderAmendService }], target: i0.ɵɵFactoryTarget.Component }); ReturnOrderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: ReturnOrderComponent, selector: "cx-return-order", ngImport: i0, template: "<ng-container *ngIf=\"form$ | async as form\">\n <ng-container *ngTemplateOutlet=\"actions\"></ng-container>\n\n <cx-amend-order-items *ngIf=\"entries$ | async as entries\" [entries]=\"entries\">\n </cx-amend-order-items>\n\n <cx-form-errors\n aria-live=\"assertive\"\n aria-atomic=\"true\"\n [control]=\"form.get('entries')\"\n ></cx-form-errors>\n\n <ng-container *ngTemplateOutlet=\"actions\"></ng-container>\n\n <ng-template #actions>\n <cx-amend-order-actions\n *ngIf=\"orderCode\"\n [orderCode]=\"orderCode\"\n [amendOrderForm]=\"form\"\n backRoute=\"orderDetails\"\n forwardRoute=\"orderReturnConfirmation\"\n ></cx-amend-order-actions>\n </ng-template>\n</ng-container>\n", components: [{ type: CancelOrReturnItemsComponent, selector: "cx-amend-order-items", inputs: ["entries", "isConfirmation"] }, { type: i3$1.FormErrorsComponent, selector: "cx-form-errors", inputs: ["prefix", "translationParams", "control"] }, { type: AmendOrderActionsComponent, selector: "cx-amend-order-actions", inputs: ["orderCode", "amendOrderForm", "backRoute", "forwardRoute"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "async": i4.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ReturnOrderComponent, decorators: [{ type: Component, args: [{ selector: 'cx-return-order', template