@veloceapps/sdk 11.0.0-4 → 11.0.0-40
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 +18 -41
- package/core/index.d.ts +1 -1
- package/core/modules/configuration/index.d.ts +3 -4
- package/core/modules/configuration/services/configuration-runtime.service.d.ts +8 -19
- package/core/modules/configuration/services/configuration-state.service.d.ts +8 -8
- package/core/modules/configuration/services/configuration.service.d.ts +23 -47
- package/core/modules/configuration/services/test-mode-configuration.service.d.ts +20 -0
- package/core/modules/configuration/types/configuration-runtime.types.d.ts +0 -3
- package/core/modules/configuration/types/index.d.ts +2 -0
- package/core/modules/flow-configuration/index.d.ts +0 -3
- package/core/modules/flow-configuration/services/flow-configuration.service.d.ts +11 -40
- package/core/operators/filter-successful-execute.operator.d.ts +3 -0
- package/core/operators/index.d.ts +1 -0
- package/core/services/catalog-products.service.d.ts +11 -0
- package/core/services/flow-info.service.d.ts +28 -12
- package/core/services/flow-state-configuration.service.d.ts +2 -8
- package/core/services/flow-state.service.d.ts +13 -22
- package/core/services/index.d.ts +3 -3
- package/core/services/integration.state.d.ts +1 -1
- package/core/services/product-images.service.d.ts +3 -3
- package/core/services/runtime-settings.service.d.ts +1 -1
- package/core/services/sales-transaction.service.d.ts +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/elements-resolver.mjs +16 -5
- package/esm2020/cms/utils/path.utils.mjs +1 -10
- package/esm2020/cms/vendor-map.mjs +18 -19
- package/esm2020/core/core.module.mjs +7 -7
- package/esm2020/core/index.mjs +2 -2
- package/esm2020/core/modules/configuration/configuration.module.mjs +14 -4
- package/esm2020/core/modules/configuration/index.mjs +4 -5
- package/esm2020/core/modules/configuration/services/configuration-runtime.service.mjs +16 -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/configuration/types/index.mjs +3 -0
- package/esm2020/core/modules/flow-configuration/flow-configuration.module.mjs +3 -4
- package/esm2020/core/modules/flow-configuration/index.mjs +1 -4
- package/esm2020/core/modules/flow-configuration/services/flow-configuration.service.mjs +34 -127
- package/esm2020/core/operators/filter-successful-execute.operator.mjs +5 -0
- package/esm2020/core/operators/index.mjs +2 -0
- package/esm2020/core/services/catalog-products.service.mjs +25 -0
- package/esm2020/core/services/flow-info.service.mjs +95 -31
- package/esm2020/core/services/flow-state-configuration.service.mjs +10 -25
- package/esm2020/core/services/flow-state.service.mjs +60 -172
- package/esm2020/core/services/index.mjs +4 -4
- package/esm2020/core/services/integration.state.mjs +2 -2
- package/esm2020/core/services/product-images.service.mjs +8 -8
- package/esm2020/core/services/runtime-settings.service.mjs +3 -3
- package/esm2020/core/services/sales-transaction.service.mjs +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 +64 -0
- package/esm2020/src/resolvers/ui-definition.resolver.mjs +42 -0
- package/esm2020/src/services/flow-dialog.service.mjs +8 -8
- package/esm2020/src/services/flow-router.service.mjs +16 -33
- package/esm2020/src/services/flow.service.mjs +13 -54
- package/esm2020/src/types/index.mjs +2 -3
- package/esm2020/src/types/route.types.mjs +1 -1
- package/fesm2015/veloceapps-sdk-cms.mjs +139 -276
- package/fesm2015/veloceapps-sdk-cms.mjs.map +1 -1
- package/fesm2015/veloceapps-sdk-core.mjs +784 -1639
- package/fesm2015/veloceapps-sdk-core.mjs.map +1 -1
- package/fesm2015/veloceapps-sdk.mjs +188 -794
- package/fesm2015/veloceapps-sdk.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk-cms.mjs +135 -268
- package/fesm2020/veloceapps-sdk-cms.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk-core.mjs +844 -1735
- package/fesm2020/veloceapps-sdk-core.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk.mjs +188 -788
- 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,327 @@
|
|
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, filter, switchMap, of, forkJoin, throwError, noop, 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 context$() {
|
239
|
+
return this.contextSubj$.asObservable().pipe(filter(isDefined));
|
240
|
+
}
|
241
|
+
get templates() {
|
242
|
+
return this.templatesSubj$.value;
|
243
|
+
}
|
244
|
+
get isFlowEngineInitialized$() {
|
245
|
+
return this.templates$.pipe(map(v => Boolean(v.FLOW_ENGINE)));
|
173
246
|
}
|
174
247
|
get isStateful() {
|
175
248
|
var _a;
|
176
249
|
return !!((_a = this.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful);
|
177
250
|
}
|
178
|
-
constructor(
|
179
|
-
this.
|
180
|
-
this.
|
251
|
+
constructor(runtimeSettingsService, templatesAdminApiService, customizationService) {
|
252
|
+
this.runtimeSettingsService = runtimeSettingsService;
|
253
|
+
this.templatesAdminApiService = templatesAdminApiService;
|
181
254
|
this.customizationService = customizationService;
|
182
|
-
this.templates = {};
|
183
255
|
this.defaultTemplates = {
|
184
256
|
flowEngine: 'Flow Engine',
|
185
257
|
};
|
186
258
|
this.flowSubj$ = new BehaviorSubject(null);
|
259
|
+
this.templatesSubj$ = new BehaviorSubject({});
|
260
|
+
this.contextSubj$ = new BehaviorSubject(null);
|
187
261
|
this.flow$ = this.flowSubj$.asObservable();
|
262
|
+
this.templates$ = this.templatesSubj$.asObservable();
|
263
|
+
}
|
264
|
+
reset() {
|
265
|
+
this.flowSubj$.next(null);
|
266
|
+
this.templatesSubj$.next({});
|
267
|
+
this.contextSubj$.next(null);
|
188
268
|
}
|
189
269
|
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
|
-
}));
|
270
|
+
return this.initFlow$(flowId, routeQueryParams).pipe(switchMap(() => this.initFlowTemplates$()));
|
197
271
|
}
|
198
|
-
|
199
|
-
this.
|
200
|
-
|
201
|
-
|
272
|
+
initTestFlow$(productId) {
|
273
|
+
this.contextSubj$.next({
|
274
|
+
mode: 'QUOTE',
|
275
|
+
headerId: '0Q0-test-quote-id',
|
276
|
+
productId,
|
277
|
+
});
|
278
|
+
this.flowSubj$.next({
|
279
|
+
id: 'preview-flow-id',
|
280
|
+
properties: { entryPath: '/product', queryParams: {} },
|
281
|
+
version: 2,
|
282
|
+
});
|
283
|
+
return of(undefined);
|
284
|
+
}
|
285
|
+
updateContext(update) {
|
286
|
+
this.contextSubj$.next(Object.assign(Object.assign({}, this.context), update));
|
202
287
|
}
|
203
|
-
|
288
|
+
initFlow$(flowId, routeQueryParams) {
|
289
|
+
var _a;
|
290
|
+
const flow = (_a = this.runtimeSettingsService.getConfigurationSettings()['flows']) === null || _a === void 0 ? void 0 : _a.find(({ id }) => flowId === id);
|
291
|
+
if (!flow) {
|
292
|
+
this.flowSubj$.next(null);
|
293
|
+
throw new Error(`Flow with flowId=${flowId} is not defined`);
|
294
|
+
}
|
295
|
+
const headerId = routeQueryParams['headerId'];
|
296
|
+
if (typeof headerId !== 'string') {
|
297
|
+
throw new Error(`Please provide 'headerId'`);
|
298
|
+
}
|
299
|
+
const mode = this.getFlowContextMode(headerId);
|
300
|
+
// Restrict if mode is not defined
|
301
|
+
if (mode == null) {
|
302
|
+
throw new Error('Mode is undefined');
|
303
|
+
}
|
304
|
+
this.contextSubj$.next(Object.assign(Object.assign(Object.assign({}, flow.properties.queryParams), routeQueryParams), { mode }));
|
305
|
+
this.flowSubj$.next(flow);
|
306
|
+
return of(undefined);
|
307
|
+
}
|
308
|
+
initFlowTemplates$() {
|
204
309
|
var _a, _b, _c;
|
205
310
|
return forkJoin([
|
206
|
-
this.
|
311
|
+
this.templatesAdminApiService.fetchTemplates$(),
|
207
312
|
(_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
|
-
|
313
|
+
]).pipe(map(([templates, localTemplates]) => {
|
314
|
+
var _a, _b;
|
315
|
+
const newValue = {};
|
316
|
+
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
317
|
var _a;
|
211
318
|
const type = this.remapTemplateName(key);
|
212
319
|
if (type) {
|
213
|
-
|
320
|
+
newValue[type] =
|
214
321
|
(_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
322
|
}
|
216
323
|
});
|
324
|
+
this.templatesSubj$.next(newValue);
|
217
325
|
}));
|
218
326
|
}
|
219
327
|
remapTemplateName(templateType) {
|
@@ -239,13 +347,20 @@ class FlowInfoService {
|
|
239
347
|
}
|
240
348
|
return undefined;
|
241
349
|
}
|
350
|
+
getFlowContextMode(headerId) {
|
351
|
+
const objectName = SalesforceIdUtils.getSfObjectNameById(headerId);
|
352
|
+
if (!objectName) {
|
353
|
+
return;
|
354
|
+
}
|
355
|
+
return objectName.toUpperCase();
|
356
|
+
}
|
242
357
|
}
|
243
|
-
FlowInfoService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, deps: [{ token:
|
358
|
+
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
359
|
FlowInfoService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService });
|
245
360
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, decorators: [{
|
246
361
|
type: Injectable
|
247
362
|
}], ctorParameters: function () {
|
248
|
-
return [{ type:
|
363
|
+
return [{ type: RuntimeSettingsService }, { type: i1.UITemplatesAdminApiService }, { type: undefined, decorators: [{
|
249
364
|
type: Optional
|
250
365
|
}, {
|
251
366
|
type: Inject,
|
@@ -253,186 +368,183 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
253
368
|
}] }];
|
254
369
|
} });
|
255
370
|
|
256
|
-
class
|
371
|
+
class TestModeConfigurationService {
|
372
|
+
constructor(flowInfoService, configurationService, configurationRuntimeService, salesTransactionService) {
|
373
|
+
this.flowInfoService = flowInfoService;
|
374
|
+
this.configurationService = configurationService;
|
375
|
+
this.configurationRuntimeService = configurationRuntimeService;
|
376
|
+
this.salesTransactionService = salesTransactionService;
|
377
|
+
this.isInitialized = false;
|
378
|
+
}
|
379
|
+
initTestMode$(uiDefinitionContainer) {
|
380
|
+
var _a;
|
381
|
+
this.configurationRuntimeService.uiDefinitionContainer = uiDefinitionContainer;
|
382
|
+
if (this.checkInitialized(uiDefinitionContainer)) {
|
383
|
+
this.configurationRuntimeService.pcmModel = this.pcmModel;
|
384
|
+
return of(undefined);
|
385
|
+
}
|
386
|
+
this.configurationService.reset();
|
387
|
+
const { productId, quoteId } = (_a = uiDefinitionContainer.source.properties) !== null && _a !== void 0 ? _a : {};
|
388
|
+
if (!productId) {
|
389
|
+
return throwError(() => 'Unable to start the Configuration Preview: Product is missing.');
|
390
|
+
}
|
391
|
+
if (!quoteId) {
|
392
|
+
return throwError(() => `Unable to start the Configuration Preview: Quote is missing.`);
|
393
|
+
}
|
394
|
+
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
|
395
|
+
? this.configurationService.configureRequest$(this.configurationService.state)
|
396
|
+
: of(undefined)), tap(() => (this.isInitialized = true)), map(noop));
|
397
|
+
}
|
398
|
+
getTestSalesTransaction(quoteId) {
|
399
|
+
const testTransaction = {
|
400
|
+
id: quoteId,
|
401
|
+
businessObjectType: 'Quote',
|
402
|
+
salesTransactionItems: [],
|
403
|
+
};
|
404
|
+
return testTransaction;
|
405
|
+
}
|
406
|
+
checkInitialized(uiDefinitionContainer) {
|
407
|
+
var _a;
|
408
|
+
return this.isInitialized && !!((_a = uiDefinitionContainer.source.properties) === null || _a === void 0 ? void 0 : _a.persistTestState);
|
409
|
+
}
|
410
|
+
}
|
411
|
+
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 });
|
412
|
+
TestModeConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TestModeConfigurationService });
|
413
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TestModeConfigurationService, decorators: [{
|
414
|
+
type: Injectable
|
415
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: ConfigurationService }, { type: ConfigurationRuntimeService }, { type: SalesTransactionService }]; } });
|
416
|
+
|
417
|
+
class SalesTransactionService {
|
257
418
|
get isInitialized$() {
|
258
419
|
return this.isInitializedSubj$.asObservable();
|
259
420
|
}
|
260
421
|
get isInitialized() {
|
261
422
|
return this.isInitializedSubj$.getValue();
|
262
423
|
}
|
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
424
|
set hasUnsavedChanges(value) {
|
272
425
|
var _a, _b;
|
273
|
-
this.
|
274
|
-
if (!this.
|
275
|
-
this.
|
426
|
+
this.hasUnsavedChangesSubj$.next(value);
|
427
|
+
if (!this.hasUnsavedChanges) {
|
428
|
+
this.initialState = (_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.salesTransactionItems) !== null && _b !== void 0 ? _b : [];
|
276
429
|
}
|
277
430
|
}
|
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);
|
431
|
+
get hasUnsavedChanges() {
|
432
|
+
return this.hasUnsavedChangesSubj$.getValue();
|
284
433
|
}
|
285
|
-
get
|
286
|
-
return this.
|
434
|
+
get state() {
|
435
|
+
return this.stateSubj$.getValue();
|
287
436
|
}
|
288
|
-
get
|
437
|
+
get hasProducts() {
|
289
438
|
var _a;
|
290
|
-
return Boolean((_a = this.
|
439
|
+
return Boolean((_a = this.state) === null || _a === void 0 ? void 0 : _a.salesTransactionItems.length);
|
291
440
|
}
|
292
|
-
|
293
|
-
return this.assetsSubj$.value;
|
294
|
-
}
|
295
|
-
constructor(context, flowInfoService, accountApiService, quoteApiService) {
|
296
|
-
this.context = context;
|
441
|
+
constructor(flowInfoService, salesTransactionApiService) {
|
297
442
|
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);
|
443
|
+
this.salesTransactionApiService = salesTransactionApiService;
|
444
|
+
this.stateSubj$ = new BehaviorSubject(null);
|
303
445
|
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;
|
446
|
+
this.hasUnsavedChangesSubj$ = new BehaviorSubject(false);
|
447
|
+
this.initialState = [];
|
448
|
+
this.hasUnsavedChanges$ = this.hasUnsavedChangesSubj$.asObservable();
|
449
|
+
this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
|
317
450
|
}
|
318
451
|
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));
|
452
|
+
return this.salesTransactionApiService.getState(headerId, params).pipe(tap(res => this.stateSubj$.next(res.salesTransaction)), map(res => res.salesTransaction));
|
336
453
|
}
|
337
454
|
finalizeInit() {
|
338
|
-
this.
|
455
|
+
this.isInitializedSubj$.next(true);
|
339
456
|
this.hasUnsavedChanges = false;
|
340
457
|
}
|
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());
|
458
|
+
reset() {
|
459
|
+
this.stateSubj$.next(null);
|
460
|
+
this.isInitializedSubj$.next(false);
|
461
|
+
this.hasUnsavedChangesSubj$.next(false);
|
374
462
|
}
|
375
|
-
|
376
|
-
|
377
|
-
if (!quote) {
|
378
|
-
return null;
|
379
|
-
}
|
380
|
-
return Object.assign(Object.assign({}, quote), { context: this.context.resolve() });
|
463
|
+
getInitialState() {
|
464
|
+
return this.initialState;
|
381
465
|
}
|
382
|
-
|
383
|
-
|
466
|
+
setState(state) {
|
467
|
+
this.stateSubj$.next(state);
|
384
468
|
}
|
385
|
-
|
386
|
-
|
387
|
-
|
469
|
+
}
|
470
|
+
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 });
|
471
|
+
SalesTransactionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService });
|
472
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, decorators: [{
|
473
|
+
type: Injectable
|
474
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: i1.SalesTransactionApiService }]; } });
|
475
|
+
|
476
|
+
class FlowConfigurationService {
|
477
|
+
constructor(orchestrationsApiService, salesTransactionService) {
|
478
|
+
this.orchestrationsApiService = orchestrationsApiService;
|
479
|
+
this.salesTransactionService = salesTransactionService;
|
480
|
+
this.updatedSubj$ = new Subject();
|
481
|
+
this.updated$ = this.updatedSubj$.asObservable();
|
388
482
|
}
|
389
|
-
|
390
|
-
|
391
|
-
return (_b = (_a = this.flowInfoService.flow) === null || _a === void 0 ? void 0 : _a.properties.standalone) !== null && _b !== void 0 ? _b : false;
|
483
|
+
calculate$(state) {
|
484
|
+
return this.orchestrationsApiService.apply$({ salesTransaction: state }).pipe(tap(result => this.salesTransactionService.setState(result.salesTransaction)), map(noop));
|
392
485
|
}
|
393
|
-
|
394
|
-
|
486
|
+
calculate(state) {
|
487
|
+
this.calculate$(state).subscribe();
|
395
488
|
}
|
396
|
-
|
397
|
-
|
489
|
+
revert$(transactionItemId) {
|
490
|
+
var _a;
|
491
|
+
const state = this.salesTransactionService.state;
|
492
|
+
const initialState = this.salesTransactionService.getInitialState();
|
493
|
+
const currentState = (_a = state === null || state === void 0 ? void 0 : state.salesTransactionItems) !== null && _a !== void 0 ? _a : [];
|
494
|
+
const currentItemIndex = currentState.findIndex(({ id }) => id === transactionItemId);
|
495
|
+
const currentItem = currentState[currentItemIndex];
|
496
|
+
const initialItem = initialState.find(({ integrationId }) => integrationId === (currentItem === null || currentItem === void 0 ? void 0 : currentItem.integrationId));
|
497
|
+
if (!state || !currentItem || !initialItem) {
|
498
|
+
return of(null);
|
499
|
+
}
|
500
|
+
const updatedState = cloneDeep(currentState);
|
501
|
+
updatedState.splice(currentItemIndex, 1, initialItem);
|
502
|
+
return of([]).pipe(tap(() => {
|
503
|
+
this.salesTransactionService.setState(Object.assign(Object.assign({}, state), { salesTransactionItems: updatedState }));
|
504
|
+
}), switchMap(() => this.calculate$(Object.assign(Object.assign({}, state), { salesTransactionItems: updatedState }))), map(() => this.salesTransactionService.state), tap(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
|
398
505
|
}
|
399
|
-
|
400
|
-
|
506
|
+
revert(transactionItemId) {
|
507
|
+
this.revert$(transactionItemId).subscribe();
|
401
508
|
}
|
402
|
-
|
403
|
-
const
|
404
|
-
if (
|
405
|
-
return
|
406
|
-
}
|
407
|
-
if (context.mode === ConfigurationContextMode.QUOTE) {
|
408
|
-
return context.properties.Status === 'Draft';
|
509
|
+
delete$(ids) {
|
510
|
+
const state = this.salesTransactionService.state;
|
511
|
+
if (!state) {
|
512
|
+
return of(null);
|
409
513
|
}
|
410
|
-
return
|
514
|
+
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
515
|
}
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
516
|
+
delete(ids) {
|
517
|
+
this.delete$(ids).subscribe();
|
518
|
+
}
|
519
|
+
handleErrorAndBounceBack() {
|
520
|
+
return (source$) => {
|
521
|
+
return source$.pipe(catchError(error => {
|
522
|
+
console.error(error);
|
523
|
+
// bounce back if configuration call has failed
|
524
|
+
const state = this.salesTransactionService.state;
|
525
|
+
if (state) {
|
526
|
+
this.salesTransactionService.setState(state);
|
527
|
+
this.updatedSubj$.next();
|
528
|
+
}
|
529
|
+
return throwError(() => error);
|
530
|
+
}));
|
531
|
+
};
|
419
532
|
}
|
420
533
|
}
|
421
|
-
|
422
|
-
|
423
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type:
|
534
|
+
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 });
|
535
|
+
FlowConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService });
|
536
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, decorators: [{
|
424
537
|
type: Injectable
|
425
|
-
}], ctorParameters: function () { return [{ type:
|
538
|
+
}], ctorParameters: function () { return [{ type: i1.OrchestrationsApiService }, { type: SalesTransactionService }]; } });
|
426
539
|
|
427
540
|
class FlowStateService {
|
428
|
-
constructor(
|
429
|
-
this.contextService = contextService;
|
430
|
-
this.quoteDraftService = quoteDraftService;
|
431
|
-
this.flowInfoService = flowInfoService;
|
541
|
+
constructor(flowConfiguration, flowInfoService, flowStateApiService, processorsApiService, salesTransactionApiService, salesTransactionService, toastService, customizationService) {
|
432
542
|
this.flowConfiguration = flowConfiguration;
|
433
|
-
this.
|
543
|
+
this.flowInfoService = flowInfoService;
|
434
544
|
this.flowStateApiService = flowStateApiService;
|
435
|
-
this.
|
545
|
+
this.processorsApiService = processorsApiService;
|
546
|
+
this.salesTransactionApiService = salesTransactionApiService;
|
547
|
+
this.salesTransactionService = salesTransactionService;
|
436
548
|
this.toastService = toastService;
|
437
549
|
this.customizationService = customizationService;
|
438
550
|
this.NOT_INITIALIZED = Symbol();
|
@@ -449,68 +561,22 @@ class FlowStateService {
|
|
449
561
|
this.cleanup$ = new Subject();
|
450
562
|
this.statefulExecutionRequest$ = this.initBufferedRequest$();
|
451
563
|
/*
|
452
|
-
In stateless mode watch
|
453
|
-
all subscriptions get their updates according to updated
|
564
|
+
In stateless mode watch State changes and call executeRequest so that
|
565
|
+
all subscriptions get their updates according to updated State
|
454
566
|
*/
|
455
567
|
this.isInitialized$()
|
456
|
-
.pipe(filter
|
568
|
+
.pipe(filter(Boolean), filter(() => !this.flowInfoService.flow.properties.stateful), switchMap(() => this.flowConfiguration.updated$), switchMap(() => this.executeRequest$({}, true)))
|
457
569
|
.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
570
|
}
|
503
571
|
init$() {
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
}
|
511
|
-
}));
|
572
|
+
if (this.flowInfoService.flow.properties.stateful) {
|
573
|
+
return this.initProcessors$().pipe(switchMap(() => this.initStateful$()));
|
574
|
+
}
|
575
|
+
else {
|
576
|
+
return forkJoin([this.initStateless$(), this.initProcessors$()]).pipe(map(noop));
|
577
|
+
}
|
512
578
|
}
|
513
|
-
|
579
|
+
reset() {
|
514
580
|
Object.values(this.subscriptions).forEach(({ data$ }) => data$.complete());
|
515
581
|
this.subscriptions = {};
|
516
582
|
if (this.stateId$.value) {
|
@@ -522,9 +588,9 @@ class FlowStateService {
|
|
522
588
|
this.cleanup$.next();
|
523
589
|
}
|
524
590
|
get hasUnsavedChanges() {
|
525
|
-
return this.
|
591
|
+
return this.flowInfoService.flow.properties.stateful
|
526
592
|
? Array.from(this.trackedStatefulChangesMap.values()).some(Boolean)
|
527
|
-
: this.
|
593
|
+
: this.salesTransactionService.hasUnsavedChanges;
|
528
594
|
}
|
529
595
|
get stateId() {
|
530
596
|
return this.stateId$.value;
|
@@ -533,14 +599,14 @@ class FlowStateService {
|
|
533
599
|
return this.executionInProgress$.asObservable();
|
534
600
|
}
|
535
601
|
isInitialized$() {
|
536
|
-
return combineLatest([this.stateId$, this.
|
602
|
+
return combineLatest([this.stateId$, this.salesTransactionService.isInitialized$]).pipe(map(values => values.some(Boolean)));
|
537
603
|
}
|
538
604
|
isInitialized() {
|
539
|
-
return Boolean(this.stateId$.value) || this.
|
605
|
+
return Boolean(this.stateId$.value) || this.salesTransactionService.isInitialized;
|
540
606
|
}
|
541
607
|
execute$(scope, exec) {
|
542
608
|
const request = this.execToRequest(scope, exec);
|
543
|
-
return this.executeRequest$(request).pipe(map
|
609
|
+
return this.executeRequest$(request).pipe(map(result => {
|
544
610
|
// Keep only requested results
|
545
611
|
const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
|
546
612
|
var _a;
|
@@ -557,7 +623,7 @@ class FlowStateService {
|
|
557
623
|
actions: [{ name: action, inputData }],
|
558
624
|
};
|
559
625
|
const request = this.execToRequest(scope, exec);
|
560
|
-
return this.executeRequest$(request).pipe(map
|
626
|
+
return this.executeRequest$(request).pipe(map(noop));
|
561
627
|
}
|
562
628
|
select$(scope, selectorName, inputData) {
|
563
629
|
const requestId = this.generateRequestId(scope, selectorName, inputData);
|
@@ -569,7 +635,7 @@ class FlowStateService {
|
|
569
635
|
},
|
570
636
|
},
|
571
637
|
});
|
572
|
-
return this.executeRequest$(request).pipe(map
|
638
|
+
return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
|
573
639
|
}
|
574
640
|
subscribe$(scope, selectorName, inputData, options) {
|
575
641
|
const requestId = this.generateRequestId(scope, selectorName, inputData);
|
@@ -595,7 +661,7 @@ class FlowStateService {
|
|
595
661
|
this.executeRequest$(request).subscribe();
|
596
662
|
}
|
597
663
|
}
|
598
|
-
return subscription.data$.pipe(filter
|
664
|
+
return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), finalize(() => {
|
599
665
|
var _a;
|
600
666
|
if (!((_a = this.subscriptions[requestId]) === null || _a === void 0 ? void 0 : _a.data$.observed)) {
|
601
667
|
delete this.subscriptions[requestId];
|
@@ -603,9 +669,9 @@ class FlowStateService {
|
|
603
669
|
}));
|
604
670
|
}
|
605
671
|
save$() {
|
606
|
-
if (this.
|
672
|
+
if (this.flowInfoService.flow.properties.stateful) {
|
607
673
|
if (this.stateId$.value) {
|
608
|
-
return this.flowStateApiService.save(this.stateId$.value).pipe(tap
|
674
|
+
return this.flowStateApiService.save(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })), tap(() => {
|
609
675
|
Array.from(this.trackedStatefulChangesMap.keys()).forEach(key => {
|
610
676
|
this.trackedStatefulChangesMap.set(key, false);
|
611
677
|
});
|
@@ -613,30 +679,26 @@ class FlowStateService {
|
|
613
679
|
}
|
614
680
|
}
|
615
681
|
else {
|
616
|
-
const
|
617
|
-
if (
|
618
|
-
return this.
|
619
|
-
this.contextService.update({ properties: { VELOCE_PRISM__VersionId__c: versionId } });
|
620
|
-
}));
|
682
|
+
const state = this.salesTransactionService.state;
|
683
|
+
if (state) {
|
684
|
+
return this.salesTransactionApiService.upsert(state);
|
621
685
|
}
|
622
686
|
}
|
623
|
-
return of({
|
687
|
+
return of({ id: '' });
|
624
688
|
}
|
625
689
|
submit$() {
|
626
|
-
if (this.
|
690
|
+
if (this.flowInfoService.flow.properties.stateful) {
|
627
691
|
if (this.stateId$.value) {
|
628
|
-
return this.flowStateApiService.submit(this.stateId$.value);
|
692
|
+
return this.flowStateApiService.submit(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })));
|
629
693
|
}
|
630
694
|
}
|
631
695
|
else {
|
632
|
-
const
|
633
|
-
if (
|
634
|
-
return this.
|
635
|
-
this.contextService.update({ properties: { VELOCE_PRISM__VersionId__c: versionId } });
|
636
|
-
}));
|
696
|
+
const state = this.salesTransactionService.state;
|
697
|
+
if (state) {
|
698
|
+
return this.salesTransactionApiService.submit(state);
|
637
699
|
}
|
638
700
|
}
|
639
|
-
return of({
|
701
|
+
return of({ id: '' });
|
640
702
|
}
|
641
703
|
getFlowStore() {
|
642
704
|
return this.flowStore;
|
@@ -677,10 +739,10 @@ class FlowStateService {
|
|
677
739
|
fullRequest.selectors = assign(fullRequest.selectors, subscription.request.selectors);
|
678
740
|
}
|
679
741
|
}
|
680
|
-
const execution$ = this.
|
742
|
+
const execution$ = this.flowInfoService.flow.properties.stateful
|
681
743
|
? this.executeStateful$(fullRequest)
|
682
744
|
: this.executeStateless$(fullRequest);
|
683
|
-
return execution$.pipe(tap
|
745
|
+
return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
|
684
746
|
}
|
685
747
|
handleSelectorsResponse(selectors) {
|
686
748
|
Object.entries(selectors).forEach(([requestId, selectorResult]) => {
|
@@ -696,32 +758,21 @@ class FlowStateService {
|
|
696
758
|
});
|
697
759
|
}
|
698
760
|
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
761
|
const processorsList = flatten(Object.values(this.processors).map(ownerMap => Object.values(ownerMap !== null && ownerMap !== void 0 ? ownerMap : {})));
|
709
762
|
const processors = processorsList.length ? processorsList : undefined;
|
710
763
|
const selectors = Object.values(this.subscriptions)
|
711
764
|
.map(({ request }) => request.selectors)
|
712
765
|
.filter(isDefined)
|
713
766
|
.reduce((trunk, selectors) => (Object.assign(Object.assign({}, trunk), selectors)), {});
|
714
|
-
const request = this.getDefaultExecutionRequestDTO();
|
715
767
|
return this.flowStateApiService
|
716
768
|
.init({
|
717
|
-
quoteId: this.
|
718
|
-
params:
|
769
|
+
quoteId: this.flowInfoService.context.headerId,
|
770
|
+
params: this.flowInfoService.context,
|
719
771
|
actionsOverride: processors === null || processors === void 0 ? void 0 : processors.filter(processor => processor.type === ConfigurationProcessorTypes.ACTION),
|
720
772
|
selectorsOverride: processors === null || processors === void 0 ? void 0 : processors.filter(processor => processor.type === ConfigurationProcessorTypes.SELECTOR),
|
721
|
-
selectors:
|
722
|
-
actions: request.actions,
|
773
|
+
selectors: selectors,
|
723
774
|
})
|
724
|
-
.pipe(map
|
775
|
+
.pipe(map(({ stateId, selectors }) => {
|
725
776
|
this.handleSelectorsResponse(selectors);
|
726
777
|
this.stateId$.next(stateId);
|
727
778
|
}));
|
@@ -741,80 +792,50 @@ class FlowStateService {
|
|
741
792
|
};
|
742
793
|
this.executionInProgress$.next(true);
|
743
794
|
return this.flowStateApiService.execute(this.stateId$.value, request);
|
744
|
-
}), tap
|
795
|
+
}), tap(({ stateId }) => this.stateId$.next(stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
|
745
796
|
this.executionInProgress$.next(false);
|
746
797
|
return throwError(() => e);
|
747
798
|
}));
|
748
799
|
}
|
749
800
|
executeStateful$(request) {
|
750
|
-
return this.executionInProgress$.pipe(filter
|
801
|
+
return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
|
751
802
|
// make sure stream switches to statefulExecutionRequest$ before pushing an execution request
|
752
803
|
combineLatest([
|
753
804
|
this.statefulExecutionRequest$,
|
754
|
-
of(undefined).pipe(tap
|
755
|
-
])), map
|
805
|
+
of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
|
806
|
+
])), map(([response]) => response), take(1));
|
756
807
|
}
|
757
808
|
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);
|
809
|
+
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
810
|
}
|
792
811
|
executeStateless$(request) {
|
793
812
|
this.executionInProgress$.next(true);
|
794
|
-
return of(undefined).pipe(tap
|
813
|
+
return of(undefined).pipe(tap(() => this.executeStatelessActions(request)), switchMap(() => {
|
795
814
|
var _a;
|
796
815
|
/*
|
797
816
|
Skip price calculation in case
|
798
817
|
1. No actions in the request
|
799
818
|
2. Initialization process execution (state not initialized yet)
|
800
819
|
*/
|
801
|
-
|
820
|
+
const { state } = this.salesTransactionService;
|
821
|
+
if (!state || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length) || !this.isInitialized()) {
|
802
822
|
return of(undefined);
|
803
823
|
}
|
804
824
|
else {
|
805
|
-
return this.calculate$();
|
825
|
+
return this.flowConfiguration.calculate$(state);
|
806
826
|
}
|
807
|
-
}), map
|
827
|
+
}), map(() => this.executeStatelessSelectors(request)), tap(() => this.executionInProgress$.next(false)), catchError(e => {
|
808
828
|
this.executionInProgress$.next(false);
|
809
829
|
return throwError(() => e);
|
810
830
|
}));
|
811
831
|
}
|
812
832
|
executeStatelessActions(request) {
|
813
833
|
var _a;
|
814
|
-
|
834
|
+
const state = this.salesTransactionService.state;
|
835
|
+
if (!state || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
|
815
836
|
return;
|
816
837
|
}
|
817
|
-
let flowState =
|
838
|
+
let flowState = state;
|
818
839
|
request.actions.forEach(action => {
|
819
840
|
var _a;
|
820
841
|
try {
|
@@ -826,14 +847,14 @@ class FlowStateService {
|
|
826
847
|
throw e;
|
827
848
|
}
|
828
849
|
});
|
829
|
-
this.
|
850
|
+
this.salesTransactionService.setState(flowState);
|
830
851
|
}
|
831
852
|
executeStatelessSelectors(request) {
|
832
853
|
var _a;
|
833
|
-
if (!this.
|
834
|
-
throw '
|
854
|
+
if (!this.salesTransactionService.state) {
|
855
|
+
throw 'State is not initialized';
|
835
856
|
}
|
836
|
-
const flowState = this.
|
857
|
+
const flowState = this.salesTransactionService.state;
|
837
858
|
return EntityUtil.entries((_a = request.selectors) !== null && _a !== void 0 ? _a : {}).reduce((result, [key, selector]) => {
|
838
859
|
try {
|
839
860
|
result.selectors[key] = {
|
@@ -846,1002 +867,106 @@ class FlowStateService {
|
|
846
867
|
result.selectors[key] = {
|
847
868
|
success: false,
|
848
869
|
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]);
|
870
|
+
};
|
1659
871
|
}
|
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();
|
872
|
+
return result;
|
873
|
+
}, { stateId: '', selectors: {} });
|
1692
874
|
}
|
1693
|
-
|
1694
|
-
|
1695
|
-
|
1696
|
-
|
875
|
+
initProcessors$() {
|
876
|
+
var _a;
|
877
|
+
const hasOverrides = Boolean((_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors);
|
878
|
+
if (this.flowInfoService.flow.properties.stateful && !hasOverrides) {
|
879
|
+
// Skip initialization as backend will take processors from SF
|
880
|
+
return of(undefined);
|
1697
881
|
}
|
1698
|
-
|
1699
|
-
|
1700
|
-
|
1701
|
-
|
1702
|
-
|
1703
|
-
|
1704
|
-
|
1705
|
-
|
1706
|
-
|
1707
|
-
|
1708
|
-
|
1709
|
-
|
1710
|
-
|
1711
|
-
|
1712
|
-
|
1713
|
-
|
1714
|
-
if (!
|
1715
|
-
return of(
|
882
|
+
const owners$ = Object.values(this.flowInfoService.templates)
|
883
|
+
.map(template => {
|
884
|
+
var _a, _b, _c;
|
885
|
+
if (!template) {
|
886
|
+
return;
|
887
|
+
}
|
888
|
+
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);
|
889
|
+
return localProcessors$.pipe(switchMap(processors => processors ? of(processors) : this.processorsApiService.fetchConfigurationProcessors$(template.id)), tap(processors => {
|
890
|
+
const processorsMap = processors.reduce((acc, p) => {
|
891
|
+
acc[p.apiName] = p;
|
892
|
+
return acc;
|
893
|
+
}, {});
|
894
|
+
this.processors[template.id] = processorsMap;
|
895
|
+
}));
|
896
|
+
})
|
897
|
+
.filter(isDefined);
|
898
|
+
if (!owners$.length) {
|
899
|
+
return of(undefined);
|
1716
900
|
}
|
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());
|
1722
|
-
}
|
1723
|
-
revert(lineItemId) {
|
1724
|
-
this.revert$(lineItemId).subscribe();
|
901
|
+
return forkJoin(owners$).pipe(map(noop));
|
1725
902
|
}
|
1726
|
-
|
1727
|
-
|
1728
|
-
const
|
1729
|
-
if (!
|
1730
|
-
|
903
|
+
executeActionScript(request, executable) {
|
904
|
+
var _a;
|
905
|
+
const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
|
906
|
+
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
907
|
+
const scope = this.getScopeByOwnerId(executable.ownerId);
|
908
|
+
const scopeText = scope ? ` in ${scope}` : '';
|
909
|
+
throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
|
1731
910
|
}
|
1732
|
-
return
|
1733
|
-
}
|
1734
|
-
delete(ids) {
|
1735
|
-
this.delete$(ids).subscribe();
|
911
|
+
return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
|
1736
912
|
}
|
1737
|
-
|
1738
|
-
|
1739
|
-
|
1740
|
-
|
913
|
+
executeSelectorScript(request, executable) {
|
914
|
+
var _a;
|
915
|
+
const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
|
916
|
+
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
917
|
+
const scope = this.getScopeByOwnerId(executable.ownerId);
|
918
|
+
const scopeText = scope ? ` in ${scope}` : '';
|
919
|
+
throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
|
1741
920
|
}
|
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());
|
921
|
+
return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
|
1744
922
|
}
|
1745
|
-
|
1746
|
-
|
1747
|
-
|
1748
|
-
|
923
|
+
executeProcessorScript(request, configurationProcessor, inputData) {
|
924
|
+
var _a;
|
925
|
+
const scope = this.getScopeByOwnerId((_a = configurationProcessor.ownerId) !== null && _a !== void 0 ? _a : '');
|
926
|
+
let functionToExecute = this.executedFunctions[scope + configurationProcessor.apiName];
|
927
|
+
if (!functionToExecute) {
|
928
|
+
const script = `${configurationProcessor.script}\nreturn transform;`;
|
929
|
+
const sourceMap = `\n//# sourceURL=${scope ? scope + '/' : ''}${configurationProcessor.apiName}.js`;
|
930
|
+
functionToExecute = new Function(script + sourceMap)();
|
931
|
+
this.executedFunctions[scope + configurationProcessor.apiName] = functionToExecute;
|
1749
932
|
}
|
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$();
|
933
|
+
return functionToExecute({
|
934
|
+
request,
|
935
|
+
inputData,
|
936
|
+
flowStore: this.flowStore,
|
937
|
+
});
|
1791
938
|
}
|
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
|
-
};
|
939
|
+
generateRequestId(scope, selectorName, inputData) {
|
940
|
+
const inputDataHash = UUID.hex(JSON.stringify(inputData) || '').slice(0, 8);
|
941
|
+
return `${scope}/${selectorName}/${inputDataHash}`;
|
1805
942
|
}
|
1806
|
-
|
1807
|
-
|
1808
|
-
|
1809
|
-
|
1810
|
-
|
1811
|
-
|
943
|
+
checkStatefulChanges(requestId, selectorResult) {
|
944
|
+
if (this.trackedStatefulChangesMap.has(requestId)) {
|
945
|
+
if (!this.initialStatefulData[requestId]) {
|
946
|
+
this.initialStatefulData[requestId] = selectorResult;
|
947
|
+
}
|
948
|
+
const hasChanges = !isEqual(this.initialStatefulData[requestId], selectorResult);
|
949
|
+
this.trackedStatefulChangesMap.set(requestId, hasChanges);
|
1812
950
|
}
|
1813
|
-
return this.proceduresApiService.apply$(request);
|
1814
951
|
}
|
1815
952
|
}
|
1816
|
-
|
1817
|
-
|
1818
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type:
|
953
|
+
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 });
|
954
|
+
FlowStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService });
|
955
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, decorators: [{
|
1819
956
|
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
|
-
}] });
|
957
|
+
}], ctorParameters: function () {
|
958
|
+
return [{ type: FlowConfigurationService }, { type: FlowInfoService }, { type: i3.FlowStateApiService }, { type: i1.ConfigurationProcessorsApiService }, { type: i1.SalesTransactionApiService }, { type: SalesTransactionService }, { type: i6.ToastService }, { type: undefined, decorators: [{
|
959
|
+
type: Optional
|
960
|
+
}, {
|
961
|
+
type: Inject,
|
962
|
+
args: [FLOW_CUSTOMIZATION]
|
963
|
+
}] }];
|
964
|
+
} });
|
1834
965
|
|
1835
966
|
class FlowStateConfigurationService {
|
1836
|
-
constructor(flowInfoService,
|
967
|
+
constructor(flowInfoService, flowStateService) {
|
1837
968
|
this.flowInfoService = flowInfoService;
|
1838
|
-
this.flowConfigurationService = flowConfigurationService;
|
1839
|
-
this.flowStateApiService = flowStateApiService;
|
1840
969
|
this.flowStateService = flowStateService;
|
1841
|
-
this.configurationStateId$ = new BehaviorSubject(null);
|
1842
|
-
}
|
1843
|
-
get configurationStateId() {
|
1844
|
-
return this.configurationStateId$.value;
|
1845
970
|
}
|
1846
971
|
addToCart$(props) {
|
1847
972
|
var _a;
|
@@ -1853,26 +978,22 @@ class FlowStateConfigurationService {
|
|
1853
978
|
request$ = of();
|
1854
979
|
}
|
1855
980
|
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
|
-
}));
|
981
|
+
// TODO: Implement
|
982
|
+
request$ = of();
|
1863
983
|
}
|
1864
984
|
}
|
1865
985
|
else {
|
1866
|
-
|
986
|
+
// TODO: Implement
|
987
|
+
request$ = of();
|
1867
988
|
}
|
1868
|
-
return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map
|
989
|
+
return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map(noop));
|
1869
990
|
}
|
1870
991
|
}
|
1871
|
-
FlowStateConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, deps: [{ token: FlowInfoService }, { token:
|
992
|
+
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
993
|
FlowStateConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService });
|
1873
994
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, decorators: [{
|
1874
995
|
type: Injectable
|
1875
|
-
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type:
|
996
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: FlowStateService }]; } });
|
1876
997
|
|
1877
998
|
class IntegrationState {
|
1878
999
|
constructor() {
|
@@ -1892,12 +1013,12 @@ class IntegrationState {
|
|
1892
1013
|
this.action$.next(action);
|
1893
1014
|
}
|
1894
1015
|
listen$(actionType) {
|
1895
|
-
return this.action$.pipe(filter
|
1016
|
+
return this.action$.pipe(filter(action => action.type === actionType), map(action => action.payload));
|
1896
1017
|
}
|
1897
1018
|
listenAll$() {
|
1898
1019
|
return this.action$.asObservable();
|
1899
1020
|
}
|
1900
|
-
|
1021
|
+
reset() {
|
1901
1022
|
this.stateSubj$.next({});
|
1902
1023
|
}
|
1903
1024
|
}
|
@@ -1908,8 +1029,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
1908
1029
|
}] });
|
1909
1030
|
|
1910
1031
|
class ProductImagesService {
|
1911
|
-
constructor(
|
1912
|
-
this.
|
1032
|
+
constructor(productsAdminApiService) {
|
1033
|
+
this.productsAdminApiService = productsAdminApiService;
|
1913
1034
|
this.imagesMap$ = new BehaviorSubject({});
|
1914
1035
|
}
|
1915
1036
|
getImageUrl$(productId) {
|
@@ -1917,157 +1038,172 @@ class ProductImagesService {
|
|
1917
1038
|
this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: '' }));
|
1918
1039
|
this.fetchProductImage(productId);
|
1919
1040
|
}
|
1920
|
-
return this.imagesMap$.pipe(map
|
1041
|
+
return this.imagesMap$.pipe(map(imagesMap => { var _a; return (_a = imagesMap[productId]) !== null && _a !== void 0 ? _a : null; }), distinctUntilChanged());
|
1921
1042
|
}
|
1922
1043
|
fetchProductImage(productId) {
|
1923
|
-
this.
|
1044
|
+
this.productsAdminApiService
|
1924
1045
|
.fetchImage$(productId)
|
1925
|
-
.pipe(map
|
1046
|
+
.pipe(map(file => URL.createObjectURL(file)), catchError(() => of('')), tap(url => this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: url }))))
|
1926
1047
|
.subscribe();
|
1927
1048
|
}
|
1928
1049
|
}
|
1929
|
-
ProductImagesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, deps: [{ token: i1.
|
1050
|
+
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
1051
|
ProductImagesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService });
|
1931
1052
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, decorators: [{
|
1932
1053
|
type: Injectable
|
1933
|
-
}], ctorParameters: function () { return [{ type: i1.
|
1054
|
+
}], ctorParameters: function () { return [{ type: i1.ProductsAdminApiService }]; } });
|
1934
1055
|
|
1935
|
-
class
|
1936
|
-
constructor(
|
1937
|
-
this.
|
1056
|
+
class CatalogProductsService {
|
1057
|
+
constructor() {
|
1058
|
+
this.stateSubj$ = new BehaviorSubject(null);
|
1059
|
+
this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
|
1938
1060
|
}
|
1939
|
-
|
1940
|
-
return this.
|
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
|
-
}));
|
1061
|
+
get state() {
|
1062
|
+
return this.stateSubj$.getValue();
|
1960
1063
|
}
|
1961
|
-
|
1962
|
-
|
1963
|
-
|
1964
|
-
|
1064
|
+
reset() {
|
1065
|
+
this.stateSubj$.next(null);
|
1066
|
+
}
|
1067
|
+
setState(state) {
|
1068
|
+
this.stateSubj$.next(state);
|
1965
1069
|
}
|
1966
1070
|
}
|
1967
|
-
|
1968
|
-
|
1969
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type:
|
1071
|
+
CatalogProductsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
1072
|
+
CatalogProductsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService });
|
1073
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService, decorators: [{
|
1970
1074
|
type: Injectable
|
1971
|
-
}]
|
1075
|
+
}] });
|
1972
1076
|
|
1973
|
-
class
|
1974
|
-
|
1975
|
-
this.
|
1976
|
-
this.contextService = contextService;
|
1977
|
-
this.runtimeContextService = runtimeContextService;
|
1978
|
-
this._isInitialized = false;
|
1979
|
-
this.uiDefinitionProperties = {};
|
1077
|
+
class ConfigurationService {
|
1078
|
+
get state$() {
|
1079
|
+
return this.configurationStateSubj$.asObservable().pipe(filter$1(isDefined));
|
1980
1080
|
}
|
1981
|
-
|
1982
|
-
this.
|
1983
|
-
this._runtimeContext = undefined;
|
1984
|
-
this.initializationProps = undefined;
|
1985
|
-
this.uiDefinitionProperties = {};
|
1081
|
+
get state() {
|
1082
|
+
return this.configurationStateSubj$.getValue();
|
1986
1083
|
}
|
1987
|
-
|
1084
|
+
get previousState() {
|
1085
|
+
return this.previousConfigurationStateSubj$.getValue();
|
1086
|
+
}
|
1087
|
+
get root$() {
|
1088
|
+
return this.state$.pipe(map$1(state => state.salesTransactionItems[0]), filter$1(isDefined));
|
1089
|
+
}
|
1090
|
+
get root() {
|
1988
1091
|
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)));
|
1092
|
+
return (_b = (_a = this.configurationStateSubj$.getValue()) === null || _a === void 0 ? void 0 : _a.salesTransactionItems[0]) !== null && _b !== void 0 ? _b : null;
|
2007
1093
|
}
|
2008
|
-
|
2009
|
-
this.
|
2010
|
-
|
2011
|
-
|
2012
|
-
|
2013
|
-
|
2014
|
-
|
2015
|
-
|
2016
|
-
|
2017
|
-
|
2018
|
-
|
2019
|
-
|
2020
|
-
|
2021
|
-
|
2022
|
-
|
2023
|
-
|
2024
|
-
}), tap(() => (this._isInitialized = true)));
|
1094
|
+
constructor(flowInfoService, messageService, configurationRuntimeService, salesTransactionService, orchestrationsApiService) {
|
1095
|
+
this.flowInfoService = flowInfoService;
|
1096
|
+
this.messageService = messageService;
|
1097
|
+
this.configurationRuntimeService = configurationRuntimeService;
|
1098
|
+
this.salesTransactionService = salesTransactionService;
|
1099
|
+
this.orchestrationsApiService = orchestrationsApiService;
|
1100
|
+
this.hasUnsavedChanges = false;
|
1101
|
+
this.configurationStateSubj$ = new BehaviorSubject(null);
|
1102
|
+
this.previousConfigurationStateSubj$ = new BehaviorSubject(null);
|
1103
|
+
this.isLoadingSubj$ = new BehaviorSubject(false);
|
1104
|
+
this.isLoading$ = this.isLoadingSubj$.asObservable();
|
1105
|
+
}
|
1106
|
+
reset() {
|
1107
|
+
this.hasUnsavedChanges = false;
|
1108
|
+
this.configurationStateSubj$.next(null);
|
1109
|
+
this.previousConfigurationStateSubj$.next(null);
|
2025
1110
|
}
|
2026
|
-
|
1111
|
+
init$() {
|
2027
1112
|
var _a;
|
2028
|
-
|
2029
|
-
|
1113
|
+
const { state } = this.salesTransactionService;
|
1114
|
+
const { productId, transactionItemId } = this.flowInfoService.context;
|
1115
|
+
if (!state) {
|
1116
|
+
return of(undefined);
|
2030
1117
|
}
|
2031
|
-
|
2032
|
-
|
1118
|
+
let transactionItem = state === null || state === void 0 ? void 0 : state.salesTransactionItems.find(item => item.id === transactionItemId);
|
1119
|
+
if (!transactionItem && productId) {
|
1120
|
+
transactionItem =
|
1121
|
+
(_a = state.salesTransactionItems.find(item => item.productId === productId)) !== null && _a !== void 0 ? _a : generateTransactionItem(productId);
|
1122
|
+
}
|
1123
|
+
const configurationState = Object.assign(Object.assign({}, state), { salesTransactionItems: transactionItem ? [transactionItem] : [] });
|
1124
|
+
this.configurationStateSubj$.next(configurationState);
|
1125
|
+
this.previousConfigurationStateSubj$.next(configurationState);
|
1126
|
+
return of(undefined);
|
2033
1127
|
}
|
2034
|
-
|
2035
|
-
|
2036
|
-
|
1128
|
+
patch$(transactionItem) {
|
1129
|
+
const { state, root } = this;
|
1130
|
+
if (!state) {
|
1131
|
+
return throwError(() => new Error(`Configuration State is not initialized`));
|
2037
1132
|
}
|
2038
|
-
|
2039
|
-
|
2040
|
-
source[propertyName] = SalesforceIdUtils.generateId18FromId15(value);
|
1133
|
+
if (!root) {
|
1134
|
+
return throwError(() => new Error(`Root SalesTransactionItem not found`));
|
2041
1135
|
}
|
1136
|
+
const newRoot = new TransactionItemWorker(root).replace(transactionItem).ti;
|
1137
|
+
const newSalesTransaction = Object.assign(Object.assign({}, state), { salesTransactionItems: [newRoot] });
|
1138
|
+
return this.configureRequest$(newSalesTransaction).pipe(catchError$1(error => {
|
1139
|
+
console.error(error);
|
1140
|
+
if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
|
1141
|
+
this.messageService.add({ severity: 'error', summary: error });
|
1142
|
+
}
|
1143
|
+
return throwError(() => error);
|
1144
|
+
}), tap$1(() => {
|
1145
|
+
if (!this.hasUnsavedChanges) {
|
1146
|
+
this.hasUnsavedChanges = true;
|
1147
|
+
}
|
1148
|
+
}), map$1(noop));
|
2042
1149
|
}
|
2043
|
-
|
2044
|
-
|
1150
|
+
patch(transactionItem) {
|
1151
|
+
this.patch$(transactionItem).subscribe();
|
2045
1152
|
}
|
2046
|
-
|
2047
|
-
|
2048
|
-
|
1153
|
+
configureRequest$(salesTransaction) {
|
1154
|
+
const request = {
|
1155
|
+
salesTransaction,
|
1156
|
+
};
|
1157
|
+
this.isLoadingSubj$.next(true);
|
1158
|
+
return this.orchestrationsApiService.apply$(request).pipe(tap$1(result => {
|
1159
|
+
const newState = result.salesTransaction;
|
1160
|
+
this.configurationStateSubj$.next(newState);
|
1161
|
+
this.previousConfigurationStateSubj$.next(cloneDeep(newState));
|
1162
|
+
}), map$1(response => response.salesTransaction), catchError$1(error => throwError(() => {
|
1163
|
+
const resetState = this.previousConfigurationStateSubj$.getValue();
|
1164
|
+
if (resetState) {
|
1165
|
+
this.previousConfigurationStateSubj$.next(cloneDeep(resetState));
|
1166
|
+
this.configurationStateSubj$.next(resetState);
|
1167
|
+
}
|
1168
|
+
if (error.error) {
|
1169
|
+
return extractErrorDetails(error.error).join('. ');
|
1170
|
+
}
|
1171
|
+
return error.message || JSON.stringify(error);
|
1172
|
+
})), finalize$1(() => this.isLoadingSubj$.next(false)));
|
1173
|
+
}
|
1174
|
+
configureExternal$(props) {
|
1175
|
+
// TODO: implement
|
1176
|
+
throw new Error('Not implemented');
|
2049
1177
|
}
|
2050
|
-
|
2051
|
-
|
1178
|
+
configureGuidedSelling$(data) {
|
1179
|
+
// TODO: implement
|
1180
|
+
throw new Error('Not implemented');
|
1181
|
+
}
|
1182
|
+
getPCMModel() {
|
1183
|
+
const pcmModel = this.configurationRuntimeService.pcmModel;
|
1184
|
+
if (!pcmModel) {
|
1185
|
+
throw new Error('PCM model not initialized');
|
1186
|
+
}
|
1187
|
+
return pcmModel;
|
2052
1188
|
}
|
2053
1189
|
}
|
2054
|
-
|
2055
|
-
|
2056
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type:
|
1190
|
+
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 });
|
1191
|
+
ConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService });
|
1192
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, decorators: [{
|
2057
1193
|
type: Injectable
|
2058
|
-
}], ctorParameters: function () { return [{ type:
|
1194
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: i2.MessageService }, { type: ConfigurationRuntimeService }, { type: SalesTransactionService }, { type: i1.OrchestrationsApiService }]; } });
|
2059
1195
|
|
2060
1196
|
class ConfigurationStateService {
|
2061
|
-
constructor(configurationRuntimeService, configurationService,
|
1197
|
+
constructor(configurationRuntimeService, configurationService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, salesTransactionService, salesTransactionApiService, toastService) {
|
2062
1198
|
this.configurationRuntimeService = configurationRuntimeService;
|
2063
1199
|
this.configurationService = configurationService;
|
2064
|
-
this.quoteDraftService = quoteDraftService;
|
2065
|
-
this.toastService = toastService;
|
2066
1200
|
this.flowStateService = flowStateService;
|
2067
1201
|
this.flowInfoService = flowInfoService;
|
2068
1202
|
this.flowConfigurationService = flowConfigurationService;
|
2069
1203
|
this.flowStateApiService = flowStateApiService;
|
2070
|
-
this.
|
1204
|
+
this.salesTransactionService = salesTransactionService;
|
1205
|
+
this.salesTransactionApiService = salesTransactionApiService;
|
1206
|
+
this.toastService = toastService;
|
2071
1207
|
this.isInitialized$ = new BehaviorSubject(false);
|
2072
1208
|
this.canceledConfiguration$ = new Subject();
|
2073
1209
|
this.NOT_INITIALIZED = Symbol();
|
@@ -2091,9 +1227,9 @@ class ConfigurationStateService {
|
|
2091
1227
|
request$ = this.initStateful$();
|
2092
1228
|
}
|
2093
1229
|
else {
|
2094
|
-
request$ = this.
|
1230
|
+
request$ = this.configurationService.init$();
|
2095
1231
|
}
|
2096
|
-
return request$.pipe(
|
1232
|
+
return request$.pipe(take(1), tap(() => {
|
2097
1233
|
this.isInitialized$.next(true);
|
2098
1234
|
this.canceledConfiguration$ = new Subject();
|
2099
1235
|
}));
|
@@ -2107,10 +1243,11 @@ class ConfigurationStateService {
|
|
2107
1243
|
this.configurationStore = {};
|
2108
1244
|
this.executedFunctions = {};
|
2109
1245
|
this.configurationService.reset();
|
1246
|
+
this.configurationRuntimeService.reset();
|
2110
1247
|
}
|
2111
1248
|
execute$(exec) {
|
2112
1249
|
const request = this.execToRequest(exec);
|
2113
|
-
return this.executeRequest$(request).pipe(map
|
1250
|
+
return this.executeRequest$(request).pipe(map(result => {
|
2114
1251
|
// Keep only requested results
|
2115
1252
|
const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
|
2116
1253
|
var _a;
|
@@ -2133,7 +1270,7 @@ class ConfigurationStateService {
|
|
2133
1270
|
}
|
2134
1271
|
// prevent parallel configuration requests in stateless mode
|
2135
1272
|
if (!this.statelessExecutionRequest$) {
|
2136
|
-
this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay
|
1273
|
+
this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay(), take(1), finalize(() => (this.statelessExecutionRequest$ = null)));
|
2137
1274
|
}
|
2138
1275
|
return this.statelessExecutionRequest$;
|
2139
1276
|
}
|
@@ -2147,7 +1284,7 @@ class ConfigurationStateService {
|
|
2147
1284
|
},
|
2148
1285
|
},
|
2149
1286
|
});
|
2150
|
-
return this.executeRequest$(request).pipe(map
|
1287
|
+
return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
|
2151
1288
|
}
|
2152
1289
|
subscribe$(selectorName, inputData = {}, options) {
|
2153
1290
|
const requestId = UUID.UUID();
|
@@ -2170,58 +1307,41 @@ class ConfigurationStateService {
|
|
2170
1307
|
this.executeRequest$(request).subscribe();
|
2171
1308
|
}
|
2172
1309
|
}
|
2173
|
-
return subscription.data$.pipe(filter
|
1310
|
+
return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), distinctUntilChanged(), finalize(() => {
|
2174
1311
|
var _a;
|
2175
1312
|
if (!((_a = this.subscriptions[requestId]) === null || _a === void 0 ? void 0 : _a.data$.observed)) {
|
2176
1313
|
delete this.subscriptions[requestId];
|
2177
1314
|
}
|
2178
1315
|
}), takeUntil(this.canceledConfiguration$));
|
2179
1316
|
}
|
2180
|
-
saveConfiguration(
|
2181
|
-
var _a, _b
|
1317
|
+
saveConfiguration() {
|
1318
|
+
var _a, _b;
|
2182
1319
|
if (this.isStatefulConfiguration) {
|
2183
|
-
return this.flowStateApiService
|
2184
|
-
|
2185
|
-
|
1320
|
+
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 })));
|
1321
|
+
}
|
1322
|
+
const state = this.salesTransactionService.state;
|
1323
|
+
if (!state) {
|
1324
|
+
return of({ id: '' });
|
1325
|
+
}
|
1326
|
+
const { standalone } = this.flowInfoService.flow.properties;
|
1327
|
+
if (standalone) {
|
1328
|
+
return this.salesTransactionApiService.upsert(state);
|
1329
|
+
}
|
1330
|
+
const salesTransaction = this.salesTransactionService.state;
|
1331
|
+
const configurationRoot = this.configurationService.root;
|
1332
|
+
if (!salesTransaction || !configurationRoot) {
|
1333
|
+
return of({ id: '' });
|
1334
|
+
}
|
1335
|
+
const isNewTransactionItem = salesTransaction.salesTransactionItems.every(li => li.id !== configurationRoot.id);
|
1336
|
+
let salesTransactionItems;
|
1337
|
+
if (isNewTransactionItem) {
|
1338
|
+
salesTransactionItems = [...salesTransaction.salesTransactionItems, configurationRoot];
|
2186
1339
|
}
|
2187
1340
|
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
|
-
}
|
1341
|
+
salesTransactionItems = salesTransaction.salesTransactionItems.map(ti => ti.id === configurationRoot.id ? configurationRoot : ti);
|
2224
1342
|
}
|
1343
|
+
const newState = Object.assign(Object.assign({}, salesTransaction), { salesTransactionItems });
|
1344
|
+
return this.flowConfigurationService.calculate$(newState).pipe(map(() => ({ id: '' })));
|
2225
1345
|
}
|
2226
1346
|
cancelConfiguration() {
|
2227
1347
|
var _a, _b;
|
@@ -2242,37 +1362,33 @@ class ConfigurationStateService {
|
|
2242
1362
|
return (_b = (_a = this.flowInfoService.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful) !== null && _b !== void 0 ? _b : false;
|
2243
1363
|
}
|
2244
1364
|
initStateful$() {
|
2245
|
-
var _a, _b, _c, _d, _e, _f
|
2246
|
-
this.ownerId = (
|
2247
|
-
const
|
2248
|
-
if (!this.flowStateService.stateId) {
|
1365
|
+
var _a, _b, _c, _d, _e, _f;
|
1366
|
+
this.ownerId = (_b = (_a = this.configurationRuntimeService.uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : '';
|
1367
|
+
const { productId, transactionItemId } = this.flowInfoService.context;
|
1368
|
+
if (!productId || !this.flowStateService.stateId) {
|
2249
1369
|
return of(undefined);
|
2250
1370
|
}
|
2251
|
-
const container =
|
2252
|
-
const lineItem = this.configurationService.generateLineItem();
|
1371
|
+
const container = this.configurationRuntimeService.uiDefinitionContainer;
|
2253
1372
|
let request$;
|
2254
|
-
if (!
|
1373
|
+
if (!transactionItemId) {
|
2255
1374
|
request$ = this.flowStateApiService.newConfiguration(this.flowStateService.stateId, {
|
2256
|
-
|
2257
|
-
actionsOverride: (
|
2258
|
-
selectorsOverride: (
|
1375
|
+
transactionItem: generateTransactionItem(productId),
|
1376
|
+
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 }))),
|
1377
|
+
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
1378
|
});
|
2260
1379
|
}
|
2261
1380
|
else {
|
2262
1381
|
request$ = this.flowStateApiService.startConfiguration(this.flowStateService.stateId, {
|
2263
|
-
|
2264
|
-
actionsOverride: (
|
2265
|
-
selectorsOverride: (
|
1382
|
+
transactionItemId,
|
1383
|
+
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 }))),
|
1384
|
+
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
1385
|
});
|
2267
1386
|
}
|
2268
|
-
return request$.pipe(map
|
1387
|
+
return request$.pipe(map(r => {
|
2269
1388
|
this.stateId = r.stateId;
|
2270
1389
|
return undefined;
|
2271
1390
|
}));
|
2272
1391
|
}
|
2273
|
-
initStateless$() {
|
2274
|
-
return this.configurationService.configure().pipe(map$1(() => undefined));
|
2275
|
-
}
|
2276
1392
|
execToRequest(exec) {
|
2277
1393
|
var _a;
|
2278
1394
|
return {
|
@@ -2318,39 +1434,37 @@ class ConfigurationStateService {
|
|
2318
1434
|
else {
|
2319
1435
|
execution$ = this.executeStateless$(fullRequest);
|
2320
1436
|
}
|
2321
|
-
return execution$.pipe(tap
|
1437
|
+
return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
|
2322
1438
|
}
|
2323
1439
|
executeStateless$(request) {
|
2324
1440
|
this.executionInProgress$.next(true);
|
2325
|
-
return
|
1441
|
+
return this.configurationService.state$.pipe(switchMap(state => {
|
2326
1442
|
var _a;
|
2327
1443
|
// Apply actions and execute configuration/price call
|
2328
1444
|
// No need to run configuration if no actions in the request
|
2329
1445
|
if (!((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
|
2330
1446
|
return of(undefined);
|
2331
1447
|
}
|
2332
|
-
let configurationRequest = this.configurationService.generateRequest(false);
|
2333
1448
|
request.actions.forEach(action => {
|
2334
1449
|
var _a;
|
2335
|
-
|
1450
|
+
state = (_a = this.executeActionScript(state, action)) !== null && _a !== void 0 ? _a : state;
|
2336
1451
|
});
|
2337
|
-
|
2338
|
-
|
2339
|
-
}), map$1(() => {
|
1452
|
+
return this.configurationService.configureRequest$(state);
|
1453
|
+
}), map(() => {
|
2340
1454
|
// Run selectors and apply them to the state
|
2341
|
-
const configurationState = this.configurationService.
|
1455
|
+
const configurationState = this.configurationService.state;
|
2342
1456
|
if (!configurationState) {
|
2343
1457
|
return { stateId: '', selectors: {} };
|
2344
1458
|
}
|
2345
1459
|
return this.runStatelessSelectors(request, configurationState);
|
2346
|
-
}), tap
|
2347
|
-
const configurationState = this.configurationService.
|
1460
|
+
}), tap(() => this.executionInProgress$.next(false)), catchError(error => {
|
1461
|
+
const configurationState = this.configurationService.previousState;
|
2348
1462
|
if (configurationState) {
|
2349
1463
|
const selectorsResult = this.runStatelessSelectors(request, configurationState);
|
2350
1464
|
this.handleSelectorsResponse(selectorsResult.selectors);
|
2351
1465
|
}
|
2352
1466
|
this.executionInProgress$.next(false);
|
2353
|
-
if (!this.configurationRuntimeService.
|
1467
|
+
if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
|
2354
1468
|
this.toastService.add({ severity: ToastType.error, summary: String(error) });
|
2355
1469
|
}
|
2356
1470
|
return throwError(() => error);
|
@@ -2371,22 +1485,22 @@ class ConfigurationStateService {
|
|
2371
1485
|
};
|
2372
1486
|
this.executionInProgress$.next(true);
|
2373
1487
|
return this.flowStateApiService.executeConfiguration(this.flowStateService.stateId, this.stateId, request);
|
2374
|
-
}), tap
|
1488
|
+
}), tap(({ stateId }) => (this.stateId = stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
|
2375
1489
|
this.executionInProgress$.next(false);
|
2376
1490
|
return throwError(() => e);
|
2377
1491
|
}));
|
2378
1492
|
}
|
2379
1493
|
executeStateful$(request) {
|
2380
|
-
return this.executionInProgress$.pipe(filter
|
1494
|
+
return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
|
2381
1495
|
// make sure stream switches to statefulExecutionRequest$ before pushing an execution request
|
2382
1496
|
combineLatest([
|
2383
1497
|
this.statefulExecutionRequest$,
|
2384
|
-
of(undefined).pipe(tap
|
2385
|
-
])), map
|
1498
|
+
of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
|
1499
|
+
])), map(([response]) => response), take(1));
|
2386
1500
|
}
|
2387
1501
|
executeActionScript(request, processor) {
|
2388
|
-
var _a
|
2389
|
-
const { actions } = (
|
1502
|
+
var _a;
|
1503
|
+
const { actions } = (_a = this.configurationRuntimeService.uiDefinitionContainer) !== null && _a !== void 0 ? _a : {};
|
2390
1504
|
const configurationProcessor = actions === null || actions === void 0 ? void 0 : actions.find(action => action.apiName === processor.apiName);
|
2391
1505
|
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
2392
1506
|
throw `ConfigurationProcessor ${processor.apiName} not found`;
|
@@ -2394,8 +1508,8 @@ class ConfigurationStateService {
|
|
2394
1508
|
return this.executeProcessorScript(request, configurationProcessor, processor.inputData);
|
2395
1509
|
}
|
2396
1510
|
executeSelectorScript(request, processor) {
|
2397
|
-
var _a
|
2398
|
-
const { selectors } = (
|
1511
|
+
var _a;
|
1512
|
+
const { selectors } = (_a = this.configurationRuntimeService.uiDefinitionContainer) !== null && _a !== void 0 ? _a : {};
|
2399
1513
|
const configurationProcessor = selectors === null || selectors === void 0 ? void 0 : selectors.find(selector => selector.apiName === processor.apiName);
|
2400
1514
|
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
2401
1515
|
throw `ConfigurationProcessor ${processor.apiName} not found`;
|
@@ -2437,25 +1551,52 @@ class ConfigurationStateService {
|
|
2437
1551
|
}, { stateId: '', selectors: {} });
|
2438
1552
|
}
|
2439
1553
|
}
|
2440
|
-
ConfigurationStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, deps: [{ token: ConfigurationRuntimeService }, { token: ConfigurationService }, { token:
|
1554
|
+
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
1555
|
ConfigurationStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService });
|
2442
1556
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, decorators: [{
|
2443
1557
|
type: Injectable
|
2444
|
-
}], ctorParameters: function () { return [{ type: ConfigurationRuntimeService }, { type: ConfigurationService }, { type:
|
1558
|
+
}], 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
1559
|
|
2446
1560
|
class ConfigurationModule {
|
2447
1561
|
}
|
2448
1562
|
ConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
2449
1563
|
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: [
|
1564
|
+
ConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, providers: [
|
1565
|
+
ConfigurationService,
|
1566
|
+
ConfigurationStateService,
|
1567
|
+
ConfigurationRuntimeService,
|
1568
|
+
TestModeConfigurationService,
|
1569
|
+
], imports: [ConfirmationDialogModule, ApiModule] });
|
2451
1570
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, decorators: [{
|
2452
1571
|
type: NgModule,
|
2453
1572
|
args: [{
|
2454
1573
|
imports: [ConfirmationDialogModule, ApiModule],
|
2455
|
-
providers: [
|
1574
|
+
providers: [
|
1575
|
+
ConfigurationService,
|
1576
|
+
ConfigurationStateService,
|
1577
|
+
ConfigurationRuntimeService,
|
1578
|
+
TestModeConfigurationService,
|
1579
|
+
],
|
1580
|
+
}]
|
1581
|
+
}] });
|
1582
|
+
|
1583
|
+
class FlowConfigurationModule {
|
1584
|
+
}
|
1585
|
+
FlowConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
1586
|
+
FlowConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, imports: [ApiModule] });
|
1587
|
+
FlowConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, providers: [FlowConfigurationService], imports: [ApiModule] });
|
1588
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, decorators: [{
|
1589
|
+
type: NgModule,
|
1590
|
+
args: [{
|
1591
|
+
imports: [ApiModule],
|
1592
|
+
providers: [FlowConfigurationService],
|
2456
1593
|
}]
|
2457
1594
|
}] });
|
2458
1595
|
|
1596
|
+
const FORMATTING_SETTINGS_TOKEN = new InjectionToken('Summary of formatting settings for variant types of data, e.g. numbers, text, dates, etc');
|
1597
|
+
|
1598
|
+
const UI_DEFINITION_VERSION = 3;
|
1599
|
+
|
2459
1600
|
const DEFAULT_FORMATTING_SETTINGS = {
|
2460
1601
|
currencySymbol: DEFAULT_CURRENCY_SYMBOL,
|
2461
1602
|
decimalsCount: DEFAULT_DECIMALS_COUNT,
|
@@ -2469,14 +1610,14 @@ class SdkCoreModule {
|
|
2469
1610
|
SdkCoreModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
2470
1611
|
SdkCoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, imports: [ConfigurationModule, FlowConfigurationModule] });
|
2471
1612
|
SdkCoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, providers: [
|
2472
|
-
ContextService,
|
2473
1613
|
FlowInfoService,
|
2474
|
-
QuoteDraftService,
|
2475
1614
|
ProductImagesService,
|
2476
1615
|
IntegrationState,
|
2477
1616
|
FlowStateService,
|
2478
1617
|
FlowStateConfigurationService,
|
2479
1618
|
RuntimeSettingsService,
|
1619
|
+
SalesTransactionService,
|
1620
|
+
CatalogProductsService,
|
2480
1621
|
{
|
2481
1622
|
provide: FORMATTING_SETTINGS_TOKEN,
|
2482
1623
|
useExisting: RuntimeSettingsService,
|
@@ -2487,14 +1628,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
2487
1628
|
args: [{
|
2488
1629
|
imports: [ConfigurationModule, FlowConfigurationModule],
|
2489
1630
|
providers: [
|
2490
|
-
ContextService,
|
2491
1631
|
FlowInfoService,
|
2492
|
-
QuoteDraftService,
|
2493
1632
|
ProductImagesService,
|
2494
1633
|
IntegrationState,
|
2495
1634
|
FlowStateService,
|
2496
1635
|
FlowStateConfigurationService,
|
2497
1636
|
RuntimeSettingsService,
|
1637
|
+
SalesTransactionService,
|
1638
|
+
CatalogProductsService,
|
2498
1639
|
{
|
2499
1640
|
provide: FORMATTING_SETTINGS_TOKEN,
|
2500
1641
|
useExisting: RuntimeSettingsService,
|
@@ -2552,6 +1693,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
2552
1693
|
}]
|
2553
1694
|
}] });
|
2554
1695
|
|
1696
|
+
function filterSuccessfulExecute() {
|
1697
|
+
return (source) => source.pipe(filter((result) => result.success), map(r => r.result));
|
1698
|
+
}
|
1699
|
+
|
2555
1700
|
class DatePipe {
|
2556
1701
|
constructor() {
|
2557
1702
|
var _a;
|
@@ -2679,5 +1824,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
2679
1824
|
* Generated bundle index. Do not edit.
|
2680
1825
|
*/
|
2681
1826
|
|
2682
|
-
export { ActionCodePipe, CalendarDirective, ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService,
|
1827
|
+
export { ActionCodePipe, CalendarDirective, CatalogProductsService, 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, filterSuccessfulExecute, findTransactionItem, findTransactionItemWithComparator, generateTransactionItem, insertTransactionItem, removeTransactionItem, replaceTransactionItem };
|
2683
1828
|
//# sourceMappingURL=veloceapps-sdk-core.mjs.map
|