@veloceapps/sdk 11.0.0-3 → 11.0.0-30
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 +13 -39
- package/core/index.d.ts +0 -1
- package/core/modules/configuration/index.d.ts +1 -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/types/configuration-runtime.types.d.ts +0 -3
- package/core/modules/flow-configuration/index.d.ts +0 -3
- package/core/modules/flow-configuration/services/flow-configuration.service.d.ts +11 -40
- 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 +2 -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 +29 -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/path.utils.mjs +1 -10
- package/esm2020/cms/vendor-map.mjs +13 -17
- package/esm2020/core/core.module.mjs +9 -7
- package/esm2020/core/index.mjs +1 -2
- package/esm2020/core/modules/configuration/configuration.module.mjs +3 -4
- package/esm2020/core/modules/configuration/index.mjs +2 -5
- package/esm2020/core/modules/configuration/services/configuration-runtime.service.mjs +16 -99
- package/esm2020/core/modules/configuration/services/configuration-state.service.mjs +60 -76
- package/esm2020/core/modules/configuration/services/configuration.service.mjs +97 -223
- package/esm2020/core/modules/configuration/types/configuration-runtime.types.mjs +1 -1
- 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 +34 -127
- package/esm2020/core/services/catalog-products.service.mjs +25 -0
- package/esm2020/core/services/flow-info.service.mjs +92 -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 +3 -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 +65 -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 -82
- 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 +83 -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 +119 -270
- package/fesm2015/veloceapps-sdk-cms.mjs.map +1 -1
- package/fesm2015/veloceapps-sdk-core.mjs +737 -1655
- package/fesm2015/veloceapps-sdk-core.mjs.map +1 -1
- package/fesm2015/veloceapps-sdk.mjs +191 -778
- package/fesm2015/veloceapps-sdk.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk-cms.mjs +115 -262
- package/fesm2020/veloceapps-sdk-cms.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk-core.mjs +792 -1744
- package/fesm2020/veloceapps-sdk-core.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk.mjs +191 -772
- 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 -43
- 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
@@ -1,219 +1,324 @@
|
|
1
1
|
import * as i0 from '@angular/core';
|
2
|
-
import {
|
3
|
-
import {
|
4
|
-
import
|
5
|
-
import { map, filter, tap, switchMap as switchMap$1, skip, take, shareReplay, catchError as catchError$1, finalize as finalize$1, first } from 'rxjs/operators';
|
6
|
-
import * as i1 from '@veloceapps/api';
|
2
|
+
import { Injectable, InjectionToken, Optional, Inject, NgModule, inject, Directive, Input, LOCALE_ID, Pipe } from '@angular/core';
|
3
|
+
import { isDefined, UUID, DEFAULT_CURRENCY_ISO_CODE, DEFAULT_CURRENCY_SYMBOL, validateDateFormat, DEFAULT_DATE_FORMAT, DEFAULT_DECIMALS_COUNT, getSupportedDateFormats, DEFAULT_DECIMAL_SEPARATOR, DEFAULT_THOUSANDS_SEPARATOR, DEFAULT_ACTION_CODE_LABELS, parseJsonSafely, UITemplateType, SalesforceIdUtils, ConfigurationProcessorTypes, EntityUtil, extractErrorDetails, DEFAULT_TIME_FORMAT, formatNumber } from '@veloceapps/core';
|
4
|
+
import * as i3 from '@veloceapps/api';
|
7
5
|
import { ApiModule } from '@veloceapps/api';
|
8
|
-
import { merge, isEqual, cloneDeep, assign, flatten, entries, sortBy, map as map$2, omit, uniqBy, transform } from 'lodash';
|
9
6
|
import * as i6 from '@veloceapps/components';
|
10
|
-
import { ToastType,
|
11
|
-
import
|
12
|
-
import
|
13
|
-
import
|
14
|
-
import
|
7
|
+
import { ToastType, ConfirmationDialogModule } from '@veloceapps/components';
|
8
|
+
import { tap, BehaviorSubject, map, switchMap, of, forkJoin, filter, Subject, noop, catchError, throwError, combineLatest, finalize, buffer, debounceTime, share, take, distinctUntilChanged, shareReplay, takeUntil } from 'rxjs';
|
9
|
+
import * as i1 from '@veloceapps/api/v2';
|
10
|
+
import { flatten, omit, uniqBy, cloneDeep, assign, isEqual } from 'lodash';
|
11
|
+
import { filter as filter$1, map as map$1, catchError as catchError$1, tap as tap$1, finalize as finalize$1 } from 'rxjs/operators';
|
12
|
+
import * as i2 from 'primeng/api';
|
15
13
|
import { NgControl } from '@angular/forms';
|
16
14
|
import { DATE_PIPE_DEFAULT_OPTIONS, formatDate } from '@angular/common';
|
17
15
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
16
|
+
class ConfigurationRuntimeService {
|
17
|
+
constructor(pcmApiService) {
|
18
|
+
this.pcmApiService = pcmApiService;
|
19
|
+
this.uiDefinitionContainer = null;
|
20
|
+
}
|
21
|
+
get uiDefinitionProps() {
|
22
|
+
var _a, _b;
|
23
|
+
return (_b = (_a = this.uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.source.properties) !== null && _b !== void 0 ? _b : {};
|
24
|
+
}
|
25
|
+
reset() {
|
26
|
+
this.uiDefinitionContainer = null;
|
27
|
+
this.initializationProps = undefined;
|
28
|
+
this.pcmModel = undefined;
|
29
|
+
}
|
30
|
+
init$(props) {
|
31
|
+
this.initializationProps = props;
|
32
|
+
return this.pcmApiService.fetchPCMByProductId(props.productId).pipe(tap(pcmModel => (this.pcmModel = pcmModel)));
|
33
|
+
}
|
34
|
+
}
|
35
|
+
ConfigurationRuntimeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService, deps: [{ token: i1.PCMApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
36
|
+
ConfigurationRuntimeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService });
|
37
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService, decorators: [{
|
38
|
+
type: Injectable
|
39
|
+
}], ctorParameters: function () { return [{ type: i1.PCMApiService }]; } });
|
40
|
+
|
41
|
+
const findTransactionItem = (id, items) => {
|
42
|
+
return findTransactionItemWithComparator(items, (ti) => ti.id === id);
|
26
43
|
};
|
27
|
-
const
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
44
|
+
const findTransactionItemWithComparator = (items, comparator) => {
|
45
|
+
let currentLevel = items;
|
46
|
+
while (currentLevel.length) {
|
47
|
+
const found = currentLevel.find(comparator);
|
48
|
+
if (found) {
|
49
|
+
return found;
|
50
|
+
}
|
51
|
+
currentLevel = flatten(currentLevel.map(parent => parent.children));
|
52
|
+
}
|
53
|
+
return;
|
54
|
+
};
|
55
|
+
const insertTransactionItem = (item, parentId, toInsert) => {
|
56
|
+
const insertData = item.id === parentId ? [toInsert] : [];
|
57
|
+
return Object.assign(Object.assign({}, item), { children: [
|
58
|
+
...insertData,
|
59
|
+
...item.children.map(ti => {
|
60
|
+
return insertTransactionItem(ti, parentId, toInsert);
|
61
|
+
}),
|
62
|
+
] });
|
63
|
+
};
|
64
|
+
const removeTransactionItem = (item, idToRemove) => {
|
65
|
+
return Object.assign(Object.assign({}, item), { children: item.children
|
66
|
+
.map(ti => {
|
67
|
+
if (ti.id === idToRemove) {
|
68
|
+
return;
|
69
|
+
}
|
70
|
+
else if (ti.children.length) {
|
71
|
+
return removeTransactionItem(ti, idToRemove);
|
72
|
+
}
|
73
|
+
return ti;
|
74
|
+
})
|
75
|
+
.filter(isDefined) });
|
76
|
+
};
|
77
|
+
const replaceTransactionItem = (item, replaceTo) => {
|
78
|
+
if (item.id === replaceTo.id) {
|
79
|
+
return Object.assign({}, replaceTo);
|
80
|
+
}
|
81
|
+
return Object.assign(Object.assign({}, item), { children: item.children.map(ti => replaceTransactionItem(ti, replaceTo)) });
|
50
82
|
};
|
51
|
-
const
|
52
|
-
var _a, _b, _c;
|
53
|
-
const id = UUID.UUID();
|
54
|
-
const attributes = Object.entries((_a = props.attributesMap) !== null && _a !== void 0 ? _a : {}).map(([name, value]) => ({
|
55
|
-
name,
|
56
|
-
value,
|
57
|
-
cfgStatus: 'User',
|
58
|
-
}));
|
59
|
-
const lineItems = [];
|
83
|
+
const generateTransactionItem = (productId) => {
|
60
84
|
return {
|
61
|
-
id,
|
62
|
-
|
63
|
-
cfgStatus: 'Default',
|
64
|
-
actionCode: 'ADD',
|
65
|
-
qty,
|
66
|
-
attributes,
|
67
|
-
lineItems,
|
68
|
-
productName: props.product.name,
|
69
|
-
productId: (_c = props.product.id) !== null && _c !== void 0 ? _c : '',
|
85
|
+
id: UUID.UUID(),
|
86
|
+
productId,
|
70
87
|
};
|
71
88
|
};
|
72
89
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
var RuntimeMode;
|
78
|
-
(function (RuntimeMode) {
|
79
|
-
RuntimeMode[RuntimeMode["TEST"] = 0] = "TEST";
|
80
|
-
RuntimeMode[RuntimeMode["PROD"] = 1] = "PROD";
|
81
|
-
})(RuntimeMode || (RuntimeMode = {}));
|
82
|
-
var RuntimeOperation;
|
83
|
-
(function (RuntimeOperation) {
|
84
|
-
RuntimeOperation["INIT"] = "INIT";
|
85
|
-
RuntimeOperation["UPDATE"] = "UPDATE";
|
86
|
-
})(RuntimeOperation || (RuntimeOperation = {}));
|
87
|
-
var RuntimeStep;
|
88
|
-
(function (RuntimeStep) {
|
89
|
-
RuntimeStep["START"] = "START";
|
90
|
-
RuntimeStep["UPDATE"] = "UPDATE";
|
91
|
-
})(RuntimeStep || (RuntimeStep = {}));
|
92
|
-
|
93
|
-
const UI_DEFINITION_VERSION = 3;
|
94
|
-
|
95
|
-
class ContextService {
|
96
|
-
constructor(contextApiService) {
|
97
|
-
this.contextApiService = contextApiService;
|
98
|
-
this.context = new BehaviorSubject(null);
|
90
|
+
class TransactionItemWorker {
|
91
|
+
constructor(src) {
|
92
|
+
this.ti = Object.assign({}, src);
|
99
93
|
}
|
100
|
-
|
101
|
-
return
|
94
|
+
insert(parentId, toInsert) {
|
95
|
+
return new TransactionItemWorker(insertTransactionItem(this.ti, parentId, toInsert));
|
102
96
|
}
|
103
|
-
|
104
|
-
return this.
|
97
|
+
remove(id) {
|
98
|
+
return new TransactionItemWorker(removeTransactionItem(this.ti, id));
|
105
99
|
}
|
106
|
-
|
107
|
-
return this.
|
100
|
+
replace(toReplace) {
|
101
|
+
return new TransactionItemWorker(replaceTransactionItem(this.ti, toReplace));
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
function extractMetadata(uiDefinition) {
|
106
|
+
return omit(uiDefinition, [
|
107
|
+
'children',
|
108
|
+
'pages',
|
109
|
+
'components',
|
110
|
+
]);
|
111
|
+
}
|
112
|
+
|
113
|
+
const FLOW_CUSTOMIZATION = new InjectionToken('FLOW_CUSTOMIZATION');
|
114
|
+
|
115
|
+
class RuntimeSettingsService {
|
116
|
+
constructor(configurationSettingsApiService) {
|
117
|
+
this.configurationSettingsApiService = configurationSettingsApiService;
|
118
|
+
this.configurationSettings$ = new BehaviorSubject({});
|
119
|
+
this.currencySettings$ = new BehaviorSubject({
|
120
|
+
iso: DEFAULT_CURRENCY_ISO_CODE,
|
121
|
+
symbol: DEFAULT_CURRENCY_SYMBOL,
|
122
|
+
});
|
123
|
+
this.shoppingCartSettings$ = new BehaviorSubject([]);
|
124
|
+
this.getCurrencySymbol = (locale, currency) => {
|
125
|
+
return (0)
|
126
|
+
.toLocaleString(locale, { style: 'currency', currency, minimumFractionDigits: 0, maximumFractionDigits: 0 })
|
127
|
+
.replace(/\d/g, '')
|
128
|
+
.trim();
|
129
|
+
};
|
108
130
|
}
|
109
|
-
|
110
|
-
return this.
|
131
|
+
create() {
|
132
|
+
return this.configurationSettingsApiService.fetchSettings().pipe(map(settings => this.parseConfigurationSettings(settings)), tap(configurationSettings => {
|
133
|
+
var _a;
|
134
|
+
this.configurationSettings$.next(configurationSettings);
|
135
|
+
this.addShoppingCartSettings((_a = configurationSettings['shopping-cart']) !== null && _a !== void 0 ? _a : []);
|
136
|
+
this.formattingSettings = this.getFormattingSettings();
|
137
|
+
}), map(() => undefined));
|
111
138
|
}
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
139
|
+
initCurrency(iso) {
|
140
|
+
if (iso) {
|
141
|
+
const symbol = this.getCurrencySymbol('en-US', iso);
|
142
|
+
this.currencySettings$.next({ iso, symbol });
|
143
|
+
if (this.formattingSettings) {
|
144
|
+
this.formattingSettings.currencySymbol = symbol;
|
145
|
+
}
|
119
146
|
}
|
120
|
-
return false;
|
121
147
|
}
|
122
|
-
|
123
|
-
|
124
|
-
|
148
|
+
getFormattingSettings() {
|
149
|
+
var _a, _b;
|
150
|
+
if (this.formattingSettings) {
|
151
|
+
return this.formattingSettings;
|
125
152
|
}
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
153
|
+
const shoppingCartSettings = (_a = this.getConfigurationSettings()['shopping-cart']) === null || _a === void 0 ? void 0 : _a.reduce((acc, setting) => {
|
154
|
+
return Object.assign(Object.assign({}, acc), { [setting.id]: setting.properties });
|
155
|
+
}, {});
|
156
|
+
const currencySettings = this.getCurrencySettings();
|
157
|
+
const dateFormat = (validateDateFormat((_b = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.DATE_FORMAT) !== null && _b !== void 0 ? _b : '') && (shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.DATE_FORMAT)) ||
|
158
|
+
DEFAULT_DATE_FORMAT;
|
159
|
+
const decimalSeparator = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.DECIMAL_SEPARATOR;
|
160
|
+
const thousandsSeparator = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.THOUSANDS_SEPARATOR;
|
161
|
+
// the number of decimal places can be 0
|
162
|
+
const priceScale = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.PRICE_SCALE;
|
163
|
+
const decimalsCount = priceScale !== null && priceScale !== '' && !isNaN(Number(priceScale)) && Number(priceScale) >= 0
|
164
|
+
? Number(priceScale)
|
165
|
+
: DEFAULT_DECIMALS_COUNT;
|
166
|
+
const actionCodeSettings = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.STATUS_LABEL;
|
167
|
+
return {
|
168
|
+
currencySymbol: currencySettings.symbol,
|
169
|
+
dateFormats: getSupportedDateFormats(dateFormat),
|
170
|
+
decimalsCount,
|
171
|
+
decimalSeparator: decimalSeparator !== undefined && ['.', ','].includes(decimalSeparator)
|
172
|
+
? decimalSeparator
|
173
|
+
: DEFAULT_DECIMAL_SEPARATOR,
|
174
|
+
// thousands separator can be a blank value, so it can also be null
|
175
|
+
thousandsSeparator: thousandsSeparator !== undefined && ['.', ',', '', null].includes(thousandsSeparator)
|
176
|
+
? thousandsSeparator || ''
|
177
|
+
: DEFAULT_THOUSANDS_SEPARATOR,
|
178
|
+
actionCodeLabels: (actionCodeSettings === null || actionCodeSettings === void 0 ? void 0 : actionCodeSettings.length)
|
179
|
+
? actionCodeSettings.reduce((result, setting) => (Object.assign(Object.assign({}, result), { [setting.status_label]: setting.custom_label })), {})
|
180
|
+
: DEFAULT_ACTION_CODE_LABELS,
|
181
|
+
};
|
130
182
|
}
|
131
|
-
|
132
|
-
return this.
|
183
|
+
getConfigurationSettings() {
|
184
|
+
return this.configurationSettings$.value;
|
133
185
|
}
|
134
|
-
|
135
|
-
return this.
|
136
|
-
return this.update({
|
137
|
-
properties: Object.assign(Object.assign({}, context.properties), { RuntimeMode: ConfigurationContextMode.TEST, StartDate: new Date().toISOString().substring(0, 10), standalone: 'true' }),
|
138
|
-
});
|
139
|
-
}));
|
186
|
+
getShoppingCartSettings() {
|
187
|
+
return this.shoppingCartSettings$.value;
|
140
188
|
}
|
141
|
-
|
142
|
-
|
143
|
-
const updatedContext = Object.assign(Object.assign(Object.assign({}, originalContext), partialContext), { properties: Object.assign(Object.assign({}, originalContext.properties), partialContext.properties) });
|
144
|
-
this.context.next(updatedContext);
|
145
|
-
return updatedContext;
|
189
|
+
getCurrencySettings() {
|
190
|
+
return this.currencySettings$.value;
|
146
191
|
}
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
192
|
+
parseConfigurationSettings(settings) {
|
193
|
+
return settings.reduce((acc, setting) => {
|
194
|
+
switch (setting.key) {
|
195
|
+
case 'shopping-cart':
|
196
|
+
acc['shopping-cart'] = parseJsonSafely(setting.value, []);
|
197
|
+
break;
|
198
|
+
case 'navigation':
|
199
|
+
acc.navigation = parseJsonSafely(setting.value, {});
|
200
|
+
break;
|
201
|
+
case 'flows':
|
202
|
+
acc.flows = parseJsonSafely(setting.value, []);
|
203
|
+
break;
|
204
|
+
default:
|
205
|
+
acc[setting.key] = setting.value;
|
206
|
+
}
|
207
|
+
return acc;
|
208
|
+
}, {});
|
152
209
|
}
|
153
|
-
|
154
|
-
|
210
|
+
addShoppingCartSettings(settings) {
|
211
|
+
// uniqBy removes items with the biggest index
|
212
|
+
const newSettings = uniqBy([...settings, ...this.shoppingCartSettings$.value], 'id');
|
213
|
+
this.shoppingCartSettings$.next(newSettings);
|
155
214
|
}
|
156
215
|
}
|
157
|
-
|
158
|
-
|
159
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type:
|
216
|
+
RuntimeSettingsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService, deps: [{ token: i1.ConfigurationSettingsApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
217
|
+
RuntimeSettingsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService });
|
218
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService, decorators: [{
|
160
219
|
type: Injectable
|
161
|
-
}], ctorParameters: function () { return [{ type: i1.
|
220
|
+
}], ctorParameters: function () { return [{ type: i1.ConfigurationSettingsApiService }]; } });
|
162
221
|
|
163
222
|
class FlowInfoService {
|
164
223
|
get flow() {
|
224
|
+
if (!this.flowSubj$.value) {
|
225
|
+
throw new Error(`Flow not initialized yet`);
|
226
|
+
}
|
165
227
|
return this.flowSubj$.value;
|
166
228
|
}
|
167
|
-
|
168
|
-
this.flowSubj$.
|
229
|
+
get isFlowInitialized() {
|
230
|
+
return Boolean(this.flowSubj$.value);
|
169
231
|
}
|
170
|
-
get
|
171
|
-
|
172
|
-
|
232
|
+
get context() {
|
233
|
+
if (!this.contextSubj$.value) {
|
234
|
+
throw new Error('Context is not initialized yet!');
|
235
|
+
}
|
236
|
+
return Object.assign({}, this.contextSubj$.value);
|
237
|
+
}
|
238
|
+
get templates() {
|
239
|
+
return this.templatesSubj$.value;
|
240
|
+
}
|
241
|
+
get isFlowEngineInitialized$() {
|
242
|
+
return this.templates$.pipe(map(v => Boolean(v.FLOW_ENGINE)));
|
173
243
|
}
|
174
244
|
get isStateful() {
|
175
245
|
var _a;
|
176
246
|
return !!((_a = this.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful);
|
177
247
|
}
|
178
|
-
constructor(
|
179
|
-
this.
|
180
|
-
this.
|
248
|
+
constructor(runtimeSettingsService, templatesAdminApiService, customizationService) {
|
249
|
+
this.runtimeSettingsService = runtimeSettingsService;
|
250
|
+
this.templatesAdminApiService = templatesAdminApiService;
|
181
251
|
this.customizationService = customizationService;
|
182
|
-
this.templates = {};
|
183
252
|
this.defaultTemplates = {
|
184
253
|
flowEngine: 'Flow Engine',
|
185
254
|
};
|
186
255
|
this.flowSubj$ = new BehaviorSubject(null);
|
256
|
+
this.templatesSubj$ = new BehaviorSubject({});
|
257
|
+
this.contextSubj$ = new BehaviorSubject(null);
|
187
258
|
this.flow$ = this.flowSubj$.asObservable();
|
259
|
+
this.templates$ = this.templatesSubj$.asObservable();
|
260
|
+
}
|
261
|
+
reset() {
|
262
|
+
this.flowSubj$.next(null);
|
263
|
+
this.templatesSubj$.next({});
|
264
|
+
this.contextSubj$.next(null);
|
188
265
|
}
|
189
266
|
init$(flowId, routeQueryParams) {
|
190
|
-
return this.
|
191
|
-
this.params = Object.assign(Object.assign({}, routeQueryParams), flow.properties.queryParams);
|
192
|
-
this.flowSubj$.next(flow);
|
193
|
-
}), map$1(noop), catchError(e => {
|
194
|
-
this.flowSubj$.next(null);
|
195
|
-
return throwError(() => e);
|
196
|
-
}));
|
267
|
+
return this.initFlow$(flowId, routeQueryParams).pipe(switchMap(() => this.initFlowTemplates$()));
|
197
268
|
}
|
198
|
-
|
199
|
-
this.
|
200
|
-
|
201
|
-
|
269
|
+
initTestFlow$(productId) {
|
270
|
+
this.contextSubj$.next({
|
271
|
+
mode: 'QUOTE',
|
272
|
+
headerId: '0Q0-test-quote-id',
|
273
|
+
productId,
|
274
|
+
});
|
275
|
+
this.flowSubj$.next({
|
276
|
+
id: 'preview-flow-id',
|
277
|
+
properties: { entryPath: '/product', queryParams: {} },
|
278
|
+
version: 2,
|
279
|
+
});
|
280
|
+
return of(undefined);
|
281
|
+
}
|
282
|
+
updateContext(update) {
|
283
|
+
this.contextSubj$.next(Object.assign(Object.assign({}, this.context), update));
|
284
|
+
}
|
285
|
+
initFlow$(flowId, routeQueryParams) {
|
286
|
+
var _a;
|
287
|
+
const flow = (_a = this.runtimeSettingsService.getConfigurationSettings()['flows']) === null || _a === void 0 ? void 0 : _a.find(({ id }) => flowId === id);
|
288
|
+
if (!flow) {
|
289
|
+
this.flowSubj$.next(null);
|
290
|
+
throw new Error(`Flow with flowId=${flowId} is not defined`);
|
291
|
+
}
|
292
|
+
const headerId = routeQueryParams['headerId'];
|
293
|
+
if (typeof headerId !== 'string') {
|
294
|
+
throw new Error(`Please provide 'headerId'`);
|
295
|
+
}
|
296
|
+
const mode = this.getFlowContextMode(headerId);
|
297
|
+
// Restrict if mode is not defined
|
298
|
+
if (mode == null) {
|
299
|
+
throw new Error('Mode is undefined');
|
300
|
+
}
|
301
|
+
this.contextSubj$.next(Object.assign(Object.assign(Object.assign({}, flow.properties.queryParams), routeQueryParams), { mode }));
|
302
|
+
this.flowSubj$.next(flow);
|
303
|
+
return of(undefined);
|
202
304
|
}
|
203
|
-
initFlowTemplates$(
|
305
|
+
initFlowTemplates$() {
|
204
306
|
var _a, _b, _c;
|
205
307
|
return forkJoin([
|
206
|
-
this.
|
308
|
+
this.templatesAdminApiService.fetchTemplates$(),
|
207
309
|
(_c = (_b = (_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplates) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : of([]),
|
208
|
-
]).pipe(map
|
209
|
-
|
310
|
+
]).pipe(map(([templates, localTemplates]) => {
|
311
|
+
var _a, _b;
|
312
|
+
const newValue = {};
|
313
|
+
Object.entries(Object.assign(Object.assign({}, this.defaultTemplates), ((_b = (_a = this.flow) === null || _a === void 0 ? void 0 : _a.properties.templates) !== null && _b !== void 0 ? _b : {}))).forEach(([key, name]) => {
|
210
314
|
var _a;
|
211
315
|
const type = this.remapTemplateName(key);
|
212
316
|
if (type) {
|
213
|
-
|
317
|
+
newValue[type] =
|
214
318
|
(_a = localTemplates.find(template => template.name === name && template.type === type)) !== null && _a !== void 0 ? _a : templates.find(template => template.name === name && template.type === type);
|
215
319
|
}
|
216
320
|
});
|
321
|
+
this.templatesSubj$.next(newValue);
|
217
322
|
}));
|
218
323
|
}
|
219
324
|
remapTemplateName(templateType) {
|
@@ -239,13 +344,20 @@ class FlowInfoService {
|
|
239
344
|
}
|
240
345
|
return undefined;
|
241
346
|
}
|
347
|
+
getFlowContextMode(headerId) {
|
348
|
+
const objectName = SalesforceIdUtils.getSfObjectNameById(headerId);
|
349
|
+
if (!objectName) {
|
350
|
+
return;
|
351
|
+
}
|
352
|
+
return objectName.toUpperCase();
|
353
|
+
}
|
242
354
|
}
|
243
|
-
FlowInfoService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, deps: [{ token:
|
355
|
+
FlowInfoService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, deps: [{ token: RuntimeSettingsService }, { token: i1.UITemplatesAdminApiService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
244
356
|
FlowInfoService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService });
|
245
357
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, decorators: [{
|
246
358
|
type: Injectable
|
247
359
|
}], ctorParameters: function () {
|
248
|
-
return [{ type:
|
360
|
+
return [{ type: RuntimeSettingsService }, { type: i1.UITemplatesAdminApiService }, { type: undefined, decorators: [{
|
249
361
|
type: Optional
|
250
362
|
}, {
|
251
363
|
type: Inject,
|
@@ -253,186 +365,137 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
253
365
|
}] }];
|
254
366
|
} });
|
255
367
|
|
256
|
-
class
|
368
|
+
class SalesTransactionService {
|
257
369
|
get isInitialized$() {
|
258
370
|
return this.isInitializedSubj$.asObservable();
|
259
371
|
}
|
260
372
|
get isInitialized() {
|
261
373
|
return this.isInitializedSubj$.getValue();
|
262
374
|
}
|
263
|
-
set isInitialized(value) {
|
264
|
-
if (this.isInitialized !== value) {
|
265
|
-
this.isInitializedSubj$.next(value);
|
266
|
-
}
|
267
|
-
}
|
268
|
-
get hasUnsavedChanges() {
|
269
|
-
return this._hasUnsavedChanges;
|
270
|
-
}
|
271
375
|
set hasUnsavedChanges(value) {
|
272
376
|
var _a, _b;
|
273
|
-
this.
|
274
|
-
if (!this.
|
275
|
-
this.
|
377
|
+
this.hasUnsavedChangesSubj$.next(value);
|
378
|
+
if (!this.hasUnsavedChanges) {
|
379
|
+
this.initialState = (_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.salesTransactionItems) !== null && _b !== void 0 ? _b : [];
|
276
380
|
}
|
277
381
|
}
|
278
|
-
get
|
279
|
-
return this.
|
280
|
-
}
|
281
|
-
get hasProducts() {
|
282
|
-
var _a;
|
283
|
-
return Boolean((_a = this.quoteSubj$.value) === null || _a === void 0 ? void 0 : _a.currentState.length);
|
382
|
+
get hasUnsavedChanges() {
|
383
|
+
return this.hasUnsavedChangesSubj$.getValue();
|
284
384
|
}
|
285
|
-
get
|
286
|
-
return this.
|
385
|
+
get state() {
|
386
|
+
return this.stateSubj$.getValue();
|
287
387
|
}
|
288
|
-
get
|
388
|
+
get hasProducts() {
|
289
389
|
var _a;
|
290
|
-
return Boolean((_a = this.
|
390
|
+
return Boolean((_a = this.state) === null || _a === void 0 ? void 0 : _a.salesTransactionItems.length);
|
291
391
|
}
|
292
|
-
|
293
|
-
return this.assetsSubj$.value;
|
294
|
-
}
|
295
|
-
constructor(context, flowInfoService, accountApiService, quoteApiService) {
|
296
|
-
this.context = context;
|
392
|
+
constructor(flowInfoService, salesTransactionApiService) {
|
297
393
|
this.flowInfoService = flowInfoService;
|
298
|
-
this.
|
299
|
-
this.
|
300
|
-
this.quoteSubj$ = new BehaviorSubject(null);
|
301
|
-
this.assetsSubj$ = new BehaviorSubject(null);
|
302
|
-
this.resetSubj$ = new BehaviorSubject(true);
|
394
|
+
this.salesTransactionApiService = salesTransactionApiService;
|
395
|
+
this.stateSubj$ = new BehaviorSubject(null);
|
303
396
|
this.isInitializedSubj$ = new BehaviorSubject(false);
|
304
|
-
this.
|
305
|
-
this.
|
306
|
-
this.
|
307
|
-
this.
|
308
|
-
.pipe(filter(isInitialized => isInitialized), switchMap$1(() => this.quoteSubj$.asObservable()), skip(1), tap(quote => this.markAsUpdated(quote)))
|
309
|
-
.subscribe();
|
310
|
-
}
|
311
|
-
reset() {
|
312
|
-
this.resetSubj$.next(true);
|
313
|
-
this.quoteSubj$.next(null);
|
314
|
-
this.assetsSubj$.next(null);
|
315
|
-
this.isInitialized = false;
|
316
|
-
this.hasUnsavedChanges = false;
|
397
|
+
this.hasUnsavedChangesSubj$ = new BehaviorSubject(false);
|
398
|
+
this.initialState = [];
|
399
|
+
this.hasUnsavedChanges$ = this.hasUnsavedChangesSubj$.asObservable();
|
400
|
+
this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
|
317
401
|
}
|
318
402
|
init(headerId, params) {
|
319
|
-
|
320
|
-
const isAccountMode = this.context.mode === ConfigurationContextMode.ACCOUNT;
|
321
|
-
const accountId = isAccountMode ? headerId : ctx.properties.AccountId;
|
322
|
-
return zip(accountId ? this.accountApiService.getAssetsState(accountId, params) : of(null), isAccountMode
|
323
|
-
? of(QuoteDraft.emptyQuote(ConfigurationContextMode.ACCOUNT))
|
324
|
-
: this.quoteApiService.getQuoteState(headerId, params)).pipe(tap(([assets, quote]) => {
|
325
|
-
if (assets) {
|
326
|
-
this.assetsSubj$.next(assets);
|
327
|
-
}
|
328
|
-
this.quoteSubj$.next(quote);
|
329
|
-
if (assets && isAccountMode) {
|
330
|
-
this.context.update(assets.context);
|
331
|
-
}
|
332
|
-
else {
|
333
|
-
this.context.update(quote.context);
|
334
|
-
}
|
335
|
-
}), map(() => noop()), take(1));
|
403
|
+
return this.salesTransactionApiService.getState(headerId, params).pipe(tap(res => this.stateSubj$.next(res.salesTransaction)), map(res => res.salesTransaction));
|
336
404
|
}
|
337
405
|
finalizeInit() {
|
338
|
-
this.
|
406
|
+
this.isInitializedSubj$.next(true);
|
339
407
|
this.hasUnsavedChanges = false;
|
340
408
|
}
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
}
|
346
|
-
this.quoteSubj$.next(Object.assign(Object.assign({}, quoteDraft), { currentState: lineItems }));
|
347
|
-
}
|
348
|
-
updateQuoteDraft(update) {
|
349
|
-
const quoteDraft = this.quoteSubj$.value;
|
350
|
-
if (!quoteDraft) {
|
351
|
-
return;
|
352
|
-
}
|
353
|
-
if (update.context) {
|
354
|
-
this.context.set(update.context);
|
355
|
-
}
|
356
|
-
this.quoteSubj$.next(Object.assign(Object.assign({}, quoteDraft), update));
|
357
|
-
}
|
358
|
-
updateByPriceSummary(priceSummary) {
|
359
|
-
const quoteDraft = this.quoteSubj$.value;
|
360
|
-
if (!quoteDraft) {
|
361
|
-
return;
|
362
|
-
}
|
363
|
-
const updatedCurrentState = this.currentState.map(lineItem => {
|
364
|
-
const updated = priceSummary.lineItems.find(li => li.id === lineItem.id);
|
365
|
-
return updated !== null && updated !== void 0 ? updated : lineItem;
|
366
|
-
});
|
367
|
-
this.quoteSubj$.next(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedCurrentState, totalPrices: priceSummary.totalPrices, approvalItems: priceSummary.approvalItems }));
|
368
|
-
}
|
369
|
-
setAssetsState(assetsState) {
|
370
|
-
this.assetsSubj$.next(assetsState);
|
371
|
-
}
|
372
|
-
get quoteDraft$() {
|
373
|
-
return combineLatest([this.quoteSubj$, this.context.resolve$()]).pipe(map(() => this.quoteDraft), filter((quote) => Boolean(quote)), shareReplay());
|
409
|
+
reset() {
|
410
|
+
this.stateSubj$.next(null);
|
411
|
+
this.isInitializedSubj$.next(false);
|
412
|
+
this.hasUnsavedChangesSubj$.next(false);
|
374
413
|
}
|
375
|
-
|
376
|
-
|
377
|
-
if (!quote) {
|
378
|
-
return null;
|
379
|
-
}
|
380
|
-
return Object.assign(Object.assign({}, quote), { context: this.context.resolve() });
|
414
|
+
getInitialState() {
|
415
|
+
return this.initialState;
|
381
416
|
}
|
382
|
-
|
383
|
-
|
417
|
+
setState(state) {
|
418
|
+
this.stateSubj$.next(state);
|
384
419
|
}
|
385
|
-
|
386
|
-
|
387
|
-
|
420
|
+
}
|
421
|
+
SalesTransactionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, deps: [{ token: FlowInfoService }, { token: i1.SalesTransactionApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
422
|
+
SalesTransactionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService });
|
423
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, decorators: [{
|
424
|
+
type: Injectable
|
425
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: i1.SalesTransactionApiService }]; } });
|
426
|
+
|
427
|
+
class FlowConfigurationService {
|
428
|
+
constructor(orchestrationsApiService, salesTransactionService) {
|
429
|
+
this.orchestrationsApiService = orchestrationsApiService;
|
430
|
+
this.salesTransactionService = salesTransactionService;
|
431
|
+
this.updatedSubj$ = new Subject();
|
432
|
+
this.updated$ = this.updatedSubj$.asObservable();
|
388
433
|
}
|
389
|
-
|
390
|
-
|
391
|
-
return (_b = (_a = this.flowInfoService.flow) === null || _a === void 0 ? void 0 : _a.properties.standalone) !== null && _b !== void 0 ? _b : false;
|
434
|
+
calculate$(state) {
|
435
|
+
return this.orchestrationsApiService.apply$({ salesTransaction: state }).pipe(tap(result => this.salesTransactionService.setState(result.salesTransaction)), map(noop));
|
392
436
|
}
|
393
|
-
|
394
|
-
|
437
|
+
calculate(state) {
|
438
|
+
this.calculate$(state).subscribe();
|
395
439
|
}
|
396
|
-
|
397
|
-
|
440
|
+
revert$(transactionItemId) {
|
441
|
+
var _a;
|
442
|
+
const state = this.salesTransactionService.state;
|
443
|
+
const initialState = this.salesTransactionService.getInitialState();
|
444
|
+
const currentState = (_a = state === null || state === void 0 ? void 0 : state.salesTransactionItems) !== null && _a !== void 0 ? _a : [];
|
445
|
+
const currentItemIndex = currentState.findIndex(({ id }) => id === transactionItemId);
|
446
|
+
const currentItem = currentState[currentItemIndex];
|
447
|
+
const initialItem = initialState.find(({ integrationId }) => integrationId === (currentItem === null || currentItem === void 0 ? void 0 : currentItem.integrationId));
|
448
|
+
if (!state || !currentItem || !initialItem) {
|
449
|
+
return of(null);
|
450
|
+
}
|
451
|
+
const updatedState = cloneDeep(currentState);
|
452
|
+
updatedState.splice(currentItemIndex, 1, initialItem);
|
453
|
+
return of([]).pipe(tap(() => {
|
454
|
+
this.salesTransactionService.setState(Object.assign(Object.assign({}, state), { salesTransactionItems: updatedState }));
|
455
|
+
}), switchMap(() => this.calculate$(Object.assign(Object.assign({}, state), { salesTransactionItems: updatedState }))), map(() => this.salesTransactionService.state), tap(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
|
398
456
|
}
|
399
|
-
|
400
|
-
|
457
|
+
revert(transactionItemId) {
|
458
|
+
this.revert$(transactionItemId).subscribe();
|
401
459
|
}
|
402
|
-
|
403
|
-
const
|
404
|
-
if (
|
405
|
-
return
|
406
|
-
}
|
407
|
-
if (context.mode === ConfigurationContextMode.QUOTE) {
|
408
|
-
return context.properties.Status === 'Draft';
|
460
|
+
delete$(ids) {
|
461
|
+
const state = this.salesTransactionService.state;
|
462
|
+
if (!state) {
|
463
|
+
return of(null);
|
409
464
|
}
|
410
|
-
return
|
465
|
+
return of([]).pipe(map(() => state.salesTransactionItems.filter(({ id }) => !ids.includes(id))), switchMap(updatedState => this.calculate$(Object.assign(Object.assign({}, state), { salesTransactionItems: updatedState }))), map(() => this.salesTransactionService.state), tap(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
|
411
466
|
}
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
467
|
+
delete(ids) {
|
468
|
+
this.delete$(ids).subscribe();
|
469
|
+
}
|
470
|
+
handleErrorAndBounceBack() {
|
471
|
+
return (source$) => {
|
472
|
+
return source$.pipe(catchError(error => {
|
473
|
+
console.error(error);
|
474
|
+
// bounce back if configuration call has failed
|
475
|
+
const state = this.salesTransactionService.state;
|
476
|
+
if (state) {
|
477
|
+
this.salesTransactionService.setState(state);
|
478
|
+
this.updatedSubj$.next();
|
479
|
+
}
|
480
|
+
return throwError(() => error);
|
481
|
+
}));
|
482
|
+
};
|
419
483
|
}
|
420
484
|
}
|
421
|
-
|
422
|
-
|
423
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type:
|
485
|
+
FlowConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, deps: [{ token: i1.OrchestrationsApiService }, { token: SalesTransactionService }], target: i0.ɵɵFactoryTarget.Injectable });
|
486
|
+
FlowConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService });
|
487
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, decorators: [{
|
424
488
|
type: Injectable
|
425
|
-
}], ctorParameters: function () { return [{ type:
|
489
|
+
}], ctorParameters: function () { return [{ type: i1.OrchestrationsApiService }, { type: SalesTransactionService }]; } });
|
426
490
|
|
427
491
|
class FlowStateService {
|
428
|
-
constructor(
|
429
|
-
this.contextService = contextService;
|
430
|
-
this.quoteDraftService = quoteDraftService;
|
431
|
-
this.flowInfoService = flowInfoService;
|
492
|
+
constructor(flowConfiguration, flowInfoService, flowStateApiService, processorsApiService, salesTransactionApiService, salesTransactionService, toastService, customizationService) {
|
432
493
|
this.flowConfiguration = flowConfiguration;
|
433
|
-
this.
|
494
|
+
this.flowInfoService = flowInfoService;
|
434
495
|
this.flowStateApiService = flowStateApiService;
|
435
|
-
this.
|
496
|
+
this.processorsApiService = processorsApiService;
|
497
|
+
this.salesTransactionApiService = salesTransactionApiService;
|
498
|
+
this.salesTransactionService = salesTransactionService;
|
436
499
|
this.toastService = toastService;
|
437
500
|
this.customizationService = customizationService;
|
438
501
|
this.NOT_INITIALIZED = Symbol();
|
@@ -449,68 +512,22 @@ class FlowStateService {
|
|
449
512
|
this.cleanup$ = new Subject();
|
450
513
|
this.statefulExecutionRequest$ = this.initBufferedRequest$();
|
451
514
|
/*
|
452
|
-
In stateless mode watch
|
453
|
-
all subscriptions get their updates according to updated
|
515
|
+
In stateless mode watch State changes and call executeRequest so that
|
516
|
+
all subscriptions get their updates according to updated State
|
454
517
|
*/
|
455
518
|
this.isInitialized$()
|
456
|
-
.pipe(filter
|
519
|
+
.pipe(filter(Boolean), filter(() => !this.flowInfoService.flow.properties.stateful), switchMap(() => this.flowConfiguration.updated$), switchMap(() => this.executeRequest$({}, true)))
|
457
520
|
.subscribe();
|
458
|
-
this.charges$ = this.flowInfoService.flow$.pipe(filter$1(isDefined), switchMap(() => {
|
459
|
-
if (this.flowInfoService.isLegacy) {
|
460
|
-
return this.quoteDraftService.quoteDraft$.pipe(map$1(quoteDraft => quoteDraft.charges));
|
461
|
-
}
|
462
|
-
else {
|
463
|
-
return this.subscribe$(UITemplateType.FLOW_ENGINE, 'CHARGES', null, {
|
464
|
-
cold: true,
|
465
|
-
}).pipe(map$1(response => (response.success ? response.result : {})));
|
466
|
-
}
|
467
|
-
}), shareReplay$1(1));
|
468
|
-
this.charges$.subscribe();
|
469
|
-
this.pricePlans$ = this.flowInfoService.flow$.pipe(filter$1(isDefined), switchMap(() => {
|
470
|
-
if (this.flowInfoService.isLegacy) {
|
471
|
-
return this.quoteDraftService.quoteDraft$.pipe(map$1(quoteDraft => quoteDraft.pricePlans));
|
472
|
-
}
|
473
|
-
else {
|
474
|
-
return this.subscribe$(UITemplateType.FLOW_ENGINE, 'PRICE_PLANS', null, {
|
475
|
-
cold: true,
|
476
|
-
}).pipe(map$1(response => (response.success ? response.result : {})));
|
477
|
-
}
|
478
|
-
}), shareReplay$1(1));
|
479
|
-
this.pricePlans$.subscribe();
|
480
|
-
this.activeMetrics$ = this.flowInfoService.flow$.pipe(filter$1(isDefined), switchMap(() => {
|
481
|
-
if (this.flowInfoService.isLegacy) {
|
482
|
-
return this.quoteDraftService.quoteDraft$.pipe(map$1(quoteDraft => quoteDraft.activeMetrics));
|
483
|
-
}
|
484
|
-
else {
|
485
|
-
return this.subscribe$(UITemplateType.FLOW_ENGINE, 'ACTIVE_METRICS', null, {
|
486
|
-
cold: true,
|
487
|
-
}).pipe(map$1(response => (response.success ? response.result : [])));
|
488
|
-
}
|
489
|
-
}), shareReplay$1(1));
|
490
|
-
this.activeMetrics$.subscribe();
|
491
|
-
this.isPriceListLocked$ = this.flowInfoService.flow$.pipe(filter$1(isDefined), switchMap(() => {
|
492
|
-
if (this.flowInfoService.isLegacy) {
|
493
|
-
return of(false);
|
494
|
-
}
|
495
|
-
else {
|
496
|
-
return this.subscribe$(UITemplateType.FLOW_ENGINE, 'IS_PRICE_LIST_LOCKED', null, {
|
497
|
-
cold: true,
|
498
|
-
}).pipe(map$1(response => (response.success ? response.result : false)));
|
499
|
-
}
|
500
|
-
}), shareReplay$1(1));
|
501
|
-
this.isPriceListLocked$.subscribe();
|
502
521
|
}
|
503
522
|
init$() {
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
}
|
511
|
-
}));
|
523
|
+
if (this.flowInfoService.flow.properties.stateful) {
|
524
|
+
return this.initProcessors$().pipe(switchMap(() => this.initStateful$()));
|
525
|
+
}
|
526
|
+
else {
|
527
|
+
return forkJoin([this.initStateless$(), this.initProcessors$()]).pipe(map(noop));
|
528
|
+
}
|
512
529
|
}
|
513
|
-
|
530
|
+
reset() {
|
514
531
|
Object.values(this.subscriptions).forEach(({ data$ }) => data$.complete());
|
515
532
|
this.subscriptions = {};
|
516
533
|
if (this.stateId$.value) {
|
@@ -522,9 +539,9 @@ class FlowStateService {
|
|
522
539
|
this.cleanup$.next();
|
523
540
|
}
|
524
541
|
get hasUnsavedChanges() {
|
525
|
-
return this.
|
542
|
+
return this.flowInfoService.flow.properties.stateful
|
526
543
|
? Array.from(this.trackedStatefulChangesMap.values()).some(Boolean)
|
527
|
-
: this.
|
544
|
+
: this.salesTransactionService.hasUnsavedChanges;
|
528
545
|
}
|
529
546
|
get stateId() {
|
530
547
|
return this.stateId$.value;
|
@@ -533,14 +550,14 @@ class FlowStateService {
|
|
533
550
|
return this.executionInProgress$.asObservable();
|
534
551
|
}
|
535
552
|
isInitialized$() {
|
536
|
-
return combineLatest([this.stateId$, this.
|
553
|
+
return combineLatest([this.stateId$, this.salesTransactionService.isInitialized$]).pipe(map(values => values.some(Boolean)));
|
537
554
|
}
|
538
555
|
isInitialized() {
|
539
|
-
return Boolean(this.stateId$.value) || this.
|
556
|
+
return Boolean(this.stateId$.value) || this.salesTransactionService.isInitialized;
|
540
557
|
}
|
541
558
|
execute$(scope, exec) {
|
542
559
|
const request = this.execToRequest(scope, exec);
|
543
|
-
return this.executeRequest$(request).pipe(map
|
560
|
+
return this.executeRequest$(request).pipe(map(result => {
|
544
561
|
// Keep only requested results
|
545
562
|
const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
|
546
563
|
var _a;
|
@@ -557,7 +574,7 @@ class FlowStateService {
|
|
557
574
|
actions: [{ name: action, inputData }],
|
558
575
|
};
|
559
576
|
const request = this.execToRequest(scope, exec);
|
560
|
-
return this.executeRequest$(request).pipe(map
|
577
|
+
return this.executeRequest$(request).pipe(map(noop));
|
561
578
|
}
|
562
579
|
select$(scope, selectorName, inputData) {
|
563
580
|
const requestId = this.generateRequestId(scope, selectorName, inputData);
|
@@ -569,7 +586,7 @@ class FlowStateService {
|
|
569
586
|
},
|
570
587
|
},
|
571
588
|
});
|
572
|
-
return this.executeRequest$(request).pipe(map
|
589
|
+
return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
|
573
590
|
}
|
574
591
|
subscribe$(scope, selectorName, inputData, options) {
|
575
592
|
const requestId = this.generateRequestId(scope, selectorName, inputData);
|
@@ -595,7 +612,7 @@ class FlowStateService {
|
|
595
612
|
this.executeRequest$(request).subscribe();
|
596
613
|
}
|
597
614
|
}
|
598
|
-
return subscription.data$.pipe(filter
|
615
|
+
return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), finalize(() => {
|
599
616
|
var _a;
|
600
617
|
if (!((_a = this.subscriptions[requestId]) === null || _a === void 0 ? void 0 : _a.data$.observed)) {
|
601
618
|
delete this.subscriptions[requestId];
|
@@ -603,9 +620,9 @@ class FlowStateService {
|
|
603
620
|
}));
|
604
621
|
}
|
605
622
|
save$() {
|
606
|
-
if (this.
|
623
|
+
if (this.flowInfoService.flow.properties.stateful) {
|
607
624
|
if (this.stateId$.value) {
|
608
|
-
return this.flowStateApiService.save(this.stateId$.value).pipe(tap
|
625
|
+
return this.flowStateApiService.save(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })), tap(() => {
|
609
626
|
Array.from(this.trackedStatefulChangesMap.keys()).forEach(key => {
|
610
627
|
this.trackedStatefulChangesMap.set(key, false);
|
611
628
|
});
|
@@ -613,30 +630,26 @@ class FlowStateService {
|
|
613
630
|
}
|
614
631
|
}
|
615
632
|
else {
|
616
|
-
const
|
617
|
-
if (
|
618
|
-
return this.
|
619
|
-
this.contextService.update({ properties: { VELOCE_PRISM__VersionId__c: versionId } });
|
620
|
-
}));
|
633
|
+
const state = this.salesTransactionService.state;
|
634
|
+
if (state) {
|
635
|
+
return this.salesTransactionApiService.upsert(state);
|
621
636
|
}
|
622
637
|
}
|
623
|
-
return of({
|
638
|
+
return of({ id: '' });
|
624
639
|
}
|
625
640
|
submit$() {
|
626
|
-
if (this.
|
641
|
+
if (this.flowInfoService.flow.properties.stateful) {
|
627
642
|
if (this.stateId$.value) {
|
628
|
-
return this.flowStateApiService.submit(this.stateId$.value);
|
643
|
+
return this.flowStateApiService.submit(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })));
|
629
644
|
}
|
630
645
|
}
|
631
646
|
else {
|
632
|
-
const
|
633
|
-
if (
|
634
|
-
return this.
|
635
|
-
this.contextService.update({ properties: { VELOCE_PRISM__VersionId__c: versionId } });
|
636
|
-
}));
|
647
|
+
const state = this.salesTransactionService.state;
|
648
|
+
if (state) {
|
649
|
+
return this.salesTransactionApiService.submit(state);
|
637
650
|
}
|
638
651
|
}
|
639
|
-
return of({
|
652
|
+
return of({ id: '' });
|
640
653
|
}
|
641
654
|
getFlowStore() {
|
642
655
|
return this.flowStore;
|
@@ -677,10 +690,10 @@ class FlowStateService {
|
|
677
690
|
fullRequest.selectors = assign(fullRequest.selectors, subscription.request.selectors);
|
678
691
|
}
|
679
692
|
}
|
680
|
-
const execution$ = this.
|
693
|
+
const execution$ = this.flowInfoService.flow.properties.stateful
|
681
694
|
? this.executeStateful$(fullRequest)
|
682
695
|
: this.executeStateless$(fullRequest);
|
683
|
-
return execution$.pipe(tap
|
696
|
+
return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
|
684
697
|
}
|
685
698
|
handleSelectorsResponse(selectors) {
|
686
699
|
Object.entries(selectors).forEach(([requestId, selectorResult]) => {
|
@@ -696,32 +709,21 @@ class FlowStateService {
|
|
696
709
|
});
|
697
710
|
}
|
698
711
|
initStateful$() {
|
699
|
-
var _a;
|
700
|
-
// Subscriptions
|
701
|
-
this.subscribe$(UITemplateType.FLOW_ENGINE, 'CONTEXT', null, { cold: true })
|
702
|
-
.pipe(tap$1(response => {
|
703
|
-
if (response.success) {
|
704
|
-
this.contextService.update(response.result);
|
705
|
-
}
|
706
|
-
}), takeUntil(this.cleanup$))
|
707
|
-
.subscribe();
|
708
712
|
const processorsList = flatten(Object.values(this.processors).map(ownerMap => Object.values(ownerMap !== null && ownerMap !== void 0 ? ownerMap : {})));
|
709
713
|
const processors = processorsList.length ? processorsList : undefined;
|
710
714
|
const selectors = Object.values(this.subscriptions)
|
711
715
|
.map(({ request }) => request.selectors)
|
712
716
|
.filter(isDefined)
|
713
717
|
.reduce((trunk, selectors) => (Object.assign(Object.assign({}, trunk), selectors)), {});
|
714
|
-
const request = this.getDefaultExecutionRequestDTO();
|
715
718
|
return this.flowStateApiService
|
716
719
|
.init({
|
717
|
-
quoteId: this.
|
718
|
-
params:
|
720
|
+
quoteId: this.flowInfoService.context.headerId,
|
721
|
+
params: this.flowInfoService.context,
|
719
722
|
actionsOverride: processors === null || processors === void 0 ? void 0 : processors.filter(processor => processor.type === ConfigurationProcessorTypes.ACTION),
|
720
723
|
selectorsOverride: processors === null || processors === void 0 ? void 0 : processors.filter(processor => processor.type === ConfigurationProcessorTypes.SELECTOR),
|
721
|
-
selectors:
|
722
|
-
actions: request.actions,
|
724
|
+
selectors: selectors,
|
723
725
|
})
|
724
|
-
.pipe(map
|
726
|
+
.pipe(map(({ stateId, selectors }) => {
|
725
727
|
this.handleSelectorsResponse(selectors);
|
726
728
|
this.stateId$.next(stateId);
|
727
729
|
}));
|
@@ -741,80 +743,50 @@ class FlowStateService {
|
|
741
743
|
};
|
742
744
|
this.executionInProgress$.next(true);
|
743
745
|
return this.flowStateApiService.execute(this.stateId$.value, request);
|
744
|
-
}), tap
|
746
|
+
}), tap(({ stateId }) => this.stateId$.next(stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
|
745
747
|
this.executionInProgress$.next(false);
|
746
748
|
return throwError(() => e);
|
747
749
|
}));
|
748
750
|
}
|
749
751
|
executeStateful$(request) {
|
750
|
-
return this.executionInProgress$.pipe(filter
|
752
|
+
return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
|
751
753
|
// make sure stream switches to statefulExecutionRequest$ before pushing an execution request
|
752
754
|
combineLatest([
|
753
755
|
this.statefulExecutionRequest$,
|
754
|
-
of(undefined).pipe(tap
|
755
|
-
])), map
|
756
|
+
of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
|
757
|
+
])), map(([response]) => response), take(1));
|
756
758
|
}
|
757
759
|
initStateless$() {
|
758
|
-
|
759
|
-
const { headerId } = this.contextService.resolve();
|
760
|
-
return this.quoteDraftService.init(headerId, (_a = this.flowInfoService.params) !== null && _a !== void 0 ? _a : {}).pipe(tap$1(() => {
|
761
|
-
const assets = this.quoteDraftService.assetsState;
|
762
|
-
if (assets) {
|
763
|
-
this.flowStore = Object.assign(Object.assign({}, this.flowStore), { assets });
|
764
|
-
}
|
765
|
-
}), switchMap(() => {
|
766
|
-
if (this.flowInfoService.isLegacy) {
|
767
|
-
return of(null);
|
768
|
-
}
|
769
|
-
return this.executeRequest$(this.getDefaultExecutionRequestDTO());
|
770
|
-
}), switchMap(() => this.calculate$()), tap$1(() => this.quoteDraftService.finalizeInit()), map$1(noop));
|
771
|
-
}
|
772
|
-
calculate$() {
|
773
|
-
var _a;
|
774
|
-
const flowState = this.quoteDraftService.quoteDraft;
|
775
|
-
if (!flowState) {
|
776
|
-
return of(undefined);
|
777
|
-
}
|
778
|
-
/*
|
779
|
-
Don't execute procedures when:
|
780
|
-
* Initializing a standalone product configuration UI, as procedure is execute in /price call
|
781
|
-
* Initializing an empty account (account with no assets)
|
782
|
-
*/
|
783
|
-
const isEmptyAccountMode = this.contextService.mode === ConfigurationContextMode.ACCOUNT &&
|
784
|
-
!this.quoteDraftService.hasProducts &&
|
785
|
-
!this.quoteDraftService.hasAssets &&
|
786
|
-
!((_a = this.quoteDraftService.quoteDraft) === null || _a === void 0 ? void 0 : _a.initialState.length);
|
787
|
-
if (this.quoteDraftService.isStandalone || isEmptyAccountMode) {
|
788
|
-
return of(undefined);
|
789
|
-
}
|
790
|
-
return this.flowConfiguration.calculate$(flowState);
|
760
|
+
return this.salesTransactionService.init(this.flowInfoService.context.headerId, this.flowInfoService.context).pipe(switchMap(state => this.flowConfiguration.calculate$(state)), tap(() => this.salesTransactionService.finalizeInit()), map(noop));
|
791
761
|
}
|
792
762
|
executeStateless$(request) {
|
793
763
|
this.executionInProgress$.next(true);
|
794
|
-
return of(undefined).pipe(tap
|
764
|
+
return of(undefined).pipe(tap(() => this.executeStatelessActions(request)), switchMap(() => {
|
795
765
|
var _a;
|
796
766
|
/*
|
797
767
|
Skip price calculation in case
|
798
768
|
1. No actions in the request
|
799
769
|
2. Initialization process execution (state not initialized yet)
|
800
770
|
*/
|
801
|
-
|
771
|
+
const { state } = this.salesTransactionService;
|
772
|
+
if (!state || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length) || !this.isInitialized()) {
|
802
773
|
return of(undefined);
|
803
774
|
}
|
804
775
|
else {
|
805
|
-
return this.calculate$();
|
776
|
+
return this.flowConfiguration.calculate$(state);
|
806
777
|
}
|
807
|
-
}), map
|
778
|
+
}), map(() => this.executeStatelessSelectors(request)), tap(() => this.executionInProgress$.next(false)), catchError(e => {
|
808
779
|
this.executionInProgress$.next(false);
|
809
780
|
return throwError(() => e);
|
810
781
|
}));
|
811
782
|
}
|
812
783
|
executeStatelessActions(request) {
|
813
784
|
var _a;
|
814
|
-
|
785
|
+
const state = this.salesTransactionService.state;
|
786
|
+
if (!state || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
|
815
787
|
return;
|
816
788
|
}
|
817
|
-
let flowState =
|
789
|
+
let flowState = state;
|
818
790
|
request.actions.forEach(action => {
|
819
791
|
var _a;
|
820
792
|
try {
|
@@ -826,1022 +798,126 @@ class FlowStateService {
|
|
826
798
|
throw e;
|
827
799
|
}
|
828
800
|
});
|
829
|
-
this.
|
801
|
+
this.salesTransactionService.setState(flowState);
|
830
802
|
}
|
831
803
|
executeStatelessSelectors(request) {
|
832
804
|
var _a;
|
833
|
-
if (!this.
|
834
|
-
throw '
|
805
|
+
if (!this.salesTransactionService.state) {
|
806
|
+
throw 'State is not initialized';
|
835
807
|
}
|
836
|
-
const flowState = this.
|
808
|
+
const flowState = this.salesTransactionService.state;
|
837
809
|
return EntityUtil.entries((_a = request.selectors) !== null && _a !== void 0 ? _a : {}).reduce((result, [key, selector]) => {
|
838
|
-
try {
|
839
|
-
result.selectors[key] = {
|
840
|
-
success: true,
|
841
|
-
result: this.executeSelectorScript(flowState, selector),
|
842
|
-
};
|
843
|
-
}
|
844
|
-
catch (e) {
|
845
|
-
console.error(e);
|
846
|
-
result.selectors[key] = {
|
847
|
-
success: false,
|
848
|
-
errorMessage: String(e),
|
849
|
-
};
|
850
|
-
}
|
851
|
-
return result;
|
852
|
-
}, { stateId: '', selectors: {} });
|
853
|
-
}
|
854
|
-
getFlowSafe() {
|
855
|
-
if (!this.flowInfoService.flow) {
|
856
|
-
throw 'Flow is not defined';
|
857
|
-
}
|
858
|
-
return this.flowInfoService.flow;
|
859
|
-
}
|
860
|
-
initProcessors$() {
|
861
|
-
var _a;
|
862
|
-
const hasOverrides = Boolean((_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors);
|
863
|
-
const flow = this.getFlowSafe();
|
864
|
-
if (flow.properties.stateful && !hasOverrides) {
|
865
|
-
// Skip initialization as backend will take processors from SF
|
866
|
-
return of(undefined);
|
867
|
-
}
|
868
|
-
const owners$ = Object.values(this.flowInfoService.templates)
|
869
|
-
.map(template => {
|
870
|
-
var _a, _b, _c;
|
871
|
-
if (!template) {
|
872
|
-
return;
|
873
|
-
}
|
874
|
-
const localProcessors$ = (_c = (_b = (_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors) === null || _b === void 0 ? void 0 : _b.call(_a, template.name)) !== null && _c !== void 0 ? _c : of(null);
|
875
|
-
return localProcessors$.pipe(switchMap(processors => processors ? of(processors) : this.processorsApiService.fetchConfigurationProcessors$(template.id)), tap$1(processors => {
|
876
|
-
const processorsMap = processors.reduce((acc, p) => {
|
877
|
-
acc[p.apiName] = p;
|
878
|
-
return acc;
|
879
|
-
}, {});
|
880
|
-
this.processors[template.id] = processorsMap;
|
881
|
-
}));
|
882
|
-
})
|
883
|
-
.filter(isDefined);
|
884
|
-
if (!owners$.length) {
|
885
|
-
return of(undefined);
|
886
|
-
}
|
887
|
-
return forkJoin(owners$).pipe(map$1(noop));
|
888
|
-
}
|
889
|
-
executeActionScript(request, executable) {
|
890
|
-
var _a;
|
891
|
-
const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
|
892
|
-
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
893
|
-
const scope = this.getScopeByOwnerId(executable.ownerId);
|
894
|
-
const scopeText = scope ? ` in ${scope}` : '';
|
895
|
-
throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
|
896
|
-
}
|
897
|
-
return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
|
898
|
-
}
|
899
|
-
executeSelectorScript(request, executable) {
|
900
|
-
var _a;
|
901
|
-
const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
|
902
|
-
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
903
|
-
const scope = this.getScopeByOwnerId(executable.ownerId);
|
904
|
-
const scopeText = scope ? ` in ${scope}` : '';
|
905
|
-
throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
|
906
|
-
}
|
907
|
-
return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
|
908
|
-
}
|
909
|
-
executeProcessorScript(request, configurationProcessor, inputData) {
|
910
|
-
var _a;
|
911
|
-
const scope = this.getScopeByOwnerId((_a = configurationProcessor.ownerId) !== null && _a !== void 0 ? _a : '');
|
912
|
-
let functionToExecute = this.executedFunctions[scope + configurationProcessor.apiName];
|
913
|
-
if (!functionToExecute) {
|
914
|
-
const script = `${configurationProcessor.script}\nreturn transform;`;
|
915
|
-
const sourceMap = `\n//# sourceURL=${scope ? scope + '/' : ''}${configurationProcessor.apiName}.js`;
|
916
|
-
functionToExecute = new Function(script + sourceMap)();
|
917
|
-
this.executedFunctions[scope + configurationProcessor.apiName] = functionToExecute;
|
918
|
-
}
|
919
|
-
return functionToExecute({
|
920
|
-
request,
|
921
|
-
inputData,
|
922
|
-
flowStore: this.flowStore,
|
923
|
-
});
|
924
|
-
}
|
925
|
-
generateRequestId(scope, selectorName, inputData) {
|
926
|
-
const inputDataHash = UUID.hex(JSON.stringify(inputData) || '').slice(0, 8);
|
927
|
-
return `${scope}/${selectorName}/${inputDataHash}`;
|
928
|
-
}
|
929
|
-
getDefaultExecutionRequestDTO() {
|
930
|
-
var _a;
|
931
|
-
const request = {
|
932
|
-
actions: [],
|
933
|
-
selectors: {},
|
934
|
-
};
|
935
|
-
if (this.getFlowSafe().properties.standalone) {
|
936
|
-
return request;
|
937
|
-
}
|
938
|
-
const flowEngineTemplateId = this.getOwnerIdByScope(UITemplateType.FLOW_ENGINE);
|
939
|
-
(_a = request.actions) === null || _a === void 0 ? void 0 : _a.push({
|
940
|
-
apiName: 'UPDATE_CONTEXT_PROPERTIES',
|
941
|
-
ownerId: flowEngineTemplateId,
|
942
|
-
inputData: this.contextService.resolve().properties,
|
943
|
-
});
|
944
|
-
return request;
|
945
|
-
}
|
946
|
-
checkStatefulChanges(requestId, selectorResult) {
|
947
|
-
if (this.trackedStatefulChangesMap.has(requestId)) {
|
948
|
-
if (!this.initialStatefulData[requestId]) {
|
949
|
-
this.initialStatefulData[requestId] = selectorResult;
|
950
|
-
}
|
951
|
-
const hasChanges = !isEqual(this.initialStatefulData[requestId], selectorResult);
|
952
|
-
this.trackedStatefulChangesMap.set(requestId, hasChanges);
|
953
|
-
}
|
954
|
-
}
|
955
|
-
}
|
956
|
-
FlowStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, deps: [{ token: ContextService }, { token: QuoteDraftService }, { token: FlowInfoService }, { token: FlowConfigurationService }, { token: i1.ConfigurationProcessorsApiService }, { token: i1.FlowStateApiService }, { token: i1.QuoteApiService }, { token: i6.ToastService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
957
|
-
FlowStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService });
|
958
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, decorators: [{
|
959
|
-
type: Injectable
|
960
|
-
}], ctorParameters: function () {
|
961
|
-
return [{ type: ContextService }, { type: QuoteDraftService }, { type: FlowInfoService }, { type: FlowConfigurationService }, { type: i1.ConfigurationProcessorsApiService }, { type: i1.FlowStateApiService }, { type: i1.QuoteApiService }, { type: i6.ToastService }, { type: undefined, decorators: [{
|
962
|
-
type: Optional
|
963
|
-
}, {
|
964
|
-
type: Inject,
|
965
|
-
args: [FLOW_CUSTOMIZATION]
|
966
|
-
}] }];
|
967
|
-
} });
|
968
|
-
|
969
|
-
const findLineItem = (id, lineItems) => {
|
970
|
-
return findLineItemWithComparator(lineItems, (li) => li.id === id);
|
971
|
-
};
|
972
|
-
const findLineItemWithComparator = (lineItems, comparator) => {
|
973
|
-
let currentLevel = lineItems;
|
974
|
-
while (currentLevel.length) {
|
975
|
-
const found = currentLevel.find(comparator);
|
976
|
-
if (found) {
|
977
|
-
return found;
|
978
|
-
}
|
979
|
-
currentLevel = flatten(currentLevel.map(parent => parent.lineItems));
|
980
|
-
}
|
981
|
-
return;
|
982
|
-
};
|
983
|
-
const insertLineItem = (lineItem, parentId, toInsert) => {
|
984
|
-
const insertData = lineItem.id === parentId ? [toInsert] : [];
|
985
|
-
return Object.assign(Object.assign({}, lineItem), { lineItems: [
|
986
|
-
...insertData,
|
987
|
-
...lineItem.lineItems.map(li => {
|
988
|
-
return insertLineItem(li, parentId, toInsert);
|
989
|
-
}),
|
990
|
-
] });
|
991
|
-
};
|
992
|
-
const removeLineItem = (lineItem, idToRemove) => {
|
993
|
-
return Object.assign(Object.assign({}, lineItem), { lineItems: lineItem.lineItems
|
994
|
-
.map(li => {
|
995
|
-
if (li.id === idToRemove) {
|
996
|
-
return;
|
997
|
-
}
|
998
|
-
else if (li.lineItems.length) {
|
999
|
-
return removeLineItem(li, idToRemove);
|
1000
|
-
}
|
1001
|
-
return li;
|
1002
|
-
})
|
1003
|
-
.filter(r => !!r) });
|
1004
|
-
};
|
1005
|
-
const replaceLineItem = (lineItem, replaceTo, skipCardinalityCalculation = false) => {
|
1006
|
-
if (lineItem.id === replaceTo.id) {
|
1007
|
-
if (!skipCardinalityCalculation) {
|
1008
|
-
return Object.assign({}, recalculateCardinalityVariables(lineItem, replaceTo));
|
1009
|
-
}
|
1010
|
-
else {
|
1011
|
-
return Object.assign({}, replaceTo);
|
1012
|
-
}
|
1013
|
-
}
|
1014
|
-
return Object.assign(Object.assign({}, lineItem), { lineItems: lineItem.lineItems.map(li => replaceLineItem(li, replaceTo, skipCardinalityCalculation)) });
|
1015
|
-
};
|
1016
|
-
const collectCardinalityComputations = (portDomains) => {
|
1017
|
-
const cardinalityComputations = new Map();
|
1018
|
-
entries(portDomains).forEach(([key, portDomain]) => {
|
1019
|
-
cardinalityComputations.set(key, portDomain.properties['cardinalityComputation'] === 'true');
|
1020
|
-
});
|
1021
|
-
return cardinalityComputations;
|
1022
|
-
};
|
1023
|
-
const calculateCardinalityVariables = (lineItems, cardinalityComputations) => {
|
1024
|
-
const cardVars = new Map();
|
1025
|
-
lineItems
|
1026
|
-
.filter(({ port, type }) => !!port && !!type)
|
1027
|
-
.forEach(li => {
|
1028
|
-
var _a;
|
1029
|
-
if (cardinalityComputations.get(`${li.port}`)) {
|
1030
|
-
const cardinalityVariableName = `#CV-${li.type}@${li.port}`;
|
1031
|
-
cardVars.set(cardinalityVariableName, ((_a = cardVars.get(cardinalityVariableName)) !== null && _a !== void 0 ? _a : 0) + li.qty);
|
1032
|
-
}
|
1033
|
-
});
|
1034
|
-
return cardVars;
|
1035
|
-
};
|
1036
|
-
const cardinalityRegexp = new RegExp('#CV-[a-zA-Z0-9_]+@(?<portName>[a-zA-Z0-9_]+)');
|
1037
|
-
const recalculateCardinalityVariables = (original, updated) => {
|
1038
|
-
var _a, _b;
|
1039
|
-
const cardinalityComputations = collectCardinalityComputations((_b = (_a = updated.portDomains) !== null && _a !== void 0 ? _a : original.portDomains) !== null && _b !== void 0 ? _b : {});
|
1040
|
-
const cardinalityVariables = calculateCardinalityVariables(updated.lineItems, cardinalityComputations);
|
1041
|
-
const originalCardinalityVariables = calculateCardinalityVariables(original.lineItems, cardinalityComputations);
|
1042
|
-
originalCardinalityVariables.forEach((value, key) => {
|
1043
|
-
var _a;
|
1044
|
-
const execArray = cardinalityRegexp.exec(key);
|
1045
|
-
const portName = (_a = execArray === null || execArray === void 0 ? void 0 : execArray.groups) === null || _a === void 0 ? void 0 : _a['portName'];
|
1046
|
-
if (!portName || cardinalityComputations.get(portName)) {
|
1047
|
-
if (cardinalityVariables.get(key) === value) {
|
1048
|
-
// no need to update cardinality if no changes
|
1049
|
-
cardinalityVariables.delete(key);
|
1050
|
-
}
|
1051
|
-
else if (!cardinalityVariables.has(key)) {
|
1052
|
-
// remove last item from port
|
1053
|
-
cardinalityVariables.set(key, 0);
|
1054
|
-
}
|
1055
|
-
}
|
1056
|
-
});
|
1057
|
-
return Object.assign(Object.assign({}, updated), { attributes: upsertAttributes(updated.attributes, [...cardinalityVariables].map(([name, value]) => ({ name, value, cfgStatus: 'Changed' }))) });
|
1058
|
-
};
|
1059
|
-
const mapAttributes = (attributes) => {
|
1060
|
-
return attributes.reduce((acc, { name, value }) => (Object.assign(Object.assign({}, acc), { [name]: value })), {});
|
1061
|
-
};
|
1062
|
-
const getAttributes = (attributes, names = []) => {
|
1063
|
-
const filtered = attributes.filter(({ name }) => names.includes(name));
|
1064
|
-
return sortBy(filtered, [({ name }) => names.indexOf(name)]);
|
1065
|
-
};
|
1066
|
-
const upsertAttributes = (originalAttributes, attributesToUpsert) => {
|
1067
|
-
return attributesToUpsert.reduce((acc, { name, value }) => {
|
1068
|
-
const [origAttr] = getAttributes(acc, [name]);
|
1069
|
-
return [
|
1070
|
-
...acc.filter(attr => attr.name !== name),
|
1071
|
-
Object.assign(Object.assign({}, (origAttr !== null && origAttr !== void 0 ? origAttr : { name, type: '' })), { cfgStatus: origAttr ? 'Changed' : 'User', value }),
|
1072
|
-
];
|
1073
|
-
}, originalAttributes);
|
1074
|
-
};
|
1075
|
-
const patchAttributes = (rootLineItem, id, attrs, skipCardinalityCalculation = false) => {
|
1076
|
-
const lineItem = findLineItem(id, [rootLineItem]);
|
1077
|
-
if (!lineItem) {
|
1078
|
-
return rootLineItem;
|
1079
|
-
}
|
1080
|
-
const attributes = upsertAttributes(lineItem.attributes, attrs);
|
1081
|
-
return replaceLineItem(rootLineItem, Object.assign(Object.assign({}, lineItem), { attributes }), skipCardinalityCalculation);
|
1082
|
-
};
|
1083
|
-
const getAttributeValue = (attributes, name) => { var _a; return (_a = attributes.find(attr => attr.name === name)) === null || _a === void 0 ? void 0 : _a.value; };
|
1084
|
-
const generateLineItem = (port, type, parentId, attributes = [], lineItems = []) => {
|
1085
|
-
return {
|
1086
|
-
id: UUID.UUID(),
|
1087
|
-
port,
|
1088
|
-
type,
|
1089
|
-
actionCode: 'ADD',
|
1090
|
-
cfgStatus: 'New',
|
1091
|
-
attributes: attributes.map(({ name, value }) => ({ cfgStatus: 'User', name, value })),
|
1092
|
-
lineItems,
|
1093
|
-
parentId,
|
1094
|
-
qty: 1,
|
1095
|
-
};
|
1096
|
-
};
|
1097
|
-
const getRecommendedPrices = (portDomain, type) => {
|
1098
|
-
var _a, _b;
|
1099
|
-
const domainType = portDomain.domainTypes.find(({ name }) => name === type);
|
1100
|
-
const [net, list] = (_b = (_a = domainType === null || domainType === void 0 ? void 0 : domainType.recommendedPrices) === null || _a === void 0 ? void 0 : _a.filter(({ chargeMethod }) => chargeMethod === 'ONE_TIME').reduce((acc, rp) => {
|
1101
|
-
const [netPrice, listPrice] = acc;
|
1102
|
-
return [netPrice + rp.netPrice, listPrice + rp.listPrice];
|
1103
|
-
}, [0, 0])) !== null && _b !== void 0 ? _b : [0, 0];
|
1104
|
-
return { net, list };
|
1105
|
-
};
|
1106
|
-
const getOriginParent = (lineItems, currentLineItem) => {
|
1107
|
-
let target = currentLineItem;
|
1108
|
-
while (target && target.rampInstanceId) {
|
1109
|
-
target = lineItems.find(sub => sub.id === currentLineItem.rampInstanceId);
|
1110
|
-
}
|
1111
|
-
return target;
|
1112
|
-
};
|
1113
|
-
const assetPredicateFn = (lineItem, assetId) => {
|
1114
|
-
if (!assetId) {
|
1115
|
-
return false;
|
1116
|
-
}
|
1117
|
-
return lineItem.assetId === assetId || lineItem.openOrderLineItemId === assetId;
|
1118
|
-
};
|
1119
|
-
const multiplyLineItems = (lineItem, qty, split) => {
|
1120
|
-
if (split) {
|
1121
|
-
const unifyIds = (lineItem) => (Object.assign(Object.assign({}, lineItem), { id: UUID.UUID(), lineItems: lineItem.lineItems.map(unifyIds) }));
|
1122
|
-
return map$2(new Array(qty), () => unifyIds(lineItem));
|
1123
|
-
}
|
1124
|
-
else {
|
1125
|
-
return [
|
1126
|
-
Object.assign(Object.assign({}, lineItem), { qty: qty }),
|
1127
|
-
];
|
1128
|
-
}
|
1129
|
-
};
|
1130
|
-
const isTechnicalAttribute = (name) => {
|
1131
|
-
return name.startsWith('#') || name.startsWith('$');
|
1132
|
-
};
|
1133
|
-
const filterOutTechnicalAttributes = (attributes) => {
|
1134
|
-
return attributes.filter(({ name }) => !isTechnicalAttribute(name));
|
1135
|
-
};
|
1136
|
-
|
1137
|
-
var lineItem_utils = /*#__PURE__*/Object.freeze({
|
1138
|
-
__proto__: null,
|
1139
|
-
assetPredicateFn: assetPredicateFn,
|
1140
|
-
filterOutTechnicalAttributes: filterOutTechnicalAttributes,
|
1141
|
-
findLineItem: findLineItem,
|
1142
|
-
findLineItemWithComparator: findLineItemWithComparator,
|
1143
|
-
generateLineItem: generateLineItem,
|
1144
|
-
getAttributeValue: getAttributeValue,
|
1145
|
-
getAttributes: getAttributes,
|
1146
|
-
getOriginParent: getOriginParent,
|
1147
|
-
getRecommendedPrices: getRecommendedPrices,
|
1148
|
-
insertLineItem: insertLineItem,
|
1149
|
-
isTechnicalAttribute: isTechnicalAttribute,
|
1150
|
-
mapAttributes: mapAttributes,
|
1151
|
-
multiplyLineItems: multiplyLineItems,
|
1152
|
-
patchAttributes: patchAttributes,
|
1153
|
-
recalculateCardinalityVariables: recalculateCardinalityVariables,
|
1154
|
-
removeLineItem: removeLineItem,
|
1155
|
-
replaceLineItem: replaceLineItem,
|
1156
|
-
upsertAttributes: upsertAttributes
|
1157
|
-
});
|
1158
|
-
|
1159
|
-
class LineItemWorker {
|
1160
|
-
constructor(src) {
|
1161
|
-
this.li = Object.assign({}, src);
|
1162
|
-
}
|
1163
|
-
insert(parentId, toInsert) {
|
1164
|
-
return new LineItemWorker(insertLineItem(this.li, parentId, toInsert));
|
1165
|
-
}
|
1166
|
-
remove(id) {
|
1167
|
-
return new LineItemWorker(removeLineItem(this.li, id));
|
1168
|
-
}
|
1169
|
-
replace(toReplace, skipCardinalityCalculation = false) {
|
1170
|
-
return new LineItemWorker(replaceLineItem(this.li, toReplace, skipCardinalityCalculation));
|
1171
|
-
}
|
1172
|
-
patchAttribute(attrs, id, skipCardinalityCalculation = false) {
|
1173
|
-
return new LineItemWorker(patchAttributes(this.li, id !== null && id !== void 0 ? id : this.li.id, attrs, skipCardinalityCalculation));
|
1174
|
-
}
|
1175
|
-
}
|
1176
|
-
|
1177
|
-
function extractMetadata(uiDefinition) {
|
1178
|
-
return omit(uiDefinition, [
|
1179
|
-
'children',
|
1180
|
-
'pages',
|
1181
|
-
'components',
|
1182
|
-
]);
|
1183
|
-
}
|
1184
|
-
|
1185
|
-
class FlowUpdateService {
|
1186
|
-
update(rootLineItems, updates, charges) {
|
1187
|
-
let remainingUpdates = [...updates];
|
1188
|
-
let currentLevel = rootLineItems;
|
1189
|
-
while (currentLevel.length && remainingUpdates.length) {
|
1190
|
-
currentLevel.forEach(li => {
|
1191
|
-
const unhandledUpdates = [];
|
1192
|
-
remainingUpdates.forEach(update => {
|
1193
|
-
let updated = false;
|
1194
|
-
switch (update.dataType) {
|
1195
|
-
case 'LINEITEM':
|
1196
|
-
updated = this.applyLineItemUpdate(li, update, charges);
|
1197
|
-
break;
|
1198
|
-
case 'CHARGE':
|
1199
|
-
updated = this.applyChargeUpdate(li, update);
|
1200
|
-
break;
|
1201
|
-
case 'GROUP_CHARGE':
|
1202
|
-
updated = this.applyChargeGroupUpdate(li, update);
|
1203
|
-
break;
|
1204
|
-
default:
|
1205
|
-
// Unknown dataType. Do not try to handle it anymore
|
1206
|
-
updated = true;
|
1207
|
-
}
|
1208
|
-
if (!updated) {
|
1209
|
-
unhandledUpdates.push(update);
|
1210
|
-
}
|
1211
|
-
});
|
1212
|
-
remainingUpdates = unhandledUpdates;
|
1213
|
-
});
|
1214
|
-
currentLevel = flatten(currentLevel.map(parent => parent.lineItems));
|
1215
|
-
}
|
1216
|
-
}
|
1217
|
-
delete(lineItems, id) {
|
1218
|
-
const idsToRemove = [id];
|
1219
|
-
const topLevelLineItem = lineItems.find(li => li.id === id);
|
1220
|
-
if (topLevelLineItem) {
|
1221
|
-
// find term-related line items (which are only top level)
|
1222
|
-
// expired term line items won't be deleted
|
1223
|
-
let foundTermLineItem = topLevelLineItem;
|
1224
|
-
while (foundTermLineItem) {
|
1225
|
-
foundTermLineItem = lineItems.find(li => foundTermLineItem && li.rampInstanceId === foundTermLineItem.id);
|
1226
|
-
if (foundTermLineItem) {
|
1227
|
-
idsToRemove.push(foundTermLineItem.id);
|
1228
|
-
}
|
1229
|
-
}
|
1230
|
-
}
|
1231
|
-
const filtered = lineItems.filter(lineItem => !idsToRemove.includes(lineItem.id));
|
1232
|
-
return filtered.map(lineItem => new LineItemWorker(lineItem).remove(id).li);
|
1233
|
-
}
|
1234
|
-
applyLineItemUpdate(lineItem, update, charges) {
|
1235
|
-
if (lineItem.id !== update.id) {
|
1236
|
-
return false;
|
1237
|
-
}
|
1238
|
-
switch (update.attributeType) {
|
1239
|
-
case 'QTY':
|
1240
|
-
lineItem.qty = update.newValue;
|
1241
|
-
break;
|
1242
|
-
case 'EFFECTIVE_START_DATE':
|
1243
|
-
lineItem.properties['StartDate'] = moment(update.newValue).format('YYYY-MM-DD');
|
1244
|
-
break;
|
1245
|
-
case 'END_DATE':
|
1246
|
-
lineItem.properties['EndDate'] = moment(update.newValue).format('YYYY-MM-DD');
|
1247
|
-
break;
|
1248
|
-
case 'PRICE_ADJUSTMENT':
|
1249
|
-
{
|
1250
|
-
const charge = lineItem.chargeItems.find(charge => { var _a; return (_a = (charges || {})[charge.chargeId]) === null || _a === void 0 ? void 0 : _a.main; });
|
1251
|
-
if (charge) {
|
1252
|
-
charge.priceAdjustment = update.newValue;
|
1253
|
-
}
|
1254
|
-
}
|
1255
|
-
break;
|
1256
|
-
case 'LIST_PRICE_ADJUSTMENT':
|
1257
|
-
case 'MARGIN_ADJUSTMENT':
|
1258
|
-
{
|
1259
|
-
const charge = lineItem.chargeItems.find(charge => { var _a; return (_a = (charges || {})[charge.chargeId]) === null || _a === void 0 ? void 0 : _a.main; });
|
1260
|
-
if (charge) {
|
1261
|
-
charge.listPriceAdjustment = update.newValue;
|
1262
|
-
}
|
1263
|
-
}
|
1264
|
-
break;
|
1265
|
-
case 'COST_ADJUSTMENT':
|
1266
|
-
{
|
1267
|
-
const charge = lineItem.chargeItems.find(charge => { var _a; return (_a = (charges || {})[charge.chargeId]) === null || _a === void 0 ? void 0 : _a.main; });
|
1268
|
-
if (charge) {
|
1269
|
-
charge.costAdjustment = update.newValue;
|
1270
|
-
}
|
1271
|
-
}
|
1272
|
-
break;
|
1273
|
-
default:
|
1274
|
-
throw new Error(`Not suppored AttributeType for LineItem update: ${update.attributeType}`);
|
1275
|
-
}
|
1276
|
-
return true;
|
1277
|
-
}
|
1278
|
-
applyChargeUpdate(lineItem, update) {
|
1279
|
-
const foundCharge = lineItem.chargeItems.find(({ id }) => id === update.id);
|
1280
|
-
if (!foundCharge) {
|
1281
|
-
return false;
|
1282
|
-
}
|
1283
|
-
if (update.attributeType === 'PRICE_ADJUSTMENT') {
|
1284
|
-
foundCharge.priceAdjustment = update.newValue;
|
1285
|
-
}
|
1286
|
-
else if (update.attributeType === 'LIST_PRICE_ADJUSTMENT') {
|
1287
|
-
foundCharge.listPriceAdjustment = update.newValue;
|
1288
|
-
}
|
1289
|
-
else {
|
1290
|
-
throw new Error(`Not suppored AttributeType for Charge Item update: ${update.attributeType}`);
|
1291
|
-
}
|
1292
|
-
return true;
|
1293
|
-
}
|
1294
|
-
applyChargeGroupUpdate(lineItem, update) {
|
1295
|
-
const foundChargeGroup = ChargeGroupUtils.findChargeGroupById(update.id, lineItem);
|
1296
|
-
if (!foundChargeGroup) {
|
1297
|
-
return false;
|
1298
|
-
}
|
1299
|
-
if (update.attributeType === 'PRICE_ADJUSTMENT') {
|
1300
|
-
foundChargeGroup.priceAdjustment = update.newValue;
|
1301
|
-
}
|
1302
|
-
else if (update.attributeType === 'LIST_PRICE_ADJUSTMENT') {
|
1303
|
-
foundChargeGroup.listPriceAdjustment = update.newValue;
|
1304
|
-
}
|
1305
|
-
else {
|
1306
|
-
throw new Error(`Not suppored AttributeType for Charge Group Item update: ${update.attributeType}`);
|
1307
|
-
}
|
1308
|
-
return true;
|
1309
|
-
}
|
1310
|
-
}
|
1311
|
-
FlowUpdateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowUpdateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
1312
|
-
FlowUpdateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowUpdateService });
|
1313
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowUpdateService, decorators: [{
|
1314
|
-
type: Injectable
|
1315
|
-
}] });
|
1316
|
-
|
1317
|
-
class RuntimeSettingsService {
|
1318
|
-
constructor(configurationSettingsApiService) {
|
1319
|
-
this.configurationSettingsApiService = configurationSettingsApiService;
|
1320
|
-
this.configurationSettings$ = new BehaviorSubject({});
|
1321
|
-
this.currencySettings$ = new BehaviorSubject({
|
1322
|
-
iso: DEFAULT_CURRENCY_ISO_CODE,
|
1323
|
-
symbol: DEFAULT_CURRENCY_SYMBOL,
|
1324
|
-
});
|
1325
|
-
this.shoppingCartSettings$ = new BehaviorSubject([]);
|
1326
|
-
this.getCurrencySymbol = (locale, currency) => {
|
1327
|
-
return (0)
|
1328
|
-
.toLocaleString(locale, { style: 'currency', currency, minimumFractionDigits: 0, maximumFractionDigits: 0 })
|
1329
|
-
.replace(/\d/g, '')
|
1330
|
-
.trim();
|
1331
|
-
};
|
1332
|
-
}
|
1333
|
-
create() {
|
1334
|
-
return this.configurationSettingsApiService.fetchSettings().pipe(map$1(settings => this.parseConfigurationSettings(settings)), tap$1(configurationSettings => {
|
1335
|
-
var _a;
|
1336
|
-
this.configurationSettings$.next(configurationSettings);
|
1337
|
-
this.addShoppingCartSettings((_a = configurationSettings['shopping-cart']) !== null && _a !== void 0 ? _a : []);
|
1338
|
-
this.formattingSettings = this.getFormattingSettings();
|
1339
|
-
}), map$1(() => undefined));
|
1340
|
-
}
|
1341
|
-
initCurrency(iso) {
|
1342
|
-
if (iso) {
|
1343
|
-
const symbol = this.getCurrencySymbol('en-US', iso);
|
1344
|
-
this.currencySettings$.next({ iso, symbol });
|
1345
|
-
if (this.formattingSettings) {
|
1346
|
-
this.formattingSettings.currencySymbol = symbol;
|
1347
|
-
}
|
1348
|
-
}
|
1349
|
-
}
|
1350
|
-
getFormattingSettings() {
|
1351
|
-
var _a, _b;
|
1352
|
-
if (this.formattingSettings) {
|
1353
|
-
return this.formattingSettings;
|
1354
|
-
}
|
1355
|
-
const shoppingCartSettings = (_a = this.getConfigurationSettings()['shopping-cart']) === null || _a === void 0 ? void 0 : _a.reduce((acc, setting) => {
|
1356
|
-
return Object.assign(Object.assign({}, acc), { [setting.id]: setting.properties });
|
1357
|
-
}, {});
|
1358
|
-
const currencySettings = this.getCurrencySettings();
|
1359
|
-
const dateFormat = (validateDateFormat((_b = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.DATE_FORMAT) !== null && _b !== void 0 ? _b : '') && (shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.DATE_FORMAT)) ||
|
1360
|
-
DEFAULT_DATE_FORMAT;
|
1361
|
-
const decimalSeparator = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.DECIMAL_SEPARATOR;
|
1362
|
-
const thousandsSeparator = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.THOUSANDS_SEPARATOR;
|
1363
|
-
// the number of decimal places can be 0
|
1364
|
-
const priceScale = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.PRICE_SCALE;
|
1365
|
-
const decimalsCount = priceScale !== null && priceScale !== '' && !isNaN(Number(priceScale)) && Number(priceScale) >= 0
|
1366
|
-
? Number(priceScale)
|
1367
|
-
: DEFAULT_DECIMALS_COUNT;
|
1368
|
-
const actionCodeSettings = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.STATUS_LABEL;
|
1369
|
-
return {
|
1370
|
-
currencySymbol: currencySettings.symbol,
|
1371
|
-
dateFormats: getSupportedDateFormats(dateFormat),
|
1372
|
-
decimalsCount,
|
1373
|
-
decimalSeparator: decimalSeparator !== undefined && ['.', ','].includes(decimalSeparator)
|
1374
|
-
? decimalSeparator
|
1375
|
-
: DEFAULT_DECIMAL_SEPARATOR,
|
1376
|
-
// thousands separator can be a blank value, so it can also be null
|
1377
|
-
thousandsSeparator: thousandsSeparator !== undefined && ['.', ',', '', null].includes(thousandsSeparator)
|
1378
|
-
? thousandsSeparator || ''
|
1379
|
-
: DEFAULT_THOUSANDS_SEPARATOR,
|
1380
|
-
actionCodeLabels: (actionCodeSettings === null || actionCodeSettings === void 0 ? void 0 : actionCodeSettings.length)
|
1381
|
-
? actionCodeSettings.reduce((result, setting) => (Object.assign(Object.assign({}, result), { [setting.status_label]: setting.custom_label })), {})
|
1382
|
-
: DEFAULT_ACTION_CODE_LABELS,
|
1383
|
-
};
|
1384
|
-
}
|
1385
|
-
getConfigurationSettings() {
|
1386
|
-
return this.configurationSettings$.value;
|
1387
|
-
}
|
1388
|
-
getShoppingCartSettings() {
|
1389
|
-
return this.shoppingCartSettings$.value;
|
1390
|
-
}
|
1391
|
-
getCurrencySettings() {
|
1392
|
-
return this.currencySettings$.value;
|
1393
|
-
}
|
1394
|
-
parseConfigurationSettings(settings) {
|
1395
|
-
return settings.reduce((acc, setting) => {
|
1396
|
-
switch (setting.key) {
|
1397
|
-
case 'shopping-cart':
|
1398
|
-
acc['shopping-cart'] = parseJsonSafely(setting.value, []);
|
1399
|
-
break;
|
1400
|
-
case 'navigation':
|
1401
|
-
acc.navigation = parseJsonSafely(setting.value, {});
|
1402
|
-
break;
|
1403
|
-
case 'flows':
|
1404
|
-
acc.flows = parseJsonSafely(setting.value, []);
|
1405
|
-
break;
|
1406
|
-
default:
|
1407
|
-
acc[setting.key] = setting.value;
|
1408
|
-
}
|
1409
|
-
return acc;
|
1410
|
-
}, {});
|
1411
|
-
}
|
1412
|
-
addShoppingCartSettings(settings) {
|
1413
|
-
// uniqBy removes items with the biggest index
|
1414
|
-
const newSettings = uniqBy([...settings, ...this.shoppingCartSettings$.value], 'id');
|
1415
|
-
this.shoppingCartSettings$.next(newSettings);
|
1416
|
-
}
|
1417
|
-
}
|
1418
|
-
RuntimeSettingsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService, deps: [{ token: i1.ConfigurationSettingsApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
1419
|
-
RuntimeSettingsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService });
|
1420
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService, decorators: [{
|
1421
|
-
type: Injectable
|
1422
|
-
}], ctorParameters: function () { return [{ type: i1.ConfigurationSettingsApiService }]; } });
|
1423
|
-
|
1424
|
-
class ConfigurationService {
|
1425
|
-
constructor(quoteDraftService, runtimeService, contextService, configurationApiService, messageService, dialogService, runtimeSettings) {
|
1426
|
-
this.quoteDraftService = quoteDraftService;
|
1427
|
-
this.runtimeService = runtimeService;
|
1428
|
-
this.contextService = contextService;
|
1429
|
-
this.configurationApiService = configurationApiService;
|
1430
|
-
this.messageService = messageService;
|
1431
|
-
this.dialogService = dialogService;
|
1432
|
-
this.runtimeSettings = runtimeSettings;
|
1433
|
-
this.mode = ConfigurationMode.SEARCH;
|
1434
|
-
this.configurationState = new BehaviorSubject(null);
|
1435
|
-
this.previousConfigurationState = new BehaviorSubject(null);
|
1436
|
-
this.isLoadingSubj$ = new BehaviorSubject(false);
|
1437
|
-
this.isLoading$ = this.isLoadingSubj$.asObservable();
|
1438
|
-
this.hasUnsavedChanges = false;
|
1439
|
-
}
|
1440
|
-
reset() {
|
1441
|
-
this.hasUnsavedChanges = false;
|
1442
|
-
this.runtimeService.reset();
|
1443
|
-
this.configurableRamp = undefined;
|
1444
|
-
this.configurationState.next(null);
|
1445
|
-
this.previousConfigurationState.next(null);
|
1446
|
-
}
|
1447
|
-
patch$(lineItem, options) {
|
1448
|
-
const source = this.getSnapshot();
|
1449
|
-
if (!source) {
|
1450
|
-
return throwError(() => new Error(`Source LineItem not found`));
|
1451
|
-
}
|
1452
|
-
const skipCardinalityCalculation = (options === null || options === void 0 ? void 0 : options.skipCardinalityCalculation) || this.contextSnapshot.properties['#skipCardinalityCalculation'] === 'true';
|
1453
|
-
this.configurableRamp = new LineItemWorker(source).replace(lineItem, skipCardinalityCalculation).li;
|
1454
|
-
return this.configure().pipe(catchError$1(error => {
|
1455
|
-
console.error(error);
|
1456
|
-
if (!this.runtimeService.uiDefinitionProperties.suppressToastMessages) {
|
1457
|
-
this.messageService.add({ severity: 'error', summary: error });
|
1458
|
-
}
|
1459
|
-
// bounce back if configuration call has failed
|
1460
|
-
const prevState = this.configurationState.value;
|
1461
|
-
this.configurationState.next(prevState ? Object.assign({}, prevState) : null);
|
1462
|
-
return throwError(() => error);
|
1463
|
-
}), tap(() => {
|
1464
|
-
if (!this.hasUnsavedChanges) {
|
1465
|
-
this.hasUnsavedChanges = true;
|
1466
|
-
}
|
1467
|
-
}));
|
1468
|
-
}
|
1469
|
-
patch(lineItem, options) {
|
1470
|
-
this.patch$(lineItem, options).subscribe();
|
1471
|
-
}
|
1472
|
-
setConfigurableRamp(lineItem) {
|
1473
|
-
this.configurableRamp = lineItem;
|
1474
|
-
}
|
1475
|
-
get() {
|
1476
|
-
return this.configurationState.pipe(map(state => state === null || state === void 0 ? void 0 : state.lineItem), shareReplay$1());
|
1477
|
-
}
|
1478
|
-
getSnapshot() {
|
1479
|
-
var _a, _b;
|
1480
|
-
return ((_a = this.configurationState.value) === null || _a === void 0 ? void 0 : _a.lineItem) ? Object.assign({}, (_b = this.configurationState.value) === null || _b === void 0 ? void 0 : _b.lineItem) : undefined;
|
1481
|
-
}
|
1482
|
-
getRuntimeModel() {
|
1483
|
-
const runtimeModel = this.runtimeService.runtimeModel;
|
1484
|
-
if (!runtimeModel) {
|
1485
|
-
throw new Error('Runtime model not initialized');
|
1486
|
-
}
|
1487
|
-
return runtimeModel;
|
1488
|
-
}
|
1489
|
-
getRuntimeContext() {
|
1490
|
-
const runtimeContext = this.runtimeService.runtimeContext;
|
1491
|
-
if (!runtimeContext) {
|
1492
|
-
throw new Error('Runtime context not initialized');
|
1493
|
-
}
|
1494
|
-
return runtimeContext;
|
1495
|
-
}
|
1496
|
-
get state$() {
|
1497
|
-
return this.configurationState.asObservable();
|
1498
|
-
}
|
1499
|
-
get stateSnapshot() {
|
1500
|
-
return this.configurationState.value;
|
1501
|
-
}
|
1502
|
-
get previousStateSnapshot() {
|
1503
|
-
return this.previousConfigurationState.value;
|
1504
|
-
}
|
1505
|
-
get contextSnapshot() {
|
1506
|
-
return this.contextService.resolve();
|
1507
|
-
}
|
1508
|
-
get context$() {
|
1509
|
-
return this.contextService.resolve$();
|
1510
|
-
}
|
1511
|
-
get charges$() {
|
1512
|
-
return this.configurationState.pipe(map(state => { var _a; return (_a = state === null || state === void 0 ? void 0 : state.charges) !== null && _a !== void 0 ? _a : {}; }));
|
1513
|
-
}
|
1514
|
-
get chargesSnapshot() {
|
1515
|
-
var _a, _b;
|
1516
|
-
return (_b = (_a = this.configurationState.value) === null || _a === void 0 ? void 0 : _a.charges) !== null && _b !== void 0 ? _b : {};
|
1517
|
-
}
|
1518
|
-
get pricePlans$() {
|
1519
|
-
return this.configurationState.pipe(map(state => { var _a; return (_a = state === null || state === void 0 ? void 0 : state.pricePlans) !== null && _a !== void 0 ? _a : {}; }));
|
1520
|
-
}
|
1521
|
-
get pricePlansSnapshot() {
|
1522
|
-
var _a, _b;
|
1523
|
-
return (_b = (_a = this.configurationState.value) === null || _a === void 0 ? void 0 : _a.pricePlans) !== null && _b !== void 0 ? _b : {};
|
1524
|
-
}
|
1525
|
-
get procedureContext$() {
|
1526
|
-
return this.configurationState.pipe(map(state => { var _a; return (_a = state === null || state === void 0 ? void 0 : state.procedureContext) !== null && _a !== void 0 ? _a : {}; }));
|
1527
|
-
}
|
1528
|
-
get procedureContextSnapshot() {
|
1529
|
-
var _a, _b;
|
1530
|
-
return (_b = (_a = this.configurationState.value) === null || _a === void 0 ? void 0 : _a.procedureContext) !== null && _b !== void 0 ? _b : {};
|
1531
|
-
}
|
1532
|
-
configure() {
|
1533
|
-
return this.configureRequest$(this.generateRequest());
|
1534
|
-
}
|
1535
|
-
configureRequest$(configurationRequest) {
|
1536
|
-
var _a;
|
1537
|
-
const runtimeContext = this.getRuntimeContext();
|
1538
|
-
const runtimeModel = this.getRuntimeModel();
|
1539
|
-
const uiDefinitionProperties = this.getUIDefinitionProperties();
|
1540
|
-
const mainPricingEnabled = (_a = runtimeContext.properties) === null || _a === void 0 ? void 0 : _a.PricingEnabled;
|
1541
|
-
const pricingEnabled = mainPricingEnabled ? mainPricingEnabled === 'true' : uiDefinitionProperties.pricingEnabled;
|
1542
|
-
const customPriceApi = this.runtimeSettings.getConfigurationSettings()['CUSTOM_PRICE_API'];
|
1543
|
-
this.isLoadingSubj$.next(true);
|
1544
|
-
const configure$ = pricingEnabled && customPriceApi
|
1545
|
-
? this.configurationApiService.customConfigurePrice({ url: customPriceApi, configurationRequest, runtimeModel })
|
1546
|
-
: this.configurationApiService.configureLineItem({
|
1547
|
-
configurationRequest,
|
1548
|
-
runtimeModel,
|
1549
|
-
pricingEnabled,
|
1550
|
-
});
|
1551
|
-
return configure$.pipe(tap(result => {
|
1552
|
-
var _a;
|
1553
|
-
this.contextService.update(result.context);
|
1554
|
-
this.configurationState.next(result);
|
1555
|
-
this.previousConfigurationState.next(cloneDeep(result));
|
1556
|
-
if ((_a = result.deletedLineItems) === null || _a === void 0 ? void 0 : _a.length) {
|
1557
|
-
this.showInactiveProductsConfirmation();
|
1558
|
-
}
|
1559
|
-
this.configurableRamp = result.lineItem;
|
1560
|
-
}), map(({ lineItem }) => lineItem), catchError$1(error => throwError(() => {
|
1561
|
-
const resetState = this.previousConfigurationState.value;
|
1562
|
-
if (resetState) {
|
1563
|
-
this.previousConfigurationState.next(cloneDeep(resetState));
|
1564
|
-
this.configurationState.next(resetState);
|
1565
|
-
}
|
1566
|
-
if (error.error) {
|
1567
|
-
return extractErrorDetails(error.error).join('. ');
|
1568
|
-
}
|
1569
|
-
return error.message || JSON.stringify(error);
|
1570
|
-
})), finalize$1(() => this.isLoadingSubj$.next(false)));
|
1571
|
-
}
|
1572
|
-
configureExternal$(props) {
|
1573
|
-
return this.runtimeService
|
1574
|
-
.init({ productId: props.productId, defaultQty: props.qty, attributesMap: props.attributesMap })
|
1575
|
-
.pipe(switchMap$1(() => this.configure()), first(), catchError$1(error => {
|
1576
|
-
this.messageService.add({ severity: ToastType.error, summary: error });
|
1577
|
-
throw error;
|
1578
|
-
}), finalize$1(() => this.reset()));
|
1579
|
-
}
|
1580
|
-
configureGuidedSelling$(data) {
|
1581
|
-
return this.configurationApiService
|
1582
|
-
.configureLineItem({
|
1583
|
-
configurationRequest: getGuidedSellingConfigurationRequest(data, this.contextService.resolve()),
|
1584
|
-
})
|
1585
|
-
.pipe(catchError$1(error => {
|
1586
|
-
if (error instanceof HttpErrorResponse) {
|
1587
|
-
this.messageService.add({ severity: ToastType.error, summary: error.error.message || error.error });
|
1588
|
-
}
|
1589
|
-
throw error;
|
1590
|
-
}));
|
1591
|
-
}
|
1592
|
-
generateRequest(lightMode = true) {
|
1593
|
-
var _a, _b;
|
1594
|
-
const lineItem = this.generateLineItem();
|
1595
|
-
let request = {
|
1596
|
-
lineItem,
|
1597
|
-
mode: this.mode,
|
1598
|
-
step: !((_a = this.configurationState.value) === null || _a === void 0 ? void 0 : _a.lineItem) ? RuntimeStep.START : RuntimeStep.UPDATE,
|
1599
|
-
attributeDomainMode: 'ALL',
|
1600
|
-
context: this.contextService.resolve(),
|
1601
|
-
lineItems: ((_b = this.quoteDraftService.quoteDraft) === null || _b === void 0 ? void 0 : _b.currentState) || [],
|
1602
|
-
asset: this.getAsset(),
|
1603
|
-
};
|
1604
|
-
if (lightMode) {
|
1605
|
-
request = ConfigurationTranslatorUtils.lightenConfigurationRequest(request);
|
1606
|
-
}
|
1607
|
-
return request;
|
1608
|
-
}
|
1609
|
-
generateLineItem() {
|
1610
|
-
var _a;
|
1611
|
-
const runtimeContext = this.getRuntimeContext();
|
1612
|
-
const uiDefinitionProperties = this.getUIDefinitionProperties();
|
1613
|
-
let lineItem = this.configurableRamp;
|
1614
|
-
if (!lineItem) {
|
1615
|
-
const { initializationProps } = (_a = this.runtimeService) !== null && _a !== void 0 ? _a : {};
|
1616
|
-
lineItem = getDefaultLineItem(runtimeContext, uiDefinitionProperties, initializationProps === null || initializationProps === void 0 ? void 0 : initializationProps.defaultQty);
|
1617
|
-
// Set default attributes
|
1618
|
-
if (initializationProps === null || initializationProps === void 0 ? void 0 : initializationProps.attributesMap) {
|
1619
|
-
const attributes = transform(initializationProps === null || initializationProps === void 0 ? void 0 : initializationProps.attributesMap, (acc, value, name) => acc.push({ name, value }), []);
|
1620
|
-
lineItem = new LineItemWorker(lineItem).patchAttribute(attributes).li;
|
1621
|
-
}
|
1622
|
-
}
|
1623
|
-
return lineItem;
|
1624
|
-
}
|
1625
|
-
getAsset() {
|
1626
|
-
var _a, _b;
|
1627
|
-
const lineItem = this.configurableRamp;
|
1628
|
-
if (!lineItem) {
|
1629
|
-
return;
|
1630
|
-
}
|
1631
|
-
const assetId = (_a = lineItem.assetId) !== null && _a !== void 0 ? _a : lineItem.openOrderLineItemId;
|
1632
|
-
return (_b = this.quoteDraftService.assetsState) === null || _b === void 0 ? void 0 : _b.initialState.find(li => assetPredicateFn(li, assetId));
|
1633
|
-
}
|
1634
|
-
getUIDefinitionProperties() {
|
1635
|
-
var _a, _b, _c;
|
1636
|
-
return Object.assign(Object.assign({}, ((_b = (_a = this.getRuntimeContext().uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.source.properties) !== null && _b !== void 0 ? _b : {})), ((_c = this.runtimeService.uiDefinitionProperties) !== null && _c !== void 0 ? _c : {}));
|
1637
|
-
}
|
1638
|
-
showInactiveProductsConfirmation() {
|
1639
|
-
const confirmationConfig = {
|
1640
|
-
title: ' ',
|
1641
|
-
description: 'This quote contains inactive products. Do you want to remove them?',
|
1642
|
-
primaryButtonLabel: 'Remove products',
|
1643
|
-
secondaryButtonLabel: 'Back to Quote',
|
1644
|
-
};
|
1645
|
-
this.dialogService
|
1646
|
-
.open(ConfirmationComponent, {
|
1647
|
-
dismissableMask: false,
|
1648
|
-
closeOnEscape: false,
|
1649
|
-
closable: false,
|
1650
|
-
showHeader: true,
|
1651
|
-
header: `Inactive Products in Quote`,
|
1652
|
-
width: '440px',
|
1653
|
-
data: { confirmationConfig },
|
1654
|
-
})
|
1655
|
-
.onClose.subscribe(result => {
|
1656
|
-
if (!result) {
|
1657
|
-
const context = this.contextService.resolve();
|
1658
|
-
window['VELO_BACK_FN'].apply(null, [context.headerId]);
|
1659
|
-
}
|
1660
|
-
});
|
1661
|
-
}
|
1662
|
-
}
|
1663
|
-
ConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, deps: [{ token: QuoteDraftService }, { token: ConfigurationRuntimeService }, { token: ContextService }, { token: i1.ConfigurationApiService }, { token: i5.MessageService }, { token: i6$1.DialogService }, { token: RuntimeSettingsService }], target: i0.ɵɵFactoryTarget.Injectable });
|
1664
|
-
ConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService });
|
1665
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, decorators: [{
|
1666
|
-
type: Injectable
|
1667
|
-
}], ctorParameters: function () { return [{ type: QuoteDraftService }, { type: ConfigurationRuntimeService }, { type: ContextService }, { type: i1.ConfigurationApiService }, { type: i5.MessageService }, { type: i6$1.DialogService }, { type: RuntimeSettingsService }]; } });
|
1668
|
-
|
1669
|
-
class FlowConfigurationService {
|
1670
|
-
constructor(proceduresApiService, contextService, quoteDraftService, updateService, configurationService, flowInfoService) {
|
1671
|
-
this.proceduresApiService = proceduresApiService;
|
1672
|
-
this.contextService = contextService;
|
1673
|
-
this.quoteDraftService = quoteDraftService;
|
1674
|
-
this.updateService = updateService;
|
1675
|
-
this.configurationService = configurationService;
|
1676
|
-
this.flowInfoService = flowInfoService;
|
1677
|
-
this.updatedSubj$ = new Subject();
|
1678
|
-
this.updated$ = this.updatedSubj$.asObservable();
|
1679
|
-
}
|
1680
|
-
calculate$(quoteDraft) {
|
1681
|
-
return this.extendedApply$(quoteDraft).pipe(tap$1(result => {
|
1682
|
-
// sort the result current state based on the quote draft initial state
|
1683
|
-
const initialStateIds = quoteDraft.initialState.map(lineItem => lineItem.integrationId);
|
1684
|
-
result.currentState = result.currentState
|
1685
|
-
.slice()
|
1686
|
-
.sort((a, b) => initialStateIds.indexOf(a.integrationId) - initialStateIds.indexOf(b.integrationId));
|
1687
|
-
this.quoteDraftService.updateQuoteDraft(result);
|
1688
|
-
}), map$1(noop));
|
1689
|
-
}
|
1690
|
-
calculate(quoteDraft) {
|
1691
|
-
this.calculate$(quoteDraft).subscribe();
|
810
|
+
try {
|
811
|
+
result.selectors[key] = {
|
812
|
+
success: true,
|
813
|
+
result: this.executeSelectorScript(flowState, selector),
|
814
|
+
};
|
815
|
+
}
|
816
|
+
catch (e) {
|
817
|
+
console.error(e);
|
818
|
+
result.selectors[key] = {
|
819
|
+
success: false,
|
820
|
+
errorMessage: String(e),
|
821
|
+
};
|
822
|
+
}
|
823
|
+
return result;
|
824
|
+
}, { stateId: '', selectors: {} });
|
1692
825
|
}
|
1693
|
-
|
1694
|
-
|
1695
|
-
|
1696
|
-
|
826
|
+
initProcessors$() {
|
827
|
+
var _a;
|
828
|
+
const hasOverrides = Boolean((_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors);
|
829
|
+
if (this.flowInfoService.flow.properties.stateful && !hasOverrides) {
|
830
|
+
// Skip initialization as backend will take processors from SF
|
831
|
+
return of(undefined);
|
1697
832
|
}
|
1698
|
-
|
1699
|
-
|
1700
|
-
|
1701
|
-
|
1702
|
-
|
1703
|
-
|
1704
|
-
|
1705
|
-
|
1706
|
-
|
1707
|
-
|
1708
|
-
|
1709
|
-
|
1710
|
-
|
1711
|
-
|
1712
|
-
|
1713
|
-
|
1714
|
-
if (!
|
1715
|
-
return of(
|
833
|
+
const owners$ = Object.values(this.flowInfoService.templates)
|
834
|
+
.map(template => {
|
835
|
+
var _a, _b, _c;
|
836
|
+
if (!template) {
|
837
|
+
return;
|
838
|
+
}
|
839
|
+
const localProcessors$ = (_c = (_b = (_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors) === null || _b === void 0 ? void 0 : _b.call(_a, template.name)) !== null && _c !== void 0 ? _c : of(null);
|
840
|
+
return localProcessors$.pipe(switchMap(processors => processors ? of(processors) : this.processorsApiService.fetchConfigurationProcessors$(template.id)), tap(processors => {
|
841
|
+
const processorsMap = processors.reduce((acc, p) => {
|
842
|
+
acc[p.apiName] = p;
|
843
|
+
return acc;
|
844
|
+
}, {});
|
845
|
+
this.processors[template.id] = processorsMap;
|
846
|
+
}));
|
847
|
+
})
|
848
|
+
.filter(isDefined);
|
849
|
+
if (!owners$.length) {
|
850
|
+
return of(undefined);
|
1716
851
|
}
|
1717
|
-
|
1718
|
-
updatedState.splice(currentLineItemIndex, 1, initialLineItem);
|
1719
|
-
return of([]).pipe(tap$1(() => {
|
1720
|
-
this.quoteDraftService.setCurrentLineItemState(updatedState);
|
1721
|
-
}), switchMap(() => this.calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedState }))), map$1(() => this.quoteDraftService.quoteDraft), tap$1(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
|
852
|
+
return forkJoin(owners$).pipe(map(noop));
|
1722
853
|
}
|
1723
|
-
|
1724
|
-
|
1725
|
-
|
1726
|
-
|
1727
|
-
|
1728
|
-
|
1729
|
-
|
1730
|
-
return of(null);
|
854
|
+
executeActionScript(request, executable) {
|
855
|
+
var _a;
|
856
|
+
const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
|
857
|
+
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
858
|
+
const scope = this.getScopeByOwnerId(executable.ownerId);
|
859
|
+
const scopeText = scope ? ` in ${scope}` : '';
|
860
|
+
throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
|
1731
861
|
}
|
1732
|
-
return
|
1733
|
-
}
|
1734
|
-
delete(ids) {
|
1735
|
-
this.delete$(ids).subscribe();
|
862
|
+
return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
|
1736
863
|
}
|
1737
|
-
|
1738
|
-
|
1739
|
-
|
1740
|
-
|
864
|
+
executeSelectorScript(request, executable) {
|
865
|
+
var _a;
|
866
|
+
const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
|
867
|
+
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
868
|
+
const scope = this.getScopeByOwnerId(executable.ownerId);
|
869
|
+
const scopeText = scope ? ` in ${scope}` : '';
|
870
|
+
throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
|
1741
871
|
}
|
1742
|
-
|
1743
|
-
return of([]).pipe(switchMap(() => this.calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedState }))), map$1(() => this.quoteDraftService.quoteDraft), tap$1(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
|
872
|
+
return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
|
1744
873
|
}
|
1745
|
-
|
1746
|
-
|
1747
|
-
|
1748
|
-
|
874
|
+
executeProcessorScript(request, configurationProcessor, inputData) {
|
875
|
+
var _a;
|
876
|
+
const scope = this.getScopeByOwnerId((_a = configurationProcessor.ownerId) !== null && _a !== void 0 ? _a : '');
|
877
|
+
let functionToExecute = this.executedFunctions[scope + configurationProcessor.apiName];
|
878
|
+
if (!functionToExecute) {
|
879
|
+
const script = `${configurationProcessor.script}\nreturn transform;`;
|
880
|
+
const sourceMap = `\n//# sourceURL=${scope ? scope + '/' : ''}${configurationProcessor.apiName}.js`;
|
881
|
+
functionToExecute = new Function(script + sourceMap)();
|
882
|
+
this.executedFunctions[scope + configurationProcessor.apiName] = functionToExecute;
|
1749
883
|
}
|
1750
|
-
return
|
1751
|
-
|
1752
|
-
|
1753
|
-
|
1754
|
-
|
1755
|
-
return [...quoteDraft.currentState, ...lineItems];
|
1756
|
-
}), switchMap(updatedState => this.calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedState }))), map$1(() => this.quoteDraftService.quoteDraft), tap$1(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
|
1757
|
-
}
|
1758
|
-
get() {
|
1759
|
-
return this.quoteDraftService.quoteDraft$.pipe(map$1(() => this.quoteDraftService.currentState), shareReplay$1());
|
1760
|
-
}
|
1761
|
-
getSnapshot() {
|
1762
|
-
var _a, _b;
|
1763
|
-
return (_b = (_a = this.quoteDraftService) === null || _a === void 0 ? void 0 : _a.currentState.slice()) !== null && _b !== void 0 ? _b : [];
|
1764
|
-
}
|
1765
|
-
get charges$() {
|
1766
|
-
return this.quoteDraftService.quoteDraft$.pipe(map$1(({ charges }) => charges));
|
1767
|
-
}
|
1768
|
-
get pricePlans$() {
|
1769
|
-
return this.quoteDraftService.quoteDraft$.pipe(map$1(({ pricePlans }) => pricePlans));
|
1770
|
-
}
|
1771
|
-
get activeMetrics$() {
|
1772
|
-
return this.quoteDraftService.quoteDraft$.pipe(map$1(({ activeMetrics }) => activeMetrics));
|
1773
|
-
}
|
1774
|
-
get chargesSnapshot() {
|
1775
|
-
var _a, _b;
|
1776
|
-
return (_b = (_a = this.quoteDraftService.quoteDraft) === null || _a === void 0 ? void 0 : _a.charges) !== null && _b !== void 0 ? _b : {};
|
1777
|
-
}
|
1778
|
-
get pricePlansSnapshot() {
|
1779
|
-
var _a, _b;
|
1780
|
-
return (_b = (_a = this.quoteDraftService.quoteDraft) === null || _a === void 0 ? void 0 : _a.pricePlans) !== null && _b !== void 0 ? _b : {};
|
1781
|
-
}
|
1782
|
-
get activeMetricsSnapshot() {
|
1783
|
-
var _a, _b;
|
1784
|
-
return (_b = (_a = this.quoteDraftService.quoteDraft) === null || _a === void 0 ? void 0 : _a.activeMetrics) !== null && _b !== void 0 ? _b : [];
|
1785
|
-
}
|
1786
|
-
get contextSnapshot() {
|
1787
|
-
return this.contextService.resolve();
|
1788
|
-
}
|
1789
|
-
get context$() {
|
1790
|
-
return this.contextService.resolve$();
|
884
|
+
return functionToExecute({
|
885
|
+
request,
|
886
|
+
inputData,
|
887
|
+
flowStore: this.flowStore,
|
888
|
+
});
|
1791
889
|
}
|
1792
|
-
|
1793
|
-
|
1794
|
-
|
1795
|
-
console.error(error);
|
1796
|
-
// bounce back if configuration call has failed
|
1797
|
-
const quoteDraft = this.quoteDraftService.quoteDraft;
|
1798
|
-
if (quoteDraft) {
|
1799
|
-
this.quoteDraftService.updateQuoteDraft(quoteDraft);
|
1800
|
-
this.updatedSubj$.next();
|
1801
|
-
}
|
1802
|
-
return throwError(() => error);
|
1803
|
-
}));
|
1804
|
-
};
|
890
|
+
generateRequestId(scope, selectorName, inputData) {
|
891
|
+
const inputDataHash = UUID.hex(JSON.stringify(inputData) || '').slice(0, 8);
|
892
|
+
return `${scope}/${selectorName}/${inputDataHash}`;
|
1805
893
|
}
|
1806
|
-
|
1807
|
-
|
1808
|
-
|
1809
|
-
|
1810
|
-
|
1811
|
-
|
894
|
+
checkStatefulChanges(requestId, selectorResult) {
|
895
|
+
if (this.trackedStatefulChangesMap.has(requestId)) {
|
896
|
+
if (!this.initialStatefulData[requestId]) {
|
897
|
+
this.initialStatefulData[requestId] = selectorResult;
|
898
|
+
}
|
899
|
+
const hasChanges = !isEqual(this.initialStatefulData[requestId], selectorResult);
|
900
|
+
this.trackedStatefulChangesMap.set(requestId, hasChanges);
|
1812
901
|
}
|
1813
|
-
return this.proceduresApiService.apply$(request);
|
1814
902
|
}
|
1815
903
|
}
|
1816
|
-
|
1817
|
-
|
1818
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type:
|
904
|
+
FlowStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, deps: [{ token: FlowConfigurationService }, { token: FlowInfoService }, { token: i3.FlowStateApiService }, { token: i1.ConfigurationProcessorsApiService }, { token: i1.SalesTransactionApiService }, { token: SalesTransactionService }, { token: i6.ToastService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
905
|
+
FlowStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService });
|
906
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, decorators: [{
|
1819
907
|
type: Injectable
|
1820
|
-
}], ctorParameters: function () {
|
1821
|
-
|
1822
|
-
|
1823
|
-
}
|
1824
|
-
|
1825
|
-
|
1826
|
-
|
1827
|
-
|
1828
|
-
type: NgModule,
|
1829
|
-
args: [{
|
1830
|
-
imports: [ApiModule],
|
1831
|
-
providers: [FlowConfigurationService, FlowUpdateService],
|
1832
|
-
}]
|
1833
|
-
}] });
|
908
|
+
}], ctorParameters: function () {
|
909
|
+
return [{ type: FlowConfigurationService }, { type: FlowInfoService }, { type: i3.FlowStateApiService }, { type: i1.ConfigurationProcessorsApiService }, { type: i1.SalesTransactionApiService }, { type: SalesTransactionService }, { type: i6.ToastService }, { type: undefined, decorators: [{
|
910
|
+
type: Optional
|
911
|
+
}, {
|
912
|
+
type: Inject,
|
913
|
+
args: [FLOW_CUSTOMIZATION]
|
914
|
+
}] }];
|
915
|
+
} });
|
1834
916
|
|
1835
917
|
class FlowStateConfigurationService {
|
1836
|
-
constructor(flowInfoService,
|
918
|
+
constructor(flowInfoService, flowStateService) {
|
1837
919
|
this.flowInfoService = flowInfoService;
|
1838
|
-
this.flowConfigurationService = flowConfigurationService;
|
1839
|
-
this.flowStateApiService = flowStateApiService;
|
1840
920
|
this.flowStateService = flowStateService;
|
1841
|
-
this.configurationStateId$ = new BehaviorSubject(null);
|
1842
|
-
}
|
1843
|
-
get configurationStateId() {
|
1844
|
-
return this.configurationStateId$.value;
|
1845
921
|
}
|
1846
922
|
addToCart$(props) {
|
1847
923
|
var _a;
|
@@ -1853,26 +929,22 @@ class FlowStateConfigurationService {
|
|
1853
929
|
request$ = of();
|
1854
930
|
}
|
1855
931
|
else {
|
1856
|
-
|
1857
|
-
request$ =
|
1858
|
-
if (!this.configurationStateId) {
|
1859
|
-
return of();
|
1860
|
-
}
|
1861
|
-
return this.flowStateApiService.saveConfiguration(stateId, this.configurationStateId).pipe(tap$1(() => this.configurationStateId$.next(null)), map$1(noop));
|
1862
|
-
}));
|
932
|
+
// TODO: Implement
|
933
|
+
request$ = of();
|
1863
934
|
}
|
1864
935
|
}
|
1865
936
|
else {
|
1866
|
-
|
937
|
+
// TODO: Implement
|
938
|
+
request$ = of();
|
1867
939
|
}
|
1868
|
-
return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map
|
940
|
+
return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map(noop));
|
1869
941
|
}
|
1870
942
|
}
|
1871
|
-
FlowStateConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, deps: [{ token: FlowInfoService }, { token:
|
943
|
+
FlowStateConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, deps: [{ token: FlowInfoService }, { token: FlowStateService }], target: i0.ɵɵFactoryTarget.Injectable });
|
1872
944
|
FlowStateConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService });
|
1873
945
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, decorators: [{
|
1874
946
|
type: Injectable
|
1875
|
-
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type:
|
947
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: FlowStateService }]; } });
|
1876
948
|
|
1877
949
|
class IntegrationState {
|
1878
950
|
constructor() {
|
@@ -1892,12 +964,12 @@ class IntegrationState {
|
|
1892
964
|
this.action$.next(action);
|
1893
965
|
}
|
1894
966
|
listen$(actionType) {
|
1895
|
-
return this.action$.pipe(filter
|
967
|
+
return this.action$.pipe(filter(action => action.type === actionType), map(action => action.payload));
|
1896
968
|
}
|
1897
969
|
listenAll$() {
|
1898
970
|
return this.action$.asObservable();
|
1899
971
|
}
|
1900
|
-
|
972
|
+
reset() {
|
1901
973
|
this.stateSubj$.next({});
|
1902
974
|
}
|
1903
975
|
}
|
@@ -1908,8 +980,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
1908
980
|
}] });
|
1909
981
|
|
1910
982
|
class ProductImagesService {
|
1911
|
-
constructor(
|
1912
|
-
this.
|
983
|
+
constructor(productsAdminApiService) {
|
984
|
+
this.productsAdminApiService = productsAdminApiService;
|
1913
985
|
this.imagesMap$ = new BehaviorSubject({});
|
1914
986
|
}
|
1915
987
|
getImageUrl$(productId) {
|
@@ -1917,157 +989,151 @@ class ProductImagesService {
|
|
1917
989
|
this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: '' }));
|
1918
990
|
this.fetchProductImage(productId);
|
1919
991
|
}
|
1920
|
-
return this.imagesMap$.pipe(map
|
992
|
+
return this.imagesMap$.pipe(map(imagesMap => { var _a; return (_a = imagesMap[productId]) !== null && _a !== void 0 ? _a : null; }), distinctUntilChanged());
|
1921
993
|
}
|
1922
994
|
fetchProductImage(productId) {
|
1923
|
-
this.
|
995
|
+
this.productsAdminApiService
|
1924
996
|
.fetchImage$(productId)
|
1925
|
-
.pipe(map
|
997
|
+
.pipe(map(file => URL.createObjectURL(file)), catchError(() => of('')), tap(url => this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: url }))))
|
1926
998
|
.subscribe();
|
1927
999
|
}
|
1928
1000
|
}
|
1929
|
-
ProductImagesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, deps: [{ token: i1.
|
1001
|
+
ProductImagesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, deps: [{ token: i1.ProductsAdminApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
1930
1002
|
ProductImagesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService });
|
1931
1003
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, decorators: [{
|
1932
1004
|
type: Injectable
|
1933
|
-
}], ctorParameters: function () { return [{ type: i1.
|
1005
|
+
}], ctorParameters: function () { return [{ type: i1.ProductsAdminApiService }]; } });
|
1934
1006
|
|
1935
|
-
class
|
1936
|
-
|
1937
|
-
this.
|
1938
|
-
}
|
1939
|
-
getRuntimeContext(productId, offeringId) {
|
1940
|
-
return this.configurationApiService.getRuntimeDataByProductId(productId, offeringId).pipe(map(runtimeData => {
|
1941
|
-
var _a;
|
1942
|
-
const uiDefinitionContainer = this.getUIDefinitionContainer(runtimeData);
|
1943
|
-
const runtimeModel = RuntimeModel.create(runtimeData.types, runtimeData.products);
|
1944
|
-
const { productName, properties } = (_a = Array.from(runtimeModel.components.values()).find(c => c.productId === productId)) !== null && _a !== void 0 ? _a : {};
|
1945
|
-
const uiDefinitionProperties = uiDefinitionContainer === null || uiDefinitionContainer === void 0 ? void 0 : uiDefinitionContainer.source.properties;
|
1946
|
-
return {
|
1947
|
-
modelId: runtimeData.modelId,
|
1948
|
-
uiDefinitionContainer: uiDefinitionContainer,
|
1949
|
-
runtimeModel: runtimeModel,
|
1950
|
-
runtimeMode: RuntimeMode.PROD,
|
1951
|
-
productId: productId,
|
1952
|
-
productType: (properties === null || properties === void 0 ? void 0 : properties['displayName']) || productName,
|
1953
|
-
offeringId: offeringId,
|
1954
|
-
properties: {
|
1955
|
-
PricingEnabled: (uiDefinitionProperties === null || uiDefinitionProperties === void 0 ? void 0 : uiDefinitionProperties.pricingEnabled) ? 'true' : 'false',
|
1956
|
-
PriceListId: uiDefinitionProperties === null || uiDefinitionProperties === void 0 ? void 0 : uiDefinitionProperties.priceList,
|
1957
|
-
},
|
1958
|
-
};
|
1959
|
-
}));
|
1007
|
+
class ConfigurationService {
|
1008
|
+
get state$() {
|
1009
|
+
return this.configurationStateSubj$.asObservable().pipe(filter$1(isDefined));
|
1960
1010
|
}
|
1961
|
-
|
1962
|
-
|
1963
|
-
const containers = runtimeData.uiDefinitions.filter(container => isNotLegacyUIDefinition(container.source));
|
1964
|
-
return (_a = containers.find(container => container.source.primary)) !== null && _a !== void 0 ? _a : containers[0];
|
1011
|
+
get state() {
|
1012
|
+
return this.configurationStateSubj$.getValue();
|
1965
1013
|
}
|
1966
|
-
|
1967
|
-
|
1968
|
-
RuntimeContextService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeContextService });
|
1969
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeContextService, decorators: [{
|
1970
|
-
type: Injectable
|
1971
|
-
}], ctorParameters: function () { return [{ type: i1.ConfigurationApiService }]; } });
|
1972
|
-
|
1973
|
-
class ConfigurationRuntimeService {
|
1974
|
-
constructor(apiService, contextService, runtimeContextService) {
|
1975
|
-
this.apiService = apiService;
|
1976
|
-
this.contextService = contextService;
|
1977
|
-
this.runtimeContextService = runtimeContextService;
|
1978
|
-
this._isInitialized = false;
|
1979
|
-
this.uiDefinitionProperties = {};
|
1014
|
+
get previousState() {
|
1015
|
+
return this.previousConfigurationStateSubj$.getValue();
|
1980
1016
|
}
|
1981
|
-
|
1982
|
-
this.
|
1983
|
-
this._runtimeContext = undefined;
|
1984
|
-
this.initializationProps = undefined;
|
1985
|
-
this.uiDefinitionProperties = {};
|
1017
|
+
get root$() {
|
1018
|
+
return this.state$.pipe(map$1(state => state.salesTransactionItems[0]), filter$1(isDefined));
|
1986
1019
|
}
|
1987
|
-
|
1020
|
+
get root() {
|
1988
1021
|
var _a, _b;
|
1989
|
-
|
1990
|
-
const uiDefinitionExternals = (_b = uiDefinitionContainer.source.externals) !== null && _b !== void 0 ? _b : {};
|
1991
|
-
return combineLatest([
|
1992
|
-
this.apiService.getRuntimeDataByModelId(uiDefinitionContainer.modelId),
|
1993
|
-
this.contextService.initTestMode(),
|
1994
|
-
]).pipe(first(), map(([runtimeData, context]) => {
|
1995
|
-
var _a;
|
1996
|
-
this.contextService.update({
|
1997
|
-
properties: Object.assign(Object.assign(Object.assign(Object.assign({}, (_a = this.runtimeContext) === null || _a === void 0 ? void 0 : _a.properties), context.properties), { ModelId: uiDefinitionContainer.modelId, PricingEnabled: this.uiDefinitionProperties.pricingEnabled ? 'true' : 'false', PriceListId: this.uiDefinitionProperties.priceList, offeringId: this.uiDefinitionProperties.offeringId }), uiDefinitionExternals),
|
1998
|
-
});
|
1999
|
-
this._runtimeContext = {
|
2000
|
-
modelId: uiDefinitionContainer.modelId,
|
2001
|
-
runtimeModel: RuntimeModel.create(runtimeData.types, runtimeData.products),
|
2002
|
-
runtimeMode: RuntimeMode.TEST,
|
2003
|
-
uiDefinitionContainer,
|
2004
|
-
};
|
2005
|
-
return this._runtimeContext;
|
2006
|
-
}), tap(() => (this._isInitialized = true)));
|
1022
|
+
return (_b = (_a = this.configurationStateSubj$.getValue()) === null || _a === void 0 ? void 0 : _a.salesTransactionItems[0]) !== null && _b !== void 0 ? _b : null;
|
2007
1023
|
}
|
2008
|
-
|
2009
|
-
this.
|
2010
|
-
|
2011
|
-
|
2012
|
-
|
2013
|
-
|
2014
|
-
|
2015
|
-
|
2016
|
-
|
2017
|
-
|
2018
|
-
|
2019
|
-
|
2020
|
-
|
2021
|
-
|
2022
|
-
|
2023
|
-
|
2024
|
-
}), tap(() => (this._isInitialized = true)));
|
1024
|
+
constructor(flowInfoService, messageService, configurationRuntimeService, salesTransactionService, orchestrationsApiService) {
|
1025
|
+
this.flowInfoService = flowInfoService;
|
1026
|
+
this.messageService = messageService;
|
1027
|
+
this.configurationRuntimeService = configurationRuntimeService;
|
1028
|
+
this.salesTransactionService = salesTransactionService;
|
1029
|
+
this.orchestrationsApiService = orchestrationsApiService;
|
1030
|
+
this.hasUnsavedChanges = false;
|
1031
|
+
this.configurationStateSubj$ = new BehaviorSubject(null);
|
1032
|
+
this.previousConfigurationStateSubj$ = new BehaviorSubject(null);
|
1033
|
+
this.isLoadingSubj$ = new BehaviorSubject(false);
|
1034
|
+
this.isLoading$ = this.isLoadingSubj$.asObservable();
|
1035
|
+
}
|
1036
|
+
reset() {
|
1037
|
+
this.hasUnsavedChanges = false;
|
1038
|
+
this.configurationStateSubj$.next(null);
|
1039
|
+
this.previousConfigurationStateSubj$.next(null);
|
2025
1040
|
}
|
2026
|
-
|
1041
|
+
init$() {
|
2027
1042
|
var _a;
|
2028
|
-
|
2029
|
-
|
1043
|
+
const { state } = this.salesTransactionService;
|
1044
|
+
const { productId, transactionItemId } = this.flowInfoService.context;
|
1045
|
+
if (!state) {
|
1046
|
+
return of(undefined);
|
2030
1047
|
}
|
2031
|
-
|
2032
|
-
|
1048
|
+
let transactionItem = state === null || state === void 0 ? void 0 : state.salesTransactionItems.find(item => item.id === transactionItemId);
|
1049
|
+
if (!transactionItem && productId) {
|
1050
|
+
transactionItem =
|
1051
|
+
(_a = state.salesTransactionItems.find(item => item.productId === productId)) !== null && _a !== void 0 ? _a : generateTransactionItem(productId);
|
1052
|
+
}
|
1053
|
+
const configurationState = Object.assign(Object.assign({}, state), { salesTransactionItems: transactionItem ? [transactionItem] : [] });
|
1054
|
+
this.configurationStateSubj$.next(configurationState);
|
1055
|
+
this.previousConfigurationStateSubj$.next(configurationState);
|
1056
|
+
return of(undefined);
|
2033
1057
|
}
|
2034
|
-
|
2035
|
-
|
2036
|
-
|
1058
|
+
patch$(transactionItem) {
|
1059
|
+
const { state, root } = this;
|
1060
|
+
if (!state) {
|
1061
|
+
return throwError(() => new Error(`Configuration State is not initialized`));
|
2037
1062
|
}
|
2038
|
-
|
2039
|
-
|
2040
|
-
source[propertyName] = SalesforceIdUtils.generateId18FromId15(value);
|
1063
|
+
if (!root) {
|
1064
|
+
return throwError(() => new Error(`Root SalesTransactionItem not found`));
|
2041
1065
|
}
|
1066
|
+
const newRoot = new TransactionItemWorker(root).replace(transactionItem).ti;
|
1067
|
+
const newSalesTransaction = Object.assign(Object.assign({}, state), { salesTransactionItems: [newRoot] });
|
1068
|
+
return this.configureRequest$(newSalesTransaction).pipe(catchError$1(error => {
|
1069
|
+
console.error(error);
|
1070
|
+
if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
|
1071
|
+
this.messageService.add({ severity: 'error', summary: error });
|
1072
|
+
}
|
1073
|
+
return throwError(() => error);
|
1074
|
+
}), tap$1(() => {
|
1075
|
+
if (!this.hasUnsavedChanges) {
|
1076
|
+
this.hasUnsavedChanges = true;
|
1077
|
+
}
|
1078
|
+
}), map$1(noop));
|
2042
1079
|
}
|
2043
|
-
|
2044
|
-
|
1080
|
+
patch(transactionItem) {
|
1081
|
+
this.patch$(transactionItem).subscribe();
|
2045
1082
|
}
|
2046
|
-
|
2047
|
-
|
2048
|
-
|
1083
|
+
configureRequest$(salesTransaction) {
|
1084
|
+
const request = {
|
1085
|
+
salesTransaction,
|
1086
|
+
};
|
1087
|
+
this.isLoadingSubj$.next(true);
|
1088
|
+
return this.orchestrationsApiService.apply$(request).pipe(tap$1(result => {
|
1089
|
+
const newState = result.salesTransaction;
|
1090
|
+
this.configurationStateSubj$.next(newState);
|
1091
|
+
this.previousConfigurationStateSubj$.next(cloneDeep(newState));
|
1092
|
+
}), map$1(response => response.salesTransaction), catchError$1(error => throwError(() => {
|
1093
|
+
const resetState = this.previousConfigurationStateSubj$.getValue();
|
1094
|
+
if (resetState) {
|
1095
|
+
this.previousConfigurationStateSubj$.next(cloneDeep(resetState));
|
1096
|
+
this.configurationStateSubj$.next(resetState);
|
1097
|
+
}
|
1098
|
+
if (error.error) {
|
1099
|
+
return extractErrorDetails(error.error).join('. ');
|
1100
|
+
}
|
1101
|
+
return error.message || JSON.stringify(error);
|
1102
|
+
})), finalize$1(() => this.isLoadingSubj$.next(false)));
|
1103
|
+
}
|
1104
|
+
configureExternal$(props) {
|
1105
|
+
// TODO: implement
|
1106
|
+
throw new Error('Not implemented');
|
2049
1107
|
}
|
2050
|
-
|
2051
|
-
|
1108
|
+
configureGuidedSelling$(data) {
|
1109
|
+
// TODO: implement
|
1110
|
+
throw new Error('Not implemented');
|
1111
|
+
}
|
1112
|
+
getPCMModel() {
|
1113
|
+
const pcmModel = this.configurationRuntimeService.pcmModel;
|
1114
|
+
if (!pcmModel) {
|
1115
|
+
throw new Error('PCM model not initialized');
|
1116
|
+
}
|
1117
|
+
return pcmModel;
|
2052
1118
|
}
|
2053
1119
|
}
|
2054
|
-
|
2055
|
-
|
2056
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type:
|
1120
|
+
ConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, deps: [{ token: FlowInfoService }, { token: i2.MessageService }, { token: ConfigurationRuntimeService }, { token: SalesTransactionService }, { token: i1.OrchestrationsApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
1121
|
+
ConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService });
|
1122
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, decorators: [{
|
2057
1123
|
type: Injectable
|
2058
|
-
}], ctorParameters: function () { return [{ type:
|
1124
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: i2.MessageService }, { type: ConfigurationRuntimeService }, { type: SalesTransactionService }, { type: i1.OrchestrationsApiService }]; } });
|
2059
1125
|
|
2060
1126
|
class ConfigurationStateService {
|
2061
|
-
constructor(configurationRuntimeService, configurationService,
|
1127
|
+
constructor(configurationRuntimeService, configurationService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, salesTransactionService, salesTransactionApiService, toastService) {
|
2062
1128
|
this.configurationRuntimeService = configurationRuntimeService;
|
2063
1129
|
this.configurationService = configurationService;
|
2064
|
-
this.quoteDraftService = quoteDraftService;
|
2065
|
-
this.toastService = toastService;
|
2066
1130
|
this.flowStateService = flowStateService;
|
2067
1131
|
this.flowInfoService = flowInfoService;
|
2068
1132
|
this.flowConfigurationService = flowConfigurationService;
|
2069
1133
|
this.flowStateApiService = flowStateApiService;
|
2070
|
-
this.
|
1134
|
+
this.salesTransactionService = salesTransactionService;
|
1135
|
+
this.salesTransactionApiService = salesTransactionApiService;
|
1136
|
+
this.toastService = toastService;
|
2071
1137
|
this.isInitialized$ = new BehaviorSubject(false);
|
2072
1138
|
this.canceledConfiguration$ = new Subject();
|
2073
1139
|
this.NOT_INITIALIZED = Symbol();
|
@@ -2091,9 +1157,9 @@ class ConfigurationStateService {
|
|
2091
1157
|
request$ = this.initStateful$();
|
2092
1158
|
}
|
2093
1159
|
else {
|
2094
|
-
request$ = this.
|
1160
|
+
request$ = this.configurationService.init$();
|
2095
1161
|
}
|
2096
|
-
return request$.pipe(
|
1162
|
+
return request$.pipe(take(1), tap(() => {
|
2097
1163
|
this.isInitialized$.next(true);
|
2098
1164
|
this.canceledConfiguration$ = new Subject();
|
2099
1165
|
}));
|
@@ -2107,10 +1173,11 @@ class ConfigurationStateService {
|
|
2107
1173
|
this.configurationStore = {};
|
2108
1174
|
this.executedFunctions = {};
|
2109
1175
|
this.configurationService.reset();
|
1176
|
+
this.configurationRuntimeService.reset();
|
2110
1177
|
}
|
2111
1178
|
execute$(exec) {
|
2112
1179
|
const request = this.execToRequest(exec);
|
2113
|
-
return this.executeRequest$(request).pipe(map
|
1180
|
+
return this.executeRequest$(request).pipe(map(result => {
|
2114
1181
|
// Keep only requested results
|
2115
1182
|
const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
|
2116
1183
|
var _a;
|
@@ -2133,7 +1200,7 @@ class ConfigurationStateService {
|
|
2133
1200
|
}
|
2134
1201
|
// prevent parallel configuration requests in stateless mode
|
2135
1202
|
if (!this.statelessExecutionRequest$) {
|
2136
|
-
this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay
|
1203
|
+
this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay(), take(1), finalize(() => (this.statelessExecutionRequest$ = null)));
|
2137
1204
|
}
|
2138
1205
|
return this.statelessExecutionRequest$;
|
2139
1206
|
}
|
@@ -2147,7 +1214,7 @@ class ConfigurationStateService {
|
|
2147
1214
|
},
|
2148
1215
|
},
|
2149
1216
|
});
|
2150
|
-
return this.executeRequest$(request).pipe(map
|
1217
|
+
return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
|
2151
1218
|
}
|
2152
1219
|
subscribe$(selectorName, inputData = {}, options) {
|
2153
1220
|
const requestId = UUID.UUID();
|
@@ -2170,58 +1237,41 @@ class ConfigurationStateService {
|
|
2170
1237
|
this.executeRequest$(request).subscribe();
|
2171
1238
|
}
|
2172
1239
|
}
|
2173
|
-
return subscription.data$.pipe(filter
|
1240
|
+
return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), distinctUntilChanged(), finalize(() => {
|
2174
1241
|
var _a;
|
2175
1242
|
if (!((_a = this.subscriptions[requestId]) === null || _a === void 0 ? void 0 : _a.data$.observed)) {
|
2176
1243
|
delete this.subscriptions[requestId];
|
2177
1244
|
}
|
2178
1245
|
}), takeUntil(this.canceledConfiguration$));
|
2179
1246
|
}
|
2180
|
-
saveConfiguration(
|
2181
|
-
var _a, _b
|
1247
|
+
saveConfiguration() {
|
1248
|
+
var _a, _b;
|
2182
1249
|
if (this.isStatefulConfiguration) {
|
2183
|
-
return this.flowStateApiService
|
2184
|
-
|
2185
|
-
|
1250
|
+
return this.flowStateApiService.saveConfiguration((_a = this.flowStateService.stateId) !== null && _a !== void 0 ? _a : '', (_b = this.stateId) !== null && _b !== void 0 ? _b : '').pipe(switchMap(r => this.flowStateService.executeRequest$({}, true).pipe(map(() => r))), map(r => ({ id: r.quoteId })));
|
1251
|
+
}
|
1252
|
+
const state = this.salesTransactionService.state;
|
1253
|
+
if (!state) {
|
1254
|
+
return of({ id: '' });
|
1255
|
+
}
|
1256
|
+
const { standalone } = this.flowInfoService.flow.properties;
|
1257
|
+
if (standalone) {
|
1258
|
+
return this.salesTransactionApiService.upsert(state);
|
1259
|
+
}
|
1260
|
+
const salesTransaction = this.salesTransactionService.state;
|
1261
|
+
const configurationRoot = this.configurationService.root;
|
1262
|
+
if (!salesTransaction || !configurationRoot) {
|
1263
|
+
return of({ id: '' });
|
1264
|
+
}
|
1265
|
+
const isNewTransactionItem = salesTransaction.salesTransactionItems.every(li => li.id !== configurationRoot.id);
|
1266
|
+
let salesTransactionItems;
|
1267
|
+
if (isNewTransactionItem) {
|
1268
|
+
salesTransactionItems = [...salesTransaction.salesTransactionItems, configurationRoot];
|
2186
1269
|
}
|
2187
1270
|
else {
|
2188
|
-
|
2189
|
-
const quoteDraft = this.quoteDraftService.quoteDraft;
|
2190
|
-
if (!quoteDraft) {
|
2191
|
-
return of({ quoteId: '' });
|
2192
|
-
}
|
2193
|
-
const rootLineItem = this.configurationService.getSnapshot();
|
2194
|
-
const asset = this.configurationService.getAsset();
|
2195
|
-
const currentState = rootLineItem ? [rootLineItem] : [];
|
2196
|
-
const initialState = asset ? [asset] : [];
|
2197
|
-
return this.quoteApiService.upsertQuote(Object.assign(Object.assign({}, quoteDraft), { currentState, initialState }));
|
2198
|
-
}
|
2199
|
-
else {
|
2200
|
-
const quoteDraft = this.quoteDraftService.quoteDraft;
|
2201
|
-
const lineItem = this.configurationService.getSnapshot();
|
2202
|
-
if (!quoteDraft || !lineItem) {
|
2203
|
-
return of({ quoteId: '' });
|
2204
|
-
}
|
2205
|
-
const isNewLineItem = quoteDraft.currentState.every(li => li.id !== lineItem.id);
|
2206
|
-
let currentState;
|
2207
|
-
if (isNewLineItem) {
|
2208
|
-
currentState = [...quoteDraft.currentState, lineItem];
|
2209
|
-
}
|
2210
|
-
else {
|
2211
|
-
currentState = quoteDraft.currentState.map(li => (li.id === lineItem.id ? lineItem : li));
|
2212
|
-
}
|
2213
|
-
const asset = this.configurationService.getAsset();
|
2214
|
-
const initialState = [...((_d = (_c = this.quoteDraftService.quoteDraft) === null || _c === void 0 ? void 0 : _c.initialState) !== null && _d !== void 0 ? _d : [])];
|
2215
|
-
if (asset) {
|
2216
|
-
if (!initialState.some(li => li.id === asset.id)) {
|
2217
|
-
initialState.push(asset);
|
2218
|
-
}
|
2219
|
-
}
|
2220
|
-
return this.flowConfigurationService
|
2221
|
-
.calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState, initialState }))
|
2222
|
-
.pipe(map$1(() => ({ quoteId: '' })));
|
2223
|
-
}
|
1271
|
+
salesTransactionItems = salesTransaction.salesTransactionItems.map(ti => ti.id === configurationRoot.id ? configurationRoot : ti);
|
2224
1272
|
}
|
1273
|
+
const newState = Object.assign(Object.assign({}, salesTransaction), { salesTransactionItems });
|
1274
|
+
return this.flowConfigurationService.calculate$(newState).pipe(map(() => ({ id: '' })));
|
2225
1275
|
}
|
2226
1276
|
cancelConfiguration() {
|
2227
1277
|
var _a, _b;
|
@@ -2242,37 +1292,33 @@ class ConfigurationStateService {
|
|
2242
1292
|
return (_b = (_a = this.flowInfoService.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful) !== null && _b !== void 0 ? _b : false;
|
2243
1293
|
}
|
2244
1294
|
initStateful$() {
|
2245
|
-
var _a, _b, _c, _d, _e, _f
|
2246
|
-
this.ownerId = (
|
2247
|
-
const
|
2248
|
-
if (!this.flowStateService.stateId) {
|
1295
|
+
var _a, _b, _c, _d, _e, _f;
|
1296
|
+
this.ownerId = (_b = (_a = this.configurationRuntimeService.uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : '';
|
1297
|
+
const { productId, transactionItemId } = this.flowInfoService.context;
|
1298
|
+
if (!productId || !this.flowStateService.stateId) {
|
2249
1299
|
return of(undefined);
|
2250
1300
|
}
|
2251
|
-
const container =
|
2252
|
-
const lineItem = this.configurationService.generateLineItem();
|
1301
|
+
const container = this.configurationRuntimeService.uiDefinitionContainer;
|
2253
1302
|
let request$;
|
2254
|
-
if (!
|
1303
|
+
if (!transactionItemId) {
|
2255
1304
|
request$ = this.flowStateApiService.newConfiguration(this.flowStateService.stateId, {
|
2256
|
-
|
2257
|
-
actionsOverride: (
|
2258
|
-
selectorsOverride: (
|
1305
|
+
transactionItem: generateTransactionItem(productId),
|
1306
|
+
actionsOverride: (_c = container === null || container === void 0 ? void 0 : container.actions) === null || _c === void 0 ? void 0 : _c.map(processor => (Object.assign(Object.assign({}, processor), { ownerId: this.ownerId }))),
|
1307
|
+
selectorsOverride: (_d = container === null || container === void 0 ? void 0 : container.selectors) === null || _d === void 0 ? void 0 : _d.map(processor => (Object.assign(Object.assign({}, processor), { ownerId: this.ownerId }))),
|
2259
1308
|
});
|
2260
1309
|
}
|
2261
1310
|
else {
|
2262
1311
|
request$ = this.flowStateApiService.startConfiguration(this.flowStateService.stateId, {
|
2263
|
-
|
2264
|
-
actionsOverride: (
|
2265
|
-
selectorsOverride: (
|
1312
|
+
transactionItemId,
|
1313
|
+
actionsOverride: (_e = container === null || container === void 0 ? void 0 : container.actions) === null || _e === void 0 ? void 0 : _e.map(processor => (Object.assign(Object.assign({}, processor), { ownerId: this.ownerId }))),
|
1314
|
+
selectorsOverride: (_f = container === null || container === void 0 ? void 0 : container.selectors) === null || _f === void 0 ? void 0 : _f.map(processor => (Object.assign(Object.assign({}, processor), { ownerId: this.ownerId }))),
|
2266
1315
|
});
|
2267
1316
|
}
|
2268
|
-
return request$.pipe(map
|
1317
|
+
return request$.pipe(map(r => {
|
2269
1318
|
this.stateId = r.stateId;
|
2270
1319
|
return undefined;
|
2271
1320
|
}));
|
2272
1321
|
}
|
2273
|
-
initStateless$() {
|
2274
|
-
return this.configurationService.configure().pipe(map$1(() => undefined));
|
2275
|
-
}
|
2276
1322
|
execToRequest(exec) {
|
2277
1323
|
var _a;
|
2278
1324
|
return {
|
@@ -2318,39 +1364,37 @@ class ConfigurationStateService {
|
|
2318
1364
|
else {
|
2319
1365
|
execution$ = this.executeStateless$(fullRequest);
|
2320
1366
|
}
|
2321
|
-
return execution$.pipe(tap
|
1367
|
+
return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
|
2322
1368
|
}
|
2323
1369
|
executeStateless$(request) {
|
2324
1370
|
this.executionInProgress$.next(true);
|
2325
|
-
return
|
1371
|
+
return this.configurationService.state$.pipe(switchMap(state => {
|
2326
1372
|
var _a;
|
2327
1373
|
// Apply actions and execute configuration/price call
|
2328
1374
|
// No need to run configuration if no actions in the request
|
2329
1375
|
if (!((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
|
2330
1376
|
return of(undefined);
|
2331
1377
|
}
|
2332
|
-
let configurationRequest = this.configurationService.generateRequest(false);
|
2333
1378
|
request.actions.forEach(action => {
|
2334
1379
|
var _a;
|
2335
|
-
|
1380
|
+
state = (_a = this.executeActionScript(state, action)) !== null && _a !== void 0 ? _a : state;
|
2336
1381
|
});
|
2337
|
-
|
2338
|
-
|
2339
|
-
}), map$1(() => {
|
1382
|
+
return this.configurationService.configureRequest$(state);
|
1383
|
+
}), map(() => {
|
2340
1384
|
// Run selectors and apply them to the state
|
2341
|
-
const configurationState = this.configurationService.
|
1385
|
+
const configurationState = this.configurationService.state;
|
2342
1386
|
if (!configurationState) {
|
2343
1387
|
return { stateId: '', selectors: {} };
|
2344
1388
|
}
|
2345
1389
|
return this.runStatelessSelectors(request, configurationState);
|
2346
|
-
}), tap
|
2347
|
-
const configurationState = this.configurationService.
|
1390
|
+
}), tap(() => this.executionInProgress$.next(false)), catchError(error => {
|
1391
|
+
const configurationState = this.configurationService.previousState;
|
2348
1392
|
if (configurationState) {
|
2349
1393
|
const selectorsResult = this.runStatelessSelectors(request, configurationState);
|
2350
1394
|
this.handleSelectorsResponse(selectorsResult.selectors);
|
2351
1395
|
}
|
2352
1396
|
this.executionInProgress$.next(false);
|
2353
|
-
if (!this.configurationRuntimeService.
|
1397
|
+
if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
|
2354
1398
|
this.toastService.add({ severity: ToastType.error, summary: String(error) });
|
2355
1399
|
}
|
2356
1400
|
return throwError(() => error);
|
@@ -2371,22 +1415,22 @@ class ConfigurationStateService {
|
|
2371
1415
|
};
|
2372
1416
|
this.executionInProgress$.next(true);
|
2373
1417
|
return this.flowStateApiService.executeConfiguration(this.flowStateService.stateId, this.stateId, request);
|
2374
|
-
}), tap
|
1418
|
+
}), tap(({ stateId }) => (this.stateId = stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
|
2375
1419
|
this.executionInProgress$.next(false);
|
2376
1420
|
return throwError(() => e);
|
2377
1421
|
}));
|
2378
1422
|
}
|
2379
1423
|
executeStateful$(request) {
|
2380
|
-
return this.executionInProgress$.pipe(filter
|
1424
|
+
return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
|
2381
1425
|
// make sure stream switches to statefulExecutionRequest$ before pushing an execution request
|
2382
1426
|
combineLatest([
|
2383
1427
|
this.statefulExecutionRequest$,
|
2384
|
-
of(undefined).pipe(tap
|
2385
|
-
])), map
|
1428
|
+
of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
|
1429
|
+
])), map(([response]) => response), take(1));
|
2386
1430
|
}
|
2387
1431
|
executeActionScript(request, processor) {
|
2388
|
-
var _a
|
2389
|
-
const { actions } = (
|
1432
|
+
var _a;
|
1433
|
+
const { actions } = (_a = this.configurationRuntimeService.uiDefinitionContainer) !== null && _a !== void 0 ? _a : {};
|
2390
1434
|
const configurationProcessor = actions === null || actions === void 0 ? void 0 : actions.find(action => action.apiName === processor.apiName);
|
2391
1435
|
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
2392
1436
|
throw `ConfigurationProcessor ${processor.apiName} not found`;
|
@@ -2394,8 +1438,8 @@ class ConfigurationStateService {
|
|
2394
1438
|
return this.executeProcessorScript(request, configurationProcessor, processor.inputData);
|
2395
1439
|
}
|
2396
1440
|
executeSelectorScript(request, processor) {
|
2397
|
-
var _a
|
2398
|
-
const { selectors } = (
|
1441
|
+
var _a;
|
1442
|
+
const { selectors } = (_a = this.configurationRuntimeService.uiDefinitionContainer) !== null && _a !== void 0 ? _a : {};
|
2399
1443
|
const configurationProcessor = selectors === null || selectors === void 0 ? void 0 : selectors.find(selector => selector.apiName === processor.apiName);
|
2400
1444
|
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
2401
1445
|
throw `ConfigurationProcessor ${processor.apiName} not found`;
|
@@ -2437,25 +1481,63 @@ class ConfigurationStateService {
|
|
2437
1481
|
}, { stateId: '', selectors: {} });
|
2438
1482
|
}
|
2439
1483
|
}
|
2440
|
-
ConfigurationStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, deps: [{ token: ConfigurationRuntimeService }, { token: ConfigurationService }, { token:
|
1484
|
+
ConfigurationStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, deps: [{ token: ConfigurationRuntimeService }, { token: ConfigurationService }, { token: FlowStateService }, { token: FlowInfoService }, { token: FlowConfigurationService }, { token: i3.FlowStateApiService }, { token: SalesTransactionService }, { token: i1.SalesTransactionApiService }, { token: i6.ToastService }], target: i0.ɵɵFactoryTarget.Injectable });
|
2441
1485
|
ConfigurationStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService });
|
2442
1486
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, decorators: [{
|
2443
1487
|
type: Injectable
|
2444
|
-
}], ctorParameters: function () { return [{ type: ConfigurationRuntimeService }, { type: ConfigurationService }, { type:
|
1488
|
+
}], ctorParameters: function () { return [{ type: ConfigurationRuntimeService }, { type: ConfigurationService }, { type: FlowStateService }, { type: FlowInfoService }, { type: FlowConfigurationService }, { type: i3.FlowStateApiService }, { type: SalesTransactionService }, { type: i1.SalesTransactionApiService }, { type: i6.ToastService }]; } });
|
2445
1489
|
|
2446
1490
|
class ConfigurationModule {
|
2447
1491
|
}
|
2448
1492
|
ConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
2449
1493
|
ConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, imports: [ConfirmationDialogModule, ApiModule] });
|
2450
|
-
ConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, providers: [
|
1494
|
+
ConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, providers: [ConfigurationService, ConfigurationStateService, ConfigurationRuntimeService], imports: [ConfirmationDialogModule, ApiModule] });
|
2451
1495
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, decorators: [{
|
2452
1496
|
type: NgModule,
|
2453
1497
|
args: [{
|
2454
1498
|
imports: [ConfirmationDialogModule, ApiModule],
|
2455
|
-
providers: [
|
1499
|
+
providers: [ConfigurationService, ConfigurationStateService, ConfigurationRuntimeService],
|
1500
|
+
}]
|
1501
|
+
}] });
|
1502
|
+
|
1503
|
+
class FlowConfigurationModule {
|
1504
|
+
}
|
1505
|
+
FlowConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
1506
|
+
FlowConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, imports: [ApiModule] });
|
1507
|
+
FlowConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, providers: [FlowConfigurationService], imports: [ApiModule] });
|
1508
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, decorators: [{
|
1509
|
+
type: NgModule,
|
1510
|
+
args: [{
|
1511
|
+
imports: [ApiModule],
|
1512
|
+
providers: [FlowConfigurationService],
|
2456
1513
|
}]
|
2457
1514
|
}] });
|
2458
1515
|
|
1516
|
+
class CatalogProductsService {
|
1517
|
+
constructor() {
|
1518
|
+
this.stateSubj$ = new BehaviorSubject(null);
|
1519
|
+
this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
|
1520
|
+
}
|
1521
|
+
get state() {
|
1522
|
+
return this.stateSubj$.getValue();
|
1523
|
+
}
|
1524
|
+
reset() {
|
1525
|
+
this.stateSubj$.next(null);
|
1526
|
+
}
|
1527
|
+
setState(state) {
|
1528
|
+
this.stateSubj$.next(state);
|
1529
|
+
}
|
1530
|
+
}
|
1531
|
+
CatalogProductsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
1532
|
+
CatalogProductsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService });
|
1533
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService, decorators: [{
|
1534
|
+
type: Injectable
|
1535
|
+
}] });
|
1536
|
+
|
1537
|
+
const FORMATTING_SETTINGS_TOKEN = new InjectionToken('Summary of formatting settings for variant types of data, e.g. numbers, text, dates, etc');
|
1538
|
+
|
1539
|
+
const UI_DEFINITION_VERSION = 3;
|
1540
|
+
|
2459
1541
|
const DEFAULT_FORMATTING_SETTINGS = {
|
2460
1542
|
currencySymbol: DEFAULT_CURRENCY_SYMBOL,
|
2461
1543
|
decimalsCount: DEFAULT_DECIMALS_COUNT,
|
@@ -2469,14 +1551,14 @@ class SdkCoreModule {
|
|
2469
1551
|
SdkCoreModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
2470
1552
|
SdkCoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, imports: [ConfigurationModule, FlowConfigurationModule] });
|
2471
1553
|
SdkCoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, providers: [
|
2472
|
-
ContextService,
|
2473
1554
|
FlowInfoService,
|
2474
|
-
QuoteDraftService,
|
2475
1555
|
ProductImagesService,
|
2476
1556
|
IntegrationState,
|
2477
1557
|
FlowStateService,
|
2478
1558
|
FlowStateConfigurationService,
|
2479
1559
|
RuntimeSettingsService,
|
1560
|
+
SalesTransactionService,
|
1561
|
+
CatalogProductsService,
|
2480
1562
|
{
|
2481
1563
|
provide: FORMATTING_SETTINGS_TOKEN,
|
2482
1564
|
useExisting: RuntimeSettingsService,
|
@@ -2487,14 +1569,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
2487
1569
|
args: [{
|
2488
1570
|
imports: [ConfigurationModule, FlowConfigurationModule],
|
2489
1571
|
providers: [
|
2490
|
-
ContextService,
|
2491
1572
|
FlowInfoService,
|
2492
|
-
QuoteDraftService,
|
2493
1573
|
ProductImagesService,
|
2494
1574
|
IntegrationState,
|
2495
1575
|
FlowStateService,
|
2496
1576
|
FlowStateConfigurationService,
|
2497
1577
|
RuntimeSettingsService,
|
1578
|
+
SalesTransactionService,
|
1579
|
+
CatalogProductsService,
|
2498
1580
|
{
|
2499
1581
|
provide: FORMATTING_SETTINGS_TOKEN,
|
2500
1582
|
useExisting: RuntimeSettingsService,
|
@@ -2679,5 +1761,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
2679
1761
|
* Generated bundle index. Do not edit.
|
2680
1762
|
*/
|
2681
1763
|
|
2682
|
-
export { ActionCodePipe, CalendarDirective, ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService,
|
1764
|
+
export { ActionCodePipe, CalendarDirective, ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService, DEFAULT_FORMATTING_SETTINGS, DatePipe, FLOW_CUSTOMIZATION, FORMATTING_SETTINGS_TOKEN, FlowConfigurationService, FlowInfoService, FlowStateConfigurationService, FlowStateService, IntegrationState, NumberPipe, PricePipe, ProductImagesService, RuntimeSettingsService, SalesTransactionService, SdkCoreModule, SdkDirectivesModule, SdkPipesModule, TransactionItemWorker, UI_DEFINITION_VERSION, extractMetadata, findTransactionItem, findTransactionItemWithComparator, generateTransactionItem, insertTransactionItem, removeTransactionItem, replaceTransactionItem };
|
2683
1765
|
//# sourceMappingURL=veloceapps-sdk-core.mjs.map
|