UNPKG

@vendasta/store

Version:

Components and data for Store

208 lines 18.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, EventEmitter, Input, Output, ChangeDetectorRef } from '@angular/core'; import { isNullOrUndefined } from 'util'; import { BillingService, buildBilledProductFromProductPricingAndAddon } from '@vendasta/core/billing'; export class VaAddonListComponent { /** * @param {?} billingService * @param {?} cdr */ constructor(billingService, cdr) { this.billingService = billingService; this.cdr = cdr; this.showPricing = true; this._hasVerifiedContract = null; this._canAccessContractPricing = null; this.addonSelected = new EventEmitter(); this.billedProductsMap = new Map(); this.billedProductLoaded = new Map(); this.subscriptions = []; } /** * @param {?} addons * @return {?} */ set addons(addons) { this._addons = addons; this.populateBilledProduct(); } /** * @param {?} value * @return {?} */ set hasVerifiedContract(value) { this._hasVerifiedContract = value; this.populateBilledProduct(); } /** * @param {?} value * @return {?} */ set canAccessContractPricing(value) { this._canAccessContractPricing = value; this.populateBilledProduct(); } /** * @return {?} */ ngOnInit() { this.populateBilledProduct(); } /** * @return {?} */ populateBilledProduct() { if (this.displayContractPricing()) { /** @type {?} */ const billingIDs = this._addons.map(a => { this.billedProductsMap.set(a.addonId, null); this.billedProductLoaded.set(a.addonId, false); return a.billingId; }); this.subscriptions.push(this.billingService.getMultiProductPricing(this.partnerID, billingIDs).subscribe(pricing => { this._addons.forEach(addon => { /** @type {?} */ const addonPricing = pricing[addon.billingId]; if (!addonPricing) { return; } /** @type {?} */ const billedProduct = buildBilledProductFromProductPricingAndAddon(addon, addonPricing); this.billedProductsMap.set(addon.addonId, billedProduct); this.billedProductLoaded.set(addon.addonId, true); }); this.cdr.detectChanges(); })); } } /** * @param {?} addonId * @return {?} */ onClick(addonId) { this.addonSelected.emit(addonId); } /** * @param {?} object * @return {?} */ instanceOfPricing(object) { if (typeof object === 'number') { return false; } return object.currency !== undefined && object.prices !== undefined; } /** * @param {?} addon * @return {?} */ getDisplayPricing(addon) { /** @type {?} */ const price = addon.price; if (price && this.instanceOfPricing(price)) { return price; } return { currency: addon.currency, prices: [ { price: addon.price, frequency: addon.billingFrequency ? addon.billingFrequency : 'Monthly' } ] }; } /** * @return {?} */ noData() { return isNullOrUndefined(this._hasVerifiedContract) || isNullOrUndefined(this._canAccessContractPricing); } /** * @return {?} */ displayContractPricing() { return this._canAccessContractPricing && this._hasVerifiedContract; } /** * @param {?} addon * @return {?} */ isBilledProductLoaded(addon) { if (this.noData()) { return false; } if (this.displayContractPricing()) { /** @type {?} */ const value = this.billedProductLoaded.get(addon.addonId); return value ? value : false; } return true; } /** * @return {?} */ ngOnDestroy() { this.subscriptions.forEach(subscription => subscription.unsubscribe()); } } VaAddonListComponent.decorators = [ { type: Component, args: [{ selector: 'va-addon-list', template: "<mat-list *ngIf=\"_addons\" class=\"addon-list\">\n <mat-divider></mat-divider>\n <ng-container *ngFor=\"let addon of _addons\">\n <mat-list-item (click)=\"onClick(addon.addonId)\">\n <div class=\"addon-icon-title\">\n <img *ngIf=\"addon.icon;else noIcon\" class=\"addon-icon\" [src]=\"addon.icon\" mat-list-avatar/>\n <ng-template #noIcon>\n <mat-icon class=\"addon-default-icon\" mat-list-icon>add_circle</mat-icon>\n </ng-template>\n <div class=\"addon-title-tagline\">\n <p class=\"addon-title\" matLine>{{ addon.title }} </p>\n <p class=\"addon-tagline\" matLine>{{ addon.tagline }}</p>\n </div>\n </div>\n <div *ngIf=\"showPricing\" class=\"price-section\">\n <va-pricing\n [pricing]=\"getDisplayPricing(addon)\"\n [highlightPrice]=\"false\"\n [hasVerifiedContract]=\"_hasVerifiedContract\"\n [billedProduct]=\"billedProductsMap.get(addon.addonId)\"\n [loaded]=\"isBilledProductLoaded(addon)\">\n </va-pricing>\n </div>\n </mat-list-item>\n <mat-divider></mat-divider>\n </ng-container>\n</mat-list>\n", styles: [":host{display:block}h2+:host{margin:-8px 0}:host ::ng-deep .mat-list-item.mat-2-line{height:auto!important}:host ::ng-deep .mat-list .mat-list-item .mat-list-item-content{padding:8px;align-items:flex-start;flex-direction:column}@media screen and (min-width:800px){:host ::ng-deep .mat-list .mat-list-item .mat-list-item-content{flex-direction:row}}.addon-list{position:relative}.addon-default-icon{margin:0 5px;color:#4caf50}.addon-icon{width:32px;height:32px}.addon-icon-title{flex-grow:1;display:flex;width:100%}@media screen and (min-width:800px){.addon-icon-title{width:auto}}.addon-title-tagline{padding:0 16px 10px 8px;flex-grow:1}.addon-title-tagline .addon-title{color:#212121;font-size:16px;line-height:1.2;margin:6px 0;white-space:normal}.addon-title-tagline .addon-tagline{color:#616161;font-size:14px;margin:0;white-space:normal}.price-section{min-width:10em;margin-top:6px;flex-shrink:0}mat-list-item:hover{background-color:#fafafa!important;cursor:pointer!important}"] }] } ]; /** @nocollapse */ VaAddonListComponent.ctorParameters = () => [ { type: BillingService }, { type: ChangeDetectorRef } ]; VaAddonListComponent.propDecorators = { addons: [{ type: Input, args: ['addons',] }], showPricing: [{ type: Input }], partnerID: [{ type: Input }], hasVerifiedContract: [{ type: Input, args: ['hasVerifiedContract',] }], canAccessContractPricing: [{ type: Input, args: ['canAccessContractPricing',] }], addonSelected: [{ type: Output }] }; if (false) { /** @type {?} */ VaAddonListComponent.prototype._addons; /** @type {?} */ VaAddonListComponent.prototype.showPricing; /** @type {?} */ VaAddonListComponent.prototype.partnerID; /** @type {?} */ VaAddonListComponent.prototype._hasVerifiedContract; /** @type {?} */ VaAddonListComponent.prototype._canAccessContractPricing; /** @type {?} */ VaAddonListComponent.prototype.addonSelected; /** @type {?} */ VaAddonListComponent.prototype.billedProductsMap; /** * @type {?} * @private */ VaAddonListComponent.prototype.billedProductLoaded; /** * @type {?} * @private */ VaAddonListComponent.prototype.subscriptions; /** * @type {?} * @private */ VaAddonListComponent.prototype.billingService; /** * @type {?} * @private */ VaAddonListComponent.prototype.cdr; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkb24tbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdmVuZGFzdGEvc3RvcmUvIiwic291cmNlcyI6WyJsaWIvYWRkb24tbGlzdC9hZGRvbi1saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJN0csT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxjQUFjLEVBQWlCLDRDQUE0QyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFPckgsTUFBTSxPQUFPLG9CQUFvQjs7Ozs7SUE2Qi9CLFlBQW9CLGNBQThCLEVBQVUsR0FBc0I7UUFBOUQsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF0QnpFLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBRzVCLHlCQUFvQixHQUFZLElBQUksQ0FBQztRQU1yQyw4QkFBeUIsR0FBWSxJQUFJLENBQUM7UUFPaEMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRXJELHNCQUFpQixHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2xELHdCQUFtQixHQUF5QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3RELGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztJQUUwQyxDQUFDOzs7OztJQTNCdEYsSUFDSSxNQUFNLENBQUMsTUFBZTtRQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMvQixDQUFDOzs7OztJQUtELElBQ0ksbUJBQW1CLENBQUMsS0FBYztRQUNwQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxxQkFBcUIsRUFB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dHJveSwgT25Jbml0LCBPdXRwdXQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBZGRvbiB9IGZyb20gJ0B2ZW5kYXN0YS9jb3JlL3NoYXJlZCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFByaWNpbmcgfSBmcm9tICcuLi9wcmljaW5nL3ByaWNpbmcnO1xuaW1wb3J0IHsgaXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tICd1dGlsJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlLCBCaWxsZWRQcm9kdWN0LCBidWlsZEJpbGxlZFByb2R1Y3RGcm9tUHJvZHVjdFByaWNpbmdBbmRBZGRvbiB9IGZyb20gJ0B2ZW5kYXN0YS9jb3JlL2JpbGxpbmcnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YS1hZGRvbi1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZG9uLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hZGRvbi1saXN0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVmFBZGRvbkxpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCB7XG4gIF9hZGRvbnM6IEFkZG9uW107XG4gIEBJbnB1dCgnYWRkb25zJylcbiAgc2V0IGFkZG9ucyhhZGRvbnM6IEFkZG9uW10pIHtcbiAgICB0aGlzLl9hZGRvbnMgPSBhZGRvbnM7XG4gICAgdGhpcy5wb3B1bGF0ZUJpbGxlZFByb2R1Y3QoKTtcbiAgfVxuICBASW5wdXQoKSBzaG93UHJpY2luZyA9IHRydWU7XG4gIEBJbnB1dCgpIHBhcnRuZXJJRDogc3RyaW5nO1xuXG4gIF9oYXNWZXJpZmllZENvbnRyYWN0OiBib29sZWFuID0gbnVsbDtcbiAgQElucHV0KCdoYXNWZXJpZmllZENvbnRyYWN0JylcbiAgc2V0IGhhc1ZlcmlmaWVkQ29udHJhY3QodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9oYXNWZXJpZmllZENvbnRyYWN0ID0gdmFsdWU7XG4gICAgdGhpcy5wb3B1bGF0ZUJpbGxlZFByb2R1Y3QoKTtcbiAgfVxuICBfY2FuQWNjZXNzQ29udHJhY3RQcmljaW5nOiBib29sZWFuID0gbnVsbDtcbiAgQElucHV0KCdjYW5BY2Nlc3NDb250cmFjdFByaWNpbmcnKVxuICBzZXQgY2FuQWNjZXNzQ29udHJhY3RQcmljaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fY2FuQWNjZXNzQ29udHJhY3RQcmljaW5nID0gdmFsdWU7XG4gICAgdGhpcy5wb3B1bGF0ZUJpbGxlZFByb2R1Y3QoKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBhZGRvblNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxTdHJpbmc+KCk7XG5cbiAgYmlsbGVkUHJvZHVjdHNNYXA6IE1hcDxzdHJpbmcsIEJpbGxlZFByb2R1Y3Q+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGJpbGxlZFByb2R1Y3RMb2FkZWQ6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBiaWxsaW5nU2VydmljZTogQmlsbGluZ1NlcnZpY2UsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnBvcHVsYXRlQmlsbGVkUHJvZHVjdCgpO1xuICB9XG5cbiAgcG9wdWxhdGVCaWxsZWRQcm9kdWN0KCkge1xuICAgIGlmICh0aGlzLmRpc3BsYXlDb250cmFjdFByaWNpbmcoKSkge1xuICAgICAgY29uc3QgYmlsbGluZ0lEcyA9IHRoaXMuX2FkZG9ucy5tYXAoYSA9PiB7XG4gICAgICAgIHRoaXMuYmlsbGVkUHJvZHVjdHNNYXAuc2V0KGEuYWRkb25JZCwgbnVsbCk7XG4gICAgICAgIHRoaXMuYmlsbGVkUHJvZHVjdExvYWRlZC5zZXQoYS5hZGRvbklkLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBhLmJpbGxpbmdJZDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZ2V0TXVsdGlQcm9kdWN0UHJpY2luZyh0aGlzLnBhcnRuZXJJRCwgYmlsbGluZ0lEcykuc3Vic2NyaWJlKHByaWNpbmcgPT4ge1xuICAgICAgICAgIHRoaXMuX2FkZG9ucy5mb3JFYWNoKGFkZG9uID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFkZG9uUHJpY2luZyA9IHByaWNpbmdbYWRkb24uYmlsbGluZ0lkXTtcbiAgICAgICAgICAgIGlmICghYWRkb25QcmljaW5nKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJpbGxlZFByb2R1Y3QgPSBidWlsZEJpbGxlZFByb2R1Y3RGcm9tUHJvZHVjdFByaWNpbmdBbmRBZGRvbihhZGRvbiwgYWRkb25QcmljaW5nKTtcbiAgICAgICAgICAgIHRoaXMuYmlsbGVkUHJvZHVjdHNNYXAuc2V0KGFkZG9uLmFkZG9uSWQsIGJpbGxlZFByb2R1Y3QpO1xuICAgICAgICAgICAgdGhpcy5iaWxsZWRQcm9kdWN0TG9hZGVkLnNldChhZGRvbi5hZGRvbklkLCB0cnVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgb25DbGljayhhZGRvbklkOiBTdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmFkZG9uU2VsZWN0ZWQuZW1pdChhZGRvbklkKTtcbiAgfVxuXG4gIHB1YmxpYyBpbnN0YW5jZU9mUHJpY2luZyhvYmplY3Q6IGFueSkge1xuICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0LmN1cnJlbmN5ICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LnByaWNlcyAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0RGlzcGxheVByaWNpbmcoYWRkb246IEFkZG9uKTogUHJpY2luZyB7XG4gICAgY29uc3QgcHJpY2U6IGFueSA9IGFkZG9uLnByaWNlO1xuICAgIGlmIChwcmljZSAmJiB0aGlzLmluc3RhbmNlT2ZQcmljaW5nKHByaWNlKSkge1xuICAgICAgcmV0dXJuIHByaWNlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVuY3k6IGFkZG9uLmN1cnJlbmN5LFxuICAgICAgcHJpY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcmljZTogYWRkb24ucHJpY2UsXG4gICAgICAgICAgZnJlcXVlbmN5OiBhZGRvbi5iaWxsaW5nRnJlcXVlbmN5ID8gYWRkb24uYmlsbGluZ0ZyZXF1ZW5jeSA6ICdNb250aGx5J1xuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcbiAgfVxuXG4gIG5vRGF0YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNOdWxsT3JVbmRlZmluZWQodGhpcy5faGFzVmVyaWZpZWRDb250cmFjdCkgfHwgaXNOdWxsT3JVbmRlZmluZWQodGhpcy5fY2FuQWNjZXNzQ29udHJhY3RQcmljaW5nKTtcbiAgfVxuXG4gIGRpc3BsYXlDb250cmFjdFByaWNpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbkFjY2Vzc0NvbnRyYWN0UHJpY2luZyAmJiB0aGlzLl9oYXNWZXJpZmllZENvbnRyYWN0O1xuICB9XG5cbiAgaXNCaWxsZWRQcm9kdWN0TG9hZGVkKGFkZG9uOiBBZGRvbik6IGJvb2xlYW4ge1xuXG4gICAgaWYgKHRoaXMubm9EYXRhKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzcGxheUNvbnRyYWN0UHJpY2luZygpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuYmlsbGVkUHJvZHVjdExvYWRlZC5nZXQoYWRkb24uYWRkb25JZCk7XG4gICAgICByZXR1cm4gdmFsdWUgPyB2YWx1ZSA6IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gIH1cbn1cbiJdfQ==