@useinsider/guido 3.19.0-beta.f02eaa1 → 3.20.0-beta.7b31fec
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/dist/components/Guido.vue.js +1 -1
- package/dist/components/Guido.vue2.js +33 -33
- package/dist/components/organisms/base/Toaster.vue2.js +13 -12
- package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.js +9 -7
- package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue2.js +69 -52
- package/dist/components/organisms/extensions/recommendation/RemoveStrategyModal.vue2.js +28 -44
- package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.js +3 -3
- package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue2.js +21 -20
- package/dist/composables/useCustomInterfaceAppearance.js +61 -51
- package/dist/composables/useHtmlValidator.js +87 -82
- package/dist/composables/useRecommendation.js +40 -35
- package/dist/composables/useStripo.js +30 -30
- package/dist/composables/useToaster.js +14 -20
- package/dist/enums/extensions/recommendationBlock.js +32 -25
- package/dist/extensions/Blocks/Recommendation/block.js +61 -42
- package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +21 -20
- package/dist/extensions/Blocks/Recommendation/controls/main/index.js +63 -58
- package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +109 -78
- package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +96 -97
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +209 -92
- package/dist/extensions/Blocks/Recommendation/utils/legacyStrategyMigration.js +1 -1
- package/dist/extensions/Blocks/Recommendation/utils/nodeConfigWriter.js +26 -16
- package/dist/extensions/Blocks/Recommendation/utils/strategyCommit.js +24 -0
- package/dist/extensions/Blocks/Recommendation/validation/requiredFields.js +21 -12
- package/dist/guido.css +1 -1
- package/dist/src/enums/extensions/recommendationBlock.d.ts +2 -0
- package/dist/src/extensions/Blocks/Recommendation/block.d.ts +10 -0
- package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +1 -0
- package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +1 -1
- package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +2 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +8 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +7 -6
- package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +92 -0
- package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMigration.d.ts +1 -1
- package/dist/src/extensions/Blocks/Recommendation/utils/strategyCommit.d.ts +14 -0
- package/dist/src/extensions/Blocks/Recommendation/validation/requiredFields.d.ts +4 -0
- package/dist/static/styles/components/recommendation-strategy.css.js +34 -4
- package/dist/static/styles/components/skeleton.css.js +23 -0
- package/dist/utils/templatePreparation.js +55 -55
- package/package.json +1 -1
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
var m = Object.defineProperty;
|
|
2
|
-
var C = (g,
|
|
3
|
-
var
|
|
2
|
+
var C = (g, c, t) => c in g ? m(g, c, { enumerable: !0, configurable: !0, writable: !0, value: t }) : g[c] = t;
|
|
3
|
+
var i = (g, c, t) => C(g, typeof c != "symbol" ? c + "" : c, t);
|
|
4
4
|
import { useConfig as p } from "../../../../../composables/useConfig.js";
|
|
5
5
|
import { ModificationDescription as y } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
6
6
|
import { CommonControl as N } from "../../../common-control.js";
|
|
7
|
-
import {
|
|
7
|
+
import { RRS_CONFIG_VERSION as _, DEFAULT_NODE_CONFIG as a } from "../../constants/defaultConfig.js";
|
|
8
8
|
import { RECOMMENDATION_ID_ATTR as I } from "../../constants/selectors.js";
|
|
9
|
-
import { RecommendationConfigService as
|
|
9
|
+
import { RecommendationConfigService as l } from "../../services/configService.js";
|
|
10
10
|
import { useRecommendationExtensionStore as R } from "../../store/recommendation.js";
|
|
11
11
|
import { registerNodeConfigWriter as b } from "../../utils/nodeConfigWriter.js";
|
|
12
12
|
import { AlgorithmControl as T } from "./algorithm.js";
|
|
13
|
-
import { ALGORITHM_CONTROL_ID as
|
|
13
|
+
import { ALGORITHM_CONTROL_ID as dt } from "./algorithm.js";
|
|
14
14
|
import { CurrencyControl as P } from "./currency.js";
|
|
15
15
|
import { CURRENCY_CONTROL_ID as gt } from "./currency.js";
|
|
16
16
|
import { FiltersControl as S } from "./filters.js";
|
|
17
|
-
import { FILTERS_CONTROL_ID as
|
|
17
|
+
import { FILTERS_CONTROL_ID as ft } from "./filters.js";
|
|
18
18
|
import { LayoutOrientationControl as O } from "./layoutOrientation.js";
|
|
19
19
|
import { LAYOUT_ORIENTATION_CONTROL_ID as Ct } from "./layoutOrientation.js";
|
|
20
20
|
import { LocaleControl as L } from "./locale.js";
|
|
@@ -31,34 +31,34 @@ import { StrategyControl as w } from "./strategy.js";
|
|
|
31
31
|
import { STRATEGY_CONTROL_ID as Lt } from "./strategy.js";
|
|
32
32
|
import { setCurrencyAttributes as A, getBlockElement as B, isPartnerManagedBlock as v, updateProductContentInPlace as x, regenerateProductRowsWithStyles as U } from "./utils.js";
|
|
33
33
|
import { adjustProductsToSize as Et, formatProductPrice as Ft, getCardComposition as Dt, getCurrentLayout as wt, getMainContainerTbody as At, regenerateMobileProductRows as Bt, updatePricesInPlace as vt, updateSingleProductContent as xt } from "./utils.js";
|
|
34
|
-
import { useDebounceFn as
|
|
35
|
-
const
|
|
34
|
+
import { useDebounceFn as h } from "../../../../../node_modules/@vueuse/shared/index.js";
|
|
35
|
+
const W = "ui-elements-recommendation-block";
|
|
36
36
|
class at extends N {
|
|
37
37
|
constructor() {
|
|
38
38
|
super(...arguments);
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
i(this, "store", R());
|
|
40
|
+
i(this, "storeUnsubscription", () => {
|
|
41
41
|
});
|
|
42
42
|
// A config change waiting to reach the node config. Deferred so it can ride the
|
|
43
43
|
// re-render's single apply() — one user action must cost one undo press.
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
i(this, "pendingNodeConfigWrite", null);
|
|
45
|
+
i(this, "pendingConfigFlushTimer", null);
|
|
46
46
|
// Sub-control instances for lifecycle management
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
47
|
+
i(this, "algorithmControl", null);
|
|
48
|
+
i(this, "localeControl", null);
|
|
49
|
+
i(this, "currencyControl", null);
|
|
50
|
+
i(this, "productCountControl", null);
|
|
51
|
+
i(this, "productLayoutControl", null);
|
|
52
|
+
i(this, "filtersControl", null);
|
|
53
|
+
i(this, "shuffleControl", null);
|
|
54
|
+
i(this, "pricePlacementControl", null);
|
|
55
|
+
i(this, "layoutOrientationControl", null);
|
|
56
|
+
i(this, "strategyControl", null);
|
|
57
|
+
i(this, "rrsEnabled", !1);
|
|
58
58
|
/**
|
|
59
59
|
* Debounced product fetch to prevent rapid API calls during config changes
|
|
60
60
|
*/
|
|
61
|
-
|
|
61
|
+
i(this, "_debouncedFetchProducts", h(async () => {
|
|
62
62
|
try {
|
|
63
63
|
await this.store.fetchRecommendationProducts();
|
|
64
64
|
} finally {
|
|
@@ -76,7 +76,7 @@ class at extends N {
|
|
|
76
76
|
* count. The store pads products to the configured size, so in-place only
|
|
77
77
|
* fails when the size actually changed.
|
|
78
78
|
*/
|
|
79
|
-
|
|
79
|
+
i(this, "_debouncedRegenerateWithProducts", h(() => {
|
|
80
80
|
const t = this.store.recommendationProducts;
|
|
81
81
|
if (!this.currentNode || !this.api)
|
|
82
82
|
return;
|
|
@@ -97,7 +97,7 @@ class at extends N {
|
|
|
97
97
|
}, 100));
|
|
98
98
|
}
|
|
99
99
|
getId() {
|
|
100
|
-
return
|
|
100
|
+
return W;
|
|
101
101
|
}
|
|
102
102
|
get _subControls() {
|
|
103
103
|
return [
|
|
@@ -136,18 +136,18 @@ class at extends N {
|
|
|
136
136
|
`;
|
|
137
137
|
}
|
|
138
138
|
_showControlsForBlock(t) {
|
|
139
|
-
var
|
|
140
|
-
const e = (
|
|
139
|
+
var r;
|
|
140
|
+
const e = (r = this.getContainer()) == null ? void 0 : r.querySelector(".recommendation-controls-container");
|
|
141
141
|
if (!e)
|
|
142
142
|
return;
|
|
143
|
-
const o = this._getRecommendationIdFromNode(t) === null ? null :
|
|
143
|
+
const o = this._getRecommendationIdFromNode(t) === null ? null : l.getConfig(t), n = this.rrsEnabled && !!o && (!!(o != null && o.strategyId) || ((o == null ? void 0 : o.configVersion) ?? 0) >= _), s = this.rrsEnabled && !!o && !n;
|
|
144
144
|
e.classList.toggle("strategy-block", n), e.classList.toggle("legacy-strategy-block", s);
|
|
145
145
|
}
|
|
146
146
|
async onRender() {
|
|
147
147
|
var o;
|
|
148
148
|
b(this.api);
|
|
149
149
|
const t = this._getRecommendationIdFromNode(this.currentNode), e = t ?? this.store.currentRecommendationId;
|
|
150
|
-
if (e !== null && this.store.setCurrentBlock(e), t !== null && this._syncNodeConfigIfChanged(t), this._listenStateUpdates(), this._showControlsForBlock(this.currentNode), e !== null && ((o = this.store.blockStates[e]) != null && o.isInitialized)) {
|
|
150
|
+
if (e !== null && this.store.setCurrentBlock(e), t !== null && this._syncNodeConfigIfChanged(t), this._listenStateUpdates(), this._showControlsForBlock(this.currentNode), t !== null && this.strategyControl && (this.strategyControl.api = this.api, this.strategyControl.currentNode = this.currentNode, this.strategyControl.onRender()), e !== null && ((o = this.store.blockStates[e]) != null && o.isInitialized)) {
|
|
151
151
|
this._initializeSubControls();
|
|
152
152
|
return;
|
|
153
153
|
}
|
|
@@ -209,18 +209,23 @@ class at extends N {
|
|
|
209
209
|
const e = this.store.blockStates[t];
|
|
210
210
|
if (!e)
|
|
211
211
|
return;
|
|
212
|
-
const o = JSON.stringify(
|
|
212
|
+
const o = JSON.stringify(l.getConfig(this.currentNode)), n = e.syncedConfigFingerprint;
|
|
213
213
|
e.syncedConfigFingerprint = o, n !== o && (this.pendingNodeConfigWrite || this._syncNodeConfigToStore());
|
|
214
214
|
}
|
|
215
|
+
/** Whether the deferred write would move the node's strategyId — see the caller (SD-149916). */
|
|
216
|
+
_isPendingStrategyIdChange() {
|
|
217
|
+
const t = this.pendingNodeConfigWrite;
|
|
218
|
+
return t ? l.getConfig(this.currentNode).strategyId !== t.updates.strategyId : !1;
|
|
219
|
+
}
|
|
215
220
|
_capturePendingNodeConfigWrite() {
|
|
216
221
|
const t = this.store.currentRecommendationId;
|
|
217
222
|
if (!this.currentNode || !this.api || t === null)
|
|
218
223
|
return;
|
|
219
|
-
const { filters: e,
|
|
224
|
+
const { filters: e, strategy: o, strategyId: n, size: s, nodeConfigVersion: r } = this.store.recommendationConfigs;
|
|
220
225
|
this.pendingNodeConfigWrite = {
|
|
221
226
|
blockId: t,
|
|
222
227
|
node: this.currentNode,
|
|
223
|
-
updates: { filters: e,
|
|
228
|
+
updates: { filters: e, strategy: o, strategyId: n, size: s, configVersion: r }
|
|
224
229
|
};
|
|
225
230
|
}
|
|
226
231
|
/**
|
|
@@ -235,7 +240,7 @@ class at extends N {
|
|
|
235
240
|
*/
|
|
236
241
|
_stagePendingNodeConfig(t) {
|
|
237
242
|
const e = this.pendingNodeConfigWrite;
|
|
238
|
-
return !e || !this.currentNode ? !1 : (
|
|
243
|
+
return !e || !this.currentNode ? !1 : (l.stageConfig(t, this.currentNode, e.updates), !0);
|
|
239
244
|
}
|
|
240
245
|
/**
|
|
241
246
|
* Arms the guaranteed fallback write, once the product fetch has settled. The
|
|
@@ -259,12 +264,12 @@ class at extends N {
|
|
|
259
264
|
const t = this.pendingNodeConfigWrite;
|
|
260
265
|
if (this.pendingNodeConfigWrite = null, this._clearConfigFlush(), !t || !this.api)
|
|
261
266
|
return;
|
|
262
|
-
const e = t.blockId === this.store.currentRecommendationId && this.currentNode ? this.currentNode : t.node, o =
|
|
263
|
-
JSON.stringify(o.filters) === JSON.stringify(t.updates.filters) && o.strategyId === t.updates.strategyId && o.size === t.updates.size ||
|
|
267
|
+
const e = t.blockId === this.store.currentRecommendationId && this.currentNode ? this.currentNode : t.node, o = l.getConfig(e);
|
|
268
|
+
JSON.stringify(o.filters) === JSON.stringify(t.updates.filters) && o.strategy === t.updates.strategy && o.strategyId === t.updates.strategyId && o.size === t.updates.size || l.updateConfig(this.api, e, t.updates, "Update recommendation filters");
|
|
264
269
|
}
|
|
265
270
|
_syncNodeConfigToStore() {
|
|
266
271
|
var n;
|
|
267
|
-
const t =
|
|
272
|
+
const t = l.getConfig(this.currentNode), e = this.store.currentRecommendationId, o = e !== null && ((n = this.store.blockStates[e]) == null ? void 0 : n.isInitialized);
|
|
268
273
|
this.store.patchCurrentBlockConfig({
|
|
269
274
|
strategy: t.strategy,
|
|
270
275
|
strategyId: t.strategyId,
|
|
@@ -329,31 +334,31 @@ class at extends N {
|
|
|
329
334
|
_applySmartDefaults() {
|
|
330
335
|
if (!this.currentNode || !this.api)
|
|
331
336
|
return;
|
|
332
|
-
const t =
|
|
337
|
+
const t = l.getConfig(this.currentNode), e = {};
|
|
333
338
|
let o = null, n = null, s = null;
|
|
334
339
|
if (t.currency.code === a.currency.code) {
|
|
335
|
-
const { currencyList:
|
|
336
|
-
|
|
337
|
-
(
|
|
338
|
-
) || (o =
|
|
340
|
+
const { currencyList: r } = this.store;
|
|
341
|
+
r.length > 0 && (r.some(
|
|
342
|
+
(u) => u.value === `price.${a.currency.code}`
|
|
343
|
+
) || (o = r[0].value.replace("price.", ""), e.currency = {
|
|
339
344
|
...a.currency,
|
|
340
345
|
code: o,
|
|
341
346
|
symbol: o
|
|
342
347
|
}));
|
|
343
348
|
}
|
|
344
349
|
if (t.strategy === a.strategy) {
|
|
345
|
-
const
|
|
346
|
-
|
|
347
|
-
(
|
|
348
|
-
) || (n =
|
|
350
|
+
const r = this.store.getActivePredictiveAlgorithms;
|
|
351
|
+
r.length > 0 && (r.some(
|
|
352
|
+
(u) => u.value === a.strategy
|
|
353
|
+
) || (n = r[0].value, e.strategy = n));
|
|
349
354
|
}
|
|
350
355
|
if (t.language === a.language) {
|
|
351
|
-
const
|
|
352
|
-
|
|
353
|
-
(
|
|
354
|
-
) || (s =
|
|
356
|
+
const r = this.store.getLanguages;
|
|
357
|
+
r.length > 0 && (r.some(
|
|
358
|
+
(u) => u.value === a.language
|
|
359
|
+
) || (s = r[0].value, e.language = s));
|
|
355
360
|
}
|
|
356
|
-
!o && !n && !s || (
|
|
361
|
+
!o && !n && !s || (l.updateConfig(
|
|
357
362
|
this.api,
|
|
358
363
|
this.currentNode,
|
|
359
364
|
e,
|
|
@@ -413,20 +418,20 @@ class at extends N {
|
|
|
413
418
|
n = s, e = t.recommendationProducts, o = t.$state.configVersion;
|
|
414
419
|
return;
|
|
415
420
|
}
|
|
416
|
-
const
|
|
417
|
-
|
|
418
|
-
const
|
|
419
|
-
|
|
421
|
+
const r = t.$state.configVersion;
|
|
422
|
+
r !== o && (o = r, this._capturePendingNodeConfigWrite(), this._isPendingStrategyIdChange() && this._flushPendingNodeConfig(), this._debouncedFetchProducts());
|
|
423
|
+
const d = t.recommendationProducts, u = d !== e, f = Array.isArray(d) && d.length > 0;
|
|
424
|
+
u && f && (e = d, this._debouncedRegenerateWithProducts());
|
|
420
425
|
});
|
|
421
426
|
}
|
|
422
427
|
}
|
|
423
428
|
export {
|
|
424
|
-
|
|
429
|
+
dt as ALGORITHM_CONTROL_ID,
|
|
425
430
|
T as AlgorithmControl,
|
|
426
|
-
|
|
431
|
+
W as CONTROL_BLOCK_ID,
|
|
427
432
|
gt as CURRENCY_CONTROL_ID,
|
|
428
433
|
P as CurrencyControl,
|
|
429
|
-
|
|
434
|
+
ft as FILTERS_CONTROL_ID,
|
|
430
435
|
S as FiltersControl,
|
|
431
436
|
Ct as LAYOUT_ORIENTATION_CONTROL_ID,
|
|
432
437
|
yt as LOCALE_CONTROL_ID,
|
|
@@ -1,49 +1,64 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
import { useLegacyStrategyConversion as
|
|
5
|
-
import { ACADEMY_LINKS as
|
|
6
|
-
import { useOnboardingStore as
|
|
7
|
-
import { CommonControl as
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
var C = Object.defineProperty;
|
|
2
|
+
var $ = (c, n, t) => n in c ? C(c, n, { enumerable: !0, configurable: !0, writable: !0, value: t }) : c[n] = t;
|
|
3
|
+
var i = (c, n, t) => $(c, typeof n != "symbol" ? n + "" : n, t);
|
|
4
|
+
import { useLegacyStrategyConversion as k } from "../../../../../composables/useLegacyStrategyConversion.js";
|
|
5
|
+
import { ACADEMY_LINKS as L } from "../../../../../enums/academy.js";
|
|
6
|
+
import { useOnboardingStore as w } from "../../../../../stores/onboarding.js";
|
|
7
|
+
import { CommonControl as A } from "../../../common-control.js";
|
|
8
|
+
import { RRS_CONFIG_VERSION as N } from "../../constants/defaultConfig.js";
|
|
9
|
+
import { RecommendationConfigService as b } from "../../services/configService.js";
|
|
10
|
+
import { useRecommendationExtensionStore as R } from "../../store/recommendation.js";
|
|
11
|
+
const E = "recommendation-strategy-control";
|
|
12
|
+
class M extends A {
|
|
11
13
|
constructor() {
|
|
12
14
|
super(...arguments);
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
i(this, "store", R());
|
|
16
|
+
i(this, "onboardingStore", w());
|
|
17
|
+
i(this, "legacyConversion", k());
|
|
18
|
+
i(this, "storeUnsubscription", () => {
|
|
17
19
|
});
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
i(this, "listeners", []);
|
|
21
|
+
i(this, "lastPaintedState", null);
|
|
20
22
|
}
|
|
21
23
|
getId() {
|
|
22
|
-
return
|
|
24
|
+
return E;
|
|
23
25
|
}
|
|
24
26
|
getTemplate() {
|
|
25
27
|
const t = this.api.translate(
|
|
26
28
|
"You can assign a recommendation strategy by selecting an existing one or creating a new one to show specific content."
|
|
27
|
-
), e = this.api.translate("For more information, you can"),
|
|
29
|
+
), e = this.api.translate("For more information, you can"), s = this.api.translate("visit Academy"), o = this.api.translate("Legacy Strategy"), a = this.api.translate(
|
|
28
30
|
"Note that this is an older version of the Recommendation Strategy. We recommend you update it to the new Recommendation Strategy for an improved experience."
|
|
29
31
|
);
|
|
30
32
|
return `
|
|
31
33
|
<div class="strategy-control-container">
|
|
32
|
-
<div
|
|
33
|
-
<
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
<
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
</p>
|
|
34
|
+
<div data-strategy-loading-state>
|
|
35
|
+
<div class="strategy-control-header">
|
|
36
|
+
<span class="guido-skeleton guido-skeleton--strategy-title"></span>
|
|
37
|
+
</div>
|
|
38
|
+
<div class="strategy-control-description-row">
|
|
39
|
+
<span class="guido-skeleton guido-skeleton--strategy-description"></span>
|
|
40
|
+
</div>
|
|
41
|
+
<div class="strategy-control-skeleton-row">
|
|
42
|
+
<span class="guido-skeleton guido-skeleton--strategy-cta"></span>
|
|
43
|
+
<span class="guido-skeleton guido-skeleton--strategy-cta"></span>
|
|
44
|
+
</div>
|
|
44
45
|
</div>
|
|
45
|
-
<div data-strategy-
|
|
46
|
-
|
|
46
|
+
<div data-strategy-content style="display: none;">
|
|
47
|
+
<div class="strategy-control-header">
|
|
48
|
+
<h3 class="strategy-control-title">${this.api.translate("Recommendation Strategy")}</h3>
|
|
49
|
+
</div>
|
|
50
|
+
<div class="strategy-control-description-row">
|
|
51
|
+
<p class="strategy-control-description">
|
|
52
|
+
${t}
|
|
53
|
+
${e}
|
|
54
|
+
<a
|
|
55
|
+
href="${L.EMAIL_RECOMMENDATION_BLOCK}"
|
|
56
|
+
target="_blank"
|
|
57
|
+
rel="noopener noreferrer">${s}</a>.
|
|
58
|
+
</p>
|
|
59
|
+
</div>
|
|
60
|
+
<div data-strategy-empty-state style="display: none;">
|
|
61
|
+
${this._GuTwoColumns([
|
|
47
62
|
this._GuButton({
|
|
48
63
|
name: "assignStrategy",
|
|
49
64
|
label: this.api.translate("Assign Strategy"),
|
|
@@ -54,115 +69,131 @@ class N extends f {
|
|
|
54
69
|
name: "createStrategy",
|
|
55
70
|
label: this.api.translate("Create New Strategy"),
|
|
56
71
|
id: "guido__btn-create-strategy",
|
|
57
|
-
className: "strategy-control-cta primary"
|
|
58
|
-
disabled: !0
|
|
72
|
+
className: "strategy-control-cta primary"
|
|
59
73
|
})
|
|
60
74
|
], "strategy-control-cta-row")}
|
|
61
|
-
</div>
|
|
62
|
-
<div data-strategy-legacy-state style="display: none;">
|
|
63
|
-
<div class="strategy-control-notice-row">
|
|
64
|
-
<div class="strategy-control-notice">
|
|
65
|
-
<p class="strategy-control-notice-text">${n}</p>
|
|
66
|
-
</div>
|
|
67
75
|
</div>
|
|
68
|
-
<div
|
|
69
|
-
<
|
|
70
|
-
|
|
76
|
+
<div data-strategy-legacy-state style="display: none;">
|
|
77
|
+
<div class="strategy-control-notice-row">
|
|
78
|
+
<div class="strategy-control-notice">
|
|
79
|
+
<p class="strategy-control-notice-text">${a}</p>
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
<div class="strategy-control-name-band">
|
|
83
|
+
<span class="strategy-control-name">${o}</span>
|
|
84
|
+
${this._strategyAction({
|
|
71
85
|
id: "guido__btn-update-legacy-strategy",
|
|
72
86
|
label: this.api.translate("Update"),
|
|
73
87
|
modifier: "update"
|
|
74
88
|
})}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
89
|
+
</div>
|
|
90
|
+
<div class="strategy-control-actions">
|
|
91
|
+
${this._strategyAction({
|
|
78
92
|
id: "guido__btn-change-legacy-strategy",
|
|
79
93
|
label: this.api.translate("Change"),
|
|
80
94
|
modifier: "change"
|
|
81
95
|
})}
|
|
82
|
-
|
|
96
|
+
${this._strategyAction({
|
|
83
97
|
id: "guido__btn-remove-legacy-strategy",
|
|
84
98
|
label: this.api.translate("Remove"),
|
|
85
99
|
modifier: "remove"
|
|
86
100
|
})}
|
|
101
|
+
</div>
|
|
87
102
|
</div>
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
103
|
+
<div data-strategy-assigned-state style="display: none;">
|
|
104
|
+
<div class="strategy-control-name-band">
|
|
105
|
+
<span class="strategy-control-name" data-strategy-name></span>
|
|
106
|
+
<span
|
|
107
|
+
class="guido-skeleton guido-skeleton--strategy-name" data-strategy-name-skeleton></span>
|
|
108
|
+
</div>
|
|
109
|
+
<div class="strategy-control-actions">
|
|
110
|
+
${this._strategyAction({
|
|
95
111
|
id: "guido__btn-change-strategy",
|
|
96
112
|
label: this.api.translate("Change"),
|
|
97
113
|
modifier: "change"
|
|
98
114
|
})}
|
|
99
|
-
|
|
115
|
+
${this._strategyAction({
|
|
100
116
|
id: "guido__btn-remove-strategy",
|
|
101
117
|
label: this.api.translate("Remove"),
|
|
102
118
|
modifier: "remove"
|
|
103
119
|
})}
|
|
120
|
+
</div>
|
|
104
121
|
</div>
|
|
105
122
|
</div>
|
|
106
123
|
</div>
|
|
107
124
|
`;
|
|
108
125
|
}
|
|
109
|
-
_strategyAction({ id: t, label: e, modifier:
|
|
126
|
+
_strategyAction({ id: t, label: e, modifier: s }) {
|
|
110
127
|
return `
|
|
111
128
|
<button
|
|
112
129
|
id="${t}"
|
|
113
130
|
type="button"
|
|
114
|
-
class="strategy-control-action strategy-control-action--${
|
|
131
|
+
class="strategy-control-action strategy-control-action--${s}">
|
|
115
132
|
<span>${e}</span>
|
|
116
133
|
</button>
|
|
117
134
|
`;
|
|
118
135
|
}
|
|
119
136
|
onRender() {
|
|
120
|
-
this._teardown(), this._setupButtonListeners(), this._renderState(), this.storeUnsubscription = this.store.$subscribe(() => {
|
|
137
|
+
this._teardown(), this.store.strategyPanelOpen = !0, this._setupButtonListeners(), this._renderState(), this.storeUnsubscription = this.store.$subscribe(() => {
|
|
121
138
|
this._renderState();
|
|
122
|
-
}), this.store.recommendationConfigs.strategyId && !this.store.
|
|
139
|
+
}), this.store.recommendationConfigs.strategyId && !this.store.strategiesFetched && this.store.fetchStrategies().catch(() => {
|
|
123
140
|
});
|
|
124
|
-
|
|
125
|
-
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Whether the document itself says this block has no strategy.
|
|
144
|
+
*
|
|
145
|
+
* Read the node, not the store: when the main control cannot resolve the block id off the
|
|
146
|
+
* node it never syncs the persisted config, so the store still holds defaults (empty
|
|
147
|
+
* strategyId) for an assigned block.
|
|
148
|
+
*/
|
|
149
|
+
_isNodeUnassigned() {
|
|
150
|
+
if (!b.hasConfig(this.currentNode))
|
|
151
|
+
return !1;
|
|
152
|
+
const t = b.getConfig(this.currentNode);
|
|
153
|
+
return !t.strategyId && (t.configVersion ?? 0) >= N;
|
|
126
154
|
}
|
|
127
155
|
onDestroy() {
|
|
128
156
|
this._teardown();
|
|
129
157
|
}
|
|
130
158
|
_teardown() {
|
|
131
|
-
this.storeUnsubscription(), this.storeUnsubscription = () => {
|
|
159
|
+
this.store.strategyPanelOpen = !1, this.storeUnsubscription(), this.storeUnsubscription = () => {
|
|
132
160
|
}, this.lastPaintedState = null, this.listeners.forEach(({ element: t, handler: e }) => t.removeEventListener("click", e)), this.listeners = [];
|
|
133
161
|
}
|
|
134
162
|
_setupButtonListeners() {
|
|
135
163
|
const t = this.getContainer();
|
|
136
164
|
if (!t)
|
|
137
165
|
return;
|
|
138
|
-
const e = (
|
|
139
|
-
const
|
|
140
|
-
|
|
166
|
+
const e = (s, o) => {
|
|
167
|
+
const a = t.querySelector(s);
|
|
168
|
+
a && (a.addEventListener("click", o), this.listeners.push({ element: a, handler: o }));
|
|
141
169
|
};
|
|
142
|
-
e("#guido__btn-assign-strategy", () => this.store.openAssignStrategyDrawer()), e("#guido__btn-change-strategy", () => this.store.openAssignStrategyDrawer()), e("#guido__btn-change-legacy-strategy", () => this.store.openAssignStrategyDrawer()), e("#guido__btn-remove-strategy", () => this.store.openRemoveStrategyModal()), e("#guido__btn-remove-legacy-strategy", () => this.store.openRemoveStrategyModal()), e("#guido__btn-update-legacy-strategy", () => {
|
|
170
|
+
e("#guido__btn-assign-strategy", () => this.store.openAssignStrategyDrawer()), e("#guido__btn-create-strategy", () => this.store.openStrategyCreation()), e("#guido__btn-change-strategy", () => this.store.openAssignStrategyDrawer()), e("#guido__btn-change-legacy-strategy", () => this.store.openAssignStrategyDrawer()), e("#guido__btn-remove-strategy", () => this.store.openRemoveStrategyModal()), e("#guido__btn-remove-legacy-strategy", () => this.store.openRemoveStrategyModal()), e("#guido__btn-update-legacy-strategy", () => {
|
|
143
171
|
this.legacyConversion.convertLegacyStrategy();
|
|
144
172
|
});
|
|
145
173
|
}
|
|
146
174
|
_renderState() {
|
|
147
|
-
var
|
|
148
|
-
const { strategyId: t } = this.store.recommendationConfigs, e = t ? ((
|
|
149
|
-
if (
|
|
175
|
+
var _;
|
|
176
|
+
const { strategyId: t } = this.store.recommendationConfigs, e = t ? ((_ = this.store.assignedStrategy) == null ? void 0 : _.name) ?? "" : "", s = !!t && !e && (this.store.strategiesLoading || !this.store.strategiesSettled), o = this.store.legacyConversionLoading, a = this.store.isLegacyStrategyBlock, h = `${t}\0${e}\0${s}\0${o}\0${a}`;
|
|
177
|
+
if (h === this.lastPaintedState)
|
|
150
178
|
return;
|
|
151
|
-
const
|
|
152
|
-
if (!
|
|
179
|
+
const r = this.getContainer();
|
|
180
|
+
if (!r)
|
|
153
181
|
return;
|
|
154
|
-
const d =
|
|
182
|
+
const d = r.querySelector("[data-strategy-empty-state]"), y = r.querySelector("[data-strategy-assigned-state]"), g = r.querySelector("[data-strategy-legacy-state]"), p = r.querySelector("[data-strategy-loading-state]"), u = r.querySelector("[data-strategy-content]"), m = r.querySelector("[data-strategy-name]"), v = r.querySelector("[data-strategy-name-skeleton]");
|
|
155
183
|
if (!d || !y || !g)
|
|
156
184
|
return;
|
|
157
|
-
|
|
185
|
+
p && (p.style.display = "none"), u && (u.style.display = "");
|
|
186
|
+
const f = t ? y : a ? g : d;
|
|
158
187
|
[d, y, g].forEach((l) => {
|
|
159
|
-
l.style.display = l ===
|
|
188
|
+
l.style.display = l === f ? "" : "none";
|
|
160
189
|
}), g.querySelectorAll("button").forEach((l) => {
|
|
161
|
-
l.disabled =
|
|
162
|
-
}), g.classList.toggle("is-converting",
|
|
190
|
+
l.disabled = o;
|
|
191
|
+
}), g.classList.toggle("is-converting", o), !t && this._isNodeUnassigned() && this.onboardingStore.startOnboarding("recommendationStrategyOnboarding");
|
|
192
|
+
const S = this.store.currentRecommendationId;
|
|
193
|
+
a && S !== null && this.store.blockStates[S] && this.onboardingStore.startOnboarding("recommendationLegacyStrategyOnboarding"), m && (m.style.display = s ? "none" : "", t && !s && (m.textContent = e || `#${t}`)), v && (v.style.display = s ? "block" : "none"), this.lastPaintedState = h;
|
|
163
194
|
}
|
|
164
195
|
}
|
|
165
196
|
export {
|
|
166
|
-
|
|
167
|
-
|
|
197
|
+
E as STRATEGY_CONTROL_ID,
|
|
198
|
+
M as StrategyControl
|
|
168
199
|
};
|