@veloceapps/sdk 11.0.0-3 → 11.0.0-31
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 +2 -4
- package/core/modules/configuration/services/configuration-runtime.service.d.ts +8 -19
- package/core/modules/configuration/services/configuration-state.service.d.ts +8 -8
- package/core/modules/configuration/services/configuration.service.d.ts +23 -47
- package/core/modules/configuration/services/test-mode-configuration.service.d.ts +20 -0
- 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 +14 -4
- package/esm2020/core/modules/configuration/index.mjs +3 -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/services/test-mode-configuration.service.mjs +53 -0
- 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 +793 -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 +831 -1729
- 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, throwError, noop, filter, Subject, catchError, 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,183 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
253
365
|
}] }];
|
254
366
|
} });
|
255
367
|
|
256
|
-
class
|
368
|
+
class TestModeConfigurationService {
|
369
|
+
constructor(flowInfoService, configurationService, configurationRuntimeService, salesTransactionService) {
|
370
|
+
this.flowInfoService = flowInfoService;
|
371
|
+
this.configurationService = configurationService;
|
372
|
+
this.configurationRuntimeService = configurationRuntimeService;
|
373
|
+
this.salesTransactionService = salesTransactionService;
|
374
|
+
this.isInitialized = false;
|
375
|
+
}
|
376
|
+
initTestMode$(uiDefinitionContainer) {
|
377
|
+
var _a;
|
378
|
+
this.configurationRuntimeService.uiDefinitionContainer = uiDefinitionContainer;
|
379
|
+
if (this.checkInitialized(uiDefinitionContainer)) {
|
380
|
+
this.configurationRuntimeService.pcmModel = this.pcmModel;
|
381
|
+
return of(undefined);
|
382
|
+
}
|
383
|
+
this.configurationService.reset();
|
384
|
+
const { productId, quoteId } = (_a = uiDefinitionContainer.source.properties) !== null && _a !== void 0 ? _a : {};
|
385
|
+
if (!productId) {
|
386
|
+
return throwError(() => 'Unable to start the Configuration Preview: Product is missing.');
|
387
|
+
}
|
388
|
+
if (!quoteId) {
|
389
|
+
return throwError(() => `Unable to start the Configuration Preview: Quote is missing.`);
|
390
|
+
}
|
391
|
+
return this.flowInfoService.initTestFlow$(productId).pipe(switchMap(() => this.configurationRuntimeService.init$({ productId })), tap(pcmModel => (this.pcmModel = pcmModel)), tap(() => this.salesTransactionService.setState(this.getTestSalesTransaction(quoteId))), switchMap(() => this.configurationService.init$()), switchMap(() => this.configurationService.state
|
392
|
+
? this.configurationService.configureRequest$(this.configurationService.state)
|
393
|
+
: of(undefined)), tap(() => (this.isInitialized = true)), map(noop));
|
394
|
+
}
|
395
|
+
getTestSalesTransaction(quoteId) {
|
396
|
+
const testTransaction = {
|
397
|
+
id: quoteId,
|
398
|
+
businessObjectType: 'Quote',
|
399
|
+
salesTransactionItems: [],
|
400
|
+
};
|
401
|
+
return testTransaction;
|
402
|
+
}
|
403
|
+
checkInitialized(uiDefinitionContainer) {
|
404
|
+
var _a;
|
405
|
+
return this.isInitialized && !!((_a = uiDefinitionContainer.source.properties) === null || _a === void 0 ? void 0 : _a.persistTestState);
|
406
|
+
}
|
407
|
+
}
|
408
|
+
TestModeConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TestModeConfigurationService, deps: [{ token: FlowInfoService }, { token: ConfigurationService }, { token: ConfigurationRuntimeService }, { token: SalesTransactionService }], target: i0.ɵɵFactoryTarget.Injectable });
|
409
|
+
TestModeConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TestModeConfigurationService });
|
410
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TestModeConfigurationService, decorators: [{
|
411
|
+
type: Injectable
|
412
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: ConfigurationService }, { type: ConfigurationRuntimeService }, { type: SalesTransactionService }]; } });
|
413
|
+
|
414
|
+
class SalesTransactionService {
|
257
415
|
get isInitialized$() {
|
258
416
|
return this.isInitializedSubj$.asObservable();
|
259
417
|
}
|
260
418
|
get isInitialized() {
|
261
419
|
return this.isInitializedSubj$.getValue();
|
262
420
|
}
|
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
421
|
set hasUnsavedChanges(value) {
|
272
422
|
var _a, _b;
|
273
|
-
this.
|
274
|
-
if (!this.
|
275
|
-
this.
|
423
|
+
this.hasUnsavedChangesSubj$.next(value);
|
424
|
+
if (!this.hasUnsavedChanges) {
|
425
|
+
this.initialState = (_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.salesTransactionItems) !== null && _b !== void 0 ? _b : [];
|
276
426
|
}
|
277
427
|
}
|
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);
|
428
|
+
get hasUnsavedChanges() {
|
429
|
+
return this.hasUnsavedChangesSubj$.getValue();
|
284
430
|
}
|
285
|
-
get
|
286
|
-
return this.
|
431
|
+
get state() {
|
432
|
+
return this.stateSubj$.getValue();
|
287
433
|
}
|
288
|
-
get
|
434
|
+
get hasProducts() {
|
289
435
|
var _a;
|
290
|
-
return Boolean((_a = this.
|
436
|
+
return Boolean((_a = this.state) === null || _a === void 0 ? void 0 : _a.salesTransactionItems.length);
|
291
437
|
}
|
292
|
-
|
293
|
-
return this.assetsSubj$.value;
|
294
|
-
}
|
295
|
-
constructor(context, flowInfoService, accountApiService, quoteApiService) {
|
296
|
-
this.context = context;
|
438
|
+
constructor(flowInfoService, salesTransactionApiService) {
|
297
439
|
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);
|
440
|
+
this.salesTransactionApiService = salesTransactionApiService;
|
441
|
+
this.stateSubj$ = new BehaviorSubject(null);
|
303
442
|
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;
|
443
|
+
this.hasUnsavedChangesSubj$ = new BehaviorSubject(false);
|
444
|
+
this.initialState = [];
|
445
|
+
this.hasUnsavedChanges$ = this.hasUnsavedChangesSubj$.asObservable();
|
446
|
+
this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
|
317
447
|
}
|
318
448
|
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));
|
449
|
+
return this.salesTransactionApiService.getState(headerId, params).pipe(tap(res => this.stateSubj$.next(res.salesTransaction)), map(res => res.salesTransaction));
|
336
450
|
}
|
337
451
|
finalizeInit() {
|
338
|
-
this.
|
452
|
+
this.isInitializedSubj$.next(true);
|
339
453
|
this.hasUnsavedChanges = false;
|
340
454
|
}
|
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());
|
455
|
+
reset() {
|
456
|
+
this.stateSubj$.next(null);
|
457
|
+
this.isInitializedSubj$.next(false);
|
458
|
+
this.hasUnsavedChangesSubj$.next(false);
|
374
459
|
}
|
375
|
-
|
376
|
-
|
377
|
-
if (!quote) {
|
378
|
-
return null;
|
379
|
-
}
|
380
|
-
return Object.assign(Object.assign({}, quote), { context: this.context.resolve() });
|
460
|
+
getInitialState() {
|
461
|
+
return this.initialState;
|
381
462
|
}
|
382
|
-
|
383
|
-
|
463
|
+
setState(state) {
|
464
|
+
this.stateSubj$.next(state);
|
384
465
|
}
|
385
|
-
|
386
|
-
|
387
|
-
|
466
|
+
}
|
467
|
+
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 });
|
468
|
+
SalesTransactionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService });
|
469
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, decorators: [{
|
470
|
+
type: Injectable
|
471
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: i1.SalesTransactionApiService }]; } });
|
472
|
+
|
473
|
+
class FlowConfigurationService {
|
474
|
+
constructor(orchestrationsApiService, salesTransactionService) {
|
475
|
+
this.orchestrationsApiService = orchestrationsApiService;
|
476
|
+
this.salesTransactionService = salesTransactionService;
|
477
|
+
this.updatedSubj$ = new Subject();
|
478
|
+
this.updated$ = this.updatedSubj$.asObservable();
|
388
479
|
}
|
389
|
-
|
390
|
-
|
391
|
-
return (_b = (_a = this.flowInfoService.flow) === null || _a === void 0 ? void 0 : _a.properties.standalone) !== null && _b !== void 0 ? _b : false;
|
480
|
+
calculate$(state) {
|
481
|
+
return this.orchestrationsApiService.apply$({ salesTransaction: state }).pipe(tap(result => this.salesTransactionService.setState(result.salesTransaction)), map(noop));
|
392
482
|
}
|
393
|
-
|
394
|
-
|
483
|
+
calculate(state) {
|
484
|
+
this.calculate$(state).subscribe();
|
395
485
|
}
|
396
|
-
|
397
|
-
|
486
|
+
revert$(transactionItemId) {
|
487
|
+
var _a;
|
488
|
+
const state = this.salesTransactionService.state;
|
489
|
+
const initialState = this.salesTransactionService.getInitialState();
|
490
|
+
const currentState = (_a = state === null || state === void 0 ? void 0 : state.salesTransactionItems) !== null && _a !== void 0 ? _a : [];
|
491
|
+
const currentItemIndex = currentState.findIndex(({ id }) => id === transactionItemId);
|
492
|
+
const currentItem = currentState[currentItemIndex];
|
493
|
+
const initialItem = initialState.find(({ integrationId }) => integrationId === (currentItem === null || currentItem === void 0 ? void 0 : currentItem.integrationId));
|
494
|
+
if (!state || !currentItem || !initialItem) {
|
495
|
+
return of(null);
|
496
|
+
}
|
497
|
+
const updatedState = cloneDeep(currentState);
|
498
|
+
updatedState.splice(currentItemIndex, 1, initialItem);
|
499
|
+
return of([]).pipe(tap(() => {
|
500
|
+
this.salesTransactionService.setState(Object.assign(Object.assign({}, state), { salesTransactionItems: updatedState }));
|
501
|
+
}), switchMap(() => this.calculate$(Object.assign(Object.assign({}, state), { salesTransactionItems: updatedState }))), map(() => this.salesTransactionService.state), tap(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
|
398
502
|
}
|
399
|
-
|
400
|
-
|
503
|
+
revert(transactionItemId) {
|
504
|
+
this.revert$(transactionItemId).subscribe();
|
401
505
|
}
|
402
|
-
|
403
|
-
const
|
404
|
-
if (
|
405
|
-
return
|
406
|
-
}
|
407
|
-
if (context.mode === ConfigurationContextMode.QUOTE) {
|
408
|
-
return context.properties.Status === 'Draft';
|
506
|
+
delete$(ids) {
|
507
|
+
const state = this.salesTransactionService.state;
|
508
|
+
if (!state) {
|
509
|
+
return of(null);
|
409
510
|
}
|
410
|
-
return
|
511
|
+
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
512
|
}
|
412
|
-
|
413
|
-
|
414
|
-
this.hasUnsavedChanges = !!quote && !quote.currentState.every(li => li.actionCode === 'EXIST');
|
415
|
-
}
|
416
|
-
else {
|
417
|
-
this.hasUnsavedChanges = !isEqual(this.initialCurrentState, quote === null || quote === void 0 ? void 0 : quote.currentState);
|
418
|
-
}
|
513
|
+
delete(ids) {
|
514
|
+
this.delete$(ids).subscribe();
|
419
515
|
}
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
516
|
+
handleErrorAndBounceBack() {
|
517
|
+
return (source$) => {
|
518
|
+
return source$.pipe(catchError(error => {
|
519
|
+
console.error(error);
|
520
|
+
// bounce back if configuration call has failed
|
521
|
+
const state = this.salesTransactionService.state;
|
522
|
+
if (state) {
|
523
|
+
this.salesTransactionService.setState(state);
|
524
|
+
this.updatedSubj$.next();
|
525
|
+
}
|
526
|
+
return throwError(() => error);
|
527
|
+
}));
|
528
|
+
};
|
529
|
+
}
|
530
|
+
}
|
531
|
+
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 });
|
532
|
+
FlowConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService });
|
533
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, decorators: [{
|
534
|
+
type: Injectable
|
535
|
+
}], ctorParameters: function () { return [{ type: i1.OrchestrationsApiService }, { type: SalesTransactionService }]; } });
|
426
536
|
|
427
537
|
class FlowStateService {
|
428
|
-
constructor(
|
429
|
-
this.contextService = contextService;
|
430
|
-
this.quoteDraftService = quoteDraftService;
|
431
|
-
this.flowInfoService = flowInfoService;
|
538
|
+
constructor(flowConfiguration, flowInfoService, flowStateApiService, processorsApiService, salesTransactionApiService, salesTransactionService, toastService, customizationService) {
|
432
539
|
this.flowConfiguration = flowConfiguration;
|
433
|
-
this.
|
540
|
+
this.flowInfoService = flowInfoService;
|
434
541
|
this.flowStateApiService = flowStateApiService;
|
435
|
-
this.
|
542
|
+
this.processorsApiService = processorsApiService;
|
543
|
+
this.salesTransactionApiService = salesTransactionApiService;
|
544
|
+
this.salesTransactionService = salesTransactionService;
|
436
545
|
this.toastService = toastService;
|
437
546
|
this.customizationService = customizationService;
|
438
547
|
this.NOT_INITIALIZED = Symbol();
|
@@ -449,68 +558,22 @@ class FlowStateService {
|
|
449
558
|
this.cleanup$ = new Subject();
|
450
559
|
this.statefulExecutionRequest$ = this.initBufferedRequest$();
|
451
560
|
/*
|
452
|
-
In stateless mode watch
|
453
|
-
all subscriptions get their updates according to updated
|
561
|
+
In stateless mode watch State changes and call executeRequest so that
|
562
|
+
all subscriptions get their updates according to updated State
|
454
563
|
*/
|
455
564
|
this.isInitialized$()
|
456
|
-
.pipe(filter
|
565
|
+
.pipe(filter(Boolean), filter(() => !this.flowInfoService.flow.properties.stateful), switchMap(() => this.flowConfiguration.updated$), switchMap(() => this.executeRequest$({}, true)))
|
457
566
|
.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
567
|
}
|
503
568
|
init$() {
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
}
|
511
|
-
}));
|
569
|
+
if (this.flowInfoService.flow.properties.stateful) {
|
570
|
+
return this.initProcessors$().pipe(switchMap(() => this.initStateful$()));
|
571
|
+
}
|
572
|
+
else {
|
573
|
+
return forkJoin([this.initStateless$(), this.initProcessors$()]).pipe(map(noop));
|
574
|
+
}
|
512
575
|
}
|
513
|
-
|
576
|
+
reset() {
|
514
577
|
Object.values(this.subscriptions).forEach(({ data$ }) => data$.complete());
|
515
578
|
this.subscriptions = {};
|
516
579
|
if (this.stateId$.value) {
|
@@ -522,9 +585,9 @@ class FlowStateService {
|
|
522
585
|
this.cleanup$.next();
|
523
586
|
}
|
524
587
|
get hasUnsavedChanges() {
|
525
|
-
return this.
|
588
|
+
return this.flowInfoService.flow.properties.stateful
|
526
589
|
? Array.from(this.trackedStatefulChangesMap.values()).some(Boolean)
|
527
|
-
: this.
|
590
|
+
: this.salesTransactionService.hasUnsavedChanges;
|
528
591
|
}
|
529
592
|
get stateId() {
|
530
593
|
return this.stateId$.value;
|
@@ -533,14 +596,14 @@ class FlowStateService {
|
|
533
596
|
return this.executionInProgress$.asObservable();
|
534
597
|
}
|
535
598
|
isInitialized$() {
|
536
|
-
return combineLatest([this.stateId$, this.
|
599
|
+
return combineLatest([this.stateId$, this.salesTransactionService.isInitialized$]).pipe(map(values => values.some(Boolean)));
|
537
600
|
}
|
538
601
|
isInitialized() {
|
539
|
-
return Boolean(this.stateId$.value) || this.
|
602
|
+
return Boolean(this.stateId$.value) || this.salesTransactionService.isInitialized;
|
540
603
|
}
|
541
604
|
execute$(scope, exec) {
|
542
605
|
const request = this.execToRequest(scope, exec);
|
543
|
-
return this.executeRequest$(request).pipe(map
|
606
|
+
return this.executeRequest$(request).pipe(map(result => {
|
544
607
|
// Keep only requested results
|
545
608
|
const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
|
546
609
|
var _a;
|
@@ -557,7 +620,7 @@ class FlowStateService {
|
|
557
620
|
actions: [{ name: action, inputData }],
|
558
621
|
};
|
559
622
|
const request = this.execToRequest(scope, exec);
|
560
|
-
return this.executeRequest$(request).pipe(map
|
623
|
+
return this.executeRequest$(request).pipe(map(noop));
|
561
624
|
}
|
562
625
|
select$(scope, selectorName, inputData) {
|
563
626
|
const requestId = this.generateRequestId(scope, selectorName, inputData);
|
@@ -569,7 +632,7 @@ class FlowStateService {
|
|
569
632
|
},
|
570
633
|
},
|
571
634
|
});
|
572
|
-
return this.executeRequest$(request).pipe(map
|
635
|
+
return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
|
573
636
|
}
|
574
637
|
subscribe$(scope, selectorName, inputData, options) {
|
575
638
|
const requestId = this.generateRequestId(scope, selectorName, inputData);
|
@@ -595,7 +658,7 @@ class FlowStateService {
|
|
595
658
|
this.executeRequest$(request).subscribe();
|
596
659
|
}
|
597
660
|
}
|
598
|
-
return subscription.data$.pipe(filter
|
661
|
+
return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), finalize(() => {
|
599
662
|
var _a;
|
600
663
|
if (!((_a = this.subscriptions[requestId]) === null || _a === void 0 ? void 0 : _a.data$.observed)) {
|
601
664
|
delete this.subscriptions[requestId];
|
@@ -603,9 +666,9 @@ class FlowStateService {
|
|
603
666
|
}));
|
604
667
|
}
|
605
668
|
save$() {
|
606
|
-
if (this.
|
669
|
+
if (this.flowInfoService.flow.properties.stateful) {
|
607
670
|
if (this.stateId$.value) {
|
608
|
-
return this.flowStateApiService.save(this.stateId$.value).pipe(tap
|
671
|
+
return this.flowStateApiService.save(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })), tap(() => {
|
609
672
|
Array.from(this.trackedStatefulChangesMap.keys()).forEach(key => {
|
610
673
|
this.trackedStatefulChangesMap.set(key, false);
|
611
674
|
});
|
@@ -613,30 +676,26 @@ class FlowStateService {
|
|
613
676
|
}
|
614
677
|
}
|
615
678
|
else {
|
616
|
-
const
|
617
|
-
if (
|
618
|
-
return this.
|
619
|
-
this.contextService.update({ properties: { VELOCE_PRISM__VersionId__c: versionId } });
|
620
|
-
}));
|
679
|
+
const state = this.salesTransactionService.state;
|
680
|
+
if (state) {
|
681
|
+
return this.salesTransactionApiService.upsert(state);
|
621
682
|
}
|
622
683
|
}
|
623
|
-
return of({
|
684
|
+
return of({ id: '' });
|
624
685
|
}
|
625
686
|
submit$() {
|
626
|
-
if (this.
|
687
|
+
if (this.flowInfoService.flow.properties.stateful) {
|
627
688
|
if (this.stateId$.value) {
|
628
|
-
return this.flowStateApiService.submit(this.stateId$.value);
|
689
|
+
return this.flowStateApiService.submit(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })));
|
629
690
|
}
|
630
691
|
}
|
631
692
|
else {
|
632
|
-
const
|
633
|
-
if (
|
634
|
-
return this.
|
635
|
-
this.contextService.update({ properties: { VELOCE_PRISM__VersionId__c: versionId } });
|
636
|
-
}));
|
693
|
+
const state = this.salesTransactionService.state;
|
694
|
+
if (state) {
|
695
|
+
return this.salesTransactionApiService.submit(state);
|
637
696
|
}
|
638
697
|
}
|
639
|
-
return of({
|
698
|
+
return of({ id: '' });
|
640
699
|
}
|
641
700
|
getFlowStore() {
|
642
701
|
return this.flowStore;
|
@@ -677,10 +736,10 @@ class FlowStateService {
|
|
677
736
|
fullRequest.selectors = assign(fullRequest.selectors, subscription.request.selectors);
|
678
737
|
}
|
679
738
|
}
|
680
|
-
const execution$ = this.
|
739
|
+
const execution$ = this.flowInfoService.flow.properties.stateful
|
681
740
|
? this.executeStateful$(fullRequest)
|
682
741
|
: this.executeStateless$(fullRequest);
|
683
|
-
return execution$.pipe(tap
|
742
|
+
return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
|
684
743
|
}
|
685
744
|
handleSelectorsResponse(selectors) {
|
686
745
|
Object.entries(selectors).forEach(([requestId, selectorResult]) => {
|
@@ -696,32 +755,21 @@ class FlowStateService {
|
|
696
755
|
});
|
697
756
|
}
|
698
757
|
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
758
|
const processorsList = flatten(Object.values(this.processors).map(ownerMap => Object.values(ownerMap !== null && ownerMap !== void 0 ? ownerMap : {})));
|
709
759
|
const processors = processorsList.length ? processorsList : undefined;
|
710
760
|
const selectors = Object.values(this.subscriptions)
|
711
761
|
.map(({ request }) => request.selectors)
|
712
762
|
.filter(isDefined)
|
713
763
|
.reduce((trunk, selectors) => (Object.assign(Object.assign({}, trunk), selectors)), {});
|
714
|
-
const request = this.getDefaultExecutionRequestDTO();
|
715
764
|
return this.flowStateApiService
|
716
765
|
.init({
|
717
|
-
quoteId: this.
|
718
|
-
params:
|
766
|
+
quoteId: this.flowInfoService.context.headerId,
|
767
|
+
params: this.flowInfoService.context,
|
719
768
|
actionsOverride: processors === null || processors === void 0 ? void 0 : processors.filter(processor => processor.type === ConfigurationProcessorTypes.ACTION),
|
720
769
|
selectorsOverride: processors === null || processors === void 0 ? void 0 : processors.filter(processor => processor.type === ConfigurationProcessorTypes.SELECTOR),
|
721
|
-
selectors:
|
722
|
-
actions: request.actions,
|
770
|
+
selectors: selectors,
|
723
771
|
})
|
724
|
-
.pipe(map
|
772
|
+
.pipe(map(({ stateId, selectors }) => {
|
725
773
|
this.handleSelectorsResponse(selectors);
|
726
774
|
this.stateId$.next(stateId);
|
727
775
|
}));
|
@@ -741,80 +789,50 @@ class FlowStateService {
|
|
741
789
|
};
|
742
790
|
this.executionInProgress$.next(true);
|
743
791
|
return this.flowStateApiService.execute(this.stateId$.value, request);
|
744
|
-
}), tap
|
792
|
+
}), tap(({ stateId }) => this.stateId$.next(stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
|
745
793
|
this.executionInProgress$.next(false);
|
746
794
|
return throwError(() => e);
|
747
795
|
}));
|
748
796
|
}
|
749
797
|
executeStateful$(request) {
|
750
|
-
return this.executionInProgress$.pipe(filter
|
798
|
+
return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
|
751
799
|
// make sure stream switches to statefulExecutionRequest$ before pushing an execution request
|
752
800
|
combineLatest([
|
753
801
|
this.statefulExecutionRequest$,
|
754
|
-
of(undefined).pipe(tap
|
755
|
-
])), map
|
802
|
+
of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
|
803
|
+
])), map(([response]) => response), take(1));
|
756
804
|
}
|
757
805
|
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);
|
806
|
+
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
807
|
}
|
792
808
|
executeStateless$(request) {
|
793
809
|
this.executionInProgress$.next(true);
|
794
|
-
return of(undefined).pipe(tap
|
810
|
+
return of(undefined).pipe(tap(() => this.executeStatelessActions(request)), switchMap(() => {
|
795
811
|
var _a;
|
796
812
|
/*
|
797
813
|
Skip price calculation in case
|
798
814
|
1. No actions in the request
|
799
815
|
2. Initialization process execution (state not initialized yet)
|
800
816
|
*/
|
801
|
-
|
817
|
+
const { state } = this.salesTransactionService;
|
818
|
+
if (!state || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length) || !this.isInitialized()) {
|
802
819
|
return of(undefined);
|
803
820
|
}
|
804
821
|
else {
|
805
|
-
return this.calculate$();
|
822
|
+
return this.flowConfiguration.calculate$(state);
|
806
823
|
}
|
807
|
-
}), map
|
824
|
+
}), map(() => this.executeStatelessSelectors(request)), tap(() => this.executionInProgress$.next(false)), catchError(e => {
|
808
825
|
this.executionInProgress$.next(false);
|
809
826
|
return throwError(() => e);
|
810
827
|
}));
|
811
828
|
}
|
812
829
|
executeStatelessActions(request) {
|
813
830
|
var _a;
|
814
|
-
|
831
|
+
const state = this.salesTransactionService.state;
|
832
|
+
if (!state || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
|
815
833
|
return;
|
816
834
|
}
|
817
|
-
let flowState =
|
835
|
+
let flowState = state;
|
818
836
|
request.actions.forEach(action => {
|
819
837
|
var _a;
|
820
838
|
try {
|
@@ -826,1022 +844,126 @@ class FlowStateService {
|
|
826
844
|
throw e;
|
827
845
|
}
|
828
846
|
});
|
829
|
-
this.
|
847
|
+
this.salesTransactionService.setState(flowState);
|
830
848
|
}
|
831
849
|
executeStatelessSelectors(request) {
|
832
850
|
var _a;
|
833
|
-
if (!this.
|
834
|
-
throw '
|
851
|
+
if (!this.salesTransactionService.state) {
|
852
|
+
throw 'State is not initialized';
|
835
853
|
}
|
836
|
-
const flowState = this.
|
854
|
+
const flowState = this.salesTransactionService.state;
|
837
855
|
return EntityUtil.entries((_a = request.selectors) !== null && _a !== void 0 ? _a : {}).reduce((result, [key, selector]) => {
|
838
856
|
try {
|
839
857
|
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();
|
858
|
+
success: true,
|
859
|
+
result: this.executeSelectorScript(flowState, selector),
|
860
|
+
};
|
861
|
+
}
|
862
|
+
catch (e) {
|
863
|
+
console.error(e);
|
864
|
+
result.selectors[key] = {
|
865
|
+
success: false,
|
866
|
+
errorMessage: String(e),
|
867
|
+
};
|
868
|
+
}
|
869
|
+
return result;
|
870
|
+
}, { stateId: '', selectors: {} });
|
1692
871
|
}
|
1693
|
-
|
1694
|
-
|
1695
|
-
|
1696
|
-
|
872
|
+
initProcessors$() {
|
873
|
+
var _a;
|
874
|
+
const hasOverrides = Boolean((_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors);
|
875
|
+
if (this.flowInfoService.flow.properties.stateful && !hasOverrides) {
|
876
|
+
// Skip initialization as backend will take processors from SF
|
877
|
+
return of(undefined);
|
1697
878
|
}
|
1698
|
-
|
1699
|
-
|
1700
|
-
|
1701
|
-
|
1702
|
-
|
1703
|
-
|
1704
|
-
|
1705
|
-
|
1706
|
-
|
1707
|
-
|
1708
|
-
|
1709
|
-
|
1710
|
-
|
1711
|
-
|
1712
|
-
|
1713
|
-
|
1714
|
-
if (!
|
1715
|
-
return of(
|
879
|
+
const owners$ = Object.values(this.flowInfoService.templates)
|
880
|
+
.map(template => {
|
881
|
+
var _a, _b, _c;
|
882
|
+
if (!template) {
|
883
|
+
return;
|
884
|
+
}
|
885
|
+
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);
|
886
|
+
return localProcessors$.pipe(switchMap(processors => processors ? of(processors) : this.processorsApiService.fetchConfigurationProcessors$(template.id)), tap(processors => {
|
887
|
+
const processorsMap = processors.reduce((acc, p) => {
|
888
|
+
acc[p.apiName] = p;
|
889
|
+
return acc;
|
890
|
+
}, {});
|
891
|
+
this.processors[template.id] = processorsMap;
|
892
|
+
}));
|
893
|
+
})
|
894
|
+
.filter(isDefined);
|
895
|
+
if (!owners$.length) {
|
896
|
+
return of(undefined);
|
1716
897
|
}
|
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());
|
898
|
+
return forkJoin(owners$).pipe(map(noop));
|
1722
899
|
}
|
1723
|
-
|
1724
|
-
|
1725
|
-
|
1726
|
-
|
1727
|
-
|
1728
|
-
|
1729
|
-
|
1730
|
-
return of(null);
|
900
|
+
executeActionScript(request, executable) {
|
901
|
+
var _a;
|
902
|
+
const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
|
903
|
+
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
904
|
+
const scope = this.getScopeByOwnerId(executable.ownerId);
|
905
|
+
const scopeText = scope ? ` in ${scope}` : '';
|
906
|
+
throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
|
1731
907
|
}
|
1732
|
-
return
|
1733
|
-
}
|
1734
|
-
delete(ids) {
|
1735
|
-
this.delete$(ids).subscribe();
|
908
|
+
return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
|
1736
909
|
}
|
1737
|
-
|
1738
|
-
|
1739
|
-
|
1740
|
-
|
910
|
+
executeSelectorScript(request, executable) {
|
911
|
+
var _a;
|
912
|
+
const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
|
913
|
+
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
914
|
+
const scope = this.getScopeByOwnerId(executable.ownerId);
|
915
|
+
const scopeText = scope ? ` in ${scope}` : '';
|
916
|
+
throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
|
1741
917
|
}
|
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());
|
918
|
+
return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
|
1744
919
|
}
|
1745
|
-
|
1746
|
-
|
1747
|
-
|
1748
|
-
|
920
|
+
executeProcessorScript(request, configurationProcessor, inputData) {
|
921
|
+
var _a;
|
922
|
+
const scope = this.getScopeByOwnerId((_a = configurationProcessor.ownerId) !== null && _a !== void 0 ? _a : '');
|
923
|
+
let functionToExecute = this.executedFunctions[scope + configurationProcessor.apiName];
|
924
|
+
if (!functionToExecute) {
|
925
|
+
const script = `${configurationProcessor.script}\nreturn transform;`;
|
926
|
+
const sourceMap = `\n//# sourceURL=${scope ? scope + '/' : ''}${configurationProcessor.apiName}.js`;
|
927
|
+
functionToExecute = new Function(script + sourceMap)();
|
928
|
+
this.executedFunctions[scope + configurationProcessor.apiName] = functionToExecute;
|
1749
929
|
}
|
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$();
|
930
|
+
return functionToExecute({
|
931
|
+
request,
|
932
|
+
inputData,
|
933
|
+
flowStore: this.flowStore,
|
934
|
+
});
|
1791
935
|
}
|
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
|
-
};
|
936
|
+
generateRequestId(scope, selectorName, inputData) {
|
937
|
+
const inputDataHash = UUID.hex(JSON.stringify(inputData) || '').slice(0, 8);
|
938
|
+
return `${scope}/${selectorName}/${inputDataHash}`;
|
1805
939
|
}
|
1806
|
-
|
1807
|
-
|
1808
|
-
|
1809
|
-
|
1810
|
-
|
1811
|
-
|
940
|
+
checkStatefulChanges(requestId, selectorResult) {
|
941
|
+
if (this.trackedStatefulChangesMap.has(requestId)) {
|
942
|
+
if (!this.initialStatefulData[requestId]) {
|
943
|
+
this.initialStatefulData[requestId] = selectorResult;
|
944
|
+
}
|
945
|
+
const hasChanges = !isEqual(this.initialStatefulData[requestId], selectorResult);
|
946
|
+
this.trackedStatefulChangesMap.set(requestId, hasChanges);
|
1812
947
|
}
|
1813
|
-
return this.proceduresApiService.apply$(request);
|
1814
948
|
}
|
1815
949
|
}
|
1816
|
-
|
1817
|
-
|
1818
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type:
|
950
|
+
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 });
|
951
|
+
FlowStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService });
|
952
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, decorators: [{
|
1819
953
|
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
|
-
}] });
|
954
|
+
}], ctorParameters: function () {
|
955
|
+
return [{ type: FlowConfigurationService }, { type: FlowInfoService }, { type: i3.FlowStateApiService }, { type: i1.ConfigurationProcessorsApiService }, { type: i1.SalesTransactionApiService }, { type: SalesTransactionService }, { type: i6.ToastService }, { type: undefined, decorators: [{
|
956
|
+
type: Optional
|
957
|
+
}, {
|
958
|
+
type: Inject,
|
959
|
+
args: [FLOW_CUSTOMIZATION]
|
960
|
+
}] }];
|
961
|
+
} });
|
1834
962
|
|
1835
963
|
class FlowStateConfigurationService {
|
1836
|
-
constructor(flowInfoService,
|
964
|
+
constructor(flowInfoService, flowStateService) {
|
1837
965
|
this.flowInfoService = flowInfoService;
|
1838
|
-
this.flowConfigurationService = flowConfigurationService;
|
1839
|
-
this.flowStateApiService = flowStateApiService;
|
1840
966
|
this.flowStateService = flowStateService;
|
1841
|
-
this.configurationStateId$ = new BehaviorSubject(null);
|
1842
|
-
}
|
1843
|
-
get configurationStateId() {
|
1844
|
-
return this.configurationStateId$.value;
|
1845
967
|
}
|
1846
968
|
addToCart$(props) {
|
1847
969
|
var _a;
|
@@ -1853,26 +975,22 @@ class FlowStateConfigurationService {
|
|
1853
975
|
request$ = of();
|
1854
976
|
}
|
1855
977
|
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
|
-
}));
|
978
|
+
// TODO: Implement
|
979
|
+
request$ = of();
|
1863
980
|
}
|
1864
981
|
}
|
1865
982
|
else {
|
1866
|
-
|
983
|
+
// TODO: Implement
|
984
|
+
request$ = of();
|
1867
985
|
}
|
1868
|
-
return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map
|
986
|
+
return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map(noop));
|
1869
987
|
}
|
1870
988
|
}
|
1871
|
-
FlowStateConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, deps: [{ token: FlowInfoService }, { token:
|
989
|
+
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
990
|
FlowStateConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService });
|
1873
991
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, decorators: [{
|
1874
992
|
type: Injectable
|
1875
|
-
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type:
|
993
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: FlowStateService }]; } });
|
1876
994
|
|
1877
995
|
class IntegrationState {
|
1878
996
|
constructor() {
|
@@ -1892,12 +1010,12 @@ class IntegrationState {
|
|
1892
1010
|
this.action$.next(action);
|
1893
1011
|
}
|
1894
1012
|
listen$(actionType) {
|
1895
|
-
return this.action$.pipe(filter
|
1013
|
+
return this.action$.pipe(filter(action => action.type === actionType), map(action => action.payload));
|
1896
1014
|
}
|
1897
1015
|
listenAll$() {
|
1898
1016
|
return this.action$.asObservable();
|
1899
1017
|
}
|
1900
|
-
|
1018
|
+
reset() {
|
1901
1019
|
this.stateSubj$.next({});
|
1902
1020
|
}
|
1903
1021
|
}
|
@@ -1908,8 +1026,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
1908
1026
|
}] });
|
1909
1027
|
|
1910
1028
|
class ProductImagesService {
|
1911
|
-
constructor(
|
1912
|
-
this.
|
1029
|
+
constructor(productsAdminApiService) {
|
1030
|
+
this.productsAdminApiService = productsAdminApiService;
|
1913
1031
|
this.imagesMap$ = new BehaviorSubject({});
|
1914
1032
|
}
|
1915
1033
|
getImageUrl$(productId) {
|
@@ -1917,157 +1035,151 @@ class ProductImagesService {
|
|
1917
1035
|
this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: '' }));
|
1918
1036
|
this.fetchProductImage(productId);
|
1919
1037
|
}
|
1920
|
-
return this.imagesMap$.pipe(map
|
1038
|
+
return this.imagesMap$.pipe(map(imagesMap => { var _a; return (_a = imagesMap[productId]) !== null && _a !== void 0 ? _a : null; }), distinctUntilChanged());
|
1921
1039
|
}
|
1922
1040
|
fetchProductImage(productId) {
|
1923
|
-
this.
|
1041
|
+
this.productsAdminApiService
|
1924
1042
|
.fetchImage$(productId)
|
1925
|
-
.pipe(map
|
1043
|
+
.pipe(map(file => URL.createObjectURL(file)), catchError(() => of('')), tap(url => this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: url }))))
|
1926
1044
|
.subscribe();
|
1927
1045
|
}
|
1928
1046
|
}
|
1929
|
-
ProductImagesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, deps: [{ token: i1.
|
1047
|
+
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
1048
|
ProductImagesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService });
|
1931
1049
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, decorators: [{
|
1932
1050
|
type: Injectable
|
1933
|
-
}], ctorParameters: function () { return [{ type: i1.
|
1051
|
+
}], ctorParameters: function () { return [{ type: i1.ProductsAdminApiService }]; } });
|
1934
1052
|
|
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
|
-
}));
|
1053
|
+
class ConfigurationService {
|
1054
|
+
get state$() {
|
1055
|
+
return this.configurationStateSubj$.asObservable().pipe(filter$1(isDefined));
|
1960
1056
|
}
|
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];
|
1057
|
+
get state() {
|
1058
|
+
return this.configurationStateSubj$.getValue();
|
1965
1059
|
}
|
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 = {};
|
1060
|
+
get previousState() {
|
1061
|
+
return this.previousConfigurationStateSubj$.getValue();
|
1980
1062
|
}
|
1981
|
-
|
1982
|
-
this.
|
1983
|
-
this._runtimeContext = undefined;
|
1984
|
-
this.initializationProps = undefined;
|
1985
|
-
this.uiDefinitionProperties = {};
|
1063
|
+
get root$() {
|
1064
|
+
return this.state$.pipe(map$1(state => state.salesTransactionItems[0]), filter$1(isDefined));
|
1986
1065
|
}
|
1987
|
-
|
1066
|
+
get root() {
|
1988
1067
|
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)));
|
1068
|
+
return (_b = (_a = this.configurationStateSubj$.getValue()) === null || _a === void 0 ? void 0 : _a.salesTransactionItems[0]) !== null && _b !== void 0 ? _b : null;
|
2007
1069
|
}
|
2008
|
-
|
2009
|
-
this.
|
2010
|
-
|
2011
|
-
|
2012
|
-
|
2013
|
-
|
2014
|
-
|
2015
|
-
|
2016
|
-
|
2017
|
-
|
2018
|
-
|
2019
|
-
this.contextService.update({
|
2020
|
-
properties: Object.assign(Object.assign({}, this._runtimeContext.properties), context.properties),
|
2021
|
-
});
|
2022
|
-
}
|
2023
|
-
return this._runtimeContext;
|
2024
|
-
}), tap(() => (this._isInitialized = true)));
|
1070
|
+
constructor(flowInfoService, messageService, configurationRuntimeService, salesTransactionService, orchestrationsApiService) {
|
1071
|
+
this.flowInfoService = flowInfoService;
|
1072
|
+
this.messageService = messageService;
|
1073
|
+
this.configurationRuntimeService = configurationRuntimeService;
|
1074
|
+
this.salesTransactionService = salesTransactionService;
|
1075
|
+
this.orchestrationsApiService = orchestrationsApiService;
|
1076
|
+
this.hasUnsavedChanges = false;
|
1077
|
+
this.configurationStateSubj$ = new BehaviorSubject(null);
|
1078
|
+
this.previousConfigurationStateSubj$ = new BehaviorSubject(null);
|
1079
|
+
this.isLoadingSubj$ = new BehaviorSubject(false);
|
1080
|
+
this.isLoading$ = this.isLoadingSubj$.asObservable();
|
2025
1081
|
}
|
2026
|
-
|
1082
|
+
reset() {
|
1083
|
+
this.hasUnsavedChanges = false;
|
1084
|
+
this.configurationStateSubj$.next(null);
|
1085
|
+
this.previousConfigurationStateSubj$.next(null);
|
1086
|
+
}
|
1087
|
+
init$() {
|
2027
1088
|
var _a;
|
2028
|
-
|
2029
|
-
|
1089
|
+
const { state } = this.salesTransactionService;
|
1090
|
+
const { productId, transactionItemId } = this.flowInfoService.context;
|
1091
|
+
if (!state) {
|
1092
|
+
return of(undefined);
|
2030
1093
|
}
|
2031
|
-
|
2032
|
-
|
1094
|
+
let transactionItem = state === null || state === void 0 ? void 0 : state.salesTransactionItems.find(item => item.id === transactionItemId);
|
1095
|
+
if (!transactionItem && productId) {
|
1096
|
+
transactionItem =
|
1097
|
+
(_a = state.salesTransactionItems.find(item => item.productId === productId)) !== null && _a !== void 0 ? _a : generateTransactionItem(productId);
|
1098
|
+
}
|
1099
|
+
const configurationState = Object.assign(Object.assign({}, state), { salesTransactionItems: transactionItem ? [transactionItem] : [] });
|
1100
|
+
this.configurationStateSubj$.next(configurationState);
|
1101
|
+
this.previousConfigurationStateSubj$.next(configurationState);
|
1102
|
+
return of(undefined);
|
2033
1103
|
}
|
2034
|
-
|
2035
|
-
|
2036
|
-
|
1104
|
+
patch$(transactionItem) {
|
1105
|
+
const { state, root } = this;
|
1106
|
+
if (!state) {
|
1107
|
+
return throwError(() => new Error(`Configuration State is not initialized`));
|
2037
1108
|
}
|
2038
|
-
|
2039
|
-
|
2040
|
-
source[propertyName] = SalesforceIdUtils.generateId18FromId15(value);
|
1109
|
+
if (!root) {
|
1110
|
+
return throwError(() => new Error(`Root SalesTransactionItem not found`));
|
2041
1111
|
}
|
1112
|
+
const newRoot = new TransactionItemWorker(root).replace(transactionItem).ti;
|
1113
|
+
const newSalesTransaction = Object.assign(Object.assign({}, state), { salesTransactionItems: [newRoot] });
|
1114
|
+
return this.configureRequest$(newSalesTransaction).pipe(catchError$1(error => {
|
1115
|
+
console.error(error);
|
1116
|
+
if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
|
1117
|
+
this.messageService.add({ severity: 'error', summary: error });
|
1118
|
+
}
|
1119
|
+
return throwError(() => error);
|
1120
|
+
}), tap$1(() => {
|
1121
|
+
if (!this.hasUnsavedChanges) {
|
1122
|
+
this.hasUnsavedChanges = true;
|
1123
|
+
}
|
1124
|
+
}), map$1(noop));
|
2042
1125
|
}
|
2043
|
-
|
2044
|
-
|
1126
|
+
patch(transactionItem) {
|
1127
|
+
this.patch$(transactionItem).subscribe();
|
2045
1128
|
}
|
2046
|
-
|
2047
|
-
|
2048
|
-
|
1129
|
+
configureRequest$(salesTransaction) {
|
1130
|
+
const request = {
|
1131
|
+
salesTransaction,
|
1132
|
+
};
|
1133
|
+
this.isLoadingSubj$.next(true);
|
1134
|
+
return this.orchestrationsApiService.apply$(request).pipe(tap$1(result => {
|
1135
|
+
const newState = result.salesTransaction;
|
1136
|
+
this.configurationStateSubj$.next(newState);
|
1137
|
+
this.previousConfigurationStateSubj$.next(cloneDeep(newState));
|
1138
|
+
}), map$1(response => response.salesTransaction), catchError$1(error => throwError(() => {
|
1139
|
+
const resetState = this.previousConfigurationStateSubj$.getValue();
|
1140
|
+
if (resetState) {
|
1141
|
+
this.previousConfigurationStateSubj$.next(cloneDeep(resetState));
|
1142
|
+
this.configurationStateSubj$.next(resetState);
|
1143
|
+
}
|
1144
|
+
if (error.error) {
|
1145
|
+
return extractErrorDetails(error.error).join('. ');
|
1146
|
+
}
|
1147
|
+
return error.message || JSON.stringify(error);
|
1148
|
+
})), finalize$1(() => this.isLoadingSubj$.next(false)));
|
1149
|
+
}
|
1150
|
+
configureExternal$(props) {
|
1151
|
+
// TODO: implement
|
1152
|
+
throw new Error('Not implemented');
|
1153
|
+
}
|
1154
|
+
configureGuidedSelling$(data) {
|
1155
|
+
// TODO: implement
|
1156
|
+
throw new Error('Not implemented');
|
2049
1157
|
}
|
2050
|
-
|
2051
|
-
|
1158
|
+
getPCMModel() {
|
1159
|
+
const pcmModel = this.configurationRuntimeService.pcmModel;
|
1160
|
+
if (!pcmModel) {
|
1161
|
+
throw new Error('PCM model not initialized');
|
1162
|
+
}
|
1163
|
+
return pcmModel;
|
2052
1164
|
}
|
2053
1165
|
}
|
2054
|
-
|
2055
|
-
|
2056
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type:
|
1166
|
+
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 });
|
1167
|
+
ConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService });
|
1168
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, decorators: [{
|
2057
1169
|
type: Injectable
|
2058
|
-
}], ctorParameters: function () { return [{ type:
|
1170
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: i2.MessageService }, { type: ConfigurationRuntimeService }, { type: SalesTransactionService }, { type: i1.OrchestrationsApiService }]; } });
|
2059
1171
|
|
2060
1172
|
class ConfigurationStateService {
|
2061
|
-
constructor(configurationRuntimeService, configurationService,
|
1173
|
+
constructor(configurationRuntimeService, configurationService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, salesTransactionService, salesTransactionApiService, toastService) {
|
2062
1174
|
this.configurationRuntimeService = configurationRuntimeService;
|
2063
1175
|
this.configurationService = configurationService;
|
2064
|
-
this.quoteDraftService = quoteDraftService;
|
2065
|
-
this.toastService = toastService;
|
2066
1176
|
this.flowStateService = flowStateService;
|
2067
1177
|
this.flowInfoService = flowInfoService;
|
2068
1178
|
this.flowConfigurationService = flowConfigurationService;
|
2069
1179
|
this.flowStateApiService = flowStateApiService;
|
2070
|
-
this.
|
1180
|
+
this.salesTransactionService = salesTransactionService;
|
1181
|
+
this.salesTransactionApiService = salesTransactionApiService;
|
1182
|
+
this.toastService = toastService;
|
2071
1183
|
this.isInitialized$ = new BehaviorSubject(false);
|
2072
1184
|
this.canceledConfiguration$ = new Subject();
|
2073
1185
|
this.NOT_INITIALIZED = Symbol();
|
@@ -2091,9 +1203,9 @@ class ConfigurationStateService {
|
|
2091
1203
|
request$ = this.initStateful$();
|
2092
1204
|
}
|
2093
1205
|
else {
|
2094
|
-
request$ = this.
|
1206
|
+
request$ = this.configurationService.init$();
|
2095
1207
|
}
|
2096
|
-
return request$.pipe(
|
1208
|
+
return request$.pipe(take(1), tap(() => {
|
2097
1209
|
this.isInitialized$.next(true);
|
2098
1210
|
this.canceledConfiguration$ = new Subject();
|
2099
1211
|
}));
|
@@ -2107,10 +1219,11 @@ class ConfigurationStateService {
|
|
2107
1219
|
this.configurationStore = {};
|
2108
1220
|
this.executedFunctions = {};
|
2109
1221
|
this.configurationService.reset();
|
1222
|
+
this.configurationRuntimeService.reset();
|
2110
1223
|
}
|
2111
1224
|
execute$(exec) {
|
2112
1225
|
const request = this.execToRequest(exec);
|
2113
|
-
return this.executeRequest$(request).pipe(map
|
1226
|
+
return this.executeRequest$(request).pipe(map(result => {
|
2114
1227
|
// Keep only requested results
|
2115
1228
|
const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
|
2116
1229
|
var _a;
|
@@ -2133,7 +1246,7 @@ class ConfigurationStateService {
|
|
2133
1246
|
}
|
2134
1247
|
// prevent parallel configuration requests in stateless mode
|
2135
1248
|
if (!this.statelessExecutionRequest$) {
|
2136
|
-
this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay
|
1249
|
+
this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay(), take(1), finalize(() => (this.statelessExecutionRequest$ = null)));
|
2137
1250
|
}
|
2138
1251
|
return this.statelessExecutionRequest$;
|
2139
1252
|
}
|
@@ -2147,7 +1260,7 @@ class ConfigurationStateService {
|
|
2147
1260
|
},
|
2148
1261
|
},
|
2149
1262
|
});
|
2150
|
-
return this.executeRequest$(request).pipe(map
|
1263
|
+
return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
|
2151
1264
|
}
|
2152
1265
|
subscribe$(selectorName, inputData = {}, options) {
|
2153
1266
|
const requestId = UUID.UUID();
|
@@ -2170,58 +1283,41 @@ class ConfigurationStateService {
|
|
2170
1283
|
this.executeRequest$(request).subscribe();
|
2171
1284
|
}
|
2172
1285
|
}
|
2173
|
-
return subscription.data$.pipe(filter
|
1286
|
+
return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), distinctUntilChanged(), finalize(() => {
|
2174
1287
|
var _a;
|
2175
1288
|
if (!((_a = this.subscriptions[requestId]) === null || _a === void 0 ? void 0 : _a.data$.observed)) {
|
2176
1289
|
delete this.subscriptions[requestId];
|
2177
1290
|
}
|
2178
1291
|
}), takeUntil(this.canceledConfiguration$));
|
2179
1292
|
}
|
2180
|
-
saveConfiguration(
|
2181
|
-
var _a, _b
|
1293
|
+
saveConfiguration() {
|
1294
|
+
var _a, _b;
|
2182
1295
|
if (this.isStatefulConfiguration) {
|
2183
|
-
return this.flowStateApiService
|
2184
|
-
|
2185
|
-
|
1296
|
+
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 })));
|
1297
|
+
}
|
1298
|
+
const state = this.salesTransactionService.state;
|
1299
|
+
if (!state) {
|
1300
|
+
return of({ id: '' });
|
1301
|
+
}
|
1302
|
+
const { standalone } = this.flowInfoService.flow.properties;
|
1303
|
+
if (standalone) {
|
1304
|
+
return this.salesTransactionApiService.upsert(state);
|
1305
|
+
}
|
1306
|
+
const salesTransaction = this.salesTransactionService.state;
|
1307
|
+
const configurationRoot = this.configurationService.root;
|
1308
|
+
if (!salesTransaction || !configurationRoot) {
|
1309
|
+
return of({ id: '' });
|
1310
|
+
}
|
1311
|
+
const isNewTransactionItem = salesTransaction.salesTransactionItems.every(li => li.id !== configurationRoot.id);
|
1312
|
+
let salesTransactionItems;
|
1313
|
+
if (isNewTransactionItem) {
|
1314
|
+
salesTransactionItems = [...salesTransaction.salesTransactionItems, configurationRoot];
|
2186
1315
|
}
|
2187
1316
|
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
|
-
}
|
1317
|
+
salesTransactionItems = salesTransaction.salesTransactionItems.map(ti => ti.id === configurationRoot.id ? configurationRoot : ti);
|
2224
1318
|
}
|
1319
|
+
const newState = Object.assign(Object.assign({}, salesTransaction), { salesTransactionItems });
|
1320
|
+
return this.flowConfigurationService.calculate$(newState).pipe(map(() => ({ id: '' })));
|
2225
1321
|
}
|
2226
1322
|
cancelConfiguration() {
|
2227
1323
|
var _a, _b;
|
@@ -2242,37 +1338,33 @@ class ConfigurationStateService {
|
|
2242
1338
|
return (_b = (_a = this.flowInfoService.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful) !== null && _b !== void 0 ? _b : false;
|
2243
1339
|
}
|
2244
1340
|
initStateful$() {
|
2245
|
-
var _a, _b, _c, _d, _e, _f
|
2246
|
-
this.ownerId = (
|
2247
|
-
const
|
2248
|
-
if (!this.flowStateService.stateId) {
|
1341
|
+
var _a, _b, _c, _d, _e, _f;
|
1342
|
+
this.ownerId = (_b = (_a = this.configurationRuntimeService.uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : '';
|
1343
|
+
const { productId, transactionItemId } = this.flowInfoService.context;
|
1344
|
+
if (!productId || !this.flowStateService.stateId) {
|
2249
1345
|
return of(undefined);
|
2250
1346
|
}
|
2251
|
-
const container =
|
2252
|
-
const lineItem = this.configurationService.generateLineItem();
|
1347
|
+
const container = this.configurationRuntimeService.uiDefinitionContainer;
|
2253
1348
|
let request$;
|
2254
|
-
if (!
|
1349
|
+
if (!transactionItemId) {
|
2255
1350
|
request$ = this.flowStateApiService.newConfiguration(this.flowStateService.stateId, {
|
2256
|
-
|
2257
|
-
actionsOverride: (
|
2258
|
-
selectorsOverride: (
|
1351
|
+
transactionItem: generateTransactionItem(productId),
|
1352
|
+
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 }))),
|
1353
|
+
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
1354
|
});
|
2260
1355
|
}
|
2261
1356
|
else {
|
2262
1357
|
request$ = this.flowStateApiService.startConfiguration(this.flowStateService.stateId, {
|
2263
|
-
|
2264
|
-
actionsOverride: (
|
2265
|
-
selectorsOverride: (
|
1358
|
+
transactionItemId,
|
1359
|
+
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 }))),
|
1360
|
+
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
1361
|
});
|
2267
1362
|
}
|
2268
|
-
return request$.pipe(map
|
1363
|
+
return request$.pipe(map(r => {
|
2269
1364
|
this.stateId = r.stateId;
|
2270
1365
|
return undefined;
|
2271
1366
|
}));
|
2272
1367
|
}
|
2273
|
-
initStateless$() {
|
2274
|
-
return this.configurationService.configure().pipe(map$1(() => undefined));
|
2275
|
-
}
|
2276
1368
|
execToRequest(exec) {
|
2277
1369
|
var _a;
|
2278
1370
|
return {
|
@@ -2318,39 +1410,37 @@ class ConfigurationStateService {
|
|
2318
1410
|
else {
|
2319
1411
|
execution$ = this.executeStateless$(fullRequest);
|
2320
1412
|
}
|
2321
|
-
return execution$.pipe(tap
|
1413
|
+
return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
|
2322
1414
|
}
|
2323
1415
|
executeStateless$(request) {
|
2324
1416
|
this.executionInProgress$.next(true);
|
2325
|
-
return
|
1417
|
+
return this.configurationService.state$.pipe(switchMap(state => {
|
2326
1418
|
var _a;
|
2327
1419
|
// Apply actions and execute configuration/price call
|
2328
1420
|
// No need to run configuration if no actions in the request
|
2329
1421
|
if (!((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
|
2330
1422
|
return of(undefined);
|
2331
1423
|
}
|
2332
|
-
let configurationRequest = this.configurationService.generateRequest(false);
|
2333
1424
|
request.actions.forEach(action => {
|
2334
1425
|
var _a;
|
2335
|
-
|
1426
|
+
state = (_a = this.executeActionScript(state, action)) !== null && _a !== void 0 ? _a : state;
|
2336
1427
|
});
|
2337
|
-
|
2338
|
-
|
2339
|
-
}), map$1(() => {
|
1428
|
+
return this.configurationService.configureRequest$(state);
|
1429
|
+
}), map(() => {
|
2340
1430
|
// Run selectors and apply them to the state
|
2341
|
-
const configurationState = this.configurationService.
|
1431
|
+
const configurationState = this.configurationService.state;
|
2342
1432
|
if (!configurationState) {
|
2343
1433
|
return { stateId: '', selectors: {} };
|
2344
1434
|
}
|
2345
1435
|
return this.runStatelessSelectors(request, configurationState);
|
2346
|
-
}), tap
|
2347
|
-
const configurationState = this.configurationService.
|
1436
|
+
}), tap(() => this.executionInProgress$.next(false)), catchError(error => {
|
1437
|
+
const configurationState = this.configurationService.previousState;
|
2348
1438
|
if (configurationState) {
|
2349
1439
|
const selectorsResult = this.runStatelessSelectors(request, configurationState);
|
2350
1440
|
this.handleSelectorsResponse(selectorsResult.selectors);
|
2351
1441
|
}
|
2352
1442
|
this.executionInProgress$.next(false);
|
2353
|
-
if (!this.configurationRuntimeService.
|
1443
|
+
if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
|
2354
1444
|
this.toastService.add({ severity: ToastType.error, summary: String(error) });
|
2355
1445
|
}
|
2356
1446
|
return throwError(() => error);
|
@@ -2371,22 +1461,22 @@ class ConfigurationStateService {
|
|
2371
1461
|
};
|
2372
1462
|
this.executionInProgress$.next(true);
|
2373
1463
|
return this.flowStateApiService.executeConfiguration(this.flowStateService.stateId, this.stateId, request);
|
2374
|
-
}), tap
|
1464
|
+
}), tap(({ stateId }) => (this.stateId = stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
|
2375
1465
|
this.executionInProgress$.next(false);
|
2376
1466
|
return throwError(() => e);
|
2377
1467
|
}));
|
2378
1468
|
}
|
2379
1469
|
executeStateful$(request) {
|
2380
|
-
return this.executionInProgress$.pipe(filter
|
1470
|
+
return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
|
2381
1471
|
// make sure stream switches to statefulExecutionRequest$ before pushing an execution request
|
2382
1472
|
combineLatest([
|
2383
1473
|
this.statefulExecutionRequest$,
|
2384
|
-
of(undefined).pipe(tap
|
2385
|
-
])), map
|
1474
|
+
of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
|
1475
|
+
])), map(([response]) => response), take(1));
|
2386
1476
|
}
|
2387
1477
|
executeActionScript(request, processor) {
|
2388
|
-
var _a
|
2389
|
-
const { actions } = (
|
1478
|
+
var _a;
|
1479
|
+
const { actions } = (_a = this.configurationRuntimeService.uiDefinitionContainer) !== null && _a !== void 0 ? _a : {};
|
2390
1480
|
const configurationProcessor = actions === null || actions === void 0 ? void 0 : actions.find(action => action.apiName === processor.apiName);
|
2391
1481
|
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
2392
1482
|
throw `ConfigurationProcessor ${processor.apiName} not found`;
|
@@ -2394,8 +1484,8 @@ class ConfigurationStateService {
|
|
2394
1484
|
return this.executeProcessorScript(request, configurationProcessor, processor.inputData);
|
2395
1485
|
}
|
2396
1486
|
executeSelectorScript(request, processor) {
|
2397
|
-
var _a
|
2398
|
-
const { selectors } = (
|
1487
|
+
var _a;
|
1488
|
+
const { selectors } = (_a = this.configurationRuntimeService.uiDefinitionContainer) !== null && _a !== void 0 ? _a : {};
|
2399
1489
|
const configurationProcessor = selectors === null || selectors === void 0 ? void 0 : selectors.find(selector => selector.apiName === processor.apiName);
|
2400
1490
|
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
2401
1491
|
throw `ConfigurationProcessor ${processor.apiName} not found`;
|
@@ -2437,25 +1527,73 @@ class ConfigurationStateService {
|
|
2437
1527
|
}, { stateId: '', selectors: {} });
|
2438
1528
|
}
|
2439
1529
|
}
|
2440
|
-
ConfigurationStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, deps: [{ token: ConfigurationRuntimeService }, { token: ConfigurationService }, { token:
|
1530
|
+
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
1531
|
ConfigurationStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService });
|
2442
1532
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, decorators: [{
|
2443
1533
|
type: Injectable
|
2444
|
-
}], ctorParameters: function () { return [{ type: ConfigurationRuntimeService }, { type: ConfigurationService }, { type:
|
1534
|
+
}], 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
1535
|
|
2446
1536
|
class ConfigurationModule {
|
2447
1537
|
}
|
2448
1538
|
ConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
2449
1539
|
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: [
|
1540
|
+
ConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, providers: [
|
1541
|
+
ConfigurationService,
|
1542
|
+
ConfigurationStateService,
|
1543
|
+
ConfigurationRuntimeService,
|
1544
|
+
TestModeConfigurationService,
|
1545
|
+
], imports: [ConfirmationDialogModule, ApiModule] });
|
2451
1546
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, decorators: [{
|
2452
1547
|
type: NgModule,
|
2453
1548
|
args: [{
|
2454
1549
|
imports: [ConfirmationDialogModule, ApiModule],
|
2455
|
-
providers: [
|
1550
|
+
providers: [
|
1551
|
+
ConfigurationService,
|
1552
|
+
ConfigurationStateService,
|
1553
|
+
ConfigurationRuntimeService,
|
1554
|
+
TestModeConfigurationService,
|
1555
|
+
],
|
1556
|
+
}]
|
1557
|
+
}] });
|
1558
|
+
|
1559
|
+
class FlowConfigurationModule {
|
1560
|
+
}
|
1561
|
+
FlowConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
1562
|
+
FlowConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, imports: [ApiModule] });
|
1563
|
+
FlowConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, providers: [FlowConfigurationService], imports: [ApiModule] });
|
1564
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, decorators: [{
|
1565
|
+
type: NgModule,
|
1566
|
+
args: [{
|
1567
|
+
imports: [ApiModule],
|
1568
|
+
providers: [FlowConfigurationService],
|
2456
1569
|
}]
|
2457
1570
|
}] });
|
2458
1571
|
|
1572
|
+
class CatalogProductsService {
|
1573
|
+
constructor() {
|
1574
|
+
this.stateSubj$ = new BehaviorSubject(null);
|
1575
|
+
this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
|
1576
|
+
}
|
1577
|
+
get state() {
|
1578
|
+
return this.stateSubj$.getValue();
|
1579
|
+
}
|
1580
|
+
reset() {
|
1581
|
+
this.stateSubj$.next(null);
|
1582
|
+
}
|
1583
|
+
setState(state) {
|
1584
|
+
this.stateSubj$.next(state);
|
1585
|
+
}
|
1586
|
+
}
|
1587
|
+
CatalogProductsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
1588
|
+
CatalogProductsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService });
|
1589
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService, decorators: [{
|
1590
|
+
type: Injectable
|
1591
|
+
}] });
|
1592
|
+
|
1593
|
+
const FORMATTING_SETTINGS_TOKEN = new InjectionToken('Summary of formatting settings for variant types of data, e.g. numbers, text, dates, etc');
|
1594
|
+
|
1595
|
+
const UI_DEFINITION_VERSION = 3;
|
1596
|
+
|
2459
1597
|
const DEFAULT_FORMATTING_SETTINGS = {
|
2460
1598
|
currencySymbol: DEFAULT_CURRENCY_SYMBOL,
|
2461
1599
|
decimalsCount: DEFAULT_DECIMALS_COUNT,
|
@@ -2469,14 +1607,14 @@ class SdkCoreModule {
|
|
2469
1607
|
SdkCoreModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
2470
1608
|
SdkCoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, imports: [ConfigurationModule, FlowConfigurationModule] });
|
2471
1609
|
SdkCoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, providers: [
|
2472
|
-
ContextService,
|
2473
1610
|
FlowInfoService,
|
2474
|
-
QuoteDraftService,
|
2475
1611
|
ProductImagesService,
|
2476
1612
|
IntegrationState,
|
2477
1613
|
FlowStateService,
|
2478
1614
|
FlowStateConfigurationService,
|
2479
1615
|
RuntimeSettingsService,
|
1616
|
+
SalesTransactionService,
|
1617
|
+
CatalogProductsService,
|
2480
1618
|
{
|
2481
1619
|
provide: FORMATTING_SETTINGS_TOKEN,
|
2482
1620
|
useExisting: RuntimeSettingsService,
|
@@ -2487,14 +1625,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
2487
1625
|
args: [{
|
2488
1626
|
imports: [ConfigurationModule, FlowConfigurationModule],
|
2489
1627
|
providers: [
|
2490
|
-
ContextService,
|
2491
1628
|
FlowInfoService,
|
2492
|
-
QuoteDraftService,
|
2493
1629
|
ProductImagesService,
|
2494
1630
|
IntegrationState,
|
2495
1631
|
FlowStateService,
|
2496
1632
|
FlowStateConfigurationService,
|
2497
1633
|
RuntimeSettingsService,
|
1634
|
+
SalesTransactionService,
|
1635
|
+
CatalogProductsService,
|
2498
1636
|
{
|
2499
1637
|
provide: FORMATTING_SETTINGS_TOKEN,
|
2500
1638
|
useExisting: RuntimeSettingsService,
|
@@ -2679,5 +1817,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
2679
1817
|
* Generated bundle index. Do not edit.
|
2680
1818
|
*/
|
2681
1819
|
|
2682
|
-
export { ActionCodePipe, CalendarDirective, ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService,
|
1820
|
+
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, TestModeConfigurationService, TransactionItemWorker, UI_DEFINITION_VERSION, extractMetadata, findTransactionItem, findTransactionItemWithComparator, generateTransactionItem, insertTransactionItem, removeTransactionItem, replaceTransactionItem };
|
2683
1821
|
//# sourceMappingURL=veloceapps-sdk-core.mjs.map
|