@configura/web-api 2.2.0-alpha.1 → 2.2.0-alpha.3
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/.eslintrc.json +5 -5
- package/LICENSE +201 -201
- package/README.md +1 -1
- package/dist/CatalogueAPI.d.ts +633 -633
- package/dist/CatalogueAPI.js +312 -312
- package/dist/CfgMeasure.d.ts +32 -32
- package/dist/CfgMeasure.js +30 -30
- package/dist/CfgProduct.d.ts +359 -344
- package/dist/CfgProduct.js +1005 -992
- package/dist/CfgReferencePathHelper.d.ts +26 -26
- package/dist/CfgReferencePathHelper.js +26 -26
- package/dist/index.d.ts +24 -24
- package/dist/index.js +24 -24
- package/dist/io/CfgHistoryManager.d.ts +83 -83
- package/dist/io/CfgHistoryManager.js +144 -144
- package/dist/io/CfgHistoryToProdConfConnector.d.ts +21 -21
- package/dist/io/CfgHistoryToProdConfConnector.js +50 -50
- package/dist/io/CfgIOManager.d.ts +53 -53
- package/dist/io/CfgIOManager.js +134 -134
- package/dist/io/CfgIOProdConfConnector.d.ts +54 -54
- package/dist/io/CfgIOProdConfConnector.js +139 -139
- package/dist/io/CfgIOWarningSupplier.d.ts +3 -3
- package/dist/io/CfgIOWarningSupplier.js +1 -1
- package/dist/io/CfgObservableStateManager.d.ts +25 -25
- package/dist/io/CfgObservableStateManager.js +69 -69
- package/dist/io/CfgObservableStateToProdConfConnector.d.ts +15 -15
- package/dist/io/CfgObservableStateToProdConfConnector.js +17 -17
- package/dist/io/CfgWindowEventManager.d.ts +21 -21
- package/dist/io/CfgWindowEventManager.js +38 -38
- package/dist/io/CfgWindowMessageManager.d.ts +40 -40
- package/dist/io/CfgWindowMessageManager.js +91 -91
- package/dist/io/CfgWindowMessageToProdConfConnector.d.ts +17 -17
- package/dist/io/CfgWindowMessageToProdConfConnector.js +19 -19
- package/dist/io/index.d.ts +8 -8
- package/dist/io/index.js +8 -8
- package/dist/material/CfgMaterialMapping.d.ts +7 -7
- package/dist/material/CfgMaterialMapping.js +181 -181
- package/dist/material/CfgMtrlApplication.d.ts +18 -18
- package/dist/material/CfgMtrlApplication.js +43 -43
- package/dist/material/CfgMtrlApplicationSource.d.ts +7 -7
- package/dist/material/CfgMtrlApplicationSource.js +8 -8
- package/dist/material/CfgMtrlSource.d.ts +19 -19
- package/dist/material/CfgMtrlSource.js +40 -40
- package/dist/material/CfgMtrlSourceWithMetaData.d.ts +7 -7
- package/dist/material/CfgMtrlSourceWithMetaData.js +1 -1
- package/dist/productConfiguration/CfgFeature.d.ts +199 -199
- package/dist/productConfiguration/CfgFeature.js +691 -691
- package/dist/productConfiguration/CfgOption.d.ts +160 -160
- package/dist/productConfiguration/CfgOption.js +464 -464
- package/dist/productConfiguration/CfgProductConfiguration.d.ts +136 -129
- package/dist/productConfiguration/CfgProductConfiguration.js +355 -346
- package/dist/productConfiguration/filters.d.ts +17 -17
- package/dist/productConfiguration/filters.js +141 -141
- package/dist/productConfiguration/productParamsGenerator.d.ts +15 -15
- package/dist/productConfiguration/productParamsGenerator.js +65 -65
- package/dist/productConfiguration/utilitiesProductConfiguration.d.ts +17 -17
- package/dist/productConfiguration/utilitiesProductConfiguration.js +89 -87
- package/dist/productLoader.d.ts +33 -33
- package/dist/productLoader.js +49 -49
- package/dist/syncGroups/SyncGroupsApplyMode.d.ts +20 -20
- package/dist/syncGroups/SyncGroupsApplyMode.js +21 -21
- package/dist/syncGroups/SyncGroupsHandler.d.ts +47 -47
- package/dist/syncGroups/SyncGroupsHandler.js +370 -370
- package/dist/syncGroups/SyncGroupsPathHelper.d.ts +26 -26
- package/dist/syncGroups/SyncGroupsPathHelper.js +90 -90
- package/dist/syncGroups/SyncGroupsState.d.ts +39 -39
- package/dist/syncGroups/SyncGroupsState.js +167 -167
- package/dist/syncGroups/SyncGroupsTransaction.d.ts +154 -154
- package/dist/syncGroups/SyncGroupsTransaction.js +589 -589
- package/dist/tasks/TaskHandler.d.ts +77 -77
- package/dist/tasks/TaskHandler.js +276 -276
- package/dist/tasks/formats.d.ts +4 -4
- package/dist/tasks/formats.js +7 -7
- package/dist/tests/testData/collectorForTest.d.ts +73 -73
- package/dist/tests/testData/collectorForTest.js +194 -194
- package/dist/tests/testData/dummyProductForTest.d.ts +4 -4
- package/dist/tests/testData/dummyProductForTest.js +32 -32
- package/dist/tests/testData/testDataAdditionalProductInAdditionalProductInProductForTest.d.ts +11 -11
- package/dist/tests/testData/testDataAdditionalProductInAdditionalProductInProductForTest.js +282 -282
- package/dist/tests/testData/testDataCachedGetProduct.d.ts +5 -5
- package/dist/tests/testData/testDataCachedGetProduct.js +187 -187
- package/dist/tests/testData/testDataCachedPostValidate.d.ts +7 -7
- package/dist/tests/testData/testDataCachedPostValidate.js +185 -185
- package/dist/tests/testData/testDataConstraints.d.ts +3 -3
- package/dist/tests/testData/testDataConstraints.js +174 -174
- package/dist/tests/testData/testDataNoAdditionalProductNoPropagateForTest.d.ts +3 -3
- package/dist/tests/testData/testDataNoAdditionalProductNoPropagateForTest.js +1099 -1099
- package/dist/tests/testData/testDataOptions.d.ts +12 -12
- package/dist/tests/testData/testDataOptions.js +60 -60
- package/dist/tests/testData/testDataProductAggregatedPrice.d.ts +6 -6
- package/dist/tests/testData/testDataProductAggregatedPrice.js +189 -189
- package/dist/tests/testData/testDataUpcharge.d.ts +8 -8
- package/dist/tests/testData/testDataUpcharge.js +121 -121
- package/dist/utilitiesCatalogueData.d.ts +47 -47
- package/dist/utilitiesCatalogueData.js +180 -180
- package/dist/utilitiesCataloguePermission.d.ts +38 -38
- package/dist/utilitiesCataloguePermission.js +79 -79
- package/dist/utilitiesConfiguration.d.ts +28 -28
- package/dist/utilitiesConfiguration.js +200 -200
- package/dist/utilitiesNumericValues.d.ts +24 -24
- package/dist/utilitiesNumericValues.js +114 -114
- package/package.json +3 -3
|
@@ -1,87 +1,89 @@
|
|
|
1
|
-
import { someMatch } from "@configura/web-utilities";
|
|
2
|
-
import { CfgFeature } from "./CfgFeature.js";
|
|
3
|
-
import { CfgOption } from "./CfgOption.js";
|
|
4
|
-
import { CfgProductConfiguration, } from "./CfgProductConfiguration.js";
|
|
5
|
-
/**
|
|
6
|
-
* Returns a new array of CfgFeatures that maps to the newFeatureRefs array. Uses CfgFeatures from
|
|
7
|
-
* currentFeatures if they can be found, otherwise makes new.
|
|
8
|
-
*/
|
|
9
|
-
export function syncCfgFeatures(newFeatureRefs, currentFeatures, rawFeatures, parent, parentConfiguration, parentProduct, rootProduct) {
|
|
10
|
-
const usedRawFeatures = newFeatureRefs
|
|
11
|
-
.map((r) => r.code)
|
|
12
|
-
.map((c) => {
|
|
13
|
-
const rawFeature = rawFeatures.find((f) => c === f.code);
|
|
14
|
-
if (rawFeature === undefined) {
|
|
15
|
-
throw new Error(`Feature not found. Requested feature code: "${c}".`);
|
|
16
|
-
}
|
|
17
|
-
return rawFeature;
|
|
18
|
-
});
|
|
19
|
-
const hasDuplicateDescription =
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
1
|
+
import { someMatch } from "@configura/web-utilities";
|
|
2
|
+
import { CfgFeature } from "./CfgFeature.js";
|
|
3
|
+
import { CfgOption } from "./CfgOption.js";
|
|
4
|
+
import { CfgProductConfiguration, } from "./CfgProductConfiguration.js";
|
|
5
|
+
/**
|
|
6
|
+
* Returns a new array of CfgFeatures that maps to the newFeatureRefs array. Uses CfgFeatures from
|
|
7
|
+
* currentFeatures if they can be found, otherwise makes new.
|
|
8
|
+
*/
|
|
9
|
+
export function syncCfgFeatures(newFeatureRefs, currentFeatures, rawFeatures, parent, parentConfiguration, parentProduct, rootProduct) {
|
|
10
|
+
const usedRawFeatures = newFeatureRefs
|
|
11
|
+
.map((r) => r.code)
|
|
12
|
+
.map((c) => {
|
|
13
|
+
const rawFeature = rawFeatures.find((f) => c === f.code);
|
|
14
|
+
if (rawFeature === undefined) {
|
|
15
|
+
throw new Error(`Feature not found. Requested feature code: "${c}".`);
|
|
16
|
+
}
|
|
17
|
+
return rawFeature;
|
|
18
|
+
});
|
|
19
|
+
const hasDuplicateDescription = parentProduct.settings.disableMatchOnDescription
|
|
20
|
+
? true
|
|
21
|
+
: someMatch(usedRawFeatures, (l, r) => {
|
|
22
|
+
return l.description.toLowerCase() === r.description.toLowerCase();
|
|
23
|
+
});
|
|
24
|
+
const newFeatures = [];
|
|
25
|
+
for (const f of usedRawFeatures) {
|
|
26
|
+
const fCode = f.code;
|
|
27
|
+
const fDescription = f.description;
|
|
28
|
+
// It is possible in Cat Creator to add the same Feature twice
|
|
29
|
+
// to the root of a Product. This fills no apparent purpose,
|
|
30
|
+
// and in CET the seem to behave as if they were the same.
|
|
31
|
+
// Removing the duplicates causes sync issues where the server
|
|
32
|
+
// expects all copies, and hence we short circuit them here
|
|
33
|
+
// by letting them refer to the same object instead.
|
|
34
|
+
const twin = newFeatures.find((f) => f.code === fCode);
|
|
35
|
+
if (twin !== undefined) {
|
|
36
|
+
newFeatures.push(twin);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
// Description based code helps when switching between
|
|
40
|
+
// products with similar feature-options tree and trying
|
|
41
|
+
// to retain made selections
|
|
42
|
+
const key = fDescription + (fDescription === "" || hasDuplicateDescription ? fCode : "");
|
|
43
|
+
const existingFeature = currentFeatures.find((cfgF) => cfgF.code === fCode);
|
|
44
|
+
if (existingFeature !== undefined) {
|
|
45
|
+
if (hasDuplicateDescription) {
|
|
46
|
+
// HasDuplicateDescription could mean the key need to be more specific compared
|
|
47
|
+
// to the one we already have, so then we set it. An old duplicate description
|
|
48
|
+
// key will cause no harm as it is guaranteed to be at least as specific as this.
|
|
49
|
+
// Not changing the key will make React not rerender, so we don't change.
|
|
50
|
+
existingFeature._internal.key = key;
|
|
51
|
+
}
|
|
52
|
+
newFeatures.push(existingFeature);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
newFeatures.push(CfgFeature.make(f, rawFeatures, key, parent, parentConfiguration, parentProduct, rootProduct));
|
|
56
|
+
}
|
|
57
|
+
return newFeatures;
|
|
58
|
+
}
|
|
59
|
+
export function getMtrlPreview(mtrlApplications) {
|
|
60
|
+
if (mtrlApplications === undefined) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const first = mtrlApplications[0];
|
|
64
|
+
if (first === undefined) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
return first.previewUrl;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Recursively find all additional product references given a product configuration.
|
|
71
|
+
* Only selected options are considered.
|
|
72
|
+
*/
|
|
73
|
+
export function collectAdditionalProductRefs(parent) {
|
|
74
|
+
function c(parent) {
|
|
75
|
+
const result = [];
|
|
76
|
+
if (parent instanceof CfgOption && parent.selected) {
|
|
77
|
+
result.push(...(parent.rawOption.additionalProductRefs || []));
|
|
78
|
+
}
|
|
79
|
+
if (parent instanceof CfgProductConfiguration || parent.selected) {
|
|
80
|
+
for (const feature of parent.features) {
|
|
81
|
+
for (const option of feature.options) {
|
|
82
|
+
result.push(...c(option));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
return c(parent);
|
|
89
|
+
}
|
package/dist/productLoader.d.ts
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import { DtoProductParamsWithCidAndLang, DtoValidateRequest } from "./CatalogueAPI.js";
|
|
2
|
-
import { CfgProductResponse, CfgValidateResponse } from "./utilitiesCatalogueData.js";
|
|
3
|
-
export declare type GetProduct = (params: DtoProductParamsWithCidAndLang) => Promise<CfgProductResponse>;
|
|
4
|
-
export declare type PostValidate = (params: DtoProductParamsWithCidAndLang, body: DtoValidateRequest) => Promise<CfgValidateResponse>;
|
|
5
|
-
export declare type ProductLoader = {
|
|
6
|
-
getProduct: GetProduct;
|
|
7
|
-
postValidate: PostValidate;
|
|
8
|
-
};
|
|
9
|
-
/**
|
|
10
|
-
* Wraps a getProduct function so that it caches for the time it lives.
|
|
11
|
-
*
|
|
12
|
-
* It has no cache invalidation or timeouts, so whatever ends up in the cache stays there
|
|
13
|
-
* indefinitely. For this reason we recommend using this with caution.
|
|
14
|
-
*
|
|
15
|
-
* In our Example App we use it to cache the internal calls in additional products as in such a
|
|
16
|
-
* product you tend to frequently get calls to same sub-product. Such as loading the same table leg
|
|
17
|
-
* four times.
|
|
18
|
-
*/
|
|
19
|
-
export declare function wrapWithGetProductCache(getProduct: GetProduct): GetProduct;
|
|
20
|
-
/**
|
|
21
|
-
* Wraps a postValidate function so that it caches for the time it lives.
|
|
22
|
-
*
|
|
23
|
-
* It has no cache invalidation or timeouts, so whatever ends up in the cache stays there
|
|
24
|
-
* indefinitely. We recommend you do not use this unless you are really, really sure what you are
|
|
25
|
-
* doing.
|
|
26
|
-
*
|
|
27
|
-
* The SDK uses it for additional products to avoid validating for example the same table legs four
|
|
28
|
-
* times at the same time. There we make sure the this cache only stays in scope for one user
|
|
29
|
-
* interaction. No longer than the actions caused by a user clicking an option.
|
|
30
|
-
*/
|
|
31
|
-
export declare function wrapWithPostValidateCache(postValidate: PostValidate): PostValidate;
|
|
32
|
-
/** Does both wrapWithGetProductCache and wrapWithPostValidateCache. */
|
|
33
|
-
export declare function wrapWithCache(loader: ProductLoader): ProductLoader;
|
|
1
|
+
import { DtoProductParamsWithCidAndLang, DtoValidateRequest } from "./CatalogueAPI.js";
|
|
2
|
+
import { CfgProductResponse, CfgValidateResponse } from "./utilitiesCatalogueData.js";
|
|
3
|
+
export declare type GetProduct = (params: DtoProductParamsWithCidAndLang) => Promise<CfgProductResponse>;
|
|
4
|
+
export declare type PostValidate = (params: DtoProductParamsWithCidAndLang, body: DtoValidateRequest) => Promise<CfgValidateResponse>;
|
|
5
|
+
export declare type ProductLoader = {
|
|
6
|
+
getProduct: GetProduct;
|
|
7
|
+
postValidate: PostValidate;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Wraps a getProduct function so that it caches for the time it lives.
|
|
11
|
+
*
|
|
12
|
+
* It has no cache invalidation or timeouts, so whatever ends up in the cache stays there
|
|
13
|
+
* indefinitely. For this reason we recommend using this with caution.
|
|
14
|
+
*
|
|
15
|
+
* In our Example App we use it to cache the internal calls in additional products as in such a
|
|
16
|
+
* product you tend to frequently get calls to same sub-product. Such as loading the same table leg
|
|
17
|
+
* four times.
|
|
18
|
+
*/
|
|
19
|
+
export declare function wrapWithGetProductCache(getProduct: GetProduct): GetProduct;
|
|
20
|
+
/**
|
|
21
|
+
* Wraps a postValidate function so that it caches for the time it lives.
|
|
22
|
+
*
|
|
23
|
+
* It has no cache invalidation or timeouts, so whatever ends up in the cache stays there
|
|
24
|
+
* indefinitely. We recommend you do not use this unless you are really, really sure what you are
|
|
25
|
+
* doing.
|
|
26
|
+
*
|
|
27
|
+
* The SDK uses it for additional products to avoid validating for example the same table legs four
|
|
28
|
+
* times at the same time. There we make sure the this cache only stays in scope for one user
|
|
29
|
+
* interaction. No longer than the actions caused by a user clicking an option.
|
|
30
|
+
*/
|
|
31
|
+
export declare function wrapWithPostValidateCache(postValidate: PostValidate): PostValidate;
|
|
32
|
+
/** Does both wrapWithGetProductCache and wrapWithPostValidateCache. */
|
|
33
|
+
export declare function wrapWithCache(loader: ProductLoader): ProductLoader;
|
|
34
34
|
//# sourceMappingURL=productLoader.d.ts.map
|
package/dist/productLoader.js
CHANGED
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import { PromiseCache } from "@configura/web-utilities";
|
|
11
|
-
import { makeProductKey, makeSelOptionsKey, } from "./utilitiesCatalogueData.js";
|
|
12
|
-
/**
|
|
13
|
-
* Wraps a getProduct function so that it caches for the time it lives.
|
|
14
|
-
*
|
|
15
|
-
* It has no cache invalidation or timeouts, so whatever ends up in the cache stays there
|
|
16
|
-
* indefinitely. For this reason we recommend using this with caution.
|
|
17
|
-
*
|
|
18
|
-
* In our Example App we use it to cache the internal calls in additional products as in such a
|
|
19
|
-
* product you tend to frequently get calls to same sub-product. Such as loading the same table leg
|
|
20
|
-
* four times.
|
|
21
|
-
*/
|
|
22
|
-
export function wrapWithGetProductCache(getProduct) {
|
|
23
|
-
const cache = new PromiseCache();
|
|
24
|
-
return (params) => __awaiter(this, void 0, void 0, function* () { return cache.get(makeProductKey(params), () => getProduct(params)); });
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Wraps a postValidate function so that it caches for the time it lives.
|
|
28
|
-
*
|
|
29
|
-
* It has no cache invalidation or timeouts, so whatever ends up in the cache stays there
|
|
30
|
-
* indefinitely. We recommend you do not use this unless you are really, really sure what you are
|
|
31
|
-
* doing.
|
|
32
|
-
*
|
|
33
|
-
* The SDK uses it for additional products to avoid validating for example the same table legs four
|
|
34
|
-
* times at the same time. There we make sure the this cache only stays in scope for one user
|
|
35
|
-
* interaction. No longer than the actions caused by a user clicking an option.
|
|
36
|
-
*/
|
|
37
|
-
export function wrapWithPostValidateCache(postValidate) {
|
|
38
|
-
const cache = new PromiseCache();
|
|
39
|
-
return (params, body) => __awaiter(this, void 0, void 0, function* () {
|
|
40
|
-
return cache.get(`${makeProductKey(params)}-${makeSelOptionsKey(body.selOptions)}-${body.knownFeatureCodes.join(",")}`, () => postValidate(params, body));
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
/** Does both wrapWithGetProductCache and wrapWithPostValidateCache. */
|
|
44
|
-
export function wrapWithCache(loader) {
|
|
45
|
-
return {
|
|
46
|
-
getProduct: wrapWithGetProductCache(loader.getProduct.bind(loader)),
|
|
47
|
-
postValidate: wrapWithPostValidateCache(loader.postValidate.bind(loader)),
|
|
48
|
-
};
|
|
49
|
-
}
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { PromiseCache } from "@configura/web-utilities";
|
|
11
|
+
import { makeProductKey, makeSelOptionsKey, } from "./utilitiesCatalogueData.js";
|
|
12
|
+
/**
|
|
13
|
+
* Wraps a getProduct function so that it caches for the time it lives.
|
|
14
|
+
*
|
|
15
|
+
* It has no cache invalidation or timeouts, so whatever ends up in the cache stays there
|
|
16
|
+
* indefinitely. For this reason we recommend using this with caution.
|
|
17
|
+
*
|
|
18
|
+
* In our Example App we use it to cache the internal calls in additional products as in such a
|
|
19
|
+
* product you tend to frequently get calls to same sub-product. Such as loading the same table leg
|
|
20
|
+
* four times.
|
|
21
|
+
*/
|
|
22
|
+
export function wrapWithGetProductCache(getProduct) {
|
|
23
|
+
const cache = new PromiseCache();
|
|
24
|
+
return (params) => __awaiter(this, void 0, void 0, function* () { return cache.get(makeProductKey(params), () => getProduct(params)); });
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Wraps a postValidate function so that it caches for the time it lives.
|
|
28
|
+
*
|
|
29
|
+
* It has no cache invalidation or timeouts, so whatever ends up in the cache stays there
|
|
30
|
+
* indefinitely. We recommend you do not use this unless you are really, really sure what you are
|
|
31
|
+
* doing.
|
|
32
|
+
*
|
|
33
|
+
* The SDK uses it for additional products to avoid validating for example the same table legs four
|
|
34
|
+
* times at the same time. There we make sure the this cache only stays in scope for one user
|
|
35
|
+
* interaction. No longer than the actions caused by a user clicking an option.
|
|
36
|
+
*/
|
|
37
|
+
export function wrapWithPostValidateCache(postValidate) {
|
|
38
|
+
const cache = new PromiseCache();
|
|
39
|
+
return (params, body) => __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
return cache.get(`${makeProductKey(params)}-${makeSelOptionsKey(body.selOptions)}-${body.knownFeatureCodes.join(",")}`, () => postValidate(params, body));
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/** Does both wrapWithGetProductCache and wrapWithPostValidateCache. */
|
|
44
|
+
export function wrapWithCache(loader) {
|
|
45
|
+
return {
|
|
46
|
+
getProduct: wrapWithGetProductCache(loader.getProduct.bind(loader)),
|
|
47
|
+
postValidate: wrapWithPostValidateCache(loader.postValidate.bind(loader)),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The SyncGroupsApplyMode controls how many SyncGroups can be updated in the SyncState for one
|
|
3
|
-
* run of rootProductOntoSyncState.
|
|
4
|
-
*
|
|
5
|
-
* "Fast" will update any SyncGroup that should be updated before running syncStateOntoRootProduct
|
|
6
|
-
* This way several SyncGroups can be applied in one go before sending the validation calls to the * server, making the whole process faster.
|
|
7
|
-
*
|
|
8
|
-
* The downside of this is that is not exactly how CET (the desktop software) works. CET will
|
|
9
|
-
* instead apply Features to the SyncState as soon as it gets the chance.
|
|
10
|
-
*
|
|
11
|
-
* "Strict" tries to behave exactly as CET. This will potentially generate a lot more validate
|
|
12
|
-
* calls, increasing delay and cost.
|
|
13
|
-
*
|
|
14
|
-
* Strict is the safer option of the two, but we still recommend trying out Fast since it should
|
|
15
|
-
* work fine in most cases.
|
|
16
|
-
*/
|
|
17
|
-
export declare enum SyncGroupsApplyMode {
|
|
18
|
-
Strict = "Strict",
|
|
19
|
-
Fast = "Fast"
|
|
20
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* The SyncGroupsApplyMode controls how many SyncGroups can be updated in the SyncState for one
|
|
3
|
+
* run of rootProductOntoSyncState.
|
|
4
|
+
*
|
|
5
|
+
* "Fast" will update any SyncGroup that should be updated before running syncStateOntoRootProduct
|
|
6
|
+
* This way several SyncGroups can be applied in one go before sending the validation calls to the * server, making the whole process faster.
|
|
7
|
+
*
|
|
8
|
+
* The downside of this is that is not exactly how CET (the desktop software) works. CET will
|
|
9
|
+
* instead apply Features to the SyncState as soon as it gets the chance.
|
|
10
|
+
*
|
|
11
|
+
* "Strict" tries to behave exactly as CET. This will potentially generate a lot more validate
|
|
12
|
+
* calls, increasing delay and cost.
|
|
13
|
+
*
|
|
14
|
+
* Strict is the safer option of the two, but we still recommend trying out Fast since it should
|
|
15
|
+
* work fine in most cases.
|
|
16
|
+
*/
|
|
17
|
+
export declare enum SyncGroupsApplyMode {
|
|
18
|
+
Strict = "Strict",
|
|
19
|
+
Fast = "Fast"
|
|
20
|
+
}
|
|
21
21
|
//# sourceMappingURL=SyncGroupsApplyMode.d.ts.map
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The SyncGroupsApplyMode controls how many SyncGroups can be updated in the SyncState for one
|
|
3
|
-
* run of rootProductOntoSyncState.
|
|
4
|
-
*
|
|
5
|
-
* "Fast" will update any SyncGroup that should be updated before running syncStateOntoRootProduct
|
|
6
|
-
* This way several SyncGroups can be applied in one go before sending the validation calls to the * server, making the whole process faster.
|
|
7
|
-
*
|
|
8
|
-
* The downside of this is that is not exactly how CET (the desktop software) works. CET will
|
|
9
|
-
* instead apply Features to the SyncState as soon as it gets the chance.
|
|
10
|
-
*
|
|
11
|
-
* "Strict" tries to behave exactly as CET. This will potentially generate a lot more validate
|
|
12
|
-
* calls, increasing delay and cost.
|
|
13
|
-
*
|
|
14
|
-
* Strict is the safer option of the two, but we still recommend trying out Fast since it should
|
|
15
|
-
* work fine in most cases.
|
|
16
|
-
*/
|
|
17
|
-
export var SyncGroupsApplyMode;
|
|
18
|
-
(function (SyncGroupsApplyMode) {
|
|
19
|
-
SyncGroupsApplyMode["Strict"] = "Strict";
|
|
20
|
-
SyncGroupsApplyMode["Fast"] = "Fast";
|
|
21
|
-
})(SyncGroupsApplyMode || (SyncGroupsApplyMode = {}));
|
|
1
|
+
/**
|
|
2
|
+
* The SyncGroupsApplyMode controls how many SyncGroups can be updated in the SyncState for one
|
|
3
|
+
* run of rootProductOntoSyncState.
|
|
4
|
+
*
|
|
5
|
+
* "Fast" will update any SyncGroup that should be updated before running syncStateOntoRootProduct
|
|
6
|
+
* This way several SyncGroups can be applied in one go before sending the validation calls to the * server, making the whole process faster.
|
|
7
|
+
*
|
|
8
|
+
* The downside of this is that is not exactly how CET (the desktop software) works. CET will
|
|
9
|
+
* instead apply Features to the SyncState as soon as it gets the chance.
|
|
10
|
+
*
|
|
11
|
+
* "Strict" tries to behave exactly as CET. This will potentially generate a lot more validate
|
|
12
|
+
* calls, increasing delay and cost.
|
|
13
|
+
*
|
|
14
|
+
* Strict is the safer option of the two, but we still recommend trying out Fast since it should
|
|
15
|
+
* work fine in most cases.
|
|
16
|
+
*/
|
|
17
|
+
export var SyncGroupsApplyMode;
|
|
18
|
+
(function (SyncGroupsApplyMode) {
|
|
19
|
+
SyncGroupsApplyMode["Strict"] = "Strict";
|
|
20
|
+
SyncGroupsApplyMode["Fast"] = "Fast";
|
|
21
|
+
})(SyncGroupsApplyMode || (SyncGroupsApplyMode = {}));
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
import { AggregatedLoadingObservable } from "@configura/web-utilities";
|
|
2
|
-
import { DtoSyncGroupState } from "../CatalogueAPI.js";
|
|
3
|
-
import { _CfgProductInternal } from "../CfgProduct.js";
|
|
4
|
-
import { _CfgOptionInternal } from "../productConfiguration/CfgOption.js";
|
|
5
|
-
import { ProductLoader } from "../productLoader.js";
|
|
6
|
-
import { SyncGroupsApplyMode } from "./SyncGroupsApplyMode.js";
|
|
7
|
-
import { SyncGroupsTransaction } from "./SyncGroupsTransaction.js";
|
|
8
|
-
export declare type SyncCode = string;
|
|
9
|
-
export declare type OptionCode = string;
|
|
10
|
-
/**
|
|
11
|
-
* Is used to apply the SyncGroups functionality on the Configuration and the other way around.
|
|
12
|
-
* It also keeps the SyncState.
|
|
13
|
-
*/
|
|
14
|
-
export declare class SyncGroupsHandler {
|
|
15
|
-
private _syncState;
|
|
16
|
-
readonly updateMode: SyncGroupsApplyMode;
|
|
17
|
-
private readonly _loadingObservable;
|
|
18
|
-
private _currentTransaction;
|
|
19
|
-
/**
|
|
20
|
-
* @param verboseLogging Set to true to get verbose sync state changes logged to the console.
|
|
21
|
-
*/
|
|
22
|
-
static make(updateMode?: SyncGroupsApplyMode, loadingObservable?: AggregatedLoadingObservable, initial?: DtoSyncGroupState, verboseLogging?: boolean): SyncGroupsHandler;
|
|
23
|
-
private constructor();
|
|
24
|
-
/** Please note that clones will use the same loadingObservable as their source. */
|
|
25
|
-
clone(): SyncGroupsHandler;
|
|
26
|
-
getCompactSyncGroupState(): DtoSyncGroupState;
|
|
27
|
-
/** Overwrites the sync state */
|
|
28
|
-
setCompactSyncGroupState(s: DtoSyncGroupState): void;
|
|
29
|
-
get verboseLogging(): boolean;
|
|
30
|
-
set verboseLogging(v: boolean);
|
|
31
|
-
/**
|
|
32
|
-
* Used to initially apply the sync state onto a new product so that it is "in sync"
|
|
33
|
-
* and to reapply the sync state when an optional additional product is selected.
|
|
34
|
-
*/
|
|
35
|
-
init(product: _CfgProductInternal, productLoader: ProductLoader): Promise<void>;
|
|
36
|
-
/**
|
|
37
|
-
* Used when an Option is selected or deselected to apply all consequences of the sync groups.
|
|
38
|
-
* Can cause multiple extra validation calls to the server.
|
|
39
|
-
*/
|
|
40
|
-
selectOption(product: _CfgProductInternal, option: _CfgOptionInternal, on: boolean, productLoader: ProductLoader): Promise<boolean>;
|
|
41
|
-
private _pending;
|
|
42
|
-
private setPending;
|
|
43
|
-
get pending(): _CfgOptionInternal | undefined;
|
|
44
|
-
private newTransaction;
|
|
45
|
-
private closeTransaction;
|
|
46
|
-
commitTransaction(transaction: SyncGroupsTransaction): Promise<void>;
|
|
47
|
-
}
|
|
1
|
+
import { AggregatedLoadingObservable } from "@configura/web-utilities";
|
|
2
|
+
import { DtoSyncGroupState } from "../CatalogueAPI.js";
|
|
3
|
+
import { _CfgProductInternal } from "../CfgProduct.js";
|
|
4
|
+
import { _CfgOptionInternal } from "../productConfiguration/CfgOption.js";
|
|
5
|
+
import { ProductLoader } from "../productLoader.js";
|
|
6
|
+
import { SyncGroupsApplyMode } from "./SyncGroupsApplyMode.js";
|
|
7
|
+
import { SyncGroupsTransaction } from "./SyncGroupsTransaction.js";
|
|
8
|
+
export declare type SyncCode = string;
|
|
9
|
+
export declare type OptionCode = string;
|
|
10
|
+
/**
|
|
11
|
+
* Is used to apply the SyncGroups functionality on the Configuration and the other way around.
|
|
12
|
+
* It also keeps the SyncState.
|
|
13
|
+
*/
|
|
14
|
+
export declare class SyncGroupsHandler {
|
|
15
|
+
private _syncState;
|
|
16
|
+
readonly updateMode: SyncGroupsApplyMode;
|
|
17
|
+
private readonly _loadingObservable;
|
|
18
|
+
private _currentTransaction;
|
|
19
|
+
/**
|
|
20
|
+
* @param verboseLogging Set to true to get verbose sync state changes logged to the console.
|
|
21
|
+
*/
|
|
22
|
+
static make(updateMode?: SyncGroupsApplyMode, loadingObservable?: AggregatedLoadingObservable, initial?: DtoSyncGroupState, verboseLogging?: boolean): SyncGroupsHandler;
|
|
23
|
+
private constructor();
|
|
24
|
+
/** Please note that clones will use the same loadingObservable as their source. */
|
|
25
|
+
clone(): SyncGroupsHandler;
|
|
26
|
+
getCompactSyncGroupState(): DtoSyncGroupState;
|
|
27
|
+
/** Overwrites the sync state */
|
|
28
|
+
setCompactSyncGroupState(s: DtoSyncGroupState): void;
|
|
29
|
+
get verboseLogging(): boolean;
|
|
30
|
+
set verboseLogging(v: boolean);
|
|
31
|
+
/**
|
|
32
|
+
* Used to initially apply the sync state onto a new product so that it is "in sync"
|
|
33
|
+
* and to reapply the sync state when an optional additional product is selected.
|
|
34
|
+
*/
|
|
35
|
+
init(product: _CfgProductInternal, productLoader: ProductLoader): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Used when an Option is selected or deselected to apply all consequences of the sync groups.
|
|
38
|
+
* Can cause multiple extra validation calls to the server.
|
|
39
|
+
*/
|
|
40
|
+
selectOption(product: _CfgProductInternal, option: _CfgOptionInternal, on: boolean, productLoader: ProductLoader): Promise<boolean>;
|
|
41
|
+
private _pending;
|
|
42
|
+
private setPending;
|
|
43
|
+
get pending(): _CfgOptionInternal | undefined;
|
|
44
|
+
private newTransaction;
|
|
45
|
+
private closeTransaction;
|
|
46
|
+
commitTransaction(transaction: SyncGroupsTransaction): Promise<void>;
|
|
47
|
+
}
|
|
48
48
|
//# sourceMappingURL=SyncGroupsHandler.d.ts.map
|