@useinsider/guido 3.19.0-beta.87e26c0 → 3.19.0-beta.892c3ca

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 (103) hide show
  1. package/README.md +22 -3
  2. package/dist/@types/config/schemas.js +78 -68
  3. package/dist/components/Guido.vue.js +8 -8
  4. package/dist/components/Guido.vue2.js +81 -76
  5. package/dist/components/organisms/AutoSaveController.vue2.js +9 -8
  6. package/dist/components/organisms/base/Toaster.vue2.js +13 -12
  7. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.js +13 -11
  8. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue2.js +78 -57
  9. package/dist/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.js +18 -0
  10. package/dist/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue2.js +25 -0
  11. package/dist/components/organisms/extensions/recommendation/RemoveStrategyModal.vue2.js +28 -42
  12. package/dist/components/organisms/header/EditorActions.vue.js +5 -5
  13. package/dist/components/organisms/header/EditorActions.vue2.js +90 -57
  14. package/dist/components/organisms/header/LeftSlot.vue.js +5 -5
  15. package/dist/components/organisms/header/LeftSlot.vue2.js +16 -12
  16. package/dist/components/organisms/onboarding/OnboardingWrapper.vue2.js +28 -24
  17. package/dist/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue.js +21 -0
  18. package/dist/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue2.js +46 -0
  19. package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.js +21 -0
  20. package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue2.js +47 -0
  21. package/dist/components/organisms/validation/ValidationErrorDrawer.vue.js +20 -0
  22. package/dist/components/organisms/validation/ValidationErrorDrawer.vue2.js +49 -0
  23. package/dist/components/wrappers/WpDrawer.vue.js +9 -7
  24. package/dist/components/wrappers/WpDrawer.vue2.js +1 -1
  25. package/dist/composables/useActionsApi.js +52 -47
  26. package/dist/composables/useCodeEditorApi.js +23 -9
  27. package/dist/composables/useCustomInterfaceAppearance.js +65 -51
  28. package/dist/composables/useHtmlCompiler.js +37 -26
  29. package/dist/composables/useHtmlValidator.js +89 -82
  30. package/dist/composables/useHttp.js +44 -55
  31. package/dist/composables/useLegacyStrategyConversion.js +61 -0
  32. package/dist/composables/useRecommendation.js +40 -35
  33. package/dist/composables/useSave.js +90 -45
  34. package/dist/composables/useSaveValidation.js +282 -0
  35. package/dist/composables/useSaveValidationRollout.js +9 -0
  36. package/dist/composables/useStripo.js +30 -30
  37. package/dist/composables/useToaster.js +14 -20
  38. package/dist/composables/useTranslations.js +3 -2
  39. package/dist/composables/useVersionHistoryApi.js +33 -24
  40. package/dist/composables/validators/useCouponBlockValidator.js +24 -21
  41. package/dist/composables/validators/useUnsubscribeBlockValidator.js +34 -27
  42. package/dist/enums/extensions/recommendationBlock.js +49 -33
  43. package/dist/enums/save-validation.js +4 -0
  44. package/dist/extensions/Blocks/Recommendation/block.js +61 -42
  45. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +21 -20
  46. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +100 -94
  47. package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +130 -55
  48. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +74 -74
  49. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +273 -92
  50. package/dist/extensions/Blocks/Recommendation/utils/legacyStrategyMigration.js +42 -0
  51. package/dist/extensions/Blocks/Recommendation/utils/nodeConfigWriter.js +26 -16
  52. package/dist/extensions/Blocks/Recommendation/utils/strategyCommit.js +24 -0
  53. package/dist/extensions/Blocks/Recommendation/validation/requiredFields.js +21 -12
  54. package/dist/guido.css +1 -1
  55. package/dist/services/recommendationApi.js +46 -37
  56. package/dist/src/@types/config/schemas.d.ts +20 -0
  57. package/dist/src/@types/save-validation.d.ts +19 -0
  58. package/dist/src/components/Guido.vue.d.ts +17 -1
  59. package/dist/src/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.d.ts +2 -0
  60. package/dist/src/components/organisms/header/EditorActions.vue.d.ts +17 -1
  61. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +17 -1
  62. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +17 -1
  63. package/dist/src/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue.d.ts +2 -0
  64. package/dist/src/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.d.ts +2 -0
  65. package/dist/src/components/organisms/validation/ValidationErrorDrawer.vue.d.ts +2 -0
  66. package/dist/src/components/wrappers/WpDrawer.vue.d.ts +4 -3
  67. package/dist/src/composables/useConfig.d.ts +6 -0
  68. package/dist/src/composables/useHtmlValidator.d.ts +21 -0
  69. package/dist/src/composables/useLegacyStrategyConversion.d.ts +3 -0
  70. package/dist/src/composables/useSave.d.ts +6 -1
  71. package/dist/src/composables/useSaveValidation.d.ts +6 -0
  72. package/dist/src/composables/useSaveValidationRollout.d.ts +3 -0
  73. package/dist/src/composables/validators/useCouponBlockValidator.d.ts +3 -0
  74. package/dist/src/composables/validators/useUnsubscribeBlockValidator.d.ts +10 -0
  75. package/dist/src/enums/extensions/recommendationBlock.d.ts +7 -1
  76. package/dist/src/enums/save-validation.d.ts +27 -0
  77. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +10 -0
  78. package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +1 -0
  79. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +1 -1
  80. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +2 -0
  81. package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +10 -0
  82. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +7 -2
  83. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +162 -1
  84. package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMigration.d.ts +32 -0
  85. package/dist/src/extensions/Blocks/Recommendation/utils/strategyCommit.d.ts +14 -0
  86. package/dist/src/extensions/Blocks/Recommendation/validation/requiredFields.d.ts +4 -0
  87. package/dist/src/services/recommendationApi.d.ts +2 -1
  88. package/dist/src/stores/config.d.ts +354 -0
  89. package/dist/src/stores/onboarding.d.ts +808 -10
  90. package/dist/src/stores/save-validation.d.ts +22 -0
  91. package/dist/src/utils/stripoEditorApi.d.ts +4 -0
  92. package/dist/src/utils/templatePreparation.d.ts +30 -0
  93. package/dist/static/assets/icons/filled-arrow-rising.svg.js +5 -0
  94. package/dist/static/assets/icons/line-info.svg.js +5 -0
  95. package/dist/static/styles/components/recommendation-strategy.css.js +104 -9
  96. package/dist/static/styles/components/skeleton.css.js +23 -0
  97. package/dist/stores/config.js +55 -24
  98. package/dist/stores/onboarding.js +46 -36
  99. package/dist/stores/save-validation.js +30 -0
  100. package/dist/stores/unsubscribe.js +3 -3
  101. package/dist/utils/stripoEditorApi.js +11 -0
  102. package/dist/utils/templatePreparation.js +54 -51
  103. package/package.json +2 -1
