@useinsider/guido 3.2.0-beta.6d12eec → 3.2.0-beta.738ec8a

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.
Files changed (40) hide show
  1. package/dist/components/organisms/extensions/recommendation/FilterItem.vue.js +9 -11
  2. package/dist/components/organisms/extensions/recommendation/FilterItem.vue2.js +70 -35
  3. package/dist/composables/useActionsApi.js +4 -4
  4. package/dist/composables/useFullStoryBridge.js +9 -29
  5. package/dist/composables/useSave.js +1 -1
  6. package/dist/composables/useStripo.js +23 -22
  7. package/dist/config/compiler/recommendationCompilerRules.js +72 -67
  8. package/dist/config/compiler/utils/recommendationCompilerUtils.js +33 -30
  9. package/dist/config/migrator/recommendationMigrator.js +1 -1
  10. package/dist/enums/extensions/recommendationBlock.js +28 -27
  11. package/dist/extensions/Blocks/Items/controls/price/singlePrice.js +38 -38
  12. package/dist/extensions/Blocks/Items/enums/productEnums.js +19 -7
  13. package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +1 -1
  14. package/dist/extensions/Blocks/Recommendation/controls/customAttribute/index.js +21 -18
  15. package/dist/extensions/Blocks/Recommendation/controls/customAttribute/textTrim.js +99 -0
  16. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +6 -6
  17. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +3 -1
  18. package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +27 -57
  19. package/dist/extensions/Blocks/Recommendation/controls/shared/textTrimCssRules.js +14 -0
  20. package/dist/extensions/Blocks/Recommendation/settingsPanel.js +18 -17
  21. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +29 -25
  22. package/dist/extensions/Blocks/Recommendation/templates/list/template.js +11 -11
  23. package/dist/extensions/Blocks/Recommendation/utils/filterUtil.js +31 -15
  24. package/dist/extensions/Blocks/Unsubscribe/block.js +11 -11
  25. package/dist/guido.css +1 -1
  26. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +324 -218
  27. package/dist/package.json.js +1 -1
  28. package/dist/src/composables/useActionsApi.d.ts +1 -1
  29. package/dist/src/composables/useFullStoryBridge.d.ts +6 -6
  30. package/dist/src/enums/extensions/recommendationBlock.d.ts +1 -0
  31. package/dist/src/extensions/Blocks/Recommendation/constants/controlIds.d.ts +1 -0
  32. package/dist/src/extensions/Blocks/Recommendation/controls/customAttribute/index.d.ts +3 -0
  33. package/dist/src/extensions/Blocks/Recommendation/controls/customAttribute/textTrim.d.ts +35 -0
  34. package/dist/src/extensions/Blocks/Recommendation/controls/name/textTrim.d.ts +3 -20
  35. package/dist/src/extensions/Blocks/Recommendation/controls/shared/textTrimCssRules.d.ts +29 -0
  36. package/dist/src/extensions/Blocks/Recommendation/utils/filterUtil.d.ts +2 -0
  37. package/dist/static/styles/components/button.css.js +16 -9
  38. package/dist/static/styles/components/loader.css.js +4 -0
  39. package/dist/static/styles/components/narrow-panel.css.js +52 -0
  40. package/package.json +3 -3
