@useinsider/guido 3.17.0-beta.ec8eabb → 3.17.0-beta.f552101
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/README.md +6 -5
- package/dist/@types/config/schemas.js +7 -6
- package/dist/components/Guido.vue.js +10 -10
- package/dist/components/Guido.vue2.js +100 -95
- package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.js +21 -0
- package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue2.js +106 -0
- package/dist/components/organisms/extensions/recommendation/RemoveStrategyModal.vue.js +17 -0
- package/dist/components/organisms/extensions/recommendation/RemoveStrategyModal.vue2.js +57 -0
- package/dist/components/organisms/extensions/recommendation/StrategyInfoBoxContent.vue.js +19 -0
- package/dist/components/organisms/extensions/recommendation/StrategyInfoBoxContent.vue2.js +63 -0
- package/dist/components/organisms/header/EditorActions.vue.js +1 -1
- package/dist/components/organisms/header/EditorActions.vue2.js +36 -44
- package/dist/composables/useActionsApi.js +67 -82
- package/dist/composables/useAutoSave.js +26 -31
- package/dist/composables/useCustomInterfaceAppearance.js +52 -38
- package/dist/composables/useGuidoStateBridge.js +30 -31
- package/dist/composables/useRecommendation.js +41 -34
- package/dist/composables/useSave.js +36 -40
- package/dist/composables/useStripo.js +14 -14
- package/dist/config/i18n/en/labels.json.js +1 -1
- package/dist/config/migrator/index.js +9 -8
- package/dist/config/migrator/recommendation/compositionMapper.js +20 -20
- package/dist/config/migrator/recommendation/extractors.js +29 -24
- package/dist/config/migrator/recommendation/htmlBuilder.js +116 -130
- package/dist/config/migrator/recommendation/settingsMapper.js +17 -17
- package/dist/config/migrator/recommendationMigrator.js +31 -25
- package/dist/config/migrator/recommendationTitleMigrator.js +119 -0
- package/dist/enums/academy.js +2 -1
- package/dist/enums/date.js +5 -3
- package/dist/enums/extensions/recommendationBlock.js +3 -1
- package/dist/extensions/Blocks/Items/block.js +98 -49
- package/dist/extensions/Blocks/Items/constants/currency.js +11 -0
- package/dist/extensions/Blocks/Items/controls/price/currencyLocation.js +25 -24
- package/dist/extensions/Blocks/Items/controls/price/currencySymbol.js +12 -11
- package/dist/extensions/Blocks/Items/template.js +153 -152
- package/dist/extensions/Blocks/Recommendation/block.js +35 -29
- package/dist/extensions/Blocks/Recommendation/constants/blockIds.js +1 -1
- package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +1 -1
- package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +29 -27
- package/dist/extensions/Blocks/Recommendation/constants/selectors.js +35 -28
- package/dist/extensions/Blocks/Recommendation/controls/cardComposition/index.js +309 -236
- package/dist/extensions/Blocks/Recommendation/controls/main/index.js +241 -180
- package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +124 -0
- package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +1 -0
- package/dist/extensions/Blocks/Recommendation/controls/title/index.js +44 -0
- package/dist/extensions/Blocks/Recommendation/extension.js +31 -29
- package/dist/extensions/Blocks/Recommendation/services/configService.js +54 -36
- package/dist/extensions/Blocks/Recommendation/settingsPanel.js +23 -4
- package/dist/extensions/Blocks/Recommendation/store/recommendation.js +175 -79
- package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +3 -3
- package/dist/extensions/Blocks/Recommendation/templates/titleRows.js +33 -0
- package/dist/extensions/Blocks/Recommendation/templates/utils.js +85 -107
- package/dist/extensions/Blocks/Recommendation/utils/nodeConfigWriter.js +22 -0
- package/dist/extensions/Blocks/common-control.js +22 -19
- package/dist/guido.css +1 -1
- package/dist/services/recommendationApi.js +69 -30
- package/dist/src/@types/config/schemas.d.ts +2 -0
- package/dist/src/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.d.ts +3 -0
- package/dist/src/components/organisms/extensions/recommendation/RemoveStrategyModal.vue.d.ts +2 -0
- package/dist/src/components/organisms/extensions/recommendation/StrategyInfoBoxContent.vue.d.ts +15 -0
- package/dist/src/composables/useConfig.d.ts +2 -0
- package/dist/src/composables/useRecommendation.d.ts +1 -0
- package/dist/src/config/migrator/recommendation/extractors.d.ts +8 -0
- package/dist/src/config/migrator/recommendationTitleMigrator.d.ts +5 -0
- package/dist/src/enums/academy.d.ts +1 -0
- package/dist/src/enums/date.d.ts +1 -0
- package/dist/src/enums/extensions/recommendationBlock.d.ts +2 -0
- package/dist/src/extensions/Blocks/Items/block.d.ts +21 -0
- package/dist/src/extensions/Blocks/Items/constants/currency.d.ts +19 -0
- package/dist/src/extensions/Blocks/Recommendation/constants/blockIds.d.ts +2 -1
- package/dist/src/extensions/Blocks/Recommendation/constants/controlIds.d.ts +7 -0
- package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +3 -6
- package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +2 -2
- package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +12 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/cardComposition/index.d.ts +11 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/index.d.ts +1 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +44 -8
- package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +16 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +1 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/title/index.d.ts +86 -0
- package/dist/src/extensions/Blocks/Recommendation/services/configService.d.ts +12 -1
- package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +176 -10
- package/dist/src/extensions/Blocks/Recommendation/templates/titleRows.d.ts +13 -0
- package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +7 -0
- package/dist/src/extensions/Blocks/Recommendation/utils/nodeConfigWriter.d.ts +31 -0
- package/dist/src/extensions/Blocks/common-control.d.ts +4 -1
- package/dist/src/mock/api/recommendation-strategies.d.ts +2 -0
- package/dist/src/services/recommendationApi.d.ts +4 -1
- package/dist/src/stores/config.d.ts +18 -0
- package/dist/src/stores/save-as-template.d.ts +4 -3
- package/dist/src/utils/genericUtil.d.ts +5 -0
- package/dist/static/assets/icons/line-change.svg.js +5 -0
- package/dist/static/assets/icons/line-delete.svg.js +5 -0
- package/dist/static/assets/icons/line-plus.svg.js +5 -0
- package/dist/static/styles/components/recommendation-strategy.css.js +155 -0
- package/dist/static/styles/customEditorStyle.css.js +3 -1
- package/dist/utils/dateUtil.js +23 -10
- package/dist/utils/genericUtil.js +28 -27
- package/dist/utils/pairProductVariables.js +60 -59
- package/dist/utils/templatePreparation.js +35 -34
- package/package.json +3 -2
- package/dist/composables/useEditorLock.js +0 -18
- package/dist/src/composables/useEditorLock.d.ts +0 -11
package/README.md
CHANGED
|
@@ -162,6 +162,7 @@ const config: GuidoConfigInput = {
|
|
|
162
162
|
liquidSyntax?: boolean, // Default: false - Enable Liquid template syntax
|
|
163
163
|
autosave?: boolean, // Default: false - Show the Auto Save toggle in the header. See wiki/AUTOSAVE.md.
|
|
164
164
|
allowlistEnabled?: boolean, // Default: false - Pre-save domain-allowlist check (opt-in). Guido self-serves the block toaster (role lookup, deep-link, copy from window.trans).
|
|
165
|
+
reusableRecommendationStrategy?: boolean, // Default: false - Assign an RRS strategy to recommendation blocks instead of per-block algorithm/filters/shuffle/product-count settings.
|
|
165
166
|
},
|
|
166
167
|
|
|
167
168
|
// Optional: Callbacks
|
|
@@ -633,16 +634,16 @@ toaster fires (useful before the host has wired the catalog).
|
|
|
633
634
|
|
|
634
635
|
```bash
|
|
635
636
|
# Install
|
|
636
|
-
|
|
637
|
+
npm install
|
|
637
638
|
|
|
638
639
|
# Start dev server
|
|
639
|
-
|
|
640
|
+
npm start
|
|
640
641
|
|
|
641
642
|
# Build
|
|
642
|
-
|
|
643
|
+
npm run build
|
|
643
644
|
|
|
644
645
|
# Lint & type-check
|
|
645
|
-
|
|
646
|
+
npm run lint
|
|
646
647
|
```
|
|
647
648
|
|
|
648
649
|
### Environment Variables
|
|
@@ -660,7 +661,7 @@ VITE_STRIPO_USER=your_user
|
|
|
660
661
|
|
|
661
662
|
```bash
|
|
662
663
|
# Build the package
|
|
663
|
-
|
|
664
|
+
npm run build
|
|
664
665
|
|
|
665
666
|
# Create tarball
|
|
666
667
|
npm pack
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ModuleFolderDefaults as f } from "../../enums/defaults.js";
|
|
2
|
-
import { object as a, number as n, optional as e, string as t, picklist as i, pipe as m, minLength as b, custom as
|
|
2
|
+
import { object as a, number as n, optional as e, string as t, picklist as i, pipe as m, minLength as b, custom as y, boolean as o, array as c, transform as C, record as k, fallback as R, literal as u, looseObject as g, variant as T, union as h, unknown as r, lazy as I } from "../../node_modules/valibot/dist/index.js";
|
|
3
3
|
const p = {
|
|
4
4
|
/** Promotional/marketing emails */
|
|
5
5
|
PROMOTIONAL: 1,
|
|
@@ -76,7 +76,7 @@ const p = {
|
|
|
76
76
|
children: e(c(S)),
|
|
77
77
|
// eslint-disable-next-line camelcase -- backend field name
|
|
78
78
|
select_items: e(c(S))
|
|
79
|
-
})), N =
|
|
79
|
+
})), N = k(
|
|
80
80
|
t(),
|
|
81
81
|
R(c(S), [])
|
|
82
82
|
), P = g({
|
|
@@ -132,7 +132,7 @@ const p = {
|
|
|
132
132
|
* strategy, currency, locale, and layout data.
|
|
133
133
|
*/
|
|
134
134
|
recommendationConfigs: e(
|
|
135
|
-
|
|
135
|
+
k(t(), P),
|
|
136
136
|
{}
|
|
137
137
|
)
|
|
138
138
|
}), x = a({
|
|
@@ -219,7 +219,8 @@ const p = {
|
|
|
219
219
|
/** Enable pre-save domain-allowlist validation (opt-in; Guido self-serves the block toaster) */
|
|
220
220
|
allowlistEnabled: e(o(), !1),
|
|
221
221
|
/** Enable persistent link tracking-id assignment for the click heatmap (opt-in) */
|
|
222
|
-
linkTrackingIds: e(o(), !1)
|
|
222
|
+
linkTrackingIds: e(o(), !1),
|
|
223
|
+
reusableRecommendationStrategy: e(o(), !1)
|
|
223
224
|
}), B = i([
|
|
224
225
|
"amp-accordion",
|
|
225
226
|
"amp-carousel",
|
|
@@ -287,7 +288,7 @@ const p = {
|
|
|
287
288
|
...d.entries,
|
|
288
289
|
type: u("custom"),
|
|
289
290
|
/** Custom processor function */
|
|
290
|
-
processor:
|
|
291
|
+
processor: y(
|
|
291
292
|
(s) => typeof s == "function",
|
|
292
293
|
"processor must be a function"
|
|
293
294
|
)
|
|
@@ -307,7 +308,7 @@ const p = {
|
|
|
307
308
|
* Return false to cancel the save operation.
|
|
308
309
|
*/
|
|
309
310
|
externalValidation: e(
|
|
310
|
-
|
|
311
|
+
y(
|
|
311
312
|
(s) => typeof s == "function",
|
|
312
313
|
"externalValidation must be a function"
|
|
313
314
|
)
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import
|
|
1
|
+
import o from "./Guido.vue2.js";
|
|
2
2
|
/* empty css */
|
|
3
|
-
import
|
|
3
|
+
import i from "../_virtual/_plugin-vue2_normalizer.js";
|
|
4
4
|
var t = function() {
|
|
5
|
-
var
|
|
6
|
-
return r("div", { ref: "wrapperRef", staticClass: "guido-editor__wrapper", class: { "guido-editor__no-header": e.noHeader } }, [r(e.HeaderWrapper, { ref: "headerWrapperRef" }), r(e.AutoSaveController), e.editorStore.isPreviewModeOpen ? r(e.PreviewContainer) :
|
|
5
|
+
var a = this, r = a._self._c, e = a._self._setupProxy;
|
|
6
|
+
return r("div", { ref: "wrapperRef", staticClass: "guido-editor__wrapper", class: { "guido-editor__no-header": e.noHeader } }, [r(e.HeaderWrapper, { ref: "headerWrapperRef" }), r(e.AutoSaveController), e.editorStore.isPreviewModeOpen ? r(e.PreviewContainer) : a._e(), r("div", { directives: [{ name: "show", rawName: "v-show", value: !e.previewStore.isLoaded, expression: "!previewStore.isLoaded" }], staticClass: "guido-editor__container", class: { "guido-editor__no-header": e.noHeader }, attrs: { id: "guido-editor" } }), r(e.Toaster), r(e.FilterSelectionDrawer), e.isRrsEnabled || e.hasAssignedStrategy ? r(e.AssignStrategyDrawer) : a._e(), e.isRrsEnabled || e.hasAssignedStrategy ? r(e.RemoveStrategyModal) : a._e(), r(e.SaveAsTemplateDrawer), e.isTestPartner() ? a._e() : r(e.OnboardingWrapper, { on: { "onboarding-finished": function(_) {
|
|
7
7
|
return e.emit("onboarding:finished");
|
|
8
8
|
} } }), r(e.UnsubscribeWrapper), r(e.LoadingWrapper)], 1);
|
|
9
|
-
},
|
|
10
|
-
|
|
9
|
+
}, s = [], n = /* @__PURE__ */ i(
|
|
10
|
+
o,
|
|
11
11
|
t,
|
|
12
|
-
|
|
12
|
+
s,
|
|
13
13
|
!1,
|
|
14
14
|
null,
|
|
15
|
-
"
|
|
15
|
+
"5c588dc5"
|
|
16
16
|
);
|
|
17
|
-
const
|
|
17
|
+
const v = n.exports;
|
|
18
18
|
export {
|
|
19
|
-
|
|
19
|
+
v as default
|
|
20
20
|
};
|
|
@@ -1,153 +1,158 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { useCortexBlueprintBridge as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
import
|
|
17
|
-
import
|
|
18
|
-
import
|
|
19
|
-
import
|
|
20
|
-
import { useStripoApi as fe } from "../services/stripoApi.js";
|
|
1
|
+
import { defineComponent as Z, defineAsyncComponent as l, ref as A, computed as u, watch as U, onMounted as ee, onUnmounted as te } from "vue";
|
|
2
|
+
import { useCortexBlueprintBridge as oe } from "../composables/useCortexBlueprintBridge.js";
|
|
3
|
+
import { provideGuidoActions as ne } from "../composables/useGuidoActions.js";
|
|
4
|
+
import { useGuidoStateBridge as re } from "../composables/useGuidoStateBridge.js";
|
|
5
|
+
import { usePartner as se } from "../composables/usePartner.js";
|
|
6
|
+
import { useStripo as ae } from "../composables/useStripo.js";
|
|
7
|
+
import { useTimerClone as ie } from "../composables/useTimerClone.js";
|
|
8
|
+
import { migrate as _ } from "../config/migrator/index.js";
|
|
9
|
+
import { ModuleFolderDefaults as N } from "../enums/defaults.js";
|
|
10
|
+
import { RIBBON_SELECTOR as ce } from "../enums/onboarding.js";
|
|
11
|
+
import { useRecommendationExtensionStore as O } from "../extensions/Blocks/Recommendation/store/recommendation.js";
|
|
12
|
+
import de from "./organisms/AutoSaveController.vue.js";
|
|
13
|
+
import me from "./organisms/base/Toaster.vue.js";
|
|
14
|
+
import le from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
|
|
15
|
+
import ue from "./organisms/header/HeaderWrapper.vue.js";
|
|
16
|
+
import pe from "./organisms/LoadingWrapper.vue.js";
|
|
17
|
+
import fe from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
|
|
18
|
+
import ye from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
|
|
19
|
+
import { useStripoApi as ge } from "../services/stripoApi.js";
|
|
21
20
|
import { useConfigStore as ve } from "../stores/config.js";
|
|
22
|
-
import { useDynamicContentStore as
|
|
23
|
-
import { useEditorStore as
|
|
21
|
+
import { useDynamicContentStore as Se } from "../stores/dynamic-content.js";
|
|
22
|
+
import { useEditorStore as P } from "../stores/editor.js";
|
|
24
23
|
import { usePreviewStore as he } from "../stores/preview.js";
|
|
25
|
-
import { useTemplateStore as
|
|
26
|
-
import { useUnsubscribeStore as
|
|
27
|
-
import { readTrackFloor as
|
|
28
|
-
const
|
|
24
|
+
import { useTemplateStore as be } from "../stores/template.js";
|
|
25
|
+
import { useUnsubscribeStore as Ee } from "../stores/unsubscribe.js";
|
|
26
|
+
import { readTrackFloor as W } from "../utils/linkTrackingIds.js";
|
|
27
|
+
const je = /* @__PURE__ */ Z({
|
|
29
28
|
__name: "Guido",
|
|
30
29
|
props: {
|
|
31
30
|
config: null,
|
|
32
31
|
ready: { type: Boolean, default: !0 }
|
|
33
32
|
},
|
|
34
33
|
emits: ["dynamic-content:open", "back", "save:start", "save:complete", "on-change", "ready", "onboarding:finished", "test-email:click"],
|
|
35
|
-
setup(
|
|
36
|
-
const
|
|
34
|
+
setup(x, { expose: G, emit: r }) {
|
|
35
|
+
const a = x, H = l(
|
|
37
36
|
() => import("./organisms/email-preview/PreviewContainer.vue.js")
|
|
38
|
-
), $ =
|
|
37
|
+
), $ = l(
|
|
39
38
|
() => import("./organisms/onboarding/OnboardingWrapper.vue.js")
|
|
40
|
-
),
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
39
|
+
), z = l(
|
|
40
|
+
() => import("./organisms/extensions/recommendation/AssignStrategyDrawer.vue.js")
|
|
41
|
+
), q = l(
|
|
42
|
+
() => import("./organisms/extensions/recommendation/RemoveStrategyModal.vue.js")
|
|
43
|
+
), h = A(), p = A(), f = Se(), b = Ee(), o = ve();
|
|
44
|
+
a.ready && o.init(a.config);
|
|
45
|
+
const c = P(), K = he(), m = u(() => c.hasChanges), { isTestPartner: V } = se(), E = () => {
|
|
46
|
+
var t;
|
|
47
|
+
return (t = h.value) == null ? void 0 : t.handleSave(!0);
|
|
48
|
+
}, w = (t) => {
|
|
49
|
+
c.loadingStatus = t;
|
|
47
50
|
};
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
var
|
|
51
|
+
oe(), re();
|
|
52
|
+
const y = () => {
|
|
53
|
+
var t, e;
|
|
51
54
|
return {
|
|
52
|
-
emailId:
|
|
53
|
-
userId:
|
|
54
|
-
username:
|
|
55
|
-
partnerName:
|
|
56
|
-
savedModulesFolderName: ((
|
|
57
|
-
defaultModulesFolderName: ((e =
|
|
55
|
+
emailId: o.templateId,
|
|
56
|
+
userId: o.userId,
|
|
57
|
+
username: o.username,
|
|
58
|
+
partnerName: o.partnerName,
|
|
59
|
+
savedModulesFolderName: ((t = o.editor) == null ? void 0 : t.savedModulesFolderName) || N.SAVED_MODULES,
|
|
60
|
+
defaultModulesFolderName: ((e = o.editor) == null ? void 0 : e.defaultModulesFolderName) || N.DEFAULT_MODULES
|
|
58
61
|
};
|
|
59
|
-
}, { initPlugin:
|
|
60
|
-
var
|
|
61
|
-
return !((
|
|
62
|
-
})
|
|
63
|
-
|
|
62
|
+
}, { initPlugin: C, preloadRuntime: D } = ae(), { getDefaultTemplate: k } = ge(), { cloneTimersOnSave: T, hasTimerBlocks: F } = ie(), j = u(() => {
|
|
63
|
+
var t;
|
|
64
|
+
return !((t = o.ui) != null && t.showHeader);
|
|
65
|
+
}), J = u(() => o.isFeatureEnabled("reusableRecommendationStrategy")), Q = u(
|
|
66
|
+
() => !!O().recommendationConfigs.strategyId
|
|
67
|
+
);
|
|
68
|
+
ne({
|
|
64
69
|
onBack: () => {
|
|
65
70
|
console.debug("guido:back"), r("back");
|
|
66
71
|
},
|
|
67
72
|
onSaveStart: () => {
|
|
68
73
|
console.debug("guido:save:start"), r("save:start");
|
|
69
74
|
},
|
|
70
|
-
onSaveComplete: (
|
|
71
|
-
const e = { ...
|
|
75
|
+
onSaveComplete: (t) => {
|
|
76
|
+
const e = { ...t, metadata: y() };
|
|
72
77
|
console.debug("guido:save:complete", e), r("save:complete", e);
|
|
73
78
|
},
|
|
74
79
|
onTestEmailClick: () => {
|
|
75
80
|
console.debug("guido:test-email:click"), r("test-email:click");
|
|
76
81
|
}
|
|
77
82
|
});
|
|
78
|
-
const
|
|
79
|
-
console.debug("dynamic-content:close",
|
|
80
|
-
},
|
|
83
|
+
const I = (t) => {
|
|
84
|
+
console.debug("dynamic-content:close", t), f.setSelectedDynamicContent(t), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: t }));
|
|
85
|
+
}, R = () => {
|
|
81
86
|
console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
|
|
82
87
|
};
|
|
83
|
-
|
|
88
|
+
U(() => m.value, () => {
|
|
84
89
|
r("on-change", m.value);
|
|
85
90
|
});
|
|
86
|
-
const
|
|
87
|
-
const e =
|
|
91
|
+
const g = (t) => {
|
|
92
|
+
const e = t, { attribute: s, position: d } = e.detail;
|
|
88
93
|
console.debug("dynamic-content:open", e.detail), r("dynamic-content:open", s, d);
|
|
89
94
|
};
|
|
90
|
-
let
|
|
95
|
+
let i = null;
|
|
91
96
|
const v = () => {
|
|
92
97
|
var e;
|
|
93
|
-
const
|
|
94
|
-
(e =
|
|
95
|
-
},
|
|
96
|
-
var
|
|
98
|
+
const t = document.querySelector(ce);
|
|
99
|
+
(e = p.value) == null || e.style.setProperty("--ribbon-offset", `${(t == null ? void 0 : t.offsetHeight) ?? 0}px`);
|
|
100
|
+
}, S = async () => {
|
|
101
|
+
var t;
|
|
97
102
|
try {
|
|
98
|
-
|
|
99
|
-
const e =
|
|
100
|
-
|
|
101
|
-
const M = ((
|
|
103
|
+
o.initialized || o.init(a.config), c.templateId = o.templateId;
|
|
104
|
+
const e = o.template, s = (e == null ? void 0 : e.html) || "", d = (e == null ? void 0 : e.css) || "", L = (e == null ? void 0 : e.preselectedDynamicContent) || [];
|
|
105
|
+
b.selectedUnsubscribePages = (e == null ? void 0 : e.selectedUnsubscribePages) || [];
|
|
106
|
+
const M = ((t = e == null ? void 0 : e.migration) == null ? void 0 : t.recommendationConfigs) ?? {}, B = o.isFeatureEnabled("linkTrackingIds");
|
|
102
107
|
let n = {
|
|
103
|
-
html: s && await
|
|
108
|
+
html: s && await _(s, M),
|
|
104
109
|
css: d
|
|
105
110
|
};
|
|
106
|
-
n.html || (n = await
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
const
|
|
111
|
+
n.html || (n = await k(), n.html = await _(n.html, M));
|
|
112
|
+
const X = B ? W(n.html, (e == null ? void 0 : e.trackIdCounter) || 0) : 0;
|
|
113
|
+
F(n.html) && (n.html = await T(n.html)), B && (c.trackIdSessionFloor = Math.max(X, W(n.html)));
|
|
114
|
+
const Y = {
|
|
110
115
|
preselectedDynamicContentList: L,
|
|
111
116
|
onReady: () => {
|
|
112
117
|
console.debug("guido:ready"), r("ready");
|
|
113
118
|
}
|
|
114
119
|
};
|
|
115
|
-
await
|
|
120
|
+
await C(n, y(), Y), f.selectedDynamicContentList = L;
|
|
116
121
|
} catch (e) {
|
|
117
122
|
console.error("Failed to initialize Stripo editor:", e);
|
|
118
123
|
}
|
|
119
124
|
};
|
|
120
|
-
return
|
|
125
|
+
return ee(async () => {
|
|
121
126
|
var e;
|
|
122
|
-
console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"),
|
|
123
|
-
const
|
|
124
|
-
if (
|
|
125
|
-
await
|
|
127
|
+
console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), O().$reset(), P().$reset(), be().$reset(), v();
|
|
128
|
+
const t = (e = p.value) == null ? void 0 : e.parentElement;
|
|
129
|
+
if (t && (i = new ResizeObserver(v), i.observe(t)), D(), a.ready)
|
|
130
|
+
await S();
|
|
126
131
|
else {
|
|
127
|
-
const s =
|
|
128
|
-
d && (s(),
|
|
132
|
+
const s = U(() => a.ready, (d) => {
|
|
133
|
+
d && (s(), S());
|
|
129
134
|
});
|
|
130
135
|
}
|
|
131
|
-
document.addEventListener("dynamic-content:open",
|
|
132
|
-
}),
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
136
|
+
document.addEventListener("dynamic-content:open", g);
|
|
137
|
+
}), te(() => {
|
|
138
|
+
i == null || i.disconnect(), document.removeEventListener("dynamic-content:open", g);
|
|
139
|
+
try {
|
|
140
|
+
window.UIEditor.removeEditor();
|
|
141
|
+
} catch {
|
|
142
|
+
console.debug("Failed to remove Stripo editor: No editor found");
|
|
143
|
+
}
|
|
144
|
+
o.reset();
|
|
140
145
|
}), G({
|
|
141
146
|
dynamicContent: {
|
|
142
|
-
insert:
|
|
143
|
-
close:
|
|
147
|
+
insert: I,
|
|
148
|
+
close: R
|
|
144
149
|
},
|
|
145
150
|
hasChanges: m,
|
|
146
|
-
saveSilent:
|
|
147
|
-
setLoading:
|
|
148
|
-
}), { __sfc: !0, PreviewContainer: H, OnboardingWrapper: $, headerWrapperRef: h, wrapperRef:
|
|
151
|
+
saveSilent: E,
|
|
152
|
+
setLoading: w
|
|
153
|
+
}), { __sfc: !0, PreviewContainer: H, OnboardingWrapper: $, AssignStrategyDrawer: z, RemoveStrategyModal: q, headerWrapperRef: h, wrapperRef: p, dynamicContentStore: f, unsubscribeStore: b, props: a, configStore: o, editorStore: c, previewStore: K, hasChanges: m, isTestPartner: V, saveSilent: E, setLoading: w, emit: r, buildMetadata: y, initPlugin: C, preloadRuntime: D, getDefaultTemplate: k, cloneTimersOnSave: T, hasTimerBlocks: F, noHeader: j, isRrsEnabled: J, hasAssignedStrategy: Q, insertDynamicContent: I, closeDynamicContent: R, handleDynamicContentOpen: g, ribbonObserver: i, updateRibbonOffset: v, startEditor: S, AutoSaveController: de, Toaster: me, FilterSelectionDrawer: le, HeaderWrapper: ue, LoadingWrapper: pe, SaveAsTemplateDrawer: fe, UnsubscribeWrapper: ye };
|
|
149
154
|
}
|
|
150
155
|
});
|
|
151
156
|
export {
|
|
152
|
-
|
|
157
|
+
je as default
|
|
153
158
|
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import r from "./AssignStrategyDrawer.vue2.js";
|
|
2
|
+
/* empty css */
|
|
3
|
+
/* empty css */
|
|
4
|
+
import a from "../../../../_virtual/_plugin-vue2_normalizer.js";
|
|
5
|
+
var o = function() {
|
|
6
|
+
var e = this, s = e._self._c, t = e._self._setupProxy;
|
|
7
|
+
return t.store.assignStrategyDrawerStatus ? s(t.OrgStrategyDetailModal, { staticClass: "assign-strategy-drawer", attrs: { "description-status": "", show: "", "description-text": t.drawerDescription, "footer-button-group-options": t.footerButtonGroupOptions, strategy: t.selectedStrategy ?? {}, "title-text": t.trans("gpt-app-builder.assign-recommendation-strategy") }, on: { close: t.closeDrawer, primaryClick: t.assignStrategy }, scopedSlots: e._u([{ key: "contentTop", fn: function() {
|
|
8
|
+
return [s("div", { staticClass: "assign-strategy-drawer-content px-5 py-5" }, [s(t.OrgStrategyDropdown, { staticClass: "assign-strategy-select", attrs: { id: "assign-strategy-select", "info-box-position": "bottom right", "create-button-visible": !1, loading: t.store.strategiesLoading, "placeholder-text": t.trans("smart-recommender.select-recommendation-strategy"), "selected-strategy-id": t.selectedStrategyId, state: t.showSelectionError ? "error" : "default", "state-message": t.showSelectionError ? t.trans("ds-steps.select-strategy-tooltip") : "", strategies: t.strategyOptions }, on: { select: t.onSelect } })], 1)];
|
|
9
|
+
}, proxy: !0 }], null, !1, 2542767044) }) : e._e();
|
|
10
|
+
}, n = [], i = /* @__PURE__ */ a(
|
|
11
|
+
r,
|
|
12
|
+
o,
|
|
13
|
+
n,
|
|
14
|
+
!1,
|
|
15
|
+
null,
|
|
16
|
+
"2580a7d9"
|
|
17
|
+
);
|
|
18
|
+
const y = i.exports;
|
|
19
|
+
export {
|
|
20
|
+
y as default
|
|
21
|
+
};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { defineComponent as v, defineAsyncComponent as y, ref as u, computed as l, watch as O } from "vue";
|
|
2
|
+
import "@useinsider/design-system-organisms/style";
|
|
3
|
+
import { useToaster as x } from "../../../../composables/useToaster.js";
|
|
4
|
+
import { useTranslations as A } from "../../../../composables/useTranslations.js";
|
|
5
|
+
import { DOTTED_DATE_LOCALE as E } from "../../../../enums/date.js";
|
|
6
|
+
import { URLS as h } from "../../../../enums/extensions/recommendationBlock.js";
|
|
7
|
+
import { ToasterTypeOptions as m } from "../../../../enums/toaster.js";
|
|
8
|
+
import { useRecommendationExtensionStore as C } from "../../../../extensions/Blocks/Recommendation/store/recommendation.js";
|
|
9
|
+
import B from "./StrategyInfoBoxContent.vue.js";
|
|
10
|
+
import { formatShortDate as I } from "../../../../utils/dateUtil.js";
|
|
11
|
+
import { asText as f } from "../../../../utils/genericUtil.js";
|
|
12
|
+
import { escapeHtml as N } from "../../../../utils/htmlEscape.js";
|
|
13
|
+
import { InSkeleton as b } from "@useinsider/design-system-vue";
|
|
14
|
+
const W = /* @__PURE__ */ v({
|
|
15
|
+
__name: "AssignStrategyDrawer",
|
|
16
|
+
setup(k) {
|
|
17
|
+
const c = () => import("@useinsider/design-system-organisms"), g = (t, r) => ({
|
|
18
|
+
render: (a) => a(b, { props: { sizing: { width: t, height: r } } })
|
|
19
|
+
}), S = y({
|
|
20
|
+
loader: async () => (await c()).OrgStrategyDetailModal,
|
|
21
|
+
loadingComponent: g(480, 240),
|
|
22
|
+
delay: 0
|
|
23
|
+
}), T = y({
|
|
24
|
+
loader: async () => (await c()).OrgStrategyDropdown,
|
|
25
|
+
loadingComponent: g(240, 42),
|
|
26
|
+
delay: 0
|
|
27
|
+
}), o = A(), e = C(), { showToaster: s } = x(), n = u(null), i = u(!1), _ = l(() => e.assignStrategyDrawerStatus ? o("email-editor.assign-strategy-description", { url: h.RECOMMENDATION_STRATEGIES_PANEL_PATH }) : "");
|
|
28
|
+
O(() => e.assignStrategyDrawerStatus, (t) => {
|
|
29
|
+
if (!t)
|
|
30
|
+
return;
|
|
31
|
+
const { strategyId: r } = e.recommendationConfigs;
|
|
32
|
+
n.value = r || null, i.value = !1, e.fetchStrategies().catch(() => {
|
|
33
|
+
s({
|
|
34
|
+
type: m.Error,
|
|
35
|
+
message: o("discovery-strategy.error-description")
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
const p = (t) => {
|
|
40
|
+
const r = f(t.updated_at || t.created_at);
|
|
41
|
+
if (!r)
|
|
42
|
+
return "";
|
|
43
|
+
const a = I(r, E);
|
|
44
|
+
return o("recommendation-strategy.last-updated-on", { value: a });
|
|
45
|
+
}, D = l(() => e.strategies.map((t) => ({
|
|
46
|
+
text: t.name,
|
|
47
|
+
value: t.strategy_id,
|
|
48
|
+
infoBoxProps: {
|
|
49
|
+
id: `strategy-info-${t.strategy_id}`,
|
|
50
|
+
theme: "light",
|
|
51
|
+
variant: "information",
|
|
52
|
+
className: "assign-strategy-info-box",
|
|
53
|
+
titleText: N(f(t.name)),
|
|
54
|
+
descriptionStatus: !0,
|
|
55
|
+
descriptionText: p(t),
|
|
56
|
+
slot: B,
|
|
57
|
+
slotProps: { strategy: t }
|
|
58
|
+
}
|
|
59
|
+
}))), d = l(() => {
|
|
60
|
+
const t = e.strategies.find((r) => String(r.strategy_id) === String(n.value ?? ""));
|
|
61
|
+
return t ? { ...t, fallback_config: null } : null;
|
|
62
|
+
}), w = l(() => ({
|
|
63
|
+
primaryButton: {
|
|
64
|
+
styling: "solid",
|
|
65
|
+
type: "primary",
|
|
66
|
+
labelText: o("products.assign-btn")
|
|
67
|
+
},
|
|
68
|
+
cancelOrBackButton: {
|
|
69
|
+
styling: "ghost",
|
|
70
|
+
type: "secondary",
|
|
71
|
+
labelText: o("products.cancel")
|
|
72
|
+
}
|
|
73
|
+
}));
|
|
74
|
+
return { __sfc: !0, loadOrganisms: c, skeleton: g, OrgStrategyDetailModal: S, OrgStrategyDropdown: T, trans: o, store: e, showToaster: s, selectedStrategyId: n, showSelectionError: i, drawerDescription: _, lastUpdatedText: p, strategyOptions: D, selectedStrategy: d, footerButtonGroupOptions: w, closeDrawer: () => {
|
|
75
|
+
e.closeAssignStrategyDrawer();
|
|
76
|
+
}, assignStrategy: async () => {
|
|
77
|
+
const t = d.value;
|
|
78
|
+
if (!t) {
|
|
79
|
+
i.value = !0;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
let r = "";
|
|
83
|
+
try {
|
|
84
|
+
r = await e.resolveStrategyUrlTemplate(t, e.recommendationConfigs.currencySettings.value);
|
|
85
|
+
} catch (a) {
|
|
86
|
+
console.error("[AssignStrategyDrawer] resolveStrategyUrlTemplate failed", a);
|
|
87
|
+
}
|
|
88
|
+
if (!r) {
|
|
89
|
+
s({
|
|
90
|
+
type: m.Error,
|
|
91
|
+
message: o("email-editor.strategy-assign-failed", { strategyName: t.name })
|
|
92
|
+
});
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
e.assignStrategy(t), s({
|
|
96
|
+
type: m.Success,
|
|
97
|
+
message: o("email-editor.strategy-assigned-success", { strategyName: t.name })
|
|
98
|
+
}), e.closeAssignStrategyDrawer();
|
|
99
|
+
}, onSelect: (t) => {
|
|
100
|
+
n.value = t.value, i.value = !1;
|
|
101
|
+
} };
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
export {
|
|
105
|
+
W as default
|
|
106
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import s from "./RemoveStrategyModal.vue2.js";
|
|
2
|
+
import r from "../../../../_virtual/_plugin-vue2_normalizer.js";
|
|
3
|
+
var a = function() {
|
|
4
|
+
var t = this, o = t._self._c, e = t._self._setupProxy;
|
|
5
|
+
return e.store.removeStrategyModalStatus ? o(e.WpModal, { attrs: { id: "guido__remove-strategy-modal", size: "small", "close-on-outside-click": !1, "footer-button-options": e.footerButtonOptions, title: e.trans("email-editor.remove-strategy-confirm-title") }, on: { close: e.close, "primary-action": e.handleConfirm, "secondary-action": e.close } }, [o("p", [t._v(t._s(e.messageParts[0])), o("b", [t._v(t._s(e.strategyName))]), t._v(t._s(e.messageParts[1]))])]) : t._e();
|
|
6
|
+
}, n = [], _ = /* @__PURE__ */ r(
|
|
7
|
+
s,
|
|
8
|
+
a,
|
|
9
|
+
n,
|
|
10
|
+
!1,
|
|
11
|
+
null,
|
|
12
|
+
null
|
|
13
|
+
);
|
|
14
|
+
const c = _.exports;
|
|
15
|
+
export {
|
|
16
|
+
c as default
|
|
17
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { defineComponent as u, computed as n } from "vue";
|
|
2
|
+
import y from "../../../wrappers/WpModal.vue.js";
|
|
3
|
+
import { useToaster as f } from "../../../../composables/useToaster.js";
|
|
4
|
+
import { useTranslations as _ } from "../../../../composables/useTranslations.js";
|
|
5
|
+
import { ToasterTypeOptions as v } from "../../../../enums/toaster.js";
|
|
6
|
+
import { useRecommendationExtensionStore as T } from "../../../../extensions/Blocks/Recommendation/store/recommendation.js";
|
|
7
|
+
import { commitBlockChangeOutsidePanel as h } from "../../../../extensions/Blocks/Recommendation/utils/nodeConfigWriter.js";
|
|
8
|
+
import { escapeHtml as R } from "../../../../utils/htmlEscape.js";
|
|
9
|
+
const P = /* @__PURE__ */ u({
|
|
10
|
+
__name: "RemoveStrategyModal",
|
|
11
|
+
setup(S) {
|
|
12
|
+
const t = _(), e = T(), { showToaster: a } = f(), i = n(() => ({
|
|
13
|
+
cancelOrBackButton: {
|
|
14
|
+
type: "secondary",
|
|
15
|
+
labelText: t("products.cancel"),
|
|
16
|
+
styling: "ghost"
|
|
17
|
+
},
|
|
18
|
+
primaryButton: {
|
|
19
|
+
type: "danger",
|
|
20
|
+
labelText: t("discovery-strategy.remove")
|
|
21
|
+
}
|
|
22
|
+
})), m = n(() => {
|
|
23
|
+
var o;
|
|
24
|
+
const { strategyId: r } = e.recommendationConfigs;
|
|
25
|
+
return ((o = e.assignedStrategy) == null ? void 0 : o.name) || `#${r}`;
|
|
26
|
+
}), s = "__STRATEGY_NAME__", d = n(() => t("email-editor.remove-strategy-confirm-message", { strategyName: s }).split(s)), c = () => {
|
|
27
|
+
e.closeRemoveStrategyModal();
|
|
28
|
+
};
|
|
29
|
+
return { __sfc: !0, trans: t, store: e, showToaster: a, footerButtonOptions: i, strategyName: m, NAME_TOKEN: s, messageParts: d, close: c, handleConfirm: async () => {
|
|
30
|
+
const r = m.value, o = e.currentRecommendationId;
|
|
31
|
+
e.removeStrategy(), c();
|
|
32
|
+
const { strategyId: l, size: g } = e.recommendationConfigs;
|
|
33
|
+
if (a({
|
|
34
|
+
type: v.Success,
|
|
35
|
+
// The toast renders through a sanitizing v-html, so the name is escaped first.
|
|
36
|
+
message: t("email-editor.strategy-removed-success", {
|
|
37
|
+
strategyName: `<b>${R(r)}</b>`
|
|
38
|
+
})
|
|
39
|
+
}), o !== null) {
|
|
40
|
+
try {
|
|
41
|
+
await e.fetchRecommendationProducts();
|
|
42
|
+
} catch (p) {
|
|
43
|
+
console.error("[RemoveStrategyModal] product refetch failed", p);
|
|
44
|
+
}
|
|
45
|
+
h(
|
|
46
|
+
o,
|
|
47
|
+
{ strategyId: l, size: g },
|
|
48
|
+
e.recommendationProducts,
|
|
49
|
+
"Removed recommendation strategy"
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
}, WpModal: y };
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
export {
|
|
56
|
+
P as default
|
|
57
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import r from "./StrategyInfoBoxContent.vue2.js";
|
|
2
|
+
import _ from "../../../../_virtual/_plugin-vue2_normalizer.js";
|
|
3
|
+
var c = function() {
|
|
4
|
+
var t = this, s = t._self._c, n = t._self._setupProxy;
|
|
5
|
+
return s("div", { staticClass: "d-f f-d-c mt-3" }, t._l(n.details, function(e, a) {
|
|
6
|
+
return s("div", { key: e.title, staticClass: "d-f f-d-c", class: { "mt-2": a > 0 } }, [s("span", { staticClass: "f-s-1 f-w-600 l-h-1 t-c-52 mb-12" }, [t._v(t._s(e.title))]), s("span", { staticClass: "f-s-1 l-h-6 t-c-55 w-b-b-w" }, [t._v(t._s(e.value))])]);
|
|
7
|
+
}), 0);
|
|
8
|
+
}, f = [], l = /* @__PURE__ */ _(
|
|
9
|
+
r,
|
|
10
|
+
c,
|
|
11
|
+
f,
|
|
12
|
+
!1,
|
|
13
|
+
null,
|
|
14
|
+
null
|
|
15
|
+
);
|
|
16
|
+
const p = l.exports;
|
|
17
|
+
export {
|
|
18
|
+
p as default
|
|
19
|
+
};
|