UNPKG

13.5 kBJavaScriptView Raw
1import { Component, Input } from '@angular/core';
2import { trigger, transition, animate, style, state } from '@angular/animations';
3import { BehaviorSubject } from 'rxjs/BehaviorSubject';
4import { buildSalesPackages, addStatusesToSalesPackages, ActivationStatus } from './sales-package';
5import { ReplaySubject } from 'rxjs/ReplaySubject';
6import { filter, map, zip, combineLatest } from 'rxjs/operators';
7var VaPackageDropdownComponent = /** @class */ (function () {
8 function VaPackageDropdownComponent() {
9 this.singularDropdown = false;
10 this.packages$$ = new ReplaySubject(1);
11 this.products$$ = new ReplaySubject(1);
12 this.statuses$$ = new BehaviorSubject([]);
13 this.addons$$ = new ReplaySubject(1);
14 this.dropdownToggles = [];
15 }
16 Object.defineProperty(VaPackageDropdownComponent.prototype, "packages", {
17 set: function (packages) {
18 this.packages$$.next(packages);
19 },
20 enumerable: true,
21 configurable: true
22 });
23 ;
24 Object.defineProperty(VaPackageDropdownComponent.prototype, "products", {
25 set: function (products) {
26 this.products$$.next(products);
27 },
28 enumerable: true,
29 configurable: true
30 });
31 ;
32 Object.defineProperty(VaPackageDropdownComponent.prototype, "statuses", {
33 set: function (statuses) {
34 this.statuses$$.next(statuses);
35 },
36 enumerable: true,
37 configurable: true
38 });
39 Object.defineProperty(VaPackageDropdownComponent.prototype, "addons", {
40 set: function (addons) {
41 this.addons$$.next(addons);
42 },
43 enumerable: true,
44 configurable: true
45 });
46 VaPackageDropdownComponent.prototype.ngOnInit = function () {
47 var packages$ = this.packages$$.pipe(filter(function (packages) { return packages !== null; }));
48 var products$ = this.products$$.pipe(filter(function (products) { return products !== null; }));
49 var addons$ = this.addons$$.pipe(filter(function (addons) { return addons !== null; }));
50 var salesPackage$ = packages$.pipe(zip(products$, addons$), map(function (_a) {
51 var packages = _a[0], products = _a[1], addons = _a[2];
52 return buildSalesPackages(packages, products, addons);
53 }));
54 this.salesPackages$ = salesPackage$.pipe(combineLatest(this.statuses$$), map(function (_a) {
55 var salesPackages = _a[0], statuses = _a[1];
56 return addStatusesToSalesPackages(salesPackages, statuses);
57 }));
58 };
59 VaPackageDropdownComponent.prototype.toggleProducts = function (indexToToggle) {
60 if (this.singularDropdown) {
61 var openedIndex = this.dropdownToggles.findIndex(function (value) {
62 return value === true;
63 });
64 if (openedIndex !== indexToToggle) {
65 this.dropdownToggles[openedIndex] = false;
66 }
67 }
68 this.dropdownToggles[indexToToggle] = !this.dropdownToggles[indexToToggle];
69 };
70 VaPackageDropdownComponent.prototype.isActivatedStatus = function (status) {
71 if (status === ActivationStatus.SUCCESS) {
72 return true;
73 }
74 else {
75 return false;
76 }
77 };
78 VaPackageDropdownComponent.prototype.isWarningStatus = function (status) {
79 if (status === ActivationStatus.WARNING) {
80 return true;
81 }
82 else {
83 return false;
84 }
85 };
86 VaPackageDropdownComponent.prototype.isErrorStatus = function (status) {
87 if (status === ActivationStatus.ERROR) {
88 return true;
89 }
90 else {
91 return false;
92 }
93 };
94 VaPackageDropdownComponent.decorators = [
95 { type: Component, args: [{
96 selector: 'va-package-dropdown',
97 animations: [
98 trigger('listAnimationStart', [
99 state('void', style({ height: '0px' })),
100 state('*', style({ height: '*' })),
101 transition('void => *', [
102 animate('0.25s ease')
103 ]),
104 transition('* => void', [
105 animate('0.25s ease')
106 ])
107 ])
108 ],
109 template: "<mat-card class=\"package-list-container\" *ngIf=\"salesPackages$ | async as salesPackages else loading\"> <mat-list> <div class=\"package-list\" *ngFor=\"let package of salesPackages; let packageIndex = index\"> <mat-list-item class=\"package-list-item\"> <va-icon mat-list-avatar [name]=\"package.name\" [iconUrl]=\"package.icon\" [diameter]=\"40\"> </va-icon> <h3 mat-line>{{package.name}}</h3> <p class=\"package-dropdown-font\" mat-line>{{package.formattedPrices}}</p> <span *ngIf=\"!package.activationStatus\" class=\"package-dropdown-layout\"> <p class=\"package-dropdown-font package-notice\"> <span *ngIf=\"(package.products?.length > 0) || (package.totalAddons > 0)\">Contains </span> <span *ngIf=\"package.products?.length > 0\"> {{package.products.length}} {{package.products.length === 1 ? \"Product\" : \"Products\"}} </span> <span *ngIf=\"(package.products?.length > 0) && (package.totalAddons > 0)\"> & </span> <span *ngIf=\"package.totalAddons > 0\"> {{package.totalAddons}} {{package.totalAddons === 1 ? \"Addon\" : \"Addons\"}} </span> <span *ngIf=\"(package.products?.length === 0) && (package.totalAddons === 0)\"> No Items in Package </span> </p> <button *ngIf=\"package.products?.length > 0 || package.addonsWithNoParent?.length > 0\" mat-icon-button type=\"button\" (click)=\"toggleProducts(packageIndex)\"> <mat-icon mat-list-icon class=\"dropdown-icon\" [ngClass]=\"{'dropdown-icon-rotate-up': !dropdownToggles[packageIndex], 'dropdown-icon-rotate-down': dropdownToggles[packageIndex]}\"> keyboard_arrow_down </mat-icon> </button> </span> <span *ngIf=\"package.activationStatus\" class=\"package-dropdown-layout package-dropdown-status\"> <div [ngClass]=\"{ 'activated': isActivatedStatus(package.activationStatus.status), 'warning': isWarningStatus(package.activationStatus.status), 'error': isErrorStatus(package.activationStatus.status)}\"> <mat-icon>{{package.activationStatus.icon}}</mat-icon> </div> <p class=\"package-notice\" [ngClass]=\"{ 'activated': isActivatedStatus(package.activationStatus.status), 'warning': isWarningStatus(package.activationStatus.status), 'error': isErrorStatus(package.activationStatus.status)}\"> {{package.activationStatus.text}} </p> <button *ngIf=\"package.products?.length > 0 || package.addonsWithNoParent?.length > 0\" mat-icon-button type=\"button\" (click)=\"toggleProducts(packageIndex)\"> <mat-icon mat-list-icon class=\"dropdown-icon\" [ngClass]=\"{'dropdown-icon-rotate-up': !dropdownToggles[packageIndex], 'dropdown-icon-rotate-down': dropdownToggles[packageIndex]}\"> keyboard_arrow_down </mat-icon> </button> </span> </mat-list-item> <mat-list class=\"product-or-addon-list package-dropdown-font\" *ngIf=\"dropdownToggles[packageIndex]\" [@listAnimationStart]> <div *ngFor=\"let product of package.products\"> <mat-list-item class=\"product-or-addon-item\"> <va-icon mat-list-avatar [name]=\"product.name\" [iconUrl]=\"product.icon\" [diameter]=\"40\"></va-icon> <h3 mat-line>{{product.name}}</h3> <p class=\"package-dropdown-font\" mat-line> <span>{{product.tagline}}</span> </p> <div *ngIf=\"product.activationStatus\" class=\"package-dropdown-status\" > <div [ngClass]=\"{ 'activated': isActivatedStatus(product.activationStatus.status), 'warning': isWarningStatus(product.activationStatus.status), 'error': isErrorStatus(product.activationStatus.status)}\"> <mat-icon>{{product.activationStatus.icon}}</mat-icon> </div> <p [ngClass]=\"{ 'activated': isActivatedStatus(product.activationStatus.status), 'warning': isWarningStatus(product.activationStatus.status), 'error': isErrorStatus(product.activationStatus.status)}\"> {{product.activationStatus.text}} </p> </div> </mat-list-item> <mat-list-item *ngFor=\"let addon of product.addons\" class=\"product-or-addon-item addon-with-product\"> <va-icon mat-list-avatar [name]=\"addon.name\" [iconUrl]=\"addon.icon\" [diameter]=\"40\"></va-icon> <h3 mat-line>{{addon.name}}</h3> <p class=\"package-dropdown-font\" mat-line>{{addon.tagline}}</p> <div *ngIf=\"addon.activationStatus\" class=\"package-dropdown-status\"> <div [ngClass]=\"{ 'activated': isActivatedStatus(addon.activationStatus.status), 'warning': isWarningStatus(addon.activationStatus.status), 'error': isErrorStatus(addon.activationStatus.status)}\"> <mat-icon>{{addon.activationStatus.icon}}</mat-icon> </div> <p [ngClass]=\"{ 'activated': isActivatedStatus(addon.activationStatus.status), 'warning': isWarningStatus(addon.activationStatus.status), 'error': isErrorStatus(addon.activationStatus.status)}\"> {{addon.activationStatus.text}} </p> </div> </mat-list-item> </div> <mat-list-item *ngFor=\"let addon of package.addonsWithNoParent\" class=\"product-or-addon-item\"> <div class=\"icon-area\"> <va-icon mat-list-avatar [iconUrl]=\"addon.icon\" [name]=\"addon.name\" [diameter]=\"40\"></va-icon> <va-icon mat-list-avatar class=\"addon-indicator\" [iconUrl]=\"addon.parentIcon\" [diameter]=\"20\" [name]=\"addon.parentName\"></va-icon> </div> <h3 mat-line >{{addon.name}} <span class=\"required-product\">(Requires {{addon.parentName || ''}})</span></h3> <p class=\"package-dropdown-font\" mat-line> <span>{{addon.tagline}}</span> </p> <div *ngIf=\"addon.activationStatus\" class=\"package-dropdown-status\"> <div [ngClass]=\"{ 'activated': isActivatedStatus(addon.activationStatus.status), 'warning': isWarningStatus(addon.activationStatus.status), 'error': isErrorStatus(addon.activationStatus.status)}\"> <mat-icon>{{addon.activationStatus.icon}}</mat-icon> </div> <p [ngClass]=\"{ 'activated': isActivatedStatus(addon.activationStatus.status), 'warning': isWarningStatus(addon.activationStatus.status), 'error': isErrorStatus(addon.activationStatus.status)}\"> {{addon.activationStatus.text}} </p> </div> </mat-list-item> </mat-list> </div> </mat-list> </mat-card> <ng-template #loading> <mat-card> <div class=\"package-dropdown-stencil-display\"> <va-icon [iconUrl]=\"\"></va-icon> <div class=\"stencil-text\"> <h1 class=\"stencil-title stencil-shimmer\"></h1> <span class=\"stencil-tagline stencil-shimmer\"></span> </div> </div> </mat-card> </ng-template> ",
110 styles: [".package-dropdown-font { color: rgba(0, 0, 0, 0.54); font-size: 14px; font-weight: 400; } .package-list-container { border-top: 1px solid rgba(0, 0, 0, 0.12); padding: 0; } .package-list-container mat-list { padding: 0; } .package-list-container mat-list .package-list .package-list-item { border-bottom: 1px solid rgba(0, 0, 0, 0.12); } .package-dropdown-layout { display: flex; flex-direction: row; align-items: center; } .package-dropdown-layout .package-notice { width: max-content; font-style: italic; } @media screen and (max-width: 500px) { .package-dropdown-layout p { display: none; } } .package-dropdown-layout mat-icon { padding: 0; } .package-dropdown-layout button { padding: 0; min-width: 0; } .package-dropdown-layout button .dropdown-icon { color: rgba(0, 0, 0, 0.54); } .package-dropdown-layout button .dropdown-icon-rotate-down { transform: rotate(180deg); transition: .4s all ease; pointer-events: none; } .package-dropdown-layout button .dropdown-icon-rotate-up { transform: rotate(0deg); transition: .4s all ease; pointer-events: none; } .package-dropdown-stencil-display { display: flex; width: 100%; flex-grow: 1; } .package-dropdown-stencil-display va-icon { margin-right: 20px; } .package-dropdown-stencil-display .stencil-text { width: inherit; display: flex; flex-direction: column; justify-content: center; } .package-dropdown-stencil-display .stencil-text .stencil-title { height: 32px; width: 40%; margin-bottom: 5px !important; margin-top: 0 !important; } .package-dropdown-stencil-display .stencil-text .stencil-tagline { height: 32px; width: inherit; } .package-dropdown-status { display: flex; flex-direction: row; align-items: center; } .package-dropdown-status p { padding-left: 6px; font-size: 14px; white-space: nowrap; } .package-dropdown-status .activated { color: #4caf50; } .package-dropdown-status .warning { color: #ffa000; } .package-dropdown-status .error { color: #c62828; } .icon-area { position: relative; display: inline-block; order: -1; margin-right: 16px; } .icon-area .addon-indicator { position: absolute; border-radius: 50%; bottom: -24px; right: -24px; } .product-or-addon-list { background-color: rgba(0, 0, 0, 0.04); overflow: hidden; } .product-or-addon-list .product-or-addon-item { border-bottom: 1px solid rgba(0, 0, 0, 0.12); padding-left: 30px; } .product-or-addon-list .product-or-addon-item .required-product { font-size: 11px; font-weight: bold; font-style: italic; } .addon-with-product .mat-list-avatar { margin-left: 40px; } "],
111 },] },
112 ];
113 /** @nocollapse */
114 VaPackageDropdownComponent.ctorParameters = function () { return []; };
115 VaPackageDropdownComponent.propDecorators = {
116 "packages": [{ type: Input },],
117 "products": [{ type: Input },],
118 "statuses": [{ type: Input },],
119 "addons": [{ type: Input },],
120 "singularDropdown": [{ type: Input },],
121 };
122 return VaPackageDropdownComponent;
123}());
124export { VaPackageDropdownComponent };