@useinsider/guido 3.19.0 → 3.20.0-beta.7b31fec

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 (62) hide show
  1. package/README.md +21 -3
  2. package/dist/@types/config/schemas.js +59 -51
  3. package/dist/components/Guido.vue.js +4 -4
  4. package/dist/components/Guido.vue2.js +70 -68
  5. package/dist/components/organisms/base/Toaster.vue2.js +13 -12
  6. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue.js +13 -11
  7. package/dist/components/organisms/extensions/recommendation/AssignStrategyDrawer.vue2.js +78 -57
  8. package/dist/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.js +18 -0
  9. package/dist/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue2.js +25 -0
  10. package/dist/components/organisms/extensions/recommendation/RemoveStrategyModal.vue2.js +28 -42
  11. package/dist/components/organisms/onboarding/OnboardingWrapper.vue2.js +28 -24
  12. package/dist/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue.js +21 -0
  13. package/dist/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue2.js +46 -0
  14. package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.js +21 -0
  15. package/dist/components/organisms/onboarding/RecommendationStrategyOnboarding.vue2.js +47 -0
  16. package/dist/composables/useCustomInterfaceAppearance.js +65 -51
  17. package/dist/composables/useHtmlValidator.js +87 -82
  18. package/dist/composables/useLegacyStrategyConversion.js +61 -0
  19. package/dist/composables/useRecommendation.js +40 -35
  20. package/dist/composables/useStripo.js +30 -30
  21. package/dist/composables/useToaster.js +14 -20
  22. package/dist/enums/extensions/recommendationBlock.js +49 -33
  23. package/dist/extensions/Blocks/Recommendation/block.js +61 -42
  24. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +21 -20
  25. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +100 -94
  26. package/dist/extensions/Blocks/Recommendation/controls/main/strategy.js +130 -55
  27. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +74 -74
  28. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +273 -92
  29. package/dist/extensions/Blocks/Recommendation/utils/legacyStrategyMigration.js +42 -0
  30. package/dist/extensions/Blocks/Recommendation/utils/nodeConfigWriter.js +26 -16
  31. package/dist/extensions/Blocks/Recommendation/utils/strategyCommit.js +24 -0
  32. package/dist/extensions/Blocks/Recommendation/validation/requiredFields.js +21 -12
  33. package/dist/guido.css +1 -1
  34. package/dist/services/recommendationApi.js +46 -37
  35. package/dist/src/@types/config/schemas.d.ts +16 -0
  36. package/dist/src/components/organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.d.ts +2 -0
  37. package/dist/src/components/organisms/onboarding/RecommendationLegacyStrategyOnboarding.vue.d.ts +2 -0
  38. package/dist/src/components/organisms/onboarding/RecommendationStrategyOnboarding.vue.d.ts +2 -0
  39. package/dist/src/composables/useConfig.d.ts +4 -0
  40. package/dist/src/composables/useLegacyStrategyConversion.d.ts +3 -0
  41. package/dist/src/enums/extensions/recommendationBlock.d.ts +7 -1
  42. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +10 -0
  43. package/dist/src/extensions/Blocks/Recommendation/constants/defaultConfig.d.ts +1 -0
  44. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +1 -1
  45. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +2 -0
  46. package/dist/src/extensions/Blocks/Recommendation/controls/main/strategy.d.ts +10 -0
  47. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +7 -2
  48. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +162 -1
  49. package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMigration.d.ts +32 -0
  50. package/dist/src/extensions/Blocks/Recommendation/utils/strategyCommit.d.ts +14 -0
  51. package/dist/src/extensions/Blocks/Recommendation/validation/requiredFields.d.ts +4 -0
  52. package/dist/src/services/recommendationApi.d.ts +2 -1
  53. package/dist/src/stores/config.d.ts +322 -0
  54. package/dist/src/stores/onboarding.d.ts +808 -10
  55. package/dist/static/assets/icons/filled-arrow-rising.svg.js +5 -0
  56. package/dist/static/assets/icons/line-info.svg.js +5 -0
  57. package/dist/static/styles/components/recommendation-strategy.css.js +104 -9
  58. package/dist/static/styles/components/skeleton.css.js +23 -0
  59. package/dist/stores/config.js +74 -60
  60. package/dist/stores/onboarding.js +46 -36
  61. package/dist/utils/templatePreparation.js +55 -55
  62. package/package.json +1 -1