@@ -1,7 +1,7 @@
1
- var c = Object.defineProperty;
2
- var h = (s, i, t) => i in s ? c(s, i, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[i] = t;
3
- var a = (s, i, t) => h(s, typeof i != "symbol" ? i + "" : i, t);
4
- import { UEAttr as l } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
1
+ var l = Object.defineProperty;
2
+ var c = (s, i, t) => i in s ? l(s, i, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[i] = t;
3
+ var a = (s, i, t) => c(s, typeof i != "symbol" ? i + "" : i, t);
4
+ import { UEAttr as h } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
5
5
  import { CommonControl as d } from "../../../common-control.js";
6
6
  import { RecommendationConfigService as n } from "../../services/configService.js";
7
7
  import { useRecommendationExtensionStore as m } from "../../store/recommendation.js";
@@ -42,7 +42,7 @@ class T extends d {
42
42
  this._initializeSelectItems(), this._setFormValues(), this._listenToFormUpdates();
43
43
  }
44
44
  onTemplateNodeUpdated(t) {
45
- super.onTemplateNodeUpdated(t), this._setFormValues();
45
+ super.onTemplateNodeUpdated(t), this._initializeSelectItems(), this._setFormValues();
46
46
  }
47
47
  _setFormValues() {
48
48
  const t = n.getConfig(this.currentNode);
@@ -58,7 +58,7 @@ class T extends d {
58
58
  try {
59
59
  this.api.setUIEAttribute(
60
60
  e.ALGORITHM,
61
- l.SELECTPICKER.items,
61
+ h.SELECTPICKER.items,
62
62
  t
63
63
  );
64
64
  } catch (r) {
@@ -114,7 +114,9 @@ class H extends g {
114
114
  var r;
115
115
  super.onTemplateNodeUpdated(t);
116
116
  const e = this._getRecommendationIdFromNode(t);
117
- e !== null && e !== this.store.currentRecommendationId && this.store.setCurrentBlock(e), this._syncNodeConfigToStore(), e !== null && !((r = this.store.blockStates[e]) != null && r.isInitialized) && this._fetchBlockData(e), [
117
+ e !== null && e !== this.store.currentRecommendationId && this.store.setCurrentBlock(e), e !== null && this._syncNodeConfigToStore(), e !== null && !((r = this.store.blockStates[e]) != null && r.isInitialized) && this._fetchBlockData(e).then(() => {
118
+ this._initializeSubControls();
119
+ }), [
118
120
  this.layoutOrientationControl,
119
121
  this.productCountControl,
120
122
  this.algorithmControl,
@@ -1,14 +1,15 @@
1
- import { ModificationDescription as a } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
- import { CommonControl as d } from "../../../common-control.js";
3
- import { RecommendationBlockId as l } from "../../constants/blockIds.js";
4
- import { RecommendationControlId as m } from "../../constants/controlIds.js";
5
- import { BLOCK_ROOT_SELECTOR as u } from "../../constants/selectors.js";
6
- const i = {
1
+ import { ModificationDescription as l } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
+ import { CommonControl as u } from "../../../common-control.js";
3
+ import { RecommendationBlockId as a } from "../../constants/blockIds.js";
4
+ import { RecommendationControlId as d } from "../../constants/controlIds.js";
5
+ import { BLOCK_ROOT_SELECTOR as m } from "../../constants/selectors.js";
6
+ import { CSS_CLASS_TEXT_TRIM as r, ensureTextTrimCssRulesExist as T } from "../shared/textTrimCssRules.js";
7
+ const s = {
7
8
  TEXT_TRIM_ENABLED: "textTrimEnabled"
8
- }, o = "text-trim-enabled", c = `.${o}`, T = `.${o} p`, p = `.${o} { max-width: 0; }`, _ = `.${o} p { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin: 0; display: block; }`;
9
- class N extends d {
9
+ };
10
+ class N extends u {
10
11
  getId() {
11
- return m.NAME_TEXT_TRIM;
12
+ return d.NAME_TEXT_TRIM;
12
13
  }
13
14
  getTemplate() {
14
15
  return `
@@ -16,7 +17,7 @@ class N extends d {
16
17
  <div class="name-text-trim-control-container">
17
18
  ${this._GuTwoColumns([
18
19
  this._GuLabel({ text: this.api.translate("Trim Long Text") }),
19
- this._GuToggle(i.TEXT_TRIM_ENABLED)
20
+ this._GuToggle(s.TEXT_TRIM_ENABLED)
20
21
  ])}
21
22
  </div>
22
23
  `;
@@ -30,76 +31,45 @@ class N extends d {
30
31
  _setFormValues() {
31
32
  const e = this._getCurrentTrimState();
32
33
  this.api.updateValues({
33
- [i.TEXT_TRIM_ENABLED]: e
34
+ [s.TEXT_TRIM_ENABLED]: e
34
35
  });
35
36
  }
36
37
  _getCurrentTrimState() {
37
38
  if (!this.currentNode || !("hasClass" in this.currentNode))
38
39
  return !1;
39
- if (this.currentNode.hasClass(o))
40
+ if (this.currentNode.hasClass(r))
40
41
  return !0;
41
- const e = this.currentNode.closest(u);
42
+ const e = this.currentNode.closest(m);
42
43
  if (!e)
43
44
  return !1;
44
45
  const t = e.querySelector(
45
- `[esd-extension-block-id="${l.NAME}"]`
46
+ `[esd-extension-block-id="${a.NAME}"]`
46
47
  );
47
- return t && "hasClass" in t ? t.hasClass(o) : !1;
48
- }
49
- /**
50
- * Finds an existing CSS rule in the document stylesheet by exact query
51
- * @param query - The CSS query to search for (uses Stripo's CSS query syntax)
52
- * @returns The CSS rule node if found, undefined otherwise
53
- */
54
- _findCssRule(e) {
55
- const t = this.api.getDocumentRootCssNode();
56
- if (t)
57
- return t.querySelector(e);
58
- }
59
- /**
60
- * Finds the .text-trim-enabled p rule by searching all text-trim rules and comparing selectors
61
- * This is needed because Stripo's CSS query syntax interprets spaces as path separators
62
- * @returns true if the rule exists
63
- */
64
- _hasParagraphRule() {
65
- const e = this.api.getDocumentRootCssNode();
66
- return e ? e.querySelectorAll(`*${o}`).some((s) => "getSelector" in s && typeof s.getSelector == "function" ? s.getSelector() === T : !1) : !1;
67
- }
68
- /**
69
- * Ensures the text-trim CSS rules exist in the document stylesheet
70
- * Only adds rules if they don't already exist (prevents duplicates across multiple blocks)
71
- */
72
- _ensureCssRulesExist() {
73
- const e = this.api.getDocumentRootCssNode();
74
- if (!e)
75
- return;
76
- const t = this.api.getDocumentModifier();
77
- let s = !1;
78
- this._findCssRule(c) || (t.modifyCss(e).appendRule(p), s = !0), this._hasParagraphRule() || (t.modifyCss(e).appendRule(_), s = !0), s && t.apply(new a("Add text trim CSS rules"));
48
+ return t && "hasClass" in t ? t.hasClass(r) : !1;
79
49
  }
80
50
  _onTextTrimChange(e) {
81
51
  if (!this.currentNode || !("closest" in this.currentNode))
82
52
  return;
83
- const t = this.currentNode.closest(u);
53
+ const t = this.currentNode.closest(m);
84
54
  if (!t || !("querySelectorAll" in t))
85
55
  return;
86
- const s = Array.from(
87
- t.querySelectorAll(`[esd-extension-block-id="${l.NAME}"]`)
56
+ const i = Array.from(
57
+ t.querySelectorAll(`[esd-extension-block-id="${a.NAME}"]`)
88
58
  );
89
- if (!s.length)
59
+ if (!i.length)
90
60
  return;
91
- e && this._ensureCssRulesExist();
92
- const r = this.api.getDocumentModifier();
93
- s.forEach((n) => {
94
- e ? r.modifyHtml(n).setClass(o) : r.modifyHtml(n).removeClass(o);
95
- }), r.apply(
96
- new a(
61
+ e && T(this.api);
62
+ const o = this.api.getDocumentModifier();
63
+ i.forEach((n) => {
64
+ e ? o.modifyHtml(n).setClass(r) : o.modifyHtml(n).removeClass(r);
65
+ }), o.apply(
66
+ new l(
97
67
  e ? "Enable product name text trimming" : "Disable product name text trimming"
98
68
  )
99
69
  );
100
70
  }
101
71
  _listenToFormUpdates() {
102
- this.api.onValueChanged(i.TEXT_TRIM_ENABLED, (e) => {
72
+ this.api.onValueChanged(s.TEXT_TRIM_ENABLED, (e) => {
103
73
  this._onTextTrimChange(e);
104
74
  });
105
75
  }
@@ -0,0 +1,14 @@
1
+ import { ModificationDescription as r } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
+ const t = "text-trim-enabled", l = `.${t}`, c = `.${t} p`, S = `.${t} { max-width: 0; }`, T = `.${t} p { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin: 0; display: block; }`;
3
+ function f(n) {
4
+ const e = n.getDocumentRootCssNode();
5
+ if (!e)
6
+ return;
7
+ const o = n.getDocumentModifier();
8
+ let i = !1;
9
+ e.querySelector(l) || (o.modifyCss(e).appendRule(S), i = !0), e.querySelectorAll(`*${t}`).some((s) => "getSelector" in s && typeof s.getSelector == "function" && s.getSelector() === c) || (o.modifyCss(e).appendRule(T), i = !0), i && o.apply(new r("Add text trim CSS rules"));
10
+ }
11
+ export {
12
+ t as CSS_CLASS_TEXT_TRIM,
13
+ f as ensureTextTrimCssRulesExist
14
+ };
@@ -1,6 +1,6 @@
1
1
  import { SettingsPanelRegistry as E, SettingsPanelTab as _, SettingsTab as O, ContainerControls as C, TextControls as R } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
2
  import { BLOCK_ID as U } from "./block.js";
3
- import { RecommendationBlockId as N } from "./constants/blockIds.js";
3
+ import { RecommendationBlockId as S } from "./constants/blockIds.js";
4
4
  import { RecommendationControlId as T } from "./constants/controlIds.js";
5
5
  import { CONTROL_BLOCK_ID as A } from "./controls/main/index.js";
6
6
  import "./store/recommendation.js";
@@ -14,7 +14,7 @@ import "./controls/image/index.js";
14
14
  import { SPACING_CONTROL_ID as L } from "./controls/spacing/index.js";
15
15
  import { CARD_BACKGROUND_COLOR_CONTROL_ID as D } from "./controls/cardBackground/index.js";
16
16
  import { COMPOSITION_CONTROL_BLOCK_ID as B } from "./controls/cardComposition/index.js";
17
- import { SYNC_INFO_MESSAGE_CONTROL_ID as S } from "./controls/syncInfoMessage.js";
17
+ import { SYNC_INFO_MESSAGE_CONTROL_ID as N } from "./controls/syncInfoMessage.js";
18
18
  class Z extends E {
19
19
  registerBlockControls(I) {
20
20
  I[U] = [
@@ -39,11 +39,11 @@ class Z extends E {
39
39
  B
40
40
  ]
41
41
  ).withLabel(this.api.translate("Card Composition"))
42
- ], I[N.NAME] = [
42
+ ], I[S.NAME] = [
43
43
  new _(
44
44
  O.SETTINGS,
45
45
  [
46
- S,
46
+ N,
47
47
  T.NAME_STYLE,
48
48
  T.NAME_ALIGN,
49
49
  T.NAME_TEXT_TRIM,
@@ -59,11 +59,11 @@ class Z extends E {
59
59
  T.NAME_COLOR
60
60
  ]
61
61
  )
62
- ], I[N.PRICE] = [
62
+ ], I[S.PRICE] = [
63
63
  new _(
64
64
  O.SETTINGS,
65
65
  [
66
- S,
66
+ N,
67
67
  T.PRICE_STYLE,
68
68
  T.PRICE_ALIGN,
69
69
  T.PRICE_PADDINGS
@@ -78,11 +78,11 @@ class Z extends E {
78
78
  T.PRICE_COLOR
79
79
  ]
80
80
  )
81
- ], I[N.OLD_PRICE] = [
81
+ ], I[S.OLD_PRICE] = [
82
82
  new _(
83
83
  O.SETTINGS,
84
84
  [
85
- S,
85
+ N,
86
86
  T.OLD_PRICE_STYLE,
87
87
  T.OLD_PRICE_ALIGN,
88
88
  T.OLD_PRICE_PADDINGS
@@ -97,11 +97,11 @@ class Z extends E {
97
97
  T.OLD_PRICE_COLOR
98
98
  ]
99
99
  )
100
- ], I[N.OMNIBUS_PRICE] = [
100
+ ], I[S.OMNIBUS_PRICE] = [
101
101
  new _(
102
102
  O.SETTINGS,
103
103
  [
104
- S,
104
+ N,
105
105
  T.OMNIBUS_PRICE_TEXT_BEFORE,
106
106
  T.OMNIBUS_PRICE_TEXT_AFTER,
107
107
  T.OMNIBUS_PRICE_STYLE,
@@ -118,11 +118,11 @@ class Z extends E {
118
118
  T.OMNIBUS_PRICE_COLOR
119
119
  ]
120
120
  )
121
- ], I[N.OMNIBUS_DISCOUNT] = [
121
+ ], I[S.OMNIBUS_DISCOUNT] = [
122
122
  new _(
123
123
  O.SETTINGS,
124
124
  [
125
- S,
125
+ N,
126
126
  T.OMNIBUS_DISCOUNT_TEXT_BEFORE,
127
127
  T.OMNIBUS_DISCOUNT_TEXT_AFTER,
128
128
  T.OMNIBUS_DISCOUNT_STYLE,
@@ -139,11 +139,11 @@ class Z extends E {
139
139
  T.OMNIBUS_DISCOUNT_COLOR
140
140
  ]
141
141
  )
142
- ], I[N.BUTTON] = [
142
+ ], I[S.BUTTON] = [
143
143
  new _(
144
144
  O.SETTINGS,
145
145
  [
146
- S,
146
+ N,
147
147
  T.BUTTON_TEXT,
148
148
  T.BUTTON_ALIGN,
149
149
  T.BUTTON_PADDINGS,
@@ -162,12 +162,13 @@ class Z extends E {
162
162
  T.BUTTON_BORDER
163
163
  ]
164
164
  )
165
- ], I[N.CUSTOM_ATTRIBUTE] = [
165
+ ], I[S.CUSTOM_ATTRIBUTE] = [
166
166
  new _(
167
167
  O.SETTINGS,
168
168
  [
169
169
  T.CUSTOM_ATTR_STYLE,
170
170
  T.CUSTOM_ATTR_ALIGN,
171
+ T.CUSTOM_ATTR_TEXT_TRIM,
171
172
  T.CUSTOM_ATTR_PADDINGS
172
173
  ]
173
174
  ),
@@ -180,11 +181,11 @@ class Z extends E {
180
181
  T.CUSTOM_ATTR_COLOR
181
182
  ]
182
183
  )
183
- ], I[N.IMAGE] = [
184
+ ], I[S.IMAGE] = [
184
185
  new _(
185
186
  O.SETTINGS,
186
187
  [
187
- S,
188
+ N,
188
189
  T.IMAGE_SIZE,
189
190
  T.IMAGE_MARGINS
190
191
  ]
@@ -1,14 +1,14 @@
1
1
  import { RecommendationFeedSourceMaps as g, getOperatorOptions as R, PriceAttributes as k } from "../../../../enums/extensions/recommendationBlock.js";
2
- import { useRecommendationApi as y } from "../../../../services/recommendationApi.js";
3
- import { useConfigStore as C } from "../../../../stores/config.js";
2
+ import { useRecommendationApi as C } from "../../../../services/recommendationApi.js";
3
+ import { useConfigStore as y } from "../../../../stores/config.js";
4
4
  import { defineStore as G } from "pinia";
5
5
  import { DEFAULT_CARDS_IN_ROW as F } from "../constants/layout.js";
6
6
  import { EXCLUDED_ALGORITHM_IDS as w } from "../constants/defaultConfig.js";
7
7
  import { getDefaultProducts as S } from "../templates/utils.js";
8
8
  import { generateCompleteFilterQuery as b } from "../utils/filterUtil.js";
9
9
  import { isFilterValid as D } from "../validation/filterSchema.js";
10
- const h = y();
11
- let u = null, m = null, d = null;
10
+ const h = C();
11
+ let m = null, u = null, d = null;
12
12
  function I() {
13
13
  return {
14
14
  cardsInRow: F,
@@ -57,7 +57,7 @@ const v = () => ({
57
57
  blockStates: {},
58
58
  currentRecommendationId: null,
59
59
  configVersion: 0
60
- }), E = G("guidoRecommendationExtension", {
60
+ }), z = G("guidoRecommendationExtension", {
61
61
  state: () => v(),
62
62
  getters: {
63
63
  // ====================================================================
@@ -131,11 +131,10 @@ const v = () => ({
131
131
  })),
132
132
  getFilterList() {
133
133
  return Object.values(this.filterList).map((t) => {
134
- const r = t.type === "defaultAttribute", e = k.includes(t.attributeName);
135
- let n = r ? t.attributeName : `product_attributes.${t.attributeName}`;
136
- return n = e ? `${n}.${this.recommendationConfigs.currencySettings.value}` : n, {
134
+ let r;
135
+ return t.type === "productAttribute" ? r = `product_attributes.${t.attributeName}` : k.includes(t.attributeName) ? r = `${t.attributeName}.${this.recommendationConfigs.currencySettings.value}` : r = t.attributeName, {
137
136
  text: t.displayName,
138
- value: n,
137
+ value: r,
139
138
  type: t.attributeType
140
139
  };
141
140
  });
@@ -163,10 +162,15 @@ const v = () => ({
163
162
  * Resets currentRecommendationId if it was the deleted block.
164
163
  */
165
164
  removeBlockState(t) {
166
- const r = { ...this.blockStates };
167
- if (delete r[t], this.blockStates = r, this.currentRecommendationId === t) {
168
- const e = Object.keys(this.blockStates).map(Number);
169
- this.currentRecommendationId = e.length > 0 ? e[0] : null;
165
+ const r = t.toString();
166
+ if (this.recommendationCampaignUrls[r]) {
167
+ const n = { ...this.recommendationCampaignUrls };
168
+ delete n[r], this.recommendationCampaignUrls = n;
169
+ }
170
+ const e = { ...this.blockStates };
171
+ if (delete e[t], this.blockStates = e, this.currentRecommendationId === t) {
172
+ const n = Object.keys(this.blockStates).map(Number);
173
+ this.currentRecommendationId = n.length > 0 ? n[0] : null;
170
174
  }
171
175
  },
172
176
  /**
@@ -251,11 +255,11 @@ const v = () => ({
251
255
  // ====================================================================
252
256
  async fetchRecommendationCreateData() {
253
257
  if (!this.activePredictiveAlgorithms.length) {
254
- if (u) {
255
- await u;
258
+ if (m) {
259
+ await m;
256
260
  return;
257
261
  }
258
- u = (async () => {
262
+ m = (async () => {
259
263
  const {
260
264
  activePredictiveAlgorithms: t,
261
265
  languages: r,
@@ -268,26 +272,26 @@ const v = () => ({
268
272
  this.currencyList = e;
269
273
  })();
270
274
  try {
271
- await u;
275
+ await m;
272
276
  } finally {
273
- u = null;
277
+ m = null;
274
278
  }
275
279
  }
276
280
  },
277
281
  async fetchRecommendationFilters() {
278
282
  if (!Object.keys(this.filterList).length) {
279
- if (m) {
280
- await m;
283
+ if (u) {
284
+ await u;
281
285
  return;
282
286
  }
283
- m = (async () => {
287
+ u = (async () => {
284
288
  const t = await h.fetchRecommendationFilters();
285
289
  this.filterList = t;
286
290
  })();
287
291
  try {
288
- await m;
292
+ await u;
289
293
  } finally {
290
- m = null;
294
+ u = null;
291
295
  }
292
296
  }
293
297
  },
@@ -375,7 +379,7 @@ const v = () => ({
375
379
  },
376
380
  async _doFetchProducts() {
377
381
  var p;
378
- const t = this.currentRecommendationId, r = this.blockStates[t], { recommendationConfigs: e } = r, n = e.filters.filter((a) => a.isValid), c = b(n), i = ((p = g.find((a) => a.key === e.strategy)) == null ? void 0 : p.path) || "", o = C(), s = {
382
+ const t = this.currentRecommendationId, r = this.blockStates[t], { recommendationConfigs: e } = r, n = e.filters.filter((a) => a.isValid), c = b(n), i = ((p = g.find((a) => a.key === e.strategy)) == null ? void 0 : p.path) || "", o = y(), s = {
379
383
  locale: e.language,
380
384
  currency: e.currencySettings.value,
381
385
  partnerName: o.partnerName,
@@ -399,5 +403,5 @@ const v = () => ({
399
403
  }
400
404
  });
401
405
  export {
402
- E as useRecommendationExtensionStore
406
+ z as useRecommendationExtensionStore
403
407
  };
@@ -1,7 +1,7 @@
1
- import { ATTR_PRODUCT_IMAGE as d, ATTR_PRODUCT_BUTTON as a } from "../../constants/selectors.js";
2
- import { DEFAULT_CARD_COMPOSITION as m, spacer as C, buildElementRenderer as b, DEFAULT_CARD_VISIBILITY as T } from "../utils.js";
3
- import { listElementRenderer as R } from "./elementRenderer.js";
4
- function f(r, n, l) {
1
+ import { ATTR_PRODUCT_IMAGE as a, ATTR_PRODUCT_BUTTON as d } from "../../constants/selectors.js";
2
+ import { DEFAULT_CARD_COMPOSITION as b, spacer as m, buildElementRenderer as C, DEFAULT_CARD_VISIBILITY as T } from "../utils.js";
3
+ import { listElementRenderer as f } from "./elementRenderer.js";
4
+ function R(r, n, l) {
5
5
  const t = l ? "" : ' style="display: none;"', o = r.replace(/<tr>/, "").replace(/<\/tr>/, "");
6
6
  return `<tr
7
7
  class="recommendation-attribute-row"
@@ -26,26 +26,26 @@ const y = `
26
26
  </td>
27
27
  </tr>
28
28
  `;
29
- function O(r, n = m, l = {}) {
30
- const t = b(R, n, l), o = t[d](r), c = `
29
+ function O(r, n = b, l = {}) {
30
+ const t = C(f, n, l), o = t[a](r), c = `
31
31
  <td class="product-info-cell" valign="middle" style="padding: 15px;">
32
- <table cellpadding="0" cellspacing="0" role="presentation" width="100%">
32
+ <table cellpadding="0" cellspacing="0" role="presentation" width="100%" style="table-layout: fixed;">
33
33
  <tbody>
34
- ${n.filter((e) => e !== d && e !== a).filter((e) => t[e]).map((e) => {
34
+ ${n.filter((e) => e !== a && e !== d).filter((e) => t[e]).map((e) => {
35
35
  const u = T[e] ?? !0;
36
- return f(t[e](r), e, u);
36
+ return R(t[e](r), e, u);
37
37
  }).join(`
38
38
  `)}
39
39
  </tbody>
40
40
  </table>
41
41
  </td>
42
- `, s = t[a](r), p = o + c + s;
42
+ `, s = t[d](r), p = o + c + s;
43
43
  return y.replace("{-{-PRODUCT_CONTENT-}-}", p);
44
44
  }
45
45
  function D(r, n, l = {}) {
46
46
  return r.map((t, o) => {
47
47
  const i = O(t, n, l);
48
- return o > 0 ? C + i : i;
48
+ return o > 0 ? m + i : i;
49
49
  }).join("");
50
50
  }
51
51
  export {
@@ -1,28 +1,44 @@
1
- function l(t) {
1
+ import { OP_ANY_OF as l } from "../../../../enums/extensions/recommendationBlock.js";
2
+ function m(t) {
3
+ try {
4
+ return decodeURIComponent(t);
5
+ } catch {
6
+ return t;
7
+ }
8
+ }
9
+ function f(t) {
10
+ return t.split(",").filter(Boolean).map(m);
11
+ }
12
+ function y(t) {
2
13
  if (t.length === 0)
3
14
  return "";
4
- const o = t.sort((r, e) => r.filterNumber - e.filterNumber), n = o.map((r) => `[${r.attribute}][${r.operator}][${r.value}]`), [p, ...i] = n;
5
- let u = p;
6
- for (let r = 0; r < i.length; r++) {
15
+ const o = t.sort((r, e) => r.filterNumber - e.filterNumber), u = o.map((r) => {
16
+ const e = r.operator === l, a = e ? "=" : r.operator, c = e ? f(r.value).join(l) : r.value;
17
+ return `[${r.attribute}][${a}][${c}]`;
18
+ }), [i, ...p] = u;
19
+ let n = i;
20
+ for (let r = 0; r < p.length; r++) {
7
21
  const e = o[r].innerGroupOperator;
8
- u += `${e}${i[r]}`;
22
+ n += `${e}${p[r]}`;
9
23
  }
10
- return `(${u})`;
24
+ return `(${n})`;
11
25
  }
12
- function f(t) {
26
+ function Q(t) {
13
27
  if (!t || t.length === 0)
14
28
  return "";
15
- const o = t.reduce((r, e) => (r[e.filterGroup] || (r[e.filterGroup] = []), r[e.filterGroup].push(e), r), {}), n = Object.keys(o).map(Number).sort((r, e) => r - e), p = n.map((r) => {
29
+ const o = t.reduce((r, e) => (r[e.filterGroup] || (r[e.filterGroup] = []), r[e.filterGroup].push(e), r), {}), u = Object.keys(o).map(Number).sort((r, e) => r - e), i = u.map((r) => {
16
30
  const e = o[r];
17
- return l(e);
18
- }), [i, ...u] = p;
19
- let s = i;
20
- for (let r = 0; r < u.length; r++) {
21
- const e = n[r + 1], c = o[e][0].outerGroupOperator;
22
- s += `${c}${u[r]}`;
31
+ return y(e);
32
+ }), [p, ...n] = i;
33
+ let s = p;
34
+ for (let r = 0; r < n.length; r++) {
35
+ const e = u[r + 1], c = o[e][0].outerGroupOperator;
36
+ s += `${c}${n[r]}`;
23
37
  }
24
38
  return s.trim();
25
39
  }
26
40
  export {
27
- f as generateCompleteFilterQuery
41
+ Q as generateCompleteFilterQuery,
42
+ f as parseTagList,
43
+ m as safeDecodeURIComponent
28
44
  };
@@ -3,15 +3,15 @@ var h = (n, i, e) => i in n ? d(n, i, { enumerable: !0, configurable: !0, writab
3
3
  var u = (n, i, e) => h(n, typeof i != "symbol" ? i + "" : i, e);
4
4
  import { PAGE_TYPES as E } from "../../../enums/unsubscribe.js";
5
5
  import { useUnsubscribeStore as c } from "../../../stores/unsubscribe.js";
6
- import { Block as _, BlockCompositionType as S, ModificationDescription as b } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
7
- import { getDefaultTemplate as L } from "./template.js";
6
+ import { Block as _, BlockCompositionType as S, BlockType as L, ModificationDescription as b } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
7
+ import { getDefaultTemplate as v } from "./template.js";
8
8
  import { UNSUBSCRIBE_EVENTS as a, DATA_ATTRIBUTES as o } from "./utils/constants.js";
9
9
  import { parsePageList as p } from "./utils/utils.js";
10
- const v = "unsubscribe-block", g = 'a[data-unsubscribe-link="true"]', f = ".unsubscribe-block-v2", T = "{{ins-unsubscribe-link}}", B = {
10
+ const g = "unsubscribe-block", T = 'a[data-unsubscribe-link="true"]', f = ".unsubscribe-block-v2", B = "{{ins-unsubscribe-link}}", C = {
11
11
  [E.GLOBAL_UNSUBSCRIBE]: "{{ins-global-unsubscribe-link}}",
12
12
  [E.SUBSCRIPTION_PREFERENCE_CENTER]: "{{ins-preferences-unsubscribe-link}}"
13
13
  };
14
- class R extends _ {
14
+ class I extends _ {
15
15
  constructor() {
16
16
  super();
17
17
  u(this, "selectEventListener", null);
@@ -19,7 +19,7 @@ class R extends _ {
19
19
  u(this, "currentNode");
20
20
  }
21
21
  getId() {
22
- return v;
22
+ return g;
23
23
  }
24
24
  getIcon() {
25
25
  return "unsubscribe-icon";
@@ -34,7 +34,7 @@ class R extends _ {
34
34
  return this.api.translate("Unsubscribe Block Description");
35
35
  }
36
36
  getTemplate() {
37
- return L();
37
+ return v();
38
38
  }
39
39
  onSelect(e) {
40
40
  this.currentNode = e, !("getAttribute" in e && e.getAttribute("data-migration")) && (this._resetStoreState(), this._loadBlockState(e), this._setupSelectEventListener(), this._setupCancelEventListener(), this._checkExistingBlocks(), this._openDrawer());
@@ -66,7 +66,7 @@ class R extends _ {
66
66
  try {
67
67
  if (!this.currentNode)
68
68
  return;
69
- this.api.getDocumentModifier().modifyHtml(this.currentNode).delete().apply(new b("Removed unsubscribe block due to cancel"));
69
+ this.api.getDocumentModifier().modifyHtml(this.currentNode).replaceWith(`<${L.EMPTY_CONTAINER}/>`).apply(new b("Removed unsubscribe block due to cancel"));
70
70
  } catch (e) {
71
71
  console.warn("[UnsubscribeBlock] Failed to remove unsubscribe block:", e);
72
72
  }
@@ -77,14 +77,14 @@ class R extends _ {
77
77
  _updateBlock(e, r) {
78
78
  if (!this.currentNode || !("querySelector" in this.currentNode))
79
79
  return;
80
- const s = this.currentNode.querySelector(g);
80
+ const s = this.currentNode.querySelector(T);
81
81
  if (!s)
82
82
  return;
83
83
  const t = this._getMergeTag(e);
84
84
  this.api.getDocumentModifier().modifyHtml(s).setAttribute("href", t).apply(new b(`Updated unsubscribe link to ${t}`)), this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute(o.PAGE_TYPE, e.toString()).setAttribute(o.PAGE_LIST, r).apply(new b("Updated unsubscribe block metadata"));
85
85
  }
86
86
  _getMergeTag(e) {
87
- return B[e] ?? T;
87
+ return C[e] ?? B;
88
88
  }
89
89
  _openDrawer() {
90
90
  if (!(this.currentNode && this.currentNode.getAttribute("data-unsubscribe-page-type")))
@@ -130,6 +130,6 @@ class R extends _ {
130
130
  }
131
131
  }
132
132
  export {
133
- v as UNSUBSCRIBE_BLOCK_ID,
134
- R as UnsubscribeBlock
133
+ g as UNSUBSCRIBE_BLOCK_ID,
134
+ I as UnsubscribeBlock
135
135
  };
package/dist/guido.css CHANGED
@@ -1 +1 @@
1
- .gap-16[data-v-3b53a736],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-cd76c125] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-195ab6d4]{position:relative;display:inline-block}.new-tag[data-v-195ab6d4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-195ab6d4] .guido__view-option-selection-desktop svg,[data-v-195ab6d4] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-195ab6d4] .in-segments-wrapper__button_selected,[data-v-195ab6d4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-195ab6d4] .in-tooltip-wrapper__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-64c52560]{gap:8px}.version-history__toolbar[data-v-64c52560]{gap:4px}.view-options-wrapper[data-v-d405ca59]{position:relative;display:inline-block}.new-tag[data-v-d405ca59]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-d405ca59] .guido__verion-history-view-option-selection-desktop svg,[data-v-d405ca59] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-d405ca59] .in-segments-wrapper__button_selected,[data-v-d405ca59] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-d405ca59] .in-tooltip-wrapper__icon{cursor:pointer}.editor-actions[data-v-4e2a4adb]{gap:4px}.header-wrapper[data-v-5c02dcc7]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-25780af6]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-25780af6]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-25780af6]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-df672485]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-df672485]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-df672485]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-df672485]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-df672485]{object-fit:cover;transform:scale(1)}[data-v-43c617a7] .guido__verion-history-view-option-selection-desktop svg,[data-v-43c617a7] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-43c617a7] .in-segments-wrapper__button_selected,[data-v-43c617a7] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-988f8da6]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-988f8da6]{min-height:504px}.iframe-wrapper[data-v-e0424e99]{width:258px}.iframe-scaled[data-v-e0424e99]{width:320px;height:124.0310077519%;transform:scale(.80625);transform-origin:top left}.cropped-text[data-v-eb3d05d7]{width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-preview-wrapper__phone[data-v-3f472f96]{width:282px}.mobile-preview-wrapper__phone img[data-v-3f472f96]{object-fit:cover;border-radius:44px}.mobile-preview-wrapper__content[data-v-3f472f96]{width:258px;height:450px;left:12px}[data-v-29b9af29] .vueperslides__bullets,[data-v-dd1a237a] .vueperslides__bullets{pointer-events:none!important}[data-v-dd1a237a] .vueperslides__parallax-wrapper{height:110px!important}[data-v-d073b1dc] .vueperslides__bullets{pointer-events:none!important}[data-v-d073b1dc] .vueperslides__parallax-wrapper{height:110px!important}
1
+ .gap-16[data-v-8053a037],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-cd76c125] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-195ab6d4]{position:relative;display:inline-block}.new-tag[data-v-195ab6d4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-195ab6d4] .guido__view-option-selection-desktop svg,[data-v-195ab6d4] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-195ab6d4] .in-segments-wrapper__button_selected,[data-v-195ab6d4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-195ab6d4] .in-tooltip-wrapper__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-64c52560]{gap:8px}.version-history__toolbar[data-v-64c52560]{gap:4px}.view-options-wrapper[data-v-d405ca59]{position:relative;display:inline-block}.new-tag[data-v-d405ca59]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-d405ca59] .guido__verion-history-view-option-selection-desktop svg,[data-v-d405ca59] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-d405ca59] .in-segments-wrapper__button_selected,[data-v-d405ca59] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-d405ca59] .in-tooltip-wrapper__icon{cursor:pointer}.editor-actions[data-v-4e2a4adb]{gap:4px}.header-wrapper[data-v-5c02dcc7]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-25780af6]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-25780af6]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-25780af6]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-df672485]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-df672485]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-df672485]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-df672485]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-df672485]{object-fit:cover;transform:scale(1)}[data-v-43c617a7] .guido__verion-history-view-option-selection-desktop svg,[data-v-43c617a7] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-43c617a7] .in-segments-wrapper__button_selected,[data-v-43c617a7] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-988f8da6]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-988f8da6]{min-height:504px}.iframe-wrapper[data-v-e0424e99]{width:258px}.iframe-scaled[data-v-e0424e99]{width:320px;height:124.0310077519%;transform:scale(.80625);transform-origin:top left}.cropped-text[data-v-eb3d05d7]{width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-preview-wrapper__phone[data-v-3f472f96]{width:282px}.mobile-preview-wrapper__phone img[data-v-3f472f96]{object-fit:cover;border-radius:44px}.mobile-preview-wrapper__content[data-v-3f472f96]{width:258px;height:450px;left:12px}[data-v-29b9af29] .vueperslides__bullets,[data-v-dd1a237a] .vueperslides__bullets{pointer-events:none!important}[data-v-dd1a237a] .vueperslides__parallax-wrapper{height:110px!important}[data-v-d073b1dc] .vueperslides__bullets{pointer-events:none!important}[data-v-d073b1dc] .vueperslides__parallax-wrapper{height:110px!important}