@useinsider/guido 3.8.1-beta.2ee94c2 → 3.8.1-beta.6c0ee3f
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 +180 -133
- package/dist/config/compiler/utils/recommendationCompilerUtils.js +58 -57
- 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/extensions/Blocks/Recommendation/block.js +4 -1
- package/dist/extensions/Blocks/Recommendation/constants/selectors.js +26 -20
- package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +176 -145
- package/dist/extensions/Blocks/Recommendation/controls/main/index.js +58 -57
- package/dist/extensions/Blocks/Recommendation/controls/main/layoutOrientation.js +43 -31
- package/dist/extensions/Blocks/Recommendation/controls/main/productCount.js +3 -2
- package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +55 -45
- package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +63 -56
- package/dist/extensions/Blocks/Recommendation/controls/syncInfoMessage.js +7 -6
- package/dist/extensions/Blocks/Recommendation/extension.js +3 -2
- package/dist/extensions/Blocks/Recommendation/settingsPanel.js +3 -2
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +3 -2
- package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +13 -12
- package/dist/extensions/Blocks/Recommendation/templates/index.js +7 -6
- package/dist/extensions/Blocks/Recommendation/templates/utils.js +1 -1
- package/dist/extensions/Blocks/controlFactories.js +76 -57
- package/dist/src/composables/useHtmlValidator.d.ts +27 -0
- package/dist/src/composables/useHtmlValidator.test.d.ts +1 -0
- package/dist/src/config/compiler/utils/recommendationIgnoreUtils.d.ts +17 -0
- package/dist/src/config/compiler/utils/recommendationIgnoreUtils.test.d.ts +1 -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/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/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/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 +10 -1
- package/package.json +1 -1
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
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 Q = Object.defineProperty;
|
|
2
|
+
var Z = (p, g, t) => g in p ? Q(p, g, { enumerable: !0, configurable: !0, writable: !0, value: t }) : p[g] = t;
|
|
3
|
+
var T = (p, g, t) => Z(p, typeof g != "symbol" ? g + "" : g, t);
|
|
4
|
+
import { UIElementType as f, UEAttr as v, ModificationDescription as C } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
5
|
+
import { CommonControl as tt } from "../../../common-control.js";
|
|
6
|
+
import { ATTR_PRODUCT_IMAGE as B, ATTR_PRODUCT_NAME as et, ATTR_PRODUCT_PRICE as rt, ATTR_PRODUCT_OLD_PRICE as ot, ATTR_PRODUCT_OMNIBUS_PRICE as st, ATTR_PRODUCT_OMNIBUS_DISCOUNT as it, ATTR_PRODUCT_BUTTON as H, ATTR_DATA_CUSTOM_ATTRIBUTES as F, ATTR_CUSTOM_PREFIX as d, BUILT_IN_DEFAULT_ATTRIBUTES as nt } from "../../constants/selectors.js";
|
|
7
|
+
import { DEFAULT_COMPOSITION as P, DEFAULT_VISIBILITY as w } from "../../constants/defaultConfig.js";
|
|
8
|
+
import { RecommendationConfigService as $ } 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 gt, buildElementRenderer as M } from "../../templates/utils.js";
|
|
13
13
|
import { getTableDisplayValue as ft } from "../../utils/tagName.js";
|
|
14
|
-
import { getCurrentLayout as
|
|
15
|
-
const
|
|
14
|
+
import { isPartnerManagedBlock as _t, getCurrentLayout as bt } from "../main/utils.js";
|
|
15
|
+
const yt = "ui-elements-recommendation-card-composition", A = ".recommendation-attribute-row", L = ".product-card-wrapper > tbody", V = ".product-info-cell > table > tbody", x = "data-card-composition", y = "data-attribute-type", N = "data-visibility", j = {
|
|
16
16
|
ADD_ATTRIBUTE: "addAttribute"
|
|
17
|
-
},
|
|
18
|
-
{ key:
|
|
19
|
-
{ key:
|
|
20
|
-
{ key:
|
|
21
|
-
{ key:
|
|
22
|
-
{ key:
|
|
23
|
-
{ key:
|
|
24
|
-
{ key:
|
|
25
|
-
],
|
|
26
|
-
class
|
|
17
|
+
}, _ = 5, E = "reorderIcon_", h = [
|
|
18
|
+
{ key: B, label: "Product Image" },
|
|
19
|
+
{ key: et, label: "Product Name" },
|
|
20
|
+
{ key: rt, label: "Product Price" },
|
|
21
|
+
{ key: ot, label: "Product Original Price" },
|
|
22
|
+
{ key: st, label: "Omnibus Price" },
|
|
23
|
+
{ key: it, label: "Omnibus Discount" },
|
|
24
|
+
{ key: H, label: "Product Button" }
|
|
25
|
+
], Ct = new Set(h.map((p) => p.key)), S = "customAttr_", R = "deleteAttr_";
|
|
26
|
+
class Ht extends tt {
|
|
27
27
|
constructor() {
|
|
28
28
|
super(...arguments);
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
T(this, "store", lt());
|
|
30
|
+
T(this, "unsubscribeStore", null);
|
|
31
|
+
T(this, "eventController", null);
|
|
32
32
|
/**
|
|
33
33
|
* Guard flag: when true, onTemplateNodeUpdated skips _initializeComposition.
|
|
34
34
|
* Used during _onReorder to prevent multiple intermediate rebuilds.
|
|
35
35
|
*/
|
|
36
|
-
|
|
36
|
+
T(this, "reorderInProgress", !1);
|
|
37
37
|
}
|
|
38
38
|
getId() {
|
|
39
|
-
return
|
|
39
|
+
return yt;
|
|
40
40
|
}
|
|
41
41
|
// ========================================================================
|
|
42
42
|
// Lifecycle
|
|
@@ -47,23 +47,23 @@ class Ut extends Z {
|
|
|
47
47
|
${this._GuToggle(`visibility_${l.key}`)}
|
|
48
48
|
</div>
|
|
49
49
|
`).join(""), r = Array.from(
|
|
50
|
-
{ length:
|
|
50
|
+
{ length: _ },
|
|
51
51
|
(l, u) => `
|
|
52
|
-
<div data-custom-select-key="${
|
|
52
|
+
<div data-custom-select-key="${S}${u}" style="display: none;">
|
|
53
53
|
${this._GuSelect({
|
|
54
|
-
name: `${
|
|
54
|
+
name: `${S}${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 + _, 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
|
+
${v.BUTTON.name}="${E}${u}"
|
|
67
67
|
>
|
|
68
68
|
<${f.ICON}
|
|
69
69
|
src="reorder"
|
|
@@ -73,12 +73,12 @@ class Ut extends Z {
|
|
|
73
73
|
</div>
|
|
74
74
|
`
|
|
75
75
|
).join(""), s = Array.from(
|
|
76
|
-
{ length:
|
|
76
|
+
{ length: _ },
|
|
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
|
+
${v.BUTTON.name}="${R}${u}"
|
|
82
82
|
>
|
|
83
83
|
<${f.ICON}
|
|
84
84
|
src="delete"
|
|
@@ -89,15 +89,15 @@ class Ut extends Z {
|
|
|
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
|
+
), c = this.api.translate("For more information, you can"), a = 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
|
+
${c}
|
|
99
99
|
<!-- cspell:disable-next-line -->
|
|
100
|
-
<a href="${i}" target="_blank" rel="noopener noreferrer">${
|
|
100
|
+
<a href="${i}" target="_blank" rel="noopener noreferrer">${a}</a>.
|
|
101
101
|
</p>
|
|
102
102
|
</div>
|
|
103
103
|
|
|
@@ -120,7 +120,7 @@ class Ut extends Z {
|
|
|
120
120
|
<div class="orderable-list" data-composition-list></div>
|
|
121
121
|
|
|
122
122
|
${this._GuButton({
|
|
123
|
-
name:
|
|
123
|
+
name: j.ADD_ATTRIBUTE,
|
|
124
124
|
label: this.api.translate("Add Attribute"),
|
|
125
125
|
id: "guido__btn-add-attribute"
|
|
126
126
|
})}
|
|
@@ -128,10 +128,24 @@ class Ut extends Z {
|
|
|
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 = _t(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);
|
|
@@ -149,8 +163,8 @@ class Ut extends Z {
|
|
|
149
163
|
this._applyVisibilityToBlock(t.key, r);
|
|
150
164
|
});
|
|
151
165
|
});
|
|
152
|
-
for (let t = 0; t <
|
|
153
|
-
const r = `${
|
|
166
|
+
for (let t = 0; t < _; t++) {
|
|
167
|
+
const r = `${S}${t}`, e = t;
|
|
154
168
|
this.api.onValueChanged(r, (o) => {
|
|
155
169
|
this._onCustomAttributeChanged(e, o);
|
|
156
170
|
});
|
|
@@ -162,36 +176,42 @@ class Ut extends Z {
|
|
|
162
176
|
_readCompositionFromNode() {
|
|
163
177
|
if (!this.currentNode || !("getAttribute" in this.currentNode))
|
|
164
178
|
return [...P];
|
|
165
|
-
const t = this.currentNode.getAttribute(
|
|
166
|
-
|
|
179
|
+
const t = this.currentNode.getAttribute(x);
|
|
180
|
+
if (t)
|
|
181
|
+
return t.split(",").filter(Boolean);
|
|
182
|
+
const { composition: r } = $.getConfig(this.currentNode);
|
|
183
|
+
return r != null && r.length ? [...r] : [...P];
|
|
167
184
|
}
|
|
168
185
|
_readCustomAttributesFromNode() {
|
|
169
186
|
if (!this.currentNode || !("getAttribute" in this.currentNode))
|
|
170
187
|
return [];
|
|
171
|
-
const t = this.currentNode.getAttribute(
|
|
172
|
-
if (
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
188
|
+
const t = this.currentNode.getAttribute(F);
|
|
189
|
+
if (t)
|
|
190
|
+
try {
|
|
191
|
+
return JSON.parse(t);
|
|
192
|
+
} catch {
|
|
193
|
+
return [];
|
|
194
|
+
}
|
|
195
|
+
return this._readCompositionFromNode().filter((r) => r.startsWith(d)).map((r) => r.substring(d.length));
|
|
179
196
|
}
|
|
180
197
|
_readVisibilityFromRows() {
|
|
181
198
|
if (!this.currentNode)
|
|
182
199
|
return this._getDefaultVisibilities();
|
|
183
|
-
const t = Array.from(this.currentNode.querySelectorAll(
|
|
184
|
-
|
|
200
|
+
const t = Array.from(this.currentNode.querySelectorAll(A)), r = this._extractVisibilityFromRows(t);
|
|
201
|
+
if (Object.keys(r).length > 0)
|
|
202
|
+
return this._mergeWithDefaults(r);
|
|
203
|
+
const e = $.getConfig(this.currentNode).visibility;
|
|
204
|
+
return this._mergeWithDefaults({ ...e });
|
|
185
205
|
}
|
|
186
206
|
_getDefaultVisibilities() {
|
|
187
|
-
return { ...
|
|
207
|
+
return { ...w };
|
|
188
208
|
}
|
|
189
209
|
_extractVisibilityFromRows(t) {
|
|
190
210
|
const r = {};
|
|
191
211
|
return t.forEach((e) => {
|
|
192
212
|
if (!("getAttribute" in e))
|
|
193
213
|
return;
|
|
194
|
-
const o = e.getAttribute(y), s = e.getAttribute(
|
|
214
|
+
const o = e.getAttribute(y), s = e.getAttribute(N);
|
|
195
215
|
o && s !== null && (r[o] = this._parseVisibilityValue(s));
|
|
196
216
|
}), r;
|
|
197
217
|
}
|
|
@@ -199,7 +219,7 @@ class Ut extends Z {
|
|
|
199
219
|
return t === "1" || t === "true";
|
|
200
220
|
}
|
|
201
221
|
_mergeWithDefaults(t) {
|
|
202
|
-
return Object.entries(
|
|
222
|
+
return Object.entries(w).forEach(([r, e]) => {
|
|
203
223
|
r in t || (t[r] = e);
|
|
204
224
|
}), t;
|
|
205
225
|
}
|
|
@@ -223,19 +243,19 @@ class Ut extends Z {
|
|
|
223
243
|
return !1;
|
|
224
244
|
const s = new Set(r);
|
|
225
245
|
let i = 0, n = 0;
|
|
226
|
-
const
|
|
227
|
-
if (
|
|
228
|
-
const l = h.find((u) => u.key ===
|
|
246
|
+
const c = t.map((a) => {
|
|
247
|
+
if (Ct.has(a)) {
|
|
248
|
+
const l = h.find((u) => u.key === a);
|
|
229
249
|
return this._createBuiltInItemHtml(l, n++);
|
|
230
250
|
}
|
|
231
|
-
if (
|
|
232
|
-
const l =
|
|
251
|
+
if (a.startsWith(d)) {
|
|
252
|
+
const l = a.substring(d.length);
|
|
233
253
|
if (s.has(l))
|
|
234
|
-
return this._createCustomItemHtml(
|
|
254
|
+
return this._createCustomItemHtml(a, i++, n++);
|
|
235
255
|
}
|
|
236
256
|
return "";
|
|
237
257
|
}).join("");
|
|
238
|
-
return this._rescueTogglesToStore(e), this._rescueSelectsToStore(e), this._rescueDeleteButtonsToStore(e), this._rescueReorderIconsToStore(e), o.innerHTML =
|
|
258
|
+
return this._rescueTogglesToStore(e), this._rescueSelectsToStore(e), this._rescueDeleteButtonsToStore(e), this._rescueReorderIconsToStore(e), o.innerHTML = c, this._moveTogglesIntoItems(e), this._moveSelectsIntoItems(e, r.length), this._moveDeleteButtonsIntoItems(e, r.length), this._moveReorderIconsIntoItems(e, n), !0;
|
|
239
259
|
}
|
|
240
260
|
/**
|
|
241
261
|
* Attempts to reorder existing orderable-item elements to match the composition order.
|
|
@@ -247,27 +267,27 @@ class Ut extends Z {
|
|
|
247
267
|
const e = Array.from(t.querySelectorAll(".orderable-item"));
|
|
248
268
|
if (e.length !== r.length)
|
|
249
269
|
return !1;
|
|
250
|
-
const o = e.map((
|
|
270
|
+
const o = e.map((a) => a.dataset.key).filter(Boolean);
|
|
251
271
|
if (o.length !== r.length)
|
|
252
272
|
return !1;
|
|
253
273
|
const s = [...o].sort().join(","), i = [...r].sort().join(",");
|
|
254
|
-
if (s !== i || r.some((
|
|
274
|
+
if (s !== i || r.some((a) => a.startsWith(d)))
|
|
255
275
|
return !1;
|
|
256
276
|
const n = /* @__PURE__ */ new Map();
|
|
257
|
-
e.forEach((
|
|
258
|
-
const { key: l } =
|
|
277
|
+
e.forEach((a) => {
|
|
278
|
+
const { key: l } = a.dataset;
|
|
259
279
|
if (l) {
|
|
260
280
|
const u = n.get(l) || [];
|
|
261
|
-
u.push(
|
|
281
|
+
u.push(a), n.set(l, u);
|
|
262
282
|
}
|
|
263
283
|
});
|
|
264
|
-
const
|
|
265
|
-
return r.forEach((
|
|
266
|
-
const l = n.get(
|
|
284
|
+
const c = /* @__PURE__ */ new Map();
|
|
285
|
+
return r.forEach((a) => {
|
|
286
|
+
const l = n.get(a);
|
|
267
287
|
if (!l)
|
|
268
288
|
return;
|
|
269
|
-
const u =
|
|
270
|
-
|
|
289
|
+
const u = c.get(a) || 0;
|
|
290
|
+
c.set(a, u + 1), l[u] && t.appendChild(l[u]);
|
|
271
291
|
}), !0;
|
|
272
292
|
}
|
|
273
293
|
_createBuiltInItemHtml(t, r) {
|
|
@@ -315,8 +335,8 @@ class Ut extends Z {
|
|
|
315
335
|
_initializeCustomSelects(t) {
|
|
316
336
|
t.length !== 0 && setTimeout(() => {
|
|
317
337
|
t.forEach((r, e) => {
|
|
318
|
-
const o = `${
|
|
319
|
-
this.api.setUIEAttribute(o,
|
|
338
|
+
const o = `${S}${e}`, s = this._getSelectOptions(r, t);
|
|
339
|
+
this.api.setUIEAttribute(o, v.SELECTPICKER.items, s), this.api.updateValues({ [o]: r });
|
|
320
340
|
});
|
|
321
341
|
}, 0);
|
|
322
342
|
}
|
|
@@ -339,7 +359,7 @@ class Ut extends Z {
|
|
|
339
359
|
*/
|
|
340
360
|
_moveSelectsIntoItems(t, r) {
|
|
341
361
|
for (let e = 0; e < r; e++) {
|
|
342
|
-
const o = `${
|
|
362
|
+
const o = `${S}${e}`, s = t.querySelector(`[data-custom-select-key="${o}"]`), i = t.querySelector(`[data-custom-select-slot="${e}"]`);
|
|
343
363
|
if (s && i) {
|
|
344
364
|
const n = s.querySelector("ue-select");
|
|
345
365
|
n && i.appendChild(n);
|
|
@@ -366,8 +386,8 @@ class Ut extends Z {
|
|
|
366
386
|
* Same rescue pattern as _rescueTogglesToStore — prevents innerHTML from destroying them.
|
|
367
387
|
*/
|
|
368
388
|
_rescueSelectsToStore(t) {
|
|
369
|
-
for (let r = 0; r <
|
|
370
|
-
const e = `${
|
|
389
|
+
for (let r = 0; r < _; r++) {
|
|
390
|
+
const e = `${S}${r}`, o = t.querySelector(`[data-custom-select-key="${e}"]`), s = t.querySelector(`[data-custom-select-slot="${r}"]`);
|
|
371
391
|
if (s) {
|
|
372
392
|
const i = s.querySelector("ue-select");
|
|
373
393
|
i && o && o.appendChild(i);
|
|
@@ -392,7 +412,7 @@ class Ut extends Z {
|
|
|
392
412
|
* Same rescue pattern as _rescueSelectsToStore — prevents innerHTML from destroying them.
|
|
393
413
|
*/
|
|
394
414
|
_rescueDeleteButtonsToStore(t) {
|
|
395
|
-
for (let r = 0; r <
|
|
415
|
+
for (let r = 0; r < _; r++) {
|
|
396
416
|
const e = `${R}${r}`, o = t.querySelector(`[data-custom-delete-key="${e}"]`), s = t.querySelector(`[data-custom-delete-slot="${r}"]`);
|
|
397
417
|
if (s) {
|
|
398
418
|
const i = s.querySelector("ue-button");
|
|
@@ -418,7 +438,7 @@ class Ut extends Z {
|
|
|
418
438
|
* Same rescue pattern as _rescueDeleteButtonsToStore — prevents innerHTML from destroying them.
|
|
419
439
|
*/
|
|
420
440
|
_rescueReorderIconsToStore(t) {
|
|
421
|
-
const r = h.length +
|
|
441
|
+
const r = h.length + _;
|
|
422
442
|
for (let e = 0; e < r; e++) {
|
|
423
443
|
const o = `${E}${e}`, s = t.querySelector(`[data-reorder-icon-key="${o}"]`), i = t.querySelector(`[data-reorder-icon-slot="${e}"]`);
|
|
424
444
|
if (i) {
|
|
@@ -444,24 +464,24 @@ class Ut extends Z {
|
|
|
444
464
|
_setupDragAndDrop(t, r) {
|
|
445
465
|
let e = null, o = null;
|
|
446
466
|
t.addEventListener("dragstart", (s) => {
|
|
447
|
-
var
|
|
467
|
+
var c;
|
|
448
468
|
const n = s.target.closest(".orderable-item");
|
|
449
|
-
n && (e = n, n.classList.add("dragging"), (
|
|
469
|
+
n && (e = n, n.classList.add("dragging"), (c = s.dataTransfer) == null || c.setData("text/plain", n.dataset.key || ""));
|
|
450
470
|
}, { signal: r }), t.addEventListener("dragend", () => {
|
|
451
471
|
e && e.classList.remove("dragging"), e = null, o == null || o.classList.remove("drag-over"), o = null;
|
|
452
472
|
}, { signal: r }), t.addEventListener("dragover", (s) => {
|
|
453
473
|
s.preventDefault();
|
|
454
|
-
const n = s.target.closest(".orderable-item"),
|
|
455
|
-
|
|
474
|
+
const n = s.target.closest(".orderable-item"), c = n && n !== e ? n : null;
|
|
475
|
+
c !== o && (o == null || o.classList.remove("drag-over"), o = c, o == null || o.classList.add("drag-over"));
|
|
456
476
|
}, { signal: r }), t.addEventListener("drop", (s) => {
|
|
457
477
|
s.preventDefault();
|
|
458
478
|
const n = s.target.closest(".orderable-item");
|
|
459
479
|
if (!n || !e || n === e)
|
|
460
480
|
return;
|
|
461
|
-
const
|
|
462
|
-
s.clientY <
|
|
463
|
-
const u = t.querySelectorAll(".orderable-item"),
|
|
464
|
-
this._onReorder(
|
|
481
|
+
const c = n.getBoundingClientRect(), a = c.top + c.height / 2;
|
|
482
|
+
s.clientY < a ? t.insertBefore(e, n) : t.insertBefore(e, n.nextSibling), o == null || o.classList.remove("drag-over"), o = null, e.classList.remove("dragging");
|
|
483
|
+
const u = t.querySelectorAll(".orderable-item"), m = Array.from(u).map((b) => b.dataset.key).filter(Boolean);
|
|
484
|
+
this._onReorder(m), e = null;
|
|
465
485
|
}, { signal: r });
|
|
466
486
|
}
|
|
467
487
|
_setupDeleteHandler(t, r) {
|
|
@@ -477,7 +497,7 @@ class Ut extends Z {
|
|
|
477
497
|
// Actions (Add, Delete, Reorder)
|
|
478
498
|
// ========================================================================
|
|
479
499
|
_onAddAttribute(t, r) {
|
|
480
|
-
const e = `${
|
|
500
|
+
const e = `${d}${t}`, o = this._readCompositionFromNode();
|
|
481
501
|
o.push(e);
|
|
482
502
|
const s = [...this._readCustomAttributesFromNode(), t];
|
|
483
503
|
this._updateBothAttributes(o, s), this._injectCustomAttributeHtml(t, r, e, o), this._renderOrderableItems(o, s), this._initializeCustomSelects(s), this._updateAddButtonState();
|
|
@@ -490,7 +510,7 @@ class Ut extends Z {
|
|
|
490
510
|
const r = this._readCustomAttributesFromNode();
|
|
491
511
|
if (r[t] === void 0)
|
|
492
512
|
return;
|
|
493
|
-
const o = this._readCompositionFromNode(), s = this._findNthCustomKeyIndex(o, t), i = o.filter((
|
|
513
|
+
const o = this._readCompositionFromNode(), s = this._findNthCustomKeyIndex(o, t), i = o.filter((c, a) => a !== s), n = r.filter((c, a) => a !== t);
|
|
494
514
|
this._updateBothAttributes(i, n), this._removeCustomAttributeHtml(i), this._renderOrderableItems(i, n), this._initializeCustomSelects(n), this._updateAddButtonState();
|
|
495
515
|
}
|
|
496
516
|
/**
|
|
@@ -501,13 +521,13 @@ class Ut extends Z {
|
|
|
501
521
|
const e = this._readCustomAttributesFromNode(), o = e[t];
|
|
502
522
|
if (o === void 0 || o === r)
|
|
503
523
|
return;
|
|
504
|
-
const s = `${
|
|
524
|
+
const s = `${d}${r}`, i = this._readCompositionFromNode(), n = this._findNthCustomKeyIndex(i, t);
|
|
505
525
|
n !== -1 && (i[n] = s), e[t] = r;
|
|
506
|
-
const
|
|
507
|
-
this._updateBothAttributes(i, e), this._injectCustomAttributeHtml(r,
|
|
526
|
+
const c = this._getDisplayNameForAttribute(r);
|
|
527
|
+
this._updateBothAttributes(i, e), this._injectCustomAttributeHtml(r, c, s, i), this._renderOrderableItems(i, e), this._initializeCustomSelects(e);
|
|
508
528
|
}
|
|
509
529
|
_onReorder(t) {
|
|
510
|
-
const r = t.filter((e) => e.startsWith(
|
|
530
|
+
const r = t.filter((e) => e.startsWith(d)).map((e) => e.substring(d.length));
|
|
511
531
|
this.reorderInProgress = !0;
|
|
512
532
|
try {
|
|
513
533
|
this._updateBothAttributes(t, r), this._getCurrentLayout() === "grid" && this._reorderProductAttributes(t);
|
|
@@ -528,58 +548,58 @@ class Ut extends Z {
|
|
|
528
548
|
const s = this.currentNode.querySelectorAll(L);
|
|
529
549
|
if (!(s != null && s.length))
|
|
530
550
|
return;
|
|
531
|
-
const i =
|
|
551
|
+
const i = $.getConfig(this.currentNode), c = `0 ${Math.floor(i.columnSpacing / 2)}px`, a = this.api.getDocumentModifier(), l = this.store.recommendationProducts.length;
|
|
532
552
|
let u = 0;
|
|
533
|
-
s.forEach((
|
|
534
|
-
var
|
|
535
|
-
const b =
|
|
536
|
-
if (
|
|
537
|
-
const
|
|
553
|
+
s.forEach((m) => {
|
|
554
|
+
var k;
|
|
555
|
+
const b = m.querySelector(A), I = ((k = b == null ? void 0 : b.querySelectorAll(`.${at}`)) == null ? void 0 : k.length) || 1, U = (100 / I).toFixed(2), { bgStyle: W, bgAttr: K } = this._extractSegmentBgFromCard(m), O = l > 0 ? Math.min(I, l - u) : I, z = o.map((q) => {
|
|
556
|
+
if (q === e) {
|
|
557
|
+
const G = Array.from(
|
|
538
558
|
{ length: O },
|
|
539
|
-
(At,
|
|
540
|
-
const
|
|
559
|
+
(At, X) => {
|
|
560
|
+
const J = this._resolveAttributeContent(
|
|
541
561
|
t,
|
|
542
562
|
r,
|
|
543
|
-
u +
|
|
563
|
+
u + X
|
|
544
564
|
);
|
|
545
565
|
return this._getGridCellHtml(
|
|
546
566
|
t,
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
j,
|
|
567
|
+
J,
|
|
568
|
+
U,
|
|
550
569
|
W,
|
|
551
|
-
|
|
570
|
+
K,
|
|
571
|
+
c
|
|
552
572
|
);
|
|
553
573
|
}
|
|
554
|
-
).join(""),
|
|
555
|
-
return `<tr class="recommendation-attribute-row" ${y}="${e}" ${
|
|
574
|
+
).join(""), Y = dt(U, c).repeat(I - O);
|
|
575
|
+
return `<tr class="recommendation-attribute-row" ${y}="${e}" ${N}="1">${G}${Y}</tr>`;
|
|
556
576
|
}
|
|
557
|
-
const
|
|
558
|
-
`${
|
|
577
|
+
const D = m.querySelector(
|
|
578
|
+
`${A}[${y}="${q}"]`
|
|
559
579
|
);
|
|
560
|
-
return
|
|
580
|
+
return D && "getOuterHTML" in D ? D.getOuterHTML() : "";
|
|
561
581
|
}).join("");
|
|
562
|
-
u += O, l > 0 && u >= l && (u = 0),
|
|
563
|
-
}),
|
|
582
|
+
u += O, l > 0 && u >= l && (u = 0), a.modifyHtml(m).setInnerHtml(z);
|
|
583
|
+
}), a.apply(new C(`${this.api.translate("Add custom attribute")}: ${r}`));
|
|
564
584
|
}
|
|
565
585
|
_injectListAttributeRow(t, r, e, o) {
|
|
566
|
-
const s = this.currentNode.querySelectorAll(
|
|
586
|
+
const s = this.currentNode.querySelectorAll(V);
|
|
567
587
|
if (!(s != null && s.length))
|
|
568
588
|
return;
|
|
569
|
-
const i = o.filter((
|
|
570
|
-
s.forEach((
|
|
589
|
+
const i = o.filter((c) => c !== B && c !== H), n = this.api.getDocumentModifier();
|
|
590
|
+
s.forEach((c, a) => {
|
|
571
591
|
const l = i.map((u) => {
|
|
572
592
|
if (u === e) {
|
|
573
|
-
const b = this._resolveAttributeContent(t, r,
|
|
593
|
+
const b = this._resolveAttributeContent(t, r, a);
|
|
574
594
|
return this._getListRowHtml(t, b, e);
|
|
575
595
|
}
|
|
576
|
-
const
|
|
577
|
-
`${
|
|
596
|
+
const m = c.querySelector(
|
|
597
|
+
`${A}[${y}="${u}"]`
|
|
578
598
|
);
|
|
579
|
-
return
|
|
599
|
+
return m && "getOuterHTML" in m ? m.getOuterHTML() : "";
|
|
580
600
|
}).join("");
|
|
581
|
-
n.modifyHtml(
|
|
582
|
-
}), n.apply(new
|
|
601
|
+
n.modifyHtml(c).setInnerHtml(l);
|
|
602
|
+
}), n.apply(new C(`${this.api.translate("Add custom attribute")}: ${r}`));
|
|
583
603
|
}
|
|
584
604
|
/**
|
|
585
605
|
* Removes a custom attribute by rebuilding product card content without it.
|
|
@@ -596,13 +616,13 @@ class Ut extends Z {
|
|
|
596
616
|
e.modifyHtml(s).setInnerHtml(i);
|
|
597
617
|
});
|
|
598
618
|
} else {
|
|
599
|
-
const o = t.filter((i) => i !==
|
|
619
|
+
const o = t.filter((i) => i !== B && i !== H), s = this.currentNode.querySelectorAll(V);
|
|
600
620
|
s == null || s.forEach((i) => {
|
|
601
621
|
const n = this._buildCompositionHtml(i, o);
|
|
602
622
|
e.modifyHtml(i).setInnerHtml(n);
|
|
603
623
|
});
|
|
604
624
|
}
|
|
605
|
-
e.apply(new
|
|
625
|
+
e.apply(new C(this.api.translate("Remove custom attribute")));
|
|
606
626
|
}
|
|
607
627
|
// ========================================================================
|
|
608
628
|
// DOM Mutation (Block Root Attributes, Reorder)
|
|
@@ -615,7 +635,13 @@ class Ut extends Z {
|
|
|
615
635
|
* producing a flicker on the custom attribute dropdowns.
|
|
616
636
|
*/
|
|
617
637
|
_updateBothAttributes(t, r) {
|
|
618
|
-
|
|
638
|
+
if (!this.currentNode)
|
|
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")));
|
|
619
645
|
}
|
|
620
646
|
/**
|
|
621
647
|
* Reorders attribute rows within each product card based on composition order.
|
|
@@ -631,7 +657,7 @@ class Ut extends Z {
|
|
|
631
657
|
r.forEach((o) => {
|
|
632
658
|
const s = this._buildCompositionHtml(o, t);
|
|
633
659
|
e.modifyHtml(o).setInnerHtml(s);
|
|
634
|
-
}), e.apply(new
|
|
660
|
+
}), e.apply(new C(this.api.translate("Reorder product attributes")));
|
|
635
661
|
}
|
|
636
662
|
/**
|
|
637
663
|
* Builds HTML string with attributes ordered according to composition.
|
|
@@ -639,7 +665,7 @@ class Ut extends Z {
|
|
|
639
665
|
*/
|
|
640
666
|
_buildCompositionHtml(t, r) {
|
|
641
667
|
return r.reduce((e, o) => {
|
|
642
|
-
const s = t.querySelector(`${
|
|
668
|
+
const s = t.querySelector(`${A}[${y}="${o}"]`);
|
|
643
669
|
return s && "getOuterHTML" in s ? e + s.getOuterHTML() : e;
|
|
644
670
|
}, "");
|
|
645
671
|
}
|
|
@@ -649,14 +675,19 @@ class Ut extends Z {
|
|
|
649
675
|
_applyVisibilityToBlock(t, r) {
|
|
650
676
|
if (!this.currentNode)
|
|
651
677
|
return;
|
|
652
|
-
const e = this.currentNode.querySelectorAll(`${
|
|
678
|
+
const e = this.currentNode.querySelectorAll(`${A}[${y}="${t}"]`);
|
|
653
679
|
if (!(e != null && e.length))
|
|
654
680
|
return;
|
|
655
681
|
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();
|
|
656
682
|
e.forEach((a) => {
|
|
657
|
-
const
|
|
658
|
-
n.modifyHtml(a).setStyle("display",
|
|
659
|
-
})
|
|
683
|
+
const l = ft(a), u = r ? l : "none";
|
|
684
|
+
n.modifyHtml(a).setStyle("display", u).setAttribute(N, o);
|
|
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));
|
|
660
691
|
}
|
|
661
692
|
// ========================================================================
|
|
662
693
|
// Utilities
|
|
@@ -669,7 +700,7 @@ class Ut extends Z {
|
|
|
669
700
|
_findNthCustomKeyIndex(t, r) {
|
|
670
701
|
let e = 0;
|
|
671
702
|
for (let o = 0; o < t.length; o++)
|
|
672
|
-
if (t[o].startsWith(
|
|
703
|
+
if (t[o].startsWith(d)) {
|
|
673
704
|
if (e === r)
|
|
674
705
|
return o;
|
|
675
706
|
e++;
|
|
@@ -677,7 +708,7 @@ class Ut extends Z {
|
|
|
677
708
|
return -1;
|
|
678
709
|
}
|
|
679
710
|
_getCurrentLayout() {
|
|
680
|
-
return this.store.recommendationConfigs.orientation ||
|
|
711
|
+
return this.store.recommendationConfigs.orientation || bt(this.currentNode);
|
|
681
712
|
}
|
|
682
713
|
/**
|
|
683
714
|
* Extracts background color properties from existing card elements.
|
|
@@ -728,10 +759,10 @@ class Ut extends Z {
|
|
|
728
759
|
* or when all available filters have already been added (no unused attributes left).
|
|
729
760
|
*/
|
|
730
761
|
_updateAddButtonState() {
|
|
731
|
-
const t = this._readCustomAttributesFromNode(), r = t.length >=
|
|
762
|
+
const t = this._readCustomAttributesFromNode(), r = t.length >= _, e = new Set(t), o = this._getAddableFilters(), s = o.length > 0 && o.every((i) => e.has(i.attributeName));
|
|
732
763
|
this.api.setUIEAttribute(
|
|
733
|
-
|
|
734
|
-
|
|
764
|
+
j.ADD_ATTRIBUTE,
|
|
765
|
+
v.BUTTON.disabled,
|
|
735
766
|
r || s ? "true" : "false"
|
|
736
767
|
);
|
|
737
768
|
}
|
|
@@ -754,7 +785,7 @@ class Ut extends Z {
|
|
|
754
785
|
* excluding default attributes already covered by built-in toggle items.
|
|
755
786
|
*/
|
|
756
787
|
_getAddableFilters() {
|
|
757
|
-
return Object.values(this.store.filterList).filter((t) => !(t.type === "defaultAttribute" &&
|
|
788
|
+
return Object.values(this.store.filterList).filter((t) => !(t.type === "defaultAttribute" && nt.has(t.attributeName)));
|
|
758
789
|
}
|
|
759
790
|
/**
|
|
760
791
|
* Looks up the display name for an attribute from the store's filterList.
|
|
@@ -771,28 +802,28 @@ class Ut extends Z {
|
|
|
771
802
|
_resolveAttributeContent(t, r, e) {
|
|
772
803
|
var n;
|
|
773
804
|
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];
|
|
774
|
-
return
|
|
805
|
+
return gt(i) ?? r;
|
|
775
806
|
}
|
|
776
807
|
_getGridCellHtml(t, r, e, o = "", s = "", i = "") {
|
|
777
|
-
const n = `${
|
|
808
|
+
const n = `${d}${t}`, c = M(ct, [n], this.store.filterList), a = {
|
|
778
809
|
[t]: r,
|
|
779
810
|
product_attributes: { [t]: r }
|
|
780
811
|
};
|
|
781
|
-
let l =
|
|
812
|
+
let l = c[n](a);
|
|
782
813
|
return l = l.replace("<td", `<td width="${e}%"`), i && (l = l.replace(
|
|
783
814
|
`padding: ${ut}`,
|
|
784
815
|
`padding: ${i}`
|
|
785
816
|
)), o && (l = l.replace(/style="table-layout: fixed;"/, `style="table-layout: fixed; ${o}"`)), s && (l = l.replace(/border="0"/, `border="0" bgcolor="${s}"`)), l;
|
|
786
817
|
}
|
|
787
818
|
_getListRowHtml(t, r, e) {
|
|
788
|
-
const o =
|
|
819
|
+
const o = M(mt, [e], this.store.filterList), s = {
|
|
789
820
|
[t]: r,
|
|
790
821
|
product_attributes: { [t]: r }
|
|
791
822
|
}, n = o[e](s).replace(/<tr>/, "").replace(/<\/tr>/, "");
|
|
792
|
-
return `<tr class="recommendation-attribute-row" ${y}="${e}" ${
|
|
823
|
+
return `<tr class="recommendation-attribute-row" ${y}="${e}" ${N}="1">${n}</tr>`;
|
|
793
824
|
}
|
|
794
825
|
}
|
|
795
826
|
export {
|
|
796
|
-
|
|
797
|
-
|
|
827
|
+
yt as COMPOSITION_CONTROL_BLOCK_ID,
|
|
828
|
+
Ht as RecommendationCardCompositionControl
|
|
798
829
|
};
|