1 | import { Component, Input } from '@angular/core';
|
2 | import { trigger, transition, animate, style, state } from '@angular/animations';
|
3 | import { BehaviorSubject } from 'rxjs/BehaviorSubject';
|
4 | import { buildSalesPackages, addStatusesToSalesPackages, ActivationStatus } from './sales-package';
|
5 | import { ReplaySubject } from 'rxjs/ReplaySubject';
|
6 | import { filter, map, zip, combineLatest } from 'rxjs/operators';
|
7 | var VaPackageDropdownComponent = (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 |
|
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 | }());
|
124 | export { VaPackageDropdownComponent };
|