@veloceapps/sdk 3.1.17 → 3.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -6
- package/bundles/veloce-sdk-core.umd.js +212 -68
- package/bundles/veloce-sdk-core.umd.js.map +1 -1
- package/bundles/veloce-sdk-runtime.umd.js +5 -6
- package/bundles/veloce-sdk-runtime.umd.js.map +1 -1
- package/bundles/veloce-sdk.umd.js +52 -38
- package/bundles/veloce-sdk.umd.js.map +1 -1
- package/core/modules/flow-configuration/services/flow-configuration.service.d.ts +11 -17
- package/core/services/quote-draft.service.d.ts +41 -7
- package/esm2015/core/modules/configuration/services/configuration.service.js +3 -3
- package/esm2015/core/modules/flow-configuration/services/flow-configuration.service.js +43 -49
- package/esm2015/core/services/quote-draft.service.js +138 -22
- package/esm2015/runtime/components/ui-runtime/runtime.component.js +2 -2
- package/esm2015/runtime/execution/directives/section-script.directive.js +2 -2
- package/esm2015/runtime/services/cart.service.js +2 -3
- package/esm2015/runtime/services/section.service.js +1 -1
- package/esm2015/src/components/header/header.component.js +23 -19
- package/esm2015/src/components/header/header.types.js +1 -1
- package/esm2015/src/pages/legacy-product/legacy-product.component.js +4 -4
- package/esm2015/src/pages/product/product.component.js +8 -5
- package/esm2015/src/resolvers/flow.resolver.js +8 -4
- package/esm2015/src/resolvers/quote.resolver.js +4 -11
- package/esm2015/src/services/flow.service.js +6 -5
- package/fesm2015/veloce-sdk-core.js +177 -66
- package/fesm2015/veloce-sdk-core.js.map +1 -1
- package/fesm2015/veloce-sdk-runtime.js +3 -4
- package/fesm2015/veloce-sdk-runtime.js.map +1 -1
- package/fesm2015/veloce-sdk.js +44 -39
- package/fesm2015/veloce-sdk.js.map +1 -1
- package/package.json +1 -1
- package/runtime/services/cart.service.d.ts +1 -1
- package/src/components/header/header.component.d.ts +5 -2
- package/src/components/header/header.types.d.ts +0 -1
- package/src/pages/product/product.component.d.ts +1 -0
- package/src/resolvers/flow.resolver.d.ts +3 -1
- package/src/resolvers/quote.resolver.d.ts +0 -1
@@ -753,6 +753,8 @@
|
|
753
753
|
this.mode = ctx.mode;
|
754
754
|
this.objectName = ctx.mode.toLowerCase();
|
755
755
|
this.contextProperties = ctx.properties;
|
756
|
+
this.assetPriceLists = this.quoteDraftService.assetPriceLists;
|
757
|
+
this.activePriceList$ = this.quoteDraftService.activePriceList$;
|
756
758
|
this.status$ = this.contextService.resolve$().pipe(rxjs.map(function (context) { var _a; return (_a = context.properties.Status) !== null && _a !== void 0 ? _a : ''; }));
|
757
759
|
this.isEditMode$ = this.quoteDraftService.isEditMode$();
|
758
760
|
this.products$ = this.flowConfiguration.get().pipe(rxjs.map(function (lineItems) { return _this.generateProducts(lineItems); }));
|
@@ -781,10 +783,10 @@
|
|
781
783
|
enumerable: false,
|
782
784
|
configurable: true
|
783
785
|
});
|
784
|
-
FlowHeaderComponent.prototype.back = function () {
|
785
|
-
var
|
786
|
-
if (
|
787
|
-
window.VELO_BACK_FN.apply(null, [
|
786
|
+
FlowHeaderComponent.prototype.back = function (objectId) {
|
787
|
+
var targetId = objectId !== null && objectId !== void 0 ? objectId : this.contextService.resolve().headerId;
|
788
|
+
if (targetId) {
|
789
|
+
window.VELO_BACK_FN.apply(null, [targetId]);
|
788
790
|
}
|
789
791
|
};
|
790
792
|
FlowHeaderComponent.prototype.getSalesforceObjectLink = function (objectId) {
|
@@ -819,18 +821,17 @@
|
|
819
821
|
this.dialogService.showEmptyCartDialog().subscribe();
|
820
822
|
return;
|
821
823
|
}
|
822
|
-
var quoteDraft = this.quoteDraftService.
|
824
|
+
var quoteDraft = this.quoteDraftService.quoteDraft;
|
823
825
|
if (!quoteDraft) {
|
824
826
|
return;
|
825
827
|
}
|
826
828
|
this.isSaveInProgress$.next(true);
|
827
829
|
this.quoteApiService
|
828
830
|
.upsertQuote(quoteDraft)
|
829
|
-
.pipe(rxjs.tap(function () {
|
830
|
-
|
831
|
-
|
832
|
-
|
833
|
-
}
|
831
|
+
.pipe(rxjs.tap(function (_c) {
|
832
|
+
var quoteId = _c.quoteId;
|
833
|
+
_this.quoteDraftService.hasUnsavedChanges = false;
|
834
|
+
_this.back(quoteId);
|
834
835
|
}), rxjs.finalize(function () { return _this.isSaveInProgress$.next(false); }))
|
835
836
|
.subscribe();
|
836
837
|
};
|
@@ -844,16 +845,22 @@
|
|
844
845
|
this.dialogService.showAccountSubmitFailureDialog();
|
845
846
|
return;
|
846
847
|
}
|
847
|
-
var quoteDraft = this.quoteDraftService.
|
848
|
+
var quoteDraft = this.quoteDraftService.quoteDraft;
|
848
849
|
if (!quoteDraft) {
|
849
850
|
return;
|
850
851
|
}
|
851
852
|
this.isSubmitInProgress$.next(true);
|
852
853
|
this.quoteApiService
|
853
854
|
.submitQuote(quoteDraft)
|
854
|
-
.pipe(rxjs.switchMap(function () { return _this.quoteApiService.getQuoteDraft(quoteDraft.quoteId); }), rxjs.tap(function (updatedQuoteDraft) {
|
855
|
+
.pipe(rxjs.switchMap(function () { return _this.quoteApiService.getQuoteDraft(quoteDraft.quoteId); }), rxjs.tap(function (updatedQuoteDraft) {
|
856
|
+
_this.contextService.update({ properties: updatedQuoteDraft.context.properties });
|
857
|
+
_this.quoteDraftService.hasUnsavedChanges = false;
|
858
|
+
}), rxjs.finalize(function () { return _this.isSubmitInProgress$.next(false); }), rxjs.takeUntil(this.destroyed$))
|
855
859
|
.subscribe();
|
856
860
|
};
|
861
|
+
FlowHeaderComponent.prototype.selectPriceList = function (priceListId) {
|
862
|
+
this.quoteDraftService.updateActivePriceList(priceListId);
|
863
|
+
};
|
857
864
|
FlowHeaderComponent.prototype.queryName$ = function (objectName, id) {
|
858
865
|
if (!id) {
|
859
866
|
return rxjs.of('');
|
@@ -867,14 +874,13 @@
|
|
867
874
|
};
|
868
875
|
FlowHeaderComponent.prototype.populateObjectDetails = function () {
|
869
876
|
var _this = this;
|
870
|
-
var _a
|
877
|
+
var _a;
|
871
878
|
var accountId = this.isAccountMode ? this.contextProperties.Id : this.contextProperties.AccountId;
|
872
879
|
var opportunityId = this.contextProperties.OpportunityId;
|
873
880
|
var quoteId = this.isQuoteMode ? this.contextProperties.Id : undefined;
|
874
881
|
var quoteName = this.isQuoteMode ? this.contextProperties.Name : undefined;
|
875
882
|
var quoteNumber = this.isQuoteMode ? (_a = this.contextProperties.QuoteNumber) === null || _a === void 0 ? void 0 : _a.replace(/^0+/, '') : undefined;
|
876
|
-
|
877
|
-
this.objectDetails$.next(Object.assign(Object.assign({}, this.objectDetails$.value), { accountId: accountId, opportunityId: opportunityId, quoteId: quoteId, quoteName: quoteName, quoteNumber: quoteNumber, priceListName: priceListName }));
|
883
|
+
this.objectDetails$.next(Object.assign(Object.assign({}, this.objectDetails$.value), { accountId: accountId, opportunityId: opportunityId, quoteId: quoteId, quoteName: quoteName, quoteNumber: quoteNumber }));
|
878
884
|
this.queryName$('Account', accountId).subscribe(function (accountName) { return _this.objectDetails$.next(Object.assign(Object.assign({}, _this.objectDetails$.value), { accountName: accountName })); });
|
879
885
|
this.queryName$('Opportunity', opportunityId).subscribe(function (opportunityName) { return _this.objectDetails$.next(Object.assign(Object.assign({}, _this.objectDetails$.value), { opportunityName: opportunityName })); });
|
880
886
|
};
|
@@ -911,7 +917,7 @@
|
|
911
917
|
return FlowHeaderComponent;
|
912
918
|
}());
|
913
919
|
FlowHeaderComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0__namespace, type: FlowHeaderComponent, deps: [{ token: i2__namespace$1.ContextService }, { token: i2__namespace$1.QuoteDraftService }, { token: i1__namespace$2.QuoteApiService }, { token: i1__namespace$2.SalesforceApiService }, { token: i2__namespace$1.FlowConfigurationService }, { token: FlowRouterService }, { token: FlowDialogService }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
914
|
-
FlowHeaderComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.15", type: FlowHeaderComponent, selector: "vl-flow-header", ngImport: i0__namespace, template: "<div class=\"flow-info\" *vlLet=\"objectDetails$ | async as details\">\n <nav class=\"nav-item nav-back\" (click)=\"back()\">\n <i class=\"nav-icon vl-icon vl-icon-arrow-left\"></i>\n\n <span> Back </span>\n <span *ngIf=\"objectName\" class=\"object-name\"> To {{ objectName }}</span>\n </nav>\n\n <ng-container *ngIf=\"isAccountMode\">\n <span class=\"dot-separator\"></span>\n\n <span>Account name</span>\n\n <nav class=\"account-name\" [pTooltip]=\"contextProperties.Name ?? ''\" tooltipPosition=\"bottom\" [showDelay]=\"1000\">\n <a target=\"_blank\" [href]=\"getSalesforceObjectLink(contextProperties.Id)\">{{ contextProperties.Name }}</a>\n </nav>\n </ng-container>\n\n <ng-container *ngIf=\"isQuoteMode\">\n <span class=\"dot-separator\"></span>\n\n <span>Quote #{{ details.quoteNumber }}</span>\n\n <span class=\"dot-separator\"></span>\n\n <nav class=\"nav-item\" (click)=\"quoteDetails.toggle($event)\">\n <span>{{ status$ | async }}</span>\n\n <i *ngIf=\"!quoteDetails.overlayVisible\" class=\"vl-icon vl-icon-chevron-down icon-with-margin\"></i>\n <i *ngIf=\"quoteDetails.overlayVisible\" class=\"vl-icon vl-icon-chevron-up icon-with-margin\"></i>\n </nav>\n\n <p-overlayPanel styleClass=\"navigation-settings-overlay flow-header-overlay center\" #quoteDetails>\n <ng-template pTemplate>\n <div class=\"flow-header-overlay__wrapper\">\n <h2 class=\"flow-header-overlay__title\">\n <span>Quote Information</span>\n <i class=\"vl-icon vl-icon-close close-icon\" (click)=\"quoteDetails.hide()\"></i>\n </h2>\n\n <ul class=\"info-list\">\n <li class=\"info-list__row\">\n <span>Account Name:</span>\n <a target=\"_blank\" [href]=\"getSalesforceObjectLink(details.accountId)\">{{ details.accountName }}</a>\n </li>\n <li class=\"info-list__row\">\n <span>Opportunity Name:</span>\n <a target=\"_blank\" [href]=\"getSalesforceObjectLink(details.opportunityId)\">{{\n details.opportunityName\n }}</a>\n </li>\n <li class=\"info-list__row\">\n <span>Quote Name:</span>\n <a target=\"_blank\" [href]=\"getSalesforceObjectLink(details.quoteId)\">{{ details.quoteName }}</a>\n </li>\n </ul>\n </div>\n </ng-template>\n </p-overlayPanel>\n </ng-container>\n</div>\n\n<div class=\"flow-navigation\">\n <nav class=\"nav-item\" [ngClass]=\"{ active: isCatalogRoute$ | async }\" (click)=\"navigateToCatalog()\">Catalog</nav>\n <nav class=\"nav-item disabled\" [ngClass]=\"{ active: isConfigurationRoute$ | async }\">Configurator</nav>\n <ng-container *vlLet=\"products$ | async as products\">\n <nav class=\"nav-item\" [ngClass]=\"{ active: isCartRoute$ | async }\" (click)=\"navigateToShoppingCart()\">\n Shopping Cart ({{ products.length }})\n </nav>\n\n <nav class=\"nav-popover-toggle active\" (click)=\"cart?.overlayPanel?.toggle($event)\">\n <i *ngIf=\"!cart?.overlayPanel?.overlayVisible\" class=\"vl-icon vl-icon-chevron-down icon-with-margin\"></i>\n <i *ngIf=\"cart?.overlayPanel?.overlayVisible\" class=\"vl-icon vl-icon-chevron-up icon-with-margin\"></i>\n </nav>\n\n <vl-cart-preview #cart [products]=\"products\"></vl-cart-preview>\n </ng-container>\n</div>\n\n<div class=\"flow-controls\" *vlLet=\"objectDetails$ | async as details\">\n <ng-container *ngIf=\"isQuoteMode\">\n <span *ngIf=\"details.priceListName\">{{ details.priceListName }}</span>\n <span *ngIf=\"contextProperties.StartDate\">{{ contextProperties.StartDate | date: 'MM.dd.yyyy' }}</span>\n\n <span class=\"slash-separator\"></span>\n\n <span>MRR: <span class=\"font-semibold\">$0.00</span></span>\n <span>NRR: <span class=\"font-semibold\">$0.00</span></span>\n </ng-container>\n\n <ng-container *vlLet=\"isCartRoute$ | async as isCartRoute\">\n <p-button\n styleClass=\"p-button-outlined\"\n label=\"Generate Doc\"\n [disabled]=\"!isCartRoute\"\n tooltipPosition=\"bottom\"\n [showDelay]=\"300\"\n [pTooltip]=\"isCartRoute ? '' : disabledActionButtonTooltip\"\n ></p-button>\n\n <p-button\n *vlLet=\"isSaveInProgress$ | async as isSaveInProgress\"\n class=\"save-button\"\n styleClass=\"p-button-outlined\"\n [label]=\"isSaveInProgress ? 'Saving' : 'Save to Quote'\"\n (onClick)=\"saveButtonClickHandler()\"\n [loading]=\"isSaveInProgress\"\n ></p-button>\n\n <p-button\n *vlLet=\"isSubmitInProgress$ | async as isSubmitInProgress\"\n class=\"submit-button\"\n styleClass=\"p-button\"\n [label]=\"isSubmitInProgress ? 'Submitting' : 'Submit For Approval'\"\n [disabled]=\"!isCartRoute\"\n tooltipPosition=\"bottom\"\n [showDelay]=\"300\"\n [pTooltip]=\"isCartRoute ? '' : disabledActionButtonTooltip\"\n (onClick)=\"submitButtonClickHandler()\"\n [loading]=\"isSubmitInProgress\"\n ></p-button>\n </ng-container>\n</div>\n", styles: [":host{display:flex;align-items:center;height:48px;width:100%;background-color:var(--vl-primary-color);color:#fff;padding:0 32px;flex-shrink:0}::ng-deep .p-overlaypanel.flow-header-overlay .p-overlaypanel-content{background-color:#fff;padding:16px}::ng-deep .p-overlaypanel.flow-header-overlay.left:before{left:6px!important}::ng-deep .p-overlaypanel.flow-header-overlay.right:before{right:6px!important}::ng-deep .p-overlaypanel.flow-header-overlay.left .p-overlaypanel-content{margin-left:-16px}::ng-deep .p-overlaypanel.flow-header-overlay.right .p-overlaypanel-content{margin-right:-16px}::ng-deep .p-overlaypanel.flow-header-overlay:before{background-color:#fff}:host ::ng-deep .p-button{padding:5px 15px;font-size:12px}:host ::ng-deep .p-button{color:var(--vl-primary-color);background-color:#fff;border-color:#fff}:host ::ng-deep .p-button:enabled:hover{background-color:var(--vl-primary-color);color:#fff;border-color:#fff}:host ::ng-deep .p-button.p-button-outlined{background-color:var(--vl-primary-color);color:#fff;border-color:#fff}:host ::ng-deep .p-button.p-button-outlined:enabled:hover{color:var(--vl-primary-color);background-color:#fff;border-color:#fff}:host ::ng-deep .p-button .p-button-label{white-space:nowrap}:host ::ng-deep .save-button .p-button{width:120px}:host ::ng-deep .submit-button .p-button{width:160px}.vl-icon{display:inline-block}.flow-info{flex-shrink:0;display:flex;grid-gap:8px;gap:8px;align-items:center}.flow-info .nav-popover-toggle{margin-left:-8px}.flow-info .object-name{text-transform:capitalize}.flow-info .nav-back{font-weight:bold}.flow-info .nav-item:not(.disabled):hover,.flow-info .nav-popover-toggle:not(.disabled):hover{opacity:.6}nav{display:flex;align-items:center;cursor:pointer;padding:4px 0}nav.disabled{opacity:.6;cursor:default}nav .nav-icon{margin-right:10px}nav .icon-with-margin{margin:0 4px}nav a{color:#fff}nav.account-name{margin-left:4px;display:block;max-width:200px;overflow:hidden;text-overflow:ellipsis}nav.nav-popover-toggle{width:24px;display:flex;justify-content:center}nav.nav-popover-toggle i{pointer-events:none;margin:0}nav i{pointer-events:none}.dot-separator:after{content:\"\";display:block;width:4px;height:4px;border-radius:50%;background:#fff}.slash-separator:after{content:\"\";display:block;background:#fff;width:1px;height:16px}.flow-header-overlay__wrapper{width:360px}.flow-header-overlay__wrapper .close-icon{cursor:pointer}.flow-header-overlay__wrapper .info-list{list-style:none;padding:0;font-size:12px}.flow-header-overlay__wrapper .info-list__row{padding:8px 0;display:flex;justify-content:space-between}.flow-header-overlay__title{display:flex;justify-content:space-between;align-items:center;margin:0 0 24px}.flow-navigation{flex-grow:1;display:flex;grid-gap:16px;gap:16px;justify-content:center;font-weight:600}.flow-navigation .cart-nav-container{display:flex}.flow-navigation .nav-popover-toggle{margin-left:-14px}.flow-navigation .nav-item,.flow-navigation .nav-popover-toggle{opacity:.6}.flow-navigation .nav-item.active,.flow-navigation .nav-item:not(.disabled):hover,.flow-navigation .nav-popover-toggle.active,.flow-navigation .nav-popover-toggle:not(.disabled):hover{opacity:1}.flow-controls{flex-shrink:0;display:flex;align-items:center;grid-gap:8px;gap:8px}\n"], components: [{ type: i3__namespace.OverlayPanel, selector: "p-overlayPanel", inputs: ["dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { type: CartPreviewComponent, selector: "vl-cart-preview", inputs: ["products"] }, { type: i2__namespace.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass"], outputs: ["onClick", "onFocus", "onBlur"] }], directives: [{ type: i3__namespace$1.LetDirective, selector: "[vlLet]", inputs: ["vlLet"] }, { type: i9__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10__namespace.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { type: i2__namespace$2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i9__namespace.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "async": i9__namespace.AsyncPipe, "date": i9__namespace.DatePipe }, changeDetection: i0__namespace.ChangeDetectionStrategy.OnPush });
|
920
|
+
FlowHeaderComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.15", type: FlowHeaderComponent, selector: "vl-flow-header", ngImport: i0__namespace, template: "<div class=\"flow-info\" *vlLet=\"objectDetails$ | async as details\">\n <nav class=\"nav-item nav-back\" (click)=\"back()\">\n <i class=\"nav-icon vl-icon vl-icon-arrow-left\"></i>\n\n <span> Back </span>\n <span *ngIf=\"objectName\" class=\"object-name\"> To {{ objectName }}</span>\n </nav>\n\n <ng-container *ngIf=\"isAccountMode\">\n <span class=\"dot-separator\"></span>\n\n <span>Account name</span>\n\n <nav class=\"account-name\" [pTooltip]=\"contextProperties.Name ?? ''\" tooltipPosition=\"bottom\" [showDelay]=\"1000\">\n <a target=\"_blank\" [href]=\"getSalesforceObjectLink(contextProperties.Id)\">{{ contextProperties.Name }}</a>\n </nav>\n </ng-container>\n\n <ng-container *ngIf=\"isQuoteMode\">\n <span class=\"dot-separator\"></span>\n\n <span>Quote #{{ details.quoteNumber }}</span>\n\n <span class=\"dot-separator\"></span>\n\n <nav class=\"nav-item\" (click)=\"quoteDetails.toggle($event)\">\n <span>{{ status$ | async }}</span>\n\n <i *ngIf=\"!quoteDetails.overlayVisible\" class=\"vl-icon vl-icon-chevron-down icon-with-margin\"></i>\n <i *ngIf=\"quoteDetails.overlayVisible\" class=\"vl-icon vl-icon-chevron-up icon-with-margin\"></i>\n </nav>\n\n <p-overlayPanel styleClass=\"navigation-settings-overlay flow-header-overlay center\" #quoteDetails>\n <ng-template pTemplate>\n <div class=\"flow-header-overlay__wrapper\">\n <h2 class=\"flow-header-overlay__title\">\n <span>Quote Information</span>\n <i class=\"vl-icon vl-icon-close close-icon\" (click)=\"quoteDetails.hide()\"></i>\n </h2>\n\n <ul class=\"info-list\">\n <li class=\"info-list__row\">\n <span>Account Name:</span>\n <a target=\"_blank\" [href]=\"getSalesforceObjectLink(details.accountId)\">\n <span>{{ details.accountName }}</span>\n </a>\n </li>\n <li class=\"info-list__row\">\n <span>Opportunity Name:</span>\n <a target=\"_blank\" [href]=\"getSalesforceObjectLink(details.opportunityId)\">\n <span>{{ details.opportunityName }}</span>\n </a>\n </li>\n <li class=\"info-list__row\">\n <span>Quote Name:</span>\n <a target=\"_blank\" [href]=\"getSalesforceObjectLink(details.quoteId)\">\n <span>{{ details.quoteName }}</span>\n </a>\n </li>\n </ul>\n </div>\n </ng-template>\n </p-overlayPanel>\n </ng-container>\n</div>\n\n<div class=\"flow-navigation\">\n <nav class=\"nav-item\" [ngClass]=\"{ active: isCatalogRoute$ | async }\" (click)=\"navigateToCatalog()\">Catalog</nav>\n <nav class=\"nav-item disabled\" [ngClass]=\"{ active: isConfigurationRoute$ | async }\">Configurator</nav>\n <ng-container *vlLet=\"products$ | async as products\">\n <nav class=\"nav-item\" [ngClass]=\"{ active: isCartRoute$ | async }\" (click)=\"navigateToShoppingCart()\">\n Shopping Cart ({{ products.length }})\n </nav>\n\n <nav class=\"nav-popover-toggle active\" (click)=\"cart?.overlayPanel?.toggle($event)\">\n <i *ngIf=\"!cart?.overlayPanel?.overlayVisible\" class=\"vl-icon vl-icon-chevron-down icon-with-margin\"></i>\n <i *ngIf=\"cart?.overlayPanel?.overlayVisible\" class=\"vl-icon vl-icon-chevron-up icon-with-margin\"></i>\n </nav>\n\n <vl-cart-preview #cart [products]=\"products\"></vl-cart-preview>\n </ng-container>\n</div>\n\n<div class=\"flow-controls\" *vlLet=\"objectDetails$ | async as details\">\n <ng-container *vlLet=\"activePriceList$ | async as priceList\">\n <ng-container *ngIf=\"isAccountMode ?? assetPriceLists.length > 1\">\n <nav class=\"nav-item\" (click)=\"priceListsOverlay?.toggle($event)\">\n <span>{{ priceList.name }}</span>\n <i *ngIf=\"!priceListsOverlay?.overlayVisible\" class=\"vl-icon vl-icon-chevron-down icon-with-margin\"></i>\n <i *ngIf=\"priceListsOverlay?.overlayVisible\" class=\"vl-icon vl-icon-chevron-up icon-with-margin\"></i>\n </nav>\n\n <p-overlayPanel styleClass=\"price-list-overlay\" #priceListsOverlay>\n <ng-template pTemplate>\n <span\n *ngFor=\"let option of assetPriceLists\"\n class=\"price-list-option\"\n [class.active]=\"priceList.id === option.id\"\n (click)=\"selectPriceList(option.id); priceListsOverlay.hide()\"\n >{{ option.name }}</span\n >\n </ng-template>\n </p-overlayPanel>\n </ng-container>\n\n <ng-container *ngIf=\"isQuoteMode\">\n <span>{{ priceList.name }}</span>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"isQuoteMode\">\n <span *ngIf=\"contextProperties.StartDate\">{{ contextProperties.StartDate | date: 'MM.dd.yyyy' }}</span>\n\n <span class=\"slash-separator\"></span>\n\n <span>MRR: <span class=\"font-semibold\">$0.00</span></span>\n <span>NRR: <span class=\"font-semibold\">$0.00</span></span>\n </ng-container>\n\n <ng-container *vlLet=\"isCartRoute$ | async as isCartRoute\">\n <p-button\n styleClass=\"p-button-outlined\"\n label=\"Generate Doc\"\n [disabled]=\"!isCartRoute\"\n tooltipPosition=\"bottom\"\n [showDelay]=\"300\"\n [pTooltip]=\"isCartRoute ? '' : disabledActionButtonTooltip\"\n ></p-button>\n\n <p-button\n *vlLet=\"isSaveInProgress$ | async as isSaveInProgress\"\n class=\"save-button\"\n styleClass=\"p-button-outlined\"\n [label]=\"isSaveInProgress ? 'Saving' : 'Save to Quote'\"\n (onClick)=\"saveButtonClickHandler()\"\n [loading]=\"isSaveInProgress\"\n ></p-button>\n\n <p-button\n *vlLet=\"isSubmitInProgress$ | async as isSubmitInProgress\"\n class=\"submit-button\"\n styleClass=\"p-button\"\n [label]=\"isSubmitInProgress ? 'Submitting' : 'Submit For Approval'\"\n [disabled]=\"!isCartRoute\"\n tooltipPosition=\"bottom\"\n [showDelay]=\"300\"\n [pTooltip]=\"isCartRoute ? '' : disabledActionButtonTooltip\"\n (onClick)=\"submitButtonClickHandler()\"\n [loading]=\"isSubmitInProgress\"\n ></p-button>\n </ng-container>\n</div>\n", styles: [":host{display:flex;align-items:center;height:48px;width:100%;background-color:var(--vl-primary-color);color:#fff;padding:0 32px;flex-shrink:0}::ng-deep .p-overlaypanel.flow-header-overlay .p-overlaypanel-content{background-color:#fff;padding:16px}::ng-deep .p-overlaypanel.flow-header-overlay.left:before{left:6px!important}::ng-deep .p-overlaypanel.flow-header-overlay.right:before{right:6px!important}::ng-deep .p-overlaypanel.flow-header-overlay.left .p-overlaypanel-content{margin-left:-16px}::ng-deep .p-overlaypanel.flow-header-overlay.right .p-overlaypanel-content{margin-right:-16px}::ng-deep .p-overlaypanel.flow-header-overlay:before{background-color:#fff}::ng-deep .p-overlaypanel.price-list-overlay .p-overlaypanel-content{border-radius:5px;border-color:var(--vl-border-color);padding:0;display:flex;flex-direction:column;max-height:140px;overflow:auto}:host ::ng-deep .p-button{padding:5px 15px;font-size:12px}:host ::ng-deep .p-button{color:var(--vl-primary-color);background-color:#fff;border-color:#fff}:host ::ng-deep .p-button:enabled:hover{background-color:var(--vl-primary-color);color:#fff;border-color:#fff}:host ::ng-deep .p-button.p-button-outlined{background-color:var(--vl-primary-color);color:#fff;border-color:#fff}:host ::ng-deep .p-button.p-button-outlined:enabled:hover{color:var(--vl-primary-color);background-color:#fff;border-color:#fff}:host ::ng-deep .p-button .p-button-label{white-space:nowrap}:host ::ng-deep .save-button .p-button{width:120px}:host ::ng-deep .submit-button .p-button{width:160px}.vl-icon{display:inline-block}.flow-info{flex-shrink:0;display:flex;grid-gap:8px;gap:8px;align-items:center}.flow-info .nav-popover-toggle{margin-left:-8px}.flow-info .object-name{text-transform:capitalize}.flow-info .nav-back{font-weight:bold}.flow-info .nav-item:not(.disabled):hover,.flow-info .nav-popover-toggle:not(.disabled):hover{opacity:.6}nav{display:flex;align-items:center;cursor:pointer;padding:4px 0}nav.disabled{opacity:.6;cursor:default}nav .nav-icon{margin-right:10px}nav .icon-with-margin{margin:0 4px}nav a{color:#fff}nav.account-name{margin-left:4px;display:block;max-width:200px;overflow:hidden;text-overflow:ellipsis}nav.nav-popover-toggle{width:24px;display:flex;justify-content:center}nav.nav-popover-toggle i{pointer-events:none;margin:0}nav i{pointer-events:none}.dot-separator:after{content:\"\";display:block;width:4px;height:4px;border-radius:50%;background:#fff}.slash-separator:after{content:\"\";display:block;background:#fff;width:1px;height:16px}.flow-header-overlay__wrapper{width:360px}.flow-header-overlay__wrapper .close-icon{cursor:pointer}.flow-header-overlay__wrapper .info-list{list-style:none;padding:0;font-size:12px}.flow-header-overlay__wrapper .info-list__row{padding:8px 0;display:flex;justify-content:space-between}.flow-header-overlay__wrapper .info-list__row a{text-align:right}.flow-header-overlay__title{display:flex;justify-content:space-between;align-items:center;margin:0 0 24px}.flow-navigation{flex-grow:1;display:flex;grid-gap:16px;gap:16px;justify-content:center;font-weight:600}.flow-navigation .cart-nav-container{display:flex}.flow-navigation .nav-popover-toggle{margin-left:-14px}.flow-navigation .nav-item,.flow-navigation .nav-popover-toggle{opacity:.6}.flow-navigation .nav-item.active,.flow-navigation .nav-item:not(.disabled):hover,.flow-navigation .nav-popover-toggle.active,.flow-navigation .nav-popover-toggle:not(.disabled):hover{opacity:1}.price-list-option{padding:8px;color:var(--vl-primary-color);cursor:pointer}.price-list-option.active,.price-list-option:hover{background:var(--vl-secondary-nav-bg)}.flow-controls{flex-shrink:0;display:flex;align-items:center;grid-gap:8px;gap:8px}\n"], components: [{ type: i3__namespace.OverlayPanel, selector: "p-overlayPanel", inputs: ["dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { type: CartPreviewComponent, selector: "vl-cart-preview", inputs: ["products"] }, { type: i2__namespace.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass"], outputs: ["onClick", "onFocus", "onBlur"] }], directives: [{ type: i3__namespace$1.LetDirective, selector: "[vlLet]", inputs: ["vlLet"] }, { type: i9__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10__namespace.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { type: i2__namespace$2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i9__namespace.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i9__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i9__namespace.AsyncPipe, "date": i9__namespace.DatePipe }, changeDetection: i0__namespace.ChangeDetectionStrategy.OnPush });
|
915
921
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0__namespace, type: FlowHeaderComponent, decorators: [{
|
916
922
|
type: i0.Component,
|
917
923
|
args: [{
|
@@ -953,8 +959,8 @@
|
|
953
959
|
this.integrationState
|
954
960
|
.listen$(i4.FlowAction.FLOW_CONFIGURE_PRODUCT)
|
955
961
|
.pipe(rxjs.takeUntil(this.cleanup$), rxjs.tap(function (payload) {
|
956
|
-
var _a, _b
|
957
|
-
var productId = (_a = payload.productId) !== null && _a !== void 0 ? _a : (
|
962
|
+
var _a, _b;
|
963
|
+
var productId = (_a = payload.productId) !== null && _a !== void 0 ? _a : (_b = _this.quoteDraftService.currentState.find(function (li) { return li.id === payload.lineItemId; })) === null || _b === void 0 ? void 0 : _b.productId;
|
958
964
|
if (productId) {
|
959
965
|
_this.flowRouterService.navigateToProductConfiguration(productId, payload.lineItemId);
|
960
966
|
}
|
@@ -974,7 +980,7 @@
|
|
974
980
|
if (!lineItem) {
|
975
981
|
return rxjs.of(undefined);
|
976
982
|
}
|
977
|
-
var currentState = _this.
|
983
|
+
var currentState = _this.quoteDraftService.currentState;
|
978
984
|
var isNewLineItem = currentState.every(function (li) { return li.id !== lineItem.id; });
|
979
985
|
var updatedState;
|
980
986
|
if (isNewLineItem) {
|
@@ -983,7 +989,8 @@
|
|
983
989
|
else {
|
984
990
|
updatedState = currentState.map(function (li) { return (li.id === lineItem.id ? lineItem : li); });
|
985
991
|
}
|
986
|
-
|
992
|
+
_this.quoteDraftService.setCurrentLineItemState(updatedState);
|
993
|
+
return _this.flowConfigurationService.calculate$();
|
987
994
|
}), rxjs.tap(function () {
|
988
995
|
_this.configurationService.hasUnsavedChanges = false;
|
989
996
|
_this.flowRouterService.navigateToShoppingCart();
|
@@ -1425,7 +1432,7 @@
|
|
1425
1432
|
}
|
1426
1433
|
LegacyProductComponent.prototype.ngOnInit = function () {
|
1427
1434
|
var _this = this;
|
1428
|
-
this.quoteDraftService.
|
1435
|
+
this.quoteDraftService.quoteDraft$
|
1429
1436
|
.pipe(operators.first(), operators.takeUntil(this.destroyed$))
|
1430
1437
|
.subscribe(function (quote) { return _this.init(quote, _this.route.snapshot.queryParams); });
|
1431
1438
|
this.runtimeService.onSolutionStopEvent.pipe(operators.take(1)).subscribe(function (lineItem) { return _this.onSolutionStop(lineItem); });
|
@@ -1441,7 +1448,7 @@
|
|
1441
1448
|
lineItem.actionCode = (_a = lineItem.actionCode) !== null && _a !== void 0 ? _a : 'ADD';
|
1442
1449
|
};
|
1443
1450
|
LegacyProductComponent.prototype.onSolutionCancel = function () {
|
1444
|
-
this.quoteDraftService.
|
1451
|
+
this.quoteDraftService.quoteDraft$.pipe(operators.first(), operators.takeUntil(this.destroyed$)).subscribe(function (quote) {
|
1445
1452
|
window['VELO_BACK_FN'].apply(null, [quote.quoteId]);
|
1446
1453
|
});
|
1447
1454
|
};
|
@@ -1455,7 +1462,7 @@
|
|
1455
1462
|
};
|
1456
1463
|
LegacyProductComponent.prototype.onSolutionStop = function (lineItem) {
|
1457
1464
|
var _this = this;
|
1458
|
-
this.quoteDraftService.
|
1465
|
+
this.quoteDraftService.quoteDraft$.pipe(operators.first(), operators.takeUntil(this.destroyed$)).subscribe(function (quote) {
|
1459
1466
|
var quoteToUpsert = Object.assign(Object.assign({}, quote), { context: _this.contextService.resolve(), currentState: __spreadArray(__spreadArray([], __read((_this.currentStateService.currentState || []).filter(function (li) { return li.id !== lineItem.id; }))), [lineItem]) });
|
1460
1467
|
_this.quoteApiService
|
1461
1468
|
.upsertQuote(quoteToUpsert)
|
@@ -1569,7 +1576,7 @@
|
|
1569
1576
|
}
|
1570
1577
|
ProductComponent.prototype.ngOnInit = function () {
|
1571
1578
|
var _this = this;
|
1572
|
-
this.quoteDraftService.
|
1579
|
+
this.quoteDraftService.quoteDraft$.pipe(rxjs.first(), rxjs.takeUntil(this.destroy$)).subscribe(function (quote) { return _this.init(quote); });
|
1573
1580
|
};
|
1574
1581
|
ProductComponent.prototype.ngOnDestroy = function () {
|
1575
1582
|
this.destroy$.next();
|
@@ -1597,14 +1604,18 @@
|
|
1597
1604
|
return;
|
1598
1605
|
}
|
1599
1606
|
var lineItemId = this.getLineItemId(quote, productId, contextProperties.lineItemId);
|
1600
|
-
var currentStateItem =
|
1601
|
-
|
1607
|
+
var currentStateItem = quote.currentState.find(function (_c) {
|
1608
|
+
var id = _c.id;
|
1609
|
+
return id === lineItemId;
|
1610
|
+
});
|
1602
1611
|
if (currentStateItem) {
|
1603
1612
|
this.configurationService.updateCurrentStates({
|
1604
1613
|
configurableRamp: currentStateItem,
|
1605
1614
|
currentState: quote.currentState,
|
1615
|
+
asset: this.getAsset(quote, currentStateItem),
|
1606
1616
|
});
|
1607
1617
|
}
|
1618
|
+
var offeringId = (currentStateItem !== null && currentStateItem !== void 0 ? currentStateItem : {}).offeringId;
|
1608
1619
|
this.runtimeService
|
1609
1620
|
.init({ productId: productId, offeringId: offeringId })
|
1610
1621
|
.pipe(rxjs.tap(function (context) { return (_this.uiDefinition = context === null || context === void 0 ? void 0 : context.uiDefinition); }), rxjs.switchMap(function () { return _this.customize(productId); }), rxjs.switchMap(function () { return _this.configurationService.configure(); }), rxjs.tap(function () { return _this.state$.next({ loading: false, failure: false }); }), rxjs.catchError(function (error) {
|
@@ -1626,6 +1637,9 @@
|
|
1626
1637
|
}
|
1627
1638
|
return id;
|
1628
1639
|
};
|
1640
|
+
ProductComponent.prototype.getAsset = function (quote, lineItem) {
|
1641
|
+
return quote.initialState.find(function (a) { return a.id === lineItem.openOrderLineItemId || a.id === lineItem.assetId; });
|
1642
|
+
};
|
1629
1643
|
return ProductComponent;
|
1630
1644
|
}());
|
1631
1645
|
ProductComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0__namespace, type: ProductComponent, deps: [{ token: i2__namespace$1.ContextService }, { token: i2__namespace$1.ConfigurationRuntimeService }, { token: i2__namespace$1.ConfigurationService }, { token: i2__namespace$1.QuoteDraftService }, { token: i2__namespace$2.MessageService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0__namespace.ɵɵFactoryTarget.Component });
|
@@ -1837,10 +1851,11 @@
|
|
1837
1851
|
}] });
|
1838
1852
|
|
1839
1853
|
var FlowResolver = /** @class */ (function () {
|
1840
|
-
function FlowResolver(router, flowsApiService, routerService) {
|
1854
|
+
function FlowResolver(router, flowsApiService, routerService, contextService) {
|
1841
1855
|
this.router = router;
|
1842
1856
|
this.flowsApiService = flowsApiService;
|
1843
1857
|
this.routerService = routerService;
|
1858
|
+
this.contextService = contextService;
|
1844
1859
|
}
|
1845
1860
|
FlowResolver.prototype.handleError = function (route, message, queryParams) {
|
1846
1861
|
var parentUrl = this.routerService.getFlowRootPath(route);
|
@@ -1866,6 +1881,12 @@
|
|
1866
1881
|
var flowQueryParams = properties.queryParams, entryPath = properties.entryPath;
|
1867
1882
|
var isProductFlow = entryPath.includes('/product');
|
1868
1883
|
var mergedParams = Object.assign(Object.assign(Object.assign({}, queryParams), flowQueryParams), Object.assign({}, (isProductFlow && { standalone: true })));
|
1884
|
+
var contextProperties = Object.entries(mergedParams).reduce(function (trunk, _a) {
|
1885
|
+
var _b;
|
1886
|
+
var _c = __read(_a, 2), key = _c[0], value = _c[1];
|
1887
|
+
return (Object.assign(Object.assign({}, trunk), (_b = {}, _b[key] = String(value), _b)));
|
1888
|
+
}, {});
|
1889
|
+
_this.contextService.update({ properties: contextProperties });
|
1869
1890
|
var parentUrl = _this.routerService.getFlowRootPath(route);
|
1870
1891
|
var entryUrl = String(entryPath !== null && entryPath !== void 0 ? entryPath : '')
|
1871
1892
|
.split('/')
|
@@ -1883,11 +1904,11 @@
|
|
1883
1904
|
};
|
1884
1905
|
return FlowResolver;
|
1885
1906
|
}());
|
1886
|
-
FlowResolver.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0__namespace, type: FlowResolver, deps: [{ token: i1__namespace$1.Router }, { token: i1__namespace$2.FlowsApiService }, { token: FlowRouterService }], target: i0__namespace.ɵɵFactoryTarget.Injectable });
|
1907
|
+
FlowResolver.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0__namespace, type: FlowResolver, deps: [{ token: i1__namespace$1.Router }, { token: i1__namespace$2.FlowsApiService }, { token: FlowRouterService }, { token: i2__namespace$1.ContextService }], target: i0__namespace.ɵɵFactoryTarget.Injectable });
|
1887
1908
|
FlowResolver.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0__namespace, type: FlowResolver });
|
1888
1909
|
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0__namespace, type: FlowResolver, decorators: [{
|
1889
1910
|
type: i0.Injectable
|
1890
|
-
}], ctorParameters: function () { return [{ type: i1__namespace$1.Router }, { type: i1__namespace$2.FlowsApiService }, { type: FlowRouterService }]; } });
|
1911
|
+
}], ctorParameters: function () { return [{ type: i1__namespace$1.Router }, { type: i1__namespace$2.FlowsApiService }, { type: FlowRouterService }, { type: i2__namespace$1.ContextService }]; } });
|
1891
1912
|
|
1892
1913
|
var QuoteResolver = /** @class */ (function () {
|
1893
1914
|
function QuoteResolver(router, quoteDraftService, routerService, contextService, flowConfiguration) {
|
@@ -1901,22 +1922,15 @@
|
|
1901
1922
|
var parentUrl = this.routerService.getFlowRootPath(route);
|
1902
1923
|
return rxjs.from(this.router.navigate([parentUrl, '404'], { state: { message: message } }));
|
1903
1924
|
};
|
1904
|
-
QuoteResolver.prototype.initFlow$ = function () {
|
1905
|
-
if (this.quoteDraftService.isStandalone) {
|
1906
|
-
return rxjs.of(undefined);
|
1907
|
-
}
|
1908
|
-
return this.flowConfiguration.initialize$();
|
1909
|
-
};
|
1910
1925
|
QuoteResolver.prototype.resolve = function (route) {
|
1911
1926
|
var _this = this;
|
1912
1927
|
var headerId = this.contextService.resolve().headerId;
|
1913
|
-
var quote = this.quoteDraftService.
|
1928
|
+
var quote = this.quoteDraftService.quoteDraft;
|
1914
1929
|
if (quote && quote.quoteId === headerId) {
|
1915
1930
|
return rxjs.of(true);
|
1916
1931
|
}
|
1917
1932
|
var queryParams = route.queryParams;
|
1918
|
-
this.
|
1919
|
-
return this.quoteDraftService.init(headerId, queryParams).pipe(rxjs.switchMap(function () { return _this.initFlow$(); }), rxjs.catchError(function (e) {
|
1933
|
+
return this.quoteDraftService.init(headerId, queryParams).pipe(rxjs.catchError(function (e) {
|
1920
1934
|
var message = e instanceof http.HttpErrorResponse ? e.error.message : e;
|
1921
1935
|
return _this.handleError(route, message);
|
1922
1936
|
}));
|