@@ -1,55 +1,60 @@
1
- import { defineComponent as ne, defineAsyncComponent as l, ref as O, computed as u, watch as P, onMounted as re, onUnmounted as se } from "vue";
2
- import { useCortexBlueprintBridge as ae } from "../composables/useCortexBlueprintBridge.js";
3
- import { useEditorLock as ie } from "../composables/useEditorLock.js";
4
- import { provideGuidoActions as ce } from "../composables/useGuidoActions.js";
5
- import { useGuidoStateBridge as de } from "../composables/useGuidoStateBridge.js";
6
- import { usePartner as me } from "../composables/usePartner.js";
7
- import { useStripo as le } from "../composables/useStripo.js";
8
- import { useTimerClone as ue } from "../composables/useTimerClone.js";
9
- import { migrate as x } from "../config/migrator/index.js";
10
- import { ModuleFolderDefaults as W } from "../enums/defaults.js";
11
- import { RIBBON_SELECTOR as pe } from "../enums/onboarding.js";
12
- import { useRecommendationExtensionStore as G } from "../extensions/Blocks/Recommendation/store/recommendation.js";
13
- import fe from "./organisms/AutoSaveController.vue.js";
14
- import ye from "./organisms/base/Toaster.vue.js";
15
- import ge from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
16
- import ve from "./organisms/header/HeaderWrapper.vue.js";
17
- import Se from "./organisms/LoadingWrapper.vue.js";
18
- import be from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
19
- import he from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
20
- import { useStripoApi as Ee } from "../services/stripoApi.js";
21
- import { useConfigStore as we } from "../stores/config.js";
22
- import { useDynamicContentStore as Ce } from "../stores/dynamic-content.js";
23
- import { useEditorStore as H } from "../stores/editor.js";
24
- import { usePreviewStore as De } from "../stores/preview.js";
25
- import { useTemplateStore as ke } from "../stores/template.js";
26
- import { useUnsubscribeStore as Te } from "../stores/unsubscribe.js";
1
+ import { defineComponent as ae, defineAsyncComponent as m, ref as O, computed as u, watch as x, onMounted as se, onUnmounted as ie } from "vue";
2
+ import { useCortexBlueprintBridge as ce } from "../composables/useCortexBlueprintBridge.js";
3
+ import { useEditorLock as de } from "../composables/useEditorLock.js";
4
+ import { provideGuidoActions as me } from "../composables/useGuidoActions.js";
5
+ import { useGuidoStateBridge as le } from "../composables/useGuidoStateBridge.js";
6
+ import { usePartner as ue } from "../composables/usePartner.js";
7
+ import { useSaveValidationRollout as pe } from "../composables/useSaveValidationRollout.js";
8
+ import { useStripo as fe } from "../composables/useStripo.js";
9
+ import { useTimerClone as ye } from "../composables/useTimerClone.js";
10
+ import { migrate as W } from "../config/migrator/index.js";
11
+ import { ModuleFolderDefaults as G } from "../enums/defaults.js";
12
+ import { RIBBON_SELECTOR as ge } from "../enums/onboarding.js";
13
+ import { useRecommendationExtensionStore as h } from "../extensions/Blocks/Recommendation/store/recommendation.js";
14
+ import ve from "./organisms/AutoSaveController.vue.js";
15
+ import Se from "./organisms/base/Toaster.vue.js";
16
+ import be from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
17
+ import he from "./organisms/header/HeaderWrapper.vue.js";
18
+ import Ee from "./organisms/LoadingWrapper.vue.js";
19
+ import we from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
20
+ import Ce from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
21
+ import De from "./organisms/validation/ValidationErrorDrawer.vue.js";
22
+ import { useStripoApi as ke } from "../services/stripoApi.js";
23
+ import { useConfigStore as Re } from "../stores/config.js";
24
+ import { useDynamicContentStore as Te } from "../stores/dynamic-content.js";
25
+ import { useEditorStore as V } from "../stores/editor.js";
26
+ import { usePreviewStore as Fe } from "../stores/preview.js";
27
+ import { useSaveValidationStore as Me } from "../stores/save-validation.js";
28
+ import { useTemplateStore as Ie } from "../stores/template.js";
29
+ import { useUnsubscribeStore as Le } from "../stores/unsubscribe.js";
27
30
  import { readTrackFloor as $ } from "../utils/linkTrackingIds.js";