package/README.md CHANGED
@@ -95,9 +95,11 @@ import type { GuidoConfigInput } from '@useinsider/guido';
95
95
  const config: GuidoConfigInput = {
96
96
  // Required: Identity
97
97
  identity: {
98
- templateId: string, // Required - Template identifier
99
- userId: string, // Required - User identifier
100
- variationId?: string, // Optional - A/B test variation
98
+ templateId: string, // Required - Template identifier
99
+ userId: string, // Required - User identifier
100
+ variationId?: string, // Optional - A/B test variation
101
+ campaignId?: string, // Optional - Numeric campaign id; absent for templates/modules
102
+ templateLibraryId?: string, // Optional - Numeric template-library id; absent for campaigns/modules
101
103
  },
102
104
 
103
105
  // Required: Partner
@@ -184,6 +186,22 @@ const config: GuidoConfigInput = {
184
186
  };
185
187
  ```
186
188
 
189
+ ### `identity` ids
190
+
191
+ `templateId` is the editor's **document** identity (a uuid / Stripo doc id) and never addresses a
192
+ backend resource. `campaignId` and `templateLibraryId` are the **numeric** ids of the surface the
193
+ editor was opened on, and they are what Guido uses to resolve host-scoped endpoints — most visibly
194
+ when converting a legacy recommendation block into a reusable strategy.
195
+
196
+ | Surface | `campaignId` | `templateLibraryId` |
197
+ |---------|--------------|---------------------|
198
+ | Campaign editor | the campaign id | absent |
199
+ | Saved template editor | absent | the template-library id |
200
+ | Module editor / unsaved template | absent | absent |
201
+
202
+ Pass only the one that applies. A campaign id takes precedence when both are present, and when
203
+ neither is supplied Guido falls back to campaign scope — so a module keeps working unchanged.
204
+
187
205
  ### `ready` prop
188
206
 
189
207
  ```vue
@@ -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 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";
2
+ import { object as o, number as n, optional as e, string as t, picklist as i, pipe as m, minLength as b, custom as h, boolean as a, array as c, transform as C, record as k, fallback as R, literal as u, looseObject as g, variant as I, union as y, unknown as r, lazy as T } from "../../node_modules/valibot/dist/index.js";
3
3
  const p = {
4
4
  /** Promotional/marketing emails */
5
5
  PROMOTIONAL: 1,
@@ -12,7 +12,7 @@ const p = {
12
12
  ARCHITECT: 49,
13
13
  /** Unsubscribe page builder */
14
14
  UNSUBSCRIBE_PAGES: 97
15
- }, A = a({
15
+ }, A = o({
16
16
  /** Unique identifier for the template being edited */
17
17
  templateId: m(
18
18
  t(),
@@ -24,13 +24,21 @@ const p = {
24
24
  b(1, "userId is required")
25
25
  ),
26
26
  /** Optional variation ID for A/B testing */
27
- variationId: e(t())
28
- }), L = a({
27
+ variationId: e(t()),
28
+ /** Optional numeric campaign ID of the host campaign; absent for templates and modules */
29
+ campaignId: e(t()),
30
+ /**
31
+ * Optional numeric template-library id of the host template; absent for campaigns and
32
+ * modules. Distinct from `templateId`, which is the editor's document identity (a uuid /
33
+ * Stripo doc id) and is never an endpoint id.
34
+ */
35
+ templateLibraryId: e(t())
36
+ }), L = o({
29
37
  /** Fallback font name (e.g., "Georgia") */
30
38
  name: t(),
31
39
  /** Fallback font family (e.g., "serif" or "sans-serif") */
32
40
  family: t()
33
- }), M = a({
41
+ }), M = o({
34
42
  /** Partner/organization name (required) */
35
43
  name: m(
36
44
  t(),
@@ -54,7 +62,7 @@ const p = {
54
62
  username: e(t(), "Guido User"),
55
63
  /** Fallback font settings from partner settings — used to match backend size calculation */
56
64
  fallbackFont: e(L)
57
- }), E = a({
65
+ }), E = o({
58
66
  /** Display text for the dynamic content */
59
67
  text: t(),
60
68
  /** Template variable value (e.g., {{username}}) */
@@ -63,12 +71,12 @@ const p = {
63
71
  fallback: e(t()),
64
72
  /** Optional formatting options */
65
73
  format: e(
66
- a({
74
+ o({
67
75
  key: t(),
68
76
  value: t()
69
77
  })
70
78
  )
71
- }), S = I(() => g({
79
+ }), S = T(() => g({
72
80
  text: e(t()),
73
81
  // eslint-disable-next-line camelcase -- backend field name
74
82
  tag_text: e(t()),
@@ -83,13 +91,13 @@ const p = {
83
91
  /** Block ID (matches the dictionary key and the legacy HTML element id) */
84
92
  id: e(n()),
85
93
  /** Decimal places for price display (legacy data may use string or number) */
86
- decimalCount: e(h([t(), n()])),
94
+ decimalCount: e(y([t(), n()])),
87
95
  /** Pinned product IDs (empty array when filter-driven) */
88
96
  productIds: e(c(r())),
89
97
  /** Whether the block requested live products at send time */
90
- sendProductRequestFlag: e(o()),
98
+ sendProductRequestFlag: e(a()),
91
99
  /** Whether to randomize product order */
92
- shuffleProducts: e(o()),
100
+ shuffleProducts: e(a()),
93
101
  /** Filter rules driving product selection */
94
102
  filters: e(c(r())),
95
103
  /** Currency code (e.g. 'EUR') — sometimes absent in legacy data */
@@ -109,22 +117,22 @@ const p = {
109
117
  /** Mobile-only padding (left) */
110
118
  mobileLeftPadding: e(n()),
111
119
  /** Disable responsive scaling */
112
- unresponsive: e(o()),
120
+ unresponsive: e(a()),
113
121
  /** Layout orientation ('vertical' | 'horizontal') */
114
122
  orientation: e(t()),
115
123
  /** Whether long text is trimmed */
116
- textTrimming: e(o()),
124
+ textTrimming: e(a()),
117
125
  /** Block type marker used by some legacy variants */
118
126
  blockType: e(t()),
119
127
  /** Size variant marker (legacy data may use string or number) */
120
- size: e(h([t(), n()])),
128
+ size: e(y([t(), n()])),
121
129
  /** Vertical responsiveness flag (legacy size=1 variants) */
122
- verticalResponsiveness: e(o()),
130
+ verticalResponsiveness: e(a()),
123
131
  /** Legacy "Move to next line" price placement toggle (cardPricePlacement.js) */
124
- isPriceMovedToNextLine: e(o()),
132
+ isPriceMovedToNextLine: e(a()),
125
133
  /** Legacy "Hide if same as discounted" / delete-price-for-zero-sale toggle */
126
- isPriceDeletedForZeroSale: e(o())
127
- }), v = a({
134
+ isPriceDeletedForZeroSale: e(a())
135
+ }), v = o({
128
136
  /**
129
137
  * Legacy recommendation block configs keyed by block ID.
130
138
  * Pass this when loading a template authored with the v1
@@ -135,7 +143,7 @@ const p = {
135
143
  k(t(), P),
136
144
  {}
137
145
  )
138
- }), x = a({
146
+ }), x = o({
139
147
  /** Initial HTML content */
140
148
  html: e(t(), ""),
141
149
  /** Initial CSS content */
@@ -157,7 +165,7 @@ const p = {
157
165
  /** Selected unsubscribe page IDs */
158
166
  selectedUnsubscribePages: e(c(n()), []),
159
167
  /** Force recreate template in Stripo storage (use true when updating externally modified templates) */
160
- forceRecreate: e(o(), !1),
168
+ forceRecreate: e(a(), !1),
161
169
  /**
162
170
  * Consumer-persisted tracking-id high-water mark (SD-141414). Used as the id floor
163
171
  * during migration so a rolled-back document never re-mints retired tracking ids.
@@ -174,12 +182,12 @@ const p = {
174
182
  ),
175
183
  /** Migration-only inputs (legacy block configs) */
176
184
  migration: e(v, {})
177
- }), D = a({
185
+ }), D = o({
178
186
  /** Sender display name */
179
187
  senderName: e(t(), ""),
180
188
  /** Email subject line */
181
189
  subject: e(t(), "")
182
- }), O = a({
190
+ }), O = o({
183
191
  /** Locale for the editor UI */
184
192
  locale: e(t(), "en"),
185
193
  /** Path to translations object */
@@ -192,35 +200,35 @@ const p = {
192
200
  savedModulesFolderName: e(t(), f.SAVED_MODULES),
193
201
  /** Folder name for default/prebuilt modules (used by Stripo plugin panel for path construction) */
194
202
  defaultModulesFolderName: e(t(), f.DEFAULT_MODULES)
195
- }), F = a({
203
+ }), F = o({
196
204
  /** Whether to show the header bar */
197
- showHeader: e(o(), !0),
205
+ showHeader: e(a(), !0),
198
206
  /** Custom label for back button (if shown) */
199
207
  backButtonLabel: e(t())
200
- }), U = a({
208
+ }), U = o({
201
209
  /** Enable dynamic content insertion */
202
- dynamicContent: e(o(), !0),
210
+ dynamicContent: e(a(), !0),
203
211
  /** Enable save as template functionality */
204
- saveAsTemplate: e(o(), !0),
212
+ saveAsTemplate: e(a(), !0),
205
213
  /** Enable version history */
206
- versionHistory: e(o(), !0),
214
+ versionHistory: e(a(), !0),
207
215
  /** Enable test message sending */
208
- testMessage: e(o(), !0),
216
+ testMessage: e(a(), !0),
209
217
  /** Enable display conditions */
210
- displayConditions: e(o(), !0),
218
+ displayConditions: e(a(), !0),
211
219
  /** Enable unsubscribe block */
212
- unsubscribe: e(o(), !0),
220
+ unsubscribe: e(a(), !0),
213
221
  /** Disable modules panel in the editor */
214
- modulesDisabled: e(o(), !1),
222
+ modulesDisabled: e(a(), !1),
215
223
  /** Enable Liquid template syntax */
216
- liquidSyntax: e(o(), !1),
224
+ liquidSyntax: e(a(), !1),
217
225
  /** Enable autosave (3-min interval + tab-hide). User toggles on/off from the header. */
218
- autosave: e(o(), !1),
226
+ autosave: e(a(), !1),
219
227
  /** Enable pre-save domain-allowlist validation (opt-in; Guido self-serves the block toaster) */
220
- allowlistEnabled: e(o(), !1),
228
+ allowlistEnabled: e(a(), !1),
221
229
  /** Enable persistent link tracking-id assignment for the click heatmap (opt-in) */
222
- linkTrackingIds: e(o(), !1),
223
- reusableRecommendationStrategy: e(o(), !1)
230
+ linkTrackingIds: e(a(), !1),
231
+ reusableRecommendationStrategy: e(a(), !1)
224
232
  }), B = i([
225
233
  "amp-accordion",
226
234
  "amp-carousel",
@@ -243,7 +251,7 @@ const p = {
243
251
  "unsubscribe-block",
244
252
  "coupon-block",
245
253
  "items-block"
246
- ]), H = a({
254
+ ]), H = o({
247
255
  /** Default blocks to exclude from the editor */
248
256
  excludeDefaults: e(
249
257
  c(B),
@@ -254,14 +262,14 @@ const p = {
254
262
  c(w),
255
263
  []
256
264
  )
257
- }), d = a({
265
+ }), d = o({
258
266
  /** Unique identifier for the rule */
259
267
  id: t(),
260
268
  /** Human-readable description */
261
269
  description: e(t()),
262
270
  /** Priority for rule ordering (lower = earlier) */
263
271
  priority: n()
264
- }), _ = a({
272
+ }), _ = o({
265
273
  ...d.entries,
266
274
  type: u("replace"),
267
275
  /** String to search for */
@@ -269,8 +277,8 @@ const p = {
269
277
  /** Replacement string */
270
278
  replacement: t(),
271
279
  /** Replace all occurrences (default: false) */
272
- replaceAll: e(o())
273
- }), j = a({
280
+ replaceAll: e(a())
281
+ }), j = o({
274
282
  ...d.entries,
275
283
  type: u("regex"),
276
284
  /** Regex pattern string */
@@ -279,41 +287,41 @@ const p = {
279
287
  replacement: t(),
280
288
  /** Regex flags (e.g., 'gi') */
281
289
  flags: e(t())
282
- }), q = a({
290
+ }), q = o({
283
291
  ...d.entries,
284
292
  type: u("remove"),
285
293
  /** Strings or patterns to remove */
286
294
  targets: c(t())
287
- }), G = a({
295
+ }), G = o({
288
296
  ...d.entries,
289
297
  type: u("custom"),
290
298
  /** Custom processor function */
291
- processor: y(
299
+ processor: h(
292
300
  (s) => typeof s == "function",
293
301
  "processor must be a function"
294
302
  )
295
- }), V = T("type", [
303
+ }), V = I("type", [
296
304
  _,
297
305
  j,
298
306
  q,
299
307
  G
300
- ]), z = a({
308
+ ]), z = o({
301
309
  /** Custom compiler rules to apply */
302
310
  customRules: e(c(V), []),
303
311
  /** Skip default compiler rules */
304
- ignoreDefaultRules: e(o(), !1)
305
- }), Z = a({
312
+ ignoreDefaultRules: e(a(), !1)
313
+ }), Z = o({
306
314
  /**
307
315
  * External validation handler called before save completes.
308
316
  * Return false to cancel the save operation.
309
317
  */
310
318
  externalValidation: e(
311
- y(
319
+ h(
312
320
  (s) => typeof s == "function",
313
321
  "externalValidation must be a function"
314
322
  )
315
323
  )
316
- }), Q = a({
324
+ }), Q = o({
317
325
  // Required sections
318
326
  /** Identity configuration (required) */
319
327
  identity: A,
@@ -3,7 +3,7 @@ import o from "./Guido.vue2.js";
3
3
  import i from "../_virtual/_plugin-vue2_normalizer.js";
4
4
  var t = function() {
5
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(_) {
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(), e.isRrsEnabled ? r(e.LegacyStrategyUpdatedModal) : 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
9
  }, s = [], n = /* @__PURE__ */ i(
@@ -12,9 +12,9 @@ var t = function() {
12
12
  s,
13
13
  !1,
14
14
  null,
15
- "050dfa52"
15
+ "36867e2e"
16
16
  );
17
- const f = n.exports;
17
+ const g = n.exports;
18
18
  export {
19
- f as default
19
+ g as default
20
20
  };
@@ -1,31 +1,31 @@
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";
1
+ import { defineComponent as re, defineAsyncComponent as m, ref as O, computed as u, watch as x, onMounted as se, onUnmounted as ae } from "vue";
2
+ import { useCortexBlueprintBridge as ie } from "../composables/useCortexBlueprintBridge.js";
3
+ import { useEditorLock as ce } from "../composables/useEditorLock.js";
4
+ import { provideGuidoActions as de } from "../composables/useGuidoActions.js";
5
+ import { useGuidoStateBridge as me } from "../composables/useGuidoStateBridge.js";
6
+ import { usePartner as le } from "../composables/usePartner.js";
7
+ import { useStripo as ue } from "../composables/useStripo.js";
8
+ import { useTimerClone as pe } from "../composables/useTimerClone.js";
9
+ import { migrate as W } from "../config/migrator/index.js";
10
+ import { ModuleFolderDefaults as G } from "../enums/defaults.js";
11
+ import { RIBBON_SELECTOR as fe } from "../enums/onboarding.js";
12
+ import { useRecommendationExtensionStore as h } from "../extensions/Blocks/Recommendation/store/recommendation.js";
13
+ import ye from "./organisms/AutoSaveController.vue.js";
14
+ import ge from "./organisms/base/Toaster.vue.js";
15
+ import ve from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
16
+ import Se from "./organisms/header/HeaderWrapper.vue.js";
17
+ import be from "./organisms/LoadingWrapper.vue.js";
18
+ import he from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
19
+ import Ee from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
20
+ import { useStripoApi as we } from "../services/stripoApi.js";
21
+ import { useConfigStore as Ce } from "../stores/config.js";
22
+ import { useDynamicContentStore as De } from "../stores/dynamic-content.js";
23
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";
24
+ import { usePreviewStore as ke } from "../stores/preview.js";
25
+ import { useTemplateStore as Te } from "../stores/template.js";
26
+ import { useUnsubscribeStore as Fe } from "../stores/unsubscribe.js";
27
27
  import { readTrackFloor as $ } from "../utils/linkTrackingIds.js";
28
- const et = /* @__PURE__ */ ne({
28
+ const tt = /* @__PURE__ */ re({
29
29
  __name: "Guido",
30
30
  props: {
31
31
  config: null,
@@ -33,23 +33,25 @@ const et = /* @__PURE__ */ ne({
33
33
  },
34
34
  emits: ["dynamic-content:open", "back", "save:start", "save:complete", "on-change", "ready", "onboarding:finished", "test-email:click"],
35
35
  setup(z, { expose: q, emit: r }) {
36
- const a = z, K = l(
36
+ const a = z, K = m(
37
37
  () => import("./organisms/email-preview/PreviewContainer.vue.js")
38
- ), V = l(
38
+ ), V = m(
39
39
  () => import("./organisms/onboarding/OnboardingWrapper.vue.js")
40
- ), j = l(
40
+ ), j = m(
41
41
  () => import("./organisms/extensions/recommendation/AssignStrategyDrawer.vue.js")
42
- ), J = l(
42
+ ), J = m(
43
43
  () => import("./organisms/extensions/recommendation/RemoveStrategyModal.vue.js")
44
- ), h = O(), p = O(), f = Ce(), E = Te(), o = we();
44
+ ), Q = m(
45
+ () => import("./organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.js")
46
+ ), E = O(), p = O(), f = De(), w = Fe(), o = Ce();
45
47
  a.ready && o.init(a.config);
46
- const c = H(), Q = De(), m = u(() => c.hasChanges), { isTestPartner: X } = me(), w = () => {
48
+ const c = H(), X = ke(), l = u(() => c.hasChanges), { isTestPartner: Y } = le(), C = () => {
47
49
  var t;
48
- return (t = h.value) == null ? void 0 : t.handleSave(!0);
49
- }, C = (t) => {
50
+ return (t = E.value) == null ? void 0 : t.handleSave(!0);
51
+ }, D = (t) => {
50
52
  c.loadingStatus = t;
51
53
  };
52
- ae(), de();
54
+ ie(), me();
53
55
  const y = () => {
54
56
  var t, e;
55
57
  return {
@@ -57,18 +59,18 @@ const et = /* @__PURE__ */ ne({
57
59
  userId: o.userId,
58
60
  username: o.username,
59
61
  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
62
+ savedModulesFolderName: ((t = o.editor) == null ? void 0 : t.savedModulesFolderName) || G.SAVED_MODULES,
63
+ defaultModulesFolderName: ((e = o.editor) == null ? void 0 : e.defaultModulesFolderName) || G.DEFAULT_MODULES
62
64
  };
63
- }, { initPlugin: D, preloadRuntime: k } = le(), { runExclusive: T, beginMount: F, isCurrentMount: I } = ie();
65
+ }, { initPlugin: k, preloadRuntime: T } = ue(), { runExclusive: F, beginMount: M, isCurrentMount: R } = ce();
64
66
  let g = 0;
65
- const { getDefaultTemplate: M } = Ee(), { cloneTimersOnSave: R, hasTimerBlocks: L } = ue(), Y = u(() => {
67
+ const { getDefaultTemplate: I } = we(), { cloneTimersOnSave: L, hasTimerBlocks: B } = pe(), Z = u(() => {
66
68
  var t;
67
69
  return !((t = o.ui) != null && t.showHeader);
68
- }), Z = u(() => o.isFeatureEnabled("reusableRecommendationStrategy")), ee = u(
69
- () => !!G().recommendationConfigs.strategyId
70
+ }), ee = u(() => o.isFeatureEnabled("reusableRecommendationStrategy")), te = u(
71
+ () => !!h().recommendationConfigs.strategyId
70
72
  );
71
- ce({
73
+ de({
72
74
  onBack: () => {
73
75
  console.debug("guido:back"), r("back");
74
76
  },
@@ -83,13 +85,13 @@ const et = /* @__PURE__ */ ne({
83
85
  console.debug("guido:test-email:click"), r("test-email:click");
84
86
  }
85
87
  });
86
- const B = (t) => {
88
+ const U = (t) => {
87
89
  console.debug("dynamic-content:close", t), f.setSelectedDynamicContent(t), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: t }));
88
90
  }, A = () => {
89
91
  console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
90
92
  };
91
- P(() => m.value, () => {
92
- r("on-change", m.value);
93
+ x(() => l.value, () => {
94
+ r("on-change", l.value);
93
95
  });
94
96
  const v = (t) => {
95
97
  const e = t, { attribute: s, position: d } = e.detail;
@@ -98,48 +100,48 @@ const et = /* @__PURE__ */ ne({
98
100
  let i = null;
99
101
  const S = () => {
100
102
  var e;
101
- const t = document.querySelector(pe);
103
+ const t = document.querySelector(fe);
102
104
  (e = p.value) == null || e.style.setProperty("--ribbon-offset", `${(t == null ? void 0 : t.offsetHeight) ?? 0}px`);
103
105
  }, b = async () => {
104
106
  var t;
105
107
  try {
106
108
  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) || [];
109
+ const e = o.template, s = (e == null ? void 0 : e.html) || "", d = (e == null ? void 0 : e.css) || "", P = (e == null ? void 0 : e.preselectedDynamicContent) || [];
110
+ w.selectedUnsubscribePages = (e == null ? void 0 : e.selectedUnsubscribePages) || [];
109
111
  const _ = ((t = e == null ? void 0 : e.migration) == null ? void 0 : t.recommendationConfigs) ?? {}, N = o.isFeatureEnabled("linkTrackingIds");
110
112
  let n = {
111
- html: s && await x(s, _),
113
+ html: s && await W(s, _),
112
114
  css: d
113
115
  };
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,
116
+ n.html || (n = await I(), n.html = await W(n.html, _));
117
+ const oe = N ? $(n.html, (e == null ? void 0 : e.trackIdCounter) || 0) : 0;
118
+ B(n.html) && (n.html = await L(n.html)), N && (c.trackIdSessionFloor = Math.max(oe, $(n.html)));
119
+ const ne = {
120
+ preselectedDynamicContentList: P,
119
121
  onReady: () => {
120
122
  console.debug("guido:ready"), r("ready");
121
123
  }
122
124
  };
123
- g = F(), await D(n, y(), oe), f.selectedDynamicContentList = U;
125
+ g = M(), await k(n, y(), ne), f.selectedDynamicContentList = P;
124
126
  } catch (e) {
125
127
  console.error("Failed to initialize Stripo editor:", e);
126
128
  }
127
129
  };
128
- return re(async () => {
130
+ return se(async () => {
129
131
  var e;
130
- console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), G().$reset(), H().$reset(), ke().$reset(), S();
132
+ console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), h().$reset(), H().$reset(), Te().$reset(), S();
131
133
  const t = (e = p.value) == null ? void 0 : e.parentElement;
132
- if (t && (i = new ResizeObserver(S), i.observe(t)), k(), a.ready)
134
+ if (t && (i = new ResizeObserver(S), i.observe(t)), T(), a.ready)
133
135
  await b();
134
136
  else {
135
- const s = P(() => a.ready, (d) => {
137
+ const s = x(() => a.ready, (d) => {
136
138
  d && (s(), b());
137
139
  });
138
140
  }
139
141
  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))
142
+ }), ae(() => {
143
+ i == null || i.disconnect(), document.removeEventListener("dynamic-content:open", v), h().disposeStrategyPageReturn(), F(async () => {
144
+ if (R(g))
143
145
  try {
144
146
  window.UIEditor.removeEditor();
145
147
  } catch {
@@ -148,15 +150,15 @@ const et = /* @__PURE__ */ ne({
148
150
  }), o.reset();
149
151
  }), q({
150
152
  dynamicContent: {
151
- insert: B,
153
+ insert: U,
152
154
  close: A
153
155
  },
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 };
156
+ hasChanges: l,
157
+ saveSilent: C,
158
+ setLoading: D
159
+ }), { __sfc: !0, PreviewContainer: K, OnboardingWrapper: V, AssignStrategyDrawer: j, RemoveStrategyModal: J, LegacyStrategyUpdatedModal: Q, headerWrapperRef: E, wrapperRef: p, dynamicContentStore: f, unsubscribeStore: w, props: a, configStore: o, editorStore: c, previewStore: X, hasChanges: l, isTestPartner: Y, saveSilent: C, setLoading: D, emit: r, buildMetadata: y, initPlugin: k, preloadRuntime: T, runExclusive: F, beginMount: M, isCurrentMount: R, mountGeneration: g, getDefaultTemplate: I, cloneTimersOnSave: L, hasTimerBlocks: B, noHeader: Z, isRrsEnabled: ee, hasAssignedStrategy: te, insertDynamicContent: U, closeDynamicContent: A, handleDynamicContentOpen: v, ribbonObserver: i, updateRibbonOffset: S, startEditor: b, AutoSaveController: ye, Toaster: ge, FilterSelectionDrawer: ve, HeaderWrapper: Se, LoadingWrapper: be, SaveAsTemplateDrawer: he, UnsubscribeWrapper: Ee };
158
160
  }
159
161
  });
160
162
  export {
161
- et as default
163
+ tt as default
162
164
  };
@@ -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 {