@useinsider/guido 2.0.0-beta.061e9c9 → 2.0.0-beta.0941bcd

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 (192) hide show
  1. package/dist/@types/config/schemas.js +53 -39
  2. package/dist/components/organisms/email-preview/PreviewContainer.vue.js +3 -3
  3. package/dist/components/organisms/email-preview/amp/AmpErrorModal.vue.js +6 -6
  4. package/dist/components/organisms/email-preview/amp/AmpErrorModal.vue2.js +17 -13
  5. package/dist/components/organisms/email-preview/amp/AmpToggle.vue.js +6 -6
  6. package/dist/components/organisms/email-preview/amp/AmpToggle.vue2.js +14 -12
  7. package/dist/components/organisms/email-preview/desktop-preview/DesktopBrowserHeader.vue.js +18 -0
  8. package/dist/components/organisms/email-preview/desktop-preview/DesktopBrowserHeader.vue2.js +15 -0
  9. package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue.js +10 -14
  10. package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue2.js +14 -22
  11. package/dist/components/organisms/email-preview/desktop-preview/EmailSizeIndicator.vue.js +3 -3
  12. package/dist/components/organisms/email-preview/mobile-preview/ContentView.vue.js +11 -10
  13. package/dist/components/organisms/email-preview/mobile-preview/InboxView.vue.js +12 -10
  14. package/dist/components/organisms/email-preview/mobile-preview/MobilePreview.vue.js +11 -10
  15. package/dist/components/organisms/email-preview/mobile-preview/MobilePreview.vue2.js +15 -14
  16. package/dist/components/organisms/header/EditorActions.vue.js +21 -0
  17. package/dist/components/organisms/header/EditorActions.vue2.js +41 -0
  18. package/dist/components/organisms/header/EditorToolbar.vue.js +18 -0
  19. package/dist/components/organisms/header/EditorToolbar.vue2.js +17 -0
  20. package/dist/components/organisms/header/HeaderWrapper.vue.js +6 -5
  21. package/dist/components/organisms/header/LeftSlot.vue.js +11 -11
  22. package/dist/components/organisms/header/LeftSlot.vue2.js +11 -12
  23. package/dist/components/organisms/header/MiddleSlot.vue.js +7 -7
  24. package/dist/components/organisms/header/MiddleSlot.vue2.js +11 -15
  25. package/dist/components/organisms/header/RightSlot.vue.js +11 -14
  26. package/dist/components/organisms/header/RightSlot.vue2.js +13 -30
  27. package/dist/components/organisms/header/version-history/VersionHistory.vue.js +5 -5
  28. package/dist/components/organisms/onboarding/NewVersionPopup.vue2.js +15 -15
  29. package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue.js +1 -1
  30. package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue2.js +20 -19
  31. package/dist/composables/useActionsApi.js +33 -30
  32. package/dist/composables/useConfig.js +29 -27
  33. package/dist/composables/useSave.js +13 -11
  34. package/dist/config/migrator/recommendationMigrator.js +2 -2
  35. package/dist/enums/academy.js +8 -0
  36. package/dist/enums/onboarding.js +1 -2
  37. package/dist/enums/unsubscribe.js +20 -21
  38. package/dist/extensions/Blocks/Items/controls/cardComposition.js +13 -4
  39. package/dist/extensions/Blocks/Recommendation/block.js +40 -6
  40. package/dist/extensions/Blocks/Recommendation/constants/blockIds.js +4 -0
  41. package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +4 -0
  42. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +64 -0
  43. package/dist/extensions/Blocks/Recommendation/constants/layout.js +20 -0
  44. package/dist/extensions/Blocks/Recommendation/constants/selectors.js +19 -0
  45. package/dist/extensions/Blocks/Recommendation/controls/button/index.js +64 -0
  46. package/dist/extensions/Blocks/Recommendation/controls/cardBackground/index.js +80 -0
  47. package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +232 -0
  48. package/dist/extensions/Blocks/Recommendation/controls/image/index.js +19 -0
  49. package/dist/extensions/Blocks/Recommendation/controls/layout/index.js +96 -0
  50. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +110 -0
  51. package/dist/extensions/Blocks/Recommendation/controls/main/currency.js +204 -0
  52. package/dist/extensions/Blocks/Recommendation/controls/main/filters.js +54 -0
  53. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +205 -0
  54. package/dist/extensions/Blocks/Recommendation/controls/main/locale.js +74 -0
  55. package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +118 -0
  56. package/dist/extensions/Blocks/Recommendation/controls/main/shuffle.js +71 -0
  57. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +286 -0
  58. package/dist/extensions/Blocks/Recommendation/controls/name/index.js +46 -0
  59. package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +76 -0
  60. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/index.js +44 -0
  61. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.js +48 -0
  62. package/dist/extensions/Blocks/Recommendation/controls/{omnibusDiscountTextAfterControl.js → omnibusDiscount/textAfter.js} +16 -14
  63. package/dist/extensions/Blocks/Recommendation/controls/{omnibusDiscountTextBeforeControl.js → omnibusDiscount/textBefore.js} +16 -14
  64. package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/index.js +48 -0
  65. package/dist/extensions/Blocks/Recommendation/controls/{omnibusPriceTextAfterControl.js → omnibusPrice/textAfter.js} +16 -14
  66. package/dist/extensions/Blocks/Recommendation/controls/{omnibusPriceTextBeforeControl.js → omnibusPrice/textBefore.js} +14 -12
  67. package/dist/extensions/Blocks/Recommendation/controls/price/index.js +44 -0
  68. package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +222 -0
  69. package/dist/extensions/Blocks/Recommendation/extension.js +40 -19
  70. package/dist/extensions/Blocks/Recommendation/iconsRegistry.js +19 -3
  71. package/dist/extensions/Blocks/Recommendation/recommendation.css.js +13 -4
  72. package/dist/extensions/Blocks/Recommendation/services/configService.js +239 -0
  73. package/dist/extensions/Blocks/Recommendation/settingsPanel.js +46 -43
  74. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +41 -36
  75. package/dist/extensions/Blocks/Recommendation/templates/grid/elementRenderer.js +233 -0
  76. package/dist/extensions/Blocks/Recommendation/templates/grid/migration.js +251 -0
  77. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +69 -0
  78. package/dist/extensions/Blocks/Recommendation/templates/index.js +12 -0
  79. package/dist/extensions/Blocks/Recommendation/templates/list/elementRenderer.js +174 -0
  80. package/dist/extensions/Blocks/Recommendation/templates/list/template.js +73 -0
  81. package/dist/extensions/Blocks/Recommendation/templates/utils.js +121 -0
  82. package/dist/extensions/Blocks/Recommendation/types/nodeConfig.js +6 -0
  83. package/dist/extensions/Blocks/Recommendation/utils/filterUtil.js +9 -9
  84. package/dist/extensions/Blocks/Recommendation/utils/preserveTextStyles.js +27 -16
  85. package/dist/extensions/Blocks/Recommendation/utils/priceFormatter.js +29 -0
  86. package/dist/extensions/Blocks/Recommendation/utils/tagName.js +46 -0
  87. package/dist/extensions/Blocks/Unsubscribe/extension.js +9 -9
  88. package/dist/extensions/Blocks/common-control.js +6 -7
  89. package/dist/extensions/Blocks/controlFactories.js +156 -122
  90. package/dist/guido.css +1 -1
  91. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +423 -291
  92. package/dist/package.json.js +1 -1
  93. package/dist/services/recommendationApi.js +10 -9
  94. package/dist/src/@types/config/index.d.ts +2 -2
  95. package/dist/src/@types/config/schemas.d.ts +26 -0
  96. package/dist/src/@types/config/types.d.ts +7 -1
  97. package/dist/src/components/organisms/email-preview/desktop-preview/DesktopBrowserHeader.vue.d.ts +2 -0
  98. package/dist/src/components/organisms/header/EditorActions.vue.d.ts +4 -0
  99. package/dist/src/components/organisms/header/EditorToolbar.vue.d.ts +2 -0
  100. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
  101. package/dist/src/components/wrappers/WpDrawer.vue.d.ts +1 -1
  102. package/dist/src/composables/useActionsApi.d.ts +1 -0
  103. package/dist/src/composables/useConfig.d.ts +6 -0
  104. package/dist/src/enums/academy.d.ts +12 -0
  105. package/dist/src/enums/onboarding.d.ts +0 -1
  106. package/dist/src/enums/unsubscribe.d.ts +0 -1
  107. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +34 -0
  108. package/dist/src/extensions/Blocks/Recommendation/constants/blockIds.d.ts +13 -0
  109. package/dist/src/extensions/Blocks/Recommendation/{constants.d.ts → constants/controlIds.d.ts} +1 -33
  110. package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +49 -0
  111. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +13 -0
  112. package/dist/src/extensions/Blocks/Recommendation/constants/layout.d.ts +35 -0
  113. package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +31 -0
  114. package/dist/src/extensions/Blocks/Recommendation/controls/button/index.d.ts +143 -0
  115. package/dist/src/extensions/Blocks/Recommendation/controls/{cardBackgroundColorControl.d.ts → cardBackground/index.d.ts} +9 -3
  116. package/dist/src/extensions/Blocks/Recommendation/{cardCompositionControl.d.ts → controls/cardComposition/index.d.ts} +23 -7
  117. package/dist/src/extensions/Blocks/Recommendation/controls/image/index.d.ts +35 -0
  118. package/dist/src/extensions/Blocks/Recommendation/controls/index.d.ts +21 -651
  119. package/dist/src/extensions/Blocks/Recommendation/controls/layout/index.d.ts +37 -0
  120. package/dist/src/extensions/Blocks/Recommendation/controls/main/algorithm.d.ts +29 -0
  121. package/dist/src/extensions/Blocks/Recommendation/controls/main/currency.d.ts +45 -0
  122. package/dist/src/extensions/Blocks/Recommendation/controls/main/filters.d.ts +22 -0
  123. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +57 -0
  124. package/dist/src/extensions/Blocks/Recommendation/controls/main/locale.d.ts +24 -0
  125. package/dist/src/extensions/Blocks/Recommendation/controls/main/productLayout.d.ts +42 -0
  126. package/dist/src/extensions/Blocks/Recommendation/controls/main/shuffle.d.ts +23 -0
  127. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +214 -0
  128. package/dist/src/extensions/Blocks/Recommendation/controls/name/index.d.ts +97 -0
  129. package/dist/src/extensions/Blocks/Recommendation/controls/{nameTextTrimControl.d.ts → name/textTrim.d.ts} +1 -1
  130. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/index.d.ts +95 -0
  131. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.d.ts +100 -0
  132. package/dist/src/extensions/Blocks/Recommendation/controls/{omnibusDiscountTextAfterControl.d.ts → omnibusDiscount/textAfter.d.ts} +1 -1
  133. package/dist/src/extensions/Blocks/Recommendation/controls/{omnibusDiscountTextBeforeControl.d.ts → omnibusDiscount/textBefore.d.ts} +1 -1
  134. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/index.d.ts +100 -0
  135. package/dist/src/extensions/Blocks/Recommendation/controls/{omnibusPriceTextAfterControl.d.ts → omnibusPrice/textAfter.d.ts} +1 -1
  136. package/dist/src/extensions/Blocks/Recommendation/controls/{omnibusPriceTextBeforeControl.d.ts → omnibusPrice/textBefore.d.ts} +1 -1
  137. package/dist/src/extensions/Blocks/Recommendation/controls/price/index.d.ts +95 -0
  138. package/dist/src/extensions/Blocks/Recommendation/controls/{spacingControl.d.ts → spacing/index.d.ts} +33 -10
  139. package/dist/src/extensions/Blocks/Recommendation/extension.d.ts +9 -0
  140. package/dist/src/extensions/Blocks/Recommendation/services/configService.d.ts +151 -0
  141. package/dist/src/extensions/Blocks/Recommendation/services/index.d.ts +6 -0
  142. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +17 -16
  143. package/dist/src/extensions/Blocks/Recommendation/templates/grid/elementRenderer.d.ts +20 -0
  144. package/dist/src/extensions/Blocks/Recommendation/templates/grid/migration.d.ts +23 -0
  145. package/dist/src/extensions/Blocks/Recommendation/templates/grid/template.d.ts +33 -0
  146. package/dist/src/extensions/Blocks/Recommendation/templates/index.d.ts +39 -0
  147. package/dist/src/extensions/Blocks/Recommendation/templates/list/elementRenderer.d.ts +8 -0
  148. package/dist/src/extensions/Blocks/Recommendation/templates/list/migration.d.ts +25 -0
  149. package/dist/src/extensions/Blocks/Recommendation/templates/list/template.d.ts +18 -0
  150. package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +54 -0
  151. package/dist/src/extensions/Blocks/Recommendation/types/index.d.ts +7 -0
  152. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +154 -0
  153. package/dist/src/extensions/Blocks/Recommendation/utils/priceFormatter.d.ts +33 -0
  154. package/dist/src/extensions/Blocks/Recommendation/utils/stylePreserver.d.ts +113 -0
  155. package/dist/src/extensions/Blocks/Recommendation/utils/tagName.d.ts +77 -0
  156. package/dist/src/extensions/Blocks/common-control.d.ts +1 -1
  157. package/dist/src/stores/config.d.ts +147 -1
  158. package/dist/src/stores/editor.d.ts +21 -0
  159. package/dist/static/assets/desktop/desktop-mockup-center.svg.js +4 -0
  160. package/dist/static/assets/desktop/desktop-mockup-left.svg.js +4 -0
  161. package/dist/static/assets/desktop/desktop-mockup-right.svg.js +4 -0
  162. package/dist/static/assets/mobile/email-mockup.svg.js +4 -0
  163. package/dist/static/assets/mobile/inbox-mockup.svg.js +4 -0
  164. package/dist/static/styles/components/button.css.js +1 -1
  165. package/dist/static/styles/components/wide-panel.css.js +1 -1
  166. package/dist/static/styles/customEditorStyle.css.js +25 -2
  167. package/dist/stores/config.js +7 -0
  168. package/dist/stores/editor.js +1 -0
  169. package/dist/utils/templatePreparation.js +17 -17
  170. package/package.json +3 -3
  171. package/dist/components/organisms/email-preview/desktop-preview/EmailHeaderInfo.vue.js +0 -17
  172. package/dist/components/organisms/email-preview/desktop-preview/EmailHeaderInfo.vue2.js +0 -20
  173. package/dist/extensions/Blocks/Recommendation/cardCompositionControl.js +0 -193
  174. package/dist/extensions/Blocks/Recommendation/constants.js +0 -14
  175. package/dist/extensions/Blocks/Recommendation/control.js +0 -321
  176. package/dist/extensions/Blocks/Recommendation/controls/cardBackgroundColorControl.js +0 -68
  177. package/dist/extensions/Blocks/Recommendation/controls/index.js +0 -272
  178. package/dist/extensions/Blocks/Recommendation/controls/nameTextTrimControl.js +0 -74
  179. package/dist/extensions/Blocks/Recommendation/controls/priceHideControl.js +0 -60
  180. package/dist/extensions/Blocks/Recommendation/controls/priceInlineLayoutControl.js +0 -160
  181. package/dist/extensions/Blocks/Recommendation/controls/spacingControl.js +0 -188
  182. package/dist/extensions/Blocks/Recommendation/templates/blockTemplate.js +0 -184
  183. package/dist/extensions/Blocks/Recommendation/templates/migrationTemplate.js +0 -189
  184. package/dist/extensions/Blocks/Recommendation/templates/templateUtils.js +0 -209
  185. package/dist/src/extensions/Blocks/Recommendation/control.d.ts +0 -38
  186. package/dist/src/extensions/Blocks/Recommendation/controls/priceHideControl.d.ts +0 -16
  187. package/dist/src/extensions/Blocks/Recommendation/controls/priceInlineLayoutControl.d.ts +0 -50
  188. package/dist/src/extensions/Blocks/Recommendation/templates/blockTemplate.d.ts +0 -16
  189. package/dist/src/extensions/Blocks/Recommendation/templates/migrationTemplate.d.ts +0 -16
  190. package/dist/src/extensions/Blocks/Recommendation/templates/templateUtils.d.ts +0 -52
  191. package/dist/static/assets/inbox-mockup.svg.js +0 -4
  192. package/dist/static/assets/phone-mockup.svg.js +0 -4
