@veloceapps/sdk 11.0.0-7 → 11.0.0-71
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/cms/cms.actions.d.ts +92 -29
- package/cms/components/element-renderer/element-renderer.component.d.ts +3 -10
- package/cms/services/element-context.service.d.ts +0 -1
- package/cms/types/common.types.d.ts +2 -0
- package/cms/types/index.d.ts +0 -1
- package/cms/utils/path.utils.d.ts +1 -2
- package/cms/vendor-map.d.ts +17 -40
- package/core/index.d.ts +1 -1
- package/core/modules/configuration/index.d.ts +3 -4
- package/core/modules/configuration/services/configuration-runtime.service.d.ts +8 -19
- package/core/modules/configuration/services/configuration-state.service.d.ts +8 -8
- package/core/modules/configuration/services/configuration.service.d.ts +23 -47
- package/core/modules/configuration/services/test-mode-configuration.service.d.ts +23 -0
- package/core/modules/configuration/types/configuration-runtime.types.d.ts +0 -5
- package/core/modules/configuration/types/configuration.types.d.ts +4 -2
- package/core/modules/configuration/types/index.d.ts +2 -0
- package/core/modules/flow-configuration/index.d.ts +0 -3
- package/core/modules/flow-configuration/services/flow-configuration.service.d.ts +11 -38
- package/core/operators/filter-successful-execute.operator.d.ts +3 -0
- package/core/operators/index.d.ts +1 -0
- package/core/services/catalog-products.service.d.ts +11 -0
- package/core/services/flow-info.service.d.ts +27 -12
- package/core/services/flow-state-configuration.service.d.ts +2 -8
- package/core/services/flow-state.service.d.ts +13 -22
- package/core/services/index.d.ts +3 -3
- package/core/services/integration.state.d.ts +1 -1
- package/core/services/product-images.service.d.ts +3 -3
- package/core/services/runtime-settings.service.d.ts +1 -1
- package/core/services/sales-transaction.service.d.ts +27 -0
- package/core/types/flow-customization.types.d.ts +2 -2
- package/core/types/flow-state.types.d.ts +2 -2
- package/core/types/index.d.ts +0 -1
- package/core/utils/index.d.ts +2 -2
- package/core/utils/transaction-item.utils.d.ts +7 -0
- package/core/utils/transaction-item.worker.d.ts +8 -0
- package/esm2020/cms/cms.actions.mjs +93 -71
- package/esm2020/cms/cms.default.mjs +2 -3
- package/esm2020/cms/components/element-renderer/element-renderer.component.mjs +7 -64
- package/esm2020/cms/components/preview/preview.component.mjs +3 -3
- package/esm2020/cms/services/element-context.service.mjs +1 -1
- package/esm2020/cms/types/common.types.mjs +1 -1
- package/esm2020/cms/types/index.mjs +1 -2
- package/esm2020/cms/utils/element.utils.mjs +3 -3
- package/esm2020/cms/utils/elements-resolver.mjs +16 -5
- package/esm2020/cms/utils/path.utils.mjs +1 -10
- package/esm2020/cms/vendor-map.mjs +17 -18
- package/esm2020/core/core.module.mjs +7 -7
- package/esm2020/core/index.mjs +2 -2
- package/esm2020/core/modules/configuration/configuration.module.mjs +14 -4
- package/esm2020/core/modules/configuration/index.mjs +4 -5
- package/esm2020/core/modules/configuration/services/configuration-runtime.service.mjs +16 -101
- package/esm2020/core/modules/configuration/services/configuration-state.service.mjs +65 -77
- package/esm2020/core/modules/configuration/services/configuration.service.mjs +104 -223
- package/esm2020/core/modules/configuration/services/test-mode-configuration.service.mjs +74 -0
- package/esm2020/core/modules/configuration/types/configuration-runtime.types.mjs +1 -1
- package/esm2020/core/modules/configuration/types/configuration.types.mjs +1 -1
- package/esm2020/core/modules/configuration/types/index.mjs +3 -0
- package/esm2020/core/modules/flow-configuration/flow-configuration.module.mjs +3 -4
- package/esm2020/core/modules/flow-configuration/index.mjs +1 -4
- package/esm2020/core/modules/flow-configuration/services/flow-configuration.service.mjs +44 -128
- package/esm2020/core/operators/filter-successful-execute.operator.mjs +5 -0
- package/esm2020/core/operators/index.mjs +2 -0
- package/esm2020/core/services/catalog-products.service.mjs +25 -0
- package/esm2020/core/services/flow-info.service.mjs +82 -31
- package/esm2020/core/services/flow-state-configuration.service.mjs +10 -25
- package/esm2020/core/services/flow-state.service.mjs +60 -172
- package/esm2020/core/services/index.mjs +4 -4
- package/esm2020/core/services/integration.state.mjs +2 -2
- package/esm2020/core/services/product-images.service.mjs +8 -8
- package/esm2020/core/services/runtime-settings.service.mjs +3 -3
- package/esm2020/core/services/sales-transaction.service.mjs +62 -0
- package/esm2020/core/types/flow-customization.types.mjs +1 -1
- package/esm2020/core/types/flow-state.types.mjs +1 -1
- package/esm2020/core/types/index.mjs +1 -2
- package/esm2020/core/utils/index.mjs +3 -3
- package/esm2020/core/utils/transaction-item.utils.mjs +60 -0
- package/esm2020/core/utils/transaction-item.worker.mjs +16 -0
- package/esm2020/src/components/flow-header/flow-header.component.mjs +8 -12
- package/esm2020/src/components/guided-selling/guided-selling.component.mjs +8 -12
- package/esm2020/src/flow-routing.module.mjs +12 -41
- package/esm2020/src/flow.component.mjs +5 -5
- package/esm2020/src/guards/flow.guard.mjs +13 -14
- package/esm2020/src/guards/product-unload.guard.mjs +7 -9
- package/esm2020/src/index.mjs +1 -3
- package/esm2020/src/pages/assets/assets.component.mjs +8 -9
- package/esm2020/src/pages/catalog/catalog.component.mjs +8 -9
- package/esm2020/src/pages/debug/debug.component.mjs +14 -23
- package/esm2020/src/pages/product/product.component.mjs +12 -89
- package/esm2020/src/pages/product/product.module.mjs +5 -5
- package/esm2020/src/pages/record-not-found/record-not-found.component.mjs +5 -6
- package/esm2020/src/pages/shopping-cart/shopping-cart.component.mjs +8 -9
- package/esm2020/src/resolvers/flow.resolver.mjs +10 -18
- package/esm2020/src/resolvers/pcm-model.resolver.mjs +12 -0
- package/esm2020/src/resolvers/sales-transaction.resolver.mjs +64 -0
- package/esm2020/src/resolvers/ui-definition.resolver.mjs +42 -0
- package/esm2020/src/services/flow-dialog.service.mjs +8 -8
- package/esm2020/src/services/flow-router.service.mjs +16 -33
- package/esm2020/src/services/flow.service.mjs +13 -54
- package/esm2020/src/types/index.mjs +2 -3
- package/esm2020/src/types/route.types.mjs +1 -1
- package/fesm2015/veloceapps-sdk-cms.mjs +138 -275
- package/fesm2015/veloceapps-sdk-cms.mjs.map +1 -1
- package/fesm2015/veloceapps-sdk-core.mjs +808 -1658
- package/fesm2015/veloceapps-sdk-core.mjs.map +1 -1
- package/fesm2015/veloceapps-sdk.mjs +188 -801
- package/fesm2015/veloceapps-sdk.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk-cms.mjs +134 -267
- package/fesm2020/veloceapps-sdk-cms.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk-core.mjs +867 -1738
- package/fesm2020/veloceapps-sdk-core.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk.mjs +188 -795
- package/fesm2020/veloceapps-sdk.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/flow-header/flow-header.component.d.ts +3 -3
- package/src/components/guided-selling/guided-selling.component.d.ts +3 -3
- package/src/flow-routing.module.d.ts +1 -2
- package/src/flow.component.d.ts +2 -2
- package/src/guards/product-unload.guard.d.ts +5 -6
- package/src/index.d.ts +0 -2
- package/src/pages/assets/assets.component.d.ts +3 -3
- package/src/pages/catalog/catalog.component.d.ts +3 -3
- package/src/pages/debug/debug.component.d.ts +2 -5
- package/src/pages/product/product.component.d.ts +5 -14
- package/src/pages/product/product.module.d.ts +1 -1
- package/src/pages/record-not-found/record-not-found.component.d.ts +2 -3
- package/src/pages/shopping-cart/shopping-cart.component.d.ts +3 -3
- package/src/resolvers/flow.resolver.d.ts +5 -6
- package/src/resolvers/pcm-model.resolver.d.ts +3 -0
- package/src/resolvers/sales-transaction.resolver.d.ts +18 -0
- package/src/resolvers/ui-definition.resolver.d.ts +3 -0
- package/src/services/flow-dialog.service.d.ts +5 -4
- package/src/services/flow-router.service.d.ts +4 -6
- package/src/services/flow.service.d.ts +2 -7
- package/src/types/index.d.ts +1 -2
- package/src/types/route.types.d.ts +0 -5
- package/cms/plugins/configuration.plugin.d.ts +0 -23
- package/cms/types/configuration.types.d.ts +0 -21
- package/core/modules/configuration/helpers.d.ts +0 -6
- package/core/modules/configuration/services/runtime-context.service.d.ts +0 -12
- package/core/modules/flow-configuration/services/flow-update.service.d.ts +0 -13
- package/core/modules/flow-configuration/types/update.types.d.ts +0 -12
- package/core/services/context.service.d.ts +0 -23
- package/core/services/quote-draft.service.d.ts +0 -50
- package/core/types/runtime.types.d.ts +0 -30
- package/core/utils/line-item.utils.d.ts +0 -25
- package/core/utils/line-item.worker.d.ts +0 -9
- package/esm2020/cms/plugins/configuration.plugin.mjs +0 -109
- package/esm2020/cms/types/configuration.types.mjs +0 -2
- package/esm2020/core/modules/configuration/helpers.mjs +0 -73
- package/esm2020/core/modules/configuration/services/runtime-context.service.mjs +0 -45
- package/esm2020/core/modules/flow-configuration/services/flow-update.service.mjs +0 -138
- package/esm2020/core/modules/flow-configuration/types/update.types.mjs +0 -2
- package/esm2020/core/services/context.service.mjs +0 -91
- package/esm2020/core/services/quote-draft.service.mjs +0 -192
- package/esm2020/core/types/runtime.types.mjs +0 -16
- package/esm2020/core/utils/line-item.utils.mjs +0 -187
- package/esm2020/core/utils/line-item.worker.mjs +0 -19
- package/esm2020/src/guards/context.guard.mjs +0 -91
- package/esm2020/src/guards/index.mjs +0 -2
- package/esm2020/src/pages/remote/remote.component.mjs +0 -342
- package/esm2020/src/pages/remote/remote.module.mjs +0 -20
- package/esm2020/src/pages/remote/remote.types.mjs +0 -2
- package/esm2020/src/resolvers/quote.resolver.mjs +0 -82
- package/esm2020/src/types/context-route.types.mjs +0 -2
- package/esm2020/src/types/metrics.types.mjs +0 -2
- package/esm2020/src/utils/flow.utils.mjs +0 -25
- package/esm2020/src/utils/index.mjs +0 -2
- package/src/guards/context.guard.d.ts +0 -19
- package/src/guards/index.d.ts +0 -1
- package/src/pages/remote/remote.component.d.ts +0 -46
- package/src/pages/remote/remote.module.d.ts +0 -10
- package/src/pages/remote/remote.types.d.ts +0 -4
- package/src/resolvers/quote.resolver.d.ts +0 -19
- package/src/types/context-route.types.d.ts +0 -5
- package/src/types/metrics.types.d.ts +0 -5
- package/src/utils/flow.utils.d.ts +0 -8
- package/src/utils/index.d.ts +0 -1
@@ -2,31 +2,31 @@ import * as i4 from '@angular/common';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
3
3
|
import * as i0 from '@angular/core';
|
4
4
|
import { Component, ChangeDetectionStrategy, NgModule, Optional, Inject, Injectable, inject } from '@angular/core';
|
5
|
-
import * as i1$1 from '@veloceapps/api';
|
6
5
|
import { ApiModule } from '@veloceapps/api';
|
7
|
-
import * as i2
|
6
|
+
import * as i2 from '@veloceapps/components';
|
8
7
|
import { ToastType, LoaderModule, LetDirectiveModule } from '@veloceapps/components';
|
9
8
|
import * as i5 from '@veloceapps/sdk/cms';
|
10
9
|
import { btoaSafe, PreviewModule, FlowAction, LauncherModule } from '@veloceapps/sdk/cms';
|
11
|
-
import * as
|
12
|
-
import { FLOW_CUSTOMIZATION,
|
10
|
+
import * as i3$1 from '@veloceapps/sdk/core';
|
11
|
+
import { FLOW_CUSTOMIZATION, RuntimeSettingsService, FlowStateService, FlowInfoService, SalesTransactionService, ConfigurationService, IntegrationState, ConfigurationRuntimeService, SdkCoreModule } from '@veloceapps/sdk/core';
|
13
12
|
import * as i3 from 'primeng/button';
|
14
13
|
import { ButtonModule } from 'primeng/button';
|
15
14
|
import * as i1 from 'primeng/dynamicdialog';
|
16
|
-
import
|
15
|
+
import * as i1$1 from '@veloceapps/api/v2';
|
16
|
+
import { UIDefinitionsAdminApiService } from '@veloceapps/api/v2';
|
17
|
+
import { BehaviorSubject, Subject, filter, first, tap, takeUntil, catchError, of, map, switchMap, shareReplay, startWith, distinctUntilChanged, from, take, combineLatest } from 'rxjs';
|
17
18
|
import { DomHandler } from 'primeng/dom';
|
18
19
|
import * as i1$2 from '@angular/router';
|
19
20
|
import { NavigationEnd, NavigationStart, NavigationCancel, NavigationError, RouterModule } from '@angular/router';
|
20
|
-
import { mapShoppingCartSettings, getMaxRenewalTermsValue,
|
21
|
+
import { mapShoppingCartSettings, getMaxRenewalTermsValue, SalesforceIdUtils, UITemplateType, isVeloceError, extractErrorDetails } from '@veloceapps/core';
|
21
22
|
import { HttpErrorResponse, HttpParams } from '@angular/common/http';
|
22
|
-
import * as
|
23
|
+
import * as i4$1 from '@angular/forms';
|
23
24
|
import { FormGroup, FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
24
25
|
import { DropdownModule } from 'primeng/dropdown';
|
25
|
-
import * as
|
26
|
+
import * as i7 from 'primeng/inputtext';
|
26
27
|
import { InputTextModule } from 'primeng/inputtext';
|
27
|
-
import * as
|
28
|
+
import * as i5$1 from 'primeng/radiobutton';
|
28
29
|
import { RadioButtonModule } from 'primeng/radiobutton';
|
29
|
-
import * as i2$2 from 'primeng/api';
|
30
30
|
import { catchError as catchError$1 } from 'rxjs/operators';
|
31
31
|
|
32
32
|
const VELOCE_FLOW_ROOT_ROUTE = 'VELOCE_FLOW_ROOT_ROUTE';
|
@@ -76,8 +76,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
76
76
|
}] });
|
77
77
|
|
78
78
|
class FlowHeaderComponent {
|
79
|
-
constructor(
|
80
|
-
this.
|
79
|
+
constructor(templatesAdminApiService, flowStateService, flowInfo, toastService, customizationService) {
|
80
|
+
this.templatesAdminApiService = templatesAdminApiService;
|
81
81
|
this.flowStateService = flowStateService;
|
82
82
|
this.flowInfo = flowInfo;
|
83
83
|
this.toastService = toastService;
|
@@ -97,9 +97,6 @@ class FlowHeaderComponent {
|
|
97
97
|
}
|
98
98
|
initialize() {
|
99
99
|
this.templateApiName = this.flowInfo.flow?.properties.templates?.flowHeader ?? '';
|
100
|
-
if (this.flowInfo.isLegacy && !this.templateApiName) {
|
101
|
-
return;
|
102
|
-
}
|
103
100
|
this.generateUIDefinition$()
|
104
101
|
.pipe(tap(uiDef => {
|
105
102
|
if (!uiDef) {
|
@@ -134,7 +131,7 @@ class FlowHeaderComponent {
|
|
134
131
|
if (!template) {
|
135
132
|
return of(undefined);
|
136
133
|
}
|
137
|
-
return this.
|
134
|
+
return this.templatesAdminApiService.fetchComponentsAttachments$(template.id);
|
138
135
|
}
|
139
136
|
generateUIDefinition$() {
|
140
137
|
return of(undefined).pipe(tap(() => {
|
@@ -148,7 +145,6 @@ class FlowHeaderComponent {
|
|
148
145
|
const uiDef = {
|
149
146
|
name: '',
|
150
147
|
createdTimestamp: 0,
|
151
|
-
primary: true,
|
152
148
|
type: 'DEFAULT',
|
153
149
|
version: 2,
|
154
150
|
children: metaList.map(meta => ({
|
@@ -162,12 +158,12 @@ class FlowHeaderComponent {
|
|
162
158
|
}));
|
163
159
|
}
|
164
160
|
}
|
165
|
-
FlowHeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowHeaderComponent, deps: [{ token: i1$1.
|
161
|
+
FlowHeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowHeaderComponent, deps: [{ token: i1$1.UITemplatesAdminApiService }, { token: i3$1.FlowStateService }, { token: i3$1.FlowInfoService }, { token: i2.ToastService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
166
162
|
FlowHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: FlowHeaderComponent, selector: "vl-flow-new-header", ngImport: i0, template: "<ng-container *ngIf=\"uiDefinition$ | async as uiDefinition\">\n <vl-cms-preview [uiDefinition]=\"uiDefinition\"></vl-cms-preview>\n</ng-container>\n", styles: [":host,vl-cms-preview{display:contents}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.PreviewComponent, selector: "vl-cms-preview", inputs: ["uiDefinition", "config"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
167
163
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowHeaderComponent, decorators: [{
|
168
164
|
type: Component,
|
169
165
|
args: [{ selector: 'vl-flow-new-header', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"uiDefinition$ | async as uiDefinition\">\n <vl-cms-preview [uiDefinition]=\"uiDefinition\"></vl-cms-preview>\n</ng-container>\n", styles: [":host,vl-cms-preview{display:contents}\n"] }]
|
170
|
-
}], ctorParameters: function () { return [{ type: i1$1.
|
166
|
+
}], ctorParameters: function () { return [{ type: i1$1.UITemplatesAdminApiService }, { type: i3$1.FlowStateService }, { type: i3$1.FlowInfoService }, { type: i2.ToastService }, { type: undefined, decorators: [{
|
171
167
|
type: Optional
|
172
168
|
}, {
|
173
169
|
type: Inject,
|
@@ -189,8 +185,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
189
185
|
}] });
|
190
186
|
|
191
187
|
class GuidedSellingComponent {
|
192
|
-
constructor(
|
193
|
-
this.
|
188
|
+
constructor(templatesAdminApiService, flowStateService, flowInfo, toastService, customizationService) {
|
189
|
+
this.templatesAdminApiService = templatesAdminApiService;
|
194
190
|
this.flowStateService = flowStateService;
|
195
191
|
this.flowInfo = flowInfo;
|
196
192
|
this.toastService = toastService;
|
@@ -210,9 +206,6 @@ class GuidedSellingComponent {
|
|
210
206
|
}
|
211
207
|
initialize() {
|
212
208
|
this.templateApiName = this.flowInfo.flow?.properties.templates?.guidedSelling ?? '';
|
213
|
-
if (this.flowInfo.isLegacy && !this.templateApiName) {
|
214
|
-
return;
|
215
|
-
}
|
216
209
|
this.generateUIDefinition$()
|
217
210
|
.pipe(tap(uiDef => {
|
218
211
|
if (!uiDef) {
|
@@ -247,7 +240,7 @@ class GuidedSellingComponent {
|
|
247
240
|
if (!template) {
|
248
241
|
return of(undefined);
|
249
242
|
}
|
250
|
-
return this.
|
243
|
+
return this.templatesAdminApiService.fetchComponentsAttachments$(template.id);
|
251
244
|
}
|
252
245
|
generateUIDefinition$() {
|
253
246
|
return of(undefined).pipe(tap(() => {
|
@@ -261,7 +254,6 @@ class GuidedSellingComponent {
|
|
261
254
|
const uiDef = {
|
262
255
|
name: '',
|
263
256
|
createdTimestamp: 0,
|
264
|
-
primary: true,
|
265
257
|
type: 'DEFAULT',
|
266
258
|
version: 2,
|
267
259
|
children: metaList.map(meta => ({
|
@@ -275,12 +267,12 @@ class GuidedSellingComponent {
|
|
275
267
|
}));
|
276
268
|
}
|
277
269
|
}
|
278
|
-
GuidedSellingComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: GuidedSellingComponent, deps: [{ token: i1$1.
|
270
|
+
GuidedSellingComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: GuidedSellingComponent, deps: [{ token: i1$1.UITemplatesAdminApiService }, { token: i3$1.FlowStateService }, { token: i3$1.FlowInfoService }, { token: i2.ToastService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
279
271
|
GuidedSellingComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: GuidedSellingComponent, selector: "vl-flow-guided-selling", ngImport: i0, template: "<ng-container *ngIf=\"uiDefinition$ | async as uiDefinition\">\n <vl-cms-preview [uiDefinition]=\"uiDefinition\"></vl-cms-preview>\n</ng-container>\n", styles: [":host,vl-cms-preview{display:contents}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.PreviewComponent, selector: "vl-cms-preview", inputs: ["uiDefinition", "config"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
280
272
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: GuidedSellingComponent, decorators: [{
|
281
273
|
type: Component,
|
282
274
|
args: [{ selector: 'vl-flow-guided-selling', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"uiDefinition$ | async as uiDefinition\">\n <vl-cms-preview [uiDefinition]=\"uiDefinition\"></vl-cms-preview>\n</ng-container>\n", styles: [":host,vl-cms-preview{display:contents}\n"] }]
|
283
|
-
}], ctorParameters: function () { return [{ type: i1$1.
|
275
|
+
}], ctorParameters: function () { return [{ type: i1$1.UITemplatesAdminApiService }, { type: i3$1.FlowStateService }, { type: i3$1.FlowInfoService }, { type: i2.ToastService }, { type: undefined, decorators: [{
|
284
276
|
type: Optional
|
285
277
|
}, {
|
286
278
|
type: Inject,
|
@@ -334,10 +326,10 @@ const configurePrimengShadowDOM = () => {
|
|
334
326
|
};
|
335
327
|
|
336
328
|
class FlowDialogService {
|
337
|
-
constructor(dialogService,
|
329
|
+
constructor(dialogService, runtimeSettings, flowInfoService) {
|
338
330
|
this.dialogService = dialogService;
|
339
|
-
this.contextService = contextService;
|
340
331
|
this.runtimeSettings = runtimeSettings;
|
332
|
+
this.flowInfoService = flowInfoService;
|
341
333
|
}
|
342
334
|
show(config) {
|
343
335
|
return this.dialogService.open(FlowDialogComponent, {
|
@@ -358,8 +350,8 @@ class FlowDialogService {
|
|
358
350
|
});
|
359
351
|
}
|
360
352
|
showReadonlyModeDialog() {
|
361
|
-
const
|
362
|
-
const objectName =
|
353
|
+
const mode = this.flowInfoService.context.mode;
|
354
|
+
const objectName = mode ? mode[0]?.toUpperCase() + mode.substring(1).toLowerCase() : 'Object';
|
363
355
|
return this.show({
|
364
356
|
title: 'Error',
|
365
357
|
description: `${objectName} Cannot be Saved`,
|
@@ -431,20 +423,18 @@ class FlowDialogService {
|
|
431
423
|
return dialogFunction(dialog);
|
432
424
|
}
|
433
425
|
}
|
434
|
-
FlowDialogService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowDialogService, deps: [{ token: i1.DialogService }, { token:
|
426
|
+
FlowDialogService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowDialogService, deps: [{ token: i1.DialogService }, { token: i3$1.RuntimeSettingsService }, { token: i3$1.FlowInfoService }], target: i0.ɵɵFactoryTarget.Injectable });
|
435
427
|
FlowDialogService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowDialogService });
|
436
428
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowDialogService, decorators: [{
|
437
429
|
type: Injectable
|
438
|
-
}], ctorParameters: function () { return [{ type: i1.DialogService }, { type:
|
430
|
+
}], ctorParameters: function () { return [{ type: i1.DialogService }, { type: i3$1.RuntimeSettingsService }, { type: i3$1.FlowInfoService }]; } });
|
439
431
|
|
440
432
|
class FlowRouterService {
|
441
|
-
constructor(router, route,
|
433
|
+
constructor(router, route, integrationState, flowInfoService) {
|
442
434
|
this.router = router;
|
443
435
|
this.route = route;
|
444
|
-
this.contextService = contextService;
|
445
436
|
this.integrationState = integrationState;
|
446
437
|
this.flowInfoService = flowInfoService;
|
447
|
-
this.flowStateService = flowStateService;
|
448
438
|
this.urlHistory = [];
|
449
439
|
this.getLastChildRoute = (route) => {
|
450
440
|
return route.firstChild ? this.getLastChildRoute(route.firstChild) : route;
|
@@ -538,7 +528,7 @@ class FlowRouterService {
|
|
538
528
|
this.router.navigateByUrl(prevUrl);
|
539
529
|
}
|
540
530
|
}
|
541
|
-
navigateTo(path, productId,
|
531
|
+
navigateTo(path, productId, transactionItemId) {
|
542
532
|
if (path === 'shopping-cart') {
|
543
533
|
this.navigateToShoppingCart();
|
544
534
|
}
|
@@ -549,31 +539,16 @@ class FlowRouterService {
|
|
549
539
|
this.navigateToAssets();
|
550
540
|
}
|
551
541
|
else if (path === 'product' && productId) {
|
552
|
-
this.navigateToProductConfiguration(productId,
|
542
|
+
this.navigateToProductConfiguration(productId, transactionItemId);
|
553
543
|
}
|
554
544
|
}
|
555
|
-
navigateToProductConfiguration(productId,
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
}
|
561
|
-
}
|
562
|
-
else {
|
563
|
-
updateContext$ = this.flowStateService.dispatch$(UITemplateType.FLOW_ENGINE, 'UPDATE_CONTEXT_PROPERTIES', {
|
564
|
-
productId,
|
565
|
-
lineItemId: lineItemId ?? '',
|
566
|
-
});
|
567
|
-
}
|
568
|
-
updateContext$
|
569
|
-
.pipe(tap(() => {
|
570
|
-
const routeSnapshot = this.getLastChildRouteSnapshot(this.route.snapshot);
|
571
|
-
const flowRouteUrl = this.getFlowRootPath(routeSnapshot);
|
572
|
-
this.router.navigate([flowRouteUrl, 'product'], {
|
573
|
-
queryParams: { ...routeSnapshot.queryParams, productId },
|
574
|
-
});
|
575
|
-
}))
|
576
|
-
.subscribe();
|
545
|
+
navigateToProductConfiguration(productId, transactionItemId) {
|
546
|
+
this.flowInfoService.updateContext({ productId, transactionItemId });
|
547
|
+
const routeSnapshot = this.getLastChildRouteSnapshot(this.route.snapshot);
|
548
|
+
const flowRouteUrl = this.getFlowRootPath(routeSnapshot);
|
549
|
+
this.router.navigate([flowRouteUrl, 'product'], {
|
550
|
+
queryParams: { ...routeSnapshot.queryParams, productId, transactionItemId },
|
551
|
+
});
|
577
552
|
}
|
578
553
|
navigateToShoppingCart() {
|
579
554
|
const routeSnapshot = this.getLastChildRouteSnapshot(this.route.snapshot);
|
@@ -610,23 +585,20 @@ class FlowRouterService {
|
|
610
585
|
this.router.navigate([], { relativeTo: route, queryParams: { ...routeSnapshot.queryParams, ...queryParams } });
|
611
586
|
}
|
612
587
|
}
|
613
|
-
FlowRouterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowRouterService, deps: [{ token: i1$2.Router }, { token: i1$2.ActivatedRoute }, { token:
|
588
|
+
FlowRouterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowRouterService, deps: [{ token: i1$2.Router }, { token: i1$2.ActivatedRoute }, { token: i3$1.IntegrationState }, { token: i3$1.FlowInfoService }], target: i0.ɵɵFactoryTarget.Injectable });
|
614
589
|
FlowRouterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowRouterService, providedIn: 'root' });
|
615
590
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowRouterService, decorators: [{
|
616
591
|
type: Injectable,
|
617
592
|
args: [{ providedIn: 'root' }]
|
618
|
-
}], ctorParameters: function () { return [{ type: i1$2.Router }, { type: i1$2.ActivatedRoute }, { type:
|
593
|
+
}], ctorParameters: function () { return [{ type: i1$2.Router }, { type: i1$2.ActivatedRoute }, { type: i3$1.IntegrationState }, { type: i3$1.FlowInfoService }]; } });
|
619
594
|
|
620
595
|
class FlowService {
|
621
|
-
constructor(integrationState, flowRouterService,
|
596
|
+
constructor(integrationState, flowRouterService, configurationService, configurationStateService, flowDialogService, flowStateService) {
|
622
597
|
this.integrationState = integrationState;
|
623
598
|
this.flowRouterService = flowRouterService;
|
624
|
-
this.quoteDraftService = quoteDraftService;
|
625
599
|
this.configurationService = configurationService;
|
626
600
|
this.configurationStateService = configurationStateService;
|
627
601
|
this.flowDialogService = flowDialogService;
|
628
|
-
this.flowConfigurationService = flowConfigurationService;
|
629
|
-
this.flowInfoService = flowInfoService;
|
630
602
|
this.flowStateService = flowStateService;
|
631
603
|
this.cleanup$ = new Subject();
|
632
604
|
}
|
@@ -636,16 +608,9 @@ class FlowService {
|
|
636
608
|
initSubscriptions() {
|
637
609
|
this.integrationState
|
638
610
|
.listen$(FlowAction.FLOW_CONFIGURE_PRODUCT)
|
639
|
-
.pipe(
|
640
|
-
if (this.flowInfoService.isLegacy) {
|
641
|
-
const productId = payload.productId ??
|
642
|
-
this.quoteDraftService.currentState.find(li => li.id === payload.lineItemId)?.productId;
|
643
|
-
return of({ ...payload, productId });
|
644
|
-
}
|
645
|
-
return this.prepareConfiguration$(payload.lineItemId).pipe(map(() => payload));
|
646
|
-
}), tap(payload => {
|
611
|
+
.pipe(tap(payload => {
|
647
612
|
if (payload.productId) {
|
648
|
-
this.flowRouterService.navigateToProductConfiguration(payload.productId, payload.
|
613
|
+
this.flowRouterService.navigateToProductConfiguration(payload.productId, payload.transactionItemId);
|
649
614
|
}
|
650
615
|
else {
|
651
616
|
console.warn("Parameter 'productId' is needed to start configuration");
|
@@ -669,7 +634,7 @@ class FlowService {
|
|
669
634
|
this.integrationState.dispatch(FlowAction.ConfigureProductAction(payload));
|
670
635
|
}
|
671
636
|
else {
|
672
|
-
this.flowRouterService.navigateTo(payload.path, payload.productId, payload.
|
637
|
+
this.flowRouterService.navigateTo(payload.path, payload.productId, payload.transactionItemId);
|
673
638
|
}
|
674
639
|
}), takeUntil(this.cleanup$))
|
675
640
|
.subscribe();
|
@@ -689,17 +654,10 @@ class FlowService {
|
|
689
654
|
.subscribe();
|
690
655
|
this.integrationState
|
691
656
|
.listen$(FlowAction.FLOW_APPLY_PRODUCT_CONFIGURATION)
|
692
|
-
.pipe(switchMap(() => {
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
else {
|
697
|
-
return this.configurationStateService.saveConfiguration(true).pipe(switchMap(() => this.configurationStateService.cancelConfiguration()), switchMap(() => this.flowStateService.dispatch$(UITemplateType.FLOW_ENGINE, 'MODIFY_ASSETS', {
|
698
|
-
addConfiguringAssetId: true,
|
699
|
-
enable: true,
|
700
|
-
})));
|
701
|
-
}
|
702
|
-
}), tap(() => {
|
657
|
+
.pipe(switchMap(() => this.configurationStateService.saveConfiguration()), switchMap(() => this.configurationStateService.cancelConfiguration()), switchMap(() => this.flowStateService.dispatch$(UITemplateType.FLOW_ENGINE, 'MODIFY_ASSETS', {
|
658
|
+
addConfiguringAssetId: true,
|
659
|
+
enable: true,
|
660
|
+
})), tap(() => {
|
703
661
|
this.configurationService.hasUnsavedChanges = false;
|
704
662
|
this.flowRouterService.navigateToShoppingCart();
|
705
663
|
}), takeUntil(this.cleanup$))
|
@@ -715,36 +673,12 @@ class FlowService {
|
|
715
673
|
.pipe(map(path => path.queryParams['productId']), takeUntil(this.cleanup$))
|
716
674
|
.subscribe(productId => this.integrationState.patchState({ productId }));
|
717
675
|
}
|
718
|
-
prepareConfiguration$(lineItemId) {
|
719
|
-
if (!lineItemId) {
|
720
|
-
return of(undefined);
|
721
|
-
}
|
722
|
-
return this.flowStateService.dispatch$(UITemplateType.FLOW_ENGINE, 'UPDATE_PRICE_LIST', {
|
723
|
-
lineItemId,
|
724
|
-
});
|
725
|
-
}
|
726
|
-
legacyApplyConfiguration() {
|
727
|
-
const quoteDraft = this.quoteDraftService.quoteDraft;
|
728
|
-
const lineItem = this.configurationService.getSnapshot();
|
729
|
-
if (!quoteDraft || !lineItem) {
|
730
|
-
return of(undefined);
|
731
|
-
}
|
732
|
-
const isNewLineItem = quoteDraft.currentState.every(li => li.id !== lineItem.id);
|
733
|
-
let updatedState;
|
734
|
-
if (isNewLineItem) {
|
735
|
-
updatedState = [...quoteDraft.currentState, lineItem];
|
736
|
-
}
|
737
|
-
else {
|
738
|
-
updatedState = quoteDraft.currentState.map(li => (li.id === lineItem.id ? lineItem : li));
|
739
|
-
}
|
740
|
-
return this.flowConfigurationService.calculate$({ ...quoteDraft, currentState: updatedState });
|
741
|
-
}
|
742
676
|
}
|
743
|
-
FlowService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowService, deps: [{ token: i5.IntegrationState }, { token: FlowRouterService }, { token:
|
677
|
+
FlowService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowService, deps: [{ token: i5.IntegrationState }, { token: FlowRouterService }, { token: i3$1.ConfigurationService }, { token: i3$1.ConfigurationStateService }, { token: FlowDialogService }, { token: i3$1.FlowStateService }], target: i0.ɵɵFactoryTarget.Injectable });
|
744
678
|
FlowService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowService });
|
745
679
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowService, decorators: [{
|
746
680
|
type: Injectable
|
747
|
-
}], ctorParameters: function () { return [{ type: i5.IntegrationState }, { type: FlowRouterService }, { type:
|
681
|
+
}], ctorParameters: function () { return [{ type: i5.IntegrationState }, { type: FlowRouterService }, { type: i3$1.ConfigurationService }, { type: i3$1.ConfigurationStateService }, { type: FlowDialogService }, { type: i3$1.FlowStateService }]; } });
|
748
682
|
|
749
683
|
class FlowGuidedSellingService {
|
750
684
|
constructor(integrationState) {
|
@@ -768,21 +702,21 @@ class FlowGuidedSellingService {
|
|
768
702
|
.subscribe();
|
769
703
|
}
|
770
704
|
}
|
771
|
-
FlowGuidedSellingService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowGuidedSellingService, deps: [{ token:
|
705
|
+
FlowGuidedSellingService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowGuidedSellingService, deps: [{ token: i3$1.IntegrationState }], target: i0.ɵɵFactoryTarget.Injectable });
|
772
706
|
FlowGuidedSellingService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowGuidedSellingService });
|
773
707
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowGuidedSellingService, decorators: [{
|
774
708
|
type: Injectable
|
775
|
-
}], ctorParameters: function () { return [{ type:
|
709
|
+
}], ctorParameters: function () { return [{ type: i3$1.IntegrationState }]; } });
|
776
710
|
|
777
711
|
class FlowComponent {
|
778
|
-
constructor(routerService, flowService,
|
712
|
+
constructor(routerService, flowService, flowInfoService, guidedSellingService) {
|
779
713
|
this.routerService = routerService;
|
780
714
|
this.flowService = flowService;
|
781
|
-
this.
|
715
|
+
this.flowInfoService = flowInfoService;
|
782
716
|
this.guidedSellingService = guidedSellingService;
|
783
717
|
this.isLoading$ = this.routerService.loading$;
|
784
|
-
this.showHeader$ = combineLatest([this.routerService.route$, this.
|
785
|
-
this.isStandalone$ = this.
|
718
|
+
this.showHeader$ = combineLatest([this.routerService.route$, this.flowInfoService.flow$]).pipe(map(([route, flow]) => route.data['showHeader'] && !flow?.properties.standalone));
|
719
|
+
this.isStandalone$ = this.flowInfoService.flow$.pipe(map(flow => Boolean(flow?.properties.standalone)));
|
786
720
|
this.guidedSellingVisible$ = this.guidedSellingService.isVisible$;
|
787
721
|
this.flowService.initSubscriptions();
|
788
722
|
}
|
@@ -790,140 +724,36 @@ class FlowComponent {
|
|
790
724
|
this.flowService.cleanup();
|
791
725
|
}
|
792
726
|
}
|
793
|
-
FlowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowComponent, deps: [{ token: FlowRouterService }, { token: FlowService }, { token:
|
794
|
-
FlowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: FlowComponent, selector: "vl-flow", ngImport: i0, template: "<vl-flow-new-header *ngIf=\"showHeader$ | async\"></vl-flow-new-header>\n\n<div class=\"flow-content\">\n <div class=\"loading-overlay\" *ngIf=\"isLoading$ | async\">\n <vl-loader label=\"LOADING\"></vl-loader>\n </div>\n\n <router-outlet></router-outlet>\n\n <div class=\"guided-selling\" [ngClass]=\"{ hidden: (guidedSellingVisible$ | async) === false }\">\n <vl-flow-guided-selling *ngIf=\"(isStandalone$ | async) !== true\"></vl-flow-guided-selling>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%}.flow-content{flex-grow:1;position:relative;overflow:hidden}.loading-overlay{position:absolute;height:100%;width:100%;inset:0;background-color:#fff;z-index:999}.guided-selling{position:absolute;top:0;width:100%;height:100%;z-index:100}.hidden{display:none}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: i2
|
727
|
+
FlowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowComponent, deps: [{ token: FlowRouterService }, { token: FlowService }, { token: i3$1.FlowInfoService }, { token: FlowGuidedSellingService }], target: i0.ɵɵFactoryTarget.Component });
|
728
|
+
FlowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: FlowComponent, selector: "vl-flow", ngImport: i0, template: "<vl-flow-new-header *ngIf=\"showHeader$ | async\"></vl-flow-new-header>\n\n<div class=\"flow-content\">\n <div class=\"loading-overlay\" *ngIf=\"isLoading$ | async\">\n <vl-loader label=\"LOADING\"></vl-loader>\n </div>\n\n <router-outlet></router-outlet>\n\n <div class=\"guided-selling\" [ngClass]=\"{ hidden: (guidedSellingVisible$ | async) === false }\">\n <vl-flow-guided-selling *ngIf=\"(isStandalone$ | async) !== true\"></vl-flow-guided-selling>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%}.flow-content{flex-grow:1;position:relative;overflow:hidden}.loading-overlay{position:absolute;height:100%;width:100%;inset:0;background-color:#fff;z-index:999}.guided-selling{position:absolute;top:0;width:100%;height:100%;z-index:100}.hidden{display:none}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: i2.LoaderComponent, selector: "vl-loader", inputs: ["label", "overlayVisible"] }, { kind: "component", type: FlowHeaderComponent, selector: "vl-flow-new-header" }, { kind: "component", type: GuidedSellingComponent, selector: "vl-flow-guided-selling" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
795
729
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowComponent, decorators: [{
|
796
730
|
type: Component,
|
797
731
|
args: [{ selector: 'vl-flow', changeDetection: ChangeDetectionStrategy.OnPush, template: "<vl-flow-new-header *ngIf=\"showHeader$ | async\"></vl-flow-new-header>\n\n<div class=\"flow-content\">\n <div class=\"loading-overlay\" *ngIf=\"isLoading$ | async\">\n <vl-loader label=\"LOADING\"></vl-loader>\n </div>\n\n <router-outlet></router-outlet>\n\n <div class=\"guided-selling\" [ngClass]=\"{ hidden: (guidedSellingVisible$ | async) === false }\">\n <vl-flow-guided-selling *ngIf=\"(isStandalone$ | async) !== true\"></vl-flow-guided-selling>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%}.flow-content{flex-grow:1;position:relative;overflow:hidden}.loading-overlay{position:absolute;height:100%;width:100%;inset:0;background-color:#fff;z-index:999}.guided-selling{position:absolute;top:0;width:100%;height:100%;z-index:100}.hidden{display:none}\n"] }]
|
798
|
-
}], ctorParameters: function () { return [{ type: FlowRouterService }, { type: FlowService }, { type:
|
799
|
-
|
800
|
-
const getFlowObjectIdPropertyName = (id) => {
|
801
|
-
const objectName = SalesforceIdUtils.getSfObjectNameById(id);
|
802
|
-
switch (objectName) {
|
803
|
-
case 'Account':
|
804
|
-
return 'accountId';
|
805
|
-
case 'Order':
|
806
|
-
return 'orderId';
|
807
|
-
case 'Quote':
|
808
|
-
default:
|
809
|
-
return 'quoteId';
|
810
|
-
}
|
811
|
-
};
|
812
|
-
const getDefaultProperties = (params) => {
|
813
|
-
const properties = {};
|
814
|
-
let standalone = params.flowParams?.standalone;
|
815
|
-
if (params.flowParams?.entryPath.includes('/product') || params.mode === ConfigurationContextMode.REMOTE) {
|
816
|
-
standalone = standalone ?? true;
|
817
|
-
}
|
818
|
-
if (standalone != null) {
|
819
|
-
properties.standalone = standalone ? 'true' : 'false';
|
820
|
-
}
|
821
|
-
return properties;
|
822
|
-
};
|
823
|
-
|
824
|
-
class ContextGuard {
|
825
|
-
constructor(router, routerService, contextService, runtimeSettingsService) {
|
826
|
-
this.router = router;
|
827
|
-
this.routerService = routerService;
|
828
|
-
this.contextService = contextService;
|
829
|
-
this.runtimeSettingsService = runtimeSettingsService;
|
830
|
-
}
|
831
|
-
checkActivation(route) {
|
832
|
-
const { queryParams } = route;
|
833
|
-
const { accountId, quoteId, orderId } = queryParams;
|
834
|
-
const rpcMessage = window.RPC_MESSAGE;
|
835
|
-
const mode = this.getConfigurationContextMode(accountId, quoteId, orderId, rpcMessage);
|
836
|
-
// Restrict if mode is not defined
|
837
|
-
if (mode == null) {
|
838
|
-
return this.routerService.showErrorPage$('Mode is undefined');
|
839
|
-
}
|
840
|
-
const headerId = accountId || quoteId || orderId || this.rpcMessageId || 'empty-for-test-mode';
|
841
|
-
// Allow if context is already initialized with the same headerId
|
842
|
-
if (this.contextService.isInitialized) {
|
843
|
-
const currentContext = this.contextService.resolve();
|
844
|
-
if (headerId && currentContext.headerId === headerId) {
|
845
|
-
return of(true);
|
846
|
-
}
|
847
|
-
}
|
848
|
-
// Initialize context and runtime settings
|
849
|
-
return forkJoin([this.contextService.create(headerId, mode), this.runtimeSettingsService.create()]).pipe(tap(([context]) => {
|
850
|
-
this.contextService.update({
|
851
|
-
...context,
|
852
|
-
properties: {
|
853
|
-
...context.properties,
|
854
|
-
...(queryParams ?? {}),
|
855
|
-
...getDefaultProperties({ mode }),
|
856
|
-
},
|
857
|
-
});
|
858
|
-
// Init currency settings
|
859
|
-
this.runtimeSettingsService.initCurrency(context.properties['CurrencyIsoCode']);
|
860
|
-
}), map(() => true), catchError(e => {
|
861
|
-
const message = e instanceof HttpErrorResponse ? e.error.message : e;
|
862
|
-
const errorDetails = isVeloceError(e.error) ? extractErrorDetails(e.error) : [];
|
863
|
-
return this.routerService.showErrorPage$(message, errorDetails);
|
864
|
-
}));
|
865
|
-
}
|
866
|
-
canActivate(route) {
|
867
|
-
return this.checkActivation(route);
|
868
|
-
}
|
869
|
-
canActivateChild(childRoute) {
|
870
|
-
return this.checkActivation(childRoute);
|
871
|
-
}
|
872
|
-
get rpcMessageId() {
|
873
|
-
if (!window.RPC_MESSAGE) {
|
874
|
-
return;
|
875
|
-
}
|
876
|
-
const rpcMessage = JSON.parse(window.RPC_MESSAGE);
|
877
|
-
const veloceReferenceId = rpcMessage.configuration?.VeloceReferenceId;
|
878
|
-
const quoteId = rpcMessage.quote?.Id;
|
879
|
-
return veloceReferenceId || quoteId;
|
880
|
-
}
|
881
|
-
getConfigurationContextMode(accountId, quoteId, orderId, rpcMessage) {
|
882
|
-
if (accountId) {
|
883
|
-
return ConfigurationContextMode.ACCOUNT;
|
884
|
-
}
|
885
|
-
if (quoteId) {
|
886
|
-
return ConfigurationContextMode.QUOTE;
|
887
|
-
}
|
888
|
-
if (orderId) {
|
889
|
-
return ConfigurationContextMode.ORDER;
|
890
|
-
}
|
891
|
-
if (rpcMessage) {
|
892
|
-
return ConfigurationContextMode.REMOTE;
|
893
|
-
}
|
894
|
-
return;
|
895
|
-
}
|
896
|
-
}
|
897
|
-
ContextGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ContextGuard, deps: [{ token: i1$2.Router }, { token: FlowRouterService }, { token: i2.ContextService }, { token: i2.RuntimeSettingsService }], target: i0.ɵɵFactoryTarget.Injectable });
|
898
|
-
ContextGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ContextGuard });
|
899
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ContextGuard, decorators: [{
|
900
|
-
type: Injectable
|
901
|
-
}], ctorParameters: function () { return [{ type: i1$2.Router }, { type: FlowRouterService }, { type: i2.ContextService }, { type: i2.RuntimeSettingsService }]; } });
|
732
|
+
}], ctorParameters: function () { return [{ type: FlowRouterService }, { type: FlowService }, { type: i3$1.FlowInfoService }, { type: FlowGuidedSellingService }]; } });
|
902
733
|
|
903
734
|
const keepFlowInitialized = (route) => {
|
904
|
-
const
|
735
|
+
const routerService = inject(FlowRouterService);
|
736
|
+
const runtimeSettingsService = inject(RuntimeSettingsService);
|
905
737
|
const flowState = inject(FlowStateService);
|
906
738
|
const flowInfoService = inject(FlowInfoService);
|
907
|
-
const
|
908
|
-
const quoteDraft = inject(QuoteDraftService);
|
739
|
+
const salesTrasnsactionService = inject(SalesTransactionService);
|
909
740
|
const configurationService = inject(ConfigurationService);
|
910
741
|
const integrationState = inject(IntegrationState);
|
911
742
|
const { flowId } = route.queryParams;
|
912
|
-
|
913
|
-
if (flow && flow?.id === flowId) {
|
743
|
+
if (flowInfoService.isFlowInitialized && flowInfoService.flow.id === flowId) {
|
914
744
|
return true;
|
915
745
|
}
|
916
746
|
// Cleanup
|
917
|
-
flowState.
|
918
|
-
|
747
|
+
flowState.reset();
|
748
|
+
salesTrasnsactionService.reset();
|
919
749
|
configurationService.reset();
|
920
|
-
integrationState.
|
921
|
-
flowInfoService.
|
922
|
-
contextService.delete();
|
750
|
+
integrationState.reset();
|
751
|
+
flowInfoService.reset();
|
923
752
|
if (!flowId) {
|
924
753
|
return true;
|
925
754
|
}
|
926
|
-
return flowInfoService.init$(flowId, route.queryParams)
|
755
|
+
return runtimeSettingsService.create().pipe(tap(() => runtimeSettingsService.initCurrency('USD')), switchMap(() => flowInfoService.init$(flowId, route.queryParams)), map(() => true), catchError(e => {
|
756
|
+
console.error(e);
|
927
757
|
const message = e instanceof HttpErrorResponse ? e.error.message : e;
|
928
758
|
const errorDetails = isVeloceError(e.error) ? extractErrorDetails(e.error) : [];
|
929
759
|
return routerService.showErrorPage$(message, errorDetails);
|
@@ -931,22 +761,20 @@ const keepFlowInitialized = (route) => {
|
|
931
761
|
};
|
932
762
|
|
933
763
|
class ProductUnloadGuard {
|
934
|
-
constructor(router,
|
764
|
+
constructor(router, flowInfoService, configurationService, flowDialogService) {
|
935
765
|
this.router = router;
|
936
|
-
this.
|
937
|
-
this.quoteDraftService = quoteDraftService;
|
766
|
+
this.flowInfoService = flowInfoService;
|
938
767
|
this.configurationService = configurationService;
|
939
768
|
this.flowDialogService = flowDialogService;
|
940
769
|
}
|
941
770
|
canDeactivate(_, route, currentState, nextState) {
|
942
771
|
let observable = of(true);
|
943
|
-
if (!this.
|
772
|
+
if (!this.flowInfoService.flow.properties.standalone && this.configurationService.hasUnsavedChanges) {
|
944
773
|
observable = this.flowDialogService.showUnsavedChangesDialog();
|
945
774
|
}
|
946
775
|
return observable.pipe(map(unload => {
|
947
776
|
if (unload) {
|
948
777
|
this.configurationService.reset();
|
949
|
-
this.contextService.update({ properties: { productId: undefined, lineItemId: undefined } });
|
950
778
|
if (!nextState || currentState.url === nextState.url) {
|
951
779
|
return true;
|
952
780
|
}
|
@@ -964,11 +792,11 @@ class ProductUnloadGuard {
|
|
964
792
|
}));
|
965
793
|
}
|
966
794
|
}
|
967
|
-
ProductUnloadGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductUnloadGuard, deps: [{ token: i1$2.Router }, { token:
|
795
|
+
ProductUnloadGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductUnloadGuard, deps: [{ token: i1$2.Router }, { token: i3$1.FlowInfoService }, { token: i3$1.ConfigurationService }, { token: FlowDialogService }], target: i0.ɵɵFactoryTarget.Injectable });
|
968
796
|
ProductUnloadGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductUnloadGuard });
|
969
797
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductUnloadGuard, decorators: [{
|
970
798
|
type: Injectable
|
971
|
-
}], ctorParameters: function () { return [{ type: i1$2.Router }, { type:
|
799
|
+
}], ctorParameters: function () { return [{ type: i1$2.Router }, { type: i3$1.FlowInfoService }, { type: i3$1.ConfigurationService }, { type: FlowDialogService }]; } });
|
972
800
|
|
973
801
|
class RootGuard {
|
974
802
|
constructor(router, routerService) {
|
@@ -1011,8 +839,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
1011
839
|
}], ctorParameters: function () { return [{ type: i1$2.Router }, { type: FlowRouterService }]; } });
|
1012
840
|
|
1013
841
|
class AssetsComponent {
|
1014
|
-
constructor(
|
1015
|
-
this.
|
842
|
+
constructor(templatesAdminApiService, cdr, toastService, flowInfo, customizationService) {
|
843
|
+
this.templatesAdminApiService = templatesAdminApiService;
|
1016
844
|
this.cdr = cdr;
|
1017
845
|
this.toastService = toastService;
|
1018
846
|
this.flowInfo = flowInfo;
|
@@ -1065,7 +893,7 @@ class AssetsComponent {
|
|
1065
893
|
if (!template) {
|
1066
894
|
return of(undefined);
|
1067
895
|
}
|
1068
|
-
return this.
|
896
|
+
return this.templatesAdminApiService.fetchComponentsAttachments$(template.id);
|
1069
897
|
}
|
1070
898
|
generateUIDefinition$() {
|
1071
899
|
return of(undefined).pipe(tap(() => {
|
@@ -1079,7 +907,6 @@ class AssetsComponent {
|
|
1079
907
|
const uiDef = {
|
1080
908
|
name: '',
|
1081
909
|
createdTimestamp: 0,
|
1082
|
-
primary: true,
|
1083
910
|
type: 'DEFAULT',
|
1084
911
|
version: 2,
|
1085
912
|
children: metaList.map(meta => ({
|
@@ -1093,12 +920,12 @@ class AssetsComponent {
|
|
1093
920
|
}));
|
1094
921
|
}
|
1095
922
|
}
|
1096
|
-
AssetsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AssetsComponent, deps: [{ token: i1$1.
|
1097
|
-
AssetsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: AssetsComponent, selector: "vl-flow-assets", ngImport: i0, template: "<ng-container *ngIf=\"state$ | async as state\">\n <vl-loader *ngIf=\"state.loading; else content\" [label]=\"'Loading UI'\"></vl-loader>\n\n <ng-template #content>\n <ng-container *ngIf=\"!state.failure\">\n <vl-cms-preview [uiDefinition]=\"uiDefinition\"></vl-cms-preview>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.PreviewComponent, selector: "vl-cms-preview", inputs: ["uiDefinition", "config"] }, { kind: "component", type: i2
|
923
|
+
AssetsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AssetsComponent, deps: [{ token: i1$1.UITemplatesAdminApiService }, { token: i0.ChangeDetectorRef }, { token: i2.ToastService }, { token: i3$1.FlowInfoService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
924
|
+
AssetsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: AssetsComponent, selector: "vl-flow-assets", ngImport: i0, template: "<ng-container *ngIf=\"state$ | async as state\">\n <vl-loader *ngIf=\"state.loading; else content\" [label]=\"'Loading UI'\"></vl-loader>\n\n <ng-template #content>\n <ng-container *ngIf=\"!state.failure\">\n <vl-cms-preview [uiDefinition]=\"uiDefinition\"></vl-cms-preview>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.PreviewComponent, selector: "vl-cms-preview", inputs: ["uiDefinition", "config"] }, { kind: "component", type: i2.LoaderComponent, selector: "vl-loader", inputs: ["label", "overlayVisible"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
1098
925
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AssetsComponent, decorators: [{
|
1099
926
|
type: Component,
|
1100
927
|
args: [{ selector: 'vl-flow-assets', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"state$ | async as state\">\n <vl-loader *ngIf=\"state.loading; else content\" [label]=\"'Loading UI'\"></vl-loader>\n\n <ng-template #content>\n <ng-container *ngIf=\"!state.failure\">\n <vl-cms-preview [uiDefinition]=\"uiDefinition\"></vl-cms-preview>\n </ng-container>\n </ng-template>\n</ng-container>\n" }]
|
1101
|
-
}], ctorParameters: function () { return [{ type: i1$1.
|
928
|
+
}], ctorParameters: function () { return [{ type: i1$1.UITemplatesAdminApiService }, { type: i0.ChangeDetectorRef }, { type: i2.ToastService }, { type: i3$1.FlowInfoService }, { type: undefined, decorators: [{
|
1102
929
|
type: Optional
|
1103
930
|
}, {
|
1104
931
|
type: Inject,
|
@@ -1120,8 +947,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
1120
947
|
}] });
|
1121
948
|
|
1122
949
|
class CatalogComponent {
|
1123
|
-
constructor(
|
1124
|
-
this.
|
950
|
+
constructor(templatesAdminApiService, cdr, toastService, flowInfo, customizationService) {
|
951
|
+
this.templatesAdminApiService = templatesAdminApiService;
|
1125
952
|
this.cdr = cdr;
|
1126
953
|
this.toastService = toastService;
|
1127
954
|
this.flowInfo = flowInfo;
|
@@ -1174,7 +1001,7 @@ class CatalogComponent {
|
|
1174
1001
|
if (!template) {
|
1175
1002
|
return of(undefined);
|
1176
1003
|
}
|
1177
|
-
return this.
|
1004
|
+
return this.templatesAdminApiService.fetchComponentsAttachments$(template.id);
|
1178
1005
|
}
|
1179
1006
|
generateUIDefinition$() {
|
1180
1007
|
return of(undefined).pipe(tap(() => {
|
@@ -1188,7 +1015,6 @@ class CatalogComponent {
|
|
1188
1015
|
const uiDef = {
|
1189
1016
|
name: '',
|
1190
1017
|
createdTimestamp: 0,
|
1191
|
-
primary: true,
|
1192
1018
|
type: 'DEFAULT',
|
1193
1019
|
version: 2,
|
1194
1020
|
children: metaList.map(meta => ({
|
@@ -1202,12 +1028,12 @@ class CatalogComponent {
|
|
1202
1028
|
}));
|
1203
1029
|
}
|
1204
1030
|
}
|
1205
|
-
CatalogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogComponent, deps: [{ token: i1$1.
|
1206
|
-
CatalogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: CatalogComponent, selector: "vl-flow-catalog", ngImport: i0, template: "<ng-container *ngIf=\"state$ | async as state\">\n <vl-loader *ngIf=\"state.loading; else content\" [label]=\"'Loading UI'\"></vl-loader>\n\n <ng-template #content>\n <ng-container *ngIf=\"!state.failure\">\n <vl-cms-preview [uiDefinition]=\"uiDefinition\"></vl-cms-preview>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.PreviewComponent, selector: "vl-cms-preview", inputs: ["uiDefinition", "config"] }, { kind: "component", type: i2
|
1031
|
+
CatalogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogComponent, deps: [{ token: i1$1.UITemplatesAdminApiService }, { token: i0.ChangeDetectorRef }, { token: i2.ToastService }, { token: i3$1.FlowInfoService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
1032
|
+
CatalogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: CatalogComponent, selector: "vl-flow-catalog", ngImport: i0, template: "<ng-container *ngIf=\"state$ | async as state\">\n <vl-loader *ngIf=\"state.loading; else content\" [label]=\"'Loading UI'\"></vl-loader>\n\n <ng-template #content>\n <ng-container *ngIf=\"!state.failure\">\n <vl-cms-preview [uiDefinition]=\"uiDefinition\"></vl-cms-preview>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.PreviewComponent, selector: "vl-cms-preview", inputs: ["uiDefinition", "config"] }, { kind: "component", type: i2.LoaderComponent, selector: "vl-loader", inputs: ["label", "overlayVisible"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
1207
1033
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogComponent, decorators: [{
|
1208
1034
|
type: Component,
|
1209
1035
|
args: [{ selector: 'vl-flow-catalog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"state$ | async as state\">\n <vl-loader *ngIf=\"state.loading; else content\" [label]=\"'Loading UI'\"></vl-loader>\n\n <ng-template #content>\n <ng-container *ngIf=\"!state.failure\">\n <vl-cms-preview [uiDefinition]=\"uiDefinition\"></vl-cms-preview>\n </ng-container>\n </ng-template>\n</ng-container>\n" }]
|
1210
|
-
}], ctorParameters: function () { return [{ type: i1$1.
|
1036
|
+
}], ctorParameters: function () { return [{ type: i1$1.UITemplatesAdminApiService }, { type: i0.ChangeDetectorRef }, { type: i2.ToastService }, { type: i3$1.FlowInfoService }, { type: undefined, decorators: [{
|
1211
1037
|
type: Optional
|
1212
1038
|
}, {
|
1213
1039
|
type: Inject,
|
@@ -1229,12 +1055,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
1229
1055
|
}] });
|
1230
1056
|
|
1231
1057
|
class DebugComponent {
|
1232
|
-
constructor(flowsApiService, router, activatedRoute
|
1058
|
+
constructor(flowsApiService, router, activatedRoute) {
|
1233
1059
|
this.flowsApiService = flowsApiService;
|
1234
1060
|
this.router = router;
|
1235
1061
|
this.activatedRoute = activatedRoute;
|
1236
|
-
this.context = context;
|
1237
|
-
this.quoteDraftService = quoteDraftService;
|
1238
1062
|
this.form = new FormGroup({
|
1239
1063
|
id: new FormControl(''),
|
1240
1064
|
});
|
@@ -1242,17 +1066,13 @@ class DebugComponent {
|
|
1242
1066
|
}
|
1243
1067
|
runFlow() {
|
1244
1068
|
const { id } = this.form.value;
|
1245
|
-
|
1246
|
-
if (!id || !objectPropertyName || !this.selectedFlow) {
|
1069
|
+
if (!id || !this.selectedFlow) {
|
1247
1070
|
return;
|
1248
1071
|
}
|
1249
|
-
// Delete context before starting a new flow
|
1250
|
-
this.context.delete();
|
1251
|
-
this.quoteDraftService.reset();
|
1252
1072
|
this.router.navigate(['..', 'flows'], {
|
1253
1073
|
queryParams: {
|
1254
1074
|
flowId: this.selectedFlow.id,
|
1255
|
-
|
1075
|
+
headerId: id,
|
1256
1076
|
...this.selectedFlow.properties.queryParams,
|
1257
1077
|
},
|
1258
1078
|
relativeTo: this.activatedRoute,
|
@@ -1262,12 +1082,12 @@ class DebugComponent {
|
|
1262
1082
|
return new HttpParams({ fromObject: params }).toString();
|
1263
1083
|
}
|
1264
1084
|
}
|
1265
|
-
DebugComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DebugComponent, deps: [{ token: i1$1.FlowsApiService }, { token: i1$2.Router }, { token: i1$2.ActivatedRoute }
|
1266
|
-
DebugComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: DebugComponent, selector: "vl-flow-debug", ngImport: i0, template: "<form [formGroup]=\"form\">\n <div class=\"fields-container\">\n <div class=\"field\">\n <label>SF Object ID</label>\n <input formControlName=\"id\" pInputText type=\"text\" />\n </div>\n </div>\n\n <p-button\n styleClass=\"p-button-primary\"\n label=\"Run Flow\"\n [disabled]=\"!form.value.id || !selectedFlow\"\n (onClick)=\"runFlow()\"\n ></p-button>\n</form>\n\n<table>\n <thead>\n <tr>\n <th [width]=\"30\"></th>\n <th [width]=\"160\">ID</th>\n <th [width]=\"160\">Entry Path</th>\n <th>QueryParams</th>\n <th [width]=\"100\">Standalone</th>\n <th [width]=\"100\">Stateful</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let flow of flows$ | async\" (click)=\"selectedFlow = flow\">\n <td><p-radioButton [inputId]=\"flow.id\" name=\"flow\" [value]=\"flow\" [(ngModel)]=\"selectedFlow\"></p-radioButton></td>\n <td>{{ flow.id }}</td>\n <td>{{ flow.properties.entryPath }}</td>\n <td class=\"cell-query-params\">{{ getQueryParamsString(flow.properties.queryParams) }}</td>\n <td>{{ flow.properties.standalone }}</td>\n <td>{{ flow.properties.stateful }}</td>\n </tr>\n </tbody>\n</table>\n", styles: [":host{display:block;padding:24px 54px}form{display:flex;align-items:center;justify-content:space-between}.fields-container{display:flex;gap:24px}.field{display:flex;flex-direction:column;width:200px;flex-shrink:0}:host ::ng-deep .p-dropdown{width:100%}table{width:100%;border-collapse:collapse;table-layout:fixed}tbody>tr{cursor:pointer}tbody>tr:hover{background-color:#f0f5fa}th{text-align:left;font-weight:600}th,td{padding:0 10px;height:30px;border-bottom:1px solid var(--vl-border-color);margin-right:16px;line-height:18px}.cell-query-params{word-break:break-all}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type:
|
1085
|
+
DebugComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DebugComponent, deps: [{ token: i1$1.FlowsApiService }, { token: i1$2.Router }, { token: i1$2.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
|
1086
|
+
DebugComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: DebugComponent, selector: "vl-flow-debug", ngImport: i0, template: "<form [formGroup]=\"form\">\n <div class=\"fields-container\">\n <div class=\"field\">\n <label>SF Object ID</label>\n <input formControlName=\"id\" pInputText type=\"text\" />\n </div>\n </div>\n\n <p-button\n styleClass=\"p-button-primary\"\n label=\"Run Flow\"\n [disabled]=\"!form.value.id || !selectedFlow\"\n (onClick)=\"runFlow()\"\n ></p-button>\n</form>\n\n<table>\n <thead>\n <tr>\n <th [width]=\"30\"></th>\n <th [width]=\"160\">ID</th>\n <th [width]=\"160\">Entry Path</th>\n <th>QueryParams</th>\n <th [width]=\"100\">Standalone</th>\n <th [width]=\"100\">Stateful</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let flow of flows$ | async\" (click)=\"selectedFlow = flow\">\n <td><p-radioButton [inputId]=\"flow.id\" name=\"flow\" [value]=\"flow\" [(ngModel)]=\"selectedFlow\"></p-radioButton></td>\n <td>{{ flow.id }}</td>\n <td>{{ flow.properties.entryPath }}</td>\n <td class=\"cell-query-params\">{{ getQueryParamsString(flow.properties.queryParams) }}</td>\n <td>{{ flow.properties.standalone }}</td>\n <td>{{ flow.properties.stateful }}</td>\n </tr>\n </tbody>\n</table>\n", styles: [":host{display:block;padding:24px 54px}form{display:flex;align-items:center;justify-content:space-between}.fields-container{display:flex;gap:24px}.field{display:flex;flex-direction:column;width:200px;flex-shrink:0}:host ::ng-deep .p-dropdown{width:100%}table{width:100%;border-collapse:collapse;table-layout:fixed}tbody>tr{cursor:pointer}tbody>tr:hover{background-color:#f0f5fa}th{text-align:left;font-weight:600}th,td{padding:0 10px;height:30px;border-bottom:1px solid var(--vl-border-color);margin-right:16px;line-height:18px}.cell-query-params{word-break:break-all}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5$1.RadioButton, selector: "p-radioButton", inputs: ["value", "formControlName", "name", "disabled", "label", "tabindex", "inputId", "ariaLabelledBy", "ariaLabel", "style", "styleClass", "labelStyleClass"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i3.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i7.InputText, selector: "[pInputText]" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
1267
1087
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DebugComponent, decorators: [{
|
1268
1088
|
type: Component,
|
1269
1089
|
args: [{ selector: 'vl-flow-debug', changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\">\n <div class=\"fields-container\">\n <div class=\"field\">\n <label>SF Object ID</label>\n <input formControlName=\"id\" pInputText type=\"text\" />\n </div>\n </div>\n\n <p-button\n styleClass=\"p-button-primary\"\n label=\"Run Flow\"\n [disabled]=\"!form.value.id || !selectedFlow\"\n (onClick)=\"runFlow()\"\n ></p-button>\n</form>\n\n<table>\n <thead>\n <tr>\n <th [width]=\"30\"></th>\n <th [width]=\"160\">ID</th>\n <th [width]=\"160\">Entry Path</th>\n <th>QueryParams</th>\n <th [width]=\"100\">Standalone</th>\n <th [width]=\"100\">Stateful</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let flow of flows$ | async\" (click)=\"selectedFlow = flow\">\n <td><p-radioButton [inputId]=\"flow.id\" name=\"flow\" [value]=\"flow\" [(ngModel)]=\"selectedFlow\"></p-radioButton></td>\n <td>{{ flow.id }}</td>\n <td>{{ flow.properties.entryPath }}</td>\n <td class=\"cell-query-params\">{{ getQueryParamsString(flow.properties.queryParams) }}</td>\n <td>{{ flow.properties.standalone }}</td>\n <td>{{ flow.properties.stateful }}</td>\n </tr>\n </tbody>\n</table>\n", styles: [":host{display:block;padding:24px 54px}form{display:flex;align-items:center;justify-content:space-between}.fields-container{display:flex;gap:24px}.field{display:flex;flex-direction:column;width:200px;flex-shrink:0}:host ::ng-deep .p-dropdown{width:100%}table{width:100%;border-collapse:collapse;table-layout:fixed}tbody>tr{cursor:pointer}tbody>tr:hover{background-color:#f0f5fa}th{text-align:left;font-weight:600}th,td{padding:0 10px;height:30px;border-bottom:1px solid var(--vl-border-color);margin-right:16px;line-height:18px}.cell-query-params{word-break:break-all}\n"] }]
|
1270
|
-
}], ctorParameters: function () { return [{ type: i1$1.FlowsApiService }, { type: i1$2.Router }, { type: i1$2.ActivatedRoute }
|
1090
|
+
}], ctorParameters: function () { return [{ type: i1$1.FlowsApiService }, { type: i1$2.Router }, { type: i1$2.ActivatedRoute }]; } });
|
1271
1091
|
|
1272
1092
|
const routes$1 = [{ path: '', component: DebugComponent }];
|
1273
1093
|
class DebugModule {
|
@@ -1305,121 +1125,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
1305
1125
|
}] });
|
1306
1126
|
|
1307
1127
|
class ProductComponent {
|
1308
|
-
constructor(
|
1309
|
-
this.contextService = contextService;
|
1128
|
+
constructor(configurationRuntimeService, configurationStateService) {
|
1310
1129
|
this.configurationRuntimeService = configurationRuntimeService;
|
1311
|
-
this.configurationService = configurationService;
|
1312
1130
|
this.configurationStateService = configurationStateService;
|
1313
|
-
this.
|
1314
|
-
this.
|
1315
|
-
this.flowStateService = flowStateService;
|
1316
|
-
this.integrationState = integrationState;
|
1317
|
-
this.customizationService = customizationService;
|
1318
|
-
this.uiDefinition$ = new BehaviorSubject(undefined);
|
1131
|
+
this.uiDefinitionContainer$ = new BehaviorSubject(null);
|
1132
|
+
this.uiDefinitionContainer$.next(this.configurationRuntimeService.uiDefinitionContainer);
|
1319
1133
|
this.config = {
|
1320
1134
|
init$: () => this.init$(),
|
1321
1135
|
};
|
1322
1136
|
}
|
1323
|
-
customizeUI$() {
|
1324
|
-
const { productId } = this.configurationRuntimeService.runtimeContext ?? {};
|
1325
|
-
if (!productId || !this.customizationService?.getUiDefinition) {
|
1326
|
-
return of(undefined);
|
1327
|
-
}
|
1328
|
-
return this.customizationService.getUiDefinition(productId).pipe(map(uiDefinitionContainer => {
|
1329
|
-
if (uiDefinitionContainer) {
|
1330
|
-
this.configurationRuntimeService.overrideUIDefinition(uiDefinitionContainer);
|
1331
|
-
}
|
1332
|
-
}));
|
1333
|
-
}
|
1334
1137
|
init$() {
|
1335
|
-
|
1336
|
-
if (this.flowInfoService.isLegacy || !this.flowInfoService.isStateful) {
|
1337
|
-
quoteDraft$ = this.quoteDraftService.quoteDraft$;
|
1338
|
-
}
|
1339
|
-
else {
|
1340
|
-
quoteDraft$ = of(undefined);
|
1341
|
-
}
|
1342
|
-
return quoteDraft$.pipe(first(), switchMap(quote => {
|
1343
|
-
const contextProperties = this.contextService.resolve().properties;
|
1344
|
-
const productId = contextProperties.productId ?? this.flowInfoService.flow?.properties.queryParams['productId'];
|
1345
|
-
const defaultUIDefinitionId = this.flowInfoService.flow?.properties.queryParams['defaultUIDefinitionId'];
|
1346
|
-
const requiredUIDefinitionId = this.flowInfoService.flow?.properties.queryParams['requiredUIDefinitionId'];
|
1347
|
-
if (!productId) {
|
1348
|
-
throw new Error(`Unable to start configuration for 'productId == null'`);
|
1349
|
-
}
|
1350
|
-
if (!quote) {
|
1351
|
-
const offeringId = contextProperties.offeringId;
|
1352
|
-
return this.configurationRuntimeService.init({ productId, offeringId });
|
1353
|
-
}
|
1354
|
-
const lineItem = this.getLineItem(quote, productId, contextProperties.lineItemId);
|
1355
|
-
if (lineItem) {
|
1356
|
-
this.configurationService.setConfigurableRamp(lineItem);
|
1357
|
-
}
|
1358
|
-
const { offeringId } = lineItem ?? {};
|
1359
|
-
return this.configurationRuntimeService.init({
|
1360
|
-
productId,
|
1361
|
-
offeringId,
|
1362
|
-
defaultUIDefinitionId,
|
1363
|
-
requiredUIDefinitionId,
|
1364
|
-
});
|
1365
|
-
}), switchMap(() => this.customizeUI$()), tap(() => {
|
1366
|
-
const uiDefinition = this.configurationRuntimeService.runtimeContext?.uiDefinitionContainer?.source;
|
1367
|
-
if (uiDefinition) {
|
1368
|
-
this.uiDefinition$.next(uiDefinition);
|
1369
|
-
}
|
1370
|
-
else {
|
1371
|
-
throw new Error('Product does not have Configuration UI');
|
1372
|
-
}
|
1373
|
-
}), tap(() => {
|
1374
|
-
if (this.configurationRuntimeService.initializationProps) {
|
1375
|
-
this.configurationRuntimeService.initializationProps.attributesMap =
|
1376
|
-
this.integrationState.state.guidedSelling;
|
1377
|
-
}
|
1378
|
-
}), switchMap(() => this.configurationStateService.init$()));
|
1379
|
-
}
|
1380
|
-
getLineItem(quote, productId, lineItemId) {
|
1381
|
-
// search by lineItemId first
|
1382
|
-
let li = quote.currentState.find(li => li.id === lineItemId);
|
1383
|
-
if (!li && this.quoteDraftService.isStandalone) {
|
1384
|
-
li = quote.currentState.find(li => li.productId === productId);
|
1385
|
-
}
|
1386
|
-
// If still not found, is could be an asset
|
1387
|
-
if (!li) {
|
1388
|
-
li = this.quoteDraftService.assetsState?.currentState.find(li => li.id === lineItemId);
|
1389
|
-
}
|
1390
|
-
return li;
|
1138
|
+
return this.configurationStateService.init$();
|
1391
1139
|
}
|
1392
1140
|
}
|
1393
|
-
ProductComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductComponent, deps: [{ token:
|
1394
|
-
ProductComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ProductComponent, selector: "vl-flow-product", ngImport: i0, template: "<vl-cms-preview [uiDefinition]=\"
|
1141
|
+
ProductComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductComponent, deps: [{ token: i3$1.ConfigurationRuntimeService }, { token: i3$1.ConfigurationStateService }], target: i0.ɵɵFactoryTarget.Component });
|
1142
|
+
ProductComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ProductComponent, selector: "vl-flow-product", ngImport: i0, template: "<vl-cms-preview [uiDefinition]=\"(uiDefinitionContainer$ | async)?.source\" [config]=\"config\"></vl-cms-preview>\n", styles: [""], dependencies: [{ kind: "component", type: i5.PreviewComponent, selector: "vl-cms-preview", inputs: ["uiDefinition", "config"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
1395
1143
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductComponent, decorators: [{
|
1396
1144
|
type: Component,
|
1397
|
-
args: [{ selector: 'vl-flow-product', changeDetection: ChangeDetectionStrategy.OnPush, template: "<vl-cms-preview [uiDefinition]=\"
|
1398
|
-
}], ctorParameters: function () { return [{ type:
|
1399
|
-
type: Optional
|
1400
|
-
}, {
|
1401
|
-
type: Inject,
|
1402
|
-
args: [FLOW_CUSTOMIZATION]
|
1403
|
-
}] }]; } });
|
1145
|
+
args: [{ selector: 'vl-flow-product', changeDetection: ChangeDetectionStrategy.OnPush, template: "<vl-cms-preview [uiDefinition]=\"(uiDefinitionContainer$ | async)?.source\" [config]=\"config\"></vl-cms-preview>\n" }]
|
1146
|
+
}], ctorParameters: function () { return [{ type: i3$1.ConfigurationRuntimeService }, { type: i3$1.ConfigurationStateService }]; } });
|
1404
1147
|
|
1405
1148
|
class ProductModule {
|
1406
1149
|
}
|
1407
1150
|
ProductModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
1408
|
-
ProductModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: ProductModule, declarations: [ProductComponent], imports: [CommonModule, PreviewModule, LoaderModule], exports: [ProductComponent] });
|
1409
|
-
ProductModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductModule, imports: [CommonModule, PreviewModule, LoaderModule] });
|
1151
|
+
ProductModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: ProductModule, declarations: [ProductComponent], imports: [CommonModule, PreviewModule, LoaderModule, LetDirectiveModule], exports: [ProductComponent] });
|
1152
|
+
ProductModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductModule, imports: [CommonModule, PreviewModule, LoaderModule, LetDirectiveModule] });
|
1410
1153
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductModule, decorators: [{
|
1411
1154
|
type: NgModule,
|
1412
1155
|
args: [{
|
1413
1156
|
declarations: [ProductComponent],
|
1414
|
-
imports: [CommonModule, PreviewModule, LoaderModule],
|
1157
|
+
imports: [CommonModule, PreviewModule, LoaderModule, LetDirectiveModule],
|
1415
1158
|
exports: [ProductComponent],
|
1416
1159
|
}]
|
1417
1160
|
}] });
|
1418
1161
|
|
1419
1162
|
class RecordNotFoundComponent {
|
1420
|
-
constructor(router
|
1163
|
+
constructor(router) {
|
1421
1164
|
this.router = router;
|
1422
|
-
this.route = route;
|
1423
1165
|
this.subMessage = '';
|
1424
1166
|
this.type = '';
|
1425
1167
|
const navigation = this.router.getCurrentNavigation();
|
@@ -1432,12 +1174,12 @@ class RecordNotFoundComponent {
|
|
1432
1174
|
}
|
1433
1175
|
}
|
1434
1176
|
}
|
1435
|
-
RecordNotFoundComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RecordNotFoundComponent, deps: [{ token: i1$2.Router }
|
1177
|
+
RecordNotFoundComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RecordNotFoundComponent, deps: [{ token: i1$2.Router }], target: i0.ɵɵFactoryTarget.Component });
|
1436
1178
|
RecordNotFoundComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: RecordNotFoundComponent, selector: "vl-flow-record-not-found", ngImport: i0, template: "<div class=\"row\">\n <div class=\"col-md-12\">\n <div class=\"message-wrapper\">\n <div *ngIf=\"message; else defaultMessage\">\n <p class=\"text message-text\" [class]=\"type\">{{ message }}</p>\n\n <p *ngIf=\"subMessage\" class=\"text\">{{ subMessage }}</p>\n\n <div *ngIf=\"details && details.length > 0\">\n <div *ngFor=\"let detail of details\" class=\"text\">{{ detail }}</div>\n </div>\n </div>\n\n <ng-template #defaultMessage>Record not found</ng-template>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;padding:24px 54px}:host .text{white-space:pre-line;word-break:break-word}:host .message-text.error{color:var(--vl-error-text-color)}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
1437
1179
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RecordNotFoundComponent, decorators: [{
|
1438
1180
|
type: Component,
|
1439
1181
|
args: [{ selector: 'vl-flow-record-not-found', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"row\">\n <div class=\"col-md-12\">\n <div class=\"message-wrapper\">\n <div *ngIf=\"message; else defaultMessage\">\n <p class=\"text message-text\" [class]=\"type\">{{ message }}</p>\n\n <p *ngIf=\"subMessage\" class=\"text\">{{ subMessage }}</p>\n\n <div *ngIf=\"details && details.length > 0\">\n <div *ngFor=\"let detail of details\" class=\"text\">{{ detail }}</div>\n </div>\n </div>\n\n <ng-template #defaultMessage>Record not found</ng-template>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;padding:24px 54px}:host .text{white-space:pre-line;word-break:break-word}:host .message-text.error{color:var(--vl-error-text-color)}\n"] }]
|
1440
|
-
}], ctorParameters: function () { return [{ type: i1$2.Router }
|
1182
|
+
}], ctorParameters: function () { return [{ type: i1$2.Router }]; } });
|
1441
1183
|
|
1442
1184
|
const routes = [{ path: '', component: RecordNotFoundComponent }];
|
1443
1185
|
class RecordNotFoundModule {
|
@@ -1453,352 +1195,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
1453
1195
|
}]
|
1454
1196
|
}] });
|
1455
1197
|
|
1456
|
-
class RemoteComponent {
|
1457
|
-
constructor(contextService, quoteDraftService, runtimeService, configurationService, configurationState, messageService, integrationState, location) {
|
1458
|
-
this.contextService = contextService;
|
1459
|
-
this.quoteDraftService = quoteDraftService;
|
1460
|
-
this.runtimeService = runtimeService;
|
1461
|
-
this.configurationService = configurationService;
|
1462
|
-
this.configurationState = configurationState;
|
1463
|
-
this.messageService = messageService;
|
1464
|
-
this.integrationState = integrationState;
|
1465
|
-
this.location = location;
|
1466
|
-
this.state$ = new BehaviorSubject({ loading: true, failure: false });
|
1467
|
-
this.DYNAMIC_OPTION_PRODUCTS_KEY = 'Dynamic';
|
1468
|
-
this.destroyed$ = new Subject();
|
1469
|
-
this.rpcMessage = JSON.parse(window.RPC_MESSAGE);
|
1470
|
-
this.rpcMessage.options.sort((a, b) => (a.featureNumber ?? 99999) - (b.featureNumber ?? 99999));
|
1471
|
-
this.updateHasChildrenFlag(this.rpcMessage.product.configuredProductId);
|
1472
|
-
// update context properties
|
1473
|
-
if (this.rpcMessage.quote) {
|
1474
|
-
const properties = {};
|
1475
|
-
if (this.rpcMessage.quote['SBQQ__Opportunity2__c']) {
|
1476
|
-
properties.OpportunityId = this.rpcMessage.quote['SBQQ__Opportunity2__c'];
|
1477
|
-
}
|
1478
|
-
Object.entries(this.rpcMessage.quote).forEach(([key, value]) => {
|
1479
|
-
if (value !== undefined && !(value instanceof Object)) {
|
1480
|
-
properties[key] = value;
|
1481
|
-
}
|
1482
|
-
});
|
1483
|
-
this.contextService.update({ properties });
|
1484
|
-
}
|
1485
|
-
this.initSubscriptions();
|
1486
|
-
this.initConfiguration();
|
1487
|
-
}
|
1488
|
-
ngOnDestroy() {
|
1489
|
-
this.destroyed$.next();
|
1490
|
-
this.destroyed$.complete();
|
1491
|
-
}
|
1492
|
-
initConfiguration() {
|
1493
|
-
const productId = this.rpcMessage.product.configuredProductId;
|
1494
|
-
const quote = this.quoteDraftService.quoteDraft;
|
1495
|
-
if (!productId || !quote) {
|
1496
|
-
return;
|
1497
|
-
}
|
1498
|
-
this.runtimeService
|
1499
|
-
.init({ productId })
|
1500
|
-
.pipe(first(), tap(context => {
|
1501
|
-
const uiDefinitionProperties = context.uiDefinitionContainer?.source.properties ?? {};
|
1502
|
-
this.uiDefinition = context.uiDefinitionContainer?.source;
|
1503
|
-
const pricingEnabled = uiDefinitionProperties.pricingEnabled ? 'true' : 'false';
|
1504
|
-
const priceListId = uiDefinitionProperties.priceList;
|
1505
|
-
const runtimeContextProperties = this.runtimeService.runtimeContext?.properties;
|
1506
|
-
if (runtimeContextProperties) {
|
1507
|
-
runtimeContextProperties.PriceListId = priceListId;
|
1508
|
-
runtimeContextProperties.PricingEnabled = pricingEnabled;
|
1509
|
-
}
|
1510
|
-
this.contextService.update({
|
1511
|
-
properties: {
|
1512
|
-
ModelId: context.modelId,
|
1513
|
-
RuntimeMode: 'TEST',
|
1514
|
-
PricingEnabled: pricingEnabled,
|
1515
|
-
PriceListId: priceListId,
|
1516
|
-
},
|
1517
|
-
});
|
1518
|
-
this.configurationService.setConfigurableRamp(this.createLineItem());
|
1519
|
-
}), this.throwIfNoUIDefinition(), switchMap(() => this.configurationState.init$()), tap(() => this.state$.next({ loading: false, failure: false })), catchError(error => {
|
1520
|
-
if (!this.uiDefinition?.properties?.suppressToastMessages) {
|
1521
|
-
this.messageService.add({ severity: 'error', summary: error });
|
1522
|
-
}
|
1523
|
-
this.state$.next({ loading: false, failure: true });
|
1524
|
-
return of();
|
1525
|
-
}), takeUntil(this.destroyed$))
|
1526
|
-
.subscribe();
|
1527
|
-
}
|
1528
|
-
throwIfNoUIDefinition() {
|
1529
|
-
return (source$) => {
|
1530
|
-
return source$.pipe(switchMap(() => {
|
1531
|
-
if (!this.uiDefinition) {
|
1532
|
-
return throwError(() => 'Product does not have Configuration UI');
|
1533
|
-
}
|
1534
|
-
return source$;
|
1535
|
-
}));
|
1536
|
-
};
|
1537
|
-
}
|
1538
|
-
initSubscriptions() {
|
1539
|
-
this.integrationState
|
1540
|
-
.listen$(FlowAction.REMOTE_CANCEL)
|
1541
|
-
.pipe(tap(() => this.location.back()), takeUntil(this.destroyed$))
|
1542
|
-
.subscribe();
|
1543
|
-
this.integrationState
|
1544
|
-
.listen$(FlowAction.REMOTE_APPLY)
|
1545
|
-
.pipe(tap(() => this.saveRpcMessage()), takeUntil(this.destroyed$))
|
1546
|
-
.subscribe();
|
1547
|
-
}
|
1548
|
-
createLineItem() {
|
1549
|
-
const [quoteDraftLineItem] = this.quoteDraftService.quoteDraft?.currentState ?? [];
|
1550
|
-
if (quoteDraftLineItem && (quoteDraftLineItem.attributes.length > 0 || quoteDraftLineItem.lineItems.length > 0)) {
|
1551
|
-
return quoteDraftLineItem;
|
1552
|
-
}
|
1553
|
-
const lineItem = this.createRootLineItem();
|
1554
|
-
const dynamicOptionProducts = this.rpcMessage.product.optionConfigurations[this.DYNAMIC_OPTION_PRODUCTS_KEY];
|
1555
|
-
if (dynamicOptionProducts) {
|
1556
|
-
const options = this.toParentChildMap(dynamicOptionProducts);
|
1557
|
-
let items = [lineItem];
|
1558
|
-
for (let i = 0; i < items.length; i++) {
|
1559
|
-
const item = items[i];
|
1560
|
-
const children = item && options.get(item.id);
|
1561
|
-
if (children) {
|
1562
|
-
item.lineItems = children;
|
1563
|
-
items = items.concat(children);
|
1564
|
-
}
|
1565
|
-
}
|
1566
|
-
}
|
1567
|
-
return lineItem;
|
1568
|
-
}
|
1569
|
-
createRootLineItem() {
|
1570
|
-
const product = this.rpcMessage.product;
|
1571
|
-
const runtimeContext = this.runtimeService.runtimeContext;
|
1572
|
-
const veloceInstanceId = product.configurationAttributes['VeloceInstanceId__c'];
|
1573
|
-
const quoteId = this.quoteDraftService.quoteDraft?.currentState[0]?.id;
|
1574
|
-
return {
|
1575
|
-
id: quoteId || veloceInstanceId || UUID.UUID(),
|
1576
|
-
type: runtimeContext.productType ?? '',
|
1577
|
-
name: runtimeContext.properties?.['displayName'] || runtimeContext.productName,
|
1578
|
-
productName: runtimeContext.productName,
|
1579
|
-
productId: runtimeContext.productId,
|
1580
|
-
cfgStatus: 'Default',
|
1581
|
-
actionCode: 'ADD',
|
1582
|
-
qty: 1,
|
1583
|
-
};
|
1584
|
-
}
|
1585
|
-
toParentChildMap(remoteOptionProducts) {
|
1586
|
-
const result = new Map();
|
1587
|
-
for (const option of remoteOptionProducts) {
|
1588
|
-
const configurationData = option?.readOnly?.line;
|
1589
|
-
const id = configurationData?.VeloceInstanceId__c;
|
1590
|
-
const parentId = configurationData?.VeloceParentInstanceId__c;
|
1591
|
-
if (!option.selected || !configurationData || !id || !parentId) {
|
1592
|
-
continue;
|
1593
|
-
}
|
1594
|
-
const productId = option.productId;
|
1595
|
-
const lineItem = {
|
1596
|
-
id,
|
1597
|
-
productId,
|
1598
|
-
parentId,
|
1599
|
-
type: configurationData.ModelType__c,
|
1600
|
-
port: configurationData.ModelPort__c,
|
1601
|
-
cfgStatus: configurationData.ConfigurationStatus__c,
|
1602
|
-
actionCode: configurationData.ActionCode__c,
|
1603
|
-
qty: option.Quantity,
|
1604
|
-
};
|
1605
|
-
let siblings = result.get(productId);
|
1606
|
-
if (!siblings) {
|
1607
|
-
result.set(parentId, (siblings = []));
|
1608
|
-
}
|
1609
|
-
siblings.push(lineItem);
|
1610
|
-
}
|
1611
|
-
return result;
|
1612
|
-
}
|
1613
|
-
saveRpcMessage() {
|
1614
|
-
const quote = this.quoteDraftService.quoteDraft;
|
1615
|
-
const lineItem = this.configurationService.getSnapshot();
|
1616
|
-
if (!quote || !lineItem) {
|
1617
|
-
return;
|
1618
|
-
}
|
1619
|
-
this.rpcMessage.VeloceReferenceId = quote.quoteId;
|
1620
|
-
this.rpcMessage.product.configurationData.VeloceInstanceId__c = lineItem.id;
|
1621
|
-
const childItems = this.flattenChildLineItems(lineItem);
|
1622
|
-
const savingMode = window.SavingMode;
|
1623
|
-
this.updateContentData(this.rpcMessage.product, lineItem);
|
1624
|
-
this.rpcMessage.quote = this.mapAttributesTo('Quote', lineItem);
|
1625
|
-
if (savingMode === 'ALL') {
|
1626
|
-
const optionConfigurations = this.getOptionConfigurations(this.rpcMessage.product);
|
1627
|
-
const rootProductOptions = this.rpcMessage.options.filter(po => po.configuredProductId === lineItem.productId);
|
1628
|
-
childItems.forEach(lineItem => {
|
1629
|
-
const rootOption = rootProductOptions.find(po => po.optionalProductId === lineItem.productId);
|
1630
|
-
if (rootOption) {
|
1631
|
-
const featureOptions = optionConfigurations[rootOption.featureName] ?? (optionConfigurations[rootOption.featureName] = []);
|
1632
|
-
const originOption = !rootOption.hasChildren
|
1633
|
-
? optionConfigurations[rootOption.featureName]?.find(({ optionId }) => optionId === rootOption.optionId)
|
1634
|
-
: undefined;
|
1635
|
-
const option = originOption ?? {};
|
1636
|
-
option.optionId = option.optionId ?? rootOption.optionId;
|
1637
|
-
this.updateContentData(option, lineItem);
|
1638
|
-
option.index = option.index ?? featureOptions.length;
|
1639
|
-
option.selected = true;
|
1640
|
-
if (!originOption) {
|
1641
|
-
featureOptions.push(option);
|
1642
|
-
}
|
1643
|
-
if (lineItem.parentLineItem) {
|
1644
|
-
const nestedProductOption = this.rpcMessage.options.find(po => po.configuredProductId === lineItem.parentLineItem?.productId &&
|
1645
|
-
po.optionalProductId === lineItem.productId);
|
1646
|
-
if (nestedProductOption) {
|
1647
|
-
option.configurationData = {
|
1648
|
-
...option.configurationData,
|
1649
|
-
VeloceParentInstanceId__c: lineItem.parentLineItem.id,
|
1650
|
-
VeloceNestedOptionId__c: nestedProductOption.optionId,
|
1651
|
-
VeloceNestedFeatureId__c: nestedProductOption.featureId,
|
1652
|
-
};
|
1653
|
-
}
|
1654
|
-
}
|
1655
|
-
}
|
1656
|
-
else {
|
1657
|
-
this.rpcMessage.dynamicFeatures.forEach(feature => {
|
1658
|
-
const featureOptions = optionConfigurations[feature.name] ?? (optionConfigurations[feature.name] = []);
|
1659
|
-
const originOption = featureOptions.find(({ productId }) => productId === lineItem.productId);
|
1660
|
-
const option = originOption ?? {};
|
1661
|
-
this.updateContentData(option, lineItem);
|
1662
|
-
option.index = option.index ?? featureOptions.length;
|
1663
|
-
option.selected = true;
|
1664
|
-
if (!originOption) {
|
1665
|
-
featureOptions.push(option);
|
1666
|
-
}
|
1667
|
-
});
|
1668
|
-
}
|
1669
|
-
});
|
1670
|
-
this.rpcMessage.product = { ...this.rpcMessage.product, optionConfigurations };
|
1671
|
-
}
|
1672
|
-
window.RPC_BROADCAST?.apply(null, [this.rpcMessage]);
|
1673
|
-
}
|
1674
|
-
updateHasChildrenFlag(bundleProductId) {
|
1675
|
-
const bundleOptionsByOptionId = {};
|
1676
|
-
const notBundleOptions = [];
|
1677
|
-
for (const productOption of this.rpcMessage.options) {
|
1678
|
-
if (productOption.configuredProductId === bundleProductId) {
|
1679
|
-
bundleOptionsByOptionId[productOption.optionalProductId] = productOption;
|
1680
|
-
}
|
1681
|
-
else {
|
1682
|
-
notBundleOptions.push(productOption);
|
1683
|
-
}
|
1684
|
-
}
|
1685
|
-
for (const option of notBundleOptions) {
|
1686
|
-
const bundleOption = bundleOptionsByOptionId[option.configuredProductId];
|
1687
|
-
if (bundleOption) {
|
1688
|
-
bundleOption.hasChildren = true;
|
1689
|
-
}
|
1690
|
-
}
|
1691
|
-
}
|
1692
|
-
flattenChildLineItems(lineItem) {
|
1693
|
-
let items = lineItem.lineItems ?? [];
|
1694
|
-
for (let i = 0; i < items.length; i++) {
|
1695
|
-
const item = items[i];
|
1696
|
-
if (item?.lineItems) {
|
1697
|
-
items = items.concat(item.lineItems.map(li => ({ ...li, parentLineItem: item })));
|
1698
|
-
}
|
1699
|
-
}
|
1700
|
-
return items;
|
1701
|
-
}
|
1702
|
-
updateContentData(entity, lineItem) {
|
1703
|
-
if (lineItem.productId) {
|
1704
|
-
entity.productId = lineItem.productId;
|
1705
|
-
}
|
1706
|
-
const quantityAttribute = lineItem.properties['quantityAttribute'];
|
1707
|
-
entity.Quantity = quantityAttribute
|
1708
|
-
? lineItem.attributes.find(attribute => attribute.name === quantityAttribute)?.value ?? 1
|
1709
|
-
: lineItem.qty;
|
1710
|
-
const totalPrice = this.computeNetPrice(lineItem);
|
1711
|
-
const targetTotalPriceField = lineItem.properties['TargetTotalPriceField'] || 'TotalPrice__c';
|
1712
|
-
entity.configurationData[targetTotalPriceField] = entity.configurationData[targetTotalPriceField]
|
1713
|
-
? entity.configurationData[targetTotalPriceField] + totalPrice
|
1714
|
-
: totalPrice;
|
1715
|
-
const targetPriceField = lineItem.properties['TargetPriceField'] || 'SBQQ__ListPrice__c';
|
1716
|
-
const price = entity.Quantity != null ? entity.configurationData[targetTotalPriceField] / entity.Quantity || 0 : 0;
|
1717
|
-
const targetPriceValue = Number(entity.configurationData[targetPriceField]) || 0;
|
1718
|
-
entity.configurationData[targetPriceField] = targetPriceValue
|
1719
|
-
? (targetPriceValue + price).toFixed(2)
|
1720
|
-
: price.toFixed(2);
|
1721
|
-
entity.configurationAttributes = this.mapAttributesTo('Attribute', lineItem);
|
1722
|
-
entity.configurationData = {
|
1723
|
-
...entity.configurationData,
|
1724
|
-
...this.mapAttributesTo('Field', lineItem),
|
1725
|
-
...this.mapAttributesTo('', lineItem),
|
1726
|
-
VeloceInstanceId__c: lineItem.id,
|
1727
|
-
};
|
1728
|
-
}
|
1729
|
-
computeNetPrice(lineItem) {
|
1730
|
-
if (lineItem.properties['GroupCharges']) {
|
1731
|
-
return this.sumNetPrice(lineItem.chargeGroupItems, this.getChargeNameSet(lineItem.properties['GroupCharges']));
|
1732
|
-
}
|
1733
|
-
return this.sumNetPrice(lineItem.chargeItems, this.getChargeNameSet(lineItem.properties['Charges']));
|
1734
|
-
}
|
1735
|
-
getChargeNameSet(property) {
|
1736
|
-
if (property && property.length > 0) {
|
1737
|
-
return new Set(property.split(','));
|
1738
|
-
}
|
1739
|
-
return new Set();
|
1740
|
-
}
|
1741
|
-
sumNetPrice(chargeItems, charges) {
|
1742
|
-
let netPrice = 0;
|
1743
|
-
for (const chargeItem of chargeItems) {
|
1744
|
-
if (!charges || charges.has(chargeItem.chargeType)) {
|
1745
|
-
netPrice += chargeItem.netPrice ?? 0;
|
1746
|
-
}
|
1747
|
-
}
|
1748
|
-
return netPrice;
|
1749
|
-
}
|
1750
|
-
mapAttributesTo(target, lineItem) {
|
1751
|
-
const result = {};
|
1752
|
-
const component = this.runtimeService.runtimeModel?.components.get(lineItem.type);
|
1753
|
-
if (!component) {
|
1754
|
-
return result;
|
1755
|
-
}
|
1756
|
-
const propertyName = 'mapTo' + target;
|
1757
|
-
component.attributes
|
1758
|
-
.filter(a => a.properties && a.properties[propertyName])
|
1759
|
-
.forEach(mapping => {
|
1760
|
-
const attribute = lineItem.attributes.find(a => a.name === mapping.name);
|
1761
|
-
if (attribute) {
|
1762
|
-
new Set(mapping.properties[propertyName]?.split(',')).forEach(k => (result[k] = attribute.value));
|
1763
|
-
}
|
1764
|
-
});
|
1765
|
-
return result;
|
1766
|
-
}
|
1767
|
-
getOptionConfigurations(product) {
|
1768
|
-
const optionConfigurations = {};
|
1769
|
-
const requestOptionConfigurations = product.optionConfigurations ?? {};
|
1770
|
-
Object.keys(requestOptionConfigurations).forEach(k => {
|
1771
|
-
optionConfigurations[k] = (requestOptionConfigurations[k] ?? []).map(opt => {
|
1772
|
-
return { ...opt, selected: false };
|
1773
|
-
});
|
1774
|
-
});
|
1775
|
-
return optionConfigurations;
|
1776
|
-
}
|
1777
|
-
}
|
1778
|
-
RemoteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RemoteComponent, deps: [{ token: i2.ContextService }, { token: i2.QuoteDraftService }, { token: i2.ConfigurationRuntimeService }, { token: i2.ConfigurationService }, { token: i2.ConfigurationStateService }, { token: i2$2.MessageService }, { token: i2.IntegrationState }, { token: i4.Location }], target: i0.ɵɵFactoryTarget.Component });
|
1779
|
-
RemoteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: RemoteComponent, selector: "vl-flow-remote", ngImport: i0, template: "<ng-container *ngIf=\"state$ | async as state\">\n <vl-loader *ngIf=\"state.loading; else content\" [label]=\"'Loading UI'\"></vl-loader>\n\n <ng-template #content>\n <ng-container *ngIf=\"!state.failure\">\n <vl-cms-preview [uiDefinition]=\"uiDefinition\"></vl-cms-preview>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.PreviewComponent, selector: "vl-cms-preview", inputs: ["uiDefinition", "config"] }, { kind: "component", type: i2$1.LoaderComponent, selector: "vl-loader", inputs: ["label", "overlayVisible"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
1780
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RemoteComponent, decorators: [{
|
1781
|
-
type: Component,
|
1782
|
-
args: [{ selector: 'vl-flow-remote', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"state$ | async as state\">\n <vl-loader *ngIf=\"state.loading; else content\" [label]=\"'Loading UI'\"></vl-loader>\n\n <ng-template #content>\n <ng-container *ngIf=\"!state.failure\">\n <vl-cms-preview [uiDefinition]=\"uiDefinition\"></vl-cms-preview>\n </ng-container>\n </ng-template>\n</ng-container>\n" }]
|
1783
|
-
}], ctorParameters: function () { return [{ type: i2.ContextService }, { type: i2.QuoteDraftService }, { type: i2.ConfigurationRuntimeService }, { type: i2.ConfigurationService }, { type: i2.ConfigurationStateService }, { type: i2$2.MessageService }, { type: i2.IntegrationState }, { type: i4.Location }]; } });
|
1784
|
-
|
1785
|
-
class RemoteModule {
|
1786
|
-
}
|
1787
|
-
RemoteModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RemoteModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
1788
|
-
RemoteModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: RemoteModule, declarations: [RemoteComponent], imports: [CommonModule, PreviewModule, LoaderModule], exports: [RemoteComponent] });
|
1789
|
-
RemoteModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RemoteModule, imports: [CommonModule, PreviewModule, LoaderModule] });
|
1790
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RemoteModule, decorators: [{
|
1791
|
-
type: NgModule,
|
1792
|
-
args: [{
|
1793
|
-
declarations: [RemoteComponent],
|
1794
|
-
imports: [CommonModule, PreviewModule, LoaderModule],
|
1795
|
-
exports: [RemoteComponent],
|
1796
|
-
}]
|
1797
|
-
}] });
|
1798
|
-
|
1799
1198
|
class ShoppingCartComponent {
|
1800
|
-
constructor(
|
1801
|
-
this.
|
1199
|
+
constructor(templatesAdminApiService, cdr, toastService, flowInfo, customizationService) {
|
1200
|
+
this.templatesAdminApiService = templatesAdminApiService;
|
1802
1201
|
this.cdr = cdr;
|
1803
1202
|
this.toastService = toastService;
|
1804
1203
|
this.flowInfo = flowInfo;
|
@@ -1851,7 +1250,7 @@ class ShoppingCartComponent {
|
|
1851
1250
|
if (!template) {
|
1852
1251
|
return of(undefined);
|
1853
1252
|
}
|
1854
|
-
return this.
|
1253
|
+
return this.templatesAdminApiService.fetchComponentsAttachments$(template.id);
|
1855
1254
|
}
|
1856
1255
|
generateUIDefinition$() {
|
1857
1256
|
return of(undefined).pipe(tap(() => {
|
@@ -1865,7 +1264,6 @@ class ShoppingCartComponent {
|
|
1865
1264
|
const uiDef = {
|
1866
1265
|
name: '',
|
1867
1266
|
createdTimestamp: 0,
|
1868
|
-
primary: true,
|
1869
1267
|
type: 'DEFAULT',
|
1870
1268
|
version: 2,
|
1871
1269
|
children: metaList.map(meta => ({
|
@@ -1879,12 +1277,12 @@ class ShoppingCartComponent {
|
|
1879
1277
|
}));
|
1880
1278
|
}
|
1881
1279
|
}
|
1882
|
-
ShoppingCartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ShoppingCartComponent, deps: [{ token: i1$1.
|
1883
|
-
ShoppingCartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ShoppingCartComponent, selector: "vl-flow-shopping-cart", ngImport: i0, template: "<ng-container *ngIf=\"state$ | async as state\">\n <vl-loader *ngIf=\"state.loading; else content\" [label]=\"'Loading UI'\"></vl-loader>\n\n <ng-template #content>\n <ng-container *ngIf=\"!state.failure\">\n <vl-cms-preview [uiDefinition]=\"uiDefinition\"></vl-cms-preview>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.PreviewComponent, selector: "vl-cms-preview", inputs: ["uiDefinition", "config"] }, { kind: "component", type: i2
|
1280
|
+
ShoppingCartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ShoppingCartComponent, deps: [{ token: i1$1.UITemplatesAdminApiService }, { token: i0.ChangeDetectorRef }, { token: i2.ToastService }, { token: i3$1.FlowInfoService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
1281
|
+
ShoppingCartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ShoppingCartComponent, selector: "vl-flow-shopping-cart", ngImport: i0, template: "<ng-container *ngIf=\"state$ | async as state\">\n <vl-loader *ngIf=\"state.loading; else content\" [label]=\"'Loading UI'\"></vl-loader>\n\n <ng-template #content>\n <ng-container *ngIf=\"!state.failure\">\n <vl-cms-preview [uiDefinition]=\"uiDefinition\"></vl-cms-preview>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.PreviewComponent, selector: "vl-cms-preview", inputs: ["uiDefinition", "config"] }, { kind: "component", type: i2.LoaderComponent, selector: "vl-loader", inputs: ["label", "overlayVisible"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
1884
1282
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ShoppingCartComponent, decorators: [{
|
1885
1283
|
type: Component,
|
1886
1284
|
args: [{ selector: 'vl-flow-shopping-cart', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"state$ | async as state\">\n <vl-loader *ngIf=\"state.loading; else content\" [label]=\"'Loading UI'\"></vl-loader>\n\n <ng-template #content>\n <ng-container *ngIf=\"!state.failure\">\n <vl-cms-preview [uiDefinition]=\"uiDefinition\"></vl-cms-preview>\n </ng-container>\n </ng-template>\n</ng-container>\n" }]
|
1887
|
-
}], ctorParameters: function () { return [{ type: i1$1.
|
1285
|
+
}], ctorParameters: function () { return [{ type: i1$1.UITemplatesAdminApiService }, { type: i0.ChangeDetectorRef }, { type: i2.ToastService }, { type: i3$1.FlowInfoService }, { type: undefined, decorators: [{
|
1888
1286
|
type: Optional
|
1889
1287
|
}, {
|
1890
1288
|
type: Inject,
|
@@ -1906,30 +1304,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
1906
1304
|
}] });
|
1907
1305
|
|
1908
1306
|
class FlowResolver {
|
1909
|
-
constructor(router, routerService,
|
1307
|
+
constructor(router, routerService, flowInfoService) {
|
1910
1308
|
this.router = router;
|
1911
1309
|
this.routerService = routerService;
|
1912
|
-
this.
|
1913
|
-
this.flowInfo = flowInfo;
|
1310
|
+
this.flowInfoService = flowInfoService;
|
1914
1311
|
}
|
1915
1312
|
resolve(route) {
|
1916
|
-
|
1917
|
-
const flow = this.flowInfo.flow;
|
1918
|
-
if (!flow) {
|
1313
|
+
if (!this.flowInfoService.isFlowInitialized) {
|
1919
1314
|
return of(false);
|
1920
1315
|
}
|
1921
|
-
const {
|
1316
|
+
const { queryParams } = route;
|
1317
|
+
const { properties } = this.flowInfoService.flow;
|
1922
1318
|
const { queryParams: flowQueryParams, entryPath } = properties;
|
1923
1319
|
const mergedQueryParams = {
|
1924
1320
|
...queryParams,
|
1925
1321
|
...flowQueryParams,
|
1926
1322
|
};
|
1927
|
-
const contextProperties = Object.entries({
|
1928
|
-
...mergedQueryParams,
|
1929
|
-
...getDefaultProperties({ flowParams: properties }),
|
1930
|
-
}).reduce((trunk, [key, value]) => ({ ...trunk, [key]: String(value) }), {});
|
1931
|
-
this.contextService.update({ properties: contextProperties });
|
1932
|
-
this.flowInfo.flow = flow;
|
1933
1323
|
const parentUrl = this.routerService.getFlowRootPath(route);
|
1934
1324
|
const entryUrl = String(entryPath ?? '')
|
1935
1325
|
.split('/')
|
@@ -1938,29 +1328,39 @@ class FlowResolver {
|
|
1938
1328
|
queryParams: mergedQueryParams,
|
1939
1329
|
replaceUrl: true,
|
1940
1330
|
})).pipe(catchError$1(e => {
|
1331
|
+
console.error(e);
|
1941
1332
|
const message = e instanceof HttpErrorResponse ? e.error.message : e;
|
1942
1333
|
const errorDetails = isVeloceError(e.error) ? extractErrorDetails(e.error) : [];
|
1943
1334
|
return this.routerService.showErrorPage$(message, errorDetails);
|
1944
1335
|
}));
|
1945
1336
|
}
|
1946
1337
|
}
|
1947
|
-
FlowResolver.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowResolver, deps: [{ token: i1$2.Router }, { token: FlowRouterService }, { token:
|
1338
|
+
FlowResolver.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowResolver, deps: [{ token: i1$2.Router }, { token: FlowRouterService }, { token: i3$1.FlowInfoService }], target: i0.ɵɵFactoryTarget.Injectable });
|
1948
1339
|
FlowResolver.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowResolver });
|
1949
1340
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowResolver, decorators: [{
|
1950
1341
|
type: Injectable
|
1951
|
-
}], ctorParameters: function () { return [{ type: i1$2.Router }, { type: FlowRouterService }, { type:
|
1342
|
+
}], ctorParameters: function () { return [{ type: i1$2.Router }, { type: FlowRouterService }, { type: i3$1.FlowInfoService }]; } });
|
1343
|
+
|
1344
|
+
const resolvePCMModel = () => {
|
1345
|
+
const flowInfoService = inject(FlowInfoService);
|
1346
|
+
const configurationRuntimeService = inject(ConfigurationRuntimeService);
|
1347
|
+
const { productId } = flowInfoService.context;
|
1348
|
+
if (!productId) {
|
1349
|
+
throw new Error(`Unable to start configuration for 'productId == null'`);
|
1350
|
+
}
|
1351
|
+
return configurationRuntimeService.init$({ productId });
|
1352
|
+
};
|
1952
1353
|
|
1953
|
-
class
|
1954
|
-
constructor(router,
|
1354
|
+
class SalesTransactionResolver {
|
1355
|
+
constructor(router, routerService, flowInfoService, flowStateService, salesTransactionService) {
|
1955
1356
|
this.router = router;
|
1956
|
-
this.quoteDraftService = quoteDraftService;
|
1957
1357
|
this.routerService = routerService;
|
1958
|
-
this.
|
1959
|
-
this.flowInfo = flowInfo;
|
1358
|
+
this.flowInfoService = flowInfoService;
|
1960
1359
|
this.flowStateService = flowStateService;
|
1360
|
+
this.salesTransactionService = salesTransactionService;
|
1961
1361
|
}
|
1962
1362
|
resolve(route) {
|
1963
|
-
const flow = this.
|
1363
|
+
const flow = this.flowInfoService.flow;
|
1964
1364
|
if (!flow) {
|
1965
1365
|
return of(false);
|
1966
1366
|
}
|
@@ -1968,13 +1368,14 @@ class QuoteResolver {
|
|
1968
1368
|
return of(true);
|
1969
1369
|
}
|
1970
1370
|
return this.flowStateService.init$().pipe(switchMap(() => this.checkDynamicNavigation$(route)), catchError(e => {
|
1371
|
+
console.error(e);
|
1971
1372
|
const message = e instanceof HttpErrorResponse ? e.error.message : e;
|
1972
1373
|
const errorDetails = isVeloceError(e.error) ? extractErrorDetails(e.error) : [];
|
1973
1374
|
return this.routerService.showErrorPage$(message, errorDetails);
|
1974
1375
|
}));
|
1975
1376
|
}
|
1976
1377
|
checkDynamicNavigation$(route) {
|
1977
|
-
const flow = this.
|
1378
|
+
const flow = this.flowInfoService.flow;
|
1978
1379
|
if (!flow) {
|
1979
1380
|
return of(true);
|
1980
1381
|
}
|
@@ -1993,33 +1394,53 @@ class QuoteResolver {
|
|
1993
1394
|
}));
|
1994
1395
|
}
|
1995
1396
|
getNavigateTo() {
|
1996
|
-
|
1997
|
-
|
1998
|
-
if (flow?.properties.stateful) {
|
1999
|
-
return this.flowStateService.select$(UITemplateType.FLOW_ENGINE, 'NAVIGATE_TO').pipe(map(r => {
|
2000
|
-
if (r.success) {
|
2001
|
-
return r.result;
|
2002
|
-
}
|
2003
|
-
return '';
|
2004
|
-
}));
|
2005
|
-
}
|
2006
|
-
else {
|
2007
|
-
const isAccountMode = this.contextService.mode === ConfigurationContextMode.ACCOUNT;
|
2008
|
-
if (isAccountMode || this.quoteDraftService.hasAssets) {
|
2009
|
-
navigateTo = '/assets';
|
2010
|
-
}
|
2011
|
-
else if (this.quoteDraftService.hasProducts) {
|
2012
|
-
navigateTo = '/cart';
|
2013
|
-
}
|
2014
|
-
}
|
2015
|
-
return of(navigateTo);
|
1397
|
+
// Implement when needed
|
1398
|
+
return of('');
|
2016
1399
|
}
|
2017
1400
|
}
|
2018
|
-
|
2019
|
-
|
2020
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type:
|
1401
|
+
SalesTransactionResolver.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionResolver, deps: [{ token: i1$2.Router }, { token: FlowRouterService }, { token: i3$1.FlowInfoService }, { token: i3$1.FlowStateService }, { token: i3$1.SalesTransactionService }], target: i0.ɵɵFactoryTarget.Injectable });
|
1402
|
+
SalesTransactionResolver.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionResolver });
|
1403
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionResolver, decorators: [{
|
2021
1404
|
type: Injectable
|
2022
|
-
}], ctorParameters: function () { return [{ type: i1$2.Router }, { type:
|
1405
|
+
}], ctorParameters: function () { return [{ type: i1$2.Router }, { type: FlowRouterService }, { type: i3$1.FlowInfoService }, { type: i3$1.FlowStateService }, { type: i3$1.SalesTransactionService }]; } });
|
1406
|
+
|
1407
|
+
const resolveUIDefinition = () => {
|
1408
|
+
const customizationService = inject(FLOW_CUSTOMIZATION, { optional: true });
|
1409
|
+
const flowInfoService = inject(FlowInfoService);
|
1410
|
+
const uiDefinitionsAdminApiService = inject(UIDefinitionsAdminApiService);
|
1411
|
+
const configurationRuntimeService = inject(ConfigurationRuntimeService);
|
1412
|
+
const { productId } = flowInfoService.context;
|
1413
|
+
if (!productId) {
|
1414
|
+
throw new Error(`Unable to start configuration for 'productId == null'`);
|
1415
|
+
}
|
1416
|
+
return of(undefined).pipe(switchMap(() => {
|
1417
|
+
// Try resolving via customization service
|
1418
|
+
if (!productId || !customizationService?.getUiDefinition) {
|
1419
|
+
return of(undefined);
|
1420
|
+
}
|
1421
|
+
return customizationService.getUiDefinition(flowInfoService.context);
|
1422
|
+
}), switchMap(uiDefContainer => {
|
1423
|
+
// Resolve UIDefinition from the org
|
1424
|
+
if (uiDefContainer) {
|
1425
|
+
return of(uiDefContainer);
|
1426
|
+
}
|
1427
|
+
if (flowInfoService.context.requiredUIDefinitionId) {
|
1428
|
+
return uiDefinitionsAdminApiService.fetch$(flowInfoService.context.requiredUIDefinitionId);
|
1429
|
+
}
|
1430
|
+
return uiDefinitionsAdminApiService
|
1431
|
+
.fetchAll$({
|
1432
|
+
productId,
|
1433
|
+
defaultUIDefinitionId: flowInfoService.context.defaultUIDefinitionId,
|
1434
|
+
})
|
1435
|
+
.pipe(map((uiDefinitionContainers) => {
|
1436
|
+
const uiDefContainer = uiDefinitionContainers[0];
|
1437
|
+
if (!uiDefContainer) {
|
1438
|
+
throw new Error(`UI Definition for productId=${productId} is not resolved`);
|
1439
|
+
}
|
1440
|
+
return uiDefContainer;
|
1441
|
+
}));
|
1442
|
+
}), tap(uiDefContainer => (configurationRuntimeService.uiDefinitionContainer = uiDefContainer)));
|
1443
|
+
};
|
2023
1444
|
|
2024
1445
|
const rootRoute = {
|
2025
1446
|
id: VELOCE_FLOW_ROOT_ROUTE,
|
@@ -2037,15 +1458,13 @@ const rootRoute = {
|
|
2037
1458
|
path: 'flows',
|
2038
1459
|
runGuardsAndResolvers: 'paramsOrQueryParamsChange',
|
2039
1460
|
resolve: { flow: FlowResolver },
|
2040
|
-
canActivate: [ContextGuard],
|
2041
1461
|
children: [],
|
2042
1462
|
},
|
2043
1463
|
{
|
2044
1464
|
path: 'product',
|
2045
1465
|
component: ProductComponent,
|
2046
1466
|
runGuardsAndResolvers: 'paramsOrQueryParamsChange',
|
2047
|
-
resolve: {
|
2048
|
-
canActivate: [ContextGuard],
|
1467
|
+
resolve: { salesTransaction: SalesTransactionResolver, uiDef: resolveUIDefinition, pcm: resolvePCMModel },
|
2049
1468
|
canDeactivate: [ProductUnloadGuard],
|
2050
1469
|
data: { showHeader: true },
|
2051
1470
|
},
|
@@ -2053,33 +1472,23 @@ const rootRoute = {
|
|
2053
1472
|
path: 'cart',
|
2054
1473
|
component: ShoppingCartComponent,
|
2055
1474
|
runGuardsAndResolvers: 'paramsOrQueryParamsChange',
|
2056
|
-
resolve: {
|
2057
|
-
canActivate: [ContextGuard],
|
1475
|
+
resolve: { salesTransaction: SalesTransactionResolver },
|
2058
1476
|
data: { showHeader: true },
|
2059
1477
|
},
|
2060
1478
|
{
|
2061
1479
|
path: 'catalog',
|
2062
1480
|
component: CatalogComponent,
|
2063
1481
|
runGuardsAndResolvers: 'paramsOrQueryParamsChange',
|
2064
|
-
resolve: {
|
2065
|
-
canActivate: [ContextGuard],
|
1482
|
+
resolve: { salesTransaction: SalesTransactionResolver },
|
2066
1483
|
data: { showHeader: true },
|
2067
1484
|
},
|
2068
1485
|
{
|
2069
1486
|
path: 'assets',
|
2070
1487
|
component: AssetsComponent,
|
2071
1488
|
runGuardsAndResolvers: 'paramsOrQueryParamsChange',
|
2072
|
-
resolve: {
|
2073
|
-
canActivate: [ContextGuard],
|
1489
|
+
resolve: { salesTransaction: SalesTransactionResolver },
|
2074
1490
|
data: { showHeader: true },
|
2075
1491
|
},
|
2076
|
-
{
|
2077
|
-
path: 'remote',
|
2078
|
-
component: RemoteComponent,
|
2079
|
-
runGuardsAndResolvers: 'paramsOrQueryParamsChange',
|
2080
|
-
resolve: { quote: QuoteResolver },
|
2081
|
-
canActivate: [ContextGuard],
|
2082
|
-
},
|
2083
1492
|
{
|
2084
1493
|
path: 'debug',
|
2085
1494
|
loadChildren: () => DebugModule,
|
@@ -2095,30 +1504,14 @@ const rootRoute = {
|
|
2095
1504
|
class FlowRoutingModule {
|
2096
1505
|
}
|
2097
1506
|
FlowRoutingModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
2098
|
-
FlowRoutingModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FlowRoutingModule, imports: [i1$2.RouterModule, ProductModule,
|
2099
|
-
|
2100
|
-
CatalogModule,
|
2101
|
-
AssetsModule,
|
2102
|
-
RemoteModule], exports: [RouterModule] });
|
2103
|
-
FlowRoutingModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowRoutingModule, providers: [FlowRouterService, RootGuard, ContextGuard, ProductUnloadGuard, FlowResolver, QuoteResolver], imports: [RouterModule.forChild([rootRoute]),
|
2104
|
-
ProductModule,
|
2105
|
-
ShoppingCartModule,
|
2106
|
-
CatalogModule,
|
2107
|
-
AssetsModule,
|
2108
|
-
RemoteModule, RouterModule] });
|
1507
|
+
FlowRoutingModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FlowRoutingModule, imports: [i1$2.RouterModule, ProductModule, ShoppingCartModule, CatalogModule, AssetsModule], exports: [RouterModule] });
|
1508
|
+
FlowRoutingModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowRoutingModule, providers: [FlowRouterService, RootGuard, ProductUnloadGuard, FlowResolver, SalesTransactionResolver], imports: [RouterModule.forChild([rootRoute]), ProductModule, ShoppingCartModule, CatalogModule, AssetsModule, RouterModule] });
|
2109
1509
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowRoutingModule, decorators: [{
|
2110
1510
|
type: NgModule,
|
2111
1511
|
args: [{
|
2112
|
-
imports: [
|
2113
|
-
RouterModule.forChild([rootRoute]),
|
2114
|
-
ProductModule,
|
2115
|
-
ShoppingCartModule,
|
2116
|
-
CatalogModule,
|
2117
|
-
AssetsModule,
|
2118
|
-
RemoteModule,
|
2119
|
-
],
|
1512
|
+
imports: [RouterModule.forChild([rootRoute]), ProductModule, ShoppingCartModule, CatalogModule, AssetsModule],
|
2120
1513
|
exports: [RouterModule],
|
2121
|
-
providers: [FlowRouterService, RootGuard,
|
1514
|
+
providers: [FlowRouterService, RootGuard, ProductUnloadGuard, FlowResolver, SalesTransactionResolver],
|
2122
1515
|
}]
|
2123
1516
|
}] });
|
2124
1517
|
|
@@ -2170,5 +1563,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
2170
1563
|
* Generated bundle index. Do not edit.
|
2171
1564
|
*/
|
2172
1565
|
|
2173
|
-
export {
|
1566
|
+
export { FlowDialogService, FlowModule, FlowRouterService, FlowService, VELOCE_FLOW_ROOT_ROUTE };
|
2174
1567
|
//# sourceMappingURL=veloceapps-sdk.mjs.map
|