@useinsider/guido 3.19.0-beta.7d287ab → 3.19.0-beta.84c97db
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/@types/config/schemas.js +9 -8
- package/dist/components/Guido.vue.js +2 -2
- package/dist/components/Guido.vue2.js +80 -67
- package/dist/components/organisms/AutoSaveController.vue2.js +18 -8
- package/dist/components/organisms/header/AutoSaveStatus.vue.js +17 -0
- package/dist/components/organisms/header/AutoSaveStatus.vue2.js +25 -0
- package/dist/components/organisms/header/EditorActions.vue.js +13 -13
- package/dist/components/organisms/header/EditorActions.vue2.js +37 -52
- package/dist/components/organisms/header/EditorActionsMenu.vue.js +20 -0
- package/dist/components/organisms/header/EditorActionsMenu.vue2.js +98 -0
- package/dist/components/organisms/header/HeaderWrapper.vue.js +6 -6
- package/dist/components/organisms/header/HeaderWrapper.vue2.js +9 -17
- package/dist/components/organisms/header/LeftSlot.vue.js +5 -5
- package/dist/components/organisms/header/LeftSlot.vue2.js +32 -23
- package/dist/components/organisms/header/MiddleSlot.vue.js +4 -4
- package/dist/components/organisms/header/MiddleSlot.vue2.js +8 -7
- package/dist/components/organisms/header/RightSlot.vue.js +9 -8
- package/dist/components/organisms/header/RightSlot.vue2.js +13 -18
- package/dist/components/organisms/header/accessibility/AccessibilityToolbar.vue.js +18 -0
- package/dist/components/organisms/header/accessibility/AccessibilityToolbar.vue2.js +37 -0
- package/dist/components/organisms/header/accessibility/ColorVisionSelect.vue.js +22 -0
- package/dist/components/organisms/header/accessibility/ColorVisionSelect.vue2.js +48 -0
- package/dist/components/organisms/onboarding/EditorTabBarOnboarding.vue.js +19 -0
- package/dist/components/organisms/onboarding/EditorTabBarOnboarding.vue2.js +90 -0
- package/dist/components/organisms/onboarding/OnboardingWrapper.vue.js +12 -12
- package/dist/components/organisms/onboarding/OnboardingWrapper.vue2.js +56 -38
- package/dist/composables/useAccessibilityApi.js +45 -0
- package/dist/composables/useCortexBlueprintBridge.js +122 -54
- package/dist/composables/useCustomInterfaceAppearance.js +42 -41
- package/dist/composables/useEmailTemplateApplier.js +111 -50
- package/dist/config/i18n/en/labels.json.js +36 -4
- package/dist/config/i18n/en/tooltips.json.js +2 -1
- package/dist/config/migrator/itemsBlockMigrator.js +236 -248
- package/dist/extensions/Blocks/Items/constants/cardLayout.js +20 -0
- package/dist/extensions/Blocks/Items/controls/name/trimming.js +18 -17
- package/dist/extensions/Blocks/Items/controls/settingsControl.js +114 -105
- package/dist/extensions/Blocks/Items/enums/productEnums.js +14 -9
- package/dist/extensions/Blocks/Items/layouts/horizontal.html.js +11 -9
- package/dist/extensions/Blocks/Items/template.js +219 -204
- package/dist/extensions/Blocks/Recommendation/controls/main/index.js +189 -226
- package/dist/guido.css +1 -1
- package/dist/sprite.svg +10 -0
- package/dist/src/@types/config/schemas.d.ts +2 -0
- package/dist/src/components/organisms/AutoSaveController.vue.d.ts +3 -1
- package/dist/src/components/organisms/header/EditorActionsMenu.vue.d.ts +2 -0
- package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -3
- package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -3
- package/dist/src/components/organisms/header/accessibility/AccessibilityToolbar.vue.d.ts +2 -0
- package/dist/src/components/organisms/header/accessibility/ColorVisionSelect.vue.d.ts +2 -0
- package/dist/src/components/organisms/onboarding/EditorTabBarOnboarding.vue.d.ts +2 -0
- package/dist/src/composables/useAccessibilityApi.d.ts +13 -0
- package/dist/src/composables/useActionsApi.d.ts +2 -2
- package/dist/src/composables/useConfig.d.ts +2 -0
- package/dist/src/composables/useCortexBlueprintBridge.d.ts +2 -3
- package/dist/src/composables/useEmailTemplateApplier.d.ts +18 -5
- package/dist/src/extensions/Blocks/Items/constants/cardLayout.d.ts +44 -0
- package/dist/src/extensions/Blocks/Items/enums/productEnums.d.ts +3 -0
- package/dist/src/extensions/Blocks/Items/template.d.ts +19 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +0 -8
- package/dist/src/stores/autosave.d.ts +73 -1
- package/dist/src/stores/config.d.ts +20 -0
- package/dist/src/stores/editor.d.ts +109 -0
- package/dist/src/stores/guido-email-editor.d.ts +20 -10
- package/dist/src/stores/onboarding.d.ts +952 -21
- package/dist/src/stores/version-history.d.ts +1 -1
- package/dist/src/utils/timeUtil.d.ts +5 -0
- package/dist/static/styles/components/accessibility.css.js +234 -0
- package/dist/static/styles/components/version-history.css.js +2 -6
- package/dist/static/styles/variables.css.js +2 -0
- package/dist/stores/autosave.js +12 -7
- package/dist/stores/editor.js +7 -4
- package/dist/stores/guido-email-editor.js +3 -1
- package/dist/stores/onboarding.js +43 -21
- package/dist/utils/pairProductVariables.js +71 -71
- package/dist/utils/timeUtil.js +6 -17
- package/package.json +1 -1
- package/dist/components/organisms/header/AutoSaveToggle.vue.js +0 -22
- package/dist/components/organisms/header/AutoSaveToggle.vue2.js +0 -19
- /package/dist/src/components/organisms/header/{AutoSaveToggle.vue.d.ts → AutoSaveStatus.vue.d.ts} +0 -0
|
@@ -1,72 +1,66 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
1
|
+
var C = Object.defineProperty;
|
|
2
|
+
var p = (g, u, t) => u in g ? C(g, u, { enumerable: !0, configurable: !0, writable: !0, value: t }) : g[u] = t;
|
|
3
|
+
var i = (g, u, t) => p(g, typeof u != "symbol" ? u + "" : u, t);
|
|
4
4
|
import { useConfig as h } from "../../../../../composables/useConfig.js";
|
|
5
|
-
import { ModificationDescription as
|
|
6
|
-
import { CommonControl as
|
|
7
|
-
import { RRS_CONFIG_VERSION as
|
|
8
|
-
import { RECOMMENDATION_ID_ATTR as
|
|
5
|
+
import { ModificationDescription as y } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
6
|
+
import { CommonControl as N } from "../../../common-control.js";
|
|
7
|
+
import { RRS_CONFIG_VERSION as _, DEFAULT_NODE_CONFIG as a } from "../../constants/defaultConfig.js";
|
|
8
|
+
import { RECOMMENDATION_ID_ATTR as I } from "../../constants/selectors.js";
|
|
9
9
|
import { RecommendationConfigService as c } from "../../services/configService.js";
|
|
10
|
-
import { useRecommendationExtensionStore as
|
|
11
|
-
import { registerNodeConfigWriter as
|
|
12
|
-
import { AlgorithmControl as
|
|
13
|
-
import { ALGORITHM_CONTROL_ID as
|
|
14
|
-
import { CurrencyControl as
|
|
15
|
-
import { CURRENCY_CONTROL_ID as
|
|
10
|
+
import { useRecommendationExtensionStore as R } from "../../store/recommendation.js";
|
|
11
|
+
import { registerNodeConfigWriter as b } from "../../utils/nodeConfigWriter.js";
|
|
12
|
+
import { AlgorithmControl as T } from "./algorithm.js";
|
|
13
|
+
import { ALGORITHM_CONTROL_ID as ut } from "./algorithm.js";
|
|
14
|
+
import { CurrencyControl as P } from "./currency.js";
|
|
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
|
-
import { LAYOUT_ORIENTATION_CONTROL_ID as
|
|
20
|
-
import { LocaleControl as
|
|
21
|
-
import { LOCALE_CONTROL_ID as
|
|
22
|
-
import { PricePlacementControl as
|
|
23
|
-
import { PRICE_PLACEMENT_CONTROL_ID as
|
|
19
|
+
import { LAYOUT_ORIENTATION_CONTROL_ID as Ct } from "./layoutOrientation.js";
|
|
20
|
+
import { LocaleControl as L } from "./locale.js";
|
|
21
|
+
import { LOCALE_CONTROL_ID as yt } from "./locale.js";
|
|
22
|
+
import { PricePlacementControl as k } from "./pricePlacement.js";
|
|
23
|
+
import { PRICE_PLACEMENT_CONTROL_ID as _t } from "./pricePlacement.js";
|
|
24
24
|
import { ProductCountControl as E } from "./productCount.js";
|
|
25
|
-
import { PRODUCT_COUNT_CONTROL_ID as
|
|
25
|
+
import { PRODUCT_COUNT_CONTROL_ID as Rt } from "./productCount.js";
|
|
26
26
|
import { ProductLayoutControl as F } from "./productLayout.js";
|
|
27
|
-
import { PRODUCT_LAYOUT_CONTROL_ID as
|
|
27
|
+
import { PRODUCT_LAYOUT_CONTROL_ID as Tt } from "./productLayout.js";
|
|
28
28
|
import { ShuffleControl as D } from "./shuffle.js";
|
|
29
|
-
import { SHUFFLE_CONTROL_ID as
|
|
29
|
+
import { SHUFFLE_CONTROL_ID as St } from "./shuffle.js";
|
|
30
30
|
import { StrategyControl as w } from "./strategy.js";
|
|
31
|
-
import { STRATEGY_CONTROL_ID as
|
|
32
|
-
import { setCurrencyAttributes as
|
|
33
|
-
import { adjustProductsToSize as
|
|
31
|
+
import { STRATEGY_CONTROL_ID as Lt } from "./strategy.js";
|
|
32
|
+
import { setCurrencyAttributes as v, getBlockElement as A, isPartnerManagedBlock as B, updateProductContentInPlace as x, regenerateProductRowsWithStyles as U } from "./utils.js";
|
|
33
|
+
import { adjustProductsToSize as Et, formatProductPrice as Ft, getCardComposition as Dt, getCurrentLayout as wt, getMainContainerTbody as vt, regenerateMobileProductRows as At, updatePricesInPlace as Bt, updateSingleProductContent as xt } from "./utils.js";
|
|
34
34
|
import { useDebounceFn as f } from "../../../../../node_modules/@vueuse/shared/index.js";
|
|
35
|
-
const
|
|
36
|
-
class
|
|
35
|
+
const W = "ui-elements-recommendation-block";
|
|
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
|
-
|
|
46
|
-
// Last configVersion the subscription handled, and whether its products still
|
|
47
|
-
// have to reach the canvas — both read on destroy to finish that work.
|
|
48
|
-
r(this, "seenConfigVersion", 0);
|
|
49
|
-
r(this, "fetchedConfigVersion", 0);
|
|
50
|
-
r(this, "hasUnappliedConfigChange", !1);
|
|
44
|
+
i(this, "pendingNodeConfigWrite", null);
|
|
45
|
+
i(this, "pendingConfigFlushTimer", null);
|
|
51
46
|
// Sub-control instances for lifecycle management
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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);
|
|
63
58
|
/**
|
|
64
59
|
* Debounced product fetch to prevent rapid API calls during config changes
|
|
65
60
|
*/
|
|
66
|
-
|
|
67
|
-
const { configVersion: e } = this.store.$state;
|
|
61
|
+
i(this, "_debouncedFetchProducts", f(async () => {
|
|
68
62
|
try {
|
|
69
|
-
await this.store.fetchRecommendationProducts()
|
|
63
|
+
await this.store.fetchRecommendationProducts();
|
|
70
64
|
} finally {
|
|
71
65
|
this._scheduleConfigFlush();
|
|
72
66
|
}
|
|
@@ -82,29 +76,28 @@ class ae extends y {
|
|
|
82
76
|
* count. The store pads products to the configured size, so in-place only
|
|
83
77
|
* fails when the size actually changed.
|
|
84
78
|
*/
|
|
85
|
-
|
|
86
|
-
const
|
|
79
|
+
i(this, "_debouncedRegenerateWithProducts", f(() => {
|
|
80
|
+
const t = this.store.recommendationProducts;
|
|
87
81
|
if (!this.currentNode || !this.api)
|
|
88
82
|
return;
|
|
89
|
-
|
|
90
|
-
const t = this.api.getDocumentModifier(), o = this._stagePendingNodeConfig(t);
|
|
83
|
+
const e = this.api.getDocumentModifier(), o = this._stagePendingNodeConfig(e);
|
|
91
84
|
if (B(this.currentNode)) {
|
|
92
|
-
o && (
|
|
85
|
+
o && (e.apply(new y("Update recommendation configuration")), this.pendingNodeConfigWrite = null, this._clearConfigFlush());
|
|
93
86
|
return;
|
|
94
87
|
}
|
|
95
|
-
|
|
88
|
+
x({
|
|
96
89
|
currentNode: this.currentNode,
|
|
97
|
-
documentModifier:
|
|
98
|
-
products:
|
|
99
|
-
}) ||
|
|
90
|
+
documentModifier: e,
|
|
91
|
+
products: t
|
|
92
|
+
}) || U({
|
|
100
93
|
currentNode: this.currentNode,
|
|
101
|
-
documentModifier:
|
|
102
|
-
products:
|
|
94
|
+
documentModifier: e,
|
|
95
|
+
products: t
|
|
103
96
|
});
|
|
104
97
|
}, 100));
|
|
105
98
|
}
|
|
106
99
|
getId() {
|
|
107
|
-
return
|
|
100
|
+
return W;
|
|
108
101
|
}
|
|
109
102
|
get _subControls() {
|
|
110
103
|
return [
|
|
@@ -121,15 +114,15 @@ class ae extends y {
|
|
|
121
114
|
];
|
|
122
115
|
}
|
|
123
116
|
getTemplate() {
|
|
124
|
-
var
|
|
125
|
-
return this.rrsEnabled = h().isFeatureEnabled("reusableRecommendationStrategy"), this._subControls.forEach((
|
|
117
|
+
var t;
|
|
118
|
+
return this.rrsEnabled = h().isFeatureEnabled("reusableRecommendationStrategy"), this._subControls.forEach((e) => {
|
|
126
119
|
var o;
|
|
127
|
-
return (o =
|
|
128
|
-
}), this.algorithmControl = new
|
|
129
|
-
|
|
120
|
+
return (o = e == null ? void 0 : e.onDestroy) == null ? void 0 : o.call(e);
|
|
121
|
+
}), this.algorithmControl = new T(), this.localeControl = new L(), this.currencyControl = new P(), this.productCountControl = new E(), this.productLayoutControl = new F(), this.filtersControl = new S(), this.shuffleControl = new D(), this.pricePlacementControl = new k(), this.layoutOrientationControl = new O(), this.strategyControl = this.rrsEnabled ? new w() : null, this._subControls.forEach((e) => {
|
|
122
|
+
e && (e.api = this.api);
|
|
130
123
|
}), `
|
|
131
124
|
<div class="recommendation-controls-container">
|
|
132
|
-
${((
|
|
125
|
+
${((t = this.strategyControl) == null ? void 0 : t.getTemplate()) ?? ""}
|
|
133
126
|
${this.layoutOrientationControl.getTemplate()}
|
|
134
127
|
${this.productCountControl.getTemplate()}
|
|
135
128
|
${this.productLayoutControl.getTemplate()}
|
|
@@ -142,40 +135,39 @@ class ae extends y {
|
|
|
142
135
|
</div>
|
|
143
136
|
`;
|
|
144
137
|
}
|
|
145
|
-
_showControlsForBlock(
|
|
146
|
-
var
|
|
147
|
-
const
|
|
148
|
-
if (!
|
|
138
|
+
_showControlsForBlock(t) {
|
|
139
|
+
var r;
|
|
140
|
+
const e = (r = this.getContainer()) == null ? void 0 : r.querySelector(".recommendation-controls-container");
|
|
141
|
+
if (!e)
|
|
149
142
|
return;
|
|
150
|
-
const o = this._getRecommendationIdFromNode(
|
|
151
|
-
|
|
143
|
+
const o = this._getRecommendationIdFromNode(t) === null ? null : c.getConfig(t), n = this.rrsEnabled && !!o && (!!(o != null && o.strategyId) || ((o == null ? void 0 : o.configVersion) ?? 0) >= _), s = this.rrsEnabled && !!o && !n;
|
|
144
|
+
e.classList.toggle("strategy-block", n), e.classList.toggle("legacy-strategy-block", s);
|
|
152
145
|
}
|
|
153
146
|
async onRender() {
|
|
154
147
|
var o;
|
|
155
|
-
|
|
156
|
-
const
|
|
157
|
-
if (
|
|
148
|
+
b(this.api);
|
|
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), 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)) {
|
|
158
151
|
this._initializeSubControls();
|
|
159
152
|
return;
|
|
160
153
|
}
|
|
161
|
-
await this._fetchBlockData(
|
|
154
|
+
await this._fetchBlockData(e), this._initializeSubControls();
|
|
162
155
|
}
|
|
163
|
-
onTemplateNodeUpdated(
|
|
156
|
+
onTemplateNodeUpdated(t) {
|
|
164
157
|
var o;
|
|
165
|
-
super.onTemplateNodeUpdated(
|
|
166
|
-
const
|
|
167
|
-
|
|
158
|
+
super.onTemplateNodeUpdated(t);
|
|
159
|
+
const e = this._getRecommendationIdFromNode(t);
|
|
160
|
+
e !== null && e !== this.store.currentRecommendationId && this.store.setCurrentBlock(e), e !== null && this._syncNodeConfigIfChanged(e), this._showControlsForBlock(t), e !== null && !((o = this.store.blockStates[e]) != null && o.isInitialized) && this._fetchBlockData(e).then(() => {
|
|
168
161
|
this._initializeSubControls();
|
|
169
162
|
}), this._subControls.forEach((n) => {
|
|
170
163
|
var s;
|
|
171
|
-
n != null && n.api && (n.currentNode =
|
|
164
|
+
n != null && n.api && (n.currentNode = t, (s = n.onTemplateNodeUpdated) == null || s.call(n, t));
|
|
172
165
|
});
|
|
173
166
|
}
|
|
174
167
|
onDestroy() {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
return (o = t == null ? void 0 : t.onDestroy) == null ? void 0 : o.call(t);
|
|
168
|
+
this.storeUnsubscription(), this._flushPendingNodeConfig(), this._subControls.forEach((t) => {
|
|
169
|
+
var e;
|
|
170
|
+
return (e = t == null ? void 0 : t.onDestroy) == null ? void 0 : e.call(t);
|
|
179
171
|
});
|
|
180
172
|
}
|
|
181
173
|
/**
|
|
@@ -183,9 +175,9 @@ class ae extends y {
|
|
|
183
175
|
* Each sub-control manages its own form values and event listeners
|
|
184
176
|
*/
|
|
185
177
|
_initializeSubControls() {
|
|
186
|
-
this._subControls.forEach((
|
|
187
|
-
var
|
|
188
|
-
|
|
178
|
+
this._subControls.forEach((t) => {
|
|
179
|
+
var e;
|
|
180
|
+
t && (t.api = this.api, t.currentNode = this.currentNode, (e = t.onRender) == null || e.call(t));
|
|
189
181
|
});
|
|
190
182
|
}
|
|
191
183
|
/**
|
|
@@ -212,34 +204,34 @@ class ae extends y {
|
|
|
212
204
|
* that state and made a re-dropped saved module keep the defaults its wiped
|
|
213
205
|
* state was rebuilt with (SD-150347).
|
|
214
206
|
*/
|
|
215
|
-
_syncNodeConfigIfChanged(
|
|
216
|
-
this.pendingNodeConfigWrite && this.pendingNodeConfigWrite.blockId !==
|
|
217
|
-
const
|
|
218
|
-
if (!
|
|
207
|
+
_syncNodeConfigIfChanged(t) {
|
|
208
|
+
this.pendingNodeConfigWrite && this.pendingNodeConfigWrite.blockId !== t && this._flushPendingNodeConfig();
|
|
209
|
+
const e = this.store.blockStates[t];
|
|
210
|
+
if (!e)
|
|
219
211
|
return;
|
|
220
|
-
const o = JSON.stringify(c.getConfig(this.currentNode)), n =
|
|
221
|
-
|
|
212
|
+
const o = JSON.stringify(c.getConfig(this.currentNode)), n = e.syncedConfigFingerprint;
|
|
213
|
+
e.syncedConfigFingerprint = o, n !== o && (this.pendingNodeConfigWrite || this._syncNodeConfigToStore());
|
|
222
214
|
}
|
|
223
215
|
/** Whether the deferred write would move the node's strategyId — see the caller (SD-149916). */
|
|
224
216
|
_isPendingStrategyIdChange() {
|
|
225
|
-
const
|
|
226
|
-
return
|
|
217
|
+
const t = this.pendingNodeConfigWrite;
|
|
218
|
+
return t ? c.getConfig(this.currentNode).strategyId !== t.updates.strategyId : !1;
|
|
227
219
|
}
|
|
228
220
|
_capturePendingNodeConfigWrite() {
|
|
229
|
-
const
|
|
230
|
-
if (!this.currentNode || !this.api ||
|
|
221
|
+
const t = this.store.currentRecommendationId;
|
|
222
|
+
if (!this.currentNode || !this.api || t === null)
|
|
231
223
|
return;
|
|
232
|
-
const { filters:
|
|
224
|
+
const { filters: e, strategy: o, strategyId: n, size: s, nodeConfigVersion: r } = this.store.recommendationConfigs, { partnerName: l } = h();
|
|
233
225
|
this.pendingNodeConfigWrite = {
|
|
234
|
-
blockId:
|
|
226
|
+
blockId: t,
|
|
235
227
|
node: this.currentNode,
|
|
236
228
|
updates: {
|
|
237
|
-
filters:
|
|
229
|
+
filters: e,
|
|
238
230
|
strategy: o,
|
|
239
231
|
strategyId: n,
|
|
240
232
|
size: s,
|
|
241
|
-
configVersion:
|
|
242
|
-
...
|
|
233
|
+
configVersion: r,
|
|
234
|
+
...l.value ? { partnerName: l.value } : {}
|
|
243
235
|
}
|
|
244
236
|
};
|
|
245
237
|
}
|
|
@@ -253,9 +245,9 @@ class ae extends y {
|
|
|
253
245
|
* @param documentModifier - The batch to accumulate into
|
|
254
246
|
* @returns Whether anything was staged
|
|
255
247
|
*/
|
|
256
|
-
_stagePendingNodeConfig(
|
|
257
|
-
const
|
|
258
|
-
return !
|
|
248
|
+
_stagePendingNodeConfig(t) {
|
|
249
|
+
const e = this.pendingNodeConfigWrite;
|
|
250
|
+
return !e || !this.currentNode ? !1 : (c.stageConfig(t, this.currentNode, e.updates), !0);
|
|
259
251
|
}
|
|
260
252
|
/**
|
|
261
253
|
* Arms the guaranteed fallback write, once the product fetch has settled. The
|
|
@@ -276,41 +268,41 @@ class ae extends y {
|
|
|
276
268
|
* snapshot the intervening re-render staled, and saveConfig swallows that failure.
|
|
277
269
|
*/
|
|
278
270
|
_flushPendingNodeConfig() {
|
|
279
|
-
const
|
|
280
|
-
if (this.pendingNodeConfigWrite = null, this._clearConfigFlush(), !
|
|
271
|
+
const t = this.pendingNodeConfigWrite;
|
|
272
|
+
if (this.pendingNodeConfigWrite = null, this._clearConfigFlush(), !t || !this.api)
|
|
281
273
|
return;
|
|
282
|
-
const
|
|
283
|
-
JSON.stringify(o.filters) === JSON.stringify(
|
|
274
|
+
const e = t.blockId === this.store.currentRecommendationId && this.currentNode ? this.currentNode : t.node, o = c.getConfig(e);
|
|
275
|
+
JSON.stringify(o.filters) === JSON.stringify(t.updates.filters) && o.strategy === t.updates.strategy && o.strategyId === t.updates.strategyId && o.size === t.updates.size || c.updateConfig(this.api, e, t.updates, "Update recommendation filters");
|
|
284
276
|
}
|
|
285
277
|
_syncNodeConfigToStore() {
|
|
286
278
|
var n;
|
|
287
|
-
const
|
|
279
|
+
const t = c.getConfig(this.currentNode), e = this.store.currentRecommendationId, o = e !== null && ((n = this.store.blockStates[e]) == null ? void 0 : n.isInitialized);
|
|
288
280
|
this.store.patchCurrentBlockConfig({
|
|
289
|
-
strategy:
|
|
290
|
-
strategyId:
|
|
291
|
-
nodeConfigVersion:
|
|
292
|
-
language:
|
|
293
|
-
size:
|
|
294
|
-
productIds:
|
|
295
|
-
cardsInRow:
|
|
296
|
-
mobileCardsInRow:
|
|
297
|
-
mobileLayoutEnabled:
|
|
298
|
-
orientation:
|
|
281
|
+
strategy: t.strategy,
|
|
282
|
+
strategyId: t.strategyId,
|
|
283
|
+
nodeConfigVersion: t.configVersion,
|
|
284
|
+
language: t.language,
|
|
285
|
+
size: t.size,
|
|
286
|
+
productIds: t.productIds,
|
|
287
|
+
cardsInRow: t.cardsInRow,
|
|
288
|
+
mobileCardsInRow: t.mobileCardsInRow,
|
|
289
|
+
mobileLayoutEnabled: t.mobileLayoutEnabled,
|
|
290
|
+
orientation: t.layout,
|
|
299
291
|
// Only sync filters from node config during initial load.
|
|
300
292
|
// After initialization, the Pinia store is the source of truth
|
|
301
293
|
// for filters (edited via the filter drawer).
|
|
302
|
-
...o ? {} : { filters:
|
|
303
|
-
shuffleProducts:
|
|
304
|
-
priceMovedToNextLine:
|
|
305
|
-
priceHideIfSameAsDiscounted:
|
|
294
|
+
...o ? {} : { filters: t.filters },
|
|
295
|
+
shuffleProducts: t.shuffleProducts,
|
|
296
|
+
priceMovedToNextLine: t.priceMovedToNextLine,
|
|
297
|
+
priceHideIfSameAsDiscounted: t.priceHideIfSameAsDiscounted,
|
|
306
298
|
currencySettings: {
|
|
307
|
-
name:
|
|
308
|
-
value:
|
|
309
|
-
symbol:
|
|
310
|
-
alignment:
|
|
311
|
-
decimalCount:
|
|
312
|
-
decimalSeparator:
|
|
313
|
-
thousandSeparator:
|
|
299
|
+
name: t.currency.code,
|
|
300
|
+
value: t.currency.code,
|
|
301
|
+
symbol: t.currency.symbol,
|
|
302
|
+
alignment: t.currency.alignment === "before" ? "0" : "1",
|
|
303
|
+
decimalCount: t.currency.decimalCount.toString(),
|
|
304
|
+
decimalSeparator: t.currency.decimalSeparator,
|
|
305
|
+
thousandSeparator: t.currency.thousandSeparator
|
|
314
306
|
}
|
|
315
307
|
}, { triggerRefetch: !1 });
|
|
316
308
|
}
|
|
@@ -323,8 +315,8 @@ class ae extends y {
|
|
|
323
315
|
* Shared by onRender() and onTemplateNodeUpdated() to avoid duplication.
|
|
324
316
|
* Marks the block as initialized to prevent redundant fetches on re-selection.
|
|
325
317
|
*/
|
|
326
|
-
async _fetchBlockData(
|
|
327
|
-
|
|
318
|
+
async _fetchBlockData(t) {
|
|
319
|
+
t !== null && this.store.markBlockInitialized(t), (await Promise.allSettled([
|
|
328
320
|
this.store.fetchRecommendationCreateData(),
|
|
329
321
|
this.store.fetchRecommendationFilters()
|
|
330
322
|
])).forEach((o, n) => {
|
|
@@ -349,39 +341,39 @@ class ae extends y {
|
|
|
349
341
|
_applySmartDefaults() {
|
|
350
342
|
if (!this.currentNode || !this.api)
|
|
351
343
|
return;
|
|
352
|
-
const
|
|
344
|
+
const t = c.getConfig(this.currentNode), e = {};
|
|
353
345
|
let o = null, n = null, s = null;
|
|
354
|
-
if (
|
|
355
|
-
const { currencyList:
|
|
356
|
-
|
|
357
|
-
(
|
|
358
|
-
) || (o =
|
|
346
|
+
if (t.currency.code === a.currency.code) {
|
|
347
|
+
const { currencyList: r } = this.store;
|
|
348
|
+
r.length > 0 && (r.some(
|
|
349
|
+
(d) => d.value === `price.${a.currency.code}`
|
|
350
|
+
) || (o = r[0].value.replace("price.", ""), e.currency = {
|
|
359
351
|
...a.currency,
|
|
360
352
|
code: o,
|
|
361
353
|
symbol: o
|
|
362
354
|
}));
|
|
363
355
|
}
|
|
364
|
-
if (
|
|
365
|
-
const
|
|
366
|
-
|
|
367
|
-
(
|
|
368
|
-
) || (n =
|
|
356
|
+
if (t.strategy === a.strategy) {
|
|
357
|
+
const r = this.store.getActivePredictiveAlgorithms;
|
|
358
|
+
r.length > 0 && (r.some(
|
|
359
|
+
(d) => d.value === a.strategy
|
|
360
|
+
) || (n = r[0].value, e.strategy = n));
|
|
369
361
|
}
|
|
370
|
-
if (
|
|
371
|
-
const
|
|
372
|
-
|
|
373
|
-
(
|
|
374
|
-
) || (s =
|
|
362
|
+
if (t.language === a.language) {
|
|
363
|
+
const r = this.store.getLanguages;
|
|
364
|
+
r.length > 0 && (r.some(
|
|
365
|
+
(d) => d.value === a.language
|
|
366
|
+
) || (s = r[0].value, e.language = s));
|
|
375
367
|
}
|
|
376
368
|
!o && !n && !s || (c.updateConfig(
|
|
377
369
|
this.api,
|
|
378
370
|
this.currentNode,
|
|
379
|
-
|
|
371
|
+
e,
|
|
380
372
|
"Applied smart defaults"
|
|
381
|
-
), o &&
|
|
373
|
+
), o && e.currency && v({
|
|
382
374
|
currentNode: this.currentNode,
|
|
383
375
|
documentModifier: this.api.getDocumentModifier(),
|
|
384
|
-
currency:
|
|
376
|
+
currency: e.currency
|
|
385
377
|
}), this.store.patchCurrentBlockConfig({
|
|
386
378
|
...o ? {
|
|
387
379
|
currencySettings: {
|
|
@@ -401,45 +393,16 @@ class ae extends y {
|
|
|
401
393
|
/**
|
|
402
394
|
* Reads the recommendation-id attribute from the block element within the node
|
|
403
395
|
*/
|
|
404
|
-
_getRecommendationIdFromNode(
|
|
405
|
-
const
|
|
406
|
-
if (!
|
|
396
|
+
_getRecommendationIdFromNode(t) {
|
|
397
|
+
const e = A(t);
|
|
398
|
+
if (!e || !("getAttribute" in e))
|
|
407
399
|
return null;
|
|
408
|
-
const o =
|
|
400
|
+
const o = e.getAttribute(I);
|
|
409
401
|
if (!o)
|
|
410
402
|
return null;
|
|
411
403
|
const n = parseInt(o);
|
|
412
404
|
return Number.isNaN(n) ? null : n;
|
|
413
405
|
}
|
|
414
|
-
/**
|
|
415
|
-
* Fetches and renders the block's products without the panel, carrying the
|
|
416
|
-
* deferred config write so both still land as one undo entry.
|
|
417
|
-
*/
|
|
418
|
-
async _refreshProductsOutsidePanel() {
|
|
419
|
-
const e = this.store.currentRecommendationId;
|
|
420
|
-
if (e === null)
|
|
421
|
-
return;
|
|
422
|
-
this.hasUnappliedConfigChange = !1, this.pendingNodeConfigWrite || this._capturePendingNodeConfigWrite();
|
|
423
|
-
const t = this.pendingNodeConfigWrite, o = (t == null ? void 0 : t.blockId) === e ? t.updates : {};
|
|
424
|
-
try {
|
|
425
|
-
await this.store.fetchRecommendationProducts();
|
|
426
|
-
} catch (s) {
|
|
427
|
-
console.warn("Recommendation block: fetchRecommendationProducts failed", s);
|
|
428
|
-
}
|
|
429
|
-
const n = this.store.blockStates[e];
|
|
430
|
-
if (n) {
|
|
431
|
-
if (b(
|
|
432
|
-
e,
|
|
433
|
-
o,
|
|
434
|
-
n.recommendationProducts,
|
|
435
|
-
"Update recommendation configuration"
|
|
436
|
-
)) {
|
|
437
|
-
this.pendingNodeConfigWrite = null, this._clearConfigFlush();
|
|
438
|
-
return;
|
|
439
|
-
}
|
|
440
|
-
this._flushPendingNodeConfig();
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
406
|
/**
|
|
444
407
|
* Listen to store changes that require product refresh or regeneration.
|
|
445
408
|
*
|
|
@@ -454,55 +417,55 @@ class ae extends y {
|
|
|
454
417
|
* We skip that tick and update tracking references instead.
|
|
455
418
|
*/
|
|
456
419
|
_listenStateUpdates() {
|
|
457
|
-
const { store:
|
|
458
|
-
let
|
|
459
|
-
this.
|
|
460
|
-
const
|
|
461
|
-
if (
|
|
462
|
-
|
|
420
|
+
const { store: t } = this;
|
|
421
|
+
let e = t.recommendationProducts, o = t.$state.configVersion, n = t.currentRecommendationId;
|
|
422
|
+
this.storeUnsubscription = t.$subscribe(() => {
|
|
423
|
+
const s = t.currentRecommendationId;
|
|
424
|
+
if (s !== n) {
|
|
425
|
+
n = s, e = t.recommendationProducts, o = t.$state.configVersion;
|
|
463
426
|
return;
|
|
464
427
|
}
|
|
465
|
-
const
|
|
466
|
-
|
|
467
|
-
const
|
|
468
|
-
d &&
|
|
428
|
+
const r = t.$state.configVersion;
|
|
429
|
+
r !== o && (o = r, this._capturePendingNodeConfigWrite(), this._isPendingStrategyIdChange() && this._flushPendingNodeConfig(), this._debouncedFetchProducts());
|
|
430
|
+
const l = t.recommendationProducts, d = l !== e, m = Array.isArray(l) && l.length > 0;
|
|
431
|
+
d && m && (e = l, this._debouncedRegenerateWithProducts());
|
|
469
432
|
});
|
|
470
433
|
}
|
|
471
434
|
}
|
|
472
435
|
export {
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
436
|
+
ut as ALGORITHM_CONTROL_ID,
|
|
437
|
+
T as AlgorithmControl,
|
|
438
|
+
W as CONTROL_BLOCK_ID,
|
|
439
|
+
gt as CURRENCY_CONTROL_ID,
|
|
440
|
+
P as CurrencyControl,
|
|
441
|
+
ft as FILTERS_CONTROL_ID,
|
|
479
442
|
S as FiltersControl,
|
|
480
|
-
|
|
481
|
-
|
|
443
|
+
Ct as LAYOUT_ORIENTATION_CONTROL_ID,
|
|
444
|
+
yt as LOCALE_CONTROL_ID,
|
|
482
445
|
O as LayoutOrientationControl,
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
446
|
+
L as LocaleControl,
|
|
447
|
+
_t as PRICE_PLACEMENT_CONTROL_ID,
|
|
448
|
+
Rt as PRODUCT_COUNT_CONTROL_ID,
|
|
449
|
+
Tt as PRODUCT_LAYOUT_CONTROL_ID,
|
|
450
|
+
k as PricePlacementControl,
|
|
488
451
|
E as ProductCountControl,
|
|
489
452
|
F as ProductLayoutControl,
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
453
|
+
at as RecommendationBlockControl,
|
|
454
|
+
St as SHUFFLE_CONTROL_ID,
|
|
455
|
+
Lt as STRATEGY_CONTROL_ID,
|
|
493
456
|
D as ShuffleControl,
|
|
494
457
|
w as StrategyControl,
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
458
|
+
Et as adjustProductsToSize,
|
|
459
|
+
Ft as formatProductPrice,
|
|
460
|
+
A as getBlockElement,
|
|
461
|
+
Dt as getCardComposition,
|
|
462
|
+
wt as getCurrentLayout,
|
|
463
|
+
vt as getMainContainerTbody,
|
|
501
464
|
B as isPartnerManagedBlock,
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
465
|
+
At as regenerateMobileProductRows,
|
|
466
|
+
U as regenerateProductRowsWithStyles,
|
|
467
|
+
v as setCurrencyAttributes,
|
|
468
|
+
Bt as updatePricesInPlace,
|
|
469
|
+
x as updateProductContentInPlace,
|
|
470
|
+
xt as updateSingleProductContent
|
|
508
471
|
};
|
package/dist/guido.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@charset "UTF-8";.auth-error-modal[data-v-b4d7ae51]{position:relative;z-index:145}.gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-
|
|
1
|
+
@charset "UTF-8";.auth-error-modal[data-v-b4d7ae51]{position:relative;z-index:145}.gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-15610de9] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.color-vision-select__dropdown[data-v-64cb50da]{z-index:20;width:387px}.accessibility-toolbar[data-v-391019bc]{gap:16px}.accessibility-toolbar[data-v-391019bc] .in-segments-wrapper__button svg{margin-right:0}.accessibility-toolbar[data-v-391019bc] .in-segments-wrapper__button .clearfix:after{content:none}.view-options-wrapper[data-v-87033101]{position:relative;display:inline-block}.new-tag[data-v-87033101]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-87033101] .guido__view-option-selection-desktop svg,[data-v-87033101] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-87033101] .in-segments-wrapper__button_selected,[data-v-87033101] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-87033101] .in-tooltip-wrapper-v2__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-fad98586]{gap:8px}.version-history__toolbar[data-v-fad98586]{gap:4px}.view-options-wrapper[data-v-6ebabfe4]{position:relative;display:inline-block}.new-tag[data-v-6ebabfe4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-6ebabfe4] .guido__verion-history-view-option-selection-desktop svg,[data-v-6ebabfe4] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-6ebabfe4] .in-segments-wrapper__button_selected,[data-v-6ebabfe4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-6ebabfe4] .in-tooltip-wrapper-v2__icon{cursor:pointer}.editor-actions-menu__dropdown[data-v-d0e6b57a]{z-index:20;width:222px}.editor-actions[data-v-23b54db0]{gap:16px}.editor-actions__divider[data-v-23b54db0]{width:1px;height:40px;background-color:#e1e1e1}.right-slot[data-v-efc32e0d]{gap:16px}.header-wrapper[data-v-3c713746]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-ecfaf815]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-ecfaf815]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-ecfaf815]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-91a26acd]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-91a26acd]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-91a26acd]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-91a26acd]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-91a26acd]{object-fit:cover;transform:scale(1)}[data-v-b9a93c6e] .guido__verion-history-view-option-selection-desktop svg,[data-v-b9a93c6e] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-b9a93c6e] .in-segments-wrapper__button_selected,[data-v-b9a93c6e] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-cf946232]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-cf946232]{min-height:504px}.iframe-wrapper[data-v-f255b2bb]{width:258px}.iframe-scaled[data-v-f255b2bb]{width:320px;height:124.0310077519%;transform:scale(.80625);transform-origin:top left}.cropped-text[data-v-eb3d05d7]{width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-preview-wrapper__phone[data-v-3f472f96]{width:282px}.mobile-preview-wrapper__phone img[data-v-3f472f96]{object-fit:cover;border-radius:44px}.mobile-preview-wrapper__content[data-v-3f472f96]{width:258px;height:450px;left:12px}[data-v-6bcaca8a] .vueperslides__parallax-wrapper{padding-bottom:110px!important}.guido-tab-bar-onboarding[data-v-42f02a1f]{z-index:21}[data-v-f16f20f8] .vueperslides__bullets{pointer-events:none!important}[data-v-f16f20f8] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-bb3cca55] .vueperslides__bullets{pointer-events:none!important}[data-v-bb3cca55] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-19d8cb42] .vueperslides__bullets,[data-v-ec2027ff] .vueperslides__bullets,[data-v-b09e80c4] .vueperslides__bullets{pointer-events:none!important}[data-v-b09e80c4] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-9bdef600] .vueperslides__parallax-wrapper{padding-bottom:110px!important}.assign-strategy-drawer-content .assign-strategy-select[data-v-6ce48dfd]{width:100%;max-width:none}.assign-strategy-drawer-content .assign-strategy-select[data-v-6ce48dfd] .in-skeleton{width:100%!important}.assign-strategy-drawer-content .assign-strategy-select[data-v-6ce48dfd] .in-dropdown-box__container{width:413px}.assign-strategy-drawer .spaced-dot-sep{background-image:linear-gradient(90deg,#91949f 20%,#fff0 0);background-position:center bottom;background-repeat:repeat-x;background-size:5px 1px}.assign-strategy-drawer .spaced-dot-sep--top{background-position:center top}.assign-strategy-drawer .spaced-dot-sep--fc-n:first-child{background:none}.legacy-strategy-updated-modal[data-v-da2225a1]{position:relative;z-index:145}
|