28
- const et = /* @__PURE__ */ ne({
31
+ const ct = /* @__PURE__ */ ae({
29
32
  __name: "Guido",
30
33
  props: {
31
34
  config: null,
32
35
  ready: { type: Boolean, default: !0 }
33
36
  },
34
37
  emits: ["dynamic-content:open", "back", "save:start", "save:complete", "on-change", "ready", "onboarding:finished", "test-email:click"],
35
- setup(z, { expose: q, emit: r }) {
36
- const a = z, K = l(
38
+ setup(H, { expose: z, emit: r }) {
39
+ const s = H, q = m(
37
40
  () => import("./organisms/email-preview/PreviewContainer.vue.js")
38
- ), V = l(
41
+ ), K = m(
39
42
  () => import("./organisms/onboarding/OnboardingWrapper.vue.js")
40
- ), j = l(
43
+ ), j = m(
41
44
  () => import("./organisms/extensions/recommendation/AssignStrategyDrawer.vue.js")
42
- ), J = l(
45
+ ), J = m(
43
46
  () => import("./organisms/extensions/recommendation/RemoveStrategyModal.vue.js")
44
- ), h = O(), p = O(), f = Ce(), E = Te(), o = we();
45
- a.ready && o.init(a.config);
46
- const c = H(), Q = De(), m = u(() => c.hasChanges), { isTestPartner: X } = me(), w = () => {
47
+ ), Q = m(
48
+ () => import("./organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.js")
49
+ ), E = O(), p = O(), f = Te(), w = Le(), o = Re();
50
+ s.ready && o.init(s.config);
51
+ const c = V(), X = Fe(), l = u(() => c.hasChanges), { isTestPartner: Y } = ue(), { isEnabled: Z } = pe(), C = () => {
47
52
  var t;
48
- return (t = h.value) == null ? void 0 : t.handleSave(!0);
49
- }, C = (t) => {
53
+ return (t = E.value) == null ? void 0 : t.handleSave(!0);
54
+ }, D = (t) => {
50
55
  c.loadingStatus = t;
51
56
  };
52
- ae(), de();
57
+ ce(), le();
53
58
  const y = () => {
54
59
  var t, e;
55
60
  return {
@@ -57,18 +62,18 @@ const et = /* @__PURE__ */ ne({
57
62
  userId: o.userId,
58
63
  username: o.username,
59
64
  partnerName: o.partnerName,
60
- savedModulesFolderName: ((t = o.editor) == null ? void 0 : t.savedModulesFolderName) || W.SAVED_MODULES,
61
- defaultModulesFolderName: ((e = o.editor) == null ? void 0 : e.defaultModulesFolderName) || W.DEFAULT_MODULES
65
+ savedModulesFolderName: ((t = o.editor) == null ? void 0 : t.savedModulesFolderName) || G.SAVED_MODULES,
66
+ defaultModulesFolderName: ((e = o.editor) == null ? void 0 : e.defaultModulesFolderName) || G.DEFAULT_MODULES
62
67
  };
63
- }, { initPlugin: D, preloadRuntime: k } = le(), { runExclusive: T, beginMount: F, isCurrentMount: I } = ie();
68
+ }, { initPlugin: k, preloadRuntime: R } = fe(), { runExclusive: T, beginMount: F, isCurrentMount: M } = de();
64
69
  let g = 0;
65
- const { getDefaultTemplate: M } = Ee(), { cloneTimersOnSave: R, hasTimerBlocks: L } = ue(), Y = u(() => {
70
+ const { getDefaultTemplate: I } = ke(), { cloneTimersOnSave: L, hasTimerBlocks: B } = ye(), ee = u(() => {
66
71
  var t;
67
72
  return !((t = o.ui) != null && t.showHeader);
68
- }), Z = u(() => o.isFeatureEnabled("reusableRecommendationStrategy")), ee = u(
69
- () => !!G().recommendationConfigs.strategyId
73
+ }), te = u(() => o.isFeatureEnabled("reusableRecommendationStrategy")), oe = u(
74
+ () => !!h().recommendationConfigs.strategyId
70
75
  );
71
- ce({
76
+ me({
72
77
  onBack: () => {
73
78
  console.debug("guido:back"), r("back");
74
79
  },
@@ -83,80 +88,80 @@ const et = /* @__PURE__ */ ne({
83
88
  console.debug("guido:test-email:click"), r("test-email:click");
84
89
  }
85
90
  });
86
- const B = (t) => {
91
+ const U = (t) => {
87
92
  console.debug("dynamic-content:close", t), f.setSelectedDynamicContent(t), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: t }));
88
93
  }, A = () => {
89
94
  console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
90
95
  };
91
- P(() => m.value, () => {
92
- r("on-change", m.value);
96
+ x(() => l.value, () => {
97
+ r("on-change", l.value);
93
98
  });
94
99
  const v = (t) => {
95
- const e = t, { attribute: s, position: d } = e.detail;
96
- console.debug("dynamic-content:open", e.detail), r("dynamic-content:open", s, d);
100
+ const e = t, { attribute: a, position: d } = e.detail;
101
+ console.debug("dynamic-content:open", e.detail), r("dynamic-content:open", a, d);
97
102
  };
98
103
  let i = null;
99
104
  const S = () => {
100
105
  var e;
101
- const t = document.querySelector(pe);
106
+ const t = document.querySelector(ge);
102
107
  (e = p.value) == null || e.style.setProperty("--ribbon-offset", `${(t == null ? void 0 : t.offsetHeight) ?? 0}px`);
103
108
  }, b = async () => {
104
109
  var t;
105
110
  try {
106
- o.initialized || o.init(a.config), c.templateId = o.templateId;
107
- const e = o.template, s = (e == null ? void 0 : e.html) || "", d = (e == null ? void 0 : e.css) || "", U = (e == null ? void 0 : e.preselectedDynamicContent) || [];
108
- E.selectedUnsubscribePages = (e == null ? void 0 : e.selectedUnsubscribePages) || [];
111
+ o.initialized || o.init(s.config), c.templateId = o.templateId;
112
+ const e = o.template, a = (e == null ? void 0 : e.html) || "", d = (e == null ? void 0 : e.css) || "", P = (e == null ? void 0 : e.preselectedDynamicContent) || [];
113
+ w.selectedUnsubscribePages = (e == null ? void 0 : e.selectedUnsubscribePages) || [];
109
114
  const _ = ((t = e == null ? void 0 : e.migration) == null ? void 0 : t.recommendationConfigs) ?? {}, N = o.isFeatureEnabled("linkTrackingIds");
110
115
  let n = {
111
- html: s && await x(s, _),
116
+ html: a && await W(a, _),
112
117
  css: d
113
118
  };
114
- n.html || (n = await M(), n.html = await x(n.html, _));
115
- const te = N ? $(n.html, (e == null ? void 0 : e.trackIdCounter) || 0) : 0;
116
- L(n.html) && (n.html = await R(n.html)), N && (c.trackIdSessionFloor = Math.max(te, $(n.html)));
117
- const oe = {
118
- preselectedDynamicContentList: U,
119
+ n.html || (n = await I(), n.html = await W(n.html, _));
120
+ const ne = N ? $(n.html, (e == null ? void 0 : e.trackIdCounter) || 0) : 0;
121
+ B(n.html) && (n.html = await L(n.html)), N && (c.trackIdSessionFloor = Math.max(ne, $(n.html)));
122
+ const re = {
123
+ preselectedDynamicContentList: P,
119
124
  onReady: () => {
120
125
  console.debug("guido:ready"), r("ready");
121
126
  }
122
127
  };
123
- g = F(), await D(n, y(), oe), f.selectedDynamicContentList = U;
128
+ g = F(), await k(n, y(), re), f.selectedDynamicContentList = P;
124
129
  } catch (e) {
125
130
  console.error("Failed to initialize Stripo editor:", e);
126
131
  }
127
132
  };
128
- return re(async () => {
133
+ return se(async () => {
129
134
  var e;
130
- console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), G().$reset(), H().$reset(), ke().$reset(), S();
135
+ console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), h().$reset(), V().$reset(), Ie().$reset(), Me().$reset(), S();
131
136
  const t = (e = p.value) == null ? void 0 : e.parentElement;
132
- if (t && (i = new ResizeObserver(S), i.observe(t)), k(), a.ready)
137
+ if (t && (i = new ResizeObserver(S), i.observe(t)), R(), s.ready)
133
138
  await b();
134
139
  else {
135
- const s = P(() => a.ready, (d) => {
136
- d && (s(), b());
140
+ const a = x(() => s.ready, (d) => {
141
+ d && (a(), b());
137
142
  });
138
143
  }
139
144
  document.addEventListener("dynamic-content:open", v);
140
- }), se(() => {
141
- i == null || i.disconnect(), document.removeEventListener("dynamic-content:open", v), T(async () => {
142
- if (I(g))
145
+ }), ie(() => {
146
+ i == null || i.disconnect(), document.removeEventListener("dynamic-content:open", v), h().disposeStrategyPageReturn(), T(async () => {
147
+ if (M(g))
143
148
  try {
144
149
  window.UIEditor.removeEditor();
145
150
  } catch {
146
151
  console.debug("Failed to remove Stripo editor: No editor found");
147
152
  }
148
153
  }), o.reset();
149
- }), q({
154
+ }), z({
150
155
  dynamicContent: {
151
- insert: B,
156
+ insert: U,
152
157
  close: A
153
158
  },
154
- hasChanges: m,
155
- saveSilent: w,
156
- setLoading: C
157
- }), { __sfc: !0, PreviewContainer: K, OnboardingWrapper: V, AssignStrategyDrawer: j, RemoveStrategyModal: J, headerWrapperRef: h, wrapperRef: p, dynamicContentStore: f, unsubscribeStore: E, props: a, configStore: o, editorStore: c, previewStore: Q, hasChanges: m, isTestPartner: X, saveSilent: w, setLoading: C, emit: r, buildMetadata: y, initPlugin: D, preloadRuntime: k, runExclusive: T, beginMount: F, isCurrentMount: I, mountGeneration: g, getDefaultTemplate: M, cloneTimersOnSave: R, hasTimerBlocks: L, noHeader: Y, isRrsEnabled: Z, hasAssignedStrategy: ee, insertDynamicContent: B, closeDynamicContent: A, handleDynamicContentOpen: v, ribbonObserver: i, updateRibbonOffset: S, startEditor: b, AutoSaveController: fe, Toaster: ye, FilterSelectionDrawer: ge, HeaderWrapper: ve, LoadingWrapper: Se, SaveAsTemplateDrawer: be, UnsubscribeWrapper: he };
159
+ hasChanges: l,
160
+ saveSilent: C,
161
+ setLoading: D
162
+ }), { __sfc: !0, PreviewContainer: q, OnboardingWrapper: K, AssignStrategyDrawer: j, RemoveStrategyModal: J, LegacyStrategyUpdatedModal: Q, headerWrapperRef: E, wrapperRef: p, dynamicContentStore: f, unsubscribeStore: w, props: s, configStore: o, editorStore: c, previewStore: X, hasChanges: l, isTestPartner: Y, isSaveValidationEnabled: Z, saveSilent: C, setLoading: D, emit: r, buildMetadata: y, initPlugin: k, preloadRuntime: R, runExclusive: T, beginMount: F, isCurrentMount: M, mountGeneration: g, getDefaultTemplate: I, cloneTimersOnSave: L, hasTimerBlocks: B, noHeader: ee, isRrsEnabled: te, hasAssignedStrategy: oe, insertDynamicContent: U, closeDynamicContent: A, handleDynamicContentOpen: v, ribbonObserver: i, updateRibbonOffset: S, startEditor: b, AutoSaveController: ve, Toaster: Se, FilterSelectionDrawer: be, HeaderWrapper: he, LoadingWrapper: Ee, SaveAsTemplateDrawer: we, UnsubscribeWrapper: Ce, ValidationErrorDrawer: De };
158
163
  }
159
164
  });
160
165
  export {
161
- et as default
166
+ ct as default
162
167
  };
@@ -1,13 +1,14 @@
1
- import { defineComponent as t } from "vue";
2
- import { useAutoSave as r } from "../../composables/useAutoSave.js";
3
- import { useSave as s } from "../../composables/useSave.js";
4
- const f = /* @__PURE__ */ t({
1
+ import { defineComponent as r } from "vue";
2
+ import { useAutoSave as s } from "../../composables/useAutoSave.js";
3
+ import { useSave as n } from "../../composables/useSave.js";
4
+ import { useSaveValidationRollout as u } from "../../composables/useSaveValidationRollout.js";
5
+ const v = /* @__PURE__ */ r({
5
6
  __name: "AutoSaveController",
6
- setup(a) {
7
- const { save: e } = s(), o = () => e(!1, !0);
8
- return r(o), { __sfc: !0, save: e, backgroundSave: o };
7
+ setup(m) {
8
+ const { save: e, saveRawOnly: o } = n(), { isEnabled: t } = u(), a = () => t.value ? o() : e(!1, !0);
9
+ return s(a), { __sfc: !0, save: e, saveRawOnly: o, isEnabled: t, backgroundSave: a };
9
10
  }
10
11
  });
11
12
  export {
12
- f as default
13
+ v as default
13
14
  };
@@ -1,18 +1,19 @@
1
- import { defineComponent as a, ref as c, computed as i, onBeforeUnmount as u } from "vue";
2
- import { useToasterStore as f } from "../../../stores/toaster.js";
3
- import { InToasts as m } from "@useinsider/design-system-vue";
4
- const d = /* @__PURE__ */ a({
1
+ import { defineComponent as c, ref as i, computed as u, onBeforeUnmount as m } from "vue";
2
+ import { useToaster as f } from "../../../composables/useToaster.js";
3
+ import { useToasterStore as p } from "../../../stores/toaster.js";
4
+ import { InToasts as l } from "@useinsider/design-system-vue";
5
+ const x = /* @__PURE__ */ c({
5
6
  __name: "Toaster",
6
- setup(p) {
7
- const t = f(), o = c(null), r = i(() => t.actionButton ? [{ text: t.actionButton.text }] : []), s = () => {
8
- t.actionButton && t.actionButton.onClick(), t.hideToaster();
7
+ setup(_) {
8
+ const t = p(), { hideToaster: o } = f(), e = i(null), s = u(() => t.actionButton ? [{ text: t.actionButton.text }] : []), a = () => {
9
+ t.actionButton && t.actionButton.onClick(), o();
9
10
  };
10
- return u(() => {
11
- var e, n;
12
- t.$reset(), (n = (e = o.value) == null ? void 0 : e.$el) == null || n.remove();
13
- }), { __sfc: !0, store: t, toastRef: o, actionButtonsConfig: r, handleActionClick: s, InToasts: m };
11
+ return m(() => {
12
+ var n, r;
13
+ o(), t.$reset(), (r = (n = e.value) == null ? void 0 : n.$el) == null || r.remove();
14
+ }), { __sfc: !0, store: t, hideToaster: o, toastRef: e, actionButtonsConfig: s, handleActionClick: a, InToasts: l };
14
15
  }
15
16
  });
16
17
  export {
17
- d as default
18
+ x as default
18
19
  };
@@ -1,19 +1,21 @@
1
- import r from "./AssignStrategyDrawer.vue2.js";
1
+ import s from "./AssignStrategyDrawer.vue2.js";
2
2
  /* empty css */
3
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,
4
+ import o from "../../../../_virtual/_plugin-vue2_normalizer.js";
5
+ var a = function() {
6
+ var e = this, r = e._self._c, t = e._self._setupProxy;
7
+ return t.store.assignStrategyDrawerStatus ? r(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 [r("div", { staticClass: "assign-strategy-drawer-content px-5 py-5" }, [r(t.OrgStrategyDropdown, { staticClass: "assign-strategy-select", attrs: { id: "assign-strategy-select", "create-button-visible": "", "info-box-position": "bottom right", loading: t.store.strategiesLoading || t.store.legacyConversionLoading, "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: { create: function(l) {
9
+ return t.store.openStrategyCreation();
10
+ }, infoBoxButtonClick: t.onInfoBoxButtonClick, select: t.onSelect } })], 1)];
11
+ }, proxy: !0 }], null, !1, 659108535) }) : e._e();
12
+ }, n = [], i = /* @__PURE__ */ o(
13
+ s,
14
+ a,
13
15
  n,
14
16
  !1,
15
17
  null,
16
- "2580a7d9"
18
+ "6ce48dfd"
17
19
  );
18
20
  const y = i.exports;
19
21
  export {
@@ -1,48 +1,51 @@
1
- import { defineComponent as v, defineAsyncComponent as y, ref as u, computed as l, watch as O } from "vue";
1
+ import { defineComponent as B, defineAsyncComponent as T, ref as w, computed as n, watch as k } from "vue";
2
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({
3
+ import { useToaster as b } from "../../../../composables/useToaster.js";
4
+ import { useTranslations as L } from "../../../../composables/useTranslations.js";
5
+ import { DOTTED_DATE_LOCALE as N } from "../../../../enums/date.js";
6
+ import { URLS as R } from "../../../../enums/extensions/recommendationBlock.js";
7
+ import { ToasterTypeOptions as u } from "../../../../enums/toaster.js";
8
+ import { useRecommendationExtensionStore as P } from "../../../../extensions/Blocks/Recommendation/store/recommendation.js";
9
+ import { commitStrategyChange as D } from "../../../../extensions/Blocks/Recommendation/utils/strategyCommit.js";
10
+ import U from "./StrategyInfoBoxContent.vue.js";
11
+ import { formatShortDate as M } from "../../../../utils/dateUtil.js";
12
+ import { asText as O } from "../../../../utils/genericUtil.js";
13
+ import { escapeHtml as G } from "../../../../utils/htmlEscape.js";
14
+ import { InSkeleton as $ } from "@useinsider/design-system-vue";
15
+ const st = /* @__PURE__ */ B({
15
16
  __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),
17
+ setup(H) {
18
+ const g = () => import("@useinsider/design-system-organisms"), p = (t, r) => ({
19
+ render: (o) => o($, { props: { sizing: { width: t, height: r } } })
20
+ }), E = T({
21
+ loader: async () => (await g()).OrgStrategyDetailModal,
22
+ loadingComponent: p(480, 240),
22
23
  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) => {
24
+ }), I = T({
25
+ loader: async () => (await g()).OrgStrategyDropdown
26
+ }), i = "guido-edit-strategy-", a = L(), e = P(), { showToaster: c } = b(), s = w(null), m = "legacy", l = w(!1), x = n(() => e.assignStrategyDrawerStatus ? a("email-editor.assign-strategy-description", { url: R.RECOMMENDATION_STRATEGIES_PANEL_PATH }) : "");
27
+ k(() => e.assignStrategyDrawerStatus, (t) => {
29
28
  if (!t)
30
29
  return;
31
30
  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")
31
+ s.value = r || (e.isLegacyStrategyBlock ? m : null), l.value = !1, e.invalidateStrategies(), e.fetchStrategies().catch(() => {
32
+ c({
33
+ type: u.Error,
34
+ message: a("discovery-strategy.error-description")
36
35
  });
37
36
  });
38
37
  });
39
- const p = (t) => {
40
- const r = f(t.updated_at || t.created_at);
38
+ const f = (t) => {
39
+ const r = O(t.updated_at || t.created_at);
41
40
  if (!r)
42
41
  return "";
43
- const a = I(r, E);
44
- return o("recommendation-strategy.last-updated-on", { value: a });
45
- }, D = l(() => e.strategies.map((t) => ({
42
+ const o = M(r, N);
43
+ return a("recommendation-strategy.last-updated-on", { value: o });
44
+ }, S = n(() => ({
45
+ text: a("ds-steps.legacy-strategy"),
46
+ value: m,
47
+ hidden: !0
48
+ })), d = n(() => e.strategies.map((t) => ({
46
49
  text: t.name,
47
50
  value: t.strategy_id,
48
51
  infoBoxProps: {
@@ -50,57 +53,75 @@ const W = /* @__PURE__ */ v({
50
53
  theme: "light",
51
54
  variant: "information",
52
55
  className: "assign-strategy-info-box",
53
- titleText: N(f(t.name)),
56
+ titleText: G(O(t.name)),
54
57
  descriptionStatus: !0,
55
- descriptionText: p(t),
56
- slot: B,
57
- slotProps: { strategy: t }
58
+ descriptionText: f(t),
59
+ slot: U,
60
+ slotProps: { strategy: t },
61
+ // The info box drops the option's value/text, so the id is the only channel
62
+ // that can carry the strategy back to the click handler.
63
+ buttonOptions: [{
64
+ id: `${i}${t.strategy_id}`,
65
+ text: a("eureka.edit-strategy"),
66
+ type: "text",
67
+ // Resolved from Guido's own public/sprite.svg by InIcons; an unknown name would
68
+ // silently render blank space instead of failing.
69
+ icon: "line-open-website"
70
+ }]
58
71
  }
59
- }))), d = l(() => {
60
- const t = e.strategies.find((r) => String(r.strategy_id) === String(n.value ?? ""));
72
+ }))), A = n(() => e.isLegacyStrategyBlock ? [S.value, ...d.value] : d.value), h = (t) => {
73
+ var _;
74
+ const r = (_ = t == null ? void 0 : t.id) != null && _.startsWith(i) ? t.id.slice(i.length) : "";
75
+ if (!r)
76
+ return;
77
+ const o = e.currentRecommendationId, y = e.recommendationConfigs.strategyId === r;
78
+ e.openStrategyEdit(r) && (String(s.value ?? "") === r && (s.value = null), y && (e.removeStrategy(), o !== null && D(o, "Removed recommendation strategy")));
79
+ }, v = n(() => {
80
+ const t = e.strategies.find((r) => String(r.strategy_id) === String(s.value ?? ""));
61
81
  return t ? { ...t, fallback_config: null } : null;
62
- }), w = l(() => ({
82
+ }), C = n(() => ({
63
83
  primaryButton: {
64
84
  styling: "solid",
65
85
  type: "primary",
66
- labelText: o("products.assign-btn")
86
+ labelText: a("products.assign-btn")
67
87
  },
68
88
  cancelOrBackButton: {
69
89
  styling: "ghost",
70
90
  type: "secondary",
71
- labelText: o("products.cancel")
91
+ labelText: a("products.cancel")
72
92
  }
73
93
  }));
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: () => {
94
+ return { __sfc: !0, loadOrganisms: g, skeleton: p, OrgStrategyDetailModal: E, OrgStrategyDropdown: I, EDIT_BUTTON_ID_PREFIX: i, trans: a, store: e, showToaster: c, selectedStrategyId: s, LEGACY_OPTION_VALUE: m, showSelectionError: l, drawerDescription: x, lastUpdatedText: f, legacyStrategyOption: S, remoteStrategyOptions: d, strategyOptions: A, onInfoBoxButtonClick: h, selectedStrategy: v, footerButtonGroupOptions: C, closeDrawer: () => {
75
95
  e.closeAssignStrategyDrawer();
76
96
  }, assignStrategy: async () => {
77
- const t = d.value;
97
+ const t = v.value;
78
98
  if (!t) {
79
- i.value = !0;
99
+ l.value = !0;
80
100
  return;
81
101
  }
82
102
  let r = "";
83
103
  try {
84
104
  r = await e.resolveStrategyUrlTemplate(t, e.recommendationConfigs.currencySettings.value);
85
- } catch (a) {
86
- console.error("[AssignStrategyDrawer] resolveStrategyUrlTemplate failed", a);
105
+ } catch (y) {
106
+ console.error("[AssignStrategyDrawer] resolveStrategyUrlTemplate failed", y);
87
107
  }
88
108
  if (!r) {
89
- s({
90
- type: m.Error,
91
- message: o("email-editor.strategy-assign-failed", { strategyName: t.name })
109
+ c({
110
+ type: u.Error,
111
+ message: a("email-editor.strategy-assign-failed", { strategyName: t.name })
92
112
  });
93
113
  return;
94
114
  }
95
- e.assignStrategy(t), s({
96
- type: m.Success,
97
- message: o("email-editor.strategy-assigned-success", { strategyName: t.name })
98
- }), e.closeAssignStrategyDrawer();
115
+ const o = e.currentRecommendationId;
116
+ e.assignStrategy(t), c({
117
+ type: u.Success,
118
+ message: a("email-editor.strategy-assigned-success", { strategyName: t.name })
119
+ }), e.closeAssignStrategyDrawer(), o !== null && await D(o, "Assigned recommendation strategy");
99
120
  }, onSelect: (t) => {
100
- n.value = t.value, i.value = !1;
121
+ s.value = t.value, l.value = !1;
101
122
  } };
102
123
  }
103
124
  });
104
125
  export {
105
- W as default
126
+ st as default
106
127
  };
@@ -0,0 +1,18 @@
1
+ import s from "./LegacyStrategyUpdatedModal.vue2.js";
2
+ /* empty css */
3
+ import o from "../../../../_virtual/_plugin-vue2_normalizer.js";
4
+ var r = function() {
5
+ var t = this, a = t._self._c, e = t._self._setupProxy;
6
+ return e.store.legacyStrategyUpdatedModalStatus ? a("div", { staticClass: "legacy-strategy-updated-modal" }, [a(e.WpModal, { attrs: { id: "guido__legacy-strategy-updated-modal", size: "small", "close-on-outside-click": !1, "footer-button-options": e.footerButtonOptions, title: e.trans("ds-steps.recommendation-strategy-migration-modal-title") }, on: { close: e.close, "primary-action": e.close } }, [a("p", [t._v(t._s(e.messageParts[0])), a("b", [t._v(t._s(e.strategyName))]), t._v(t._s(e.messageParts[1]))])])], 1) : t._e();
7
+ }, l = [], n = /* @__PURE__ */ o(
8
+ s,
9
+ r,
10
+ l,
11
+ !1,
12
+ null,
13
+ "da2225a1"
14
+ );
15
+ const m = n.exports;
16
+ export {
17
+ m as default
18
+ };
@@ -0,0 +1,25 @@
1
+ import { defineComponent as i, computed as s } from "vue";
2
+ import p from "../../../wrappers/WpModal.vue.js";
3
+ import { useTranslations as d } from "../../../../composables/useTranslations.js";
4
+ import { useRecommendationExtensionStore as g } from "../../../../extensions/Blocks/Recommendation/store/recommendation.js";
5
+ const M = /* @__PURE__ */ i({
6
+ __name: "LegacyStrategyUpdatedModal",
7
+ setup(l) {
8
+ const e = d(), t = g(), n = s(() => ({
9
+ primaryButton: {
10
+ type: "primary",
11
+ labelText: e("action-builder.ok")
12
+ }
13
+ })), m = s(() => {
14
+ var r;
15
+ const { strategyId: a } = t.recommendationConfigs;
16
+ return ((r = t.assignedStrategy) == null ? void 0 : r.name) || `#${a}`;
17
+ }), o = "__STRATEGY_NAME__", c = s(() => e("email-editor.legacy-strategy-updated-message", { strategyName: o }).split(o));
18
+ return { __sfc: !0, trans: e, store: t, footerButtonOptions: n, strategyName: m, NAME_TOKEN: o, messageParts: c, close: () => {
19
+ t.closeLegacyStrategyUpdatedModal();
20
+ }, WpModal: p };
21
+ }
22
+ });
23
+ export {
24
+ M as default
25
+ };