@useinsider/guido 3.6.0-beta.a8be7f8 → 3.6.0-beta.b75de0e
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/composables/useHtmlValidator.js +131 -102
- package/dist/composables/useRecommendation.js +34 -33
- package/dist/composables/useStripoEventHandler.js +15 -20
- package/dist/config/compiler/utils/recommendationCompilerUtils.js +28 -27
- package/dist/config/compiler/utils/recommendationIgnoreUtils.js +15 -0
- package/dist/config/migrator/recommendation/extractors.js +44 -22
- package/dist/config/migrator/recommendation/htmlBuilder.js +175 -169
- package/dist/config/migrator/recommendationMigrator.js +30 -31
- package/dist/enums/toaster.js +1 -1
- package/dist/extensions/Blocks/Recommendation/block.js +16 -35
- package/dist/extensions/Blocks/Recommendation/constants/selectors.js +21 -15
- package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +38 -24
- package/dist/extensions/Blocks/Recommendation/controls/main/index.js +39 -38
- package/dist/extensions/Blocks/Recommendation/controls/main/layoutOrientation.js +45 -34
- package/dist/extensions/Blocks/Recommendation/controls/main/productCount.js +3 -2
- package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +62 -52
- package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +74 -67
- package/dist/extensions/Blocks/Recommendation/controls/syncInfoMessage.js +7 -6
- package/dist/extensions/Blocks/Recommendation/extension.js +6 -5
- package/dist/extensions/Blocks/Recommendation/settingsPanel.js +3 -2
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +14 -9
- package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +3 -2
- package/dist/extensions/Blocks/Recommendation/templates/index.js +5 -4
- package/dist/extensions/Blocks/Recommendation/utils/partnerCustomizations.js +21 -0
- package/dist/src/composables/useHtmlValidator.d.ts +9 -0
- package/dist/src/config/compiler/utils/recommendationIgnoreUtils.d.ts +17 -0
- package/dist/src/config/migrator/recommendation/extractors.d.ts +15 -0
- package/dist/src/config/migrator/recommendation/htmlBuilder.d.ts +8 -0
- package/dist/src/enums/toaster.d.ts +1 -2
- package/dist/src/extensions/Blocks/Recommendation/block.d.ts +0 -13
- package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +1 -1
- package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +21 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/cardComposition/index.d.ts +7 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/layoutOrientation.d.ts +5 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/productLayout.d.ts +6 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +9 -0
- package/dist/src/extensions/Blocks/Recommendation/utils/partnerCustomizations.d.ts +7 -0
- package/package.json +1 -1
- package/dist/extensions/Blocks/Recommendation/useRecommendationBlockWarning.js +0 -16
- package/dist/extensions/Blocks/Recommendation/utils/recommendationBlockCount.js +0 -9
- package/dist/src/extensions/Blocks/Recommendation/useRecommendationBlockWarning.d.ts +0 -11
- package/dist/src/extensions/Blocks/Recommendation/utils/recommendationBlockCount.d.ts +0 -28
- /package/dist/src/{extensions/Blocks/Recommendation/block.test.d.ts → composables/useHtmlValidator.test.d.ts} +0 -0
- /package/dist/src/{extensions/Blocks/Recommendation/utils/recommendationBlockCount.test.d.ts → config/compiler/utils/recommendationIgnoreUtils.test.d.ts} +0 -0
|
@@ -1,47 +1,46 @@
|
|
|
1
1
|
import { BlockId as f } from "../../enums/block.js";
|
|
2
|
-
import { useTemplateStore as
|
|
3
|
-
import { mapComposition as
|
|
4
|
-
import { extractTitleText as
|
|
5
|
-
import { buildBlockHtml as
|
|
6
|
-
import { parseRecommendationId as
|
|
7
|
-
import { mapSettings as
|
|
8
|
-
const
|
|
9
|
-
function
|
|
10
|
-
var
|
|
11
|
-
const o =
|
|
2
|
+
import { useTemplateStore as b } from "../../stores/template.js";
|
|
3
|
+
import { mapComposition as y } from "./recommendation/compositionMapper.js";
|
|
4
|
+
import { extractCurrencyFromBlock as v, extractTitleText as C, extractCardBgColor as S, isCustomizedBlock as w } from "./recommendation/extractors.js";
|
|
5
|
+
import { buildBlockHtml as x } from "./recommendation/htmlBuilder.js";
|
|
6
|
+
import { parseRecommendationId as R, parseLegacyConfig as T } from "./recommendation/parseLegacyConfig.js";
|
|
7
|
+
import { mapSettings as h } from "./recommendation/settingsMapper.js";
|
|
8
|
+
const M = 'td[esd-dev-product-config][class*="ins-recommendation-v3-block-"]:not(.recommendation-block-v2), td.product-block[esd-handler-name*="EmailRecommendationV3"][esd-dev-product-config]:not(.recommendation-block-v2)';
|
|
9
|
+
function B(i, t, c) {
|
|
10
|
+
var d;
|
|
11
|
+
const o = R(t);
|
|
12
12
|
if (o === null)
|
|
13
13
|
return console.warn(
|
|
14
14
|
"[RecommendationMigrator] Skipping block — missing/invalid `ins-recommendation-v3-campaign-id`"
|
|
15
15
|
), !1;
|
|
16
|
-
const r =
|
|
16
|
+
const r = T(t);
|
|
17
17
|
if (!r)
|
|
18
18
|
return console.warn(
|
|
19
19
|
`[RecommendationMigrator] Aborting block id=${o} — \`esd-dev-product-config\` missing or unable to be parsed`
|
|
20
20
|
), !1;
|
|
21
|
-
const n = c[String(o)]
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
`[RecommendationMigrator] Aborting block id=${o} — recommendationConfigs entry missing in Guido Config`
|
|
25
|
-
), !1;
|
|
26
|
-
const a = S(n, r, o), e = b((s = r.composition) == null ? void 0 : s.variables), d = y(t), l = C(t), g = {
|
|
21
|
+
const n = c[String(o)] ?? {
|
|
22
|
+
currencySettings: v(t)
|
|
23
|
+
}, a = h(n, r, o), e = y((d = r.composition) == null ? void 0 : d.variables), l = C(t), g = S(t), p = {
|
|
27
24
|
...a,
|
|
28
25
|
composition: e.composition,
|
|
29
26
|
visibility: e.visibility,
|
|
30
27
|
textTrimming: e.anyTextTrimming
|
|
31
|
-
},
|
|
28
|
+
}, m = w(t), u = `
|
|
32
29
|
<table>
|
|
33
30
|
<tbody>
|
|
34
31
|
<tr>
|
|
35
32
|
<td class="esd-structure" align="left">
|
|
36
33
|
<table width="100%" cellpadding="0" cellspacing="0">
|
|
37
34
|
<tbody>
|
|
38
|
-
<tr>${
|
|
39
|
-
nodeConfig:
|
|
35
|
+
<tr>${x({
|
|
36
|
+
nodeConfig: p,
|
|
40
37
|
composition: e,
|
|
41
|
-
cardBg:
|
|
42
|
-
titleText:
|
|
38
|
+
cardBg: g,
|
|
39
|
+
titleText: l,
|
|
43
40
|
legacyId: t.getAttribute("id") ?? void 0,
|
|
44
|
-
legacyBgColor: t.getAttribute("bgcolor") ?? void 0
|
|
41
|
+
legacyBgColor: t.getAttribute("bgcolor") ?? void 0,
|
|
42
|
+
preserveInnerHtml: m ? t.innerHTML : void 0,
|
|
43
|
+
skipCompile: m
|
|
45
44
|
})}</tr>
|
|
46
45
|
</tbody>
|
|
47
46
|
</table>
|
|
@@ -49,15 +48,15 @@ function x(i, t, c) {
|
|
|
49
48
|
</tr>
|
|
50
49
|
</tbody>
|
|
51
50
|
</table>
|
|
52
|
-
`,
|
|
53
|
-
return !
|
|
51
|
+
`, s = i.parseFromString(u, "text/html").querySelector("td.esd-structure");
|
|
52
|
+
return !s || !t.parentNode ? (console.warn(
|
|
54
53
|
`[RecommendationMigrator] Aborting block id=${o} — failed to construct new HTML element`
|
|
55
|
-
), !1) : (t.parentNode.replaceChild(
|
|
54
|
+
), !1) : (t.parentNode.replaceChild(s, t), !0);
|
|
56
55
|
}
|
|
57
|
-
function
|
|
58
|
-
const c = new DOMParser(), o = c.parseFromString(i, "text/html"), r = Array.from(o.querySelectorAll(
|
|
56
|
+
function q(i, t = {}) {
|
|
57
|
+
const c = new DOMParser(), o = c.parseFromString(i, "text/html"), r = Array.from(o.querySelectorAll(M));
|
|
59
58
|
try {
|
|
60
|
-
|
|
59
|
+
b().$patch((e) => {
|
|
61
60
|
e.migrations = {
|
|
62
61
|
...e.migrations,
|
|
63
62
|
[f.Recommendation]: r.length
|
|
@@ -70,12 +69,12 @@ function I(i, t = {}) {
|
|
|
70
69
|
let n = 0;
|
|
71
70
|
return r.forEach((a) => {
|
|
72
71
|
try {
|
|
73
|
-
|
|
72
|
+
B(c, a, t) && (n += 1);
|
|
74
73
|
} catch (e) {
|
|
75
74
|
console.error("[RecommendationMigrator] Unexpected error migrating block:", e);
|
|
76
75
|
}
|
|
77
76
|
}), n > 0 && console.info(`[RecommendationMigrator] Migrated ${n} legacy Recommendation block(s)`), o.documentElement.outerHTML;
|
|
78
77
|
}
|
|
79
78
|
export {
|
|
80
|
-
|
|
79
|
+
q as migrateRecommendation
|
|
81
80
|
};
|
package/dist/enums/toaster.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var c = /* @__PURE__ */ ((r) => (r.Success = "success", r.Warning = "warning", r.Alert = "alert", r
|
|
1
|
+
var c = /* @__PURE__ */ ((r) => (r.Success = "success", r.Warning = "warning", r.Alert = "alert", r))(c || {});
|
|
2
2
|
export {
|
|
3
3
|
c as ToasterTypeOptions
|
|
4
4
|
};
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
var k = Object.defineProperty;
|
|
2
|
-
var
|
|
3
|
-
var d = (a, r, t) =>
|
|
4
|
-
import { BlockId as
|
|
5
|
-
import { getMigrationBannerHtml as
|
|
6
|
-
import { Block as
|
|
2
|
+
var y = (a, r, t) => r in a ? k(a, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : a[r] = t;
|
|
3
|
+
var d = (a, r, t) => y(a, typeof r != "symbol" ? r + "" : r, t);
|
|
4
|
+
import { BlockId as B } from "../../../enums/block.js";
|
|
5
|
+
import { getMigrationBannerHtml as D } from "../../../utils/migrationBannerHtml.js";
|
|
6
|
+
import { Block as R, BlockCompositionType as C, ModificationDescription as h } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
7
7
|
import { regenerateMobileProductRows as b } from "./controls/main/utils.js";
|
|
8
8
|
import { ensureMobileCssRulesExist as p, setMobileLayoutOptOut as f, hasMobileLayoutOptOut as A } from "./controls/mobileLayout/cssRules.js";
|
|
9
9
|
import { RecommendationConfigService as c } from "./services/configService.js";
|
|
10
10
|
import { useRecommendationExtensionStore as g } from "./store/recommendation.js";
|
|
11
11
|
import { getDefaultTemplate as E } from "./templates/grid/template.js";
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class H extends D {
|
|
12
|
+
const _ = B.Recommendation, m = "recommendation-block-v2", u = "recommendation-id";
|
|
13
|
+
let I = !1;
|
|
14
|
+
class q extends R {
|
|
16
15
|
constructor() {
|
|
17
16
|
super();
|
|
18
17
|
/**
|
|
@@ -22,7 +21,7 @@ class H extends D {
|
|
|
22
21
|
d(this, "_pendingBlockId", null);
|
|
23
22
|
}
|
|
24
23
|
getId() {
|
|
25
|
-
return
|
|
24
|
+
return _;
|
|
26
25
|
}
|
|
27
26
|
getIcon() {
|
|
28
27
|
return "recommendation-icon";
|
|
@@ -39,8 +38,8 @@ class H extends D {
|
|
|
39
38
|
);
|
|
40
39
|
}
|
|
41
40
|
getSettingsPanelTitleHtml() {
|
|
42
|
-
return
|
|
43
|
-
|
|
41
|
+
return D(
|
|
42
|
+
_,
|
|
44
43
|
this.api.translate("Recommendation Block"),
|
|
45
44
|
this.api.translate("This block is switched from the Old Version to the New Version. We recommend you check the Recommendation block and test your message to ensure it works properly.")
|
|
46
45
|
);
|
|
@@ -96,7 +95,7 @@ class H extends D {
|
|
|
96
95
|
documentModifier: this.api.getDocumentModifier()
|
|
97
96
|
}));
|
|
98
97
|
}
|
|
99
|
-
s.patchCurrentBlockConfig({ language: n.language }, { triggerRefetch: !1 })
|
|
98
|
+
s.patchCurrentBlockConfig({ language: n.language }, { triggerRefetch: !1 });
|
|
100
99
|
}
|
|
101
100
|
/**
|
|
102
101
|
* Called when the document changes or template is loaded
|
|
@@ -118,7 +117,7 @@ class H extends D {
|
|
|
118
117
|
}
|
|
119
118
|
this._healLingeringDuplicate(t), c.needsMigration(t) && this._migrateFromLegacy(t);
|
|
120
119
|
try {
|
|
121
|
-
|
|
120
|
+
I || (p(this.api), I = !0);
|
|
122
121
|
const e = c.getConfig(t), i = this._getBlockElement(t);
|
|
123
122
|
if (i) {
|
|
124
123
|
const n = !e.mobileLayoutEnabled;
|
|
@@ -138,24 +137,6 @@ class H extends D {
|
|
|
138
137
|
const e = this._getRecommendationId(t);
|
|
139
138
|
e && g().removeBlockState(e);
|
|
140
139
|
}
|
|
141
|
-
/**
|
|
142
|
-
* Warns (dark advisory toaster) when the design holds more than one live
|
|
143
|
-
* recommendation block. Triggered from the user-add paths only (fresh drop
|
|
144
|
-
* and duplicate) — never from document-load/migration, so opening a template
|
|
145
|
-
* that already has multiple blocks does not fire it.
|
|
146
|
-
*
|
|
147
|
-
* Counting lives in `useRecommendationBlockWarning` so the same DOM-based
|
|
148
|
-
* logic (which ignores the empty shells deletions leave behind, SD-143028)
|
|
149
|
-
* is shared with the `module_dropped` handler — recommendation blocks can
|
|
150
|
-
* also arrive inside a saved structure. Wrapped in try/catch because the
|
|
151
|
-
* document root may be unavailable during initial load.
|
|
152
|
-
*/
|
|
153
|
-
_warnIfMultipleBlocks() {
|
|
154
|
-
try {
|
|
155
|
-
M().warnIfMultipleBlocks(this.api.getDocumentRootHtmlNode());
|
|
156
|
-
} catch {
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
140
|
/**
|
|
160
141
|
* Generates the next unique recommendation ID by scanning all existing blocks
|
|
161
142
|
* in the document and finding the maximum existing ID + 1.
|
|
@@ -228,7 +209,7 @@ class H extends D {
|
|
|
228
209
|
/** Assigns a fresh id to a duplicated block and syncs DOM, node config and store. */
|
|
229
210
|
_handleDuplicate(t, e) {
|
|
230
211
|
const i = this._reassignDuplicateId(t, e), n = g();
|
|
231
|
-
n.cloneBlockState(e, i), n.setCurrentBlock(i)
|
|
212
|
+
n.cloneBlockState(e, i), n.setCurrentBlock(i);
|
|
232
213
|
}
|
|
233
214
|
/**
|
|
234
215
|
* Core id-reassignment for a duplicated block: rewrites the DOM
|
|
@@ -310,6 +291,6 @@ class H extends D {
|
|
|
310
291
|
}
|
|
311
292
|
}
|
|
312
293
|
export {
|
|
313
|
-
|
|
314
|
-
|
|
294
|
+
_ as BLOCK_ID,
|
|
295
|
+
q as RecommendationBlock
|
|
315
296
|
};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
const T = ".recommendation-block-v2",
|
|
1
|
+
const T = ".recommendation-block-v2", n = ".ins-recommendation-product-container", o = ".ins-recommendation-desktop-container", t = ".ins-recommendation-mobile-container", _ = ".ins-recommendation-mobile-row", r = "reco-v3-button", R = "ins-skip-compile", e = {
|
|
2
2
|
CURRENCY: "currency",
|
|
3
3
|
SYMBOL: "currency-symbol",
|
|
4
4
|
ALIGNMENT: "currency-alignment",
|
|
5
5
|
THOUSAND_SEPARATOR: "currency-thousand-separator",
|
|
6
6
|
DECIMAL_SEPARATOR: "currency-decimal-separator",
|
|
7
7
|
DECIMAL_COUNT: "currency-decimal-count"
|
|
8
|
-
},
|
|
8
|
+
}, O = "productImage", s = "productName", E = "productPrice", i = "productOldPrice", A = "productOmnibusPrice", C = "productOmnibusDiscount", u = "productButton", S = "customAttr:", I = "data-custom-attributes", m = "product-attr", c = /* @__PURE__ */ new Set([
|
|
9
9
|
"name",
|
|
10
10
|
// productName
|
|
11
11
|
"price",
|
|
@@ -20,24 +20,30 @@ const T = ".recommendation-block-v2", c = ".ins-recommendation-product-container
|
|
|
20
20
|
// productOmnibusPrice
|
|
21
21
|
"omnibus_discount"
|
|
22
22
|
// productOmnibusDiscount
|
|
23
|
+
]), a = /* @__PURE__ */ new Set([
|
|
24
|
+
...c,
|
|
25
|
+
"currency",
|
|
26
|
+
"discount"
|
|
23
27
|
]);
|
|
24
28
|
export {
|
|
25
|
-
|
|
26
|
-
|
|
29
|
+
S as ATTR_CUSTOM_PREFIX,
|
|
30
|
+
I as ATTR_DATA_CUSTOM_ATTRIBUTES,
|
|
27
31
|
m as ATTR_PRODUCT_ATTR,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
+
u as ATTR_PRODUCT_BUTTON,
|
|
33
|
+
O as ATTR_PRODUCT_IMAGE,
|
|
34
|
+
s as ATTR_PRODUCT_NAME,
|
|
35
|
+
i as ATTR_PRODUCT_OLD_PRICE,
|
|
32
36
|
C as ATTR_PRODUCT_OMNIBUS_DISCOUNT,
|
|
33
|
-
|
|
34
|
-
|
|
37
|
+
A as ATTR_PRODUCT_OMNIBUS_PRICE,
|
|
38
|
+
E as ATTR_PRODUCT_PRICE,
|
|
35
39
|
T as BLOCK_ROOT_SELECTOR,
|
|
36
|
-
|
|
37
|
-
|
|
40
|
+
c as BUILT_IN_DEFAULT_ATTRIBUTES,
|
|
41
|
+
n as CONTAINER_SELECTOR,
|
|
38
42
|
r as CSS_CLASS_RECO_BUTTON,
|
|
39
|
-
|
|
43
|
+
R as CSS_CLASS_SKIP_COMPILE,
|
|
44
|
+
e as CURRENCY_ATTR,
|
|
40
45
|
o as DESKTOP_CONTAINER_SELECTOR,
|
|
41
|
-
|
|
42
|
-
|
|
46
|
+
t as MOBILE_CONTAINER_SELECTOR,
|
|
47
|
+
_ as MOBILE_ROW_SELECTOR,
|
|
48
|
+
a as RECOMMENDATION_VARIABLE_BUILTIN_ATTRIBUTES
|
|
43
49
|
};
|
|
@@ -3,7 +3,7 @@ var J = (p, _, t) => _ in p ? X(p, _, { enumerable: !0, configurable: !0, writab
|
|
|
3
3
|
var C = (p, _, t) => J(p, typeof _ != "symbol" ? _ + "" : _, t);
|
|
4
4
|
import { UIElementType as f, UEAttr as $, ModificationDescription as A } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
5
5
|
import { CommonControl as Q } from "../../../common-control.js";
|
|
6
|
-
import { ATTR_PRODUCT_IMAGE as
|
|
6
|
+
import { ATTR_PRODUCT_IMAGE as D, ATTR_PRODUCT_NAME as Z, ATTR_PRODUCT_PRICE as tt, ATTR_PRODUCT_OLD_PRICE as et, ATTR_PRODUCT_OMNIBUS_PRICE as rt, ATTR_PRODUCT_OMNIBUS_DISCOUNT as ot, ATTR_PRODUCT_BUTTON as L, ATTR_DATA_CUSTOM_ATTRIBUTES as H, ATTR_CUSTOM_PREFIX as m, BUILT_IN_DEFAULT_ATTRIBUTES as st } from "../../constants/selectors.js";
|
|
7
7
|
import { DEFAULT_COMPOSITION as q, DEFAULT_VISIBILITY as P } from "../../constants/defaultConfig.js";
|
|
8
8
|
import { RecommendationConfigService as it } from "../../services/configService.js";
|
|
9
9
|
import { useRecommendationExtensionStore as nt } from "../../store/recommendation.js";
|
|
@@ -11,19 +11,19 @@ import { ATTRIBUTE_CELL_CLASS as lt, gridElementRenderer as at, DEFAULT_CELL_PAD
|
|
|
11
11
|
import { listElementRenderer as ut } from "../../templates/list/elementRenderer.js";
|
|
12
12
|
import { toDisplayName as dt, isDefaultAttribute as mt, buildElementRenderer as F } from "../../templates/utils.js";
|
|
13
13
|
import { getTableDisplayValue as ht } from "../../utils/tagName.js";
|
|
14
|
-
import {
|
|
15
|
-
const
|
|
14
|
+
import { isPartnerManagedBlock as pt, getCurrentLayout as _t } from "../main/utils.js";
|
|
15
|
+
const ft = "ui-elements-recommendation-card-composition", S = ".recommendation-attribute-row", N = ".product-card-wrapper > tbody", w = ".product-info-cell > table > tbody", M = "data-card-composition", y = "data-attribute-type", I = "data-visibility", x = {
|
|
16
16
|
ADD_ATTRIBUTE: "addAttribute"
|
|
17
17
|
}, g = 5, v = "reorderIcon_", h = [
|
|
18
|
-
{ key:
|
|
18
|
+
{ key: D, label: "Product Image" },
|
|
19
19
|
{ key: Z, label: "Product Name" },
|
|
20
20
|
{ key: tt, label: "Product Price" },
|
|
21
21
|
{ key: et, label: "Product Original Price" },
|
|
22
22
|
{ key: rt, label: "Omnibus Price" },
|
|
23
23
|
{ key: ot, label: "Omnibus Discount" },
|
|
24
|
-
{ key:
|
|
25
|
-
],
|
|
26
|
-
class
|
|
24
|
+
{ key: L, label: "Product Button" }
|
|
25
|
+
], gt = new Set(h.map((p) => p.key)), T = "customAttr_", E = "deleteAttr_";
|
|
26
|
+
class Dt extends Q {
|
|
27
27
|
constructor() {
|
|
28
28
|
super(...arguments);
|
|
29
29
|
C(this, "store", nt());
|
|
@@ -36,7 +36,7 @@ class Nt extends Q {
|
|
|
36
36
|
C(this, "reorderInProgress", !1);
|
|
37
37
|
}
|
|
38
38
|
getId() {
|
|
39
|
-
return
|
|
39
|
+
return ft;
|
|
40
40
|
}
|
|
41
41
|
// ========================================================================
|
|
42
42
|
// Lifecycle
|
|
@@ -128,10 +128,24 @@ class Nt extends Q {
|
|
|
128
128
|
`;
|
|
129
129
|
}
|
|
130
130
|
onRender() {
|
|
131
|
-
this._initializeComposition(), this._registerValueChangeListeners(), this._setupEventListeners(), this._updateOrderableState(), this._subscribeToStoreChanges();
|
|
131
|
+
this._initializeComposition(), this._registerValueChangeListeners(), this._setupEventListeners(), this._updateOrderableState(), this._subscribeToStoreChanges(), this._syncDisabledState();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Card composition restructures the block (toggles/reorders/adds attribute
|
|
135
|
+
* cells), which would corrupt a partner-managed (`ins-skip-compile`) block's
|
|
136
|
+
* preserved markup. There is no native tab-disable API, so the whole control
|
|
137
|
+
* container is rendered inert (greyed + non-interactive) instead.
|
|
138
|
+
*/
|
|
139
|
+
_syncDisabledState() {
|
|
140
|
+
var e;
|
|
141
|
+
const t = (e = this.getContainer()) == null ? void 0 : e.querySelector("[data-card-composition-control]");
|
|
142
|
+
if (!t)
|
|
143
|
+
return;
|
|
144
|
+
const r = pt(this.currentNode);
|
|
145
|
+
t.style.pointerEvents = r ? "none" : "", t.style.opacity = r ? "0.5" : "";
|
|
132
146
|
}
|
|
133
147
|
onTemplateNodeUpdated(t) {
|
|
134
|
-
super.onTemplateNodeUpdated(t), !this.reorderInProgress && (this._initializeComposition(), this._updateOrderableState());
|
|
148
|
+
super.onTemplateNodeUpdated(t), !this.reorderInProgress && (this._initializeComposition(), this._updateOrderableState(), this._syncDisabledState());
|
|
135
149
|
}
|
|
136
150
|
onDestroy() {
|
|
137
151
|
super.onDestroy(), this.eventController && (this.eventController.abort(), this.eventController = null), this.unsubscribeStore && (this.unsubscribeStore(), this.unsubscribeStore = null);
|
|
@@ -168,7 +182,7 @@ class Nt extends Q {
|
|
|
168
182
|
_readCustomAttributesFromNode() {
|
|
169
183
|
if (!this.currentNode || !("getAttribute" in this.currentNode))
|
|
170
184
|
return [];
|
|
171
|
-
const t = this.currentNode.getAttribute(
|
|
185
|
+
const t = this.currentNode.getAttribute(H);
|
|
172
186
|
if (!t)
|
|
173
187
|
return [];
|
|
174
188
|
try {
|
|
@@ -224,7 +238,7 @@ class Nt extends Q {
|
|
|
224
238
|
const s = new Set(r);
|
|
225
239
|
let i = 0, n = 0;
|
|
226
240
|
const c = t.map((a) => {
|
|
227
|
-
if (
|
|
241
|
+
if (gt.has(a)) {
|
|
228
242
|
const l = h.find((u) => u.key === a);
|
|
229
243
|
return this._createBuiltInItemHtml(l, n++);
|
|
230
244
|
}
|
|
@@ -531,13 +545,13 @@ class Nt extends Q {
|
|
|
531
545
|
const i = it.getConfig(this.currentNode), c = `0 ${Math.floor(i.columnSpacing / 2)}px`, a = this.api.getDocumentModifier(), l = this.store.recommendationProducts.length;
|
|
532
546
|
let u = 0;
|
|
533
547
|
s.forEach((d) => {
|
|
534
|
-
var
|
|
535
|
-
const b = d.querySelector(S), R = ((
|
|
536
|
-
if (
|
|
548
|
+
var B;
|
|
549
|
+
const b = d.querySelector(S), R = ((B = b == null ? void 0 : b.querySelectorAll(`.${lt}`)) == null ? void 0 : B.length) || 1, V = (100 / R).toFixed(2), { bgStyle: j, bgAttr: W } = this._extractSegmentBgFromCard(d), K = o.map((U) => {
|
|
550
|
+
if (U === e) {
|
|
537
551
|
const z = Array.from(
|
|
538
552
|
{ length: R },
|
|
539
|
-
(
|
|
540
|
-
const G = l > 0 ? (u +
|
|
553
|
+
(bt, k) => {
|
|
554
|
+
const G = l > 0 ? (u + k) % l : k, Y = this._resolveAttributeContent(t, r, G);
|
|
541
555
|
return this._getGridCellHtml(
|
|
542
556
|
t,
|
|
543
557
|
Y,
|
|
@@ -551,7 +565,7 @@ class Nt extends Q {
|
|
|
551
565
|
return `<tr class="recommendation-attribute-row" ${y}="${e}" ${I}="1">${z}</tr>`;
|
|
552
566
|
}
|
|
553
567
|
const O = d.querySelector(
|
|
554
|
-
`${S}[${y}="${
|
|
568
|
+
`${S}[${y}="${U}"]`
|
|
555
569
|
);
|
|
556
570
|
return O && "getOuterHTML" in O ? O.getOuterHTML() : "";
|
|
557
571
|
}).join("");
|
|
@@ -562,7 +576,7 @@ class Nt extends Q {
|
|
|
562
576
|
const s = this.currentNode.querySelectorAll(w);
|
|
563
577
|
if (!(s != null && s.length))
|
|
564
578
|
return;
|
|
565
|
-
const i = o.filter((c) => c !==
|
|
579
|
+
const i = o.filter((c) => c !== D && c !== L), n = this.api.getDocumentModifier();
|
|
566
580
|
s.forEach((c, a) => {
|
|
567
581
|
const l = i.map((u) => {
|
|
568
582
|
if (u === e) {
|
|
@@ -592,7 +606,7 @@ class Nt extends Q {
|
|
|
592
606
|
e.modifyHtml(s).setInnerHtml(i);
|
|
593
607
|
});
|
|
594
608
|
} else {
|
|
595
|
-
const o = t.filter((i) => i !==
|
|
609
|
+
const o = t.filter((i) => i !== D && i !== L), s = this.currentNode.querySelectorAll(w);
|
|
596
610
|
s == null || s.forEach((i) => {
|
|
597
611
|
const n = this._buildCompositionHtml(i, o);
|
|
598
612
|
e.modifyHtml(i).setInnerHtml(n);
|
|
@@ -611,7 +625,7 @@ class Nt extends Q {
|
|
|
611
625
|
* producing a flicker on the custom attribute dropdowns.
|
|
612
626
|
*/
|
|
613
627
|
_updateBothAttributes(t, r) {
|
|
614
|
-
this.currentNode && this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute(M, t.join(",")).setAttribute(
|
|
628
|
+
this.currentNode && this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute(M, t.join(",")).setAttribute(H, JSON.stringify(r)).apply(new A(this.api.translate("Update card composition")));
|
|
615
629
|
}
|
|
616
630
|
/**
|
|
617
631
|
* Reorders attribute rows within each product card based on composition order.
|
|
@@ -673,7 +687,7 @@ class Nt extends Q {
|
|
|
673
687
|
return -1;
|
|
674
688
|
}
|
|
675
689
|
_getCurrentLayout() {
|
|
676
|
-
return this.store.recommendationConfigs.orientation ||
|
|
690
|
+
return this.store.recommendationConfigs.orientation || _t(this.currentNode);
|
|
677
691
|
}
|
|
678
692
|
/**
|
|
679
693
|
* Extracts background color properties from existing card elements.
|
|
@@ -789,6 +803,6 @@ class Nt extends Q {
|
|
|
789
803
|
}
|
|
790
804
|
}
|
|
791
805
|
export {
|
|
792
|
-
|
|
793
|
-
|
|
806
|
+
ft as COMPOSITION_CONTROL_BLOCK_ID,
|
|
807
|
+
Dt as RecommendationCardCompositionControl
|
|
794
808
|
};
|
|
@@ -6,26 +6,26 @@ import { DEFAULT_NODE_CONFIG as a } from "../../constants/defaultConfig.js";
|
|
|
6
6
|
import { RecommendationConfigService as h } from "../../services/configService.js";
|
|
7
7
|
import { useRecommendationExtensionStore as y } from "../../store/recommendation.js";
|
|
8
8
|
import { AlgorithmControl as N } from "./algorithm.js";
|
|
9
|
-
import { ALGORITHM_CONTROL_ID as
|
|
9
|
+
import { ALGORITHM_CONTROL_ID as X } from "./algorithm.js";
|
|
10
10
|
import { CurrencyControl as R } from "./currency.js";
|
|
11
|
-
import { CURRENCY_CONTROL_ID as
|
|
11
|
+
import { CURRENCY_CONTROL_ID as tt } from "./currency.js";
|
|
12
12
|
import { FiltersControl as _ } from "./filters.js";
|
|
13
|
-
import { FILTERS_CONTROL_ID as
|
|
13
|
+
import { FILTERS_CONTROL_ID as ot } from "./filters.js";
|
|
14
14
|
import { LayoutOrientationControl as b } from "./layoutOrientation.js";
|
|
15
|
-
import { LAYOUT_ORIENTATION_CONTROL_ID as
|
|
15
|
+
import { LAYOUT_ORIENTATION_CONTROL_ID as nt } from "./layoutOrientation.js";
|
|
16
16
|
import { LocaleControl as O } from "./locale.js";
|
|
17
|
-
import { LOCALE_CONTROL_ID as
|
|
17
|
+
import { LOCALE_CONTROL_ID as st } from "./locale.js";
|
|
18
18
|
import { ProductCountControl as I } from "./productCount.js";
|
|
19
|
-
import { PRODUCT_COUNT_CONTROL_ID as
|
|
19
|
+
import { PRODUCT_COUNT_CONTROL_ID as ct } from "./productCount.js";
|
|
20
20
|
import { ProductLayoutControl as T } from "./productLayout.js";
|
|
21
|
-
import { PRODUCT_LAYOUT_CONTROL_ID as
|
|
21
|
+
import { PRODUCT_LAYOUT_CONTROL_ID as ut } from "./productLayout.js";
|
|
22
22
|
import { ShuffleControl as S } from "./shuffle.js";
|
|
23
|
-
import { SHUFFLE_CONTROL_ID as
|
|
24
|
-
import { setCurrencyAttributes as L, getBlockElement as P,
|
|
25
|
-
import { adjustProductsToSize as
|
|
23
|
+
import { SHUFFLE_CONTROL_ID as ht } from "./shuffle.js";
|
|
24
|
+
import { setCurrencyAttributes as L, getBlockElement as P, isPartnerManagedBlock as D, updateProductContentInPlace as k, regenerateProductRowsWithStyles as E } from "./utils.js";
|
|
25
|
+
import { adjustProductsToSize as ft, formatProductPrice as Ct, getCardComposition as pt, getCurrentLayout as gt, reapplySpacing as yt, regenerateMobileProductRows as Nt, regenerateProductRows as Rt, updatePricesInPlace as _t, updateSingleProductContent as bt } from "./utils.js";
|
|
26
26
|
import { useDebounceFn as m } from "../../../../../node_modules/@vueuse/shared/index.js";
|
|
27
|
-
const
|
|
28
|
-
class
|
|
27
|
+
const v = "recommendation-id", A = "ui-elements-recommendation-block";
|
|
28
|
+
class q extends g {
|
|
29
29
|
constructor() {
|
|
30
30
|
super(...arguments);
|
|
31
31
|
s(this, "store", y());
|
|
@@ -59,14 +59,14 @@ class K extends g {
|
|
|
59
59
|
*/
|
|
60
60
|
s(this, "_debouncedRegenerateWithProducts", m(() => {
|
|
61
61
|
const t = this.store.recommendationProducts;
|
|
62
|
-
if (!this.currentNode || !this.api)
|
|
62
|
+
if (!this.currentNode || !this.api || D(this.currentNode))
|
|
63
63
|
return;
|
|
64
64
|
const e = this.api.getDocumentModifier();
|
|
65
|
-
|
|
65
|
+
k({
|
|
66
66
|
currentNode: this.currentNode,
|
|
67
67
|
documentModifier: e,
|
|
68
68
|
products: t
|
|
69
|
-
}) ||
|
|
69
|
+
}) || E({
|
|
70
70
|
currentNode: this.currentNode,
|
|
71
71
|
documentModifier: e,
|
|
72
72
|
products: t
|
|
@@ -74,7 +74,7 @@ class K extends g {
|
|
|
74
74
|
}, 100));
|
|
75
75
|
}
|
|
76
76
|
getId() {
|
|
77
|
-
return
|
|
77
|
+
return A;
|
|
78
78
|
}
|
|
79
79
|
getTemplate() {
|
|
80
80
|
return this.algorithmControl = new N(), this.localeControl = new O(), this.currencyControl = new R(), this.productCountControl = new I(), this.productLayoutControl = new T(), this.filtersControl = new _(), this.shuffleControl = new S(), this.layoutOrientationControl = new b(), [
|
|
@@ -290,7 +290,7 @@ class K extends g {
|
|
|
290
290
|
const e = P(t);
|
|
291
291
|
if (!e || !("getAttribute" in e))
|
|
292
292
|
return null;
|
|
293
|
-
const o = e.getAttribute(
|
|
293
|
+
const o = e.getAttribute(v);
|
|
294
294
|
if (!o)
|
|
295
295
|
return null;
|
|
296
296
|
const r = parseInt(o);
|
|
@@ -341,35 +341,36 @@ class K extends g {
|
|
|
341
341
|
}
|
|
342
342
|
}
|
|
343
343
|
export {
|
|
344
|
-
|
|
344
|
+
X as ALGORITHM_CONTROL_ID,
|
|
345
345
|
N as AlgorithmControl,
|
|
346
|
-
|
|
347
|
-
|
|
346
|
+
A as CONTROL_BLOCK_ID,
|
|
347
|
+
tt as CURRENCY_CONTROL_ID,
|
|
348
348
|
R as CurrencyControl,
|
|
349
|
-
|
|
349
|
+
ot as FILTERS_CONTROL_ID,
|
|
350
350
|
_ as FiltersControl,
|
|
351
|
-
|
|
352
|
-
|
|
351
|
+
nt as LAYOUT_ORIENTATION_CONTROL_ID,
|
|
352
|
+
st as LOCALE_CONTROL_ID,
|
|
353
353
|
b as LayoutOrientationControl,
|
|
354
354
|
O as LocaleControl,
|
|
355
|
-
|
|
356
|
-
|
|
355
|
+
ct as PRODUCT_COUNT_CONTROL_ID,
|
|
356
|
+
ut as PRODUCT_LAYOUT_CONTROL_ID,
|
|
357
357
|
I as ProductCountControl,
|
|
358
358
|
T as ProductLayoutControl,
|
|
359
|
-
|
|
360
|
-
|
|
359
|
+
q as RecommendationBlockControl,
|
|
360
|
+
ht as SHUFFLE_CONTROL_ID,
|
|
361
361
|
S as ShuffleControl,
|
|
362
|
-
|
|
363
|
-
|
|
362
|
+
ft as adjustProductsToSize,
|
|
363
|
+
Ct as formatProductPrice,
|
|
364
364
|
P as getBlockElement,
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
yt as
|
|
369
|
-
Nt as
|
|
370
|
-
|
|
365
|
+
pt as getCardComposition,
|
|
366
|
+
gt as getCurrentLayout,
|
|
367
|
+
D as isPartnerManagedBlock,
|
|
368
|
+
yt as reapplySpacing,
|
|
369
|
+
Nt as regenerateMobileProductRows,
|
|
370
|
+
Rt as regenerateProductRows,
|
|
371
|
+
E as regenerateProductRowsWithStyles,
|
|
371
372
|
L as setCurrencyAttributes,
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
373
|
+
_t as updatePricesInPlace,
|
|
374
|
+
k as updateProductContentInPlace,
|
|
375
|
+
bt as updateSingleProductContent
|
|
375
376
|
};
|