@@ -0,0 +1,239 @@
1
+ import { ModificationDescription as f } from "../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
+ import { CURRENT_CONFIG_VERSION as u, DEFAULT_NODE_CONFIG as e } from "../constants/defaultConfig.js";
3
+ import { setCurrencyAttributes as g } from "../controls/main/utils.js";
4
+ import { hasMinimalConfig as a } from "../types/nodeConfig.js";
5
+ class C {
6
+ // ========================================================================
7
+ // Read Operations
8
+ // ========================================================================
9
+ /**
10
+ * Get configuration from a node, with defaults for missing values
11
+ *
12
+ * This is the primary way to read configuration from a block.
13
+ * Always returns a complete config object with defaults merged in.
14
+ * @example
15
+ * const config = RecommendationConfigService.getConfig(this.currentNode);
16
+ * console.log(config.strategy); // 'mostPopular'
17
+ * @param node - The immutable HTML node to read config from
18
+ * @returns Complete configuration with defaults for missing values
19
+ */
20
+ static getConfig(i) {
21
+ if (!i)
22
+ return this.cloneDefaults();
23
+ if (!("getNodeConfig" in i) || typeof i.getNodeConfig != "function")
24
+ return this.cloneDefaults();
25
+ try {
26
+ const t = i.getNodeConfig();
27
+ return t ? this.mergeWithDefaults(t) : this.cloneDefaults();
28
+ } catch {
29
+ return this.cloneDefaults();
30
+ }
31
+ }
32
+ /**
33
+ * Check if a node has valid configuration stored
34
+ *
35
+ * Used for migration detection - returns false for legacy templates
36
+ * that need their configuration migrated.
37
+ * @param node - The immutable HTML node to check
38
+ * @returns True if node has valid config with version number
39
+ */
40
+ static hasConfig(i) {
41
+ if (!i || !("getNodeConfig" in i) || typeof i.getNodeConfig != "function")
42
+ return !1;
43
+ try {
44
+ const t = i.getNodeConfig();
45
+ return a(t);
46
+ } catch {
47
+ return !1;
48
+ }
49
+ }
50
+ /**
51
+ * Get the configuration version from a node
52
+ * @param node - The immutable HTML node to check
53
+ * @returns Config version number, or 0 if no config exists
54
+ */
55
+ static getConfigVersion(i) {
56
+ return this.hasConfig(i) && this.getConfig(i).configVersion || 0;
57
+ }
58
+ // ========================================================================
59
+ // Write Operations
60
+ // ========================================================================
61
+ /**
62
+ * Update specific configuration values
63
+ *
64
+ * Merges the updates with existing config and persists to node.
65
+ * This is the primary way to update configuration from controls.
66
+ * @example
67
+ * RecommendationConfigService.updateConfig(
68
+ * this.api,
69
+ * this.currentNode,
70
+ * { strategy: 'complementaryItems' },
71
+ * 'Changed recommendation algorithm'
72
+ * );
73
+ * @param api - Stripo extension API with document modifier
74
+ * @param node - The immutable HTML node to update
75
+ * @param updates - Partial config with values to update
76
+ * @param description - Human-readable description for undo/redo
77
+ * @returns The new complete configuration
78
+ */
79
+ static updateConfig(i, t, o, n) {
80
+ const s = this.getConfig(t), r = this.deepMerge(s, o);
81
+ return this.saveConfig(i, t, r, n), r;
82
+ }
83
+ /**
84
+ * Initialize configuration for a new block
85
+ *
86
+ * Called when a block is first created (dropped into template).
87
+ * Can optionally merge in partial config from migration.
88
+ * @example
89
+ * // In Block.onCreated lifecycle
90
+ * RecommendationConfigService.initializeConfig(this.api, node);
91
+ * @param api - Stripo extension API with document modifier
92
+ * @param node - The immutable HTML node to initialize
93
+ * @param partialConfig - Optional partial config to merge with defaults
94
+ * @returns The initialized configuration
95
+ */
96
+ static initializeConfig(i, t, o) {
97
+ const n = o ? this.mergeWithDefaults(o) : this.cloneDefaults();
98
+ return this.saveConfig(i, t, n, "Initialize recommendation block"), g({
99
+ currentNode: t,
100
+ documentModifier: i.getDocumentModifier(),
101
+ currency: n.currency
102
+ }), n;
103
+ }
104
+ /**
105
+ * Save complete configuration to a node
106
+ *
107
+ * Low-level method - prefer `updateConfig` or `initializeConfig` in most cases.
108
+ * @param api - Stripo extension API with document modifier
109
+ * @param node - The immutable HTML node to save to
110
+ * @param config - Complete configuration to save
111
+ * @param description - Human-readable description for undo/redo
112
+ */
113
+ static saveConfig(i, t, o, n) {
114
+ try {
115
+ i.getDocumentModifier().modifyHtml(t).setNodeConfig(o).apply(new f(n));
116
+ } catch (s) {
117
+ console.warn("[RecommendationConfigService] Failed to save config:", s);
118
+ }
119
+ }
120
+ // ========================================================================
121
+ // Migration Helpers
122
+ // ========================================================================
123
+ /**
124
+ * Migrate configuration from legacy data-attributes
125
+ *
126
+ * Reads existing data-attributes and creates a proper node config.
127
+ * Used when loading templates created before node config was implemented.
128
+ * @param api - Stripo extension API with document modifier
129
+ * @param node - The block node to migrate
130
+ * @returns The migrated configuration
131
+ */
132
+ static migrateFromDataAttributes(i, t) {
133
+ const o = {
134
+ configVersion: u
135
+ };
136
+ if ("getAttribute" in t && typeof t.getAttribute == "function") {
137
+ const n = t.getAttribute("data-layout");
138
+ n === "list" || n === "horizontal" ? o.layout = "list" : (n === "grid" || n === "vertical") && (o.layout = "grid");
139
+ const s = t.getAttribute("data-card-composition");
140
+ s && (o.composition = s.split(",").filter(Boolean));
141
+ const r = t.getAttribute("data-column-spacing");
142
+ r && (o.columnSpacing = parseInt(r) || e.columnSpacing);
143
+ const c = t.getAttribute("data-row-spacing");
144
+ c && (o.rowSpacing = parseInt(c) || e.rowSpacing);
145
+ }
146
+ return this.initializeConfig(i, t, o);
147
+ }
148
+ /**
149
+ * Check if configuration needs migration
150
+ * @param node - The block node to check
151
+ * @returns True if migration is needed
152
+ */
153
+ static needsMigration(i) {
154
+ return i ? this.hasConfig(i) ? this.getConfigVersion(i) < u : !0 : !1;
155
+ }
156
+ // ========================================================================
157
+ // Internal Helpers
158
+ // ========================================================================
159
+ /**
160
+ * Clone default config to avoid mutations
161
+ */
162
+ static cloneDefaults() {
163
+ return {
164
+ ...e,
165
+ currency: { ...e.currency },
166
+ omnibusPrice: { ...e.omnibusPrice },
167
+ omnibusDiscount: { ...e.omnibusDiscount },
168
+ composition: [...e.composition],
169
+ visibility: { ...e.visibility },
170
+ filters: [],
171
+ productIds: []
172
+ };
173
+ }
174
+ /**
175
+ * Merge partial config with defaults
176
+ *
177
+ * Deep merges nested objects like currency, omnibus settings.
178
+ */
179
+ static mergeWithDefaults(i) {
180
+ const t = this.cloneDefaults();
181
+ return {
182
+ ...t,
183
+ ...i,
184
+ currency: {
185
+ ...t.currency,
186
+ ...i.currency || {}
187
+ },
188
+ omnibusPrice: {
189
+ ...t.omnibusPrice,
190
+ ...i.omnibusPrice || {}
191
+ },
192
+ omnibusDiscount: {
193
+ ...t.omnibusDiscount,
194
+ ...i.omnibusDiscount || {}
195
+ },
196
+ visibility: {
197
+ ...t.visibility,
198
+ ...i.visibility || {}
199
+ },
200
+ composition: i.composition || t.composition,
201
+ filters: i.filters || [],
202
+ productIds: i.productIds || []
203
+ };
204
+ }
205
+ /**
206
+ * Deep merge for nested objects
207
+ *
208
+ * Recursively merges source into target, preserving existing values
209
+ * that aren't explicitly overwritten.
210
+ */
211
+ static deepMerge(i, t) {
212
+ return {
213
+ ...i,
214
+ ...t,
215
+ currency: {
216
+ ...i.currency,
217
+ ...t.currency || {}
218
+ },
219
+ omnibusPrice: {
220
+ ...i.omnibusPrice,
221
+ ...t.omnibusPrice || {}
222
+ },
223
+ omnibusDiscount: {
224
+ ...i.omnibusDiscount,
225
+ ...t.omnibusDiscount || {}
226
+ },
227
+ visibility: {
228
+ ...i.visibility,
229
+ ...t.visibility || {}
230
+ },
231
+ composition: t.composition ?? i.composition,
232
+ filters: t.filters ?? i.filters,
233
+ productIds: t.productIds ?? i.productIds
234
+ };
235
+ }
236
+ }
237
+ export {
238
+ C as RecommendationConfigService
239
+ };
@@ -1,39 +1,48 @@
1
- import { SettingsPanelRegistry as E, SettingsPanelTab as I, SettingsTab as N, ContainerControls as S, TextControls as C } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
1
+ import { SettingsPanelRegistry as S, SettingsPanelTab as I, SettingsTab as T, ContainerControls as E, TextControls as C } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
2
  import { BLOCK_ID as R } from "./block.js";
