@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.
- package/dist/@types/config/schemas.js +53 -39
- package/dist/components/organisms/email-preview/PreviewContainer.vue.js +3 -3
- package/dist/components/organisms/email-preview/amp/AmpErrorModal.vue.js +6 -6
- package/dist/components/organisms/email-preview/amp/AmpErrorModal.vue2.js +17 -13
- package/dist/components/organisms/email-preview/amp/AmpToggle.vue.js +6 -6
- package/dist/components/organisms/email-preview/amp/AmpToggle.vue2.js +14 -12
- package/dist/components/organisms/email-preview/desktop-preview/DesktopBrowserHeader.vue.js +18 -0
- package/dist/components/organisms/email-preview/desktop-preview/DesktopBrowserHeader.vue2.js +15 -0
- package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue.js +10 -14
- package/dist/components/organisms/email-preview/desktop-preview/DesktopPreview.vue2.js +14 -22
- package/dist/components/organisms/email-preview/desktop-preview/EmailSizeIndicator.vue.js +3 -3
- package/dist/components/organisms/email-preview/mobile-preview/ContentView.vue.js +11 -10
- package/dist/components/organisms/email-preview/mobile-preview/InboxView.vue.js +12 -10
- package/dist/components/organisms/email-preview/mobile-preview/MobilePreview.vue.js +11 -10
- package/dist/components/organisms/email-preview/mobile-preview/MobilePreview.vue2.js +15 -14
- package/dist/components/organisms/header/EditorActions.vue.js +21 -0
- package/dist/components/organisms/header/EditorActions.vue2.js +41 -0
- package/dist/components/organisms/header/EditorToolbar.vue.js +18 -0
- package/dist/components/organisms/header/EditorToolbar.vue2.js +17 -0
- package/dist/components/organisms/header/HeaderWrapper.vue.js +6 -5
- package/dist/components/organisms/header/LeftSlot.vue.js +11 -11
- package/dist/components/organisms/header/LeftSlot.vue2.js +11 -12
- package/dist/components/organisms/header/MiddleSlot.vue.js +7 -7
- package/dist/components/organisms/header/MiddleSlot.vue2.js +11 -15
- package/dist/components/organisms/header/RightSlot.vue.js +11 -14
- package/dist/components/organisms/header/RightSlot.vue2.js +13 -30
- package/dist/components/organisms/header/version-history/VersionHistory.vue.js +5 -5
- package/dist/components/organisms/onboarding/NewVersionPopup.vue2.js +15 -15
- package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue.js +1 -1
- package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue2.js +20 -19
- package/dist/composables/useActionsApi.js +33 -30
- package/dist/composables/useConfig.js +29 -27
- package/dist/composables/useSave.js +13 -11
- package/dist/config/migrator/recommendationMigrator.js +2 -2
- package/dist/enums/academy.js +8 -0
- package/dist/enums/onboarding.js +1 -2
- package/dist/enums/unsubscribe.js +20 -21
- package/dist/extensions/Blocks/Items/controls/cardComposition.js +13 -4
- package/dist/extensions/Blocks/Recommendation/block.js +40 -6
- package/dist/extensions/Blocks/Recommendation/constants/blockIds.js +4 -0
- package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +4 -0
- package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +64 -0
- package/dist/extensions/Blocks/Recommendation/constants/layout.js +20 -0
- package/dist/extensions/Blocks/Recommendation/constants/selectors.js +19 -0
- package/dist/extensions/Blocks/Recommendation/controls/button/index.js +64 -0
- package/dist/extensions/Blocks/Recommendation/controls/cardBackground/index.js +80 -0
- package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +232 -0
- package/dist/extensions/Blocks/Recommendation/controls/image/index.js +19 -0
- package/dist/extensions/Blocks/Recommendation/controls/layout/index.js +96 -0
- package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +110 -0
- package/dist/extensions/Blocks/Recommendation/controls/main/currency.js +204 -0
- package/dist/extensions/Blocks/Recommendation/controls/main/filters.js +54 -0
- package/dist/extensions/Blocks/Recommendation/controls/main/index.js +205 -0
- package/dist/extensions/Blocks/Recommendation/controls/main/locale.js +74 -0
- package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +118 -0
- package/dist/extensions/Blocks/Recommendation/controls/main/shuffle.js +71 -0
- package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +286 -0
- package/dist/extensions/Blocks/Recommendation/controls/name/index.js +46 -0
- package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +76 -0
- package/dist/extensions/Blocks/Recommendation/controls/oldPrice/index.js +44 -0
- package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.js +48 -0
- package/dist/extensions/Blocks/Recommendation/controls/{omnibusDiscountTextAfterControl.js → omnibusDiscount/textAfter.js} +16 -14
- package/dist/extensions/Blocks/Recommendation/controls/{omnibusDiscountTextBeforeControl.js → omnibusDiscount/textBefore.js} +16 -14
- package/dist/extensions/Blocks/Recommendation/controls/omnibusPrice/index.js +48 -0
- package/dist/extensions/Blocks/Recommendation/controls/{omnibusPriceTextAfterControl.js → omnibusPrice/textAfter.js} +16 -14
- package/dist/extensions/Blocks/Recommendation/controls/{omnibusPriceTextBeforeControl.js → omnibusPrice/textBefore.js} +14 -12
- package/dist/extensions/Blocks/Recommendation/controls/price/index.js +44 -0
- package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +222 -0
- package/dist/extensions/Blocks/Recommendation/extension.js +40 -19
- package/dist/extensions/Blocks/Recommendation/iconsRegistry.js +19 -3
- package/dist/extensions/Blocks/Recommendation/recommendation.css.js +13 -4
- package/dist/extensions/Blocks/Recommendation/services/configService.js +239 -0
- package/dist/extensions/Blocks/Recommendation/settingsPanel.js +46 -43
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +41 -36
- package/dist/extensions/Blocks/Recommendation/templates/grid/elementRenderer.js +233 -0
- package/dist/extensions/Blocks/Recommendation/templates/grid/migration.js +251 -0
- package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +69 -0
- package/dist/extensions/Blocks/Recommendation/templates/index.js +12 -0
- package/dist/extensions/Blocks/Recommendation/templates/list/elementRenderer.js +174 -0
- package/dist/extensions/Blocks/Recommendation/templates/list/template.js +73 -0
- package/dist/extensions/Blocks/Recommendation/templates/utils.js +121 -0
- package/dist/extensions/Blocks/Recommendation/types/nodeConfig.js +6 -0
- package/dist/extensions/Blocks/Recommendation/utils/filterUtil.js +9 -9
- package/dist/extensions/Blocks/Recommendation/utils/preserveTextStyles.js +27 -16
- package/dist/extensions/Blocks/Recommendation/utils/priceFormatter.js +29 -0
- package/dist/extensions/Blocks/Recommendation/utils/tagName.js +46 -0
- package/dist/extensions/Blocks/Unsubscribe/extension.js +9 -9
- package/dist/extensions/Blocks/common-control.js +6 -7
- package/dist/extensions/Blocks/controlFactories.js +156 -122
- package/dist/guido.css +1 -1
- package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +423 -291
- package/dist/package.json.js +1 -1
- package/dist/services/recommendationApi.js +10 -9
- package/dist/src/@types/config/index.d.ts +2 -2
- package/dist/src/@types/config/schemas.d.ts +26 -0
- package/dist/src/@types/config/types.d.ts +7 -1
- package/dist/src/components/organisms/email-preview/desktop-preview/DesktopBrowserHeader.vue.d.ts +2 -0
- package/dist/src/components/organisms/header/EditorActions.vue.d.ts +4 -0
- package/dist/src/components/organisms/header/EditorToolbar.vue.d.ts +2 -0
- package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
- package/dist/src/components/wrappers/WpDrawer.vue.d.ts +1 -1
- package/dist/src/composables/useActionsApi.d.ts +1 -0
- package/dist/src/composables/useConfig.d.ts +6 -0
- package/dist/src/enums/academy.d.ts +12 -0
- package/dist/src/enums/onboarding.d.ts +0 -1
- package/dist/src/enums/unsubscribe.d.ts +0 -1
- package/dist/src/extensions/Blocks/Recommendation/block.d.ts +34 -0
- package/dist/src/extensions/Blocks/Recommendation/constants/blockIds.d.ts +13 -0
- package/dist/src/extensions/Blocks/Recommendation/{constants.d.ts → constants/controlIds.d.ts} +1 -33
- package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +49 -0
- package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +13 -0
- package/dist/src/extensions/Blocks/Recommendation/constants/layout.d.ts +35 -0
- package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +31 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/button/index.d.ts +143 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/{cardBackgroundColorControl.d.ts → cardBackground/index.d.ts} +9 -3
- package/dist/src/extensions/Blocks/Recommendation/{cardCompositionControl.d.ts → controls/cardComposition/index.d.ts} +23 -7
- package/dist/src/extensions/Blocks/Recommendation/controls/image/index.d.ts +35 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/index.d.ts +21 -651
- package/dist/src/extensions/Blocks/Recommendation/controls/layout/index.d.ts +37 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/algorithm.d.ts +29 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/currency.d.ts +45 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/filters.d.ts +22 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +57 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/locale.d.ts +24 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/productLayout.d.ts +42 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/shuffle.d.ts +23 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +214 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/name/index.d.ts +97 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/{nameTextTrimControl.d.ts → name/textTrim.d.ts} +1 -1
- package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/index.d.ts +95 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscount/index.d.ts +100 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/{omnibusDiscountTextAfterControl.d.ts → omnibusDiscount/textAfter.d.ts} +1 -1
- package/dist/src/extensions/Blocks/Recommendation/controls/{omnibusDiscountTextBeforeControl.d.ts → omnibusDiscount/textBefore.d.ts} +1 -1
- package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPrice/index.d.ts +100 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/{omnibusPriceTextAfterControl.d.ts → omnibusPrice/textAfter.d.ts} +1 -1
- package/dist/src/extensions/Blocks/Recommendation/controls/{omnibusPriceTextBeforeControl.d.ts → omnibusPrice/textBefore.d.ts} +1 -1
- package/dist/src/extensions/Blocks/Recommendation/controls/price/index.d.ts +95 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/{spacingControl.d.ts → spacing/index.d.ts} +33 -10
- package/dist/src/extensions/Blocks/Recommendation/extension.d.ts +9 -0
- package/dist/src/extensions/Blocks/Recommendation/services/configService.d.ts +151 -0
- package/dist/src/extensions/Blocks/Recommendation/services/index.d.ts +6 -0
- package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +17 -16
- package/dist/src/extensions/Blocks/Recommendation/templates/grid/elementRenderer.d.ts +20 -0
- package/dist/src/extensions/Blocks/Recommendation/templates/grid/migration.d.ts +23 -0
- package/dist/src/extensions/Blocks/Recommendation/templates/grid/template.d.ts +33 -0
- package/dist/src/extensions/Blocks/Recommendation/templates/index.d.ts +39 -0
- package/dist/src/extensions/Blocks/Recommendation/templates/list/elementRenderer.d.ts +8 -0
- package/dist/src/extensions/Blocks/Recommendation/templates/list/migration.d.ts +25 -0
- package/dist/src/extensions/Blocks/Recommendation/templates/list/template.d.ts +18 -0
- package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +54 -0
- package/dist/src/extensions/Blocks/Recommendation/types/index.d.ts +7 -0
- package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +154 -0
- package/dist/src/extensions/Blocks/Recommendation/utils/priceFormatter.d.ts +33 -0
- package/dist/src/extensions/Blocks/Recommendation/utils/stylePreserver.d.ts +113 -0
- package/dist/src/extensions/Blocks/Recommendation/utils/tagName.d.ts +77 -0
- package/dist/src/extensions/Blocks/common-control.d.ts +1 -1
- package/dist/src/stores/config.d.ts +147 -1
- package/dist/src/stores/editor.d.ts +21 -0
- package/dist/static/assets/desktop/desktop-mockup-center.svg.js +4 -0
- package/dist/static/assets/desktop/desktop-mockup-left.svg.js +4 -0
- package/dist/static/assets/desktop/desktop-mockup-right.svg.js +4 -0
- package/dist/static/assets/mobile/email-mockup.svg.js +4 -0
- package/dist/static/assets/mobile/inbox-mockup.svg.js +4 -0
- package/dist/static/styles/components/button.css.js +1 -1
- package/dist/static/styles/components/wide-panel.css.js +1 -1
- package/dist/static/styles/customEditorStyle.css.js +25 -2
- package/dist/stores/config.js +7 -0
- package/dist/stores/editor.js +1 -0
- package/dist/utils/templatePreparation.js +17 -17
- package/package.json +3 -3
- package/dist/components/organisms/email-preview/desktop-preview/EmailHeaderInfo.vue.js +0 -17
- package/dist/components/organisms/email-preview/desktop-preview/EmailHeaderInfo.vue2.js +0 -20
- package/dist/extensions/Blocks/Recommendation/cardCompositionControl.js +0 -193
- package/dist/extensions/Blocks/Recommendation/constants.js +0 -14
- package/dist/extensions/Blocks/Recommendation/control.js +0 -321
- package/dist/extensions/Blocks/Recommendation/controls/cardBackgroundColorControl.js +0 -68
- package/dist/extensions/Blocks/Recommendation/controls/index.js +0 -272
- package/dist/extensions/Blocks/Recommendation/controls/nameTextTrimControl.js +0 -74
- package/dist/extensions/Blocks/Recommendation/controls/priceHideControl.js +0 -60
- package/dist/extensions/Blocks/Recommendation/controls/priceInlineLayoutControl.js +0 -160
- package/dist/extensions/Blocks/Recommendation/controls/spacingControl.js +0 -188
- package/dist/extensions/Blocks/Recommendation/templates/blockTemplate.js +0 -184
- package/dist/extensions/Blocks/Recommendation/templates/migrationTemplate.js +0 -189
- package/dist/extensions/Blocks/Recommendation/templates/templateUtils.js +0 -209
- package/dist/src/extensions/Blocks/Recommendation/control.d.ts +0 -38
- package/dist/src/extensions/Blocks/Recommendation/controls/priceHideControl.d.ts +0 -16
- package/dist/src/extensions/Blocks/Recommendation/controls/priceInlineLayoutControl.d.ts +0 -50
- package/dist/src/extensions/Blocks/Recommendation/templates/blockTemplate.d.ts +0 -16
- package/dist/src/extensions/Blocks/Recommendation/templates/migrationTemplate.d.ts +0 -16
- package/dist/src/extensions/Blocks/Recommendation/templates/templateUtils.d.ts +0 -52
- package/dist/static/assets/inbox-mockup.svg.js +0 -4
- 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
|
|
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 {
|
|
4
|
-
import {
|
|
5
|
-
import { CONTROL_BLOCK_ID as
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
|
|
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
|
-
|
|
22
|
+
T.SETTINGS,
|
|
14
23
|
[
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
S.EXTERNAL_INDENTS
|
|
24
|
+
L,
|
|
25
|
+
E.EXTERNAL_INDENTS
|
|
18
26
|
]
|
|
19
27
|
),
|
|
20
28
|
new I(
|
|
21
|
-
|
|
29
|
+
T.STYLES,
|
|
22
30
|
[
|
|
23
31
|
C.TEXT_BLOCK_BACKGROUND_COLOR,
|
|
24
|
-
|
|
25
|
-
|
|
32
|
+
B,
|
|
33
|
+
D,
|
|
34
|
+
U
|
|
26
35
|
]
|
|
27
36
|
),
|
|
28
37
|
new I(
|
|
29
38
|
"Card Composition",
|
|
30
39
|
[
|
|
31
|
-
|
|
40
|
+
A
|
|
32
41
|
]
|
|
33
42
|
).withLabel("Card Composition")
|
|
34
|
-
], O[
|
|
43
|
+
], O[N.NAME] = [
|
|
35
44
|
new I(
|
|
36
|
-
|
|
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
|
-
|
|
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[
|
|
62
|
+
], O[N.PRICE] = [
|
|
55
63
|
new I(
|
|
56
|
-
|
|
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
|
-
|
|
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[
|
|
80
|
+
], O[N.OLD_PRICE] = [
|
|
75
81
|
new I(
|
|
76
|
-
|
|
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
|
-
|
|
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[
|
|
98
|
+
], O[N.OMNIBUS_PRICE] = [
|
|
94
99
|
new I(
|
|
95
|
-
|
|
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
|
-
|
|
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[
|
|
118
|
+
], O[N.OMNIBUS_DISCOUNT] = [
|
|
115
119
|
new I(
|
|
116
|
-
|
|
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
|
-
|
|
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[
|
|
138
|
+
], O[N.BUTTON] = [
|
|
136
139
|
new I(
|
|
137
|
-
|
|
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
|
-
|
|
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[
|
|
160
|
+
], O[N.IMAGE] = [
|
|
158
161
|
new I(
|
|
159
|
-
|
|
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
|
-
|
|
172
|
+
s as SettingsPanel
|
|
170
173
|
};
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { RecommendationFeedSourceMaps as
|
|
2
|
-
import { useRecommendationApi as
|
|
3
|
-
import { useConfigStore as
|
|
4
|
-
import { defineStore as
|
|
5
|
-
import {
|
|
6
|
-
|
|
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:
|
|
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: "
|
|
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: "
|
|
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
|
-
}),
|
|
138
|
-
state: () =>
|
|
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(...
|
|
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 =
|
|
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
|
|
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
|
|
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],
|
|
228
|
-
|
|
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:
|
|
233
|
+
filterNumber: i
|
|
231
234
|
}) : t.push({
|
|
232
235
|
...e,
|
|
233
|
-
filterNumber:
|
|
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
|
|
244
|
+
return c(this.recommendationConfigs.filters);
|
|
242
245
|
},
|
|
243
246
|
async fetchRecommendationProducts() {
|
|
244
|
-
var
|
|
245
|
-
const e = this.
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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:
|
|
265
|
+
recommendationProducts: a
|
|
261
266
|
});
|
|
262
267
|
}
|
|
263
268
|
}
|
|
264
269
|
});
|
|
265
270
|
export {
|
|
266
|
-
|
|
271
|
+
R as useRecommendationExtensionStore
|
|
267
272
|
};
|