@useinsider/guido 2.1.0-beta.e13d291 → 2.1.0-beta.e2153c2

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 (138) hide show
  1. package/README.md +36 -0
  2. package/dist/@types/config/schemas.js +70 -65
  3. package/dist/components/Guido.vue.js +1 -1
  4. package/dist/components/Guido.vue2.js +69 -58
  5. package/dist/components/organisms/extensions/recommendation/FilterSelectionDrawer.vue2.js +15 -14
  6. package/dist/components/organisms/header/HeaderWrapper.vue.js +9 -9
  7. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue.js +1 -1
  8. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue2.js +19 -19
  9. package/dist/composables/useActionsApi.js +15 -13
  10. package/dist/composables/useBlocksConfig.js +26 -16
  11. package/dist/composables/useHtmlValidator.js +114 -104
  12. package/dist/composables/useRecommendation.js +54 -21
  13. package/dist/composables/useStripo.js +25 -23
  14. package/dist/composables/useVersionHistoryApi.js +1 -1
  15. package/dist/config/compiler/recommendationCompilerRules.js +45 -39
  16. package/dist/config/compiler/utils/recommendationCompilerUtils.js +121 -0
  17. package/dist/config/i18n/en/index.js +11 -0
  18. package/dist/config/i18n/en/labels.json.js +7 -0
  19. package/dist/config/i18n/en/toasters.json.js +56 -0
  20. package/dist/config/i18n/en/tooltips.json.js +82 -0
  21. package/dist/config/i18n/index.js +7 -0
  22. package/dist/config/migrator/itemsBlockMigrator.js +142 -120
  23. package/dist/enums/defaults.js +8 -4
  24. package/dist/enums/extensions/recommendationBlock.js +1 -1
  25. package/dist/enums/recommendation.js +16 -15
  26. package/dist/extensions/Blocks/Items/block.js +19 -28
  27. package/dist/extensions/Blocks/Items/controls/button/link.js +19 -31
  28. package/dist/extensions/Blocks/Items/controls/cardComposition.js +124 -85
  29. package/dist/extensions/Blocks/Items/controls/image/link.js +19 -31
  30. package/dist/extensions/Blocks/Items/controls/name/trimming.js +28 -40
  31. package/dist/extensions/Blocks/Items/controls/price/currencyLocation.js +35 -47
  32. package/dist/extensions/Blocks/Items/controls/price/currencySymbol.js +49 -54
  33. package/dist/extensions/Blocks/Items/controls/price/formattedPrice.js +42 -51
  34. package/dist/extensions/Blocks/Items/controls/price/hideDiscount.js +23 -36
  35. package/dist/extensions/Blocks/Items/controls/price/priceOrientation.js +45 -57
  36. package/dist/extensions/Blocks/Items/controls/price/singlePrice.js +42 -60
  37. package/dist/extensions/Blocks/Items/controls/settingsControl.js +189 -196
  38. package/dist/extensions/Blocks/Items/enums/settingsEnums.js +0 -2
  39. package/dist/extensions/Blocks/Items/extension.js +8 -9
  40. package/dist/extensions/Blocks/Items/settingsPanel.js +10 -15
  41. package/dist/extensions/Blocks/Items/template.js +181 -175
  42. package/dist/extensions/Blocks/Items/utils/nodeConfigUtils.js +65 -65
  43. package/dist/extensions/Blocks/Recommendation/block.js +117 -27
  44. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +33 -31
  45. package/dist/extensions/Blocks/Recommendation/constants/layout.js +6 -4
  46. package/dist/extensions/Blocks/Recommendation/constants/selectors.js +12 -10
  47. package/dist/extensions/Blocks/Recommendation/controls/layout/index.js +10 -14
  48. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +19 -27
  49. package/dist/extensions/Blocks/Recommendation/controls/main/currency.js +49 -44
  50. package/dist/extensions/Blocks/Recommendation/controls/main/filters.js +1 -3
  51. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +147 -102
  52. package/dist/extensions/Blocks/Recommendation/controls/main/locale.js +1 -5
  53. package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +85 -43
  54. package/dist/extensions/Blocks/Recommendation/controls/main/shuffle.js +9 -13
  55. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +138 -117
  56. package/dist/extensions/Blocks/Recommendation/controls/mobileLayout/cssRules.js +21 -0
  57. package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +66 -34
  58. package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +2 -2
  59. package/dist/extensions/Blocks/Recommendation/services/configService.js +2 -1
  60. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +248 -206
  61. package/dist/extensions/Blocks/Recommendation/templates/grid/elementRenderer.js +26 -31
  62. package/dist/extensions/Blocks/Recommendation/templates/grid/migration.js +1 -1
  63. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +31 -34
  64. package/dist/extensions/Blocks/Recommendation/templates/list/elementRenderer.js +20 -25
  65. package/dist/extensions/Blocks/Recommendation/templates/list/template.js +22 -22
  66. package/dist/extensions/Blocks/Recommendation/templates/utils.js +52 -39
  67. package/dist/extensions/Blocks/Recommendation/utils/preserveTextStyles.js +10 -10
  68. package/dist/extensions/Blocks/Unsubscribe/block.js +29 -29
  69. package/dist/extensions/Blocks/Unsubscribe/control.js +12 -9
  70. package/dist/extensions/Blocks/Unsubscribe/elements/preview.js +13 -11
  71. package/dist/extensions/Blocks/Unsubscribe/styles.css.js +31 -1
  72. package/dist/extensions/Blocks/common-control.js +91 -92
  73. package/dist/extensions/ModulesTabIcons/extension.js +17 -0
  74. package/dist/guido.css +1 -1
  75. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +257 -187
  76. package/dist/package.json.js +1 -1
  77. package/dist/services/recommendationApi.js +11 -9
  78. package/dist/services/stripoApi.js +20 -17
  79. package/dist/services/templateLibraryApi.js +16 -13
  80. package/dist/src/@types/config/schemas.d.ts +8 -0
  81. package/dist/src/composables/useConfig.d.ts +4 -0
  82. package/dist/src/composables/useRecommendation.d.ts +1 -0
  83. package/dist/src/config/compiler/utils/recommendationCompilerUtils.d.ts +17 -0
  84. package/dist/src/config/i18n/en/index.d.ts +1 -0
  85. package/dist/src/config/i18n/index.d.ts +16 -0
  86. package/dist/src/enums/defaults.d.ts +4 -0
  87. package/dist/src/extensions/Blocks/Items/block.d.ts +0 -1
  88. package/dist/src/extensions/Blocks/Items/controls/button/link.d.ts +0 -1
  89. package/dist/src/extensions/Blocks/Items/controls/cardComposition.d.ts +5 -5
  90. package/dist/src/extensions/Blocks/Items/controls/image/link.d.ts +0 -1
  91. package/dist/src/extensions/Blocks/Items/controls/name/trimming.d.ts +0 -1
  92. package/dist/src/extensions/Blocks/Items/controls/price/currencyLocation.d.ts +0 -1
  93. package/dist/src/extensions/Blocks/Items/controls/price/currencySymbol.d.ts +0 -1
  94. package/dist/src/extensions/Blocks/Items/controls/price/formattedPrice.d.ts +0 -1
  95. package/dist/src/extensions/Blocks/Items/controls/price/hideDiscount.d.ts +0 -1
  96. package/dist/src/extensions/Blocks/Items/controls/price/priceOrientation.d.ts +0 -1
  97. package/dist/src/extensions/Blocks/Items/controls/price/singlePrice.d.ts +0 -5
  98. package/dist/src/extensions/Blocks/Items/controls/settingsControl.d.ts +10 -12
  99. package/dist/src/extensions/Blocks/Items/utils/nodeConfigUtils.d.ts +2 -1
  100. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +44 -11
  101. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +2 -2
  102. package/dist/src/extensions/Blocks/Recommendation/constants/layout.d.ts +6 -0
  103. package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +4 -0
  104. package/dist/src/extensions/Blocks/Recommendation/controls/main/currency.d.ts +8 -1
  105. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +27 -5
  106. package/dist/src/extensions/Blocks/Recommendation/controls/main/productLayout.d.ts +22 -4
  107. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +9 -2
  108. package/dist/src/extensions/Blocks/Recommendation/controls/mobileLayout/cssRules.d.ts +29 -0
  109. package/dist/src/extensions/Blocks/Recommendation/controls/name/textTrim.d.ts +19 -1
  110. package/dist/src/extensions/Blocks/Recommendation/controls/spacing/index.d.ts +2 -2
  111. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +138 -469
  112. package/dist/src/extensions/Blocks/Recommendation/templates/grid/elementRenderer.d.ts +2 -2
  113. package/dist/src/extensions/Blocks/Recommendation/templates/grid/template.d.ts +4 -4
  114. package/dist/src/extensions/Blocks/Recommendation/templates/index.d.ts +2 -0
  115. package/dist/src/extensions/Blocks/Recommendation/templates/list/elementRenderer.d.ts +2 -2
  116. package/dist/src/extensions/Blocks/Recommendation/templates/list/template.d.ts +2 -2
  117. package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +16 -4
  118. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +14 -2
  119. package/dist/src/extensions/Blocks/Recommendation/utils/stylePreserver.d.ts +1 -1
  120. package/dist/src/extensions/Blocks/Unsubscribe/control.d.ts +1 -0
  121. package/dist/src/extensions/Blocks/common-control.d.ts +4 -5
  122. package/dist/src/extensions/ModulesTabIcons/extension.d.ts +2 -0
  123. package/dist/src/stores/config.d.ts +36 -0
  124. package/dist/static/styles/components/notification.css.js +19 -0
  125. package/dist/static/styles/components/tools.css.js +6 -2
  126. package/dist/static/styles/components/version-history.css.js +10 -2
  127. package/dist/static/styles/components/wide-panel.css.js +18 -2
  128. package/dist/static/styles/customEditorStyle.css.js +10 -9
  129. package/dist/static/styles/variables.css.js +2 -0
  130. package/dist/static/templates/empty/index.html.js +74 -0
  131. package/dist/static/templates/empty/style.css.js +779 -0
  132. package/dist/stores/unsubscribe.js +37 -34
  133. package/dist/utils/pairProductVariables.js +57 -56
  134. package/dist/utils/templatePreparation.js +15 -14
  135. package/package.json +2 -2
  136. package/dist/extensions/Blocks/Items/store/items-block.js +0 -79
  137. package/dist/src/extensions/Blocks/Items/store/items-block.d.ts +0 -45
  138. package/dist/src/extensions/Blocks/Recommendation/controls/nameTextTrimControl.d.ts +0 -16
