@vendasta/store
Version:
Components and data for Store
115 lines (114 loc) • 7.92 kB
JavaScript
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 };