UNPKG

@spartacus/cart

Version:

`@spartacus/cart` is a package that you can include in your application, which allows you to use various cart features.

74 lines 16.8 kB
import { ChangeDetectionStrategy, Component } from '@angular/core'; import { ICON_TYPE, OrderEntriesSource, ProductImportStatus, } from '@spartacus/storefront'; import { BehaviorSubject } from 'rxjs'; import { finalize, pluck } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@spartacus/storefront"; import * as i2 from "./import-to-new-saved-cart-form/import-to-new-saved-cart-form.component"; import * as i3 from "./import-entries-form/import-entries-form.component"; import * as i4 from "./import-entries-summary/import-entries-summary.component"; import * as i5 from "@angular/common"; import * as i6 from "@spartacus/core"; export class ImportEntriesDialogComponent { constructor(launchDialogService) { this.launchDialogService = launchDialogService; this.iconTypes = ICON_TYPE; this.focusConfig = { trap: true, block: true, autofocus: 'button', focusOnEscape: true, }; this.formState = true; this.summary$ = new BehaviorSubject({ loading: false, cartName: '', count: 0, total: 0, successesCount: 0, warningMessages: [], errorMessages: [], }); this.context$ = this.launchDialogService.data$.pipe(pluck('orderEntriesContext')); } isNewCartForm(context) { return context.type === OrderEntriesSource.NEW_SAVED_CART; } close(reason) { this.launchDialogService.closeDialog(reason); } importProducts(context, { products, savedCartInfo, }) { this.formState = false; this.summary$.next(Object.assign(Object.assign({}, this.summary$.value), { loading: true, total: products.length, cartName: savedCartInfo === null || savedCartInfo === void 0 ? void 0 : savedCartInfo.name })); context .addEntries(products, savedCartInfo) .pipe(finalize(() => { this.summary$.next(Object.assign(Object.assign({}, this.summary$.value), { loading: false })); })) .subscribe((action) => { this.populateSummary(action); }); } populateSummary(action) { if (action.statusCode === ProductImportStatus.SUCCESS) { this.summary$.next(Object.assign(Object.assign({}, this.summary$.value), { count: this.summary$.value.count + 1, successesCount: this.summary$.value.successesCount + 1 })); } else if (action.statusCode === ProductImportStatus.LOW_STOCK) { this.summary$.next(Object.assign(Object.assign({}, this.summary$.value), { count: this.summary$.value.count + 1, warningMessages: [...this.summary$.value.warningMessages, action] })); } else { this.summary$.next(Object.assign(Object.assign({}, this.summary$.value), { count: this.summary$.value.count + 1, errorMessages: [...this.summary$.value.errorMessages, action] })); } } } ImportEntriesDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ImportEntriesDialogComponent, deps: [{ token: i1.LaunchDialogService }], target: i0.ɵɵFactoryTarget.Component }); ImportEntriesDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: ImportEntriesDialogComponent, selector: "cx-import-entries-dialog", ngImport: i0, template: "<div\n [cxFocus]=\"focusConfig\"\n (esc)=\"close('Escape clicked')\"\n class=\"cx-import-entries-dialog\"\n>\n <div class=\"cx-import-entries-container\">\n <!-- Modal Header -->\n <div class=\"modal-header cx-import-entries-header\">\n <ng-container>\n <div class=\"cx-import-entries-title modal-title\">\n {{ 'importEntriesDialog.importProducts' | cxTranslate }}\n </div>\n </ng-container>\n\n <button\n (click)=\"close('Close Import Products Dialog')\"\n [attr.aria-label]=\"'importEntriesDialog.close' | cxTranslate\"\n class=\"cx-import-entries-close close\"\n type=\"button\"\n [disabled]=\"(summary$ | async)?.loading\"\n >\n <span aria-hidden=\"true\">\n <cx-icon [type]=\"iconTypes.CLOSE\"></cx-icon>\n </span>\n </button>\n </div>\n\n <!-- Modal Body -->\n <ng-container *ngIf=\"context$ | async as context\">\n <ng-container *ngIf=\"formState; else importSummary\">\n <cx-import-to-new-saved-cart-form\n *ngIf=\"isNewCartForm(context); else reducedForm\"\n [type]=\"context.type\"\n (submitEvent)=\"importProducts(context, $event)\"\n ></cx-import-to-new-saved-cart-form>\n <ng-template #reducedForm>\n <cx-import-entries-form\n [type]=\"context.type\"\n (submitEvent)=\"importProducts(context, $event)\"\n ></cx-import-entries-form>\n </ng-template>\n </ng-container>\n\n <ng-template #importSummary>\n <cx-import-entries-summary\n [summary]=\"summary$ | async\"\n [type]=\"context.type\"\n (closeEvent)=\"close('Close Import Products Dialog')\"\n ></cx-import-entries-summary>\n </ng-template>\n </ng-container>\n </div>\n</div>\n", components: [{ type: i1.IconComponent, selector: "cx-icon,[cxIcon]", inputs: ["cxIcon", "type"] }, { type: i2.ImportToNewSavedCartFormComponent, selector: "cx-import-to-new-saved-cart-form", outputs: ["submitEvent"] }, { type: i3.ImportEntriesFormComponent, selector: "cx-import-entries-form", inputs: ["type"], outputs: ["submitEvent"] }, { type: i4.ImportEntriesSummaryComponent, selector: "cx-import-entries-summary", inputs: ["type", "summary"], outputs: ["closeEvent"] }], directives: [{ type: i1.FocusDirective, selector: "[cxFocus]", inputs: ["cxFocus"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "cxTranslate": i6.TranslatePipe, "async": i5.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ImportEntriesDialogComponent, decorators: [{ type: Component, args: [{ selector: 'cx-import-entries-dialog', templateUrl: './import-entries-dialog.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }] }], ctorParameters: function () { return [{ type: i1.LaunchDialogService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LWVudHJpZXMtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2ZlYXR1cmUtbGlicy9jYXJ0L2ltcG9ydC1leHBvcnQvY29tcG9uZW50cy9pbXBvcnQtdG8tY2FydC9pbXBvcnQtZW50cmllcy1kaWFsb2cvaW1wb3J0LWVudHJpZXMtZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2ZlYXR1cmUtbGlicy9jYXJ0L2ltcG9ydC1leHBvcnQvY29tcG9uZW50cy9pbXBvcnQtdG8tY2FydC9pbXBvcnQtZW50cmllcy1kaWFsb2cvaW1wb3J0LWVudHJpZXMtZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUdMLFNBQVMsRUFFVCxrQkFBa0IsRUFHbEIsbUJBQW1CLEdBRXBCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQU9qRCxNQUFNLE9BQU8sNEJBQTRCO0lBdUJ2QyxZQUFzQixtQkFBd0M7UUFBeEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQXRCOUQsY0FBUyxHQUFHLFNBQVMsQ0FBQztRQUN0QixnQkFBVyxHQUFnQjtZQUN6QixJQUFJLEVBQUUsSUFBSTtZQUNWLEtBQUssRUFBRSxJQUFJO1lBQ1gsU0FBUyxFQUFFLFFBQVE7WUFDbkIsYUFBYSxFQUFFLElBQUk7U0FDcEIsQ0FBQztRQUVGLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFDMUIsYUFBUSxHQUFHLElBQUksZUFBZSxDQUF1QjtZQUNuRCxPQUFPLEVBQUUsS0FBSztZ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QkFMeEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsMEJBQTBCO29CQUNwQyxXQUFXLEVBQUUsd0NBQXdDO29CQUNyRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBZGRPcmRlckVudHJpZXNDb250ZXh0LFxuICBGb2N1c0NvbmZpZyxcbiAgSUNPTl9UWVBFLFxuICBMYXVuY2hEaWFsb2dTZXJ2aWNlLFxuICBPcmRlckVudHJpZXNTb3VyY2UsXG4gIFByb2R1Y3REYXRhLFxuICBQcm9kdWN0SW1wb3J0SW5mbyxcbiAgUHJvZHVjdEltcG9ydFN0YXR1cyxcbiAgUHJvZHVjdEltcG9ydFN1bW1hcnksXG59IGZyb20gJ0BzcGFydGFjdXMvc3RvcmVmcm9udCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbmFsaXplLCBwbHVjayB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3gtaW1wb3J0LWVudHJpZXMtZGlhbG9nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltcG9ydC1lbnRyaWVzLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBJbXBvcnRFbnRyaWVzRGlhbG9nQ29tcG9uZW50IHtcbiAgaWNvblR5cGVzID0gSUNPTl9UWVBFO1xuICBmb2N1c0NvbmZpZzogRm9jdXNDb25maWcgPSB7XG4gICAgdHJhcDogdHJ1ZSxcbiAgICBibG9jazogdHJ1ZSxcbiAgICBhdXRvZm9jdXM6ICdidXR0b24nLFxuICAgIGZvY3VzT25Fc2NhcGU6IHRydWUsXG4gIH07XG5cbiAgZm9ybVN0YXRlOiBib29sZWFuID0gdHJ1ZTtcbiAgc3VtbWFyeSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFByb2R1Y3RJbXBvcnRTdW1tYXJ5Pih7XG4gICAgbG9hZGluZzogZmFsc2UsXG4gICAgY2FydE5hbWU6ICcnLFxuICAgIGNvdW50OiAwLFxuICAgIHRvdGFsOiAwLFxuICAgIHN1Y2Nlc3Nlc0NvdW50OiAwLFxuICAgIHdhcm5pbmdNZXNzYWdlczogW10sXG4gICAgZXJyb3JNZXNzYWdlczogW10sXG4gIH0pO1xuXG4gIGNvbnRleHQkOiBPYnNlcnZhYmxlPEFkZE9yZGVyRW50cmllc0NvbnRleHQ+ID1cbiAgICB0aGlzLmxhdW5jaERpYWxvZ1NlcnZpY2UuZGF0YSQucGlwZShwbHVjaygnb3JkZXJFbnRyaWVzQ29udGV4dCcpKTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgbGF1bmNoRGlhbG9nU2VydmljZTogTGF1bmNoRGlhbG9nU2VydmljZSkge31cblxuICBpc05ld0NhcnRGb3JtKGNvbnRleHQ6IEFkZE9yZGVyRW50cmllc0NvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dC50eXBlID09PSBPcmRlckVudHJpZXNTb3VyY2UuTkVXX1NBVkVEX0NBUlQ7XG4gIH1cblxuICBjbG9zZShyZWFzb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubGF1bmNoRGlhbG9nU2VydmljZS5jbG9zZURpYWxvZyhyZWFzb24pO1xuICB9XG5cbiAgaW1wb3J0UHJvZHVjdHMoXG4gICAgY29udGV4dDogQWRkT3JkZXJFbnRyaWVzQ29udGV4dCxcbiAgICB7XG4gICAgICBwcm9kdWN0cyxcbiAgICAgIHNhdmVkQ2FydEluZm8sXG4gICAgfToge1xuICAgICAgcHJvZHVjdHM6IFByb2R1Y3REYXRhW107XG4gICAgICBzYXZlZENhcnRJbmZvPzoge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICB9O1xuICAgIH1cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtU3RhdGUgPSBmYWxzZTtcbiAgICB0aGlzLnN1bW1hcnkkLm5leHQoe1xuICAgICAgLi4udGhpcy5zdW1tYXJ5JC52YWx1ZSxcbiAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICB0b3RhbDogcHJvZHVjdHMubGVuZ3RoLFxuICAgICAgY2FydE5hbWU6IHNhdmVkQ2FydEluZm8/Lm5hbWUsXG4gICAgfSk7XG4gICAgY29udGV4dFxuICAgICAgLmFkZEVudHJpZXMocHJvZHVjdHMsIHNhdmVkQ2FydEluZm8pXG4gICAgICAucGlwZShcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3VtbWFyeSQubmV4dCh7XG4gICAgICAgICAgICAuLi50aGlzLnN1bW1hcnkkLnZhbHVlLFxuICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChhY3Rpb246IFByb2R1Y3RJbXBvcnRJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMucG9wdWxhdGVTdW1tYXJ5KGFjdGlvbik7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3B1bGF0ZVN1bW1hcnkoYWN0aW9uOiBQcm9kdWN0SW1wb3J0SW5mbyk6IHZvaWQge1xuICAgIGlmIChhY3Rpb24uc3RhdHVzQ29kZSA9PT0gUHJvZHVjdEltcG9ydFN0YXR1cy5TVUNDRVNTKSB7XG4gICAgICB0aGlzLnN1bW1hcnkkLm5leHQoe1xuICAgICAgICAuLi50aGlzLnN1bW1hcnkkLnZhbHVlLFxuICAgICAgICBjb3VudDogdGhpcy5zdW1tYXJ5JC52YWx1ZS5jb3VudCArIDEsXG4gICAgICAgIHN1Y2Nlc3Nlc0NvdW50OiB0aGlzLnN1bW1hcnkkLnZhbHVlLnN1Y2Nlc3Nlc0NvdW50ICsgMSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uLnN0YXR1c0NvZGUgPT09IFByb2R1Y3RJbXBvcnRTdGF0dXMuTE9XX1NUT0NLKSB7XG4gICAgICB0aGlzLnN1bW1hcnkkLm5leHQoe1xuICAgICAgICAuLi50aGlzLnN1bW1hcnkkLnZhbHVlLFxuICAgICAgICBjb3VudDogdGhpcy5zdW1tYXJ5JC52YWx1ZS5jb3VudCArIDEsXG4gICAgICAgIHdhcm5pbmdNZXNzYWdlczogWy4uLnRoaXMuc3VtbWFyeSQudmFsdWUud2FybmluZ01lc3NhZ2VzLCBhY3Rpb25dLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3VtbWFyeSQubmV4dCh7XG4gICAgICAgIC4uLnRoaXMuc3VtbWFyeSQudmFsdWUsXG4gICAgICAgIGNvdW50OiB0aGlzLnN1bW1hcnkkLnZhbHVlLmNvdW50ICsgMSxcbiAgICAgICAgZXJyb3JNZXNzYWdlczogWy4uLnRoaXMuc3VtbWFyeSQudmFsdWUuZXJyb3JNZXNzYWdlcywgYWN0aW9uXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBbY3hGb2N1c109XCJmb2N1c0NvbmZpZ1wiXG4gIChlc2MpPVwiY2xvc2UoJ0VzY2FwZSBjbGlja2VkJylcIlxuICBjbGFzcz1cImN4LWltcG9ydC1lbnRyaWVzLWRpYWxvZ1wiXG4+XG4gIDxkaXYgY2xhc3M9XCJjeC1pbXBvcnQtZW50cmllcy1jb250YWluZXJcIj5cbiAgICA8IS0tIE1vZGFsIEhlYWRlciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGN4LWltcG9ydC1lbnRyaWVzLWhlYWRlclwiPlxuICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImN4LWltcG9ydC1lbnRyaWVzLXRpdGxlIG1vZGFsLXRpdGxlXCI+XG4gICAgICAgICAge3sgJ2ltcG9ydEVudHJpZXNEaWFsb2cuaW1wb3J0UHJvZHVjdHMnIHwgY3hUcmFuc2xhdGUgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICAoY2xpY2spPVwiY2xvc2UoJ0Nsb3NlIEltcG9ydCBQcm9kdWN0cyBEaWFsb2cnKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2ltcG9ydEVudHJpZXNEaWFsb2cuY2xvc2UnIHwgY3hUcmFuc2xhdGVcIlxuICAgICAgICBjbGFzcz1cImN4LWltcG9ydC1lbnRyaWVzLWNsb3NlIGNsb3NlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIoc3VtbWFyeSQgfCBhc3luYyk/LmxvYWRpbmdcIlxuICAgICAgPlxuICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICA8Y3gtaWNvbiBbdHlwZV09XCJpY29uVHlwZXMuQ0xPU0VcIj48L2N4LWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBNb2RhbCBCb2R5IC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZXh0JCB8IGFzeW5jIGFzIGNvbnRleHRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtU3RhdGU7IGVsc2UgaW1wb3J0U3VtbWFyeVwiPlxuICAgICAgICA8Y3gtaW1wb3J0LXRvLW5ldy1zYXZlZC1jYXJ0LWZvcm1cbiAgICAgICAgICAqbmdJZj1cImlzTmV3Q2FydEZvcm0oY29udGV4dCk7IGVsc2UgcmVkdWNlZEZvcm1cIlxuICAgICAgICAgIFt0eXBlXT1cImNvbnRleHQudHlwZVwiXG4gICAgICAgICAgKHN1Ym1pdEV2ZW50KT1cImltcG9ydFByb2R1Y3RzKGNvbnRleHQsICRldmVudClcIlxuICAgICAgICA+PC9jeC1pbXBvcnQtdG8tbmV3LXNhdmVkLWNhcnQtZm9ybT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNyZWR1Y2VkRm9ybT5cbiAgICAgICAgICA8Y3gtaW1wb3J0LWVudHJpZXMtZm9ybVxuICAgICAgICAgICAgW3R5cGVdPVwiY29udGV4dC50eXBlXCJcbiAgICAgICAgICAgIChzdWJtaXRFdmVudCk9XCJpbXBvcnRQcm9kdWN0cyhjb250ZXh0LCAkZXZlbnQpXCJcbiAgICAgICAgICA+PC9jeC1pbXBvcnQtZW50cmllcy1mb3JtPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjaW1wb3J0U3VtbWFyeT5cbiAgICAgICAgPGN4LWltcG9ydC1lbnRyaWVzLXN1bW1hcnlcbiAgICAgICAgICBbc3VtbWFyeV09XCJzdW1tYXJ5JCB8IGFzeW5jXCJcbiAgICAgICAgICBbdHlwZV09XCJjb250ZXh0LnR5cGVcIlxuICAgICAgICAgIChjbG9zZUV2ZW50KT1cImNsb3NlKCdDbG9zZSBJbXBvcnQgUHJvZHVjdHMgRGlhbG9nJylcIlxuICAgICAgICA+PC9jeC1pbXBvcnQtZW50cmllcy1zdW1tYXJ5PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==