3
- import { COMPOSITION_CONTROL_BLOCK_ID as L } from "./cardCompositionControl.js";
4
- import { RecommendationBlockId as T, RecommendationControlId as _ } from "./constants.js";
5
- import { CONTROL_BLOCK_ID as A } from "./control.js";
6
- import { CARD_BACKGROUND_COLOR_CONTROL_ID as U } from "./controls/cardBackgroundColorControl.js";
7
- import { PRICE_INLINE_LAYOUT_CONTROL_ID as D } from "./controls/priceInlineLayoutControl.js";
8
- import { SPACING_CONTROL_ID as B } from "./controls/spacingControl.js";
9
- class Y extends E {
3
+ import { RecommendationBlockId as N } from "./constants/blockIds.js";
4
+ import { RecommendationControlId as _ } from "./constants/controlIds.js";
5
+ import { CONTROL_BLOCK_ID as L } from "./controls/main/index.js";
6
+ import "./store/recommendation.js";
7
+ import "./controls/name/index.js";
8
+ import "./controls/price/index.js";
9
+ import "./controls/oldPrice/index.js";
10
+ import "./controls/omnibusPrice/index.js";
11
+ import "./controls/omnibusDiscount/index.js";
12
+ import "./controls/button/index.js";
13
+ import "./controls/image/index.js";
14
+ import { SPACING_CONTROL_ID as U } from "./controls/spacing/index.js";
15
+ import { CARD_BACKGROUND_COLOR_CONTROL_ID as B } from "./controls/cardBackground/index.js";
16
+ import { LAYOUT_CONTROL_ID as D } from "./controls/layout/index.js";
17
+ import { COMPOSITION_CONTROL_BLOCK_ID as A } from "./controls/cardComposition/index.js";
18
+ class s extends S {
10
19
  registerBlockControls(O) {
11
20
  O[R] = [
12
21
  new I(
13
- N.SETTINGS,
22
+ T.SETTINGS,
14
23
  [
15
- A,
16
- D,
17
- S.EXTERNAL_INDENTS
24
+ L,
25
+ E.EXTERNAL_INDENTS
18
26
  ]
19
27
  ),
20
28
  new I(
21
- N.STYLES,
29
+ T.STYLES,
22
30
  [
23
31
  C.TEXT_BLOCK_BACKGROUND_COLOR,
24
- U,
25
- B
32
+ B,
33
+ D,
34
+ U
26
35
  ]
27
36
  ),
28
37
  new I(
29
38
  "Card Composition",
30
39
  [
31
- L
40
+ A
32
41
  ]
33
42
  ).withLabel("Card Composition")
34
- ], O[T.NAME] = [
43
+ ], O[N.NAME] = [
35
44
  new I(
36
- N.SETTINGS,
45
+ T.SETTINGS,
37
46
  [
38
47
  _.NAME_STYLE,
39
48
  _.NAME_ALIGN,
@@ -42,38 +51,35 @@ class Y extends E {
42
51
  ]
43
52
  ),
44
53
  new I(
45
- N.STYLES,
54
+ T.STYLES,
46
55
  [
47
56
  _.NAME_BACKGROUND,
48
57
  _.NAME_FONT_FAMILY,
49
- _.NAME_LINE_SPACING,
50
58
  _.NAME_SIZE,
51
59
  _.NAME_COLOR
52
60
  ]
53
61
  )
54
- ], O[T.PRICE] = [
62
+ ], O[N.PRICE] = [
55
63
  new I(
56
- N.SETTINGS,
64
+ T.SETTINGS,
57
65
  [
58
66
  _.PRICE_STYLE,
59
67
  _.PRICE_ALIGN,
60
- _.PRICE_HIDE_IF_SAME,
61
68
  _.PRICE_PADDINGS
62
69
  ]
63
70
  ),
64
71
  new I(
65
- N.STYLES,
72
+ T.STYLES,
66
73
  [
67
74
  _.PRICE_BACKGROUND,
68
75
  _.PRICE_FONT_FAMILY,
69
- _.PRICE_LINE_SPACING,
70
76
  _.PRICE_SIZE,
71
77
  _.PRICE_COLOR
72
78
  ]
73
79
  )
74
- ], O[T.OLD_PRICE] = [
80
+ ], O[N.OLD_PRICE] = [
75
81
  new I(
76
- N.SETTINGS,
82
+ T.SETTINGS,
77
83
  [
78
84
  _.OLD_PRICE_STYLE,
79
85
  _.OLD_PRICE_ALIGN,
@@ -81,18 +87,17 @@ class Y extends E {
81
87
  ]
82
88
  ),
83
89
  new I(
84
- N.STYLES,
90
+ T.STYLES,
85
91
  [
86
92
  _.OLD_PRICE_BACKGROUND,
87
93
  _.OLD_PRICE_FONT_FAMILY,
88
- _.OLD_PRICE_LINE_SPACING,
89
94
  _.OLD_PRICE_SIZE,
90
95
  _.OLD_PRICE_COLOR
91
96
  ]
92
97
  )
93
- ], O[T.OMNIBUS_PRICE] = [
98
+ ], O[N.OMNIBUS_PRICE] = [
94
99
  new I(
95
- N.SETTINGS,
100
+ T.SETTINGS,
96
101
  [
97
102
  _.OMNIBUS_PRICE_TEXT_BEFORE,
98
103
  _.OMNIBUS_PRICE_TEXT_AFTER,
@@ -102,18 +107,17 @@ class Y extends E {
102
107
  ]
103
108
  ),
104
109
  new I(
105
- N.STYLES,
110
+ T.STYLES,
106
111
  [
107
112
  _.OMNIBUS_PRICE_BACKGROUND,
108
113
  _.OMNIBUS_PRICE_FONT_FAMILY,
109
- _.OMNIBUS_PRICE_LINE_SPACING,
110
114
  _.OMNIBUS_PRICE_SIZE,
111
115
  _.OMNIBUS_PRICE_COLOR
112
116
  ]
113
117
  )
114
- ], O[T.OMNIBUS_DISCOUNT] = [
118
+ ], O[N.OMNIBUS_DISCOUNT] = [
115
119
  new I(
116
- N.SETTINGS,
120
+ T.SETTINGS,
117
121
  [
118
122
  _.OMNIBUS_DISCOUNT_TEXT_BEFORE,
119
123
  _.OMNIBUS_DISCOUNT_TEXT_AFTER,
@@ -123,18 +127,17 @@ class Y extends E {
123
127
  ]
124
128
  ),
125
129
  new I(
126
- N.STYLES,
130
+ T.STYLES,
127
131
  [
128
132
  _.OMNIBUS_DISCOUNT_BACKGROUND,
129
133
  _.OMNIBUS_DISCOUNT_FONT_FAMILY,
130
- _.OMNIBUS_DISCOUNT_LINE_SPACING,
131
134
  _.OMNIBUS_DISCOUNT_SIZE,
132
135
  _.OMNIBUS_DISCOUNT_COLOR
133
136
  ]
134
137
  )
135
- ], O[T.BUTTON] = [
138
+ ], O[N.BUTTON] = [
136
139
  new I(
137
- N.SETTINGS,
140
+ T.SETTINGS,
138
141
  [
139
142
  _.BUTTON_TEXT,
140
143
  _.BUTTON_ALIGN,
@@ -143,7 +146,7 @@ class Y extends E {
143
146
  ]
144
147
  ),
145
148
  new I(
146
- N.STYLES,
149
+ T.STYLES,
147
150
  [
148
151
  _.BUTTON_COLOR,
149
152
  _.BUTTON_FONT_FAMILY,
@@ -154,9 +157,9 @@ class Y extends E {
154
157
  _.BUTTON_BORDER
155
158
  ]
156
159
  )
157
- ], O[T.IMAGE] = [
160
+ ], O[N.IMAGE] = [
158
161
  new I(
159
- N.SETTINGS,
162
+ T.SETTINGS,
160
163
  [
161
164
  _.IMAGE_SIZE,
162
165
  _.IMAGE_MARGINS
@@ -166,5 +169,5 @@ class Y extends E {
166
169
  }
167
170
  }
168
171
  export {
169
- Y as SettingsPanel
172
+ s as SettingsPanel
170
173
  };
@@ -1,13 +1,14 @@
1
- import { RecommendationFeedSourceMaps as n, PriceAttributes as u } from "../../../../enums/extensions/recommendationBlock.js";
2
- import { useRecommendationApi as l } from "../../../../services/recommendationApi.js";
3
- import { useConfigStore as c } from "../../../../stores/config.js";
4
- import { defineStore as p } from "pinia";
5
- import { generateCompleteFilterQuery as m } from "../utils/filterUtil.js";
6
- const a = l(), d = () => ({
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 = () => ({
7
8
  recommendationCampaignUrls: {},
8
9
  recommendationProducts: [],
9
10
  recommendationConfigs: {
10
- cardsInRow: 3,
11
+ cardsInRow: g,
11
12
  currencySettings: {
12
13
  name: "USD",
13
14
  value: "USD",
@@ -118,14 +119,14 @@ const a = l(), d = () => ({
118
119
  productIds: ["22", "12"],
119
120
  id: 1,
120
121
  language: "tr_TR",
121
- orientation: "vertical",
122
+ orientation: "grid",
122
123
  recommendedProducts: [],
123
124
  sendProductRequestFlag: !1,
124
125
  shuffleProducts: !1,
125
126
  strategy: "mostPopular",
126
127
  textTrimming: !0,
127
128
  unresponsive: !1,
128
- size: "9"
129
+ size: "6"
129
130
  },
130
131
  activePredictiveAlgorithms: [],
131
132
  languages: {},
@@ -134,8 +135,8 @@ const a = l(), d = () => ({
134
135
  filterSelectionDrawerStatus: !1,
135
136
  filterList: {},
136
137
  filterGroup: 1
137
- }), y = p("guidoRecommendationExtension", {
138
- state: () => d(),
138
+ }), R = d("guidoRecommendationExtension", {
139
+ state: () => h(),
139
140
  getters: {
140
141
  hasFilters: (e) => !!e.recommendationConfigs.filters.length,
141
142
  getFilterGroupCount: (e) => {
@@ -145,7 +146,7 @@ const a = l(), d = () => ({
145
146
  getActivePredictiveAlgorithms: (e) => {
146
147
  const t = [];
147
148
  return e.activePredictiveAlgorithms.forEach((r) => {
148
- t.push(...n.filter((i) => i.id === r));
149
+ t.push(...l.filter((i) => i.id === r));
149
150
  }), t.map((r) => ({
150
151
  text: r.name,
151
152
  value: r.key
@@ -160,7 +161,7 @@ const a = l(), d = () => ({
160
161
  value: t.text
161
162
  })),
162
163
  getFilterList: (e) => Object.values(e.filterList).map((t) => {
163
- const r = t.type === "defaultAttribute", i = u.includes(t.attributeName);
164
+ const r = t.type === "defaultAttribute", i = p.includes(t.attributeName);
164
165
  let o = r ? t.attributeName : `product_attributes.${t.attributeName}`;
165
166
  return o = i ? `${o}.${e.recommendationConfigs.currencySettings.value}` : o, {
166
167
  text: t.displayName,
@@ -178,13 +179,13 @@ const a = l(), d = () => ({
178
179
  activePredictiveAlgorithms: e,
179
180
  languages: t,
180
181
  currencies: r
181
- } = await a.fetchRecommendationCreateData();
182
+ } = await s.fetchRecommendationCreateData();
182
183
  this.activePredictiveAlgorithms = e, this.languages = t;
183
184
  const [i] = r;
184
185
  this.recommendationConfigs.currencySettings.name = i.text, this.recommendationConfigs.currencySettings.value = i.value, this.currencyList = r, this.filterStatus = !!this.recommendationConfigs.filters.length;
185
186
  },
186
187
  async fetchRecommendationFilters() {
187
- const e = await a.fetchRecommendationFilters();
188
+ const e = await s.fetchRecommendationFilters();
188
189
  this.filterList = e;
189
190
  },
190
191
  addFilterGroup(e) {
@@ -224,13 +225,15 @@ const a = l(), d = () => ({
224
225
  }
225
226
  },
226
227
  addFilter(e) {
227
- const t = [...this.recommendationConfigs.filters], r = t.findLastIndex((i) => i.filterGroup === e.filterGroup);
228
- r !== -1 ? t.splice(r + 1, 0, {
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, {
229
232
  ...e,
230
- filterNumber: r + 2
233
+ filterNumber: i
231
234
  }) : t.push({
232
235
  ...e,
233
- filterNumber: 1
236
+ filterNumber: i
234
237
  }), this.$patch({
235
238
  recommendationConfigs: {
236
239
  filters: t
@@ -238,30 +241,32 @@ const a = l(), d = () => ({
238
241
  });
239
242
  },
240
243
  generateFilterQuery() {
241
- return m(this.recommendationConfigs.filters);
244
+ return c(this.recommendationConfigs.filters);
242
245
  },
243
246
  async fetchRecommendationProducts() {
244
- var o;
245
- const e = this.generateFilterQuery(), t = ((o = n.find((s) => s.key === this.recommendationConfigs.strategy)) == null ? void 0 : o.path) || "", r = c(), i = await a.fetchRecommendationProducts(
246
- t,
247
- {
248
- // TODO: Here will be optimized and filled carefully
249
- locale: this.recommendationConfigs.language,
250
- currency: this.recommendationConfigs.currencySettings.value,
251
- partnerName: r.partnerName,
252
- productId: this.recommendationConfigs.strategy === "manualMerchandising" ? this.recommendationConfigs.productIds.join(",") : "{itemId}",
253
- size: this.recommendationConfigs.size,
254
- details: !0,
255
- campaignId: "{campaignId}",
256
- filter: e
257
- }
247
+ 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,
252
+ partnerName: i.partnerName,
253
+ productId: this.recommendationConfigs.strategy === "manualMerchandising" ? this.recommendationConfigs.productIds.join(",") : "{itemId}",
254
+ size: this.recommendationConfigs.size,
255
+ details: !0,
256
+ campaignId: "{campaignId}",
257
+ filter: t
258
+ };
259
+ this.recommendationConfigs.shuffleProducts && (o.shuffle = !0);
260
+ const a = await s.fetchRecommendationProducts(
261
+ r,
262
+ o
258
263
  );
259
264
  this.$patch({
260
- recommendationProducts: i
265
+ recommendationProducts: a
261
266
  });
262
267
  }
263
268
  }
264
269
  });
265
270
  export {
266
- y as useRecommendationExtensionStore
271
+ R as useRecommendationExtensionStore
267
272
  };