@@ -1,14 +1,14 @@
1
- import { RecommendationFeedSourceMaps as l, PriceAttributes as p } from "../../../../enums/extensions/recommendationBlock.js";
2
- import { useRecommendationApi as m } from "../../../../services/recommendationApi.js";
3
- import { useConfigStore as f } from "../../../../stores/config.js";
4
- import { defineStore as d } from "pinia";
5
- import { DEFAULT_CARDS_IN_ROW as g } from "../constants/layout.js";
6
- import { generateCompleteFilterQuery as c } from "../utils/filterUtil.js";
7
- const s = m(), h = () => ({
8
- recommendationCampaignUrls: {},
9
- recommendationProducts: [],
10
- recommendationConfigs: {
11
- cardsInRow: g,
1
+ import { RecommendationFeedSourceMaps as d, PriceAttributes as S } from "../../../../enums/extensions/recommendationBlock.js";
2
+ import { useRecommendationApi as p } from "../../../../services/recommendationApi.js";
3
+ import { useConfigStore as b } from "../../../../stores/config.js";
4
+ import { defineStore as I } from "pinia";
5
+ import { DEFAULT_CARDS_IN_ROW as R } from "../constants/layout.js";
6
+ import { getDefaultProducts as k } from "../templates/utils.js";
7
+ import { generateCompleteFilterQuery as f } from "../utils/filterUtil.js";
8
+ const m = p();
9
+ function h() {
10
+ return {
11
+ cardsInRow: R,
12
12
  currencySettings: {
13
13
  name: "USD",
14
14
  value: "USD",
@@ -18,107 +18,10 @@ const s = m(), h = () => ({
18
18
  decimalSeparator: ",",
19
19
  thousandSeparator: "."
20
20
  },
21
- filters: [
22
- {
23
- type: "standardFilter",
24
- attribute: "product_attributes.rating_star",
25
- operatorReplace: "=",
26
- operator: "=",
27
- innerGroupOperator: "*",
28
- outerGroupOperator: "*",
29
- value: "5",
30
- filterGroup: 1,
31
- filterNumber: 1,
32
- isValid: !0
33
- },
34
- {
35
- type: "standardFilter",
36
- attribute: "gender",
37
- operatorReplace: "=",
38
- operator: "=",
39
- innerGroupOperator: "|",
40
- outerGroupOperator: "*",
41
- value: "male",
42
- filterGroup: 1,
43
- filterNumber: 2,
44
- isValid: !0
45
- },
46
- {
47
- type: "standardFilter",
48
- attribute: "size",
49
- operatorReplace: "=",
50
- operator: "=",
51
- innerGroupOperator: "*",
52
- outerGroupOperator: "*",
53
- value: "L",
54
- filterGroup: 1,
55
- filterNumber: 3,
56
- isValid: !0
57
- },
58
- {
59
- type: "standardFilter",
60
- attribute: "price.USD",
61
- operatorReplace: ">",
62
- operator: ">",
63
- innerGroupOperator: "*",
64
- outerGroupOperator: "*",
65
- value: "20",
66
- filterGroup: 2,
67
- filterNumber: 1,
68
- isValid: !0
69
- },
70
- {
71
- type: "standardFilter",
72
- attribute: "url",
73
- operatorReplace: "~",
74
- operator: "~",
75
- innerGroupOperator: "|",
76
- outerGroupOperator: "*",
77
- value: "user",
78
- filterGroup: 2,
79
- filterNumber: 2,
80
- isValid: !0
81
- },
82
- {
83
- type: "standardFilter",
84
- attribute: "category",
85
- operatorReplace: "!~",
86
- operator: "!~",
87
- innerGroupOperator: "*",
88
- outerGroupOperator: "|",
89
- value: "t-shirt",
90
- filterGroup: 3,
91
- filterNumber: 1,
92
- isValid: !0
93
- },
94
- {
95
- type: "standardFilter",
96
- attribute: "omnibus_price.USD",
97
- operatorReplace: ">",
98
- operator: ">",
99
- innerGroupOperator: "*",
100
- outerGroupOperator: "|",
101
- value: "31",
102
- filterGroup: 3,
103
- filterNumber: 2,
104
- isValid: !0
105
- },
106
- {
107
- type: "standardFilter",
108
- attribute: "omnibus_discount.USD",
109
- operatorReplace: "<",
110
- operator: "%3C",
111
- innerGroupOperator: "|",
112
- outerGroupOperator: "|",
113
- value: "20",
114
- filterGroup: 3,
115
- filterNumber: 3,
116
- isValid: !0
117
- }
118
- ],
119
- productIds: ["22", "12"],
21
+ filters: [],
22
+ productIds: [],
120
23
  id: 1,
121
- language: "tr_TR",
24
+ language: "en_US",
122
25
  orientation: "grid",
123
26
  recommendedProducts: [],
124
27
  sendProductRequestFlag: !1,
@@ -127,69 +30,211 @@ const s = m(), h = () => ({
127
30
  textTrimming: !0,
128
31
  unresponsive: !1,
129
32
  size: "6"
130
- },
33
+ };
34
+ }
35
+ function C() {
36
+ return {
37
+ recommendationConfigs: h(),
38
+ recommendationProducts: [],
39
+ filterStatus: !1,
40
+ filterSelectionDrawerStatus: !1,
41
+ filterGroup: 1,
42
+ isInitialized: !1
43
+ };
44
+ }
45
+ const y = () => ({
46
+ recommendationCampaignUrls: {},
131
47
  activePredictiveAlgorithms: [],
132
48
  languages: {},
133
49
  currencyList: [],
134
- filterStatus: !1,
135
- filterSelectionDrawerStatus: !1,
136
50
  filterList: {},
137
- filterGroup: 1
138
- }), R = d("guidoRecommendationExtension", {
139
- state: () => h(),
51
+ blockStates: {},
52
+ currentRecommendationId: null,
53
+ configVersion: 0
54
+ }), A = I("guidoRecommendationExtension", {
55
+ state: () => y(),
140
56
  getters: {
141
- hasFilters: (e) => !!e.recommendationConfigs.filters.length,
142
- getFilterGroupCount: (e) => {
143
- const { filters: t } = e.recommendationConfigs;
57
+ // ====================================================================
58
+ // Proxy Getters — Backward Compatible Access to Current Block State
59
+ // ====================================================================
60
+ /**
61
+ * Proxy getter: delegates to blockStates[currentRecommendationId].recommendationConfigs
62
+ * This allows all existing code that reads `store.recommendationConfigs` to work unchanged.
63
+ */
64
+ recommendationConfigs(t) {
65
+ return t.currentRecommendationId !== null && t.blockStates[t.currentRecommendationId] ? t.blockStates[t.currentRecommendationId].recommendationConfigs : h();
66
+ },
67
+ /**
68
+ * Proxy getter: delegates to blockStates[currentRecommendationId].recommendationProducts
69
+ */
70
+ recommendationProducts(t) {
71
+ return t.currentRecommendationId !== null && t.blockStates[t.currentRecommendationId] ? t.blockStates[t.currentRecommendationId].recommendationProducts : [];
72
+ },
73
+ /**
74
+ * Proxy getter: delegates to blockStates[currentRecommendationId].filterSelectionDrawerStatus
75
+ */
76
+ filterSelectionDrawerStatus(t) {
77
+ return t.currentRecommendationId !== null && t.blockStates[t.currentRecommendationId] ? t.blockStates[t.currentRecommendationId].filterSelectionDrawerStatus : !1;
78
+ },
79
+ /**
80
+ * Proxy getter: delegates to blockStates[currentRecommendationId].filterStatus
81
+ */
82
+ filterStatus(t) {
83
+ return t.currentRecommendationId !== null && t.blockStates[t.currentRecommendationId] ? t.blockStates[t.currentRecommendationId].filterStatus : !1;
84
+ },
85
+ /**
86
+ * Proxy getter: delegates to blockStates[currentRecommendationId].filterGroup
87
+ */
88
+ filterGroup(t) {
89
+ return t.currentRecommendationId !== null && t.blockStates[t.currentRecommendationId] ? t.blockStates[t.currentRecommendationId].filterGroup : 1;
90
+ },
91
+ // ====================================================================
92
+ // Existing Getters (now reading through proxy)
93
+ // ====================================================================
94
+ hasFilters() {
95
+ return !!this.recommendationConfigs.filters.length;
96
+ },
97
+ getFilterGroupCount() {
98
+ const { filters: t } = this.recommendationConfigs;
144
99
  return t.length && t[t.length - 1].filterGroup || 0;
145
100
  },
146
- getActivePredictiveAlgorithms: (e) => {
147
- const t = [];
148
- return e.activePredictiveAlgorithms.forEach((r) => {
149
- t.push(...l.filter((i) => i.id === r));
150
- }), t.map((r) => ({
151
- text: r.name,
152
- value: r.key
101
+ getActivePredictiveAlgorithms: (t) => {
102
+ const r = [];
103
+ return t.activePredictiveAlgorithms.forEach((e) => {
104
+ r.push(...d.filter((n) => n.id === e));
105
+ }), r.map((e) => ({
106
+ text: e.name,
107
+ value: e.key
153
108
  }));
154
109
  },
155
- getLanguages: (e) => Object.entries(e.languages).map(([t, r]) => ({
156
- text: r,
157
- value: t
110
+ getLanguages: (t) => Object.entries(t.languages).map(([r, e]) => ({
111
+ text: e,
112
+ value: r
158
113
  })),
159
- getCurrencySymbolList: (e) => e.currencyList.map((t) => ({
160
- text: t.text,
161
- value: t.text
114
+ getCurrencySymbolList: (t) => t.currencyList.map((r) => ({
115
+ text: r.text,
116
+ value: r.text
162
117
  })),
163
- getFilterList: (e) => Object.values(e.filterList).map((t) => {
164
- const r = t.type === "defaultAttribute", i = p.includes(t.attributeName);
165
- let o = r ? t.attributeName : `product_attributes.${t.attributeName}`;
166
- return o = i ? `${o}.${e.recommendationConfigs.currencySettings.value}` : o, {
167
- text: t.displayName,
168
- value: o,
169
- type: t.attributeType
170
- };
171
- }),
172
- getSelectedFilterGroup: (e) => (t) => [...e.recommendationConfigs.filters].filter((r) => r.filterGroup === t)
118
+ getFilterList() {
119
+ return Object.values(this.filterList).map((t) => {
120
+ const r = t.type === "defaultAttribute", e = S.includes(t.attributeName);
121
+ let n = r ? t.attributeName : `product_attributes.${t.attributeName}`;
122
+ return n = e ? `${n}.${this.recommendationConfigs.currencySettings.value}` : n, {
123
+ text: t.displayName,
124
+ value: n,
125
+ type: t.attributeType
126
+ };
127
+ });
128
+ },
129
+ getSelectedFilterGroup() {
130
+ return (t) => [...this.recommendationConfigs.filters].filter((r) => r.filterGroup === t);
131
+ }
173
132
  },
174
133
  actions: {
134
+ // ====================================================================
135
+ // Block Lifecycle Actions
136
+ // ====================================================================
137
+ /**
138
+ * Sets the currently active block ID.
139
+ * Creates a new entry in blockStates if one doesn't exist.
140
+ */
141
+ setCurrentBlock(t) {
142
+ this.blockStates[t] || (this.blockStates = {
143
+ ...this.blockStates,
144
+ [t]: C()
145
+ }), this.currentRecommendationId = t;
146
+ },
147
+ /**
148
+ * Removes a block's state from the store.
149
+ * Resets currentRecommendationId if it was the deleted block.
150
+ */
151
+ removeBlockState(t) {
152
+ const r = { ...this.blockStates };
153
+ if (delete r[t], this.blockStates = r, this.currentRecommendationId === t) {
154
+ const e = Object.keys(this.blockStates).map(Number);
155
+ this.currentRecommendationId = e.length > 0 ? e[0] : null;
156
+ }
157
+ },
158
+ /**
159
+ * Marks a block as initialized (initial API data has been fetched).
160
+ * Automatically cleaned up when removeBlockState deletes the block entry.
161
+ */
162
+ markBlockInitialized(t) {
163
+ this.blockStates[t] && (this.blockStates[t].isInitialized = !0);
164
+ },
165
+ /**
166
+ * Patches the current block's recommendationConfigs.
167
+ * Replaces `store.$patch({ recommendationConfigs: { ... } })` pattern.
168
+ */
169
+ patchCurrentBlockConfig(t, r = {}) {
170
+ if (this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId])
171
+ return;
172
+ const e = this.blockStates[this.currentRecommendationId];
173
+ e.recommendationConfigs = {
174
+ ...e.recommendationConfigs,
175
+ ...t,
176
+ currencySettings: {
177
+ ...e.recommendationConfigs.currencySettings,
178
+ ...t.currencySettings || {}
179
+ }
180
+ };
181
+ const { triggerRefetch: n = !0 } = r;
182
+ n && this.configVersion++;
183
+ },
184
+ /**
185
+ * Opens the filter selection drawer for the current block.
186
+ * If no filters exist, initializes with a default empty filter
187
+ * so the user has a starting point for input.
188
+ */
189
+ openFilterDrawer() {
190
+ if (this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId])
191
+ return;
192
+ const t = this.blockStates[this.currentRecommendationId];
193
+ t.recommendationConfigs.filters.length || (t.recommendationConfigs.filters = [{
194
+ type: "standardFilter",
195
+ attribute: "",
196
+ operatorReplace: "",
197
+ operator: "",
198
+ innerGroupOperator: "*",
199
+ outerGroupOperator: "*",
200
+ filterNumber: 1,
201
+ filterGroup: 1,
202
+ isValid: !1,
203
+ value: ""
204
+ }]), t.filterSelectionDrawerStatus = !0;
205
+ },
206
+ /**
207
+ * Closes the filter selection drawer for the current block
208
+ */
209
+ closeFilterDrawer() {
210
+ this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId] || (this.blockStates[this.currentRecommendationId].filterSelectionDrawerStatus = !1);
211
+ },
212
+ // ====================================================================
213
+ // Shared Data Fetching (fetched once, used by all blocks)
214
+ // ====================================================================
175
215
  async fetchRecommendationCreateData() {
176
216
  if (this.activePredictiveAlgorithms.length)
177
217
  return;
178
218
  const {
179
- activePredictiveAlgorithms: e,
180
- languages: t,
181
- currencies: r
182
- } = await s.fetchRecommendationCreateData();
183
- this.activePredictiveAlgorithms = e, this.languages = t;
184
- const [i] = r;
185
- this.recommendationConfigs.currencySettings.name = i.text, this.recommendationConfigs.currencySettings.value = i.value, this.currencyList = r, this.filterStatus = !!this.recommendationConfigs.filters.length;
219
+ activePredictiveAlgorithms: t,
220
+ languages: r,
221
+ currencies: e
222
+ } = await m.fetchRecommendationCreateData();
223
+ if (this.activePredictiveAlgorithms = t, this.languages = r, this.currentRecommendationId !== null && this.blockStates[this.currentRecommendationId]) {
224
+ const n = this.blockStates[this.currentRecommendationId];
225
+ n.filterStatus = !!n.recommendationConfigs.filters.length;
226
+ }
227
+ this.currencyList = e;
186
228
  },
187
229
  async fetchRecommendationFilters() {
188
- const e = await s.fetchRecommendationFilters();
189
- this.filterList = e;
230
+ const t = await m.fetchRecommendationFilters();
231
+ this.filterList = t;
190
232
  },
191
- addFilterGroup(e) {
192
- this.recommendationConfigs.filters.push({
233
+ // ====================================================================
234
+ // Per-Block Filter Actions
235
+ // ====================================================================
236
+ addFilterGroup(t) {
237
+ this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId] || this.blockStates[this.currentRecommendationId].recommendationConfigs.filters.push({
193
238
  type: "standardFilter",
194
239
  attribute: "",
195
240
  operatorReplace: "",
@@ -199,74 +244,71 @@ const s = m(), h = () => ({
199
244
  value: "",
200
245
  filterNumber: 1,
201
246
  isValid: !0,
202
- filterGroup: e
247
+ filterGroup: t
203
248
  });
204
249
  },
205
- updateFilter(e) {
206
- const t = this.recommendationConfigs.filters.findIndex((r) => r.filterNumber === e.filterNumber && r.filterGroup === e.filterGroup);
207
- if (t !== -1) {
208
- const r = [...this.recommendationConfigs.filters];
209
- r[t] = e, e.value.length && e.operator && e.attribute && e.innerGroupOperator && e.outerGroupOperator ? r[t].isValid = !0 : r[t].isValid = !1, this.$patch({
210
- recommendationConfigs: {
211
- filters: r
212
- }
213
- });
250
+ updateFilter(t) {
251
+ if (this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId])
252
+ return;
253
+ const r = this.blockStates[this.currentRecommendationId], e = r.recommendationConfigs.filters.findIndex((n) => n.filterNumber === t.filterNumber && n.filterGroup === t.filterGroup);
254
+ if (e !== -1) {
255
+ const n = [...r.recommendationConfigs.filters];
256
+ n[e] = t, t.value.length && t.operator && t.attribute && t.innerGroupOperator && t.outerGroupOperator ? n[e].isValid = !0 : n[e].isValid = !1, r.recommendationConfigs.filters = n;
214
257
  }
215
258
  },
216
- deleteFilter(e) {
217
- const t = [...this.recommendationConfigs.filters].findIndex((r) => r.filterNumber === e.filterNumber && r.filterGroup === e.filterGroup);
218
- if (t !== -1) {
219
- const r = [...this.recommendationConfigs.filters];
220
- r.splice(t, 1), this.$patch({
221
- recommendationConfigs: {
222
- filters: r
223
- }
224
- });
259
+ deleteFilter(t) {
260
+ if (this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId])
261
+ return;
262
+ const r = this.blockStates[this.currentRecommendationId], e = [...r.recommendationConfigs.filters].findIndex((n) => n.filterNumber === t.filterNumber && n.filterGroup === t.filterGroup);
263
+ if (e !== -1) {
264
+ const n = [...r.recommendationConfigs.filters];
265
+ n.splice(e, 1), r.recommendationConfigs.filters = n;
225
266
  }
226
267
  },
227
- addFilter(e) {
228
- const t = [...this.recommendationConfigs.filters], i = t.filter(
229
- (a) => a.filterGroup === e.filterGroup
230
- ).length + 1, o = t.findLastIndex((a) => a.filterGroup === e.filterGroup);
231
- o !== -1 ? t.splice(o + 1, 0, {
232
- ...e,
233
- filterNumber: i
234
- }) : t.push({
235
- ...e,
236
- filterNumber: i
237
- }), this.$patch({
238
- recommendationConfigs: {
239
- filters: t
240
- }
241
- });
268
+ addFilter(t) {
269
+ if (this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId])
270
+ return;
271
+ const r = this.blockStates[this.currentRecommendationId], e = [...r.recommendationConfigs.filters], o = e.filter(
272
+ (i) => i.filterGroup === t.filterGroup
273
+ ).length + 1, s = e.findLastIndex((i) => i.filterGroup === t.filterGroup);
274
+ s !== -1 ? e.splice(s + 1, 0, {
275
+ ...t,
276
+ filterNumber: o
277
+ }) : e.push({
278
+ ...t,
279
+ filterNumber: o
280
+ }), r.recommendationConfigs.filters = e;
242
281
  },
243
282
  generateFilterQuery() {
244
- return c(this.recommendationConfigs.filters);
283
+ return f(this.recommendationConfigs.filters);
245
284
  },
285
+ // ====================================================================
286
+ // Per-Block Product Fetching
287
+ // ====================================================================
246
288
  async fetchRecommendationProducts() {
247
289
  var u;
248
- const e = this.recommendationConfigs.filters.filter((n) => n.isValid), t = c(e), r = ((u = l.find((n) => n.key === this.recommendationConfigs.strategy)) == null ? void 0 : u.path) || "", i = f(), o = {
249
- // Note: {itemId} and {campaignId} are template placeholders replaced at runtime
250
- locale: this.recommendationConfigs.language,
251
- currency: this.recommendationConfigs.currencySettings.value,
290
+ if (this.currentRecommendationId === null || !this.blockStates[this.currentRecommendationId])
291
+ return;
292
+ const t = this.currentRecommendationId, r = this.blockStates[t], { recommendationConfigs: e } = r, n = e.filters.filter((l) => l.isValid), o = f(n), s = ((u = d.find((l) => l.key === e.strategy)) == null ? void 0 : u.path) || "", i = b(), c = {
293
+ locale: e.language,
294
+ currency: e.currencySettings.value,
252
295
  partnerName: i.partnerName,
253
- productId: this.recommendationConfigs.strategy === "manualMerchandising" ? this.recommendationConfigs.productIds.join(",") : "{itemId}",
254
- size: this.recommendationConfigs.size,
296
+ size: e.size,
255
297
  details: !0,
256
- campaignId: "{campaignId}",
257
- filter: t
298
+ campaignId: i.variationId
258
299
  };
259
- this.recommendationConfigs.shuffleProducts && (o.shuffle = !0);
260
- const a = await s.fetchRecommendationProducts(
261
- r,
262
- o
263
- );
264
- this.$patch({
265
- recommendationProducts: a
266
- });
300
+ e.strategy === "manualMerchandising" ? c.productId = e.productIds.join(",") : e.strategy === "similarViewed" && (c.productId = "{itemId}"), o && (c.filter = o), e.shuffleProducts && (c.shuffle = !0);
301
+ const g = parseInt(e.size) || 6;
302
+ let a;
303
+ try {
304
+ a = await m.fetchRecommendationProducts(s, c);
305
+ } catch {
306
+ a = [];
307
+ }
308
+ this.blockStates[t] && (this.blockStates[t].recommendationProducts = a.length > 0 ? a : k(g));
267
309
  }
268
310
  }
269
311
  });
270
312
  export {
271
- R as useRecommendationExtensionStore
313
+ A as useRecommendationExtensionStore
272
314
  };
@@ -3,7 +3,7 @@ import { ATTR_PRODUCT_BUTTON as b, ATTR_PRODUCT_OMNIBUS_DISCOUNT as u, ATTR_PROD
3
3
  import { useRecommendationExtensionStore as T } from "../../store/recommendation.js";
4
4
  import { formatPrice as _ } from "../../utils/priceFormatter.js";
5
5
  import { sanitizeImageUrl as $ } from "../utils.js";
6
- const o = "0 5px", a = "attribute-cell";
6
+ const a = "0 5px", o = "attribute-cell";
7
7
  function p() {
8
8
  const t = T(), { currencySettings: e } = t.recommendationConfigs;
9
9
  return {
@@ -15,16 +15,16 @@ function p() {
15
15
  thousandSeparator: e.thousandSeparator
16
16
  };
17
17
  }
18
- function r(t, e = "price") {
19
- const n = p(), l = t[e], i = (l == null ? void 0 : l[n.code]) ?? Object.values(l ?? {})[0] ?? 0;
18
+ function c(t, e = "price") {
19
+ const n = p(), l = t[e], r = (l == null ? void 0 : l[n.code]) ?? Object.values(l ?? {})[0] ?? 0;
20
20
  return _({
21
- price: i,
21
+ price: r,
22
22
  currency: n
23
23
  });
24
24
  }
25
25
  const P = {
26
26
  [x]: (t) => `
27
- <td class="${a}" style="padding: ${o}; height: 100%;" valign="top">
27
+ <td class="${o}" style="padding: ${a}; height: 100%;" valign="top">
28
28
  <table
29
29
  class="product-card-segment"
30
30
  width="100%"
@@ -38,18 +38,13 @@ const P = {
38
38
  class="esd-block-image product-image"
39
39
  align="center"
40
40
  esd-extension-block-id="${s.IMAGE}">
41
- <div style="position: relative; width: 100%; padding-bottom: 100%; overflow: hidden;">
42
- <a
43
- target="_blank"
44
- href="${t.url}"
45
- style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;">
46
- <img
47
- src="${$(t.image_url)}"
48
- alt="${t.name}"
49
- style="max-width: 100%; max-height: 100%; object-fit: contain; display: block;"
50
- class="adapt-img">
51
- </a>
52
- </div>
41
+ <a target="_blank" href="${t.url}">
42
+ <img
43
+ src="${$(t.image_url)}"
44
+ alt="${t.name}"
45
+ style="display: block; max-width: 100%; height: auto;"
46
+ class="adapt-img">
47
+ </a>
53
48
  </td>
54
49
  </tr>
55
50
  </tbody>
@@ -57,7 +52,7 @@ const P = {
57
52
  </td>
58
53
  `,
59
54
  [f]: (t) => `
60
- <td class="${a}" style="padding: ${o}; height: 100%;" valign="middle">
55
+ <td class="${o}" style="padding: ${a}; height: 100%;" valign="middle">
61
56
  <table
62
57
  class="product-card-segment"
63
58
  width="100%"
@@ -82,7 +77,7 @@ const P = {
82
77
  </td>
83
78
  `,
84
79
  [y]: (t) => `
85
- <td class="${a}" style="padding: ${o}; height: 100%;" valign="top">
80
+ <td class="${o}" style="padding: ${a}; height: 100%;" valign="top">
86
81
  <table
87
82
  class="product-card-segment"
88
83
  width="100%"
@@ -97,7 +92,7 @@ const P = {
97
92
  align="center"
98
93
  esd-extension-block-id="${s.PRICE}">
99
94
  <p contenteditable="false" style="font-size: 16px; color: #333333;">
100
- <strong>${r(t, "price")}</strong>
95
+ <strong>${c(t, "price")}</strong>
101
96
  </p>
102
97
  </td>
103
98
  </tr>
@@ -106,7 +101,7 @@ const P = {
106
101
  </td>
107
102
  `,
108
103
  [h]: (t) => `
109
- <td class="${a}" style="padding: ${o}; height: 100%;" valign="top">
104
+ <td class="${o}" style="padding: ${a}; height: 100%;" valign="top">
110
105
  <table
111
106
  class="product-card-segment"
112
107
  width="100%"
@@ -121,7 +116,7 @@ const P = {
121
116
  align="center"
122
117
  esd-extension-block-id="${s.OLD_PRICE}">
123
118
  <p contenteditable="false" style="font-size: 14px; color: #999999;">
124
- <strong>${r(t, "original_price")}</strong>
119
+ <strong>${c(t, "original_price")}</strong>
125
120
  </p>
126
121
  </td>
127
122
  </tr>
@@ -130,7 +125,7 @@ const P = {
130
125
  </td>
131
126
  `,
132
127
  [m]: (t) => `
133
- <td class="${a}" style="padding: ${o}; height: 100%;" valign="top">
128
+ <td class="${o}" style="padding: ${a}; height: 100%;" valign="top">
134
129
  <table
135
130
  class="product-card-segment"
136
131
  width="100%"
@@ -148,7 +143,7 @@ const P = {
148
143
  esd-extension-block-id="${s.OMNIBUS_PRICE}">
149
144
  <p style="font-size: 12px; color: #666666;">
150
145
  <span class="omnibus-text-before">Lowest 30-day price: </span>
151
- <span class="omnibus-price-value">${r(t, "original_price")}</span>
146
+ <span class="omnibus-price-value">${c(t, "original_price")}</span>
152
147
  <span class="omnibus-text-after"></span>
153
148
  </p>
154
149
  </td>
@@ -158,10 +153,10 @@ const P = {
158
153
  </td>
159
154
  `,
160
155
  [u]: (t) => {
161
- var d, c;
162
- const e = p(), n = ((d = t.original_price) == null ? void 0 : d[e.code]) ?? Object.values(t.original_price ?? {})[0] ?? 0, l = ((c = t.price) == null ? void 0 : c[e.code]) ?? Object.values(t.price ?? {})[0] ?? 0, i = n > 0 ? Math.round((n - l) / n * 100) : 0, g = i > 0 ? `-${i}%` : "0%";
156
+ var d, i;
157
+ const e = p(), n = ((d = t.original_price) == null ? void 0 : d[e.code]) ?? Object.values(t.original_price ?? {})[0] ?? 0, l = ((i = t.price) == null ? void 0 : i[e.code]) ?? Object.values(t.price ?? {})[0] ?? 0, r = n > 0 ? Math.round((n - l) / n * 100) : 0, g = r > 0 ? `-${r}%` : "0%";
163
158
  return `
164
- <td class="${a}" style="padding: ${o}; height: 100%;" valign="top">
159
+ <td class="${o}" style="padding: ${a}; height: 100%;" valign="top">
165
160
  <table
166
161
  class="product-card-segment"
167
162
  width="100%"
@@ -190,7 +185,7 @@ const P = {
190
185
  `;
191
186
  },
192
187
  [b]: () => `
193
- <td class="${a}" style="padding: ${o}; height: 100%;" valign="top">
188
+ <td class="${o}" style="padding: ${a}; height: 100%;" valign="top">
194
189
  <table
195
190
  class="product-card-segment"
196
191
  width="100%"
@@ -227,7 +222,7 @@ const P = {
227
222
  `
228
223
  };
229
224
  export {
230
- a as ATTRIBUTE_CELL_CLASS,
231
- o as DEFAULT_CELL_PADDING,
232
- P as verticalElementRenderer
225
+ o as ATTRIBUTE_CELL_CLASS,
226
+ a as DEFAULT_CELL_PADDING,
227
+ P as gridElementRenderer
233
228
  };