@useinsider/guido 3.8.1-beta.6c0ee3f → 3.8.1-beta.7e47cd7
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/config/migrator/itemsBlockMigrator.js +154 -115
- package/dist/extensions/Blocks/Items/template.js +26 -27
- package/dist/extensions/Blocks/Recommendation/block.js +1 -4
- package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +137 -154
- package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +10 -10
- package/dist/extensions/Blocks/controlFactories.js +57 -76
- package/dist/src/extensions/Blocks/CouponBlock/controls/index.d.ts +1 -1
- package/dist/src/extensions/Blocks/Items/controls/index.d.ts +3 -3
- package/dist/src/extensions/Blocks/Recommendation/controls/name/index.d.ts +1 -1
- package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/index.d.ts +1 -1
- package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.d.ts +1 -1
- package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/index.d.ts +1 -1
- package/dist/src/extensions/Blocks/Recommendation/controls/price/index.d.ts +1 -1
- package/dist/src/extensions/Blocks/controlFactories.d.ts +1 -10
- package/package.json +1 -1
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var T = (p,
|
|
4
|
-
import { UIElementType as f, UEAttr as
|
|
5
|
-
import { CommonControl as
|
|
6
|
-
import { ATTR_PRODUCT_IMAGE as
|
|
7
|
-
import { DEFAULT_COMPOSITION as P, DEFAULT_VISIBILITY as
|
|
8
|
-
import { RecommendationConfigService as
|
|
1
|
+
var J = Object.defineProperty;
|
|
2
|
+
var Q = (p, _, t) => _ in p ? J(p, _, { enumerable: !0, configurable: !0, writable: !0, value: t }) : p[_] = t;
|
|
3
|
+
var T = (p, _, t) => Q(p, typeof _ != "symbol" ? _ + "" : _, t);
|
|
4
|
+
import { UIElementType as f, UEAttr as I, ModificationDescription as A } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
5
|
+
import { CommonControl as Z } from "../../../common-control.js";
|
|
6
|
+
import { ATTR_PRODUCT_IMAGE as L, ATTR_PRODUCT_NAME as tt, ATTR_PRODUCT_PRICE as et, ATTR_PRODUCT_OLD_PRICE as rt, ATTR_PRODUCT_OMNIBUS_PRICE as ot, ATTR_PRODUCT_OMNIBUS_DISCOUNT as st, ATTR_PRODUCT_BUTTON as B, ATTR_DATA_CUSTOM_ATTRIBUTES as q, ATTR_CUSTOM_PREFIX as m, BUILT_IN_DEFAULT_ATTRIBUTES as it } from "../../constants/selectors.js";
|
|
7
|
+
import { DEFAULT_COMPOSITION as P, DEFAULT_VISIBILITY as F } from "../../constants/defaultConfig.js";
|
|
8
|
+
import { RecommendationConfigService as nt } from "../../services/configService.js";
|
|
9
9
|
import { useRecommendationExtensionStore as lt } from "../../store/recommendation.js";
|
|
10
10
|
import { ATTRIBUTE_CELL_CLASS as at, gridElementRenderer as ct, DEFAULT_CELL_PADDING as ut, buildFillerCell as dt } from "../../templates/grid/elementRenderer.js";
|
|
11
11
|
import { listElementRenderer as mt } from "../../templates/list/elementRenderer.js";
|
|
12
|
-
import { toDisplayName as ht, isDefaultAttribute as pt, toDisplayableAttributeValue as
|
|
12
|
+
import { toDisplayName as ht, isDefaultAttribute as pt, toDisplayableAttributeValue as _t, buildElementRenderer as w } from "../../templates/utils.js";
|
|
13
13
|
import { getTableDisplayValue as ft } from "../../utils/tagName.js";
|
|
14
|
-
import { isPartnerManagedBlock as
|
|
15
|
-
const yt = "ui-elements-recommendation-card-composition",
|
|
14
|
+
import { isPartnerManagedBlock as gt, getCurrentLayout as bt } from "../main/utils.js";
|
|
15
|
+
const yt = "ui-elements-recommendation-card-composition", S = ".recommendation-attribute-row", N = ".product-card-wrapper > tbody", M = ".product-info-cell > table > tbody", V = "data-card-composition", y = "data-attribute-type", v = "data-visibility", x = {
|
|
16
16
|
ADD_ATTRIBUTE: "addAttribute"
|
|
17
|
-
},
|
|
18
|
-
{ key:
|
|
19
|
-
{ key:
|
|
20
|
-
{ key:
|
|
21
|
-
{ key:
|
|
22
|
-
{ key:
|
|
23
|
-
{ key:
|
|
24
|
-
{ key:
|
|
25
|
-
],
|
|
26
|
-
class
|
|
17
|
+
}, g = 5, E = "reorderIcon_", h = [
|
|
18
|
+
{ key: L, label: "Product Image" },
|
|
19
|
+
{ key: tt, label: "Product Name" },
|
|
20
|
+
{ key: et, label: "Product Price" },
|
|
21
|
+
{ key: rt, label: "Product Original Price" },
|
|
22
|
+
{ key: ot, label: "Omnibus Price" },
|
|
23
|
+
{ key: st, label: "Omnibus Discount" },
|
|
24
|
+
{ key: B, label: "Product Button" }
|
|
25
|
+
], At = new Set(h.map((p) => p.key)), C = "customAttr_", R = "deleteAttr_";
|
|
26
|
+
class Ut extends Z {
|
|
27
27
|
constructor() {
|
|
28
28
|
super(...arguments);
|
|
29
29
|
T(this, "store", lt());
|
|
@@ -47,23 +47,23 @@ class Ht extends tt {
|
|
|
47
47
|
${this._GuToggle(`visibility_${l.key}`)}
|
|
48
48
|
</div>
|
|
49
49
|
`).join(""), r = Array.from(
|
|
50
|
-
{ length:
|
|
50
|
+
{ length: g },
|
|
51
51
|
(l, u) => `
|
|
52
|
-
<div data-custom-select-key="${
|
|
52
|
+
<div data-custom-select-key="${C}${u}" style="display: none;">
|
|
53
53
|
${this._GuSelect({
|
|
54
|
-
name: `${
|
|
54
|
+
name: `${C}${u}`,
|
|
55
55
|
placeholder: this.api.translate("Select Attribute"),
|
|
56
56
|
options: []
|
|
57
57
|
})}
|
|
58
58
|
</div>
|
|
59
59
|
`
|
|
60
|
-
).join(""), e = h.length +
|
|
60
|
+
).join(""), e = h.length + g, o = Array.from(
|
|
61
61
|
{ length: e },
|
|
62
62
|
(l, u) => `
|
|
63
63
|
<div data-reorder-icon-key="${E}${u}" style="display: none;">
|
|
64
64
|
<${f.BUTTON}
|
|
65
65
|
class="drag-handle-btn flat-inline flat-white"
|
|
66
|
-
${
|
|
66
|
+
${I.BUTTON.name}="${E}${u}"
|
|
67
67
|
>
|
|
68
68
|
<${f.ICON}
|
|
69
69
|
src="reorder"
|
|
@@ -73,12 +73,12 @@ class Ht extends tt {
|
|
|
73
73
|
</div>
|
|
74
74
|
`
|
|
75
75
|
).join(""), s = Array.from(
|
|
76
|
-
{ length:
|
|
76
|
+
{ length: g },
|
|
77
77
|
(l, u) => `
|
|
78
78
|
<div data-custom-delete-key="${R}${u}" style="display: none;">
|
|
79
79
|
<${f.BUTTON}
|
|
80
80
|
class="custom-attr-delete flat-inline flat-white"
|
|
81
|
-
${
|
|
81
|
+
${I.BUTTON.name}="${R}${u}"
|
|
82
82
|
>
|
|
83
83
|
<${f.ICON}
|
|
84
84
|
src="delete"
|
|
@@ -89,15 +89,15 @@ class Ht extends tt {
|
|
|
89
89
|
`
|
|
90
90
|
).join(""), i = "https://academy.insiderone.com/docs/new-editor-email-recommendation-block", n = this.api.translate(
|
|
91
91
|
"Drag and drop the card elements to reorder them, adjust their visibility or add new attributes up to 5."
|
|
92
|
-
),
|
|
92
|
+
), a = this.api.translate("For more information, you can"), c = this.api.translate("visit Academy");
|
|
93
93
|
return `
|
|
94
94
|
<div class="recommendation-controls-container" data-card-composition-control>
|
|
95
95
|
<div class="container">
|
|
96
96
|
<p class="card-composition-description">
|
|
97
97
|
${n}
|
|
98
|
-
${
|
|
98
|
+
${a}
|
|
99
99
|
<!-- cspell:disable-next-line -->
|
|
100
|
-
<a href="${i}" target="_blank" rel="noopener noreferrer">${
|
|
100
|
+
<a href="${i}" target="_blank" rel="noopener noreferrer">${c}</a>.
|
|
101
101
|
</p>
|
|
102
102
|
</div>
|
|
103
103
|
|
|
@@ -120,7 +120,7 @@ class Ht extends tt {
|
|
|
120
120
|
<div class="orderable-list" data-composition-list></div>
|
|
121
121
|
|
|
122
122
|
${this._GuButton({
|
|
123
|
-
name:
|
|
123
|
+
name: x.ADD_ATTRIBUTE,
|
|
124
124
|
label: this.api.translate("Add Attribute"),
|
|
125
125
|
id: "guido__btn-add-attribute"
|
|
126
126
|
})}
|
|
@@ -141,7 +141,7 @@ class Ht extends tt {
|
|
|
141
141
|
const t = (e = this.getContainer()) == null ? void 0 : e.querySelector("[data-card-composition-control]");
|
|
142
142
|
if (!t)
|
|
143
143
|
return;
|
|
144
|
-
const r =
|
|
144
|
+
const r = gt(this.currentNode);
|
|
145
145
|
t.style.pointerEvents = r ? "none" : "", t.style.opacity = r ? "0.5" : "";
|
|
146
146
|
}
|
|
147
147
|
onTemplateNodeUpdated(t) {
|
|
@@ -163,8 +163,8 @@ class Ht extends tt {
|
|
|
163
163
|
this._applyVisibilityToBlock(t.key, r);
|
|
164
164
|
});
|
|
165
165
|
});
|
|
166
|
-
for (let t = 0; t <
|
|
167
|
-
const r = `${
|
|
166
|
+
for (let t = 0; t < g; t++) {
|
|
167
|
+
const r = `${C}${t}`, e = t;
|
|
168
168
|
this.api.onValueChanged(r, (o) => {
|
|
169
169
|
this._onCustomAttributeChanged(e, o);
|
|
170
170
|
});
|
|
@@ -176,42 +176,36 @@ class Ht extends tt {
|
|
|
176
176
|
_readCompositionFromNode() {
|
|
177
177
|
if (!this.currentNode || !("getAttribute" in this.currentNode))
|
|
178
178
|
return [...P];
|
|
179
|
-
const t = this.currentNode.getAttribute(
|
|
180
|
-
|
|
181
|
-
return t.split(",").filter(Boolean);
|
|
182
|
-
const { composition: r } = $.getConfig(this.currentNode);
|
|
183
|
-
return r != null && r.length ? [...r] : [...P];
|
|
179
|
+
const t = this.currentNode.getAttribute(V);
|
|
180
|
+
return t ? t.split(",").filter(Boolean) : [...P];
|
|
184
181
|
}
|
|
185
182
|
_readCustomAttributesFromNode() {
|
|
186
183
|
if (!this.currentNode || !("getAttribute" in this.currentNode))
|
|
187
184
|
return [];
|
|
188
|
-
const t = this.currentNode.getAttribute(
|
|
189
|
-
if (t)
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
185
|
+
const t = this.currentNode.getAttribute(q);
|
|
186
|
+
if (!t)
|
|
187
|
+
return [];
|
|
188
|
+
try {
|
|
189
|
+
return JSON.parse(t);
|
|
190
|
+
} catch {
|
|
191
|
+
return [];
|
|
192
|
+
}
|
|
196
193
|
}
|
|
197
194
|
_readVisibilityFromRows() {
|
|
198
195
|
if (!this.currentNode)
|
|
199
196
|
return this._getDefaultVisibilities();
|
|
200
|
-
const t = Array.from(this.currentNode.querySelectorAll(
|
|
201
|
-
|
|
202
|
-
return this._mergeWithDefaults(r);
|
|
203
|
-
const e = $.getConfig(this.currentNode).visibility;
|
|
204
|
-
return this._mergeWithDefaults({ ...e });
|
|
197
|
+
const t = Array.from(this.currentNode.querySelectorAll(S)), r = this._extractVisibilityFromRows(t);
|
|
198
|
+
return this._mergeWithDefaults(r);
|
|
205
199
|
}
|
|
206
200
|
_getDefaultVisibilities() {
|
|
207
|
-
return { ...
|
|
201
|
+
return { ...F };
|
|
208
202
|
}
|
|
209
203
|
_extractVisibilityFromRows(t) {
|
|
210
204
|
const r = {};
|
|
211
205
|
return t.forEach((e) => {
|
|
212
206
|
if (!("getAttribute" in e))
|
|
213
207
|
return;
|
|
214
|
-
const o = e.getAttribute(y), s = e.getAttribute(
|
|
208
|
+
const o = e.getAttribute(y), s = e.getAttribute(v);
|
|
215
209
|
o && s !== null && (r[o] = this._parseVisibilityValue(s));
|
|
216
210
|
}), r;
|
|
217
211
|
}
|
|
@@ -219,7 +213,7 @@ class Ht extends tt {
|
|
|
219
213
|
return t === "1" || t === "true";
|
|
220
214
|
}
|
|
221
215
|
_mergeWithDefaults(t) {
|
|
222
|
-
return Object.entries(
|
|
216
|
+
return Object.entries(F).forEach(([r, e]) => {
|
|
223
217
|
r in t || (t[r] = e);
|
|
224
218
|
}), t;
|
|
225
219
|
}
|
|
@@ -243,19 +237,19 @@ class Ht extends tt {
|
|
|
243
237
|
return !1;
|
|
244
238
|
const s = new Set(r);
|
|
245
239
|
let i = 0, n = 0;
|
|
246
|
-
const
|
|
247
|
-
if (
|
|
248
|
-
const l = h.find((u) => u.key ===
|
|
240
|
+
const a = t.map((c) => {
|
|
241
|
+
if (At.has(c)) {
|
|
242
|
+
const l = h.find((u) => u.key === c);
|
|
249
243
|
return this._createBuiltInItemHtml(l, n++);
|
|
250
244
|
}
|
|
251
|
-
if (
|
|
252
|
-
const l =
|
|
245
|
+
if (c.startsWith(m)) {
|
|
246
|
+
const l = c.substring(m.length);
|
|
253
247
|
if (s.has(l))
|
|
254
|
-
return this._createCustomItemHtml(
|
|
248
|
+
return this._createCustomItemHtml(c, i++, n++);
|
|
255
249
|
}
|
|
256
250
|
return "";
|
|
257
251
|
}).join("");
|
|
258
|
-
return this._rescueTogglesToStore(e), this._rescueSelectsToStore(e), this._rescueDeleteButtonsToStore(e), this._rescueReorderIconsToStore(e), o.innerHTML =
|
|
252
|
+
return this._rescueTogglesToStore(e), this._rescueSelectsToStore(e), this._rescueDeleteButtonsToStore(e), this._rescueReorderIconsToStore(e), o.innerHTML = a, this._moveTogglesIntoItems(e), this._moveSelectsIntoItems(e, r.length), this._moveDeleteButtonsIntoItems(e, r.length), this._moveReorderIconsIntoItems(e, n), !0;
|
|
259
253
|
}
|
|
260
254
|
/**
|
|
261
255
|
* Attempts to reorder existing orderable-item elements to match the composition order.
|
|
@@ -267,27 +261,27 @@ class Ht extends tt {
|
|
|
267
261
|
const e = Array.from(t.querySelectorAll(".orderable-item"));
|
|
268
262
|
if (e.length !== r.length)
|
|
269
263
|
return !1;
|
|
270
|
-
const o = e.map((
|
|
264
|
+
const o = e.map((c) => c.dataset.key).filter(Boolean);
|
|
271
265
|
if (o.length !== r.length)
|
|
272
266
|
return !1;
|
|
273
267
|
const s = [...o].sort().join(","), i = [...r].sort().join(",");
|
|
274
|
-
if (s !== i || r.some((
|
|
268
|
+
if (s !== i || r.some((c) => c.startsWith(m)))
|
|
275
269
|
return !1;
|
|
276
270
|
const n = /* @__PURE__ */ new Map();
|
|
277
|
-
e.forEach((
|
|
278
|
-
const { key: l } =
|
|
271
|
+
e.forEach((c) => {
|
|
272
|
+
const { key: l } = c.dataset;
|
|
279
273
|
if (l) {
|
|
280
274
|
const u = n.get(l) || [];
|
|
281
|
-
u.push(
|
|
275
|
+
u.push(c), n.set(l, u);
|
|
282
276
|
}
|
|
283
277
|
});
|
|
284
|
-
const
|
|
285
|
-
return r.forEach((
|
|
286
|
-
const l = n.get(
|
|
278
|
+
const a = /* @__PURE__ */ new Map();
|
|
279
|
+
return r.forEach((c) => {
|
|
280
|
+
const l = n.get(c);
|
|
287
281
|
if (!l)
|
|
288
282
|
return;
|
|
289
|
-
const u =
|
|
290
|
-
|
|
283
|
+
const u = a.get(c) || 0;
|
|
284
|
+
a.set(c, u + 1), l[u] && t.appendChild(l[u]);
|
|
291
285
|
}), !0;
|
|
292
286
|
}
|
|
293
287
|
_createBuiltInItemHtml(t, r) {
|
|
@@ -335,8 +329,8 @@ class Ht extends tt {
|
|
|
335
329
|
_initializeCustomSelects(t) {
|
|
336
330
|
t.length !== 0 && setTimeout(() => {
|
|
337
331
|
t.forEach((r, e) => {
|
|
338
|
-
const o = `${
|
|
339
|
-
this.api.setUIEAttribute(o,
|
|
332
|
+
const o = `${C}${e}`, s = this._getSelectOptions(r, t);
|
|
333
|
+
this.api.setUIEAttribute(o, I.SELECTPICKER.items, s), this.api.updateValues({ [o]: r });
|
|
340
334
|
});
|
|
341
335
|
}, 0);
|
|
342
336
|
}
|
|
@@ -359,7 +353,7 @@ class Ht extends tt {
|
|
|
359
353
|
*/
|
|
360
354
|
_moveSelectsIntoItems(t, r) {
|
|
361
355
|
for (let e = 0; e < r; e++) {
|
|
362
|
-
const o = `${
|
|
356
|
+
const o = `${C}${e}`, s = t.querySelector(`[data-custom-select-key="${o}"]`), i = t.querySelector(`[data-custom-select-slot="${e}"]`);
|
|
363
357
|
if (s && i) {
|
|
364
358
|
const n = s.querySelector("ue-select");
|
|
365
359
|
n && i.appendChild(n);
|
|
@@ -386,8 +380,8 @@ class Ht extends tt {
|
|
|
386
380
|
* Same rescue pattern as _rescueTogglesToStore — prevents innerHTML from destroying them.
|
|
387
381
|
*/
|
|
388
382
|
_rescueSelectsToStore(t) {
|
|
389
|
-
for (let r = 0; r <
|
|
390
|
-
const e = `${
|
|
383
|
+
for (let r = 0; r < g; r++) {
|
|
384
|
+
const e = `${C}${r}`, o = t.querySelector(`[data-custom-select-key="${e}"]`), s = t.querySelector(`[data-custom-select-slot="${r}"]`);
|
|
391
385
|
if (s) {
|
|
392
386
|
const i = s.querySelector("ue-select");
|
|
393
387
|
i && o && o.appendChild(i);
|
|
@@ -412,7 +406,7 @@ class Ht extends tt {
|
|
|
412
406
|
* Same rescue pattern as _rescueSelectsToStore — prevents innerHTML from destroying them.
|
|
413
407
|
*/
|
|
414
408
|
_rescueDeleteButtonsToStore(t) {
|
|
415
|
-
for (let r = 0; r <
|
|
409
|
+
for (let r = 0; r < g; r++) {
|
|
416
410
|
const e = `${R}${r}`, o = t.querySelector(`[data-custom-delete-key="${e}"]`), s = t.querySelector(`[data-custom-delete-slot="${r}"]`);
|
|
417
411
|
if (s) {
|
|
418
412
|
const i = s.querySelector("ue-button");
|
|
@@ -438,7 +432,7 @@ class Ht extends tt {
|
|
|
438
432
|
* Same rescue pattern as _rescueDeleteButtonsToStore — prevents innerHTML from destroying them.
|
|
439
433
|
*/
|
|
440
434
|
_rescueReorderIconsToStore(t) {
|
|
441
|
-
const r = h.length +
|
|
435
|
+
const r = h.length + g;
|
|
442
436
|
for (let e = 0; e < r; e++) {
|
|
443
437
|
const o = `${E}${e}`, s = t.querySelector(`[data-reorder-icon-key="${o}"]`), i = t.querySelector(`[data-reorder-icon-slot="${e}"]`);
|
|
444
438
|
if (i) {
|
|
@@ -464,24 +458,24 @@ class Ht extends tt {
|
|
|
464
458
|
_setupDragAndDrop(t, r) {
|
|
465
459
|
let e = null, o = null;
|
|
466
460
|
t.addEventListener("dragstart", (s) => {
|
|
467
|
-
var
|
|
461
|
+
var a;
|
|
468
462
|
const n = s.target.closest(".orderable-item");
|
|
469
|
-
n && (e = n, n.classList.add("dragging"), (
|
|
463
|
+
n && (e = n, n.classList.add("dragging"), (a = s.dataTransfer) == null || a.setData("text/plain", n.dataset.key || ""));
|
|
470
464
|
}, { signal: r }), t.addEventListener("dragend", () => {
|
|
471
465
|
e && e.classList.remove("dragging"), e = null, o == null || o.classList.remove("drag-over"), o = null;
|
|
472
466
|
}, { signal: r }), t.addEventListener("dragover", (s) => {
|
|
473
467
|
s.preventDefault();
|
|
474
|
-
const n = s.target.closest(".orderable-item"),
|
|
475
|
-
|
|
468
|
+
const n = s.target.closest(".orderable-item"), a = n && n !== e ? n : null;
|
|
469
|
+
a !== o && (o == null || o.classList.remove("drag-over"), o = a, o == null || o.classList.add("drag-over"));
|
|
476
470
|
}, { signal: r }), t.addEventListener("drop", (s) => {
|
|
477
471
|
s.preventDefault();
|
|
478
472
|
const n = s.target.closest(".orderable-item");
|
|
479
473
|
if (!n || !e || n === e)
|
|
480
474
|
return;
|
|
481
|
-
const
|
|
482
|
-
s.clientY <
|
|
483
|
-
const u = t.querySelectorAll(".orderable-item"),
|
|
484
|
-
this._onReorder(
|
|
475
|
+
const a = n.getBoundingClientRect(), c = a.top + a.height / 2;
|
|
476
|
+
s.clientY < c ? t.insertBefore(e, n) : t.insertBefore(e, n.nextSibling), o == null || o.classList.remove("drag-over"), o = null, e.classList.remove("dragging");
|
|
477
|
+
const u = t.querySelectorAll(".orderable-item"), d = Array.from(u).map((b) => b.dataset.key).filter(Boolean);
|
|
478
|
+
this._onReorder(d), e = null;
|
|
485
479
|
}, { signal: r });
|
|
486
480
|
}
|
|
487
481
|
_setupDeleteHandler(t, r) {
|
|
@@ -497,7 +491,7 @@ class Ht extends tt {
|
|
|
497
491
|
// Actions (Add, Delete, Reorder)
|
|
498
492
|
// ========================================================================
|
|
499
493
|
_onAddAttribute(t, r) {
|
|
500
|
-
const e = `${
|
|
494
|
+
const e = `${m}${t}`, o = this._readCompositionFromNode();
|
|
501
495
|
o.push(e);
|
|
502
496
|
const s = [...this._readCustomAttributesFromNode(), t];
|
|
503
497
|
this._updateBothAttributes(o, s), this._injectCustomAttributeHtml(t, r, e, o), this._renderOrderableItems(o, s), this._initializeCustomSelects(s), this._updateAddButtonState();
|
|
@@ -510,7 +504,7 @@ class Ht extends tt {
|
|
|
510
504
|
const r = this._readCustomAttributesFromNode();
|
|
511
505
|
if (r[t] === void 0)
|
|
512
506
|
return;
|
|
513
|
-
const o = this._readCompositionFromNode(), s = this._findNthCustomKeyIndex(o, t), i = o.filter((
|
|
507
|
+
const o = this._readCompositionFromNode(), s = this._findNthCustomKeyIndex(o, t), i = o.filter((a, c) => c !== s), n = r.filter((a, c) => c !== t);
|
|
514
508
|
this._updateBothAttributes(i, n), this._removeCustomAttributeHtml(i), this._renderOrderableItems(i, n), this._initializeCustomSelects(n), this._updateAddButtonState();
|
|
515
509
|
}
|
|
516
510
|
/**
|
|
@@ -521,13 +515,13 @@ class Ht extends tt {
|
|
|
521
515
|
const e = this._readCustomAttributesFromNode(), o = e[t];
|
|
522
516
|
if (o === void 0 || o === r)
|
|
523
517
|
return;
|
|
524
|
-
const s = `${
|
|
518
|
+
const s = `${m}${r}`, i = this._readCompositionFromNode(), n = this._findNthCustomKeyIndex(i, t);
|
|
525
519
|
n !== -1 && (i[n] = s), e[t] = r;
|
|
526
|
-
const
|
|
527
|
-
this._updateBothAttributes(i, e), this._injectCustomAttributeHtml(r,
|
|
520
|
+
const a = this._getDisplayNameForAttribute(r);
|
|
521
|
+
this._updateBothAttributes(i, e), this._injectCustomAttributeHtml(r, a, s, i), this._renderOrderableItems(i, e), this._initializeCustomSelects(e);
|
|
528
522
|
}
|
|
529
523
|
_onReorder(t) {
|
|
530
|
-
const r = t.filter((e) => e.startsWith(
|
|
524
|
+
const r = t.filter((e) => e.startsWith(m)).map((e) => e.substring(m.length));
|
|
531
525
|
this.reorderInProgress = !0;
|
|
532
526
|
try {
|
|
533
527
|
this._updateBothAttributes(t, r), this._getCurrentLayout() === "grid" && this._reorderProductAttributes(t);
|
|
@@ -545,61 +539,61 @@ class Ht extends tt {
|
|
|
545
539
|
this._getCurrentLayout() === "grid" ? this._injectGridAttributeRow(t, r, e, o) : this._injectListAttributeRow(t, r, e, o);
|
|
546
540
|
}
|
|
547
541
|
_injectGridAttributeRow(t, r, e, o) {
|
|
548
|
-
const s = this.currentNode.querySelectorAll(
|
|
542
|
+
const s = this.currentNode.querySelectorAll(N);
|
|
549
543
|
if (!(s != null && s.length))
|
|
550
544
|
return;
|
|
551
|
-
const i =
|
|
545
|
+
const i = nt.getConfig(this.currentNode), a = `0 ${Math.floor(i.columnSpacing / 2)}px`, c = this.api.getDocumentModifier(), l = this.store.recommendationProducts.length;
|
|
552
546
|
let u = 0;
|
|
553
|
-
s.forEach((
|
|
547
|
+
s.forEach((d) => {
|
|
554
548
|
var k;
|
|
555
|
-
const b =
|
|
556
|
-
if (
|
|
557
|
-
const
|
|
549
|
+
const b = d.querySelector(S), $ = ((k = b == null ? void 0 : b.querySelectorAll(`.${at}`)) == null ? void 0 : k.length) || 1, U = (100 / $).toFixed(2), { bgStyle: j, bgAttr: W } = this._extractSegmentBgFromCard(d), O = l > 0 ? Math.min($, l - u) : $, K = o.map((H) => {
|
|
550
|
+
if (H === e) {
|
|
551
|
+
const z = Array.from(
|
|
558
552
|
{ length: O },
|
|
559
|
-
(
|
|
560
|
-
const
|
|
553
|
+
(St, Y) => {
|
|
554
|
+
const X = this._resolveAttributeContent(
|
|
561
555
|
t,
|
|
562
556
|
r,
|
|
563
|
-
u +
|
|
557
|
+
u + Y
|
|
564
558
|
);
|
|
565
559
|
return this._getGridCellHtml(
|
|
566
560
|
t,
|
|
567
|
-
|
|
561
|
+
X,
|
|
568
562
|
U,
|
|
563
|
+
j,
|
|
569
564
|
W,
|
|
570
|
-
|
|
571
|
-
c
|
|
565
|
+
a
|
|
572
566
|
);
|
|
573
567
|
}
|
|
574
|
-
).join(""),
|
|
575
|
-
return `<tr class="recommendation-attribute-row" ${y}="${e}" ${
|
|
568
|
+
).join(""), G = dt(U, a).repeat($ - O);
|
|
569
|
+
return `<tr class="recommendation-attribute-row" ${y}="${e}" ${v}="1">${z}${G}</tr>`;
|
|
576
570
|
}
|
|
577
|
-
const D =
|
|
578
|
-
`${
|
|
571
|
+
const D = d.querySelector(
|
|
572
|
+
`${S}[${y}="${H}"]`
|
|
579
573
|
);
|
|
580
574
|
return D && "getOuterHTML" in D ? D.getOuterHTML() : "";
|
|
581
575
|
}).join("");
|
|
582
|
-
u += O, l > 0 && u >= l && (u = 0),
|
|
583
|
-
}),
|
|
576
|
+
u += O, l > 0 && u >= l && (u = 0), c.modifyHtml(d).setInnerHtml(K);
|
|
577
|
+
}), c.apply(new A(`${this.api.translate("Add custom attribute")}: ${r}`));
|
|
584
578
|
}
|
|
585
579
|
_injectListAttributeRow(t, r, e, o) {
|
|
586
|
-
const s = this.currentNode.querySelectorAll(
|
|
580
|
+
const s = this.currentNode.querySelectorAll(M);
|
|
587
581
|
if (!(s != null && s.length))
|
|
588
582
|
return;
|
|
589
|
-
const i = o.filter((
|
|
590
|
-
s.forEach((
|
|
583
|
+
const i = o.filter((a) => a !== L && a !== B), n = this.api.getDocumentModifier();
|
|
584
|
+
s.forEach((a, c) => {
|
|
591
585
|
const l = i.map((u) => {
|
|
592
586
|
if (u === e) {
|
|
593
|
-
const b = this._resolveAttributeContent(t, r,
|
|
587
|
+
const b = this._resolveAttributeContent(t, r, c);
|
|
594
588
|
return this._getListRowHtml(t, b, e);
|
|
595
589
|
}
|
|
596
|
-
const
|
|
597
|
-
`${
|
|
590
|
+
const d = a.querySelector(
|
|
591
|
+
`${S}[${y}="${u}"]`
|
|
598
592
|
);
|
|
599
|
-
return
|
|
593
|
+
return d && "getOuterHTML" in d ? d.getOuterHTML() : "";
|
|
600
594
|
}).join("");
|
|
601
|
-
n.modifyHtml(
|
|
602
|
-
}), n.apply(new
|
|
595
|
+
n.modifyHtml(a).setInnerHtml(l);
|
|
596
|
+
}), n.apply(new A(`${this.api.translate("Add custom attribute")}: ${r}`));
|
|
603
597
|
}
|
|
604
598
|
/**
|
|
605
599
|
* Removes a custom attribute by rebuilding product card content without it.
|
|
@@ -610,19 +604,19 @@ class Ht extends tt {
|
|
|
610
604
|
return;
|
|
611
605
|
const r = this._getCurrentLayout(), e = this.api.getDocumentModifier();
|
|
612
606
|
if (r === "grid") {
|
|
613
|
-
const o = this.currentNode.querySelectorAll(
|
|
607
|
+
const o = this.currentNode.querySelectorAll(N);
|
|
614
608
|
o == null || o.forEach((s) => {
|
|
615
609
|
const i = this._buildCompositionHtml(s, t);
|
|
616
610
|
e.modifyHtml(s).setInnerHtml(i);
|
|
617
611
|
});
|
|
618
612
|
} else {
|
|
619
|
-
const o = t.filter((i) => i !==
|
|
613
|
+
const o = t.filter((i) => i !== L && i !== B), s = this.currentNode.querySelectorAll(M);
|
|
620
614
|
s == null || s.forEach((i) => {
|
|
621
615
|
const n = this._buildCompositionHtml(i, o);
|
|
622
616
|
e.modifyHtml(i).setInnerHtml(n);
|
|
623
617
|
});
|
|
624
618
|
}
|
|
625
|
-
e.apply(new
|
|
619
|
+
e.apply(new A(this.api.translate("Remove custom attribute")));
|
|
626
620
|
}
|
|
627
621
|
// ========================================================================
|
|
628
622
|
// DOM Mutation (Block Root Attributes, Reorder)
|
|
@@ -635,13 +629,7 @@ class Ht extends tt {
|
|
|
635
629
|
* producing a flicker on the custom attribute dropdowns.
|
|
636
630
|
*/
|
|
637
631
|
_updateBothAttributes(t, r) {
|
|
638
|
-
|
|
639
|
-
return;
|
|
640
|
-
const e = {
|
|
641
|
-
...$.getConfig(this.currentNode),
|
|
642
|
-
composition: t
|
|
643
|
-
};
|
|
644
|
-
this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute(x, t.join(",")).setAttribute(F, JSON.stringify(r)).setNodeConfig(e).apply(new C(this.api.translate("Update card composition")));
|
|
632
|
+
this.currentNode && this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute(V, t.join(",")).setAttribute(q, JSON.stringify(r)).apply(new A(this.api.translate("Update card composition")));
|
|
645
633
|
}
|
|
646
634
|
/**
|
|
647
635
|
* Reorders attribute rows within each product card based on composition order.
|
|
@@ -650,14 +638,14 @@ class Ht extends tt {
|
|
|
650
638
|
_reorderProductAttributes(t) {
|
|
651
639
|
if (!this.currentNode)
|
|
652
640
|
return;
|
|
653
|
-
const r = this.currentNode.querySelectorAll(
|
|
641
|
+
const r = this.currentNode.querySelectorAll(N);
|
|
654
642
|
if (!(r != null && r.length))
|
|
655
643
|
return;
|
|
656
644
|
const e = this.api.getDocumentModifier();
|
|
657
645
|
r.forEach((o) => {
|
|
658
646
|
const s = this._buildCompositionHtml(o, t);
|
|
659
647
|
e.modifyHtml(o).setInnerHtml(s);
|
|
660
|
-
}), e.apply(new
|
|
648
|
+
}), e.apply(new A(this.api.translate("Reorder product attributes")));
|
|
661
649
|
}
|
|
662
650
|
/**
|
|
663
651
|
* Builds HTML string with attributes ordered according to composition.
|
|
@@ -665,7 +653,7 @@ class Ht extends tt {
|
|
|
665
653
|
*/
|
|
666
654
|
_buildCompositionHtml(t, r) {
|
|
667
655
|
return r.reduce((e, o) => {
|
|
668
|
-
const s = t.querySelector(`${
|
|
656
|
+
const s = t.querySelector(`${S}[${y}="${o}"]`);
|
|
669
657
|
return s && "getOuterHTML" in s ? e + s.getOuterHTML() : e;
|
|
670
658
|
}, "");
|
|
671
659
|
}
|
|
@@ -675,19 +663,14 @@ class Ht extends tt {
|
|
|
675
663
|
_applyVisibilityToBlock(t, r) {
|
|
676
664
|
if (!this.currentNode)
|
|
677
665
|
return;
|
|
678
|
-
const e = this.currentNode.querySelectorAll(`${
|
|
666
|
+
const e = this.currentNode.querySelectorAll(`${S}[${y}="${t}"]`);
|
|
679
667
|
if (!(e != null && e.length))
|
|
680
668
|
return;
|
|
681
669
|
const o = r ? "1" : "0", s = r ? this.api.translate("visible") : this.api.translate("hidden"), i = `${this.api.translate("Set visibility")}: ${t} → ${s}`, n = this.api.getDocumentModifier();
|
|
682
670
|
e.forEach((a) => {
|
|
683
|
-
const
|
|
684
|
-
n.modifyHtml(a).setStyle("display",
|
|
685
|
-
});
|
|
686
|
-
const c = {
|
|
687
|
-
...$.getConfig(this.currentNode),
|
|
688
|
-
visibility: { ...this._readVisibilityFromRows(), [t]: r }
|
|
689
|
-
};
|
|
690
|
-
n.modifyHtml(this.currentNode).setNodeConfig(c), n.apply(new C(i));
|
|
671
|
+
const c = ft(a), l = r ? c : "none";
|
|
672
|
+
n.modifyHtml(a).setStyle("display", l).setAttribute(v, o);
|
|
673
|
+
}), n.apply(new A(i));
|
|
691
674
|
}
|
|
692
675
|
// ========================================================================
|
|
693
676
|
// Utilities
|
|
@@ -700,7 +683,7 @@ class Ht extends tt {
|
|
|
700
683
|
_findNthCustomKeyIndex(t, r) {
|
|
701
684
|
let e = 0;
|
|
702
685
|
for (let o = 0; o < t.length; o++)
|
|
703
|
-
if (t[o].startsWith(
|
|
686
|
+
if (t[o].startsWith(m)) {
|
|
704
687
|
if (e === r)
|
|
705
688
|
return o;
|
|
706
689
|
e++;
|
|
@@ -759,10 +742,10 @@ class Ht extends tt {
|
|
|
759
742
|
* or when all available filters have already been added (no unused attributes left).
|
|
760
743
|
*/
|
|
761
744
|
_updateAddButtonState() {
|
|
762
|
-
const t = this._readCustomAttributesFromNode(), r = t.length >=
|
|
745
|
+
const t = this._readCustomAttributesFromNode(), r = t.length >= g, e = new Set(t), o = this._getAddableFilters(), s = o.length > 0 && o.every((i) => e.has(i.attributeName));
|
|
763
746
|
this.api.setUIEAttribute(
|
|
764
|
-
|
|
765
|
-
|
|
747
|
+
x.ADD_ATTRIBUTE,
|
|
748
|
+
I.BUTTON.disabled,
|
|
766
749
|
r || s ? "true" : "false"
|
|
767
750
|
);
|
|
768
751
|
}
|
|
@@ -785,7 +768,7 @@ class Ht extends tt {
|
|
|
785
768
|
* excluding default attributes already covered by built-in toggle items.
|
|
786
769
|
*/
|
|
787
770
|
_getAddableFilters() {
|
|
788
|
-
return Object.values(this.store.filterList).filter((t) => !(t.type === "defaultAttribute" &&
|
|
771
|
+
return Object.values(this.store.filterList).filter((t) => !(t.type === "defaultAttribute" && it.has(t.attributeName)));
|
|
789
772
|
}
|
|
790
773
|
/**
|
|
791
774
|
* Looks up the display name for an attribute from the store's filterList.
|
|
@@ -802,28 +785,28 @@ class Ht extends tt {
|
|
|
802
785
|
_resolveAttributeContent(t, r, e) {
|
|
803
786
|
var n;
|
|
804
787
|
const s = this.store.recommendationProducts[e], i = pt(t, this.store.filterList) ? s == null ? void 0 : s[t] : (n = s == null ? void 0 : s.product_attributes) == null ? void 0 : n[t];
|
|
805
|
-
return
|
|
788
|
+
return _t(i) ?? r;
|
|
806
789
|
}
|
|
807
790
|
_getGridCellHtml(t, r, e, o = "", s = "", i = "") {
|
|
808
|
-
const n = `${
|
|
791
|
+
const n = `${m}${t}`, a = w(ct, [n], this.store.filterList), c = {
|
|
809
792
|
[t]: r,
|
|
810
793
|
product_attributes: { [t]: r }
|
|
811
794
|
};
|
|
812
|
-
let l =
|
|
795
|
+
let l = a[n](c);
|
|
813
796
|
return l = l.replace("<td", `<td width="${e}%"`), i && (l = l.replace(
|
|
814
797
|
`padding: ${ut}`,
|
|
815
798
|
`padding: ${i}`
|
|
816
799
|
)), o && (l = l.replace(/style="table-layout: fixed;"/, `style="table-layout: fixed; ${o}"`)), s && (l = l.replace(/border="0"/, `border="0" bgcolor="${s}"`)), l;
|
|
817
800
|
}
|
|
818
801
|
_getListRowHtml(t, r, e) {
|
|
819
|
-
const o =
|
|
802
|
+
const o = w(mt, [e], this.store.filterList), s = {
|
|
820
803
|
[t]: r,
|
|
821
804
|
product_attributes: { [t]: r }
|
|
822
805
|
}, n = o[e](s).replace(/<tr>/, "").replace(/<\/tr>/, "");
|
|
823
|
-
return `<tr class="recommendation-attribute-row" ${y}="${e}" ${
|
|
806
|
+
return `<tr class="recommendation-attribute-row" ${y}="${e}" ${v}="1">${n}</tr>`;
|
|
824
807
|
}
|
|
825
808
|
}
|
|
826
809
|
export {
|
|
827
810
|
yt as COMPOSITION_CONTROL_BLOCK_ID,
|
|
828
|
-
|
|
811
|
+
Ut as RecommendationCardCompositionControl
|
|
829
812
|
};
|