UNPKG

@vendasta/store

Version:

Components and data for Store

115 lines (114 loc) 7.92 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; import { Observable } from 'rxjs/Observable'; import { ReplaySubject } from 'rxjs/ReplaySubject'; import { Addon } from '@vendasta/core/marketplace-apps'; var VaPackageDetailsComponent = /** @class */ (function () { function VaPackageDetailsComponent() { this.showActionButton = true; this.showPricing = true; this.getItNow = new EventEmitter(); this.products$ = new BehaviorSubject([]); this.addons$ = new BehaviorSubject([]); this.pkg$ = new ReplaySubject(1); this.itemSelectedEvent$ = new ReplaySubject(1); this.combinedItemsList$ = Observable.combineLatest(this.products$, this.addons$, function (products, addons) { return [].concat(products || []).concat(addons || []); }); var nonEmptyCombinedItemsList = this.combinedItemsList$ .skipWhile(function (items) { return !items || items.length === 0; }) .shareReplay(1); // Need to map to an index because that's how product selection works. var initialSelectedItem$ = nonEmptyCombinedItemsList .map(function (_) { return 0; }) // The initially selected item is the first in the list. .take(1); var mergedSelection = Observable.merge(initialSelectedItem$, this.itemSelectedEvent$); this.selectedItem$ = Observable.combineLatest(mergedSelection, this.combinedItemsList$).map(function (_a) { var index = _a[0], items = _a[1]; return items[index]; }); this.lmiCategories$ = this.products$ .skipWhile(function (products) { return !products || products.length === 0; }) .map(function (products) { return VaPackageDetailsComponent.getLmiCategories(products); }); this.productNameForSingleAddon$ = nonEmptyCombinedItemsList.map(function (items) { return VaPackageDetailsComponent.getProductNameForSingleAddon(items); }); this.displayTagName$ = Observable.combineLatest(this.pkg$, this.combinedItemsList$) .map(function (_a) { var pkg = _a[0], items = _a[1]; return VaPackageDetailsComponent.getDisplayTagline(pkg, items); }); } Object.defineProperty(VaPackageDetailsComponent.prototype, "products", { set: function (products) { this.products$.next(products); }, enumerable: true, configurable: true }); Object.defineProperty(VaPackageDetailsComponent.prototype, "addons", { set: function (addons) { this.addons$.next(addons); }, enumerable: true, configurable: true }); Object.defineProperty(VaPackageDetailsComponent.prototype, "pkg", { set: function (pkg) { this.pkg$.next(pkg); }, enumerable: true, configurable: true }); VaPackageDetailsComponent.getLmiCategories = function (products) { var lmiCategories = []; if (products) { products.forEach(function (product) { lmiCategories = lmiCategories.concat(product.getLmiCategoryNames()); }); } return new Set(lmiCategories); }; VaPackageDetailsComponent.getDisplayTagline = function (pkg, items) { if (pkg && pkg.tagline) { return pkg.tagline; } else if (items && items.length === 1) { return items[0].tagline || ''; } return ''; }; VaPackageDetailsComponent.getProductNameForSingleAddon = function (items) { if (items && items.length === 1 && items[0] instanceof Addon) { var addon = items[0]; return addon.productName; } }; VaPackageDetailsComponent.prototype.selectItem = function (i) { this.itemSelectedEvent$.next(i); }; VaPackageDetailsComponent.prototype.emitGetItNow = function () { this.getItNow.emit(); }; VaPackageDetailsComponent.decorators = [ { type: Component, args: [{ selector: 'va-package-details', template: "<div *ngIf=\"pkg$ | async as pkg\" class=\"page\"> <va-header-container [iconUrl]=\"pkg.icon\" [title]=\"pkg.name\" [tagline]=\"displayTagName$ | async\" [prerequisite]=\"productNameForSingleAddon$ | async\" [chipLabels]=\"lmiCategories$ | async\" [pricing]=\"pkg.pricing\" [pricingLabel]=\"'Pricing'\" [showAction]=\"showActionButton\" [showPricing]=\"showPricing\" [actionLabel]=\"'Get It Now'\" [actionEnabled]=true (actionSelected)=\"emitGetItNow()\" ></va-header-container> <ng-container *ngIf=\"pkg?.content\"> <va-selling-info [description]=\"pkg.content\"></va-selling-info> </ng-container> <va-products-nav [items]=\"combinedItemsList$ | async\" [hideItemsNav]=\"pkg?.hide_product_icons_and_names\" (itemSelected)=\"selectItem($event)\"></va-products-nav> <ng-container *ngIf=\"selectedItem$ | async as selectedItem\"> <div *ngIf=\"!pkg?.hide_product_details\" class=\"package-content\"> <div class=\"left-column\"> <section *ngIf=\"(selectedItem.endUserMarketing?.description || selectedItem.endUserMarketing?.keySellingPoints) || (selectedItem.description || selectedItem.keySellingPoints)\"> <va-selling-info [description]=\"selectedItem.endUserMarketing?.description || selectedItem.description\" [keySellingPoints]=\"selectedItem.endUserMarketing?.keySellingPoints || selectedItem.keySellingPoints\"></va-selling-info> </section> <section *ngIf=\"(selectedItem.endUserMarketing?.faqs?.length > 0 && selectedItem.endUserMarketing?.faqs[0].question) || selectedItem.faqs?.length > 0\"> <h2 class=\"va-component-title\">FAQs</h2> <va-faqs [faqs]=\"selectedItem.endUserMarketing?.faqs || selectedItem.faqs\"></va-faqs> </section> </div> <div class=\"right-column\"> <section *ngIf=\"selectedItem.screenshotUrls?.length > 0 || selectedItem.screenshots?.length > 0\"> <h2 class=\"va-component-title\">Gallery</h2> <va-image-gallery [imageUrls]=\"selectedItem.screenshotUrls || selectedItem.screenshots\"></va-image-gallery> </section> <section *ngIf=\"selectedItem.endUserMarketing?.files?.length > 0 || selectedItem.files?.length > 0\"> <h2 class=\"va-component-title\">Files</h2> <va-files [files]=\"selectedItem.endUserMarketingFiles || selectedItem.files\"></va-files> </section> </div> </div> </ng-container> </div> ", styles: [":host { display: block; font-size: 14px; line-height: 1.4; } :host * { box-sizing: border-box; } .va-component-title { font-size: 24px; font-weight: 300; margin-top: 0; } @media screen and (min-width: 600px) { .va-component-title { font-size: 32px; } } img { max-width: 100%; } va-icon { display: inline-block; } .page { position: relative; margin: 0 auto 20px; background: #ffffff; box-shadow: 0 3px 10px rgba(33, 33, 33, 0.3); overflow: hidden; font-size: 16px; } .page .item-amount { color: #9e9e9e; font-size: 14px; text-align: right; margin: 0 24px 8px; } section { padding: 24px; } .left-column { width: 66%; } @media screen and (max-width: 600px) { .left-column { width: 100%; } } .right-column { width: 34%; } @media screen and (max-width: 600px) { .right-column { width: 100%; } } .package-content { display: flex; } @media screen and (max-width: 600px) { .package-content { flex-direction: column; } } "] },] }, ]; /** @nocollapse */ VaPackageDetailsComponent.ctorParameters = function () { return []; }; VaPackageDetailsComponent.propDecorators = { 'showActionButton': [{ type: Input },], 'showPricing': [{ type: Input },], 'getItNow': [{ type: Output },], 'products': [{ type: Input },], 'addons': [{ type: Input },], 'pkg': [{ type: Input },], }; return VaPackageDetailsComponent; }()); export { VaPackageDetailsComponent };