@veloceapps/sdk 11.0.0-16 → 11.0.0-17
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 +98 -22
- 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 +4 -27
- package/core/index.d.ts +0 -1
- package/core/modules/configuration/index.d.ts +1 -4
- package/core/modules/configuration/services/configuration-runtime.service.d.ts +3 -20
- package/core/modules/configuration/services/configuration-state.service.d.ts +3 -3
- package/core/modules/configuration/services/configuration.service.d.ts +23 -46
- package/core/modules/flow-configuration/index.d.ts +0 -3
- package/core/modules/flow-configuration/services/flow-configuration.service.d.ts +5 -13
- package/core/services/flow-info.service.d.ts +3 -2
- package/core/services/flow-state-configuration.service.d.ts +2 -8
- package/core/services/flow-state.service.d.ts +6 -12
- package/core/services/index.d.ts +0 -1
- package/core/services/integration.state.d.ts +1 -1
- package/core/services/sales-transaction.service.d.ts +4 -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 +99 -65
- package/esm2020/cms/cms.default.mjs +2 -3
- package/esm2020/cms/components/element-renderer/element-renderer.component.mjs +7 -64
- package/esm2020/cms/components/preview/preview.component.mjs +3 -3
- package/esm2020/cms/services/element-context.service.mjs +1 -1
- package/esm2020/cms/types/common.types.mjs +1 -1
- package/esm2020/cms/types/index.mjs +1 -2
- package/esm2020/cms/utils/element.utils.mjs +3 -3
- package/esm2020/cms/utils/path.utils.mjs +1 -10
- package/esm2020/cms/vendor-map.mjs +4 -5
- package/esm2020/core/core.module.mjs +4 -5
- package/esm2020/core/index.mjs +1 -2
- package/esm2020/core/modules/configuration/configuration.module.mjs +3 -4
- package/esm2020/core/modules/configuration/index.mjs +2 -5
- package/esm2020/core/modules/configuration/services/configuration-runtime.service.mjs +9 -67
- package/esm2020/core/modules/configuration/services/configuration-state.service.mjs +46 -54
- package/esm2020/core/modules/configuration/services/configuration.service.mjs +96 -226
- 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 +15 -32
- package/esm2020/core/services/flow-info.service.mjs +9 -3
- package/esm2020/core/services/flow-state-configuration.service.mjs +10 -25
- package/esm2020/core/services/flow-state.service.mjs +25 -58
- package/esm2020/core/services/index.mjs +1 -2
- package/esm2020/core/services/integration.state.mjs +2 -2
- package/esm2020/core/services/sales-transaction.service.mjs +11 -5
- 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/flow-routing.module.mjs +8 -8
- package/esm2020/src/guards/flow.guard.mjs +5 -7
- package/esm2020/src/guards/product-unload.guard.mjs +7 -7
- package/esm2020/src/index.mjs +1 -2
- package/esm2020/src/pages/debug/debug.component.mjs +10 -15
- package/esm2020/src/pages/product/product.component.mjs +11 -14
- package/esm2020/src/pages/record-not-found/record-not-found.component.mjs +5 -6
- package/esm2020/src/resolvers/sales-transaction.resolver.mjs +83 -0
- package/esm2020/src/resolvers/ui-definition.resolver.mjs +5 -4
- package/esm2020/src/services/flow-dialog.service.mjs +1 -1
- package/esm2020/src/services/flow-router.service.mjs +17 -24
- package/esm2020/src/services/flow.service.mjs +5 -13
- package/esm2020/src/types/index.mjs +2 -3
- package/esm2020/src/types/route.types.mjs +1 -1
- package/fesm2015/veloceapps-sdk-cms.mjs +116 -252
- package/fesm2015/veloceapps-sdk-cms.mjs.map +1 -1
- package/fesm2015/veloceapps-sdk-core.mjs +318 -1116
- package/fesm2015/veloceapps-sdk-core.mjs.map +1 -1
- package/fesm2015/veloceapps-sdk.mjs +87 -120
- package/fesm2015/veloceapps-sdk.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk-cms.mjs +112 -244
- package/fesm2020/veloceapps-sdk-cms.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk-core.mjs +366 -1162
- package/fesm2020/veloceapps-sdk-core.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk.mjs +87 -120
- package/fesm2020/veloceapps-sdk.mjs.map +1 -1
- package/package.json +1 -1
- package/src/guards/product-unload.guard.d.ts +3 -3
- package/src/index.d.ts +0 -1
- package/src/pages/debug/debug.component.d.ts +1 -3
- package/src/pages/product/product.component.d.ts +3 -4
- package/src/pages/record-not-found/record-not-found.component.d.ts +2 -3
- package/src/resolvers/sales-transaction.resolver.d.ts +18 -0
- package/src/services/flow-dialog.service.d.ts +2 -1
- package/src/services/flow-router.service.d.ts +5 -5
- package/src/services/flow.service.d.ts +0 -1
- 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 -7
- package/core/modules/configuration/services/runtime-context.service.d.ts +0 -12
- package/core/modules/configuration/types/configuration-runtime.types.d.ts +0 -8
- 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/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 -67
- package/esm2020/core/modules/configuration/services/runtime-context.service.mjs +0 -45
- package/esm2020/core/modules/configuration/types/configuration-runtime.types.mjs +0 -2
- 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/quote-draft.service.mjs +0 -174
- 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/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 -14
- package/esm2020/src/utils/index.mjs +0 -2
- package/src/resolvers/quote.resolver.d.ts +0 -18
- 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 -1
- package/src/utils/index.d.ts +0 -1
|
@@ -1,215 +1,37 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { Injectable, InjectionToken, Optional, Inject, NgModule, inject, Directive, Input, LOCALE_ID, Pipe } from '@angular/core';
|
|
3
|
+
import { 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, isDefined, UUID, extractErrorDetails, ConfigurationProcessorTypes, EntityUtil, DEFAULT_TIME_FORMAT, formatNumber } from '@veloceapps/core';
|
|
4
4
|
import * as i1 from '@veloceapps/api';
|
|
5
5
|
import { ApiModule } from '@veloceapps/api';
|
|
6
|
-
import { map, first, tap, filter as filter$1, switchMap as switchMap$1, skip, take as take$1, shareReplay as shareReplay$1, catchError as catchError$1, finalize as finalize$1 } from 'rxjs/operators';
|
|
7
|
-
import { HttpErrorResponse } from '@angular/common/http';
|
|
8
6
|
import * as i6 from '@veloceapps/components';
|
|
9
|
-
import { ToastType,
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import moment from 'moment';
|
|
7
|
+
import { ToastType, ConfirmationDialogModule } from '@veloceapps/components';
|
|
8
|
+
import * as i4 from '@veloceapps/api/v2';
|
|
9
|
+
import { uniqBy, flatten, omit, cloneDeep, assign, isEqual } from 'lodash';
|
|
10
|
+
import { BehaviorSubject, map, tap, switchMap, of, forkJoin, throwError, noop, filter as filter$1, Subject, catchError as catchError$1, combineLatest, finalize as finalize$1, buffer, debounceTime, share, take, distinctUntilChanged, shareReplay, takeUntil } from 'rxjs';
|
|
11
|
+
import * as i2 from 'primeng/api';
|
|
12
|
+
import { filter, map as map$1, catchError, tap as tap$1, finalize } from 'rxjs/operators';
|
|
16
13
|
import { NgControl } from '@angular/forms';
|
|
17
14
|
import 'primeng/calendar';
|
|
18
15
|
import { DATE_PIPE_DEFAULT_OPTIONS, formatDate } from '@angular/common';
|
|
19
16
|
|
|
20
|
-
const getDefaultLineItem = (context, uiDefinitionProperties, qty = 1) => {
|
|
21
|
-
const id = UUID.UUID();
|
|
22
|
-
const attributes = [];
|
|
23
|
-
const lineItems = [];
|
|
24
|
-
return {
|
|
25
|
-
id,
|
|
26
|
-
type: uiDefinitionProperties.rootType ?? '',
|
|
27
|
-
cfgStatus: 'Default',
|
|
28
|
-
actionCode: 'ADD',
|
|
29
|
-
qty,
|
|
30
|
-
attributes,
|
|
31
|
-
lineItems,
|
|
32
|
-
productName: context.properties?.['displayName'] || context.productName,
|
|
33
|
-
productId: context.productId ?? '',
|
|
34
|
-
...(uiDefinitionProperties.offeringId ? { offeringId: uiDefinitionProperties.offeringId } : {}),
|
|
35
|
-
};
|
|
36
|
-
};
|
|
37
|
-
const generateEmptyContext = () => {
|
|
38
|
-
return {
|
|
39
|
-
headerId: '',
|
|
40
|
-
mode: ConfigurationContextMode.TEST,
|
|
41
|
-
properties: {},
|
|
42
|
-
configurationToken: '',
|
|
43
|
-
};
|
|
44
|
-
};
|
|
45
|
-
const getGuidedSellingConfigurationRequest = (data) => {
|
|
46
|
-
return {
|
|
47
|
-
mode: 'SEARCH',
|
|
48
|
-
step: 'START',
|
|
49
|
-
attributeDomainMode: 'ALL',
|
|
50
|
-
context: generateEmptyContext(),
|
|
51
|
-
lineItem: {
|
|
52
|
-
actionCode: 'ADD',
|
|
53
|
-
cfgStatus: 'Default',
|
|
54
|
-
id: UUID.UUID(),
|
|
55
|
-
qty: 1,
|
|
56
|
-
type: data.modelType,
|
|
57
|
-
attributes: Object.entries(data.attributesMap).map(([name, value]) => ({
|
|
58
|
-
name,
|
|
59
|
-
value,
|
|
60
|
-
cfgStatus: 'User',
|
|
61
|
-
})),
|
|
62
|
-
},
|
|
63
|
-
};
|
|
64
|
-
};
|
|
65
|
-
const generateConfigurationLineItem = (props, qty = 1) => {
|
|
66
|
-
const id = UUID.UUID();
|
|
67
|
-
const attributes = Object.entries(props.attributesMap ?? {}).map(([name, value]) => ({
|
|
68
|
-
name,
|
|
69
|
-
value,
|
|
70
|
-
cfgStatus: 'User',
|
|
71
|
-
}));
|
|
72
|
-
const lineItems = [];
|
|
73
|
-
return {
|
|
74
|
-
id,
|
|
75
|
-
type: props.product.typeName ?? '',
|
|
76
|
-
cfgStatus: 'Default',
|
|
77
|
-
actionCode: 'ADD',
|
|
78
|
-
qty,
|
|
79
|
-
attributes,
|
|
80
|
-
lineItems,
|
|
81
|
-
productName: props.product.name,
|
|
82
|
-
productId: props.product.id ?? '',
|
|
83
|
-
};
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
const FLOW_CUSTOMIZATION = new InjectionToken('FLOW_CUSTOMIZATION');
|
|
87
|
-
|
|
88
|
-
const FORMATTING_SETTINGS_TOKEN = new InjectionToken('Summary of formatting settings for variant types of data, e.g. numbers, text, dates, etc');
|
|
89
|
-
|
|
90
|
-
var RuntimeMode;
|
|
91
|
-
(function (RuntimeMode) {
|
|
92
|
-
RuntimeMode[RuntimeMode["TEST"] = 0] = "TEST";
|
|
93
|
-
RuntimeMode[RuntimeMode["PROD"] = 1] = "PROD";
|
|
94
|
-
})(RuntimeMode || (RuntimeMode = {}));
|
|
95
|
-
var RuntimeOperation;
|
|
96
|
-
(function (RuntimeOperation) {
|
|
97
|
-
RuntimeOperation["INIT"] = "INIT";
|
|
98
|
-
RuntimeOperation["UPDATE"] = "UPDATE";
|
|
99
|
-
})(RuntimeOperation || (RuntimeOperation = {}));
|
|
100
|
-
var RuntimeStep;
|
|
101
|
-
(function (RuntimeStep) {
|
|
102
|
-
RuntimeStep["START"] = "START";
|
|
103
|
-
RuntimeStep["UPDATE"] = "UPDATE";
|
|
104
|
-
})(RuntimeStep || (RuntimeStep = {}));
|
|
105
|
-
|
|
106
|
-
const UI_DEFINITION_VERSION = 3;
|
|
107
|
-
|
|
108
|
-
class RuntimeContextService {
|
|
109
|
-
constructor(configurationApiService) {
|
|
110
|
-
this.configurationApiService = configurationApiService;
|
|
111
|
-
}
|
|
112
|
-
getRuntimeContext(productId, offeringId, defaultUIDefinitionId, requiredUIDefinitionId) {
|
|
113
|
-
return this.configurationApiService
|
|
114
|
-
.getRuntimeDataByProductId(productId, offeringId, defaultUIDefinitionId, requiredUIDefinitionId)
|
|
115
|
-
.pipe(map(runtimeData => {
|
|
116
|
-
const uiDefinitionContainer = this.getUIDefinitionContainer(runtimeData);
|
|
117
|
-
const runtimeModel = RuntimeModel.create(runtimeData.types, runtimeData.products);
|
|
118
|
-
const { productName, properties } = Array.from(runtimeModel.components.values()).find(c => c.productId === productId) ?? {};
|
|
119
|
-
const uiDefinitionProperties = uiDefinitionContainer?.source.properties;
|
|
120
|
-
return {
|
|
121
|
-
modelId: runtimeData.modelId,
|
|
122
|
-
uiDefinitionContainer: uiDefinitionContainer,
|
|
123
|
-
runtimeModel: runtimeModel,
|
|
124
|
-
runtimeMode: RuntimeMode.PROD,
|
|
125
|
-
productId: productId,
|
|
126
|
-
productType: properties?.['displayName'] || productName,
|
|
127
|
-
offeringId: offeringId,
|
|
128
|
-
properties: {
|
|
129
|
-
PricingEnabled: uiDefinitionProperties?.pricingEnabled ? 'true' : 'false',
|
|
130
|
-
PriceListId: uiDefinitionProperties?.priceList,
|
|
131
|
-
},
|
|
132
|
-
};
|
|
133
|
-
}));
|
|
134
|
-
}
|
|
135
|
-
getUIDefinitionContainer(runtimeData) {
|
|
136
|
-
const containers = runtimeData.uiDefinitions.filter(container => isNotLegacyUIDefinition(container.source));
|
|
137
|
-
return containers.find(container => container.source.primary) ?? containers[0];
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
RuntimeContextService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeContextService, deps: [{ token: i1.ConfigurationApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
141
|
-
RuntimeContextService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeContextService });
|
|
142
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeContextService, decorators: [{
|
|
143
|
-
type: Injectable
|
|
144
|
-
}], ctorParameters: function () { return [{ type: i1.ConfigurationApiService }]; } });
|
|
145
|
-
|
|
146
17
|
class ConfigurationRuntimeService {
|
|
147
|
-
constructor(
|
|
148
|
-
this.
|
|
149
|
-
this.runtimeContextService = runtimeContextService;
|
|
150
|
-
this._isInitialized = false;
|
|
151
|
-
this.uiDefinitionProperties = {};
|
|
152
|
-
}
|
|
153
|
-
reset() {
|
|
154
|
-
this._isInitialized = false;
|
|
155
|
-
this._runtimeContext = undefined;
|
|
156
|
-
this.initializationProps = undefined;
|
|
157
|
-
this.uiDefinitionProperties = {};
|
|
158
|
-
}
|
|
159
|
-
initTestMode(uiDefinitionContainer) {
|
|
160
|
-
this.uiDefinitionProperties = uiDefinitionContainer.source.properties ?? {};
|
|
161
|
-
return this.apiService.getRuntimeDataByModelId(uiDefinitionContainer.modelId).pipe(first(), map(runtimeData => {
|
|
162
|
-
this._runtimeContext = {
|
|
163
|
-
modelId: uiDefinitionContainer.modelId,
|
|
164
|
-
runtimeModel: RuntimeModel.create(runtimeData.types, runtimeData.products),
|
|
165
|
-
runtimeMode: RuntimeMode.TEST,
|
|
166
|
-
uiDefinitionContainer,
|
|
167
|
-
};
|
|
168
|
-
return this._runtimeContext;
|
|
169
|
-
}), tap(() => (this._isInitialized = true)));
|
|
170
|
-
}
|
|
171
|
-
init(props) {
|
|
172
|
-
this.initializationProps = props;
|
|
173
|
-
return this.runtimeContextService
|
|
174
|
-
.getRuntimeContext(props.productId, props.offeringId, props.defaultUIDefinitionId, props.requiredUIDefinitionId)
|
|
175
|
-
.pipe(tap(runtimeContext => {
|
|
176
|
-
this.uiDefinitionProperties = runtimeContext.uiDefinitionContainer?.source.properties ?? {};
|
|
177
|
-
this.id15to18('AccountId', runtimeContext.properties);
|
|
178
|
-
this._runtimeContext = runtimeContext;
|
|
179
|
-
return this._runtimeContext;
|
|
180
|
-
}), tap(() => (this._isInitialized = true)));
|
|
181
|
-
}
|
|
182
|
-
overrideUIDefinition(uiDefinitionContainer) {
|
|
183
|
-
if (!this._runtimeContext) {
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
this._runtimeContext.uiDefinitionContainer = uiDefinitionContainer;
|
|
187
|
-
this.uiDefinitionProperties = uiDefinitionContainer.source.properties ?? {};
|
|
188
|
-
}
|
|
189
|
-
id15to18(propertyName, source) {
|
|
190
|
-
if (!source) {
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
const value = source[propertyName];
|
|
194
|
-
if (typeof value === 'string' && value.length === 15) {
|
|
195
|
-
source[propertyName] = SalesforceIdUtils.generateId18FromId15(value);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
get isInitialized() {
|
|
199
|
-
return this._isInitialized;
|
|
18
|
+
constructor() {
|
|
19
|
+
this.uiDefinitionContainer = null;
|
|
200
20
|
}
|
|
201
|
-
get
|
|
202
|
-
return this.
|
|
21
|
+
get uiDefinitionProps() {
|
|
22
|
+
return this.uiDefinitionContainer?.source.properties ?? {};
|
|
203
23
|
}
|
|
204
|
-
|
|
205
|
-
|
|
24
|
+
reset() {
|
|
25
|
+
this.uiDefinitionContainer = null;
|
|
206
26
|
}
|
|
207
27
|
}
|
|
208
|
-
ConfigurationRuntimeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService, deps: [
|
|
28
|
+
ConfigurationRuntimeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
209
29
|
ConfigurationRuntimeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService });
|
|
210
30
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService, decorators: [{
|
|
211
31
|
type: Injectable
|
|
212
|
-
}]
|
|
32
|
+
}] });
|
|
33
|
+
|
|
34
|
+
const FLOW_CUSTOMIZATION = new InjectionToken('FLOW_CUSTOMIZATION');
|
|
213
35
|
|
|
214
36
|
class RuntimeSettingsService {
|
|
215
37
|
constructor(configurationSettingsApiService) {
|
|
@@ -228,11 +50,11 @@ class RuntimeSettingsService {
|
|
|
228
50
|
};
|
|
229
51
|
}
|
|
230
52
|
create() {
|
|
231
|
-
return this.configurationSettingsApiService.fetchSettings().pipe(map
|
|
53
|
+
return this.configurationSettingsApiService.fetchSettings().pipe(map(settings => this.parseConfigurationSettings(settings)), tap(configurationSettings => {
|
|
232
54
|
this.configurationSettings$.next(configurationSettings);
|
|
233
55
|
this.addShoppingCartSettings(configurationSettings['shopping-cart'] ?? []);
|
|
234
56
|
this.formattingSettings = this.getFormattingSettings();
|
|
235
|
-
}), map
|
|
57
|
+
}), map(() => undefined));
|
|
236
58
|
}
|
|
237
59
|
initCurrency(iso) {
|
|
238
60
|
if (iso) {
|
|
@@ -336,7 +158,7 @@ class FlowInfoService {
|
|
|
336
158
|
return this.templatesSubj$.value;
|
|
337
159
|
}
|
|
338
160
|
get isFlowEngineInitialized$() {
|
|
339
|
-
return this.templates$.pipe(map
|
|
161
|
+
return this.templates$.pipe(map(v => Boolean(v.FLOW_ENGINE)));
|
|
340
162
|
}
|
|
341
163
|
get isStateful() {
|
|
342
164
|
return !!this.flow?.properties.stateful;
|
|
@@ -354,7 +176,7 @@ class FlowInfoService {
|
|
|
354
176
|
this.flow$ = this.flowSubj$.asObservable();
|
|
355
177
|
this.templates$ = this.templatesSubj$.asObservable();
|
|
356
178
|
}
|
|
357
|
-
|
|
179
|
+
reset() {
|
|
358
180
|
this.flowSubj$.next(null);
|
|
359
181
|
this.templatesSubj$.next({});
|
|
360
182
|
this.contextSubj$.next(null);
|
|
@@ -362,6 +184,12 @@ class FlowInfoService {
|
|
|
362
184
|
init$(flowId, routeQueryParams) {
|
|
363
185
|
return this.initFlow$(flowId, routeQueryParams).pipe(switchMap(() => this.initFlowTemplates$()));
|
|
364
186
|
}
|
|
187
|
+
updateContext(update) {
|
|
188
|
+
this.contextSubj$.next({
|
|
189
|
+
...this.context,
|
|
190
|
+
...update,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
365
193
|
initFlow$(flowId, routeQueryParams) {
|
|
366
194
|
const flow = this.runtimeSettingsService.getConfigurationSettings()['flows']?.find(({ id }) => flowId === id);
|
|
367
195
|
if (!flow) {
|
|
@@ -389,7 +217,7 @@ class FlowInfoService {
|
|
|
389
217
|
return forkJoin([
|
|
390
218
|
this.templatesApiService.fetchTemplates$(),
|
|
391
219
|
this.customizationService?.getTemplates?.() ?? of([]),
|
|
392
|
-
]).pipe(map
|
|
220
|
+
]).pipe(map(([templates, localTemplates]) => {
|
|
393
221
|
const newValue = {};
|
|
394
222
|
Object.entries({ ...this.defaultTemplates, ...(this.flow?.properties.templates ?? {}) }).forEach(([key, name]) => {
|
|
395
223
|
const type = this.remapTemplateName(key);
|
|
@@ -433,239 +261,87 @@ class FlowInfoService {
|
|
|
433
261
|
return objectName.toUpperCase();
|
|
434
262
|
}
|
|
435
263
|
}
|
|
436
|
-
FlowInfoService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, deps: [{ token: RuntimeSettingsService }, { token:
|
|
264
|
+
FlowInfoService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, deps: [{ token: RuntimeSettingsService }, { token: i4.UITemplatesApiService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
437
265
|
FlowInfoService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService });
|
|
438
266
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, decorators: [{
|
|
439
267
|
type: Injectable
|
|
440
|
-
}], ctorParameters: function () { return [{ type: RuntimeSettingsService }, { type:
|
|
268
|
+
}], ctorParameters: function () { return [{ type: RuntimeSettingsService }, { type: i4.UITemplatesApiService }, { type: undefined, decorators: [{
|
|
441
269
|
type: Optional
|
|
442
270
|
}, {
|
|
443
271
|
type: Inject,
|
|
444
272
|
args: [FLOW_CUSTOMIZATION]
|
|
445
273
|
}] }]; } });
|
|
446
274
|
|
|
447
|
-
const
|
|
448
|
-
return
|
|
275
|
+
const findTransactionItem = (id, items) => {
|
|
276
|
+
return findTransactionItemWithComparator(items, (ti) => ti.id === id);
|
|
449
277
|
};
|
|
450
|
-
const
|
|
451
|
-
let currentLevel =
|
|
278
|
+
const findTransactionItemWithComparator = (items, comparator) => {
|
|
279
|
+
let currentLevel = items;
|
|
452
280
|
while (currentLevel.length) {
|
|
453
281
|
const found = currentLevel.find(comparator);
|
|
454
282
|
if (found) {
|
|
455
283
|
return found;
|
|
456
284
|
}
|
|
457
|
-
currentLevel = flatten(currentLevel.map(parent => parent.
|
|
285
|
+
currentLevel = flatten(currentLevel.map(parent => parent.children));
|
|
458
286
|
}
|
|
459
287
|
return;
|
|
460
288
|
};
|
|
461
|
-
const
|
|
462
|
-
const insertData =
|
|
289
|
+
const insertTransactionItem = (item, parentId, toInsert) => {
|
|
290
|
+
const insertData = item.id === parentId ? [toInsert] : [];
|
|
463
291
|
return {
|
|
464
|
-
...
|
|
465
|
-
|
|
292
|
+
...item,
|
|
293
|
+
children: [
|
|
466
294
|
...insertData,
|
|
467
|
-
...
|
|
468
|
-
return
|
|
295
|
+
...item.children.map(ti => {
|
|
296
|
+
return insertTransactionItem(ti, parentId, toInsert);
|
|
469
297
|
}),
|
|
470
298
|
],
|
|
471
299
|
};
|
|
472
300
|
};
|
|
473
|
-
const
|
|
301
|
+
const removeTransactionItem = (item, idToRemove) => {
|
|
474
302
|
return {
|
|
475
|
-
...
|
|
476
|
-
|
|
477
|
-
.map(
|
|
478
|
-
if (
|
|
303
|
+
...item,
|
|
304
|
+
children: item.children
|
|
305
|
+
.map(ti => {
|
|
306
|
+
if (ti.id === idToRemove) {
|
|
479
307
|
return;
|
|
480
308
|
}
|
|
481
|
-
else if (
|
|
482
|
-
return
|
|
309
|
+
else if (ti.children.length) {
|
|
310
|
+
return removeTransactionItem(ti, idToRemove);
|
|
483
311
|
}
|
|
484
|
-
return
|
|
312
|
+
return ti;
|
|
485
313
|
})
|
|
486
|
-
.filter(
|
|
314
|
+
.filter(isDefined),
|
|
487
315
|
};
|
|
488
316
|
};
|
|
489
|
-
const
|
|
490
|
-
if (
|
|
491
|
-
|
|
492
|
-
return { ...recalculateCardinalityVariables(lineItem, replaceTo) };
|
|
493
|
-
}
|
|
494
|
-
else {
|
|
495
|
-
return { ...replaceTo };
|
|
496
|
-
}
|
|
317
|
+
const replaceTransactionItem = (item, replaceTo) => {
|
|
318
|
+
if (item.id === replaceTo.id) {
|
|
319
|
+
return { ...replaceTo };
|
|
497
320
|
}
|
|
498
321
|
return {
|
|
499
|
-
...
|
|
500
|
-
|
|
322
|
+
...item,
|
|
323
|
+
children: item.children.map(ti => replaceTransactionItem(ti, replaceTo)),
|
|
501
324
|
};
|
|
502
325
|
};
|
|
503
|
-
const
|
|
504
|
-
const cardinalityComputations = new Map();
|
|
505
|
-
entries(portDomains).forEach(([key, portDomain]) => {
|
|
506
|
-
cardinalityComputations.set(key, portDomain.properties['cardinalityComputation'] === 'true');
|
|
507
|
-
});
|
|
508
|
-
return cardinalityComputations;
|
|
509
|
-
};
|
|
510
|
-
const calculateCardinalityVariables = (lineItems, cardinalityComputations) => {
|
|
511
|
-
const cardVars = new Map();
|
|
512
|
-
lineItems
|
|
513
|
-
.filter(({ port, type }) => !!port && !!type)
|
|
514
|
-
.forEach(li => {
|
|
515
|
-
if (cardinalityComputations.get(`${li.port}`)) {
|
|
516
|
-
const cardinalityVariableName = `#CV-${li.type}@${li.port}`;
|
|
517
|
-
cardVars.set(cardinalityVariableName, (cardVars.get(cardinalityVariableName) ?? 0) + li.qty);
|
|
518
|
-
}
|
|
519
|
-
});
|
|
520
|
-
return cardVars;
|
|
521
|
-
};
|
|
522
|
-
const cardinalityRegexp = new RegExp('#CV-[a-zA-Z0-9_]+@(?<portName>[a-zA-Z0-9_]+)');
|
|
523
|
-
const recalculateCardinalityVariables = (original, updated) => {
|
|
524
|
-
const cardinalityComputations = collectCardinalityComputations(updated.portDomains ?? original.portDomains ?? {});
|
|
525
|
-
const cardinalityVariables = calculateCardinalityVariables(updated.lineItems, cardinalityComputations);
|
|
526
|
-
const originalCardinalityVariables = calculateCardinalityVariables(original.lineItems, cardinalityComputations);
|
|
527
|
-
originalCardinalityVariables.forEach((value, key) => {
|
|
528
|
-
const execArray = cardinalityRegexp.exec(key);
|
|
529
|
-
const portName = execArray?.groups?.['portName'];
|
|
530
|
-
if (!portName || cardinalityComputations.get(portName)) {
|
|
531
|
-
if (cardinalityVariables.get(key) === value) {
|
|
532
|
-
// no need to update cardinality if no changes
|
|
533
|
-
cardinalityVariables.delete(key);
|
|
534
|
-
}
|
|
535
|
-
else if (!cardinalityVariables.has(key)) {
|
|
536
|
-
// remove last item from port
|
|
537
|
-
cardinalityVariables.set(key, 0);
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
});
|
|
541
|
-
return {
|
|
542
|
-
...updated,
|
|
543
|
-
attributes: upsertAttributes(updated.attributes, [...cardinalityVariables].map(([name, value]) => ({ name, value, cfgStatus: 'Changed' }))),
|
|
544
|
-
};
|
|
545
|
-
};
|
|
546
|
-
const mapAttributes = (attributes) => {
|
|
547
|
-
return attributes.reduce((acc, { name, value }) => ({ ...acc, [name]: value }), {});
|
|
548
|
-
};
|
|
549
|
-
const getAttributes = (attributes, names = []) => {
|
|
550
|
-
const filtered = attributes.filter(({ name }) => names.includes(name));
|
|
551
|
-
return sortBy(filtered, [({ name }) => names.indexOf(name)]);
|
|
552
|
-
};
|
|
553
|
-
const upsertAttributes = (originalAttributes, attributesToUpsert) => {
|
|
554
|
-
return attributesToUpsert.reduce((acc, { name, value }) => {
|
|
555
|
-
const [origAttr] = getAttributes(acc, [name]);
|
|
556
|
-
return [
|
|
557
|
-
...acc.filter(attr => attr.name !== name),
|
|
558
|
-
{ ...(origAttr ?? { name, type: '' }), cfgStatus: origAttr ? 'Changed' : 'User', value },
|
|
559
|
-
];
|
|
560
|
-
}, originalAttributes);
|
|
561
|
-
};
|
|
562
|
-
const patchAttributes = (rootLineItem, id, attrs, skipCardinalityCalculation = false) => {
|
|
563
|
-
const lineItem = findLineItem(id, [rootLineItem]);
|
|
564
|
-
if (!lineItem) {
|
|
565
|
-
return rootLineItem;
|
|
566
|
-
}
|
|
567
|
-
const attributes = upsertAttributes(lineItem.attributes, attrs);
|
|
568
|
-
return replaceLineItem(rootLineItem, { ...lineItem, attributes }, skipCardinalityCalculation);
|
|
569
|
-
};
|
|
570
|
-
const getAttributeValue = (attributes, name) => attributes.find(attr => attr.name === name)?.value;
|
|
571
|
-
const generateLineItem = (port, type, parentId, attributes = [], lineItems = []) => {
|
|
326
|
+
const generateTransactionItem = (productId) => {
|
|
572
327
|
return {
|
|
573
328
|
id: UUID.UUID(),
|
|
574
|
-
|
|
575
|
-
type,
|
|
576
|
-
actionCode: 'ADD',
|
|
577
|
-
cfgStatus: 'New',
|
|
578
|
-
attributes: attributes.map(({ name, value }) => ({ cfgStatus: 'User', name, value })),
|
|
579
|
-
lineItems,
|
|
580
|
-
parentId,
|
|
581
|
-
qty: 1,
|
|
329
|
+
productId,
|
|
582
330
|
};
|
|
583
331
|
};
|
|
584
|
-
const getRecommendedPrices = (portDomain, type) => {
|
|
585
|
-
const domainType = portDomain.domainTypes.find(({ name }) => name === type);
|
|
586
|
-
const [net, list] = domainType?.recommendedPrices
|
|
587
|
-
?.filter(({ chargeMethod }) => chargeMethod === 'ONE_TIME')
|
|
588
|
-
.reduce((acc, rp) => {
|
|
589
|
-
const [netPrice, listPrice] = acc;
|
|
590
|
-
return [netPrice + rp.netPrice, listPrice + rp.listPrice];
|
|
591
|
-
}, [0, 0]) ?? [0, 0];
|
|
592
|
-
return { net, list };
|
|
593
|
-
};
|
|
594
|
-
const getOriginParent = (lineItems, currentLineItem) => {
|
|
595
|
-
let target = currentLineItem;
|
|
596
|
-
while (target && target.rampInstanceId) {
|
|
597
|
-
target = lineItems.find(sub => sub.id === currentLineItem.rampInstanceId);
|
|
598
|
-
}
|
|
599
|
-
return target;
|
|
600
|
-
};
|
|
601
|
-
const assetPredicateFn = (lineItem, assetId) => {
|
|
602
|
-
if (!assetId) {
|
|
603
|
-
return false;
|
|
604
|
-
}
|
|
605
|
-
return lineItem.assetId === assetId || lineItem.openOrderLineItemId === assetId;
|
|
606
|
-
};
|
|
607
|
-
const multiplyLineItems = (lineItem, qty, split) => {
|
|
608
|
-
if (split) {
|
|
609
|
-
const unifyIds = (lineItem) => ({
|
|
610
|
-
...lineItem,
|
|
611
|
-
id: UUID.UUID(),
|
|
612
|
-
lineItems: lineItem.lineItems.map(unifyIds),
|
|
613
|
-
});
|
|
614
|
-
return map$2(new Array(qty), () => unifyIds(lineItem));
|
|
615
|
-
}
|
|
616
|
-
else {
|
|
617
|
-
return [
|
|
618
|
-
{
|
|
619
|
-
...lineItem,
|
|
620
|
-
qty: qty,
|
|
621
|
-
},
|
|
622
|
-
];
|
|
623
|
-
}
|
|
624
|
-
};
|
|
625
|
-
const isTechnicalAttribute = (name) => {
|
|
626
|
-
return name.startsWith('#') || name.startsWith('$');
|
|
627
|
-
};
|
|
628
|
-
const filterOutTechnicalAttributes = (attributes) => {
|
|
629
|
-
return attributes.filter(({ name }) => !isTechnicalAttribute(name));
|
|
630
|
-
};
|
|
631
|
-
|
|
632
|
-
var lineItem_utils = /*#__PURE__*/Object.freeze({
|
|
633
|
-
__proto__: null,
|
|
634
|
-
assetPredicateFn: assetPredicateFn,
|
|
635
|
-
filterOutTechnicalAttributes: filterOutTechnicalAttributes,
|
|
636
|
-
findLineItem: findLineItem,
|
|
637
|
-
findLineItemWithComparator: findLineItemWithComparator,
|
|
638
|
-
generateLineItem: generateLineItem,
|
|
639
|
-
getAttributeValue: getAttributeValue,
|
|
640
|
-
getAttributes: getAttributes,
|
|
641
|
-
getOriginParent: getOriginParent,
|
|
642
|
-
getRecommendedPrices: getRecommendedPrices,
|
|
643
|
-
insertLineItem: insertLineItem,
|
|
644
|
-
isTechnicalAttribute: isTechnicalAttribute,
|
|
645
|
-
mapAttributes: mapAttributes,
|
|
646
|
-
multiplyLineItems: multiplyLineItems,
|
|
647
|
-
patchAttributes: patchAttributes,
|
|
648
|
-
recalculateCardinalityVariables: recalculateCardinalityVariables,
|
|
649
|
-
removeLineItem: removeLineItem,
|
|
650
|
-
replaceLineItem: replaceLineItem,
|
|
651
|
-
upsertAttributes: upsertAttributes
|
|
652
|
-
});
|
|
653
332
|
|
|
654
|
-
class
|
|
333
|
+
class TransactionItemWorker {
|
|
655
334
|
constructor(src) {
|
|
656
|
-
this.
|
|
335
|
+
this.ti = { ...src };
|
|
657
336
|
}
|
|
658
337
|
insert(parentId, toInsert) {
|
|
659
|
-
return new
|
|
338
|
+
return new TransactionItemWorker(insertTransactionItem(this.ti, parentId, toInsert));
|
|
660
339
|
}
|
|
661
340
|
remove(id) {
|
|
662
|
-
return new
|
|
341
|
+
return new TransactionItemWorker(removeTransactionItem(this.ti, id));
|
|
663
342
|
}
|
|
664
|
-
replace(toReplace
|
|
665
|
-
return new
|
|
666
|
-
}
|
|
667
|
-
patchAttribute(attrs, id, skipCardinalityCalculation = false) {
|
|
668
|
-
return new LineItemWorker(patchAttributes(this.li, id ?? this.li.id, attrs, skipCardinalityCalculation));
|
|
343
|
+
replace(toReplace) {
|
|
344
|
+
return new TransactionItemWorker(replaceTransactionItem(this.ti, toReplace));
|
|
669
345
|
}
|
|
670
346
|
}
|
|
671
347
|
|
|
@@ -677,226 +353,125 @@ function extractMetadata(uiDefinition) {
|
|
|
677
353
|
]);
|
|
678
354
|
}
|
|
679
355
|
|
|
680
|
-
class
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
let currentLevel = rootLineItems;
|
|
684
|
-
while (currentLevel.length && remainingUpdates.length) {
|
|
685
|
-
currentLevel.forEach(li => {
|
|
686
|
-
const unhandledUpdates = [];
|
|
687
|
-
remainingUpdates.forEach(update => {
|
|
688
|
-
let updated = false;
|
|
689
|
-
switch (update.dataType) {
|
|
690
|
-
case 'LINEITEM':
|
|
691
|
-
updated = this.applyLineItemUpdate(li, update, charges);
|
|
692
|
-
break;
|
|
693
|
-
case 'CHARGE':
|
|
694
|
-
updated = this.applyChargeUpdate(li, update);
|
|
695
|
-
break;
|
|
696
|
-
case 'GROUP_CHARGE':
|
|
697
|
-
updated = this.applyChargeGroupUpdate(li, update);
|
|
698
|
-
break;
|
|
699
|
-
default:
|
|
700
|
-
// Unknown dataType. Do not try to handle it anymore
|
|
701
|
-
updated = true;
|
|
702
|
-
}
|
|
703
|
-
if (!updated) {
|
|
704
|
-
unhandledUpdates.push(update);
|
|
705
|
-
}
|
|
706
|
-
});
|
|
707
|
-
remainingUpdates = unhandledUpdates;
|
|
708
|
-
});
|
|
709
|
-
currentLevel = flatten(currentLevel.map(parent => parent.lineItems));
|
|
710
|
-
}
|
|
711
|
-
}
|
|
712
|
-
delete(lineItems, id) {
|
|
713
|
-
const idsToRemove = [id];
|
|
714
|
-
const topLevelLineItem = lineItems.find(li => li.id === id);
|
|
715
|
-
if (topLevelLineItem) {
|
|
716
|
-
// find term-related line items (which are only top level)
|
|
717
|
-
// expired term line items won't be deleted
|
|
718
|
-
let foundTermLineItem = topLevelLineItem;
|
|
719
|
-
while (foundTermLineItem) {
|
|
720
|
-
foundTermLineItem = lineItems.find(li => foundTermLineItem && li.rampInstanceId === foundTermLineItem.id);
|
|
721
|
-
if (foundTermLineItem) {
|
|
722
|
-
idsToRemove.push(foundTermLineItem.id);
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
}
|
|
726
|
-
const filtered = lineItems.filter(lineItem => !idsToRemove.includes(lineItem.id));
|
|
727
|
-
return filtered.map(lineItem => new LineItemWorker(lineItem).remove(id).li);
|
|
356
|
+
class ConfigurationService {
|
|
357
|
+
get state$() {
|
|
358
|
+
return this.configurationStateSubj$.asObservable().pipe(filter(isDefined));
|
|
728
359
|
}
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
return false;
|
|
732
|
-
}
|
|
733
|
-
switch (update.attributeType) {
|
|
734
|
-
case 'QTY':
|
|
735
|
-
lineItem.qty = update.newValue;
|
|
736
|
-
break;
|
|
737
|
-
case 'EFFECTIVE_START_DATE':
|
|
738
|
-
lineItem.properties['StartDate'] = moment(update.newValue).format('YYYY-MM-DD');
|
|
739
|
-
break;
|
|
740
|
-
case 'END_DATE':
|
|
741
|
-
lineItem.properties['EndDate'] = moment(update.newValue).format('YYYY-MM-DD');
|
|
742
|
-
break;
|
|
743
|
-
case 'PRICE_ADJUSTMENT':
|
|
744
|
-
{
|
|
745
|
-
const charge = lineItem.chargeItems.find(charge => (charges || {})[charge.chargeId]?.main);
|
|
746
|
-
if (charge) {
|
|
747
|
-
charge.priceAdjustment = update.newValue;
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
break;
|
|
751
|
-
case 'LIST_PRICE_ADJUSTMENT':
|
|
752
|
-
case 'MARGIN_ADJUSTMENT':
|
|
753
|
-
{
|
|
754
|
-
const charge = lineItem.chargeItems.find(charge => (charges || {})[charge.chargeId]?.main);
|
|
755
|
-
if (charge) {
|
|
756
|
-
charge.listPriceAdjustment = update.newValue;
|
|
757
|
-
}
|
|
758
|
-
}
|
|
759
|
-
break;
|
|
760
|
-
case 'COST_ADJUSTMENT':
|
|
761
|
-
{
|
|
762
|
-
const charge = lineItem.chargeItems.find(charge => (charges || {})[charge.chargeId]?.main);
|
|
763
|
-
if (charge) {
|
|
764
|
-
charge.costAdjustment = update.newValue;
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
break;
|
|
768
|
-
default:
|
|
769
|
-
throw new Error(`Not suppored AttributeType for LineItem update: ${update.attributeType}`);
|
|
770
|
-
}
|
|
771
|
-
return true;
|
|
360
|
+
get state() {
|
|
361
|
+
return this.configurationStateSubj$.getValue();
|
|
772
362
|
}
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
if (!foundCharge) {
|
|
776
|
-
return false;
|
|
777
|
-
}
|
|
778
|
-
if (update.attributeType === 'PRICE_ADJUSTMENT') {
|
|
779
|
-
foundCharge.priceAdjustment = update.newValue;
|
|
780
|
-
}
|
|
781
|
-
else if (update.attributeType === 'LIST_PRICE_ADJUSTMENT') {
|
|
782
|
-
foundCharge.listPriceAdjustment = update.newValue;
|
|
783
|
-
}
|
|
784
|
-
else {
|
|
785
|
-
throw new Error(`Not suppored AttributeType for Charge Item update: ${update.attributeType}`);
|
|
786
|
-
}
|
|
787
|
-
return true;
|
|
363
|
+
get previousState() {
|
|
364
|
+
return this.previousConfigurationStateSubj$.getValue();
|
|
788
365
|
}
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
if (!foundChargeGroup) {
|
|
792
|
-
return false;
|
|
793
|
-
}
|
|
794
|
-
if (update.attributeType === 'PRICE_ADJUSTMENT') {
|
|
795
|
-
foundChargeGroup.priceAdjustment = update.newValue;
|
|
796
|
-
}
|
|
797
|
-
else if (update.attributeType === 'LIST_PRICE_ADJUSTMENT') {
|
|
798
|
-
foundChargeGroup.listPriceAdjustment = update.newValue;
|
|
799
|
-
}
|
|
800
|
-
else {
|
|
801
|
-
throw new Error(`Not suppored AttributeType for Charge Group Item update: ${update.attributeType}`);
|
|
802
|
-
}
|
|
803
|
-
return true;
|
|
366
|
+
get asset() {
|
|
367
|
+
return this.state?.assets[0] ?? null;
|
|
804
368
|
}
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
FlowUpdateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowUpdateService });
|
|
808
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowUpdateService, decorators: [{
|
|
809
|
-
type: Injectable
|
|
810
|
-
}] });
|
|
811
|
-
|
|
812
|
-
class FlowConfigurationService {
|
|
813
|
-
constructor(proceduresApiService,
|
|
814
|
-
// private quoteDraftService: QuoteDraftService,
|
|
815
|
-
salesTransactionService, updateService, configurationService, flowInfoService) {
|
|
816
|
-
this.proceduresApiService = proceduresApiService;
|
|
817
|
-
this.salesTransactionService = salesTransactionService;
|
|
818
|
-
this.updateService = updateService;
|
|
819
|
-
this.configurationService = configurationService;
|
|
820
|
-
this.flowInfoService = flowInfoService;
|
|
821
|
-
this.updatedSubj$ = new Subject();
|
|
822
|
-
this.updated$ = this.updatedSubj$.asObservable();
|
|
369
|
+
get root$() {
|
|
370
|
+
return this.state$.pipe(map$1(state => state.salesTransactionItems[0]), filter(isDefined));
|
|
823
371
|
}
|
|
824
|
-
|
|
825
|
-
return this.
|
|
372
|
+
get root() {
|
|
373
|
+
return this.configurationStateSubj$.getValue()?.salesTransactionItems[0] ?? null;
|
|
826
374
|
}
|
|
827
|
-
|
|
828
|
-
this.
|
|
375
|
+
constructor(flowInfoService, messageService, configurationRuntimeService, salesTransactionService, proceduresApiService) {
|
|
376
|
+
this.flowInfoService = flowInfoService;
|
|
377
|
+
this.messageService = messageService;
|
|
378
|
+
this.configurationRuntimeService = configurationRuntimeService;
|
|
379
|
+
this.salesTransactionService = salesTransactionService;
|
|
380
|
+
this.proceduresApiService = proceduresApiService;
|
|
381
|
+
this.hasUnsavedChanges = false;
|
|
382
|
+
this.configurationStateSubj$ = new BehaviorSubject(null);
|
|
383
|
+
this.previousConfigurationStateSubj$ = new BehaviorSubject(null);
|
|
384
|
+
this.isLoadingSubj$ = new BehaviorSubject(false);
|
|
385
|
+
this.isLoading$ = this.isLoadingSubj$.asObservable();
|
|
829
386
|
}
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
const currentLineItemIndex = currentState.findIndex(({ id }) => id === lineItemId);
|
|
835
|
-
const currentLineItem = currentState[currentLineItemIndex];
|
|
836
|
-
const initialLineItem = initialCurrentState.find(({ integrationId }) => integrationId === currentLineItem?.integrationId);
|
|
837
|
-
if (!state || !currentLineItem || !initialLineItem) {
|
|
838
|
-
return of(null);
|
|
839
|
-
}
|
|
840
|
-
const updatedState = cloneDeep(currentState);
|
|
841
|
-
updatedState.splice(currentLineItemIndex, 1, initialLineItem);
|
|
842
|
-
return of([]).pipe(tap$1(() => {
|
|
843
|
-
this.salesTransactionService.setState({ ...state, salesTransactionItems: updatedState });
|
|
844
|
-
}), switchMap(() => this.calculate$({ ...state, salesTransactionItems: updatedState })), map$1(() => this.salesTransactionService.state), tap$1(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
|
|
387
|
+
reset() {
|
|
388
|
+
this.hasUnsavedChanges = false;
|
|
389
|
+
this.configurationStateSubj$.next(null);
|
|
390
|
+
this.previousConfigurationStateSubj$.next(null);
|
|
845
391
|
}
|
|
846
|
-
|
|
847
|
-
this.
|
|
392
|
+
init$() {
|
|
393
|
+
const { state } = this.salesTransactionService;
|
|
394
|
+
const { productId, transactionItemId } = this.flowInfoService.context;
|
|
395
|
+
if (!state) {
|
|
396
|
+
return of(undefined);
|
|
397
|
+
}
|
|
398
|
+
let transactionItem = state?.salesTransactionItems.find(item => item.id === transactionItemId);
|
|
399
|
+
if (!transactionItem) {
|
|
400
|
+
transactionItem = state.salesTransactionItems.find(item => item.productId === productId);
|
|
401
|
+
}
|
|
402
|
+
const assetItem = transactionItem ? state?.assets.find(item => item.id === transactionItem?.assetId) : undefined;
|
|
403
|
+
const configurationState = {
|
|
404
|
+
...state,
|
|
405
|
+
salesTransactionItems: transactionItem ? [transactionItem] : [],
|
|
406
|
+
assets: assetItem ? [assetItem] : [],
|
|
407
|
+
};
|
|
408
|
+
this.configurationStateSubj$.next(configurationState);
|
|
409
|
+
this.previousConfigurationStateSubj$.next(configurationState);
|
|
410
|
+
return of(undefined);
|
|
848
411
|
}
|
|
849
|
-
|
|
850
|
-
const state = this
|
|
412
|
+
patch$(transactionItem) {
|
|
413
|
+
const { state, root } = this;
|
|
851
414
|
if (!state) {
|
|
852
|
-
return
|
|
415
|
+
return throwError(() => new Error(`Configuration State is not initialized`));
|
|
416
|
+
}
|
|
417
|
+
if (!root) {
|
|
418
|
+
return throwError(() => new Error(`Root SalesTransactionItem not found`));
|
|
853
419
|
}
|
|
854
|
-
|
|
420
|
+
const newRoot = new TransactionItemWorker(root).replace(transactionItem).ti;
|
|
421
|
+
const newSalesTransaction = {
|
|
422
|
+
...state,
|
|
423
|
+
salesTransactionItems: [newRoot],
|
|
424
|
+
};
|
|
425
|
+
return this.configureRequest$(newSalesTransaction).pipe(catchError(error => {
|
|
426
|
+
console.error(error);
|
|
427
|
+
if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
|
|
428
|
+
this.messageService.add({ severity: 'error', summary: error });
|
|
429
|
+
}
|
|
430
|
+
return throwError(() => error);
|
|
431
|
+
}), tap$1(() => {
|
|
432
|
+
if (!this.hasUnsavedChanges) {
|
|
433
|
+
this.hasUnsavedChanges = true;
|
|
434
|
+
}
|
|
435
|
+
}), map$1(noop));
|
|
855
436
|
}
|
|
856
|
-
|
|
857
|
-
this.
|
|
437
|
+
patch(transactionItem) {
|
|
438
|
+
this.patch$(transactionItem).subscribe();
|
|
858
439
|
}
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
440
|
+
configureRequest$(salesTransaction) {
|
|
441
|
+
const request = {
|
|
442
|
+
salesTransaction,
|
|
443
|
+
};
|
|
444
|
+
this.isLoadingSubj$.next(true);
|
|
445
|
+
return this.proceduresApiService.apply$(request).pipe(tap$1(result => {
|
|
446
|
+
const newState = result.salesTransaction;
|
|
447
|
+
this.configurationStateSubj$.next(newState);
|
|
448
|
+
this.previousConfigurationStateSubj$.next(cloneDeep(newState));
|
|
449
|
+
}), map$1(response => response.salesTransaction), catchError(error => throwError(() => {
|
|
450
|
+
const resetState = this.previousConfigurationStateSubj$.getValue();
|
|
451
|
+
if (resetState) {
|
|
452
|
+
this.previousConfigurationStateSubj$.next(cloneDeep(resetState));
|
|
453
|
+
this.configurationStateSubj$.next(resetState);
|
|
454
|
+
}
|
|
455
|
+
if (error.error) {
|
|
456
|
+
return extractErrorDetails(error.error).join('. ');
|
|
457
|
+
}
|
|
458
|
+
return error.message || JSON.stringify(error);
|
|
459
|
+
})), finalize(() => this.isLoadingSubj$.next(false)));
|
|
862
460
|
}
|
|
863
|
-
|
|
461
|
+
configureExternal$(props) {
|
|
864
462
|
// TODO: implement
|
|
865
|
-
|
|
463
|
+
throw new Error('Not implemented');
|
|
866
464
|
}
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
console.error(error);
|
|
871
|
-
// bounce back if configuration call has failed
|
|
872
|
-
const state = this.salesTransactionService.state;
|
|
873
|
-
if (state) {
|
|
874
|
-
this.salesTransactionService.setState(state);
|
|
875
|
-
this.updatedSubj$.next();
|
|
876
|
-
}
|
|
877
|
-
return throwError(() => error);
|
|
878
|
-
}));
|
|
879
|
-
};
|
|
465
|
+
configureGuidedSelling$(data) {
|
|
466
|
+
// TODO: implement
|
|
467
|
+
throw new Error('Not implemented');
|
|
880
468
|
}
|
|
881
469
|
}
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type:
|
|
470
|
+
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: i4.ProceduresApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
471
|
+
ConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService });
|
|
472
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, decorators: [{
|
|
885
473
|
type: Injectable
|
|
886
|
-
}], ctorParameters: function () { return [{ type:
|
|
887
|
-
|
|
888
|
-
class FlowConfigurationModule {
|
|
889
|
-
}
|
|
890
|
-
FlowConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
891
|
-
FlowConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, imports: [ApiModule] });
|
|
892
|
-
FlowConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, providers: [FlowConfigurationService, FlowUpdateService], imports: [ApiModule] });
|
|
893
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, decorators: [{
|
|
894
|
-
type: NgModule,
|
|
895
|
-
args: [{
|
|
896
|
-
imports: [ApiModule],
|
|
897
|
-
providers: [FlowConfigurationService, FlowUpdateService],
|
|
898
|
-
}]
|
|
899
|
-
}] });
|
|
474
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: i2.MessageService }, { type: ConfigurationRuntimeService }, { type: SalesTransactionService }, { type: i4.ProceduresApiService }]; } });
|
|
900
475
|
|
|
901
476
|
class SalesTransactionService {
|
|
902
477
|
get isInitialized$() {
|
|
@@ -908,7 +483,7 @@ class SalesTransactionService {
|
|
|
908
483
|
set hasUnsavedChanges(value) {
|
|
909
484
|
this.hasUnsavedChangesSubj$.next(value);
|
|
910
485
|
if (!this.hasUnsavedChanges) {
|
|
911
|
-
this.
|
|
486
|
+
this.initialState = this.state?.salesTransactionItems ?? [];
|
|
912
487
|
}
|
|
913
488
|
}
|
|
914
489
|
get hasUnsavedChanges() {
|
|
@@ -917,18 +492,24 @@ class SalesTransactionService {
|
|
|
917
492
|
get state() {
|
|
918
493
|
return this.stateSubj$.getValue();
|
|
919
494
|
}
|
|
495
|
+
get hasAssets() {
|
|
496
|
+
return Boolean(this.state?.assets.length);
|
|
497
|
+
}
|
|
498
|
+
get hasProducts() {
|
|
499
|
+
return Boolean(this.state?.salesTransactionItems.length);
|
|
500
|
+
}
|
|
920
501
|
constructor(flowInfoService, salesTransactionApiService) {
|
|
921
502
|
this.flowInfoService = flowInfoService;
|
|
922
503
|
this.salesTransactionApiService = salesTransactionApiService;
|
|
923
504
|
this.stateSubj$ = new BehaviorSubject(null);
|
|
924
505
|
this.isInitializedSubj$ = new BehaviorSubject(false);
|
|
925
506
|
this.hasUnsavedChangesSubj$ = new BehaviorSubject(false);
|
|
926
|
-
this.
|
|
507
|
+
this.initialState = [];
|
|
927
508
|
this.hasUnsavedChanges$ = this.hasUnsavedChangesSubj$.asObservable();
|
|
928
|
-
this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
|
|
509
|
+
this.state$ = this.stateSubj$.asObservable().pipe(filter$1(isDefined));
|
|
929
510
|
}
|
|
930
511
|
init(headerId, params) {
|
|
931
|
-
return this.salesTransactionApiService.getState(headerId, params).pipe(tap
|
|
512
|
+
return this.salesTransactionApiService.getState(headerId, params).pipe(tap(res => this.stateSubj$.next(res.salesTransaction)), map(res => res.salesTransaction));
|
|
932
513
|
}
|
|
933
514
|
finalizeInit() {
|
|
934
515
|
this.isInitializedSubj$.next(true);
|
|
@@ -939,27 +520,90 @@ class SalesTransactionService {
|
|
|
939
520
|
this.isInitializedSubj$.next(false);
|
|
940
521
|
this.hasUnsavedChangesSubj$.next(false);
|
|
941
522
|
}
|
|
942
|
-
|
|
943
|
-
return this.
|
|
523
|
+
getInitialState() {
|
|
524
|
+
return this.initialState;
|
|
944
525
|
}
|
|
945
526
|
setState(state) {
|
|
946
527
|
this.stateSubj$.next(state);
|
|
947
528
|
}
|
|
948
529
|
}
|
|
949
|
-
SalesTransactionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, deps: [{ token: FlowInfoService }, { token:
|
|
530
|
+
SalesTransactionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, deps: [{ token: FlowInfoService }, { token: i4.SalesTransactionApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
950
531
|
SalesTransactionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService });
|
|
951
532
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, decorators: [{
|
|
952
533
|
type: Injectable
|
|
953
|
-
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type:
|
|
534
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: i4.SalesTransactionApiService }]; } });
|
|
954
535
|
|
|
955
|
-
class
|
|
956
|
-
constructor(
|
|
536
|
+
class FlowConfigurationService {
|
|
537
|
+
constructor(proceduresApiService, salesTransactionService) {
|
|
538
|
+
this.proceduresApiService = proceduresApiService;
|
|
957
539
|
this.salesTransactionService = salesTransactionService;
|
|
958
|
-
this.
|
|
540
|
+
this.updatedSubj$ = new Subject();
|
|
541
|
+
this.updated$ = this.updatedSubj$.asObservable();
|
|
542
|
+
}
|
|
543
|
+
calculate$(state) {
|
|
544
|
+
return this.proceduresApiService.apply$({ salesTransaction: state }).pipe(tap(result => this.salesTransactionService.setState(result.salesTransaction)), map(noop));
|
|
545
|
+
}
|
|
546
|
+
calculate(state) {
|
|
547
|
+
this.calculate$(state).subscribe();
|
|
548
|
+
}
|
|
549
|
+
revert$(transactionItemId) {
|
|
550
|
+
const state = this.salesTransactionService.state;
|
|
551
|
+
const initialState = this.salesTransactionService.getInitialState();
|
|
552
|
+
const currentState = state?.salesTransactionItems ?? [];
|
|
553
|
+
const currentItemIndex = currentState.findIndex(({ id }) => id === transactionItemId);
|
|
554
|
+
const currentItem = currentState[currentItemIndex];
|
|
555
|
+
const initialItem = initialState.find(({ integrationId }) => integrationId === currentItem?.integrationId);
|
|
556
|
+
if (!state || !currentItem || !initialItem) {
|
|
557
|
+
return of(null);
|
|
558
|
+
}
|
|
559
|
+
const updatedState = cloneDeep(currentState);
|
|
560
|
+
updatedState.splice(currentItemIndex, 1, initialItem);
|
|
561
|
+
return of([]).pipe(tap(() => {
|
|
562
|
+
this.salesTransactionService.setState({ ...state, salesTransactionItems: updatedState });
|
|
563
|
+
}), switchMap(() => this.calculate$({ ...state, salesTransactionItems: updatedState })), map(() => this.salesTransactionService.state), tap(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
|
|
564
|
+
}
|
|
565
|
+
revert(transactionItemId) {
|
|
566
|
+
this.revert$(transactionItemId).subscribe();
|
|
567
|
+
}
|
|
568
|
+
delete$(ids) {
|
|
569
|
+
const state = this.salesTransactionService.state;
|
|
570
|
+
if (!state) {
|
|
571
|
+
return of(null);
|
|
572
|
+
}
|
|
573
|
+
return of([]).pipe(map(() => state.salesTransactionItems.filter(({ id }) => !ids.includes(id))), switchMap(updatedState => this.calculate$({ ...state, salesTransactionItems: updatedState })), map(() => this.salesTransactionService.state), tap(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
|
|
574
|
+
}
|
|
575
|
+
delete(ids) {
|
|
576
|
+
this.delete$(ids).subscribe();
|
|
577
|
+
}
|
|
578
|
+
handleErrorAndBounceBack() {
|
|
579
|
+
return (source$) => {
|
|
580
|
+
return source$.pipe(catchError$1(error => {
|
|
581
|
+
console.error(error);
|
|
582
|
+
// bounce back if configuration call has failed
|
|
583
|
+
const state = this.salesTransactionService.state;
|
|
584
|
+
if (state) {
|
|
585
|
+
this.salesTransactionService.setState(state);
|
|
586
|
+
this.updatedSubj$.next();
|
|
587
|
+
}
|
|
588
|
+
return throwError(() => error);
|
|
589
|
+
}));
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
FlowConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, deps: [{ token: i4.ProceduresApiService }, { token: SalesTransactionService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
594
|
+
FlowConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService });
|
|
595
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, decorators: [{
|
|
596
|
+
type: Injectable
|
|
597
|
+
}], ctorParameters: function () { return [{ type: i4.ProceduresApiService }, { type: SalesTransactionService }]; } });
|
|
598
|
+
|
|
599
|
+
class FlowStateService {
|
|
600
|
+
constructor(flowConfiguration, flowInfoService, flowStateApiService, processorsApiService, salesTransactionApiService, salesTransactionService, toastService, customizationService) {
|
|
959
601
|
this.flowConfiguration = flowConfiguration;
|
|
960
|
-
this.
|
|
602
|
+
this.flowInfoService = flowInfoService;
|
|
961
603
|
this.flowStateApiService = flowStateApiService;
|
|
604
|
+
this.processorsApiService = processorsApiService;
|
|
962
605
|
this.salesTransactionApiService = salesTransactionApiService;
|
|
606
|
+
this.salesTransactionService = salesTransactionService;
|
|
963
607
|
this.toastService = toastService;
|
|
964
608
|
this.customizationService = customizationService;
|
|
965
609
|
this.NOT_INITIALIZED = Symbol();
|
|
@@ -980,44 +624,18 @@ class FlowStateService {
|
|
|
980
624
|
all subscriptions get their updates according to updated QuoteDraft
|
|
981
625
|
*/
|
|
982
626
|
this.isInitialized$()
|
|
983
|
-
.pipe(filter(Boolean), filter(() => !this.
|
|
627
|
+
.pipe(filter$1(Boolean), filter$1(() => !this.flowInfoService.flow.properties.stateful), switchMap(() => this.flowConfiguration.updated$), switchMap(() => this.executeRequest$({}, true)))
|
|
984
628
|
.subscribe();
|
|
985
|
-
this.charges$ = this.flowInfoService.isFlowEngineInitialized$.pipe(filter(Boolean), switchMap(() => {
|
|
986
|
-
return this.subscribe$(UITemplateType.FLOW_ENGINE, 'CHARGES', null, {
|
|
987
|
-
cold: true,
|
|
988
|
-
}).pipe(map$1(response => (response.success ? response.result : {})));
|
|
989
|
-
}), shareReplay(1));
|
|
990
|
-
this.charges$.subscribe();
|
|
991
|
-
this.pricePlans$ = this.flowInfoService.isFlowEngineInitialized$.pipe(filter(Boolean), switchMap(() => {
|
|
992
|
-
return this.subscribe$(UITemplateType.FLOW_ENGINE, 'PRICE_PLANS', null, {
|
|
993
|
-
cold: true,
|
|
994
|
-
}).pipe(map$1(response => (response.success ? response.result : {})));
|
|
995
|
-
}), shareReplay(1));
|
|
996
|
-
this.pricePlans$.subscribe();
|
|
997
|
-
this.activeMetrics$ = this.flowInfoService.isFlowEngineInitialized$.pipe(filter(Boolean), switchMap(() => {
|
|
998
|
-
return this.subscribe$(UITemplateType.FLOW_ENGINE, 'ACTIVE_METRICS', null, {
|
|
999
|
-
cold: true,
|
|
1000
|
-
}).pipe(map$1(response => (response.success ? response.result : [])));
|
|
1001
|
-
}), shareReplay(1));
|
|
1002
|
-
this.activeMetrics$.subscribe();
|
|
1003
|
-
this.isPriceListLocked$ = this.flowInfoService.isFlowEngineInitialized$.pipe(filter(Boolean), switchMap(() => {
|
|
1004
|
-
return this.subscribe$(UITemplateType.FLOW_ENGINE, 'IS_PRICE_LIST_LOCKED', null, {
|
|
1005
|
-
cold: true,
|
|
1006
|
-
}).pipe(map$1(response => (response.success ? response.result : false)));
|
|
1007
|
-
}), shareReplay(1));
|
|
1008
|
-
this.isPriceListLocked$.subscribe();
|
|
1009
629
|
}
|
|
1010
630
|
init$() {
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
}
|
|
1018
|
-
}));
|
|
631
|
+
if (this.flowInfoService.flow.properties.stateful) {
|
|
632
|
+
return this.initProcessors$().pipe(switchMap(() => this.initStateful$()));
|
|
633
|
+
}
|
|
634
|
+
else {
|
|
635
|
+
return forkJoin([this.initStateless$(), this.initProcessors$()]).pipe(map(noop));
|
|
636
|
+
}
|
|
1019
637
|
}
|
|
1020
|
-
|
|
638
|
+
reset() {
|
|
1021
639
|
Object.values(this.subscriptions).forEach(({ data$ }) => data$.complete());
|
|
1022
640
|
this.subscriptions = {};
|
|
1023
641
|
if (this.stateId$.value) {
|
|
@@ -1029,7 +647,7 @@ class FlowStateService {
|
|
|
1029
647
|
this.cleanup$.next();
|
|
1030
648
|
}
|
|
1031
649
|
get hasUnsavedChanges() {
|
|
1032
|
-
return this.
|
|
650
|
+
return this.flowInfoService.flow.properties.stateful
|
|
1033
651
|
? Array.from(this.trackedStatefulChangesMap.values()).some(Boolean)
|
|
1034
652
|
: this.salesTransactionService.hasUnsavedChanges;
|
|
1035
653
|
}
|
|
@@ -1040,14 +658,14 @@ class FlowStateService {
|
|
|
1040
658
|
return this.executionInProgress$.asObservable();
|
|
1041
659
|
}
|
|
1042
660
|
isInitialized$() {
|
|
1043
|
-
return combineLatest([this.stateId$, this.salesTransactionService.isInitialized$]).pipe(map
|
|
661
|
+
return combineLatest([this.stateId$, this.salesTransactionService.isInitialized$]).pipe(map(values => values.some(Boolean)));
|
|
1044
662
|
}
|
|
1045
663
|
isInitialized() {
|
|
1046
664
|
return Boolean(this.stateId$.value) || this.salesTransactionService.isInitialized;
|
|
1047
665
|
}
|
|
1048
666
|
execute$(scope, exec) {
|
|
1049
667
|
const request = this.execToRequest(scope, exec);
|
|
1050
|
-
return this.executeRequest$(request).pipe(map
|
|
668
|
+
return this.executeRequest$(request).pipe(map(result => {
|
|
1051
669
|
// Keep only requested results
|
|
1052
670
|
const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
|
|
1053
671
|
if (exec.selectors?.[requestId]) {
|
|
@@ -1063,7 +681,7 @@ class FlowStateService {
|
|
|
1063
681
|
actions: [{ name: action, inputData }],
|
|
1064
682
|
};
|
|
1065
683
|
const request = this.execToRequest(scope, exec);
|
|
1066
|
-
return this.executeRequest$(request).pipe(map
|
|
684
|
+
return this.executeRequest$(request).pipe(map(noop));
|
|
1067
685
|
}
|
|
1068
686
|
select$(scope, selectorName, inputData) {
|
|
1069
687
|
const requestId = this.generateRequestId(scope, selectorName, inputData);
|
|
@@ -1075,7 +693,7 @@ class FlowStateService {
|
|
|
1075
693
|
},
|
|
1076
694
|
},
|
|
1077
695
|
});
|
|
1078
|
-
return this.executeRequest$(request).pipe(map
|
|
696
|
+
return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
|
|
1079
697
|
}
|
|
1080
698
|
subscribe$(scope, selectorName, inputData, options) {
|
|
1081
699
|
const requestId = this.generateRequestId(scope, selectorName, inputData);
|
|
@@ -1101,16 +719,16 @@ class FlowStateService {
|
|
|
1101
719
|
this.executeRequest$(request).subscribe();
|
|
1102
720
|
}
|
|
1103
721
|
}
|
|
1104
|
-
return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map
|
|
722
|
+
return subscription.data$.pipe(filter$1(data => data != this.NOT_INITIALIZED), map(data => data), finalize$1(() => {
|
|
1105
723
|
if (!this.subscriptions[requestId]?.data$.observed) {
|
|
1106
724
|
delete this.subscriptions[requestId];
|
|
1107
725
|
}
|
|
1108
726
|
}));
|
|
1109
727
|
}
|
|
1110
728
|
save$() {
|
|
1111
|
-
if (this.
|
|
729
|
+
if (this.flowInfoService.flow.properties.stateful) {
|
|
1112
730
|
if (this.stateId$.value) {
|
|
1113
|
-
return this.flowStateApiService.save(this.stateId$.value).pipe(map
|
|
731
|
+
return this.flowStateApiService.save(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })), tap(() => {
|
|
1114
732
|
Array.from(this.trackedStatefulChangesMap.keys()).forEach(key => {
|
|
1115
733
|
this.trackedStatefulChangesMap.set(key, false);
|
|
1116
734
|
});
|
|
@@ -1126,9 +744,9 @@ class FlowStateService {
|
|
|
1126
744
|
return of({ id: '' });
|
|
1127
745
|
}
|
|
1128
746
|
submit$() {
|
|
1129
|
-
if (this.
|
|
747
|
+
if (this.flowInfoService.flow.properties.stateful) {
|
|
1130
748
|
if (this.stateId$.value) {
|
|
1131
|
-
return this.flowStateApiService.submit(this.stateId$.value).pipe(map
|
|
749
|
+
return this.flowStateApiService.submit(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })));
|
|
1132
750
|
}
|
|
1133
751
|
}
|
|
1134
752
|
else {
|
|
@@ -1175,10 +793,10 @@ class FlowStateService {
|
|
|
1175
793
|
fullRequest.selectors = assign(fullRequest.selectors, subscription.request.selectors);
|
|
1176
794
|
}
|
|
1177
795
|
}
|
|
1178
|
-
const execution$ = this.
|
|
796
|
+
const execution$ = this.flowInfoService.flow.properties.stateful
|
|
1179
797
|
? this.executeStateful$(fullRequest)
|
|
1180
798
|
: this.executeStateless$(fullRequest);
|
|
1181
|
-
return execution$.pipe(tap
|
|
799
|
+
return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
|
|
1182
800
|
}
|
|
1183
801
|
handleSelectorsResponse(selectors) {
|
|
1184
802
|
Object.entries(selectors).forEach(([requestId, selectorResult]) => {
|
|
@@ -1207,7 +825,7 @@ class FlowStateService {
|
|
|
1207
825
|
selectorsOverride: processors?.filter(processor => processor.type === ConfigurationProcessorTypes.SELECTOR),
|
|
1208
826
|
selectors: selectors,
|
|
1209
827
|
})
|
|
1210
|
-
.pipe(map
|
|
828
|
+
.pipe(map(({ stateId, selectors }) => {
|
|
1211
829
|
this.handleSelectorsResponse(selectors);
|
|
1212
830
|
this.stateId$.next(stateId);
|
|
1213
831
|
}));
|
|
@@ -1227,30 +845,30 @@ class FlowStateService {
|
|
|
1227
845
|
};
|
|
1228
846
|
this.executionInProgress$.next(true);
|
|
1229
847
|
return this.flowStateApiService.execute(this.stateId$.value, request);
|
|
1230
|
-
}), tap
|
|
848
|
+
}), tap(({ stateId }) => this.stateId$.next(stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError$1(e => {
|
|
1231
849
|
this.executionInProgress$.next(false);
|
|
1232
850
|
return throwError(() => e);
|
|
1233
851
|
}));
|
|
1234
852
|
}
|
|
1235
853
|
executeStateful$(request) {
|
|
1236
|
-
return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
|
|
854
|
+
return this.executionInProgress$.pipe(filter$1(inProgress => !inProgress), take(1), switchMap(() =>
|
|
1237
855
|
// make sure stream switches to statefulExecutionRequest$ before pushing an execution request
|
|
1238
856
|
combineLatest([
|
|
1239
857
|
this.statefulExecutionRequest$,
|
|
1240
|
-
of(undefined).pipe(tap
|
|
1241
|
-
])), map
|
|
858
|
+
of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
|
|
859
|
+
])), map(([response]) => response), take(1));
|
|
1242
860
|
}
|
|
1243
861
|
initStateless$() {
|
|
1244
|
-
return this.salesTransactionService.init(this.flowInfoService.context.headerId, this.flowInfoService.context).pipe(tap
|
|
862
|
+
return this.salesTransactionService.init(this.flowInfoService.context.headerId, this.flowInfoService.context).pipe(tap(() => {
|
|
1245
863
|
const assets = this.salesTransactionService.state?.assets;
|
|
1246
864
|
if (assets) {
|
|
1247
865
|
this.flowStore = { ...this.flowStore, assets };
|
|
1248
866
|
}
|
|
1249
|
-
}), switchMap(state => this.flowConfiguration.calculate$(state)), tap
|
|
867
|
+
}), switchMap(state => this.flowConfiguration.calculate$(state)), tap(() => this.salesTransactionService.finalizeInit()), map(noop));
|
|
1250
868
|
}
|
|
1251
869
|
executeStateless$(request) {
|
|
1252
870
|
this.executionInProgress$.next(true);
|
|
1253
|
-
return of(undefined).pipe(tap
|
|
871
|
+
return of(undefined).pipe(tap(() => this.executeStatelessActions(request)), switchMap(() => {
|
|
1254
872
|
/*
|
|
1255
873
|
Skip price calculation in case
|
|
1256
874
|
1. No actions in the request
|
|
@@ -1263,7 +881,7 @@ class FlowStateService {
|
|
|
1263
881
|
else {
|
|
1264
882
|
return this.flowConfiguration.calculate$(state);
|
|
1265
883
|
}
|
|
1266
|
-
}), map
|
|
884
|
+
}), map(() => this.executeStatelessSelectors(request)), tap(() => this.executionInProgress$.next(false)), catchError$1(e => {
|
|
1267
885
|
this.executionInProgress$.next(false);
|
|
1268
886
|
return throwError(() => e);
|
|
1269
887
|
}));
|
|
@@ -1308,16 +926,9 @@ class FlowStateService {
|
|
|
1308
926
|
return result;
|
|
1309
927
|
}, { stateId: '', selectors: {} });
|
|
1310
928
|
}
|
|
1311
|
-
getFlowSafe() {
|
|
1312
|
-
if (!this.flowInfoService.flow) {
|
|
1313
|
-
throw 'Flow is not defined';
|
|
1314
|
-
}
|
|
1315
|
-
return this.flowInfoService.flow;
|
|
1316
|
-
}
|
|
1317
929
|
initProcessors$() {
|
|
1318
930
|
const hasOverrides = Boolean(this.customizationService?.getTemplateConfigurationProcessors);
|
|
1319
|
-
|
|
1320
|
-
if (flow.properties.stateful && !hasOverrides) {
|
|
931
|
+
if (this.flowInfoService.flow.properties.stateful && !hasOverrides) {
|
|
1321
932
|
// Skip initialization as backend will take processors from SF
|
|
1322
933
|
return of(undefined);
|
|
1323
934
|
}
|
|
@@ -1327,7 +938,7 @@ class FlowStateService {
|
|
|
1327
938
|
return;
|
|
1328
939
|
}
|
|
1329
940
|
const localProcessors$ = this.customizationService?.getTemplateConfigurationProcessors?.(template.name) ?? of(null);
|
|
1330
|
-
return localProcessors$.pipe(switchMap(processors => processors ? of(processors) : this.processorsApiService.fetchConfigurationProcessors$(template.id)), tap
|
|
941
|
+
return localProcessors$.pipe(switchMap(processors => processors ? of(processors) : this.processorsApiService.fetchConfigurationProcessors$(template.id)), tap(processors => {
|
|
1331
942
|
const processorsMap = processors.reduce((acc, p) => {
|
|
1332
943
|
acc[p.apiName] = p;
|
|
1333
944
|
return acc;
|
|
@@ -1339,7 +950,7 @@ class FlowStateService {
|
|
|
1339
950
|
if (!owners$.length) {
|
|
1340
951
|
return of(undefined);
|
|
1341
952
|
}
|
|
1342
|
-
return forkJoin(owners$).pipe(map
|
|
953
|
+
return forkJoin(owners$).pipe(map(noop));
|
|
1343
954
|
}
|
|
1344
955
|
executeActionScript(request, executable) {
|
|
1345
956
|
const configurationProcessor = this.processors[executable.ownerId]?.[executable.apiName];
|
|
@@ -1388,11 +999,11 @@ class FlowStateService {
|
|
|
1388
999
|
}
|
|
1389
1000
|
}
|
|
1390
1001
|
}
|
|
1391
|
-
FlowStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, deps: [{ token:
|
|
1002
|
+
FlowStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, deps: [{ token: FlowConfigurationService }, { token: FlowInfoService }, { token: i1.FlowStateApiService }, { token: i4.ConfigurationProcessorsApiService }, { token: i4.SalesTransactionApiService }, { token: SalesTransactionService }, { token: i6.ToastService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1392
1003
|
FlowStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService });
|
|
1393
1004
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, decorators: [{
|
|
1394
1005
|
type: Injectable
|
|
1395
|
-
}], ctorParameters: function () { return [{ type:
|
|
1006
|
+
}], ctorParameters: function () { return [{ type: FlowConfigurationService }, { type: FlowInfoService }, { type: i1.FlowStateApiService }, { type: i4.ConfigurationProcessorsApiService }, { type: i4.SalesTransactionApiService }, { type: SalesTransactionService }, { type: i6.ToastService }, { type: undefined, decorators: [{
|
|
1396
1007
|
type: Optional
|
|
1397
1008
|
}, {
|
|
1398
1009
|
type: Inject,
|
|
@@ -1400,15 +1011,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
1400
1011
|
}] }]; } });
|
|
1401
1012
|
|
|
1402
1013
|
class FlowStateConfigurationService {
|
|
1403
|
-
constructor(flowInfoService,
|
|
1014
|
+
constructor(flowInfoService, flowStateService) {
|
|
1404
1015
|
this.flowInfoService = flowInfoService;
|
|
1405
|
-
this.flowConfigurationService = flowConfigurationService;
|
|
1406
|
-
this.flowStateApiService = flowStateApiService;
|
|
1407
1016
|
this.flowStateService = flowStateService;
|
|
1408
|
-
this.configurationStateId$ = new BehaviorSubject(null);
|
|
1409
|
-
}
|
|
1410
|
-
get configurationStateId() {
|
|
1411
|
-
return this.configurationStateId$.value;
|
|
1412
1017
|
}
|
|
1413
1018
|
addToCart$(props) {
|
|
1414
1019
|
let request$;
|
|
@@ -1419,26 +1024,22 @@ class FlowStateConfigurationService {
|
|
|
1419
1024
|
request$ = of();
|
|
1420
1025
|
}
|
|
1421
1026
|
else {
|
|
1422
|
-
|
|
1423
|
-
request$ =
|
|
1424
|
-
if (!this.configurationStateId) {
|
|
1425
|
-
return of();
|
|
1426
|
-
}
|
|
1427
|
-
return this.flowStateApiService.saveConfiguration(stateId, this.configurationStateId).pipe(tap$1(() => this.configurationStateId$.next(null)), map$1(noop));
|
|
1428
|
-
}));
|
|
1027
|
+
// TODO: Implement
|
|
1028
|
+
request$ = of();
|
|
1429
1029
|
}
|
|
1430
1030
|
}
|
|
1431
1031
|
else {
|
|
1432
|
-
|
|
1032
|
+
// TODO: Implement
|
|
1033
|
+
request$ = of();
|
|
1433
1034
|
}
|
|
1434
|
-
return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map
|
|
1035
|
+
return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map(noop));
|
|
1435
1036
|
}
|
|
1436
1037
|
}
|
|
1437
|
-
FlowStateConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, deps: [{ token: FlowInfoService }, { token:
|
|
1038
|
+
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 });
|
|
1438
1039
|
FlowStateConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService });
|
|
1439
1040
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, decorators: [{
|
|
1440
1041
|
type: Injectable
|
|
1441
|
-
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type:
|
|
1042
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: FlowStateService }]; } });
|
|
1442
1043
|
|
|
1443
1044
|
class IntegrationState {
|
|
1444
1045
|
constructor() {
|
|
@@ -1458,12 +1059,12 @@ class IntegrationState {
|
|
|
1458
1059
|
this.action$.next(action);
|
|
1459
1060
|
}
|
|
1460
1061
|
listen$(actionType) {
|
|
1461
|
-
return this.action$.pipe(filter(action => action.type === actionType), map
|
|
1062
|
+
return this.action$.pipe(filter$1(action => action.type === actionType), map(action => action.payload));
|
|
1462
1063
|
}
|
|
1463
1064
|
listenAll$() {
|
|
1464
1065
|
return this.action$.asObservable();
|
|
1465
1066
|
}
|
|
1466
|
-
|
|
1067
|
+
reset() {
|
|
1467
1068
|
this.stateSubj$.next({});
|
|
1468
1069
|
}
|
|
1469
1070
|
}
|
|
@@ -1483,12 +1084,12 @@ class ProductImagesService {
|
|
|
1483
1084
|
this.imagesMap$.next({ ...this.imagesMap$.value, [productId]: '' });
|
|
1484
1085
|
this.fetchProductImage(productId);
|
|
1485
1086
|
}
|
|
1486
|
-
return this.imagesMap$.pipe(map
|
|
1087
|
+
return this.imagesMap$.pipe(map(imagesMap => imagesMap[productId] ?? null), distinctUntilChanged());
|
|
1487
1088
|
}
|
|
1488
1089
|
fetchProductImage(productId) {
|
|
1489
1090
|
this.productApiService
|
|
1490
1091
|
.fetchImage$(productId)
|
|
1491
|
-
.pipe(map
|
|
1092
|
+
.pipe(map(file => URL.createObjectURL(file)), catchError$1(() => of('')), tap(url => this.imagesMap$.next({ ...this.imagesMap$.value, [productId]: url })))
|
|
1492
1093
|
.subscribe();
|
|
1493
1094
|
}
|
|
1494
1095
|
}
|
|
@@ -1498,424 +1099,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
1498
1099
|
type: Injectable
|
|
1499
1100
|
}], ctorParameters: function () { return [{ type: i1.ProductApiService }]; } });
|
|
1500
1101
|
|
|
1501
|
-
/**
|
|
1502
|
-
* @deprecated
|
|
1503
|
-
*/
|
|
1504
|
-
class QuoteDraftService {
|
|
1505
|
-
get isInitialized$() {
|
|
1506
|
-
return this.isInitializedSubj$.asObservable();
|
|
1507
|
-
}
|
|
1508
|
-
get isInitialized() {
|
|
1509
|
-
return this.isInitializedSubj$.getValue();
|
|
1510
|
-
}
|
|
1511
|
-
set isInitialized(value) {
|
|
1512
|
-
if (this.isInitialized !== value) {
|
|
1513
|
-
this.isInitializedSubj$.next(value);
|
|
1514
|
-
}
|
|
1515
|
-
}
|
|
1516
|
-
get hasUnsavedChanges() {
|
|
1517
|
-
return this._hasUnsavedChanges;
|
|
1518
|
-
}
|
|
1519
|
-
set hasUnsavedChanges(value) {
|
|
1520
|
-
this._hasUnsavedChanges = value;
|
|
1521
|
-
if (!this._hasUnsavedChanges) {
|
|
1522
|
-
this.initialCurrentState = this.quoteDraft?.currentState ?? [];
|
|
1523
|
-
}
|
|
1524
|
-
}
|
|
1525
|
-
get hasProducts$() {
|
|
1526
|
-
return this.quoteSubj$.pipe(map(() => this.hasProducts));
|
|
1527
|
-
}
|
|
1528
|
-
get hasProducts() {
|
|
1529
|
-
return Boolean(this.quoteSubj$.value?.currentState.length);
|
|
1530
|
-
}
|
|
1531
|
-
get hasAssets$() {
|
|
1532
|
-
return this.assetsSubj$.pipe(map(() => this.hasAssets));
|
|
1533
|
-
}
|
|
1534
|
-
get hasAssets() {
|
|
1535
|
-
return Boolean(this.assetsSubj$.value?.currentState.length);
|
|
1536
|
-
}
|
|
1537
|
-
get assetsState() {
|
|
1538
|
-
return this.assetsSubj$.value;
|
|
1539
|
-
}
|
|
1540
|
-
constructor(flowInfoService, accountApiService) {
|
|
1541
|
-
this.flowInfoService = flowInfoService;
|
|
1542
|
-
this.accountApiService = accountApiService;
|
|
1543
|
-
this.quoteSubj$ = new BehaviorSubject(null);
|
|
1544
|
-
this.assetsSubj$ = new BehaviorSubject(null);
|
|
1545
|
-
this.resetSubj$ = new BehaviorSubject(true);
|
|
1546
|
-
this.isInitializedSubj$ = new BehaviorSubject(false);
|
|
1547
|
-
this.initialCurrentState = [];
|
|
1548
|
-
this._hasUnsavedChanges = false;
|
|
1549
|
-
this.reset$ = this.resetSubj$.asObservable();
|
|
1550
|
-
this.isInitializedSubj$
|
|
1551
|
-
.pipe(filter$1(isInitialized => isInitialized), switchMap$1(() => this.quoteSubj$.asObservable()), skip(1), tap(quote => this.markAsUpdated(quote)))
|
|
1552
|
-
.subscribe();
|
|
1553
|
-
}
|
|
1554
|
-
reset() {
|
|
1555
|
-
this.resetSubj$.next(true);
|
|
1556
|
-
this.quoteSubj$.next(null);
|
|
1557
|
-
this.assetsSubj$.next(null);
|
|
1558
|
-
this.isInitialized = false;
|
|
1559
|
-
this.hasUnsavedChanges = false;
|
|
1560
|
-
}
|
|
1561
|
-
init(headerId, params) {
|
|
1562
|
-
const isAccountMode = this.flowInfoService.context.mode === ConfigurationContextMode.ACCOUNT;
|
|
1563
|
-
const accountId = isAccountMode ? headerId : this.flowInfoService.context['accountId'];
|
|
1564
|
-
return zip(accountId ? this.accountApiService.getAssetsState(accountId, params) : of(null), isAccountMode
|
|
1565
|
-
? of(QuoteDraft.emptyQuote(ConfigurationContextMode.ACCOUNT))
|
|
1566
|
-
: of(QuoteDraft.emptyQuote(ConfigurationContextMode.QUOTE))).pipe(tap(([assets, quote]) => {
|
|
1567
|
-
if (assets) {
|
|
1568
|
-
this.assetsSubj$.next(assets);
|
|
1569
|
-
}
|
|
1570
|
-
this.quoteSubj$.next(quote);
|
|
1571
|
-
}), map(() => noop()), take$1(1));
|
|
1572
|
-
}
|
|
1573
|
-
finalizeInit() {
|
|
1574
|
-
this.isInitialized = true;
|
|
1575
|
-
this.hasUnsavedChanges = false;
|
|
1576
|
-
}
|
|
1577
|
-
setCurrentLineItemState(lineItems) {
|
|
1578
|
-
const quoteDraft = this.quoteSubj$.value;
|
|
1579
|
-
if (!quoteDraft) {
|
|
1580
|
-
return;
|
|
1581
|
-
}
|
|
1582
|
-
this.quoteSubj$.next({
|
|
1583
|
-
...quoteDraft,
|
|
1584
|
-
currentState: lineItems,
|
|
1585
|
-
});
|
|
1586
|
-
}
|
|
1587
|
-
updateQuoteDraft(update) {
|
|
1588
|
-
const quoteDraft = this.quoteSubj$.value;
|
|
1589
|
-
if (!quoteDraft) {
|
|
1590
|
-
return;
|
|
1591
|
-
}
|
|
1592
|
-
this.quoteSubj$.next({
|
|
1593
|
-
...quoteDraft,
|
|
1594
|
-
...update,
|
|
1595
|
-
});
|
|
1596
|
-
}
|
|
1597
|
-
updateByPriceSummary(priceSummary) {
|
|
1598
|
-
const quoteDraft = this.quoteSubj$.value;
|
|
1599
|
-
if (!quoteDraft) {
|
|
1600
|
-
return;
|
|
1601
|
-
}
|
|
1602
|
-
const updatedCurrentState = this.currentState.map(lineItem => {
|
|
1603
|
-
const updated = priceSummary.lineItems.find(li => li.id === lineItem.id);
|
|
1604
|
-
return updated ?? lineItem;
|
|
1605
|
-
});
|
|
1606
|
-
this.quoteSubj$.next({
|
|
1607
|
-
...quoteDraft,
|
|
1608
|
-
currentState: updatedCurrentState,
|
|
1609
|
-
totalPrices: priceSummary.totalPrices,
|
|
1610
|
-
approvalItems: priceSummary.approvalItems,
|
|
1611
|
-
});
|
|
1612
|
-
}
|
|
1613
|
-
setAssetsState(assetsState) {
|
|
1614
|
-
this.assetsSubj$.next(assetsState);
|
|
1615
|
-
}
|
|
1616
|
-
get quoteDraft$() {
|
|
1617
|
-
return this.quoteSubj$.pipe(map(() => this.quoteDraft), filter$1((quote) => Boolean(quote)), shareReplay$1());
|
|
1618
|
-
}
|
|
1619
|
-
get quoteDraft() {
|
|
1620
|
-
return this.quoteSubj$.value;
|
|
1621
|
-
}
|
|
1622
|
-
get currentState$() {
|
|
1623
|
-
return this.quoteDraft$.pipe(map(quote => quote.currentState));
|
|
1624
|
-
}
|
|
1625
|
-
get currentState() {
|
|
1626
|
-
return this.quoteDraft?.currentState ?? [];
|
|
1627
|
-
}
|
|
1628
|
-
get isStandalone() {
|
|
1629
|
-
return this.flowInfoService.flow?.properties.standalone ?? false;
|
|
1630
|
-
}
|
|
1631
|
-
get isStandalone$() {
|
|
1632
|
-
return this.flowInfoService.flow$.pipe(map(() => this.isStandalone));
|
|
1633
|
-
}
|
|
1634
|
-
getInitialCurrentState() {
|
|
1635
|
-
return this.initialCurrentState;
|
|
1636
|
-
}
|
|
1637
|
-
isEditMode$() {
|
|
1638
|
-
return this.quoteDraft$.pipe(map(() => this.isEditMode()));
|
|
1639
|
-
}
|
|
1640
|
-
isEditMode() {
|
|
1641
|
-
const context = this.quoteDraft?.context;
|
|
1642
|
-
if (context?.mode === ConfigurationContextMode.ACCOUNT) {
|
|
1643
|
-
return true;
|
|
1644
|
-
}
|
|
1645
|
-
if (context?.mode === ConfigurationContextMode.QUOTE) {
|
|
1646
|
-
return context.properties.Status === 'Draft';
|
|
1647
|
-
}
|
|
1648
|
-
return false;
|
|
1649
|
-
}
|
|
1650
|
-
markAsUpdated(quote) {
|
|
1651
|
-
if (quote?.context.properties['#mode'] === ConfigurationContextMode.ACCOUNT) {
|
|
1652
|
-
this.hasUnsavedChanges = !!quote && !quote.currentState.every(li => li.actionCode === 'EXIST');
|
|
1653
|
-
}
|
|
1654
|
-
else {
|
|
1655
|
-
this.hasUnsavedChanges = !isEqual(this.initialCurrentState, quote?.currentState);
|
|
1656
|
-
}
|
|
1657
|
-
}
|
|
1658
|
-
}
|
|
1659
|
-
QuoteDraftService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: QuoteDraftService, deps: [{ token: FlowInfoService }, { token: i1.AccountApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1660
|
-
QuoteDraftService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: QuoteDraftService });
|
|
1661
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: QuoteDraftService, decorators: [{
|
|
1662
|
-
type: Injectable
|
|
1663
|
-
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: i1.AccountApiService }]; } });
|
|
1664
|
-
|
|
1665
|
-
class ConfigurationService {
|
|
1666
|
-
constructor(quoteDraftService, runtimeService, configurationApiService, messageService, dialogService, runtimeSettings, flowInfoService) {
|
|
1667
|
-
this.quoteDraftService = quoteDraftService;
|
|
1668
|
-
this.runtimeService = runtimeService;
|
|
1669
|
-
this.configurationApiService = configurationApiService;
|
|
1670
|
-
this.messageService = messageService;
|
|
1671
|
-
this.dialogService = dialogService;
|
|
1672
|
-
this.runtimeSettings = runtimeSettings;
|
|
1673
|
-
this.flowInfoService = flowInfoService;
|
|
1674
|
-
this.mode = ConfigurationMode.SEARCH;
|
|
1675
|
-
this.configurationState = new BehaviorSubject(null);
|
|
1676
|
-
this.previousConfigurationState = new BehaviorSubject(null);
|
|
1677
|
-
this.isLoadingSubj$ = new BehaviorSubject(false);
|
|
1678
|
-
this.isLoading$ = this.isLoadingSubj$.asObservable();
|
|
1679
|
-
this.hasUnsavedChanges = false;
|
|
1680
|
-
}
|
|
1681
|
-
reset() {
|
|
1682
|
-
this.hasUnsavedChanges = false;
|
|
1683
|
-
this.runtimeService.reset();
|
|
1684
|
-
this.configurableRamp = undefined;
|
|
1685
|
-
this.configurationState.next(null);
|
|
1686
|
-
this.previousConfigurationState.next(null);
|
|
1687
|
-
}
|
|
1688
|
-
patch$(lineItem) {
|
|
1689
|
-
const source = this.getSnapshot();
|
|
1690
|
-
if (!source) {
|
|
1691
|
-
return throwError(() => new Error(`Source LineItem not found`));
|
|
1692
|
-
}
|
|
1693
|
-
this.configurableRamp = new LineItemWorker(source).replace(lineItem).li;
|
|
1694
|
-
return this.configure().pipe(catchError$1(error => {
|
|
1695
|
-
console.error(error);
|
|
1696
|
-
if (!this.runtimeService.uiDefinitionProperties.suppressToastMessages) {
|
|
1697
|
-
this.messageService.add({ severity: 'error', summary: error });
|
|
1698
|
-
}
|
|
1699
|
-
// bounce back if configuration call has failed
|
|
1700
|
-
const prevState = this.configurationState.value;
|
|
1701
|
-
this.configurationState.next(prevState ? { ...prevState } : null);
|
|
1702
|
-
return throwError(() => error);
|
|
1703
|
-
}), tap(() => {
|
|
1704
|
-
if (!this.hasUnsavedChanges) {
|
|
1705
|
-
this.hasUnsavedChanges = true;
|
|
1706
|
-
}
|
|
1707
|
-
}));
|
|
1708
|
-
}
|
|
1709
|
-
patch(lineItem) {
|
|
1710
|
-
this.patch$(lineItem).subscribe();
|
|
1711
|
-
}
|
|
1712
|
-
setConfigurableRamp(lineItem) {
|
|
1713
|
-
this.configurableRamp = lineItem;
|
|
1714
|
-
}
|
|
1715
|
-
get() {
|
|
1716
|
-
return this.configurationState.pipe(map(state => state?.lineItem), shareReplay());
|
|
1717
|
-
}
|
|
1718
|
-
getSnapshot() {
|
|
1719
|
-
return this.configurationState.value?.lineItem ? { ...this.configurationState.value?.lineItem } : undefined;
|
|
1720
|
-
}
|
|
1721
|
-
getRuntimeModel() {
|
|
1722
|
-
const runtimeModel = this.runtimeService.runtimeModel;
|
|
1723
|
-
if (!runtimeModel) {
|
|
1724
|
-
throw new Error('Runtime model not initialized');
|
|
1725
|
-
}
|
|
1726
|
-
return runtimeModel;
|
|
1727
|
-
}
|
|
1728
|
-
getRuntimeContext() {
|
|
1729
|
-
const runtimeContext = this.runtimeService.runtimeContext;
|
|
1730
|
-
if (!runtimeContext) {
|
|
1731
|
-
throw new Error('Runtime context not initialized');
|
|
1732
|
-
}
|
|
1733
|
-
return runtimeContext;
|
|
1734
|
-
}
|
|
1735
|
-
get state$() {
|
|
1736
|
-
return this.configurationState.asObservable();
|
|
1737
|
-
}
|
|
1738
|
-
get stateSnapshot() {
|
|
1739
|
-
return this.configurationState.value;
|
|
1740
|
-
}
|
|
1741
|
-
get previousStateSnapshot() {
|
|
1742
|
-
return this.previousConfigurationState.value;
|
|
1743
|
-
}
|
|
1744
|
-
get charges$() {
|
|
1745
|
-
return this.configurationState.pipe(map(state => state?.charges ?? {}));
|
|
1746
|
-
}
|
|
1747
|
-
get chargesSnapshot() {
|
|
1748
|
-
return this.configurationState.value?.charges ?? {};
|
|
1749
|
-
}
|
|
1750
|
-
get pricePlans$() {
|
|
1751
|
-
return this.configurationState.pipe(map(state => state?.pricePlans ?? {}));
|
|
1752
|
-
}
|
|
1753
|
-
get pricePlansSnapshot() {
|
|
1754
|
-
return this.configurationState.value?.pricePlans ?? {};
|
|
1755
|
-
}
|
|
1756
|
-
get procedureContext$() {
|
|
1757
|
-
return this.configurationState.pipe(map(state => state?.procedureContext ?? {}));
|
|
1758
|
-
}
|
|
1759
|
-
get procedureContextSnapshot() {
|
|
1760
|
-
return this.configurationState.value?.procedureContext ?? {};
|
|
1761
|
-
}
|
|
1762
|
-
configure() {
|
|
1763
|
-
return this.configureRequest$(this.generateRequest());
|
|
1764
|
-
}
|
|
1765
|
-
configureRequest$(configurationRequest) {
|
|
1766
|
-
const runtimeContext = this.getRuntimeContext();
|
|
1767
|
-
const runtimeModel = this.getRuntimeModel();
|
|
1768
|
-
const uiDefinitionProperties = this.getUIDefinitionProperties();
|
|
1769
|
-
const mainPricingEnabled = runtimeContext.properties?.PricingEnabled;
|
|
1770
|
-
const pricingEnabled = mainPricingEnabled ? mainPricingEnabled === 'true' : uiDefinitionProperties.pricingEnabled;
|
|
1771
|
-
const customPriceApi = this.runtimeSettings.getConfigurationSettings()['CUSTOM_PRICE_API'];
|
|
1772
|
-
this.isLoadingSubj$.next(true);
|
|
1773
|
-
const configure$ = pricingEnabled && customPriceApi
|
|
1774
|
-
? this.configurationApiService.customConfigurePrice({
|
|
1775
|
-
url: customPriceApi,
|
|
1776
|
-
configurationRequest,
|
|
1777
|
-
runtimeModel,
|
|
1778
|
-
})
|
|
1779
|
-
: this.extendedConfigureLineItem$({
|
|
1780
|
-
configurationRequest,
|
|
1781
|
-
runtimeModel,
|
|
1782
|
-
pricingEnabled,
|
|
1783
|
-
});
|
|
1784
|
-
return configure$.pipe(tap(result => {
|
|
1785
|
-
this.configurationState.next(result);
|
|
1786
|
-
this.previousConfigurationState.next(cloneDeep(result));
|
|
1787
|
-
if (result.deletedLineItems?.length) {
|
|
1788
|
-
this.showInactiveProductsConfirmation();
|
|
1789
|
-
}
|
|
1790
|
-
this.configurableRamp = result.lineItem;
|
|
1791
|
-
}), map(({ lineItem }) => lineItem), catchError$1(error => throwError(() => {
|
|
1792
|
-
const resetState = this.previousConfigurationState.value;
|
|
1793
|
-
if (resetState) {
|
|
1794
|
-
this.previousConfigurationState.next(cloneDeep(resetState));
|
|
1795
|
-
this.configurationState.next(resetState);
|
|
1796
|
-
}
|
|
1797
|
-
if (error.error) {
|
|
1798
|
-
return extractErrorDetails(error.error).join('. ');
|
|
1799
|
-
}
|
|
1800
|
-
return error.message || JSON.stringify(error);
|
|
1801
|
-
})), finalize$1(() => this.isLoadingSubj$.next(false)));
|
|
1802
|
-
}
|
|
1803
|
-
configureExternal$(props) {
|
|
1804
|
-
return this.runtimeService
|
|
1805
|
-
.init({ productId: props.productId, defaultQty: props.qty, attributesMap: props.attributesMap })
|
|
1806
|
-
.pipe(switchMap$1(() => this.configure()), first(), catchError$1(error => {
|
|
1807
|
-
this.messageService.add({ severity: ToastType.error, summary: error });
|
|
1808
|
-
throw error;
|
|
1809
|
-
}), finalize$1(() => this.reset()));
|
|
1810
|
-
}
|
|
1811
|
-
configureGuidedSelling$(data) {
|
|
1812
|
-
return this.extendedConfigureLineItem$({
|
|
1813
|
-
configurationRequest: getGuidedSellingConfigurationRequest(data),
|
|
1814
|
-
}).pipe(catchError$1(error => {
|
|
1815
|
-
if (error instanceof HttpErrorResponse) {
|
|
1816
|
-
this.messageService.add({ severity: ToastType.error, summary: error.error.message || error.error });
|
|
1817
|
-
}
|
|
1818
|
-
throw error;
|
|
1819
|
-
}));
|
|
1820
|
-
}
|
|
1821
|
-
generateRequest(lightMode = true) {
|
|
1822
|
-
const lineItem = this.generateLineItem();
|
|
1823
|
-
let request = {
|
|
1824
|
-
lineItem,
|
|
1825
|
-
mode: this.mode,
|
|
1826
|
-
step: !this.configurationState.value?.lineItem ? RuntimeStep.START : RuntimeStep.UPDATE,
|
|
1827
|
-
attributeDomainMode: 'ALL',
|
|
1828
|
-
context: this.quoteDraftService.quoteDraft?.context ?? generateEmptyContext(),
|
|
1829
|
-
lineItems: this.quoteDraftService.quoteDraft?.currentState || [],
|
|
1830
|
-
asset: this.getAsset(),
|
|
1831
|
-
};
|
|
1832
|
-
if (lightMode) {
|
|
1833
|
-
request = ConfigurationTranslatorUtils.lightenConfigurationRequest(request);
|
|
1834
|
-
}
|
|
1835
|
-
return request;
|
|
1836
|
-
}
|
|
1837
|
-
generateLineItem() {
|
|
1838
|
-
const runtimeContext = this.getRuntimeContext();
|
|
1839
|
-
const uiDefinitionProperties = this.getUIDefinitionProperties();
|
|
1840
|
-
let lineItem = this.configurableRamp;
|
|
1841
|
-
if (!lineItem) {
|
|
1842
|
-
const { initializationProps } = this.runtimeService ?? {};
|
|
1843
|
-
lineItem = getDefaultLineItem(runtimeContext, uiDefinitionProperties, initializationProps?.defaultQty);
|
|
1844
|
-
// Set default attributes
|
|
1845
|
-
if (initializationProps?.attributesMap) {
|
|
1846
|
-
const attributes = transform(initializationProps?.attributesMap, (acc, value, name) => acc.push({ name, value }), []);
|
|
1847
|
-
lineItem = new LineItemWorker(lineItem).patchAttribute(attributes).li;
|
|
1848
|
-
}
|
|
1849
|
-
}
|
|
1850
|
-
return lineItem;
|
|
1851
|
-
}
|
|
1852
|
-
getAsset() {
|
|
1853
|
-
const lineItem = this.configurableRamp;
|
|
1854
|
-
if (!lineItem) {
|
|
1855
|
-
return;
|
|
1856
|
-
}
|
|
1857
|
-
const assetId = lineItem.assetId ?? lineItem.openOrderLineItemId;
|
|
1858
|
-
return this.quoteDraftService.assetsState?.initialState.find(li => assetPredicateFn(li, assetId));
|
|
1859
|
-
}
|
|
1860
|
-
getUIDefinitionProperties() {
|
|
1861
|
-
return {
|
|
1862
|
-
...(this.getRuntimeContext().uiDefinitionContainer?.source.properties ?? {}),
|
|
1863
|
-
...(this.runtimeService.uiDefinitionProperties ?? {}),
|
|
1864
|
-
};
|
|
1865
|
-
}
|
|
1866
|
-
showInactiveProductsConfirmation() {
|
|
1867
|
-
const confirmationConfig = {
|
|
1868
|
-
title: ' ',
|
|
1869
|
-
description: 'This quote contains inactive products. Do you want to remove them?',
|
|
1870
|
-
primaryButtonLabel: 'Remove products',
|
|
1871
|
-
secondaryButtonLabel: 'Back to Quote',
|
|
1872
|
-
};
|
|
1873
|
-
this.dialogService
|
|
1874
|
-
.open(ConfirmationComponent, {
|
|
1875
|
-
dismissableMask: false,
|
|
1876
|
-
closeOnEscape: false,
|
|
1877
|
-
closable: false,
|
|
1878
|
-
showHeader: true,
|
|
1879
|
-
header: `Inactive Products in Quote`,
|
|
1880
|
-
width: '440px',
|
|
1881
|
-
data: { confirmationConfig },
|
|
1882
|
-
})
|
|
1883
|
-
.onClose.subscribe(result => {
|
|
1884
|
-
if (!result) {
|
|
1885
|
-
const Id = this.quoteDraftService.quoteDraft?.context.properties.Id ?? '';
|
|
1886
|
-
window['VELO_BACK_FN'].apply(null, [Id]);
|
|
1887
|
-
}
|
|
1888
|
-
});
|
|
1889
|
-
}
|
|
1890
|
-
extendedConfigureLineItem$({ configurationRequest, runtimeModel, pricingEnabled, }) {
|
|
1891
|
-
return this.configurationApiService.configureLineItem({
|
|
1892
|
-
configurationRequest: configurationRequest,
|
|
1893
|
-
runtimeModel,
|
|
1894
|
-
pricingEnabled,
|
|
1895
|
-
});
|
|
1896
|
-
}
|
|
1897
|
-
}
|
|
1898
|
-
ConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, deps: [{ token: QuoteDraftService }, { token: ConfigurationRuntimeService }, { token: i1.ConfigurationApiService }, { token: i4.MessageService }, { token: i5.DialogService }, { token: RuntimeSettingsService }, { token: FlowInfoService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1899
|
-
ConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService });
|
|
1900
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, decorators: [{
|
|
1901
|
-
type: Injectable
|
|
1902
|
-
}], ctorParameters: function () { return [{ type: QuoteDraftService }, { type: ConfigurationRuntimeService }, { type: i1.ConfigurationApiService }, { type: i4.MessageService }, { type: i5.DialogService }, { type: RuntimeSettingsService }, { type: FlowInfoService }]; } });
|
|
1903
|
-
|
|
1904
1102
|
class ConfigurationStateService {
|
|
1905
|
-
constructor(configurationRuntimeService, configurationService,
|
|
1906
|
-
// private quoteDraftService: QuoteDraftService,
|
|
1907
|
-
salesTransactionService, toastService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService,
|
|
1908
|
-
// private quoteApiService: QuoteApiService,
|
|
1909
|
-
salesTransactionApiService) {
|
|
1103
|
+
constructor(configurationRuntimeService, configurationService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, salesTransactionService, salesTransactionApiService, toastService) {
|
|
1910
1104
|
this.configurationRuntimeService = configurationRuntimeService;
|
|
1911
1105
|
this.configurationService = configurationService;
|
|
1912
|
-
this.salesTransactionService = salesTransactionService;
|
|
1913
|
-
this.toastService = toastService;
|
|
1914
1106
|
this.flowStateService = flowStateService;
|
|
1915
1107
|
this.flowInfoService = flowInfoService;
|
|
1916
1108
|
this.flowConfigurationService = flowConfigurationService;
|
|
1917
1109
|
this.flowStateApiService = flowStateApiService;
|
|
1110
|
+
this.salesTransactionService = salesTransactionService;
|
|
1918
1111
|
this.salesTransactionApiService = salesTransactionApiService;
|
|
1112
|
+
this.toastService = toastService;
|
|
1919
1113
|
this.isInitialized$ = new BehaviorSubject(false);
|
|
1920
1114
|
this.canceledConfiguration$ = new Subject();
|
|
1921
1115
|
this.NOT_INITIALIZED = Symbol();
|
|
@@ -1939,9 +1133,9 @@ class ConfigurationStateService {
|
|
|
1939
1133
|
request$ = this.initStateful$();
|
|
1940
1134
|
}
|
|
1941
1135
|
else {
|
|
1942
|
-
request$ =
|
|
1136
|
+
request$ = this.configurationService.init$();
|
|
1943
1137
|
}
|
|
1944
|
-
return request$.pipe(take(1), tap
|
|
1138
|
+
return request$.pipe(take(1), tap(() => {
|
|
1945
1139
|
this.isInitialized$.next(true);
|
|
1946
1140
|
this.canceledConfiguration$ = new Subject();
|
|
1947
1141
|
}));
|
|
@@ -1955,10 +1149,11 @@ class ConfigurationStateService {
|
|
|
1955
1149
|
this.configurationStore = {};
|
|
1956
1150
|
this.executedFunctions = {};
|
|
1957
1151
|
this.configurationService.reset();
|
|
1152
|
+
this.configurationRuntimeService.reset();
|
|
1958
1153
|
}
|
|
1959
1154
|
execute$(exec) {
|
|
1960
1155
|
const request = this.execToRequest(exec);
|
|
1961
|
-
return this.executeRequest$(request).pipe(map
|
|
1156
|
+
return this.executeRequest$(request).pipe(map(result => {
|
|
1962
1157
|
// Keep only requested results
|
|
1963
1158
|
const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
|
|
1964
1159
|
if (exec.selectors?.[requestId]) {
|
|
@@ -1980,7 +1175,7 @@ class ConfigurationStateService {
|
|
|
1980
1175
|
}
|
|
1981
1176
|
// prevent parallel configuration requests in stateless mode
|
|
1982
1177
|
if (!this.statelessExecutionRequest$) {
|
|
1983
|
-
this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay(), take(1), finalize(() => (this.statelessExecutionRequest$ = null)));
|
|
1178
|
+
this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay(), take(1), finalize$1(() => (this.statelessExecutionRequest$ = null)));
|
|
1984
1179
|
}
|
|
1985
1180
|
return this.statelessExecutionRequest$;
|
|
1986
1181
|
}
|
|
@@ -1994,7 +1189,7 @@ class ConfigurationStateService {
|
|
|
1994
1189
|
},
|
|
1995
1190
|
},
|
|
1996
1191
|
});
|
|
1997
|
-
return this.executeRequest$(request).pipe(map
|
|
1192
|
+
return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
|
|
1998
1193
|
}
|
|
1999
1194
|
subscribe$(selectorName, inputData = {}, options) {
|
|
2000
1195
|
const requestId = UUID.UUID();
|
|
@@ -2017,7 +1212,7 @@ class ConfigurationStateService {
|
|
|
2017
1212
|
this.executeRequest$(request).subscribe();
|
|
2018
1213
|
}
|
|
2019
1214
|
}
|
|
2020
|
-
return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map
|
|
1215
|
+
return subscription.data$.pipe(filter$1(data => data != this.NOT_INITIALIZED), map(data => data), distinctUntilChanged(), finalize$1(() => {
|
|
2021
1216
|
if (!this.subscriptions[requestId]?.data$.observed) {
|
|
2022
1217
|
delete this.subscriptions[requestId];
|
|
2023
1218
|
}
|
|
@@ -2025,7 +1220,7 @@ class ConfigurationStateService {
|
|
|
2025
1220
|
}
|
|
2026
1221
|
saveConfiguration() {
|
|
2027
1222
|
if (this.isStatefulConfiguration) {
|
|
2028
|
-
return this.flowStateApiService.saveConfiguration(this.flowStateService.stateId ?? '', this.stateId ?? '').pipe(switchMap(r => this.flowStateService.executeRequest$({}, true).pipe(map
|
|
1223
|
+
return this.flowStateApiService.saveConfiguration(this.flowStateService.stateId ?? '', this.stateId ?? '').pipe(switchMap(r => this.flowStateService.executeRequest$({}, true).pipe(map(() => r))), map(r => ({ id: r.quoteId })));
|
|
2029
1224
|
}
|
|
2030
1225
|
const state = this.salesTransactionService.state;
|
|
2031
1226
|
if (!state) {
|
|
@@ -2035,27 +1230,24 @@ class ConfigurationStateService {
|
|
|
2035
1230
|
if (standalone) {
|
|
2036
1231
|
return this.salesTransactionApiService.upsert(state);
|
|
2037
1232
|
}
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
// TODO: adjust the logic for ShoppingCart
|
|
2057
|
-
const newState = { ...state };
|
|
2058
|
-
return this.flowConfigurationService.calculate$(newState).pipe(map$1(() => ({ id: '' })));
|
|
1233
|
+
const salesTransaction = this.salesTransactionService.state;
|
|
1234
|
+
const configurationRoot = this.configurationService.root;
|
|
1235
|
+
if (!salesTransaction || !configurationRoot) {
|
|
1236
|
+
return of({ id: '' });
|
|
1237
|
+
}
|
|
1238
|
+
const isNewTransactionItem = salesTransaction.salesTransactionItems.every(li => li.id !== configurationRoot.id);
|
|
1239
|
+
let salesTransactionItems;
|
|
1240
|
+
if (isNewTransactionItem) {
|
|
1241
|
+
salesTransactionItems = [...salesTransaction.salesTransactionItems, configurationRoot];
|
|
1242
|
+
}
|
|
1243
|
+
else {
|
|
1244
|
+
salesTransactionItems = salesTransaction.salesTransactionItems.map(ti => ti.id === configurationRoot.id ? configurationRoot : ti);
|
|
1245
|
+
}
|
|
1246
|
+
const newState = {
|
|
1247
|
+
...salesTransaction,
|
|
1248
|
+
salesTransactionItems,
|
|
1249
|
+
};
|
|
1250
|
+
return this.flowConfigurationService.calculate$(newState).pipe(map(() => ({ id: '' })));
|
|
2059
1251
|
}
|
|
2060
1252
|
cancelConfiguration() {
|
|
2061
1253
|
if (!this.isInitialized$.value) {
|
|
@@ -2074,29 +1266,28 @@ class ConfigurationStateService {
|
|
|
2074
1266
|
return this.flowInfoService.flow?.properties.stateful ?? false;
|
|
2075
1267
|
}
|
|
2076
1268
|
initStateful$() {
|
|
2077
|
-
this.ownerId = this.configurationRuntimeService.
|
|
2078
|
-
const
|
|
2079
|
-
if (!this.flowStateService.stateId) {
|
|
1269
|
+
this.ownerId = this.configurationRuntimeService.uiDefinitionContainer?.id ?? '';
|
|
1270
|
+
const { productId, transactionItemId } = this.flowInfoService.context;
|
|
1271
|
+
if (!productId || !this.flowStateService.stateId) {
|
|
2080
1272
|
return of(undefined);
|
|
2081
1273
|
}
|
|
2082
|
-
const container = this.configurationRuntimeService.
|
|
2083
|
-
const lineItem = this.configurationService.generateLineItem();
|
|
1274
|
+
const container = this.configurationRuntimeService.uiDefinitionContainer;
|
|
2084
1275
|
let request$;
|
|
2085
|
-
if (!
|
|
1276
|
+
if (!transactionItemId) {
|
|
2086
1277
|
request$ = this.flowStateApiService.newConfiguration(this.flowStateService.stateId, {
|
|
2087
|
-
|
|
1278
|
+
transactionItem: generateTransactionItem(productId),
|
|
2088
1279
|
actionsOverride: container?.actions?.map(processor => ({ ...processor, ownerId: this.ownerId })),
|
|
2089
1280
|
selectorsOverride: container?.selectors?.map(processor => ({ ...processor, ownerId: this.ownerId })),
|
|
2090
1281
|
});
|
|
2091
1282
|
}
|
|
2092
1283
|
else {
|
|
2093
1284
|
request$ = this.flowStateApiService.startConfiguration(this.flowStateService.stateId, {
|
|
2094
|
-
|
|
1285
|
+
transactionItemId,
|
|
2095
1286
|
actionsOverride: container?.actions?.map(processor => ({ ...processor, ownerId: this.ownerId })),
|
|
2096
1287
|
selectorsOverride: container?.selectors?.map(processor => ({ ...processor, ownerId: this.ownerId })),
|
|
2097
1288
|
});
|
|
2098
1289
|
}
|
|
2099
|
-
return request$.pipe(map
|
|
1290
|
+
return request$.pipe(map(r => {
|
|
2100
1291
|
this.stateId = r.stateId;
|
|
2101
1292
|
return undefined;
|
|
2102
1293
|
}));
|
|
@@ -2140,37 +1331,35 @@ class ConfigurationStateService {
|
|
|
2140
1331
|
else {
|
|
2141
1332
|
execution$ = this.executeStateless$(fullRequest);
|
|
2142
1333
|
}
|
|
2143
|
-
return execution$.pipe(tap
|
|
1334
|
+
return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
|
|
2144
1335
|
}
|
|
2145
1336
|
executeStateless$(request) {
|
|
2146
1337
|
this.executionInProgress$.next(true);
|
|
2147
|
-
return
|
|
1338
|
+
return this.configurationService.state$.pipe(switchMap(state => {
|
|
2148
1339
|
// Apply actions and execute configuration/price call
|
|
2149
1340
|
// No need to run configuration if no actions in the request
|
|
2150
1341
|
if (!request.actions?.length) {
|
|
2151
1342
|
return of(undefined);
|
|
2152
1343
|
}
|
|
2153
|
-
let configurationRequest = this.configurationService.generateRequest(false);
|
|
2154
1344
|
request.actions.forEach(action => {
|
|
2155
|
-
|
|
1345
|
+
state = this.executeActionScript(state, action) ?? state;
|
|
2156
1346
|
});
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
}), map$1(() => {
|
|
1347
|
+
return this.configurationService.configureRequest$(state);
|
|
1348
|
+
}), map(() => {
|
|
2160
1349
|
// Run selectors and apply them to the state
|
|
2161
|
-
const configurationState = this.configurationService.
|
|
1350
|
+
const configurationState = this.configurationService.state;
|
|
2162
1351
|
if (!configurationState) {
|
|
2163
1352
|
return { stateId: '', selectors: {} };
|
|
2164
1353
|
}
|
|
2165
1354
|
return this.runStatelessSelectors(request, configurationState);
|
|
2166
|
-
}), tap
|
|
2167
|
-
const configurationState = this.configurationService.
|
|
1355
|
+
}), tap(() => this.executionInProgress$.next(false)), catchError$1(error => {
|
|
1356
|
+
const configurationState = this.configurationService.previousState;
|
|
2168
1357
|
if (configurationState) {
|
|
2169
1358
|
const selectorsResult = this.runStatelessSelectors(request, configurationState);
|
|
2170
1359
|
this.handleSelectorsResponse(selectorsResult.selectors);
|
|
2171
1360
|
}
|
|
2172
1361
|
this.executionInProgress$.next(false);
|
|
2173
|
-
if (!this.configurationRuntimeService.
|
|
1362
|
+
if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
|
|
2174
1363
|
this.toastService.add({ severity: ToastType.error, summary: String(error) });
|
|
2175
1364
|
}
|
|
2176
1365
|
return throwError(() => error);
|
|
@@ -2191,21 +1380,21 @@ class ConfigurationStateService {
|
|
|
2191
1380
|
};
|
|
2192
1381
|
this.executionInProgress$.next(true);
|
|
2193
1382
|
return this.flowStateApiService.executeConfiguration(this.flowStateService.stateId, this.stateId, request);
|
|
2194
|
-
}), tap
|
|
1383
|
+
}), tap(({ stateId }) => (this.stateId = stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError$1(e => {
|
|
2195
1384
|
this.executionInProgress$.next(false);
|
|
2196
1385
|
return throwError(() => e);
|
|
2197
1386
|
}));
|
|
2198
1387
|
}
|
|
2199
1388
|
executeStateful$(request) {
|
|
2200
|
-
return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
|
|
1389
|
+
return this.executionInProgress$.pipe(filter$1(inProgress => !inProgress), take(1), switchMap(() =>
|
|
2201
1390
|
// make sure stream switches to statefulExecutionRequest$ before pushing an execution request
|
|
2202
1391
|
combineLatest([
|
|
2203
1392
|
this.statefulExecutionRequest$,
|
|
2204
|
-
of(undefined).pipe(tap
|
|
2205
|
-
])), map
|
|
1393
|
+
of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
|
|
1394
|
+
])), map(([response]) => response), take(1));
|
|
2206
1395
|
}
|
|
2207
1396
|
executeActionScript(request, processor) {
|
|
2208
|
-
const { actions } = this.configurationRuntimeService.
|
|
1397
|
+
const { actions } = this.configurationRuntimeService.uiDefinitionContainer ?? {};
|
|
2209
1398
|
const configurationProcessor = actions?.find(action => action.apiName === processor.apiName);
|
|
2210
1399
|
if (!configurationProcessor?.script) {
|
|
2211
1400
|
throw `ConfigurationProcessor ${processor.apiName} not found`;
|
|
@@ -2213,7 +1402,7 @@ class ConfigurationStateService {
|
|
|
2213
1402
|
return this.executeProcessorScript(request, configurationProcessor, processor.inputData);
|
|
2214
1403
|
}
|
|
2215
1404
|
executeSelectorScript(request, processor) {
|
|
2216
|
-
const { selectors } = this.configurationRuntimeService.
|
|
1405
|
+
const { selectors } = this.configurationRuntimeService.uiDefinitionContainer ?? {};
|
|
2217
1406
|
const configurationProcessor = selectors?.find(selector => selector.apiName === processor.apiName);
|
|
2218
1407
|
if (!configurationProcessor?.script) {
|
|
2219
1408
|
throw `ConfigurationProcessor ${processor.apiName} not found`;
|
|
@@ -2254,29 +1443,42 @@ class ConfigurationStateService {
|
|
|
2254
1443
|
}, { stateId: '', selectors: {} });
|
|
2255
1444
|
}
|
|
2256
1445
|
}
|
|
2257
|
-
ConfigurationStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, deps: [{ token: ConfigurationRuntimeService }, { token: ConfigurationService }, { token:
|
|
1446
|
+
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: i1.FlowStateApiService }, { token: SalesTransactionService }, { token: i4.SalesTransactionApiService }, { token: i6.ToastService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
2258
1447
|
ConfigurationStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService });
|
|
2259
1448
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, decorators: [{
|
|
2260
1449
|
type: Injectable
|
|
2261
|
-
}], ctorParameters: function () { return [{ type: ConfigurationRuntimeService }, { type: ConfigurationService }, { type:
|
|
1450
|
+
}], ctorParameters: function () { return [{ type: ConfigurationRuntimeService }, { type: ConfigurationService }, { type: FlowStateService }, { type: FlowInfoService }, { type: FlowConfigurationService }, { type: i1.FlowStateApiService }, { type: SalesTransactionService }, { type: i4.SalesTransactionApiService }, { type: i6.ToastService }]; } });
|
|
2262
1451
|
|
|
2263
1452
|
class ConfigurationModule {
|
|
2264
1453
|
}
|
|
2265
1454
|
ConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
2266
1455
|
ConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, imports: [ConfirmationDialogModule, ApiModule] });
|
|
2267
|
-
ConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, providers: [
|
|
1456
|
+
ConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, providers: [ConfigurationService, ConfigurationStateService, ConfigurationRuntimeService], imports: [ConfirmationDialogModule, ApiModule] });
|
|
2268
1457
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, decorators: [{
|
|
2269
1458
|
type: NgModule,
|
|
2270
1459
|
args: [{
|
|
2271
1460
|
imports: [ConfirmationDialogModule, ApiModule],
|
|
2272
|
-
providers: [
|
|
1461
|
+
providers: [ConfigurationService, ConfigurationStateService, ConfigurationRuntimeService],
|
|
1462
|
+
}]
|
|
1463
|
+
}] });
|
|
1464
|
+
|
|
1465
|
+
class FlowConfigurationModule {
|
|
1466
|
+
}
|
|
1467
|
+
FlowConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
1468
|
+
FlowConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, imports: [ApiModule] });
|
|
1469
|
+
FlowConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, providers: [FlowConfigurationService], imports: [ApiModule] });
|
|
1470
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, decorators: [{
|
|
1471
|
+
type: NgModule,
|
|
1472
|
+
args: [{
|
|
1473
|
+
imports: [ApiModule],
|
|
1474
|
+
providers: [FlowConfigurationService],
|
|
2273
1475
|
}]
|
|
2274
1476
|
}] });
|
|
2275
1477
|
|
|
2276
1478
|
class CatalogProductsService {
|
|
2277
1479
|
constructor() {
|
|
2278
1480
|
this.stateSubj$ = new BehaviorSubject(null);
|
|
2279
|
-
this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
|
|
1481
|
+
this.state$ = this.stateSubj$.asObservable().pipe(filter$1(isDefined));
|
|
2280
1482
|
}
|
|
2281
1483
|
get state() {
|
|
2282
1484
|
return this.stateSubj$.getValue();
|
|
@@ -2294,6 +1496,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
2294
1496
|
type: Injectable
|
|
2295
1497
|
}] });
|
|
2296
1498
|
|
|
1499
|
+
const FORMATTING_SETTINGS_TOKEN = new InjectionToken('Summary of formatting settings for variant types of data, e.g. numbers, text, dates, etc');
|
|
1500
|
+
|
|
1501
|
+
const UI_DEFINITION_VERSION = 3;
|
|
1502
|
+
|
|
2297
1503
|
const DEFAULT_FORMATTING_SETTINGS = {
|
|
2298
1504
|
currencySymbol: DEFAULT_CURRENCY_SYMBOL,
|
|
2299
1505
|
decimalsCount: DEFAULT_DECIMALS_COUNT,
|
|
@@ -2308,7 +1514,6 @@ SdkCoreModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
|
2308
1514
|
SdkCoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, imports: [ConfigurationModule, FlowConfigurationModule] });
|
|
2309
1515
|
SdkCoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, providers: [
|
|
2310
1516
|
FlowInfoService,
|
|
2311
|
-
QuoteDraftService,
|
|
2312
1517
|
ProductImagesService,
|
|
2313
1518
|
IntegrationState,
|
|
2314
1519
|
FlowStateService,
|
|
@@ -2327,7 +1532,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
2327
1532
|
imports: [ConfigurationModule, FlowConfigurationModule],
|
|
2328
1533
|
providers: [
|
|
2329
1534
|
FlowInfoService,
|
|
2330
|
-
QuoteDraftService,
|
|
2331
1535
|
ProductImagesService,
|
|
2332
1536
|
IntegrationState,
|
|
2333
1537
|
FlowStateService,
|
|
@@ -2509,5 +1713,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
2509
1713
|
* Generated bundle index. Do not edit.
|
|
2510
1714
|
*/
|
|
2511
1715
|
|
|
2512
|
-
export { ActionCodePipe, CalendarDirective, ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService, DEFAULT_FORMATTING_SETTINGS, DatePipe, FLOW_CUSTOMIZATION, FORMATTING_SETTINGS_TOKEN,
|
|
1716
|
+
export { ActionCodePipe, CalendarDirective, ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService, DEFAULT_FORMATTING_SETTINGS, DatePipe, FLOW_CUSTOMIZATION, FORMATTING_SETTINGS_TOKEN, FlowConfigurationService, FlowInfoService, FlowStateConfigurationService, FlowStateService, IntegrationState, NumberPipe, PricePipe, ProductImagesService, RuntimeSettingsService, SalesTransactionService, SdkCoreModule, SdkDirectivesModule, SdkPipesModule, TransactionItemWorker, UI_DEFINITION_VERSION, extractMetadata, findTransactionItem, findTransactionItemWithComparator, generateTransactionItem, insertTransactionItem, removeTransactionItem, replaceTransactionItem };
|
|
2513
1717
|
//# sourceMappingURL=veloceapps-sdk-core.mjs.map
|