@useinsider/guido 3.17.0-beta.dc7f4d2 → 3.17.0-beta.e6704da
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 +1 -0
- package/dist/@types/config/schemas.js +12 -6
- package/dist/components/Guido.vue.js +5 -5
- package/dist/components/Guido.vue2.js +77 -77
- package/dist/components/organisms/AutoSaveController.vue2.js +8 -9
- package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.js +18 -0
- package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue2.js +70 -0
- package/dist/components/organisms/extensions/recommendation/StrategyInfoBox.vue.js +20 -0
- package/dist/components/organisms/extensions/recommendation/StrategyInfoBox.vue2.js +55 -0
- package/dist/components/organisms/header/EditorActions.vue.js +2 -2
- package/dist/components/organisms/header/EditorActions.vue2.js +43 -74
- package/dist/components/organisms/header/LeftSlot.vue.js +5 -5
- package/dist/components/organisms/header/LeftSlot.vue2.js +23 -46
- package/dist/components/wrappers/WpDrawer.vue.js +7 -9
- package/dist/components/wrappers/WpDrawer.vue2.js +1 -1
- package/dist/composables/useCustomInterfaceAppearance.js +19 -16
- package/dist/composables/useHtmlCompiler.js +26 -37
- package/dist/composables/useHtmlValidator.js +0 -2
- package/dist/composables/useRecommendation.js +41 -34
- package/dist/composables/useSave.js +41 -84
- package/dist/composables/validators/useCouponBlockValidator.js +21 -24
- package/dist/composables/validators/useUnsubscribeBlockValidator.js +27 -34
- package/dist/config/migrator/recommendationMigrator.js +6 -4
- package/dist/enums/academy.js +2 -1
- package/dist/enums/date.js +4 -3
- package/dist/enums/extensions/recommendationBlock.js +25 -23
- package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +13 -11
- package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +96 -95
- package/dist/extensions/Blocks/Recommendation/controls/main/index.js +156 -154
- package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +141 -0
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +223 -82
- package/dist/extensions/Blocks/common-control.js +22 -19
- package/dist/guido.css +1 -1
- package/dist/services/recommendationApi.js +78 -29
- package/dist/src/@types/config/schemas.d.ts +12 -0
- package/dist/src/components/Guido.vue.d.ts +1 -17
- package/dist/src/components/organisms/{validation/ValidationErrorDrawer.vue.d.ts → extensions/recommendation/AssignStrategyDrawer.vue.d.ts} +1 -0
- package/dist/src/components/organisms/extensions/recommendation/StrategyInfoBox.vue.d.ts +24 -0
- package/dist/src/components/organisms/header/EditorActions.vue.d.ts +1 -17
- package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -17
- package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -17
- package/dist/src/components/wrappers/WpDrawer.vue.d.ts +3 -4
- package/dist/src/composables/useConfig.d.ts +2 -0
- package/dist/src/composables/useHtmlValidator.d.ts +0 -21
- package/dist/src/composables/useRecommendation.d.ts +1 -0
- package/dist/src/composables/useSave.d.ts +1 -6
- package/dist/src/composables/validators/useCouponBlockValidator.d.ts +0 -3
- package/dist/src/composables/validators/useUnsubscribeBlockValidator.d.ts +0 -10
- package/dist/src/enums/academy.d.ts +1 -0
- package/dist/src/enums/extensions/recommendationBlock.d.ts +2 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +14 -3
- package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +29 -0
- package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +214 -15
- package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +6 -0
- package/dist/src/extensions/Blocks/common-control.d.ts +4 -1
- package/dist/src/mock/api/recommendation-strategies.d.ts +43 -0
- package/dist/src/services/recommendationApi.d.ts +4 -1
- package/dist/src/stores/config.d.ts +18 -5
- package/dist/src/utils/templatePreparation.d.ts +0 -30
- package/dist/static/styles/components/recommendation-strategy.css.js +171 -0
- package/dist/stores/config.js +6 -13
- package/dist/utils/dateUtil.js +23 -10
- package/dist/utils/templatePreparation.js +50 -50
- package/package.json +2 -1
- package/dist/components/organisms/validation/ValidationErrorDrawer.vue.js +0 -20
- package/dist/components/organisms/validation/ValidationErrorDrawer.vue2.js +0 -48
- package/dist/composables/useSaveValidation.js +0 -279
- package/dist/composables/useSaveValidationRollout.js +0 -9
- package/dist/enums/save-validation.js +0 -4
- package/dist/src/@types/save-validation.d.ts +0 -19
- package/dist/src/composables/useSaveValidation.d.ts +0 -6
- package/dist/src/composables/useSaveValidationRollout.d.ts +0 -3
- package/dist/src/enums/save-validation.d.ts +0 -27
- package/dist/src/stores/save-validation.d.ts +0 -22
- package/dist/stores/save-validation.js +0 -30
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { getRecommendationFeedSourceMaps as
|
|
2
|
-
import { useRecommendationApi as
|
|
3
|
-
import { useConfigStore as
|
|
4
|
-
import { defineStore as
|
|
1
|
+
import { getRecommendationFeedSourceMaps as p, getOperatorOptions as R, PriceAttributes as C } from "../../../../enums/extensions/recommendationBlock.js";
|
|
2
|
+
import { useRecommendationApi as w } from "../../../../services/recommendationApi.js";
|
|
3
|
+
import { useConfigStore as G } from "../../../../stores/config.js";
|
|
4
|
+
import { defineStore as P } from "pinia";
|
|
5
5
|
import "../constants/selectors.js";
|
|
6
|
-
import { DEFAULT_MOBILE_CARDS_IN_ROW as D, DEFAULT_CARDS_IN_ROW as
|
|
7
|
-
import { EXCLUDED_ALGORITHM_IDS as
|
|
8
|
-
import { getDefaultProducts as
|
|
6
|
+
import { DEFAULT_MOBILE_CARDS_IN_ROW as D, DEFAULT_CARDS_IN_ROW as F } from "../constants/layout.js";
|
|
7
|
+
import { DEFAULT_NODE_CONFIG as v, EXCLUDED_ALGORITHM_IDS as _ } from "../constants/defaultConfig.js";
|
|
8
|
+
import { getDefaultProducts as y } from "../templates/utils.js";
|
|
9
9
|
import { generateCompleteFilterQuery as b } from "../utils/filterUtil.js";
|
|
10
|
-
import { getPartnerRecommendationParams as
|
|
11
|
-
import { sanitizeProductIds as
|
|
10
|
+
import { getPartnerRecommendationParams as U } from "../utils/partnerCustomizations.js";
|
|
11
|
+
import { sanitizeProductIds as N } from "../utils/productIds.js";
|
|
12
12
|
import { isFilterValid as L } from "../validation/filterSchema.js";
|
|
13
|
-
import { isConfigValid as
|
|
14
|
-
const
|
|
15
|
-
let
|
|
16
|
-
function
|
|
13
|
+
import { isConfigValid as x } from "../validation/requiredFields.js";
|
|
14
|
+
const u = w();
|
|
15
|
+
let d = null, f = null, h = null, g = null;
|
|
16
|
+
function k() {
|
|
17
17
|
return {
|
|
18
|
-
cardsInRow:
|
|
18
|
+
cardsInRow: F,
|
|
19
19
|
currencySettings: {
|
|
20
20
|
name: "USD",
|
|
21
21
|
value: "USD",
|
|
@@ -36,6 +36,7 @@ function R() {
|
|
|
36
36
|
sendProductRequestFlag: !1,
|
|
37
37
|
shuffleProducts: !1,
|
|
38
38
|
strategy: "mostPopular",
|
|
39
|
+
strategyId: "",
|
|
39
40
|
textTrimming: !0,
|
|
40
41
|
unresponsive: !1,
|
|
41
42
|
size: "6",
|
|
@@ -44,28 +45,32 @@ function R() {
|
|
|
44
45
|
priceHideIfSameAsDiscounted: !1
|
|
45
46
|
};
|
|
46
47
|
}
|
|
47
|
-
function
|
|
48
|
+
function I() {
|
|
48
49
|
return {
|
|
49
|
-
recommendationConfigs:
|
|
50
|
+
recommendationConfigs: k(),
|
|
50
51
|
recommendationProducts: [],
|
|
51
52
|
filterStatus: !1,
|
|
52
53
|
filterSelectionDrawerStatus: !1,
|
|
54
|
+
assignStrategyDrawerStatus: !1,
|
|
53
55
|
filterGroup: 1,
|
|
54
56
|
isInitialized: !1,
|
|
55
57
|
filterSnapshot: null
|
|
56
58
|
};
|
|
57
59
|
}
|
|
58
|
-
const
|
|
60
|
+
const A = () => ({
|
|
59
61
|
recommendationCampaignUrls: {},
|
|
60
62
|
activePredictiveAlgorithms: [],
|
|
61
63
|
languages: {},
|
|
62
64
|
currencyList: [],
|
|
63
65
|
filterList: {},
|
|
66
|
+
strategies: [],
|
|
67
|
+
strategiesLoading: !1,
|
|
68
|
+
strategyUrlTemplates: {},
|
|
64
69
|
blockStates: {},
|
|
65
70
|
currentRecommendationId: null,
|
|
66
71
|
configVersion: 0
|
|
67
|
-
}),
|
|
68
|
-
state: () =>
|
|
72
|
+
}), J = P("guidoRecommendationExtension", {
|
|
73
|
+
state: () => A(),
|
|
69
74
|
getters: {
|
|
70
75
|
// ====================================================================
|
|
71
76
|
// Proxy Getters — Backward Compatible Access to Current Block State
|
|
@@ -75,7 +80,7 @@ const U = () => ({
|
|
|
75
80
|
* This allows all existing code that reads `store.recommendationConfigs` to work unchanged.
|
|
76
81
|
*/
|
|
77
82
|
recommendationConfigs(t) {
|
|
78
|
-
return t.currentRecommendationId !== null && t.blockStates[t.currentRecommendationId] ? t.blockStates[t.currentRecommendationId].recommendationConfigs :
|
|
83
|
+
return t.currentRecommendationId !== null && t.blockStates[t.currentRecommendationId] ? t.blockStates[t.currentRecommendationId].recommendationConfigs : k();
|
|
79
84
|
},
|
|
80
85
|
/**
|
|
81
86
|
* Proxy getter: delegates to blockStates[currentRecommendationId].recommendationProducts
|
|
@@ -89,6 +94,20 @@ const U = () => ({
|
|
|
89
94
|
filterSelectionDrawerStatus(t) {
|
|
90
95
|
return t.currentRecommendationId !== null && t.blockStates[t.currentRecommendationId] ? t.blockStates[t.currentRecommendationId].filterSelectionDrawerStatus : !1;
|
|
91
96
|
},
|
|
97
|
+
/**
|
|
98
|
+
* Proxy getter: delegates to blockStates[currentRecommendationId].assignStrategyDrawerStatus
|
|
99
|
+
*/
|
|
100
|
+
assignStrategyDrawerStatus(t) {
|
|
101
|
+
return t.currentRecommendationId !== null && t.blockStates[t.currentRecommendationId] ? t.blockStates[t.currentRecommendationId].assignStrategyDrawerStatus : !1;
|
|
102
|
+
},
|
|
103
|
+
/**
|
|
104
|
+
* The current block's assigned strategy record from the listing,
|
|
105
|
+
* or null when nothing is assigned / the strategy is no longer listed.
|
|
106
|
+
*/
|
|
107
|
+
assignedStrategy(t) {
|
|
108
|
+
const { strategyId: e } = this.recommendationConfigs;
|
|
109
|
+
return e ? t.strategies.find((r) => String(r.strategy_id) === e) ?? null : null;
|
|
110
|
+
},
|
|
92
111
|
/**
|
|
93
112
|
* Proxy getter: delegates to blockStates[currentRecommendationId].filterStatus
|
|
94
113
|
*/
|
|
@@ -120,9 +139,9 @@ const U = () => ({
|
|
|
120
139
|
return [...new Set(t.map((e) => e.filterGroup))].sort((e, r) => e - r);
|
|
121
140
|
},
|
|
122
141
|
getActivePredictiveAlgorithms: (t) => {
|
|
123
|
-
const e =
|
|
124
|
-
return t.activePredictiveAlgorithms.filter((n) => !
|
|
125
|
-
r.push(...e.filter((
|
|
142
|
+
const e = p(), r = [];
|
|
143
|
+
return t.activePredictiveAlgorithms.filter((n) => !_.includes(n)).forEach((n) => {
|
|
144
|
+
r.push(...e.filter((s) => s.id === n));
|
|
126
145
|
}), r.map((n) => ({
|
|
127
146
|
text: n.name,
|
|
128
147
|
value: n.key
|
|
@@ -139,7 +158,7 @@ const U = () => ({
|
|
|
139
158
|
getFilterList() {
|
|
140
159
|
return Object.values(this.filterList).filter((t) => t.isFilterable !== 0 && t.isFilterable !== !1).map((t) => {
|
|
141
160
|
let e;
|
|
142
|
-
return t.type === "productAttribute" ? e = `product_attributes.${t.attributeName}` :
|
|
161
|
+
return t.type === "productAttribute" ? e = `product_attributes.${t.attributeName}` : C.includes(t.attributeName) ? e = `${t.attributeName}.${this.recommendationConfigs.currencySettings.value}` : e = t.attributeName, {
|
|
143
162
|
text: t.displayName,
|
|
144
163
|
value: e,
|
|
145
164
|
type: t.attributeType
|
|
@@ -161,7 +180,7 @@ const U = () => ({
|
|
|
161
180
|
setCurrentBlock(t) {
|
|
162
181
|
this.blockStates[t] || (this.blockStates = {
|
|
163
182
|
...this.blockStates,
|
|
164
|
-
[t]:
|
|
183
|
+
[t]: I()
|
|
165
184
|
}), this.currentRecommendationId = t;
|
|
166
185
|
},
|
|
167
186
|
/**
|
|
@@ -193,10 +212,10 @@ const U = () => ({
|
|
|
193
212
|
[e]: o
|
|
194
213
|
};
|
|
195
214
|
}
|
|
196
|
-
const n = t.toString(),
|
|
215
|
+
const n = t.toString(), s = e.toString(), i = this.recommendationCampaignUrls[n];
|
|
197
216
|
i && (this.recommendationCampaignUrls = {
|
|
198
217
|
...this.recommendationCampaignUrls,
|
|
199
|
-
[
|
|
218
|
+
[s]: i
|
|
200
219
|
});
|
|
201
220
|
},
|
|
202
221
|
/**
|
|
@@ -221,7 +240,7 @@ const U = () => ({
|
|
|
221
240
|
* `isInitialized`) alone.
|
|
222
241
|
*/
|
|
223
242
|
seedBlockUrlConfig(t, e) {
|
|
224
|
-
const r = (o,
|
|
243
|
+
const r = (o, a) => o === "." || o === "," || o === " " ? o : a, n = {
|
|
225
244
|
name: e.currencyCode,
|
|
226
245
|
value: e.currencyCode,
|
|
227
246
|
symbol: e.currencyCode,
|
|
@@ -229,17 +248,18 @@ const U = () => ({
|
|
|
229
248
|
decimalCount: String(e.currencyDecimalCount),
|
|
230
249
|
decimalSeparator: r(e.currencyDecimalSeparator, ","),
|
|
231
250
|
thousandSeparator: r(e.currencyThousandSeparator, ".")
|
|
232
|
-
},
|
|
251
|
+
}, s = !this.blockStates[t], i = s ? I() : this.blockStates[t];
|
|
233
252
|
i.recommendationConfigs = {
|
|
234
253
|
...i.recommendationConfigs,
|
|
235
254
|
strategy: e.strategy,
|
|
255
|
+
strategyId: e.strategyId,
|
|
236
256
|
language: e.language,
|
|
237
257
|
size: e.size,
|
|
238
258
|
productIds: e.productIds,
|
|
239
259
|
filters: e.filters,
|
|
240
260
|
shuffleProducts: e.shuffleProducts,
|
|
241
261
|
currencySettings: n
|
|
242
|
-
},
|
|
262
|
+
}, s && (this.blockStates = {
|
|
243
263
|
...this.blockStates,
|
|
244
264
|
[t]: i
|
|
245
265
|
});
|
|
@@ -267,7 +287,7 @@ const U = () => ({
|
|
|
267
287
|
* Creates a filter with the first available attribute and operator pre-selected.
|
|
268
288
|
*/
|
|
269
289
|
createDefaultFilter(t, e) {
|
|
270
|
-
const [r] = this.getFilterList, [n] =
|
|
290
|
+
const [r] = this.getFilterList, [n] = R(r == null ? void 0 : r.type);
|
|
271
291
|
return {
|
|
272
292
|
type: "standardFilter",
|
|
273
293
|
attribute: (r == null ? void 0 : r.value) ?? "",
|
|
@@ -315,20 +335,107 @@ const U = () => ({
|
|
|
315
335
|
t.filterSnapshot !== null && (t.recommendationConfigs.filters = t.filterSnapshot, t.filterSnapshot = null), t.filterSelectionDrawerStatus = !1;
|
|
316
336
|
},
|
|
317
337
|
// ====================================================================
|
|
338
|
+
// Reusable Recommendation Strategy (SD-149105)
|
|
339
|
+
// ====================================================================
|
|
340
|
+
/**
|
|
341
|
+
* Opens the Assign Strategy drawer for the current block.
|
|
342
|
+
* Selection state lives in the drawer component until Assign is
|
|
343
|
+
* pressed, so closing without assigning needs no snapshot/revert.
|
|
344
|
+
*/
|
|
345
|
+
openAssignStrategyDrawer() {
|
|
346
|
+
this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId] || (this.blockStates[this.currentRecommendationId].assignStrategyDrawerStatus = !0);
|
|
347
|
+
},
|
|
348
|
+
closeAssignStrategyDrawer() {
|
|
349
|
+
this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId] || (this.blockStates[this.currentRecommendationId].assignStrategyDrawerStatus = !1);
|
|
350
|
+
},
|
|
351
|
+
/**
|
|
352
|
+
* Fetches the active + EMAIL strategy listing. Always fetches fresh
|
|
353
|
+
* (dead-strategy detection and post-create refresh need freshness);
|
|
354
|
+
* only concurrent in-flight calls share one request.
|
|
355
|
+
*/
|
|
356
|
+
async fetchStrategies() {
|
|
357
|
+
if (g) {
|
|
358
|
+
await g;
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
g = (async () => {
|
|
362
|
+
this.strategiesLoading = !0;
|
|
363
|
+
try {
|
|
364
|
+
this.strategies = await u.fetchRecommendationStrategies();
|
|
365
|
+
} finally {
|
|
366
|
+
this.strategiesLoading = !1;
|
|
367
|
+
}
|
|
368
|
+
})();
|
|
369
|
+
try {
|
|
370
|
+
await g;
|
|
371
|
+
} finally {
|
|
372
|
+
g = null;
|
|
373
|
+
}
|
|
374
|
+
},
|
|
375
|
+
/**
|
|
376
|
+
* Resolves a strategy's recommendation endpoint template via
|
|
377
|
+
* endpoint-generate, cached per strategy id + revision. Failures throw
|
|
378
|
+
* and are NOT cached, so the next attempt retries.
|
|
379
|
+
*
|
|
380
|
+
* The revision is part of the key because `full_path` bakes in the
|
|
381
|
+
* algorithm path and `size=` as they were when it was generated, while
|
|
382
|
+
* the listing is deliberately never cached — editing a strategy in the
|
|
383
|
+
* panel and re-assigning it here would otherwise call a stale endpoint.
|
|
384
|
+
*
|
|
385
|
+
* A record with no revision is not cached at all: a `<id>:` key can
|
|
386
|
+
* never change, so it would serve the stale template forever — exactly
|
|
387
|
+
* what the revision is here to prevent.
|
|
388
|
+
*/
|
|
389
|
+
async resolveStrategyUrlTemplate(t) {
|
|
390
|
+
const e = typeof t.updated_at == "string" ? t.updated_at : "", r = e ? `${t.strategy_id}:${e}` : "", n = r ? this.strategyUrlTemplates[r] : void 0;
|
|
391
|
+
if (n)
|
|
392
|
+
return n;
|
|
393
|
+
const { full_path: s } = await u.generateStrategyEndpoint(t);
|
|
394
|
+
return r && (this.strategyUrlTemplates = {
|
|
395
|
+
...this.strategyUrlTemplates,
|
|
396
|
+
[r]: s
|
|
397
|
+
}), s;
|
|
398
|
+
},
|
|
399
|
+
/**
|
|
400
|
+
* Assigns a strategy to the current block. The config write is
|
|
401
|
+
* synchronous (before any await) so a block switch cannot misdirect
|
|
402
|
+
* it; the configVersion bump persists it to node config and triggers
|
|
403
|
+
* the product refetch via the coordinator control's subscription.
|
|
404
|
+
*/
|
|
405
|
+
assignStrategy(t) {
|
|
406
|
+
this.patchCurrentBlockConfig({
|
|
407
|
+
strategyId: String(t.strategy_id),
|
|
408
|
+
...t.size !== void 0 ? { size: String(t.size) } : {}
|
|
409
|
+
});
|
|
410
|
+
},
|
|
411
|
+
/**
|
|
412
|
+
* Clears the current block's strategy; it falls back to the per-block
|
|
413
|
+
* algorithm settings.
|
|
414
|
+
*
|
|
415
|
+
* `size` goes back to the default rather than staying on the removed
|
|
416
|
+
* strategy's count: the Number of Products control is hidden in RRS
|
|
417
|
+
* mode (D2), so a block left on the strategy's count would have no UI
|
|
418
|
+
* to correct it. The pre-assign count is not restored — that would
|
|
419
|
+
* need a persisted snapshot field; tracked for a later phase.
|
|
420
|
+
*/
|
|
421
|
+
removeStrategy() {
|
|
422
|
+
this.patchCurrentBlockConfig({ strategyId: "", size: v.size });
|
|
423
|
+
},
|
|
424
|
+
// ====================================================================
|
|
318
425
|
// Shared Data Fetching (fetched once, used by all blocks)
|
|
319
426
|
// ====================================================================
|
|
320
427
|
async fetchRecommendationCreateData() {
|
|
321
428
|
if (!this.activePredictiveAlgorithms.length) {
|
|
322
|
-
if (
|
|
323
|
-
await
|
|
429
|
+
if (d) {
|
|
430
|
+
await d;
|
|
324
431
|
return;
|
|
325
432
|
}
|
|
326
|
-
|
|
433
|
+
d = (async () => {
|
|
327
434
|
const {
|
|
328
435
|
activePredictiveAlgorithms: t,
|
|
329
436
|
languages: e,
|
|
330
437
|
currencies: r
|
|
331
|
-
} = await
|
|
438
|
+
} = await u.fetchRecommendationCreateData();
|
|
332
439
|
if (this.activePredictiveAlgorithms = t, this.languages = e, this.currentRecommendationId !== null && this.blockStates[this.currentRecommendationId]) {
|
|
333
440
|
const n = this.blockStates[this.currentRecommendationId];
|
|
334
441
|
n.filterStatus = !!n.recommendationConfigs.filters.length;
|
|
@@ -336,26 +443,26 @@ const U = () => ({
|
|
|
336
443
|
this.currencyList = r;
|
|
337
444
|
})();
|
|
338
445
|
try {
|
|
339
|
-
await
|
|
446
|
+
await d;
|
|
340
447
|
} finally {
|
|
341
|
-
|
|
448
|
+
d = null;
|
|
342
449
|
}
|
|
343
450
|
}
|
|
344
451
|
},
|
|
345
452
|
async fetchRecommendationFilters() {
|
|
346
453
|
if (!Object.keys(this.filterList).length) {
|
|
347
|
-
if (
|
|
348
|
-
await
|
|
454
|
+
if (f) {
|
|
455
|
+
await f;
|
|
349
456
|
return;
|
|
350
457
|
}
|
|
351
|
-
|
|
352
|
-
const t = await
|
|
458
|
+
f = (async () => {
|
|
459
|
+
const t = await u.fetchRecommendationFilters();
|
|
353
460
|
this.filterList = t;
|
|
354
461
|
})();
|
|
355
462
|
try {
|
|
356
|
-
await
|
|
463
|
+
await f;
|
|
357
464
|
} finally {
|
|
358
|
-
|
|
465
|
+
f = null;
|
|
359
466
|
}
|
|
360
467
|
}
|
|
361
468
|
},
|
|
@@ -370,10 +477,10 @@ const U = () => ({
|
|
|
370
477
|
deleteFilterGroup(t) {
|
|
371
478
|
if (this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId])
|
|
372
479
|
return;
|
|
373
|
-
const e = this.blockStates[this.currentRecommendationId], r = e.recommendationConfigs.filters.filter((i) => i.filterGroup !== t), n = [...new Set(r.map((i) => i.filterGroup))].sort((i, o) => i - o),
|
|
480
|
+
const e = this.blockStates[this.currentRecommendationId], r = e.recommendationConfigs.filters.filter((i) => i.filterGroup !== t), n = [...new Set(r.map((i) => i.filterGroup))].sort((i, o) => i - o), s = new Map(n.map((i, o) => [i, o + 1]));
|
|
374
481
|
e.recommendationConfigs.filters = r.map((i) => ({
|
|
375
482
|
...i,
|
|
376
|
-
filterGroup:
|
|
483
|
+
filterGroup: s.get(i.filterGroup) ?? i.filterGroup
|
|
377
484
|
}));
|
|
378
485
|
},
|
|
379
486
|
updateFilter(t) {
|
|
@@ -398,10 +505,10 @@ const U = () => ({
|
|
|
398
505
|
let i = 1;
|
|
399
506
|
n = n.map((o) => o.filterGroup === t.filterGroup ? { ...o, filterNumber: i++ } : o);
|
|
400
507
|
} else {
|
|
401
|
-
const i = [...new Set(n.map((
|
|
402
|
-
n = n.map((
|
|
403
|
-
...
|
|
404
|
-
filterGroup: o.get(
|
|
508
|
+
const i = [...new Set(n.map((a) => a.filterGroup))].sort((a, c) => a - c), o = new Map(i.map((a, c) => [a, c + 1]));
|
|
509
|
+
n = n.map((a) => ({
|
|
510
|
+
...a,
|
|
511
|
+
filterGroup: o.get(a.filterGroup) ?? a.filterGroup
|
|
405
512
|
}));
|
|
406
513
|
}
|
|
407
514
|
e.recommendationConfigs.filters = n;
|
|
@@ -410,15 +517,15 @@ const U = () => ({
|
|
|
410
517
|
addFilter(t) {
|
|
411
518
|
if (this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId])
|
|
412
519
|
return;
|
|
413
|
-
const e = this.blockStates[this.currentRecommendationId], r = [...e.recommendationConfigs.filters],
|
|
520
|
+
const e = this.blockStates[this.currentRecommendationId], r = [...e.recommendationConfigs.filters], s = r.filter(
|
|
414
521
|
(o) => o.filterGroup === t.filterGroup
|
|
415
522
|
).length + 1, i = r.findLastIndex((o) => o.filterGroup === t.filterGroup);
|
|
416
523
|
i !== -1 ? r.splice(i + 1, 0, {
|
|
417
524
|
...t,
|
|
418
|
-
filterNumber:
|
|
525
|
+
filterNumber: s
|
|
419
526
|
}) : r.push({
|
|
420
527
|
...t,
|
|
421
|
-
filterNumber:
|
|
528
|
+
filterNumber: s
|
|
422
529
|
}), e.recommendationConfigs.filters = r;
|
|
423
530
|
},
|
|
424
531
|
generateFilterQuery() {
|
|
@@ -430,62 +537,96 @@ const U = () => ({
|
|
|
430
537
|
* every block's recommendationConfigs across user edits.
|
|
431
538
|
*/
|
|
432
539
|
hasInvalidBlock() {
|
|
433
|
-
return Object.values(this.blockStates).some((t) => !
|
|
434
|
-
},
|
|
435
|
-
/**
|
|
436
|
-
* Per-instance counterpart to `hasInvalidBlock`: the ids of every block
|
|
437
|
-
* that fails required-field validation, one drawer row each (SD-147430).
|
|
438
|
-
*/
|
|
439
|
-
invalidBlockIds() {
|
|
440
|
-
return Object.entries(this.blockStates).filter(([, t]) => !I(t.recommendationConfigs, this)).map(([t]) => t);
|
|
540
|
+
return Object.values(this.blockStates).some((t) => !x(t.recommendationConfigs, this));
|
|
441
541
|
},
|
|
442
542
|
// ====================================================================
|
|
443
543
|
// Per-Block Product Fetching
|
|
444
544
|
// ====================================================================
|
|
445
545
|
async fetchRecommendationProducts() {
|
|
446
546
|
if (!(this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId])) {
|
|
447
|
-
if (
|
|
448
|
-
await
|
|
547
|
+
if (h) {
|
|
548
|
+
await h;
|
|
449
549
|
return;
|
|
450
550
|
}
|
|
451
|
-
|
|
551
|
+
h = this._doFetchProducts();
|
|
452
552
|
try {
|
|
453
|
-
await
|
|
553
|
+
await h;
|
|
454
554
|
} finally {
|
|
455
|
-
|
|
555
|
+
h = null;
|
|
456
556
|
}
|
|
457
557
|
}
|
|
458
558
|
},
|
|
459
559
|
async _doFetchProducts() {
|
|
460
|
-
var
|
|
461
|
-
const t = this.currentRecommendationId, e = this.blockStates[t], { recommendationConfigs: r } = e, n =
|
|
560
|
+
var S;
|
|
561
|
+
const t = this.currentRecommendationId, e = this.blockStates[t], { recommendationConfigs: r } = e, n = G();
|
|
562
|
+
if (n.isFeatureEnabled("reusableRecommendationStrategy") && r.strategyId) {
|
|
563
|
+
await this._doFetchStrategyProducts(t);
|
|
564
|
+
return;
|
|
565
|
+
}
|
|
566
|
+
const s = r.filters.filter((m) => m.isValid), i = b(s), o = ((S = p().find((m) => m.key === r.strategy)) == null ? void 0 : S.path) || "", a = parseInt(r.size) || 6, c = {
|
|
462
567
|
locale: r.language,
|
|
463
568
|
currency: r.currencySettings.value,
|
|
464
|
-
partnerName:
|
|
569
|
+
partnerName: n.partnerName,
|
|
465
570
|
size: r.size,
|
|
466
571
|
details: !0,
|
|
467
|
-
campaignId:
|
|
572
|
+
campaignId: n.variationId
|
|
468
573
|
};
|
|
469
|
-
r.strategy === "manualMerchandising" ?
|
|
470
|
-
|
|
471
|
-
|
|
574
|
+
r.strategy === "manualMerchandising" ? c.productId = N(r.productIds) : r.strategy === "similarViewed" && (c.productId = "{itemId}"), r.strategy === "userBased" && (c.userId = "{user_id}"), i && (c.filter = i), r.shuffleProducts && (c.shuffle = !0), Object.assign(
|
|
575
|
+
c,
|
|
576
|
+
U(n.partnerName, r.strategy)
|
|
472
577
|
);
|
|
473
|
-
let
|
|
578
|
+
let l;
|
|
474
579
|
try {
|
|
475
|
-
|
|
580
|
+
l = await u.fetchRecommendationProducts(o, c);
|
|
476
581
|
} catch {
|
|
477
|
-
|
|
582
|
+
l = [];
|
|
478
583
|
}
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
584
|
+
this._setBlockProducts(t, l, a);
|
|
585
|
+
},
|
|
586
|
+
/**
|
|
587
|
+
* Fetches products for a strategy-backed block: listing lookup →
|
|
588
|
+
* endpoint-generate template → fill {locale}/{currency}, drop
|
|
589
|
+
* {user_id} (resolved at send time) → fetch. Any failure (dead
|
|
590
|
+
* strategy, resolution error) falls back to placeholder products.
|
|
591
|
+
*/
|
|
592
|
+
async _doFetchStrategyProducts(t) {
|
|
593
|
+
const { recommendationConfigs: e } = this.blockStates[t];
|
|
594
|
+
let r = [], n = parseInt(e.size) || 6;
|
|
595
|
+
try {
|
|
596
|
+
this.strategies.length || await this.fetchStrategies();
|
|
597
|
+
const s = this.strategies.find(
|
|
598
|
+
(i) => String(i.strategy_id) === e.strategyId
|
|
599
|
+
);
|
|
600
|
+
if (s) {
|
|
601
|
+
n = parseInt(String(s.size ?? "")) || n;
|
|
602
|
+
const o = (await this.resolveStrategyUrlTemplate(s)).replaceAll("{locale}", e.language).replaceAll("{currency}", e.currencySettings.value), a = o.indexOf("?"), c = a === -1 ? o : o.slice(0, a), l = (a === -1 ? "" : o.slice(a + 1)).split("&").filter((m) => m && !m.startsWith("user_id=")), S = l.length ? `${c}?${l.join("&")}` : c;
|
|
603
|
+
r = await u.fetchRecommendationProductsByUrl(S);
|
|
604
|
+
}
|
|
605
|
+
} catch {
|
|
606
|
+
r = [];
|
|
485
607
|
}
|
|
608
|
+
this._setBlockProducts(t, r, n);
|
|
609
|
+
},
|
|
610
|
+
/**
|
|
611
|
+
* Writes products to a block's state, padded/clipped to `size` so
|
|
612
|
+
* in-place content updates (which compare DOM element count vs
|
|
613
|
+
* products.length) succeed:
|
|
614
|
+
* - API returned nothing → fill entirely with defaults
|
|
615
|
+
* - fewer than requested → pad with dummies
|
|
616
|
+
* - more than requested → clip, preventing the renderer from extending
|
|
617
|
+
* its slot grid (which would reset migrator-applied styles).
|
|
618
|
+
*/
|
|
619
|
+
_setBlockProducts(t, e, r) {
|
|
620
|
+
if (!this.blockStates[t])
|
|
621
|
+
return;
|
|
622
|
+
const n = e.length > 0 ? e : y(r);
|
|
623
|
+
n.length < r ? this.blockStates[t].recommendationProducts = [
|
|
624
|
+
...n,
|
|
625
|
+
...y(r - n.length)
|
|
626
|
+
] : n.length > r ? this.blockStates[t].recommendationProducts = n.slice(0, r) : this.blockStates[t].recommendationProducts = n;
|
|
486
627
|
}
|
|
487
628
|
}
|
|
488
629
|
});
|
|
489
630
|
export {
|
|
490
|
-
|
|
631
|
+
J as useRecommendationExtensionStore
|
|
491
632
|
};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
var c = Object.defineProperty;
|
|
2
|
-
var i = (
|
|
3
|
-
var
|
|
2
|
+
var i = (l, a, e) => a in l ? c(l, a, { enumerable: !0, configurable: !0, writable: !0, value: e }) : l[a] = e;
|
|
3
|
+
var T = (l, a, e) => i(l, typeof a != "symbol" ? a + "" : a, e);
|
|
4
4
|
import { Control as I, UIElementType as n, UEAttr as $ } from "../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
5
|
-
class
|
|
5
|
+
class _ extends I {
|
|
6
6
|
constructor() {
|
|
7
7
|
super(...arguments);
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
T(this, "currentNode");
|
|
9
|
+
T(this, "lastBlockInstanceId", null);
|
|
10
10
|
}
|
|
11
11
|
getContainer() {
|
|
12
12
|
var e;
|
|
@@ -91,21 +91,21 @@ class d extends I {
|
|
|
91
91
|
* and combines it with the text in Stripo's alert-message layout.
|
|
92
92
|
*/
|
|
93
93
|
_setInfoMessageValue(e, t) {
|
|
94
|
-
const E = this.getContainer(), o = E.querySelector(`[data-icon-key="${e}"]`),
|
|
94
|
+
const E = this.getContainer(), o = E.querySelector(`[data-icon-key="${e}"]`), r = o == null ? void 0 : o.querySelector("ue-icon-component"), s = (r == null ? void 0 : r.outerHTML) ?? "";
|
|
95
95
|
this.api.setUIEAttribute(
|
|
96
96
|
e,
|
|
97
97
|
"value",
|
|
98
98
|
`
|
|
99
99
|
<div class="service-element alert-message-main" style="align-items: start;">
|
|
100
|
-
${
|
|
100
|
+
${s}
|
|
101
101
|
<div class="service-element alert-message-text">
|
|
102
102
|
${t}
|
|
103
103
|
</div>
|
|
104
104
|
</div>
|
|
105
105
|
`
|
|
106
106
|
);
|
|
107
|
-
const
|
|
108
|
-
|
|
107
|
+
const u = E.querySelector(`[data-info-message="${e}"]`);
|
|
108
|
+
u && (u.style.display = "");
|
|
109
109
|
}
|
|
110
110
|
_GuToggle(e) {
|
|
111
111
|
return `
|
|
@@ -126,15 +126,15 @@ class d extends I {
|
|
|
126
126
|
placeholder: t,
|
|
127
127
|
options: E,
|
|
128
128
|
className: o = "es-180w",
|
|
129
|
-
searchable:
|
|
129
|
+
searchable: r = !1
|
|
130
130
|
}) {
|
|
131
131
|
return `
|
|
132
132
|
<${n.SELECTPICKER}
|
|
133
133
|
class="${o}"
|
|
134
134
|
${$.SELECTPICKER.name}="${e}"
|
|
135
|
-
${
|
|
135
|
+
${r ? `${$.SELECTPICKER.searchable}="true"` : ""}
|
|
136
136
|
${$.SELECTPICKER.placeholder}="${t}">
|
|
137
|
-
${E.map((
|
|
137
|
+
${E.map((s) => this._GuSelectItem(s)).join("")}
|
|
138
138
|
</${n.SELECTPICKER}>
|
|
139
139
|
`;
|
|
140
140
|
}
|
|
@@ -176,12 +176,15 @@ class d extends I {
|
|
|
176
176
|
</${n.RADIO_BUTTONS}>
|
|
177
177
|
`;
|
|
178
178
|
}
|
|
179
|
-
_GuButton({ name: e, label: t, id: E = "" }) {
|
|
179
|
+
_GuButton({ name: e, label: t, id: E = "", className: o = "", icon: r = "", disabled: s = !1 }) {
|
|
180
180
|
return `
|
|
181
181
|
<${n.BUTTON}
|
|
182
182
|
${$.BUTTON.name}="${e}"
|
|
183
183
|
${E ? `id="${E}"` : ""}
|
|
184
|
-
${
|
|
184
|
+
${o ? `class="${o}"` : ""}
|
|
185
|
+
${r ? `${$.BUTTON.icon}="${r}"` : ""}
|
|
186
|
+
${s ? `${$.BUTTON.disabled}="true"` : ""}
|
|
187
|
+
${$.BUTTON.caption}="${t}">
|
|
185
188
|
</${n.BUTTON}>
|
|
186
189
|
`;
|
|
187
190
|
}
|
|
@@ -230,11 +233,11 @@ class d extends I {
|
|
|
230
233
|
*/
|
|
231
234
|
_GuOrderable(e, t) {
|
|
232
235
|
let E = "";
|
|
233
|
-
t.forEach((
|
|
234
|
-
const
|
|
236
|
+
t.forEach((r) => {
|
|
237
|
+
const s = $.ORDERABLE_ITEM && "name" in $.ORDERABLE_ITEM ? $.ORDERABLE_ITEM.name : "name";
|
|
235
238
|
E += `
|
|
236
|
-
<${n.ORDERABLE_ITEM} ${
|
|
237
|
-
${
|
|
239
|
+
<${n.ORDERABLE_ITEM} ${s}="${r.key}">
|
|
240
|
+
${r.content}
|
|
238
241
|
</${n.ORDERABLE_ITEM}>
|
|
239
242
|
`;
|
|
240
243
|
});
|
|
@@ -305,5 +308,5 @@ class d extends I {
|
|
|
305
308
|
}
|
|
306
309
|
}
|
|
307
310
|
export {
|
|
308
|
-
|
|
311
|
+
_ as CommonControl
|
|
309
312
|
};
|
package/dist/guido.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
@charset "UTF-8";.gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-73199fa4] .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}.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}.auto-save-toggle[data-v-2c964af4]{position:relative}.auto-save-toggle__info-box[data-v-2c964af4]{position:absolute;top:100%;left:0;z-index:10;width:280px}.editor-actions[data-v-6e711fd7]{gap:4px}.header-wrapper[data-v-d11dd577]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-f258bc9e]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-f258bc9e]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-f258bc9e]{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}[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-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}.strategy-info-box__name[data-v-fe4491e6]{color:var(--guido-color-gray-800, #2c3546);font-size:13px;font-weight:600;line-height:20px}.strategy-info-box__updated[data-v-fe4491e6]{margin-top:2px;color:var(--guido-color-gray-600, #6d7686);font-size:12px;line-height:18px}.strategy-info-box__rows[data-v-fe4491e6]{margin-top:12px}.strategy-info-box__row+.strategy-info-box__row[data-v-fe4491e6]{margin-top:10px}.strategy-info-box__label[data-v-fe4491e6]{color:var(--guido-color-gray-600, #6d7686);font-size:12px;line-height:18px}.strategy-info-box__value[data-v-fe4491e6]{color:var(--guido-color-gray-800, #2c3546);font-size:12px;line-height:18px;word-break:break-word}.assign-strategy-drawer-content[data-v-710137fe]{display:flex;flex-direction:column;gap:16px}.assign-strategy-select[data-v-710137fe]{width:100%;max-width:none}.assign-strategy-select[data-v-710137fe] .in-dropdown-box__container{width:58%}.assign-strategy-detail[data-v-710137fe] .in-drawer__container,.assign-strategy-detail[data-v-710137fe] .in-drawer__wrapper{position:static!important;inset:auto!important;width:100%!important;max-width:none!important;height:auto!important;border:none!important;box-shadow:none!important;transform:none!important}.assign-strategy-detail[data-v-710137fe] .in-drawer__content{height:auto!important;max-height:none!important;overflow:visible!important}.assign-strategy-detail[data-v-710137fe] .in-drawer__content .px-5{padding-left:0!important;padding-right:0!important}.assign-strategy-detail[data-v-710137fe] .filter-humanizer{margin-right:0!important;margin-left:0!important}.assign-strategy-detail[data-v-710137fe] .in-drawer__header-main{padding:0!important}.assign-strategy-detail[data-v-710137fe] .in-drawer__title,.assign-strategy-detail[data-v-710137fe] [class*=overlay],.assign-strategy-detail[data-v-710137fe] #close-button-strategy-details-drawer{display:none!important}
|