@useinsider/guido 3.17.0-beta.6255bfc → 3.17.0-beta.77567eb
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/README.md +5 -6
- package/dist/@types/config/schemas.js +6 -12
- package/dist/components/Guido.vue.js +2 -2
- package/dist/components/Guido.vue2.js +30 -31
- package/dist/composables/useCustomInterfaceAppearance.js +38 -52
- package/dist/composables/useRecommendation.js +44 -52
- package/dist/config/migrator/recommendation/settingsMapper.js +17 -19
- package/dist/config/migrator/recommendationMigrator.js +4 -6
- package/dist/enums/academy.js +1 -2
- package/dist/enums/date.js +3 -4
- package/dist/enums/extensions/recommendationBlock.js +1 -4
- package/dist/extensions/Blocks/Recommendation/block.js +21 -26
- package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +34 -36
- package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +95 -96
- package/dist/extensions/Blocks/Recommendation/controls/main/index.js +166 -180
- package/dist/extensions/Blocks/Recommendation/services/configService.js +35 -35
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +110 -251
- package/dist/extensions/Blocks/common-control.js +19 -22
- package/dist/guido.css +1 -1
- package/dist/package.json.js +1 -1
- package/dist/services/recommendationApi.js +30 -75
- package/dist/src/@types/config/schemas.d.ts +0 -12
- package/dist/src/components/wrappers/WpModal.vue.d.ts +1 -1
- package/dist/src/composables/useConfig.d.ts +0 -2
- package/dist/src/composables/useRecommendation.d.ts +0 -1
- package/dist/src/enums/academy.d.ts +0 -1
- package/dist/src/enums/extensions/recommendationBlock.d.ts +0 -2
- package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +6 -7
- package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +1 -1
- package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +3 -15
- package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +10 -206
- package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +0 -6
- package/dist/src/extensions/Blocks/common-control.d.ts +1 -4
- package/dist/src/services/recommendationApi.d.ts +1 -4
- package/dist/src/stores/config.d.ts +0 -18
- package/dist/utils/dateUtil.js +10 -29
- package/dist/utils/templatePreparation.js +34 -37
- package/package.json +3 -4
- package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.js +0 -18
- package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue2.js +0 -66
- package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +0 -142
- package/dist/src/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.d.ts +0 -3
- package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +0 -30
- package/dist/src/mock/api/recommendation-strategies.d.ts +0 -63
- package/dist/src/utils/strategyInfoBox.d.ts +0 -22
- package/dist/static/assets/icons/line-change.svg.js +0 -5
- package/dist/static/assets/icons/line-delete.svg.js +0 -5
- package/dist/static/assets/icons/line-plus.svg.js +0 -5
- package/dist/static/styles/components/recommendation-strategy.css.js +0 -188
- package/dist/utils/strategyInfoBox.js +0 -37
|
@@ -1,57 +1,53 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { ALGORITHM_CONTROL_ID as it } from "./algorithm.js";
|
|
1
|
+
var f = Object.defineProperty;
|
|
2
|
+
var p = (d, l, t) => l in d ? f(d, l, { enumerable: !0, configurable: !0, writable: !0, value: t }) : d[l] = t;
|
|
3
|
+
var s = (d, l, t) => p(d, typeof l != "symbol" ? l + "" : l, t);
|
|
4
|
+
import { CommonControl as g } from "../../../common-control.js";
|
|
5
|
+
import { DEFAULT_NODE_CONFIG as c } from "../../constants/defaultConfig.js";
|
|
6
|
+
import { RecommendationConfigService as h } from "../../services/configService.js";
|
|
7
|
+
import { useRecommendationExtensionStore as y } from "../../store/recommendation.js";
|
|
8
|
+
import { AlgorithmControl as N } from "./algorithm.js";
|
|
9
|
+
import { ALGORITHM_CONTROL_ID as tt } from "./algorithm.js";
|
|
11
10
|
import { CurrencyControl as R } from "./currency.js";
|
|
12
|
-
import { CURRENCY_CONTROL_ID as
|
|
13
|
-
import { FiltersControl as
|
|
14
|
-
import { FILTERS_CONTROL_ID as
|
|
15
|
-
import { LayoutOrientationControl as
|
|
16
|
-
import { LAYOUT_ORIENTATION_CONTROL_ID as
|
|
17
|
-
import { LocaleControl as
|
|
18
|
-
import { LOCALE_CONTROL_ID as
|
|
19
|
-
import { PricePlacementControl as
|
|
20
|
-
import { PRICE_PLACEMENT_CONTROL_ID as
|
|
21
|
-
import { ProductCountControl as
|
|
22
|
-
import { PRODUCT_COUNT_CONTROL_ID as
|
|
23
|
-
import { ProductLayoutControl as
|
|
24
|
-
import { PRODUCT_LAYOUT_CONTROL_ID as
|
|
25
|
-
import { ShuffleControl as
|
|
26
|
-
import { SHUFFLE_CONTROL_ID as
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const A = "recommendation-id", x = "ui-elements-recommendation-block";
|
|
33
|
-
class ot extends y {
|
|
11
|
+
import { CURRENCY_CONTROL_ID as ot } from "./currency.js";
|
|
12
|
+
import { FiltersControl as I } from "./filters.js";
|
|
13
|
+
import { FILTERS_CONTROL_ID as nt } from "./filters.js";
|
|
14
|
+
import { LayoutOrientationControl as _ } from "./layoutOrientation.js";
|
|
15
|
+
import { LAYOUT_ORIENTATION_CONTROL_ID as st } from "./layoutOrientation.js";
|
|
16
|
+
import { LocaleControl as b } from "./locale.js";
|
|
17
|
+
import { LOCALE_CONTROL_ID as lt } from "./locale.js";
|
|
18
|
+
import { PricePlacementControl as T } from "./pricePlacement.js";
|
|
19
|
+
import { PRICE_PLACEMENT_CONTROL_ID as ut } from "./pricePlacement.js";
|
|
20
|
+
import { ProductCountControl as O } from "./productCount.js";
|
|
21
|
+
import { PRODUCT_COUNT_CONTROL_ID as ht } from "./productCount.js";
|
|
22
|
+
import { ProductLayoutControl as P } from "./productLayout.js";
|
|
23
|
+
import { PRODUCT_LAYOUT_CONTROL_ID as Ct } from "./productLayout.js";
|
|
24
|
+
import { ShuffleControl as S } from "./shuffle.js";
|
|
25
|
+
import { SHUFFLE_CONTROL_ID as pt } from "./shuffle.js";
|
|
26
|
+
import { setCurrencyAttributes as L, getBlockElement as k, isPartnerManagedBlock as D, updateProductContentInPlace as E, regenerateProductRowsWithStyles as A } from "./utils.js";
|
|
27
|
+
import { adjustProductsToSize as yt, formatProductPrice as Nt, getCardComposition as Rt, getCurrentLayout as It, regenerateMobileProductRows as _t, updatePricesInPlace as bt, updateSingleProductContent as Tt } from "./utils.js";
|
|
28
|
+
import { useDebounceFn as m } from "../../../../../node_modules/@vueuse/shared/index.js";
|
|
29
|
+
const v = "recommendation-id", w = "ui-elements-recommendation-block";
|
|
30
|
+
class Q extends g {
|
|
34
31
|
constructor() {
|
|
35
32
|
super(...arguments);
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
s(this, "store", y());
|
|
34
|
+
s(this, "storeUnsubscription", () => {
|
|
38
35
|
});
|
|
39
|
-
|
|
36
|
+
s(this, "syncedBlockIds", /* @__PURE__ */ new Set());
|
|
40
37
|
// Sub-control instances for lifecycle management
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
n(this, "strategyControl", null);
|
|
38
|
+
s(this, "algorithmControl", null);
|
|
39
|
+
s(this, "localeControl", null);
|
|
40
|
+
s(this, "currencyControl", null);
|
|
41
|
+
s(this, "productCountControl", null);
|
|
42
|
+
s(this, "productLayoutControl", null);
|
|
43
|
+
s(this, "filtersControl", null);
|
|
44
|
+
s(this, "shuffleControl", null);
|
|
45
|
+
s(this, "pricePlacementControl", null);
|
|
46
|
+
s(this, "layoutOrientationControl", null);
|
|
51
47
|
/**
|
|
52
48
|
* Debounced product fetch to prevent rapid API calls during config changes
|
|
53
49
|
*/
|
|
54
|
-
|
|
50
|
+
s(this, "_debouncedFetchProducts", m(() => {
|
|
55
51
|
this.store.fetchRecommendationProducts();
|
|
56
52
|
}, 500));
|
|
57
53
|
/**
|
|
@@ -65,16 +61,16 @@ class ot extends y {
|
|
|
65
61
|
* count. The store pads products to the configured size, so in-place only
|
|
66
62
|
* fails when the size actually changed.
|
|
67
63
|
*/
|
|
68
|
-
|
|
64
|
+
s(this, "_debouncedRegenerateWithProducts", m(() => {
|
|
69
65
|
const t = this.store.recommendationProducts;
|
|
70
|
-
if (!this.currentNode || !this.api ||
|
|
66
|
+
if (!this.currentNode || !this.api || D(this.currentNode))
|
|
71
67
|
return;
|
|
72
68
|
const e = this.api.getDocumentModifier();
|
|
73
|
-
|
|
69
|
+
E({
|
|
74
70
|
currentNode: this.currentNode,
|
|
75
71
|
documentModifier: e,
|
|
76
72
|
products: t
|
|
77
|
-
}) ||
|
|
73
|
+
}) || A({
|
|
78
74
|
currentNode: this.currentNode,
|
|
79
75
|
documentModifier: e,
|
|
80
76
|
products: t
|
|
@@ -82,44 +78,22 @@ class ot extends y {
|
|
|
82
78
|
}, 100));
|
|
83
79
|
}
|
|
84
80
|
getId() {
|
|
85
|
-
return
|
|
81
|
+
return w;
|
|
86
82
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
return [
|
|
90
|
-
this.layoutOrientationControl,
|
|
91
|
-
this.productCountControl,
|
|
83
|
+
getTemplate() {
|
|
84
|
+
return this.algorithmControl = new N(), this.localeControl = new b(), this.currencyControl = new R(), this.productCountControl = new O(), this.productLayoutControl = new P(), this.filtersControl = new I(), this.shuffleControl = new S(), this.pricePlacementControl = new T(), this.layoutOrientationControl = new _(), [
|
|
92
85
|
this.algorithmControl,
|
|
93
86
|
this.localeControl,
|
|
94
87
|
this.currencyControl,
|
|
88
|
+
this.productCountControl,
|
|
95
89
|
this.productLayoutControl,
|
|
96
90
|
this.filtersControl,
|
|
97
91
|
this.shuffleControl,
|
|
98
92
|
this.pricePlacementControl,
|
|
99
|
-
this.
|
|
100
|
-
]
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
const t = p().isFeatureEnabled("reusableRecommendationStrategy");
|
|
104
|
-
return this._subControls.forEach((e) => {
|
|
105
|
-
var o;
|
|
106
|
-
return (o = e == null ? void 0 : e.onDestroy) == null ? void 0 : o.call(e);
|
|
107
|
-
}), this.algorithmControl = new I(), this.localeControl = new S(), this.currencyControl = new R(), this.productCountControl = new P(), this.productLayoutControl = new L(), this.filtersControl = new T(), this.shuffleControl = new k(), this.pricePlacementControl = new O(), this.layoutOrientationControl = new b(), this.strategyControl = t ? new E() : null, this._subControls.forEach((e) => {
|
|
108
|
-
e && (e.api = this.api);
|
|
109
|
-
}), t ? `
|
|
110
|
-
<div class="recommendation-controls-container">
|
|
111
|
-
${this.strategyControl.getTemplate()}
|
|
112
|
-
${this.layoutOrientationControl.getTemplate()}
|
|
113
|
-
${this.productCountControl.getTemplate()}
|
|
114
|
-
${this.productLayoutControl.getTemplate()}
|
|
115
|
-
${this.algorithmControl.getTemplate()}
|
|
116
|
-
${this.localeControl.getTemplate()}
|
|
117
|
-
${this.pricePlacementControl.getTemplate()}
|
|
118
|
-
${this.currencyControl.getTemplate()}
|
|
119
|
-
${this.filtersControl.getTemplate()}
|
|
120
|
-
${this.shuffleControl.getTemplate()}
|
|
121
|
-
</div>
|
|
122
|
-
` : `
|
|
93
|
+
this.layoutOrientationControl
|
|
94
|
+
].forEach((e) => {
|
|
95
|
+
e.api = this.api;
|
|
96
|
+
}), `
|
|
123
97
|
<div class="recommendation-controls-container">
|
|
124
98
|
${this.layoutOrientationControl.getTemplate()}
|
|
125
99
|
${this.productCountControl.getTemplate()}
|
|
@@ -133,43 +107,50 @@ class ot extends y {
|
|
|
133
107
|
</div>
|
|
134
108
|
`;
|
|
135
109
|
}
|
|
136
|
-
/**
|
|
137
|
-
* Shows the selected block's own set of controls. A block is strategy-backed
|
|
138
|
-
* when a flag-on session stamped its config version, or when it already
|
|
139
|
-
* carries a strategy — an assignment must stay editable however it arrived.
|
|
140
|
-
*/
|
|
141
|
-
_showControlsForBlock(t) {
|
|
142
|
-
var i;
|
|
143
|
-
const e = (i = this.getContainer()) == null ? void 0 : i.querySelector(".recommendation-controls-container");
|
|
144
|
-
if (!e || this._getRecommendationIdFromNode(t) === null)
|
|
145
|
-
return;
|
|
146
|
-
const o = m.getConfig(t), r = (o.configVersion ?? 0) >= _ || !!o.strategyId;
|
|
147
|
-
e.classList.toggle("strategy-block", r);
|
|
148
|
-
}
|
|
149
110
|
async onRender() {
|
|
150
111
|
var o;
|
|
151
112
|
const t = this._getRecommendationIdFromNode(this.currentNode), e = t ?? this.store.currentRecommendationId;
|
|
152
|
-
if (e !== null && this.store.setCurrentBlock(e), t !== null && !this.syncedBlockIds.has(t) && (this.syncedBlockIds.add(t), this._syncNodeConfigToStore()), this._listenStateUpdates(),
|
|
113
|
+
if (e !== null && this.store.setCurrentBlock(e), t !== null && !this.syncedBlockIds.has(t) && (this.syncedBlockIds.add(t), this._syncNodeConfigToStore()), this._listenStateUpdates(), e !== null && ((o = this.store.blockStates[e]) != null && o.isInitialized)) {
|
|
153
114
|
this._initializeSubControls();
|
|
154
115
|
return;
|
|
155
116
|
}
|
|
156
117
|
await this._fetchBlockData(e), this._initializeSubControls();
|
|
157
118
|
}
|
|
158
119
|
onTemplateNodeUpdated(t) {
|
|
159
|
-
var
|
|
120
|
+
var r;
|
|
160
121
|
super.onTemplateNodeUpdated(t);
|
|
161
122
|
const e = this._getRecommendationIdFromNode(t);
|
|
162
|
-
e !== null && e !== this.store.currentRecommendationId && this.store.setCurrentBlock(e), e !== null && !this.syncedBlockIds.has(e) && (this.syncedBlockIds.add(e), this._syncNodeConfigToStore()),
|
|
123
|
+
e !== null && e !== this.store.currentRecommendationId && this.store.setCurrentBlock(e), e !== null && !this.syncedBlockIds.has(e) && (this.syncedBlockIds.add(e), this._syncNodeConfigToStore()), e !== null && !((r = this.store.blockStates[e]) != null && r.isInitialized) && this._fetchBlockData(e).then(() => {
|
|
163
124
|
this._initializeSubControls();
|
|
164
|
-
}),
|
|
125
|
+
}), [
|
|
126
|
+
this.layoutOrientationControl,
|
|
127
|
+
this.productCountControl,
|
|
128
|
+
this.algorithmControl,
|
|
129
|
+
this.localeControl,
|
|
130
|
+
this.currencyControl,
|
|
131
|
+
this.productLayoutControl,
|
|
132
|
+
this.filtersControl,
|
|
133
|
+
this.shuffleControl,
|
|
134
|
+
this.pricePlacementControl
|
|
135
|
+
].forEach((n) => {
|
|
165
136
|
var i;
|
|
166
|
-
|
|
137
|
+
n != null && n.api && (n.currentNode = t, (i = n.onTemplateNodeUpdated) == null || i.call(n, t));
|
|
167
138
|
});
|
|
168
139
|
}
|
|
169
140
|
onDestroy() {
|
|
170
|
-
this.storeUnsubscription(),
|
|
171
|
-
|
|
172
|
-
|
|
141
|
+
this.storeUnsubscription(), [
|
|
142
|
+
this.layoutOrientationControl,
|
|
143
|
+
this.productCountControl,
|
|
144
|
+
this.algorithmControl,
|
|
145
|
+
this.localeControl,
|
|
146
|
+
this.currencyControl,
|
|
147
|
+
this.productLayoutControl,
|
|
148
|
+
this.filtersControl,
|
|
149
|
+
this.shuffleControl,
|
|
150
|
+
this.pricePlacementControl
|
|
151
|
+
].forEach((e) => {
|
|
152
|
+
var o;
|
|
153
|
+
return (o = e == null ? void 0 : e.onDestroy) == null ? void 0 : o.call(e);
|
|
173
154
|
});
|
|
174
155
|
}
|
|
175
156
|
/**
|
|
@@ -177,9 +158,19 @@ class ot extends y {
|
|
|
177
158
|
* Each sub-control manages its own form values and event listeners
|
|
178
159
|
*/
|
|
179
160
|
_initializeSubControls() {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
161
|
+
[
|
|
162
|
+
this.layoutOrientationControl,
|
|
163
|
+
this.productCountControl,
|
|
164
|
+
this.algorithmControl,
|
|
165
|
+
this.localeControl,
|
|
166
|
+
this.currencyControl,
|
|
167
|
+
this.productLayoutControl,
|
|
168
|
+
this.filtersControl,
|
|
169
|
+
this.shuffleControl,
|
|
170
|
+
this.pricePlacementControl
|
|
171
|
+
].forEach((e) => {
|
|
172
|
+
var o;
|
|
173
|
+
e && (e.api = this.api, e.currentNode = this.currentNode, (o = e.onRender) == null || o.call(e));
|
|
183
174
|
});
|
|
184
175
|
}
|
|
185
176
|
/**
|
|
@@ -195,10 +186,9 @@ class ot extends y {
|
|
|
195
186
|
*/
|
|
196
187
|
_syncNodeConfigToStore() {
|
|
197
188
|
var r;
|
|
198
|
-
const t =
|
|
189
|
+
const t = h.getConfig(this.currentNode), e = this.store.currentRecommendationId, o = e !== null && ((r = this.store.blockStates[e]) == null ? void 0 : r.isInitialized);
|
|
199
190
|
this.store.patchCurrentBlockConfig({
|
|
200
191
|
strategy: t.strategy,
|
|
201
|
-
strategyId: t.strategyId,
|
|
202
192
|
language: t.language,
|
|
203
193
|
size: t.size,
|
|
204
194
|
productIds: t.productIds,
|
|
@@ -259,36 +249,36 @@ class ot extends y {
|
|
|
259
249
|
_applySmartDefaults() {
|
|
260
250
|
if (!this.currentNode || !this.api)
|
|
261
251
|
return;
|
|
262
|
-
const t =
|
|
263
|
-
let o = null, r = null,
|
|
264
|
-
if (t.currency.code ===
|
|
265
|
-
const { currencyList:
|
|
266
|
-
|
|
267
|
-
(u) => u.value === `price.${
|
|
268
|
-
) || (o =
|
|
269
|
-
...
|
|
252
|
+
const t = h.getConfig(this.currentNode), e = {};
|
|
253
|
+
let o = null, r = null, n = null;
|
|
254
|
+
if (t.currency.code === c.currency.code) {
|
|
255
|
+
const { currencyList: i } = this.store;
|
|
256
|
+
i.length > 0 && (i.some(
|
|
257
|
+
(u) => u.value === `price.${c.currency.code}`
|
|
258
|
+
) || (o = i[0].value.replace("price.", ""), e.currency = {
|
|
259
|
+
...c.currency,
|
|
270
260
|
code: o,
|
|
271
261
|
symbol: o
|
|
272
262
|
}));
|
|
273
263
|
}
|
|
274
|
-
if (t.strategy ===
|
|
275
|
-
const
|
|
276
|
-
|
|
277
|
-
(u) => u.value ===
|
|
278
|
-
) || (r =
|
|
264
|
+
if (t.strategy === c.strategy) {
|
|
265
|
+
const i = this.store.getActivePredictiveAlgorithms;
|
|
266
|
+
i.length > 0 && (i.some(
|
|
267
|
+
(u) => u.value === c.strategy
|
|
268
|
+
) || (r = i[0].value, e.strategy = r));
|
|
279
269
|
}
|
|
280
|
-
if (t.language ===
|
|
281
|
-
const
|
|
282
|
-
|
|
283
|
-
(u) => u.value ===
|
|
284
|
-
) || (
|
|
270
|
+
if (t.language === c.language) {
|
|
271
|
+
const i = this.store.getLanguages;
|
|
272
|
+
i.length > 0 && (i.some(
|
|
273
|
+
(u) => u.value === c.language
|
|
274
|
+
) || (n = i[0].value, e.language = n));
|
|
285
275
|
}
|
|
286
|
-
!o && !r && !
|
|
276
|
+
!o && !r && !n || (h.updateConfig(
|
|
287
277
|
this.api,
|
|
288
278
|
this.currentNode,
|
|
289
279
|
e,
|
|
290
280
|
"Applied smart defaults"
|
|
291
|
-
), o && e.currency &&
|
|
281
|
+
), o && e.currency && L({
|
|
292
282
|
currentNode: this.currentNode,
|
|
293
283
|
documentModifier: this.api.getDocumentModifier(),
|
|
294
284
|
currency: e.currency
|
|
@@ -298,24 +288,24 @@ class ot extends y {
|
|
|
298
288
|
name: o,
|
|
299
289
|
value: o,
|
|
300
290
|
symbol: o,
|
|
301
|
-
alignment:
|
|
302
|
-
decimalCount:
|
|
303
|
-
decimalSeparator:
|
|
304
|
-
thousandSeparator:
|
|
291
|
+
alignment: c.currency.alignment === "before" ? "0" : "1",
|
|
292
|
+
decimalCount: c.currency.decimalCount.toString(),
|
|
293
|
+
decimalSeparator: c.currency.decimalSeparator,
|
|
294
|
+
thousandSeparator: c.currency.thousandSeparator
|
|
305
295
|
}
|
|
306
296
|
} : {},
|
|
307
297
|
...r ? { strategy: r } : {},
|
|
308
|
-
...
|
|
298
|
+
...n ? { language: n } : {}
|
|
309
299
|
}, { triggerRefetch: !1 }));
|
|
310
300
|
}
|
|
311
301
|
/**
|
|
312
302
|
* Reads the recommendation-id attribute from the block element within the node
|
|
313
303
|
*/
|
|
314
304
|
_getRecommendationIdFromNode(t) {
|
|
315
|
-
const e =
|
|
305
|
+
const e = k(t);
|
|
316
306
|
if (!e || !("getAttribute" in e))
|
|
317
307
|
return null;
|
|
318
|
-
const o = e.getAttribute(
|
|
308
|
+
const o = e.getAttribute(v);
|
|
319
309
|
if (!o)
|
|
320
310
|
return null;
|
|
321
311
|
const r = parseInt(o);
|
|
@@ -338,68 +328,64 @@ class ot extends y {
|
|
|
338
328
|
const { store: t } = this;
|
|
339
329
|
let e = t.recommendationProducts, o = t.$state.configVersion, r = t.currentRecommendationId;
|
|
340
330
|
this.storeUnsubscription = t.$subscribe(() => {
|
|
341
|
-
const
|
|
342
|
-
if (
|
|
343
|
-
r =
|
|
331
|
+
const n = t.currentRecommendationId;
|
|
332
|
+
if (n !== r) {
|
|
333
|
+
r = n, e = t.recommendationProducts, o = t.$state.configVersion;
|
|
344
334
|
return;
|
|
345
335
|
}
|
|
346
|
-
const
|
|
347
|
-
|
|
348
|
-
const
|
|
349
|
-
u &&
|
|
336
|
+
const i = t.$state.configVersion;
|
|
337
|
+
i !== o && (o = i, this._persistFiltersToNodeConfig(), this._debouncedFetchProducts());
|
|
338
|
+
const a = t.recommendationProducts, u = a !== e, C = Array.isArray(a) && a.length > 0;
|
|
339
|
+
u && C && (e = a, this._debouncedRegenerateWithProducts());
|
|
350
340
|
});
|
|
351
341
|
}
|
|
352
342
|
/**
|
|
353
|
-
* Persists
|
|
354
|
-
*
|
|
355
|
-
* `size` rides along: assigning a strategy writes it to the store only, and a
|
|
356
|
-
* stale node config would rebuild the block against the old slot count.
|
|
343
|
+
* Persists the current filter state from Pinia store to the Stripo node config.
|
|
344
|
+
* This ensures filters survive template save/reload cycles.
|
|
357
345
|
*/
|
|
358
346
|
_persistFiltersToNodeConfig() {
|
|
359
347
|
if (!this.currentNode || !this.api)
|
|
360
348
|
return;
|
|
361
|
-
const { filters: t
|
|
362
|
-
JSON.stringify(
|
|
349
|
+
const { filters: t } = this.store.recommendationConfigs, e = h.getConfig(this.currentNode).filters;
|
|
350
|
+
JSON.stringify(e) !== JSON.stringify(t) && h.updateConfig(
|
|
363
351
|
this.api,
|
|
364
352
|
this.currentNode,
|
|
365
|
-
{ filters: t
|
|
353
|
+
{ filters: t },
|
|
366
354
|
"Update recommendation filters"
|
|
367
355
|
);
|
|
368
356
|
}
|
|
369
357
|
}
|
|
370
358
|
export {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
359
|
+
tt as ALGORITHM_CONTROL_ID,
|
|
360
|
+
N as AlgorithmControl,
|
|
361
|
+
w as CONTROL_BLOCK_ID,
|
|
362
|
+
ot as CURRENCY_CONTROL_ID,
|
|
375
363
|
R as CurrencyControl,
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
v as updateProductContentInPlace,
|
|
404
|
-
Dt as updateSingleProductContent
|
|
364
|
+
nt as FILTERS_CONTROL_ID,
|
|
365
|
+
I as FiltersControl,
|
|
366
|
+
st as LAYOUT_ORIENTATION_CONTROL_ID,
|
|
367
|
+
lt as LOCALE_CONTROL_ID,
|
|
368
|
+
_ as LayoutOrientationControl,
|
|
369
|
+
b as LocaleControl,
|
|
370
|
+
ut as PRICE_PLACEMENT_CONTROL_ID,
|
|
371
|
+
ht as PRODUCT_COUNT_CONTROL_ID,
|
|
372
|
+
Ct as PRODUCT_LAYOUT_CONTROL_ID,
|
|
373
|
+
T as PricePlacementControl,
|
|
374
|
+
O as ProductCountControl,
|
|
375
|
+
P as ProductLayoutControl,
|
|
376
|
+
Q as RecommendationBlockControl,
|
|
377
|
+
pt as SHUFFLE_CONTROL_ID,
|
|
378
|
+
S as ShuffleControl,
|
|
379
|
+
yt as adjustProductsToSize,
|
|
380
|
+
Nt as formatProductPrice,
|
|
381
|
+
k as getBlockElement,
|
|
382
|
+
Rt as getCardComposition,
|
|
383
|
+
It as getCurrentLayout,
|
|
384
|
+
D as isPartnerManagedBlock,
|
|
385
|
+
_t as regenerateMobileProductRows,
|
|
386
|
+
A as regenerateProductRowsWithStyles,
|
|
387
|
+
L as setCurrencyAttributes,
|
|
388
|
+
bt as updatePricesInPlace,
|
|
389
|
+
E as updateProductContentInPlace,
|
|
390
|
+
Tt as updateSingleProductContent
|
|
405
391
|
};
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { ModificationDescription as
|
|
2
|
-
import {
|
|
1
|
+
import { ModificationDescription as C } from "../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
2
|
+
import { CURRENT_CONFIG_VERSION as l, DEFAULT_NODE_CONFIG as c } from "../constants/defaultConfig.js";
|
|
3
3
|
import { setCurrencyAttributes as D } from "../controls/main/utils.js";
|
|
4
|
-
import { hasMinimalConfig as
|
|
5
|
-
function
|
|
6
|
-
return
|
|
4
|
+
import { hasMinimalConfig as A } from "../types/nodeConfig.js";
|
|
5
|
+
function S(e) {
|
|
6
|
+
return e === "." || e === "," || e === " ";
|
|
7
7
|
}
|
|
8
|
-
function N(
|
|
9
|
-
return
|
|
8
|
+
function N(e) {
|
|
9
|
+
return e === "." || e === "," || e === " " || e === "";
|
|
10
10
|
}
|
|
11
|
-
class
|
|
11
|
+
class M {
|
|
12
12
|
// ========================================================================
|
|
13
13
|
// Read Operations
|
|
14
14
|
// ========================================================================
|
|
@@ -48,7 +48,7 @@ class F {
|
|
|
48
48
|
return !1;
|
|
49
49
|
try {
|
|
50
50
|
const t = i.getNodeConfig();
|
|
51
|
-
return
|
|
51
|
+
return A(t);
|
|
52
52
|
} catch {
|
|
53
53
|
return !1;
|
|
54
54
|
}
|
|
@@ -82,9 +82,9 @@ class F {
|
|
|
82
82
|
* @param description - Human-readable description for undo/redo
|
|
83
83
|
* @returns The new complete configuration
|
|
84
84
|
*/
|
|
85
|
-
static updateConfig(i, t, o,
|
|
85
|
+
static updateConfig(i, t, o, n) {
|
|
86
86
|
const r = this.getConfig(t), u = this.deepMerge(r, o);
|
|
87
|
-
return this.saveConfig(i, t, u,
|
|
87
|
+
return this.saveConfig(i, t, u, n), u;
|
|
88
88
|
}
|
|
89
89
|
/**
|
|
90
90
|
* Initialize configuration for a new block
|
|
@@ -107,12 +107,12 @@ class F {
|
|
|
107
107
|
static initializeConfig(i, t, o) {
|
|
108
108
|
if (this.hasConfig(t))
|
|
109
109
|
return { config: o ? this.updateConfig(i, t, o, "Initialize recommendation block") : this.getConfig(t), wasFreshDrop: !1 };
|
|
110
|
-
const
|
|
111
|
-
return this.saveConfig(i, t,
|
|
110
|
+
const n = o ? this.mergeWithDefaults(o) : this.cloneDefaults();
|
|
111
|
+
return this.saveConfig(i, t, n, "Initialize recommendation block"), D({
|
|
112
112
|
currentNode: t,
|
|
113
113
|
documentModifier: i.getDocumentModifier(),
|
|
114
|
-
currency:
|
|
115
|
-
}), { config:
|
|
114
|
+
currency: n.currency
|
|
115
|
+
}), { config: n, wasFreshDrop: !0 };
|
|
116
116
|
}
|
|
117
117
|
/**
|
|
118
118
|
* Save complete configuration to a node
|
|
@@ -123,9 +123,9 @@ class F {
|
|
|
123
123
|
* @param config - Complete configuration to save
|
|
124
124
|
* @param description - Human-readable description for undo/redo
|
|
125
125
|
*/
|
|
126
|
-
static saveConfig(i, t, o,
|
|
126
|
+
static saveConfig(i, t, o, n) {
|
|
127
127
|
try {
|
|
128
|
-
i.getDocumentModifier().modifyHtml(t).setNodeConfig(o).apply(new
|
|
128
|
+
i.getDocumentModifier().modifyHtml(t).setNodeConfig(o).apply(new C(n));
|
|
129
129
|
} catch (r) {
|
|
130
130
|
console.warn("[RecommendationConfigService] Failed to save config:", r);
|
|
131
131
|
}
|
|
@@ -154,33 +154,33 @@ class F {
|
|
|
154
154
|
*/
|
|
155
155
|
static migrateFromDataAttributes(i, t) {
|
|
156
156
|
const o = {
|
|
157
|
-
configVersion:
|
|
157
|
+
configVersion: l
|
|
158
158
|
};
|
|
159
159
|
if ("getAttribute" in t && typeof t.getAttribute == "function") {
|
|
160
|
-
const
|
|
161
|
-
if (
|
|
160
|
+
const n = t.getAttribute("esd-ext-config");
|
|
161
|
+
if (n)
|
|
162
162
|
try {
|
|
163
|
-
const s = JSON.parse(
|
|
164
|
-
s && typeof s == "object" && Object.assign(o, s);
|
|
163
|
+
const s = JSON.parse(n);
|
|
164
|
+
s && typeof s == "object" && (Object.assign(o, s), o.configVersion = l);
|
|
165
165
|
} catch {
|
|
166
166
|
}
|
|
167
167
|
const r = t.getAttribute("data-layout");
|
|
168
168
|
r === "list" || r === "horizontal" ? o.layout = "list" : (r === "grid" || r === "vertical") && (o.layout = "grid");
|
|
169
169
|
const u = t.getAttribute("data-card-composition");
|
|
170
170
|
u && (o.composition = u.split(",").filter(Boolean));
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
const
|
|
174
|
-
if (
|
|
175
|
-
const s = t.getAttribute("currency"),
|
|
176
|
-
if (s ||
|
|
177
|
-
const a = c.currency,
|
|
171
|
+
const b = t.getAttribute("data-column-spacing");
|
|
172
|
+
b && (o.columnSpacing = parseInt(b) || c.columnSpacing);
|
|
173
|
+
const p = t.getAttribute("data-row-spacing");
|
|
174
|
+
if (p && (o.rowSpacing = parseInt(p) || c.rowSpacing), !o.currency) {
|
|
175
|
+
const s = t.getAttribute("currency"), y = t.getAttribute("currency-symbol"), d = t.getAttribute("currency-alignment"), f = t.getAttribute("currency-thousand-separator"), g = t.getAttribute("currency-decimal-separator"), m = t.getAttribute("currency-decimal-count");
|
|
176
|
+
if (s || y || d || f || g || m) {
|
|
177
|
+
const a = c.currency, h = m ? parseInt(m) : NaN;
|
|
178
178
|
o.currency = {
|
|
179
179
|
code: s ?? a.code,
|
|
180
|
-
symbol:
|
|
181
|
-
alignment:
|
|
182
|
-
decimalCount: Number.isFinite(
|
|
183
|
-
decimalSeparator:
|
|
180
|
+
symbol: y ?? a.symbol,
|
|
181
|
+
alignment: d === "0" ? "before" : "after",
|
|
182
|
+
decimalCount: Number.isFinite(h) ? h : a.decimalCount,
|
|
183
|
+
decimalSeparator: S(g) ? g : a.decimalSeparator,
|
|
184
184
|
thousandSeparator: N(f) ? f : a.thousandSeparator
|
|
185
185
|
};
|
|
186
186
|
}
|
|
@@ -194,7 +194,7 @@ class F {
|
|
|
194
194
|
* @returns True if migration is needed
|
|
195
195
|
*/
|
|
196
196
|
static needsMigration(i) {
|
|
197
|
-
return i ?
|
|
197
|
+
return i ? this.hasConfig(i) ? this.getConfigVersion(i) < l : !0 : !1;
|
|
198
198
|
}
|
|
199
199
|
// ========================================================================
|
|
200
200
|
// Internal Helpers
|
|
@@ -279,5 +279,5 @@ class F {
|
|
|
279
279
|
}
|
|
280
280
|
}
|
|
281
281
|
export {
|
|
282
|
-
|
|
282
|
+
M as RecommendationConfigService
|
|
283
283
|
};
|