@useinsider/guido 3.21.2-beta.cfc5be2 → 3.21.2-beta.d2a272e
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 +35 -5
- package/dist/@types/config/schemas.js +39 -41
- package/dist/components/Guido.vue.js +6 -6
- package/dist/components/Guido.vue2.js +107 -99
- package/dist/composables/useBlocksConfig.js +24 -32
- package/dist/composables/useEditorOpenMetrics.js +167 -0
- package/dist/composables/useSave.js +75 -68
- package/dist/composables/useStripo.js +93 -82
- package/dist/composables/validators/useHtmlDocumentCountValidator.js +22 -0
- package/dist/enums/academy.js +0 -1
- package/dist/guido.css +1 -1
- package/dist/library.js +12 -10
- package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +92 -93
- package/dist/node_modules/valibot/dist/index.js +261 -297
- package/dist/package.json.js +6 -4
- package/dist/public/prefetchRuntime.js +4 -0
- package/dist/services/templateLibraryApi.js +36 -31
- package/dist/src/@types/config/schemas.d.ts +0 -4
- package/dist/src/composables/useConfig.d.ts +0 -2
- package/dist/src/composables/useEditorOpenMetrics.d.ts +27 -0
- package/dist/src/composables/useStripo.d.ts +2 -1
- package/dist/src/composables/validators/useHtmlDocumentCountValidator.d.ts +3 -0
- package/dist/src/enums/academy.d.ts +0 -1
- package/dist/src/library.d.ts +1 -0
- package/dist/src/public/prefetchRuntime.d.ts +1 -0
- package/dist/src/stores/config.d.ts +0 -166
- package/dist/src/utils/runtimePrefetch.d.ts +4 -0
- package/dist/src/utils/stripoRuntime.d.ts +3 -0
- package/dist/src/utils/templatePreparation.d.ts +2 -1
- package/dist/static/stripo-runtime-manifest.json.js +9 -0
- package/dist/stores/config.js +6 -13
- package/dist/utils/pairProductVariables.js +98 -91
- package/dist/utils/runtimePrefetch.js +26 -0
- package/dist/utils/stripoRuntime.js +13 -0
- package/dist/utils/templatePreparation.js +30 -30
- package/package.json +6 -1
- package/dist/@types/display-condition.js +0 -25
- package/dist/components/organisms/display-conditions/CodeEditorField.vue.js +0 -20
- package/dist/components/organisms/display-conditions/CodeEditorField.vue2.js +0 -30
- package/dist/components/organisms/display-conditions/DisplayConditionCreateDrawer.vue.js +0 -30
- package/dist/components/organisms/display-conditions/DisplayConditionCreateDrawer.vue2.js +0 -71
- package/dist/components/organisms/display-conditions/DisplayConditionSelectDrawer.vue.js +0 -34
- package/dist/components/organisms/display-conditions/DisplayConditionSelectDrawer.vue2.js +0 -57
- package/dist/components/organisms/display-conditions/DisplayConditionsHost.vue.js +0 -17
- package/dist/components/organisms/display-conditions/DisplayConditionsHost.vue2.js +0 -22
- package/dist/composables/useDisplayConditions.js +0 -102
- package/dist/enums/display-condition.js +0 -12
- package/dist/extensions/DisplayConditions/bridge.js +0 -17
- package/dist/extensions/DisplayConditions/constants.js +0 -17
- package/dist/extensions/DisplayConditions/control.js +0 -178
- package/dist/extensions/DisplayConditions/display-conditions.css.js +0 -201
- package/dist/extensions/DisplayConditions/extension.js +0 -28
- package/dist/extensions/DisplayConditions/iconsRegistry.js +0 -20
- package/dist/extensions/DisplayConditions/library.js +0 -27
- package/dist/extensions/DisplayConditions/settingsPanel.js +0 -17
- package/dist/services/displayConditionApi.js +0 -39
- package/dist/src/@types/display-condition.d.ts +0 -59
- package/dist/src/components/organisms/display-conditions/CodeEditorField.vue.d.ts +0 -43
- package/dist/src/components/organisms/display-conditions/DisplayConditionCreateDrawer.vue.d.ts +0 -2
- package/dist/src/components/organisms/display-conditions/DisplayConditionSelectDrawer.vue.d.ts +0 -2
- package/dist/src/components/organisms/display-conditions/DisplayConditionsHost.vue.d.ts +0 -2
- package/dist/src/composables/useDisplayConditions.d.ts +0 -16
- package/dist/src/enums/display-condition.d.ts +0 -15
- package/dist/src/extensions/DisplayConditions/bridge.d.ts +0 -6
- package/dist/src/extensions/DisplayConditions/constants.d.ts +0 -14
- package/dist/src/extensions/DisplayConditions/control.d.ts +0 -23
- package/dist/src/extensions/DisplayConditions/extension.d.ts +0 -2
- package/dist/src/extensions/DisplayConditions/iconsRegistry.d.ts +0 -4
- package/dist/src/extensions/DisplayConditions/library.d.ts +0 -8
- package/dist/src/extensions/DisplayConditions/settingsPanel.d.ts +0 -5
- package/dist/src/mock/api/display-conditions.d.ts +0 -2
- package/dist/src/services/displayConditionApi.d.ts +0 -8
- package/dist/src/stores/display-condition.d.ts +0 -81
- package/dist/src/utils/displayCondition.d.ts +0 -10
- package/dist/src/utils/protectTableText.d.ts +0 -2
- package/dist/stores/display-condition.js +0 -28
- package/dist/utils/displayCondition.js +0 -26
- package/dist/utils/protectTableText.js +0 -22
package/README.md
CHANGED
|
@@ -150,7 +150,6 @@ const config: GuidoConfigInput = {
|
|
|
150
150
|
ui?: {
|
|
151
151
|
showHeader?: boolean, // Default: true
|
|
152
152
|
backButtonLabel?: string,
|
|
153
|
-
externalDisplayConditions?: boolean, // Default: false - Replace Stripo's display-condition UI with a Conditions tab in the settings panel and create/select drawers for reusable Liquid/Pongo display conditions.
|
|
154
153
|
},
|
|
155
154
|
|
|
156
155
|
// Optional: Feature toggles (defaults apply once initialized — see `ready` prop below)
|
|
@@ -583,9 +582,9 @@ import '@useinsider/guido/style';
|
|
|
583
582
|
|
|
584
583
|
### Subpath entries
|
|
585
584
|
|
|
586
|
-
|
|
587
|
-
own dependencies, so a consumer that needs the store
|
|
588
|
-
never loads the editor:
|
|
585
|
+
Three surfaces also ship as their own entry points. Importing one pulls in only its
|
|
586
|
+
own dependencies, so a consumer that needs the store, the tracking-id helpers or the
|
|
587
|
+
runtime prefetch never loads the editor:
|
|
589
588
|
|
|
590
589
|
```typescript
|
|
591
590
|
// Live editor state, published by the editor into the host's shared Pinia instance.
|
|
@@ -596,11 +595,42 @@ import type { GuidoEmailEditorState } from '@useinsider/guido/editor-state';
|
|
|
596
595
|
// Persistent link ids for the click heatmap.
|
|
597
596
|
import { assignTrackingIds, TRACK_ID_ATTRIBUTE } from '@useinsider/guido/tracking-ids';
|
|
598
597
|
import type { TrackingIdResult } from '@useinsider/guido/tracking-ids';
|
|
598
|
+
|
|
599
|
+
// Start downloading the Stripo editor runtime before the editor opens.
|
|
600
|
+
import { prefetchGuidoRuntime } from '@useinsider/guido/prefetch';
|
|
599
601
|
```
|
|
600
602
|
|
|
601
|
-
|
|
603
|
+
All three are re-exported from the root barrel as well; the subpath is what keeps the
|
|
602
604
|
editor out of the consumer's module graph.
|
|
603
605
|
|
|
606
|
+
### Runtime prefetch
|
|
607
|
+
|
|
608
|
+
```typescript
|
|
609
|
+
import { prefetchGuidoRuntime } from '@useinsider/guido/prefetch';
|
|
610
|
+
|
|
611
|
+
prefetchGuidoRuntime(); // e.g. when the user lands on the page that opens the editor
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
Call it as early as the host knows an editor is likely to open. It appends one
|
|
615
|
+
`<link rel="prefetch" data-guido-prefetch>` per file of the pinned Stripo runtime
|
|
616
|
+
(`src/static/stripo-runtime-manifest.json`) from
|
|
617
|
+
`https://email-static.useinsider.com/guido/<stripo version>/`, so the files are in the
|
|
618
|
+
HTTP cache when `<Guido>` mounts. It only downloads: no Stripo code runs and the
|
|
619
|
+
editor's startup order does not change.
|
|
620
|
+
|
|
621
|
+
- Returns `void` and never throws.
|
|
622
|
+
- Idempotent: later calls add nothing.
|
|
623
|
+
- Adds nothing when the runtime is already loading or loaded (`#UiEditorScript` exists
|
|
624
|
+
or `window.UIEditor` is defined), when the browser does not support `rel="prefetch"`
|
|
625
|
+
(Safari by default), when `navigator.connection.saveData` is on, or when
|
|
626
|
+
`navigator.connection.effectiveType` is `slow-2g` or `2g`.
|
|
627
|
+
- The `guido_editor_open` metric reports it as `runtime_prefetch`: `none` (not called
|
|
628
|
+
before Guido's setup), `pending` (some files still downloading) or `done`.
|
|
629
|
+
|
|
630
|
+
After bumping `guido.stripo.version`, regenerate the file list with
|
|
631
|
+
`npm run stripo:manifest`; a unit test fails while the manifest's version differs from
|
|
632
|
+
the pinned one.
|
|
633
|
+
|
|
604
634
|
---
|
|
605
635
|
|
|
606
636
|
## Constants
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ModuleFolderDefaults as
|
|
2
|
-
import { object as a, number as s, optional as e, string as t, picklist as m, pipe as i, minLength as b, custom as k, boolean as o, array as
|
|
1
|
+
import { ModuleFolderDefaults as f } from "../../enums/defaults.js";
|
|
2
|
+
import { object as a, number as s, optional as e, string as t, picklist as m, pipe as i, minLength as b, custom as k, boolean as o, array as c, transform as y, unknown as r, record as g, fallback as R, literal as u, looseObject as C, variant as I, union as h, lazy as T } from "../../node_modules/valibot/dist/index.js";
|
|
3
3
|
const p = {
|
|
4
4
|
/** Promotional/marketing emails */
|
|
5
5
|
PROMOTIONAL: 1,
|
|
@@ -76,30 +76,30 @@ const p = {
|
|
|
76
76
|
value: t()
|
|
77
77
|
})
|
|
78
78
|
)
|
|
79
|
-
}),
|
|
79
|
+
}), S = T(() => C({
|
|
80
80
|
text: e(t()),
|
|
81
81
|
// eslint-disable-next-line camelcase -- backend field name
|
|
82
82
|
tag_text: e(t()),
|
|
83
83
|
value: e(t()),
|
|
84
|
-
children: e(
|
|
84
|
+
children: e(c(S)),
|
|
85
85
|
// eslint-disable-next-line camelcase -- backend field name
|
|
86
|
-
select_items: e(
|
|
87
|
-
})),
|
|
86
|
+
select_items: e(c(S))
|
|
87
|
+
})), N = g(
|
|
88
88
|
t(),
|
|
89
|
-
R(
|
|
90
|
-
),
|
|
89
|
+
R(c(S), [])
|
|
90
|
+
), P = C({
|
|
91
91
|
/** Block ID (matches the dictionary key and the legacy HTML element id) */
|
|
92
92
|
id: e(s()),
|
|
93
93
|
/** Decimal places for price display (legacy data may use string or number) */
|
|
94
94
|
decimalCount: e(h([t(), s()])),
|
|
95
95
|
/** Pinned product IDs (empty array when filter-driven) */
|
|
96
|
-
productIds: e(
|
|
96
|
+
productIds: e(c(r())),
|
|
97
97
|
/** Whether the block requested live products at send time */
|
|
98
98
|
sendProductRequestFlag: e(o()),
|
|
99
99
|
/** Whether to randomize product order */
|
|
100
100
|
shuffleProducts: e(o()),
|
|
101
101
|
/** Filter rules driving product selection */
|
|
102
|
-
filters: e(
|
|
102
|
+
filters: e(c(r())),
|
|
103
103
|
/** Currency code (e.g. 'EUR') — sometimes absent in legacy data */
|
|
104
104
|
currency: e(t()),
|
|
105
105
|
/** Currency display settings (separators, alignment, decimals) */
|
|
@@ -109,7 +109,7 @@ const p = {
|
|
|
109
109
|
/** Recommendation strategy key (e.g. 'newArrivals') */
|
|
110
110
|
strategy: e(t()),
|
|
111
111
|
/** Snapshot of products as rendered by the legacy block */
|
|
112
|
-
recommendedProducts: e(
|
|
112
|
+
recommendedProducts: e(c(r())),
|
|
113
113
|
/** Number of product cards per row */
|
|
114
114
|
cardsInRow: e(s()),
|
|
115
115
|
/** Mobile-only padding (right) */
|
|
@@ -132,7 +132,7 @@ const p = {
|
|
|
132
132
|
isPriceMovedToNextLine: e(o()),
|
|
133
133
|
/** Legacy "Hide if same as discounted" / delete-price-for-zero-sale toggle */
|
|
134
134
|
isPriceDeletedForZeroSale: e(o())
|
|
135
|
-
}),
|
|
135
|
+
}), v = a({
|
|
136
136
|
/**
|
|
137
137
|
* Legacy recommendation block configs keyed by block ID.
|
|
138
138
|
* Pass this when loading a template authored with the v1
|
|
@@ -140,17 +140,17 @@ const p = {
|
|
|
140
140
|
* strategy, currency, locale, and layout data.
|
|
141
141
|
*/
|
|
142
142
|
recommendationConfigs: e(
|
|
143
|
-
g(t(),
|
|
143
|
+
g(t(), P),
|
|
144
144
|
{}
|
|
145
145
|
)
|
|
146
|
-
}),
|
|
146
|
+
}), x = a({
|
|
147
147
|
/** Initial HTML content */
|
|
148
148
|
html: e(t(), ""),
|
|
149
149
|
/** Initial CSS content */
|
|
150
150
|
css: e(t(), ""),
|
|
151
151
|
/** Preselected dynamic content items */
|
|
152
152
|
preselectedDynamicContent: e(
|
|
153
|
-
|
|
153
|
+
c(M),
|
|
154
154
|
[]
|
|
155
155
|
),
|
|
156
156
|
/**
|
|
@@ -159,11 +159,11 @@ const p = {
|
|
|
159
159
|
* (first) partner's leaf attributes into the label→token map that repairs
|
|
160
160
|
* label-form placeholders (`{{ Phone Number }}`) in dropped saved modules.
|
|
161
161
|
*/
|
|
162
|
-
dynamicContentList: e(
|
|
162
|
+
dynamicContentList: e(N, {}),
|
|
163
163
|
/** Valid custom field attribute names from the partner's categorized fields */
|
|
164
|
-
customFieldAttributes: e(
|
|
164
|
+
customFieldAttributes: e(c(t()), []),
|
|
165
165
|
/** Selected unsubscribe page IDs */
|
|
166
|
-
selectedUnsubscribePages: e(
|
|
166
|
+
selectedUnsubscribePages: e(c(s()), []),
|
|
167
167
|
/** Force recreate template in Stripo storage (use true when updating externally modified templates) */
|
|
168
168
|
forceRecreate: e(o(), !1),
|
|
169
169
|
/**
|
|
@@ -176,7 +176,7 @@ const p = {
|
|
|
176
176
|
trackIdCounter: e(
|
|
177
177
|
i(
|
|
178
178
|
s(),
|
|
179
|
-
y((
|
|
179
|
+
y((n) => Number.isFinite(n) ? Math.max(0, Math.floor(n)) : 0)
|
|
180
180
|
),
|
|
181
181
|
0
|
|
182
182
|
),
|
|
@@ -190,12 +190,12 @@ const p = {
|
|
|
190
190
|
recommendationCampaignUrls: e(
|
|
191
191
|
i(
|
|
192
192
|
r(),
|
|
193
|
-
y((
|
|
193
|
+
y((n) => n && typeof n == "object" ? { ...n } : void 0)
|
|
194
194
|
)
|
|
195
195
|
),
|
|
196
196
|
/** Migration-only inputs (legacy block configs) */
|
|
197
|
-
migration: e(
|
|
198
|
-
}),
|
|
197
|
+
migration: e(v, {})
|
|
198
|
+
}), D = a({
|
|
199
199
|
/** Sender display name */
|
|
200
200
|
senderName: e(t(), ""),
|
|
201
201
|
/** Email subject line */
|
|
@@ -208,18 +208,16 @@ const p = {
|
|
|
208
208
|
/** Migration date for template compatibility */
|
|
209
209
|
migrationDate: e(s(), 1759696858),
|
|
210
210
|
/** Email header settings */
|
|
211
|
-
emailHeader: e(
|
|
211
|
+
emailHeader: e(D, { senderName: "", subject: "" }),
|
|
212
212
|
/** Folder name for user-saved modules (used by Stripo plugin panel for path construction) */
|
|
213
|
-
savedModulesFolderName: e(t(),
|
|
213
|
+
savedModulesFolderName: e(t(), f.SAVED_MODULES),
|
|
214
214
|
/** Folder name for default/prebuilt modules (used by Stripo plugin panel for path construction) */
|
|
215
|
-
defaultModulesFolderName: e(t(),
|
|
215
|
+
defaultModulesFolderName: e(t(), f.DEFAULT_MODULES)
|
|
216
216
|
}), F = a({
|
|
217
217
|
/** Whether to show the header bar */
|
|
218
218
|
showHeader: e(o(), !0),
|
|
219
219
|
/** Custom label for back button (if shown) */
|
|
220
|
-
backButtonLabel: e(t())
|
|
221
|
-
/** Replace Stripo's display-condition UI with the Conditions tab and create/select drawers */
|
|
222
|
-
externalDisplayConditions: e(o(), !1)
|
|
220
|
+
backButtonLabel: e(t())
|
|
223
221
|
}), U = a({
|
|
224
222
|
/** Enable dynamic content insertion */
|
|
225
223
|
dynamicContent: e(o(), !0),
|
|
@@ -271,12 +269,12 @@ const p = {
|
|
|
271
269
|
]), j = a({
|
|
272
270
|
/** Default blocks to exclude from the editor */
|
|
273
271
|
excludeDefaults: e(
|
|
274
|
-
|
|
272
|
+
c(w),
|
|
275
273
|
[]
|
|
276
274
|
),
|
|
277
275
|
/** Custom blocks to include in the editor */
|
|
278
276
|
includeCustoms: e(
|
|
279
|
-
|
|
277
|
+
c(B),
|
|
280
278
|
[]
|
|
281
279
|
)
|
|
282
280
|
}), d = a({
|
|
@@ -308,13 +306,13 @@ const p = {
|
|
|
308
306
|
...d.entries,
|
|
309
307
|
type: u("remove"),
|
|
310
308
|
/** Strings or patterns to remove */
|
|
311
|
-
targets:
|
|
309
|
+
targets: c(t())
|
|
312
310
|
}), G = a({
|
|
313
311
|
...d.entries,
|
|
314
312
|
type: u("custom"),
|
|
315
313
|
/** Custom processor function */
|
|
316
314
|
processor: k(
|
|
317
|
-
(
|
|
315
|
+
(n) => typeof n == "function",
|
|
318
316
|
"processor must be a function"
|
|
319
317
|
)
|
|
320
318
|
}), V = I("type", [
|
|
@@ -324,7 +322,7 @@ const p = {
|
|
|
324
322
|
G
|
|
325
323
|
]), z = a({
|
|
326
324
|
/** Custom compiler rules to apply */
|
|
327
|
-
customRules: e(
|
|
325
|
+
customRules: e(c(V), []),
|
|
328
326
|
/** Skip default compiler rules */
|
|
329
327
|
ignoreDefaultRules: e(o(), !1)
|
|
330
328
|
}), W = a({
|
|
@@ -334,7 +332,7 @@ const p = {
|
|
|
334
332
|
*/
|
|
335
333
|
externalValidation: e(
|
|
336
334
|
k(
|
|
337
|
-
(
|
|
335
|
+
(n) => typeof n == "function",
|
|
338
336
|
"externalValidation must be a function"
|
|
339
337
|
)
|
|
340
338
|
)
|
|
@@ -346,7 +344,7 @@ const p = {
|
|
|
346
344
|
partner: E,
|
|
347
345
|
// Optional sections (with defaults)
|
|
348
346
|
/** Template content and presets */
|
|
349
|
-
template: e(
|
|
347
|
+
template: e(x, {}),
|
|
350
348
|
/** Editor settings */
|
|
351
349
|
editor: e(O, {}),
|
|
352
350
|
/** UI configuration */
|
|
@@ -368,23 +366,23 @@ export {
|
|
|
368
366
|
B as CustomBlockTypeSchema,
|
|
369
367
|
G as CustomRuleSchema,
|
|
370
368
|
w as DefaultBlockTypeSchema,
|
|
371
|
-
|
|
372
|
-
|
|
369
|
+
N as DynamicContentListSchema,
|
|
370
|
+
S as DynamicContentNodeSchema,
|
|
373
371
|
M as DynamicContentSchema,
|
|
374
372
|
O as EditorSchema,
|
|
375
|
-
|
|
373
|
+
D as EmailHeaderSchema,
|
|
376
374
|
L as FallbackFontSchema,
|
|
377
375
|
U as FeaturesSchema,
|
|
378
376
|
K as GuidoConfigSchema,
|
|
379
377
|
A as IdentitySchema,
|
|
380
|
-
|
|
378
|
+
P as LegacyRecommendationConfigSchema,
|
|
381
379
|
p as MessageType,
|
|
382
380
|
E as PartnerSchema,
|
|
383
381
|
l as ProductType,
|
|
384
382
|
_ as RegexRuleSchema,
|
|
385
383
|
q as RemoveRuleSchema,
|
|
386
384
|
H as ReplaceRuleSchema,
|
|
387
|
-
|
|
388
|
-
|
|
385
|
+
v as TemplateMigrationSchema,
|
|
386
|
+
x as TemplateSchema,
|
|
389
387
|
F as UISchema
|
|
390
388
|
};
|
|
@@ -1,18 +1,18 @@
|
|
|
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
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.AuthErrorModal), 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.isSaveValidationEnabled ? r(e.ValidationErrorDrawer) : a._e(), e.
|
|
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.AuthErrorModal), 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.isSaveValidationEnabled ? r(e.ValidationErrorDrawer) : a._e(), 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
|
-
}, s = [], n = /* @__PURE__ */
|
|
10
|
-
|
|
9
|
+
}, s = [], n = /* @__PURE__ */ i(
|
|
10
|
+
o,
|
|
11
11
|
t,
|
|
12
12
|
s,
|
|
13
13
|
!1,
|
|
14
14
|
null,
|
|
15
|
-
"
|
|
15
|
+
"f2154cb6"
|
|
16
16
|
);
|
|
17
17
|
const v = n.exports;
|
|
18
18
|
export {
|
|
@@ -1,163 +1,171 @@
|
|
|
1
|
-
import { defineComponent as de, defineAsyncComponent as
|
|
1
|
+
import { defineComponent as de, defineAsyncComponent as l, ref as W, computed as f, watch as G, onMounted as me, onUnmounted as le } from "vue";
|
|
2
2
|
import { useCortexBlueprintBridge as ue } from "../composables/useCortexBlueprintBridge.js";
|
|
3
3
|
import { useEditorLock as pe } from "../composables/useEditorLock.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { startEditorOpenMetrics as fe } from "../composables/useEditorOpenMetrics.js";
|
|
5
|
+
import { provideGuidoActions as ye } from "../composables/useGuidoActions.js";
|
|
6
|
+
import { useGuidoStateBridge as ge } from "../composables/useGuidoStateBridge.js";
|
|
7
|
+
import { usePartner as ve } from "../composables/usePartner.js";
|
|
7
8
|
import { useSaveValidationRollout as Se } from "../composables/useSaveValidationRollout.js";
|
|
8
|
-
import { useStripo as
|
|
9
|
-
import { useTimerClone as
|
|
10
|
-
import { migrate as
|
|
11
|
-
import { ModuleFolderDefaults as
|
|
12
|
-
import { RIBBON_SELECTOR as
|
|
13
|
-
import { useRecommendationExtensionStore as
|
|
14
|
-
import { disposeUnsubscribeListeners as
|
|
15
|
-
import
|
|
16
|
-
import
|
|
17
|
-
import
|
|
18
|
-
import
|
|
19
|
-
import
|
|
20
|
-
import
|
|
21
|
-
import
|
|
22
|
-
import
|
|
23
|
-
import
|
|
24
|
-
import { useStripoApi as
|
|
9
|
+
import { useStripo as be } from "../composables/useStripo.js";
|
|
10
|
+
import { useTimerClone as he } from "../composables/useTimerClone.js";
|
|
11
|
+
import { migrate as Ee } from "../config/migrator/index.js";
|
|
12
|
+
import { ModuleFolderDefaults as H } from "../enums/defaults.js";
|
|
13
|
+
import { RIBBON_SELECTOR as we } from "../enums/onboarding.js";
|
|
14
|
+
import { useRecommendationExtensionStore as V, disposeStrategyPageReturnListeners as ke } from "../extensions/Blocks/Recommendation/store/recommendation.js";
|
|
15
|
+
import { disposeUnsubscribeListeners as Ce } from "../extensions/Blocks/Unsubscribe/block.js";
|
|
16
|
+
import De from "./organisms/AutoSaveController.vue.js";
|
|
17
|
+
import Ie from "./organisms/base/AuthErrorModal.vue.js";
|
|
18
|
+
import Fe from "./organisms/base/Toaster.vue.js";
|
|
19
|
+
import Me from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
|
|
20
|
+
import Re from "./organisms/header/HeaderWrapper.vue.js";
|
|
21
|
+
import Te from "./organisms/LoadingWrapper.vue.js";
|
|
22
|
+
import Le from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
|
|
23
|
+
import Ue from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
|
|
24
|
+
import Ne from "./organisms/validation/ValidationErrorDrawer.vue.js";
|
|
25
|
+
import { useStripoApi as _e } from "../services/stripoApi.js";
|
|
25
26
|
import { useConfigStore as Ae } from "../stores/config.js";
|
|
26
27
|
import { useDynamicContentStore as Be } from "../stores/dynamic-content.js";
|
|
27
|
-
import { useEditorStore as
|
|
28
|
-
import { usePreviewStore as
|
|
29
|
-
import { useSaveValidationStore as
|
|
30
|
-
import { useTemplateStore as
|
|
31
|
-
import { useUnsubscribeStore as
|
|
32
|
-
import { readTrackFloor as
|
|
33
|
-
const
|
|
28
|
+
import { useEditorStore as w } from "../stores/editor.js";
|
|
29
|
+
import { usePreviewStore as Oe } from "../stores/preview.js";
|
|
30
|
+
import { useSaveValidationStore as Pe } from "../stores/save-validation.js";
|
|
31
|
+
import { useTemplateStore as xe } from "../stores/template.js";
|
|
32
|
+
import { useUnsubscribeStore as We } from "../stores/unsubscribe.js";
|
|
33
|
+
import { readTrackFloor as $ } from "../utils/linkTrackingIds.js";
|
|
34
|
+
const ht = /* @__PURE__ */ de({
|
|
34
35
|
__name: "Guido",
|
|
35
36
|
props: {
|
|
36
37
|
config: null,
|
|
37
38
|
ready: { type: Boolean, default: !0 }
|
|
38
39
|
},
|
|
39
40
|
emits: ["dynamic-content:open", "back", "save:start", "save:complete", "on-change", "ready", "onboarding:finished", "test-email:click"],
|
|
40
|
-
setup(
|
|
41
|
-
const
|
|
41
|
+
setup(z, { expose: q, emit: a }) {
|
|
42
|
+
const s = z, n = fe(), K = l(
|
|
42
43
|
() => import("./organisms/email-preview/PreviewContainer.vue.js")
|
|
43
|
-
),
|
|
44
|
+
), j = l(
|
|
44
45
|
() => import("./organisms/onboarding/OnboardingWrapper.vue.js")
|
|
45
|
-
),
|
|
46
|
+
), J = l(
|
|
46
47
|
() => import("./organisms/extensions/recommendation/AssignStrategyDrawer.vue.js")
|
|
47
|
-
),
|
|
48
|
+
), Q = l(
|
|
48
49
|
() => import("./organisms/extensions/recommendation/RemoveStrategyModal.vue.js")
|
|
49
|
-
),
|
|
50
|
-
() => import("./organisms/display-conditions/DisplayConditionsHost.vue.js")
|
|
51
|
-
), Z = c(
|
|
50
|
+
), X = l(
|
|
52
51
|
() => import("./organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.js")
|
|
53
|
-
),
|
|
54
|
-
|
|
55
|
-
const d =
|
|
52
|
+
), k = W(), y = W(), g = Be(), C = We(), o = Ae();
|
|
53
|
+
s.ready && o.init(s.config);
|
|
54
|
+
const d = w(), Y = Oe(), u = f(() => d.hasChanges), { isTestPartner: Z } = ve(), { isEnabled: ee, loadRollout: D } = Se(), I = () => {
|
|
56
55
|
var t;
|
|
57
|
-
return (t =
|
|
58
|
-
},
|
|
56
|
+
return (t = k.value) == null ? void 0 : t.handleSave(!0);
|
|
57
|
+
}, F = (t) => {
|
|
59
58
|
d.loadingStatus = t;
|
|
60
59
|
};
|
|
61
|
-
ue(),
|
|
62
|
-
const
|
|
60
|
+
ue(), ge();
|
|
61
|
+
const v = () => {
|
|
63
62
|
var t, e;
|
|
64
63
|
return {
|
|
65
64
|
emailId: o.templateId,
|
|
66
65
|
userId: o.userId,
|
|
67
66
|
username: o.username,
|
|
68
67
|
partnerName: o.partnerName,
|
|
69
|
-
savedModulesFolderName: ((t = o.editor) == null ? void 0 : t.savedModulesFolderName) ||
|
|
70
|
-
defaultModulesFolderName: ((e = o.editor) == null ? void 0 : e.defaultModulesFolderName) ||
|
|
68
|
+
savedModulesFolderName: ((t = o.editor) == null ? void 0 : t.savedModulesFolderName) || H.SAVED_MODULES,
|
|
69
|
+
defaultModulesFolderName: ((e = o.editor) == null ? void 0 : e.defaultModulesFolderName) || H.DEFAULT_MODULES
|
|
71
70
|
};
|
|
72
|
-
}, { initPlugin:
|
|
71
|
+
}, { initPlugin: M, preloadRuntime: R } = be(n), { runExclusive: T, beginMount: L, isCurrentMount: S } = pe();
|
|
73
72
|
let p = 0;
|
|
74
|
-
const { getDefaultTemplate:
|
|
73
|
+
const { getDefaultTemplate: U } = _e(), { cloneTimersOnSave: N, hasTimerBlocks: _ } = he(), te = f(() => {
|
|
75
74
|
var t;
|
|
76
75
|
return !((t = o.ui) != null && t.showHeader);
|
|
77
|
-
}),
|
|
78
|
-
() =>
|
|
76
|
+
}), oe = f(() => o.isFeatureEnabled("reusableRecommendationStrategy")), re = f(
|
|
77
|
+
() => !!V().recommendationConfigs.strategyId
|
|
79
78
|
);
|
|
80
|
-
|
|
79
|
+
ye({
|
|
81
80
|
onBack: () => {
|
|
82
|
-
console.debug("guido:back"),
|
|
81
|
+
console.debug("guido:back"), a("back");
|
|
83
82
|
},
|
|
84
83
|
onSaveStart: () => {
|
|
85
|
-
console.debug("guido:save:start"),
|
|
84
|
+
console.debug("guido:save:start"), a("save:start");
|
|
86
85
|
},
|
|
87
86
|
onSaveComplete: (t) => {
|
|
88
|
-
const e = { ...t, metadata:
|
|
89
|
-
console.debug("guido:save:complete", e),
|
|
87
|
+
const e = { ...t, metadata: v() };
|
|
88
|
+
console.debug("guido:save:complete", e), a("save:complete", e);
|
|
90
89
|
},
|
|
91
90
|
onTestEmailClick: () => {
|
|
92
|
-
console.debug("guido:test-email:click"),
|
|
91
|
+
console.debug("guido:test-email:click"), a("test-email:click");
|
|
93
92
|
}
|
|
94
93
|
});
|
|
95
|
-
const
|
|
96
|
-
console.debug("dynamic-content:close", t),
|
|
97
|
-
},
|
|
94
|
+
const A = (t) => {
|
|
95
|
+
console.debug("dynamic-content:close", t), g.setSelectedDynamicContent(t), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: t }));
|
|
96
|
+
}, B = () => {
|
|
98
97
|
console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
|
|
99
98
|
};
|
|
100
99
|
G(() => u.value, () => {
|
|
101
|
-
|
|
100
|
+
a("on-change", u.value);
|
|
102
101
|
});
|
|
103
|
-
const
|
|
104
|
-
const e = t, { attribute:
|
|
105
|
-
console.debug("dynamic-content:open", e.detail),
|
|
102
|
+
const b = (t) => {
|
|
103
|
+
const e = t, { attribute: i, position: m } = e.detail;
|
|
104
|
+
console.debug("dynamic-content:open", e.detail), a("dynamic-content:open", i, m);
|
|
106
105
|
};
|
|
107
|
-
let
|
|
108
|
-
const
|
|
106
|
+
let c = null;
|
|
107
|
+
const h = () => {
|
|
109
108
|
var e;
|
|
110
|
-
const t = document.querySelector(
|
|
111
|
-
(e =
|
|
112
|
-
},
|
|
109
|
+
const t = document.querySelector(we);
|
|
110
|
+
(e = y.value) == null || e.style.setProperty("--ribbon-offset", `${(t == null ? void 0 : t.offsetHeight) ?? 0}px`);
|
|
111
|
+
}, E = async () => {
|
|
113
112
|
var t;
|
|
113
|
+
n.mark("host_ready");
|
|
114
114
|
try {
|
|
115
|
-
o.initialized || o.init(
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
115
|
+
o.initialized || o.init(s.config), d.templateId = o.templateId, n.setContext({
|
|
116
|
+
partnerName: o.partnerName,
|
|
117
|
+
productType: o.productType,
|
|
118
|
+
templateId: o.templateId,
|
|
119
|
+
variationId: o.variationId
|
|
120
|
+
});
|
|
121
|
+
const e = o.template, i = (e == null ? void 0 : e.html) || "", m = (e == null ? void 0 : e.css) || "", O = (e == null ? void 0 : e.preselectedDynamicContent) || [];
|
|
122
|
+
C.selectedUnsubscribePages = (e == null ? void 0 : e.selectedUnsubscribePages) || [];
|
|
123
|
+
const ne = ((t = e == null ? void 0 : e.migration) == null ? void 0 : t.recommendationConfigs) ?? {}, P = o.isFeatureEnabled("linkTrackingIds"), ae = {
|
|
119
124
|
partnerName: o.partnerName,
|
|
120
125
|
campaignUrls: e == null ? void 0 : e.recommendationCampaignUrls,
|
|
121
126
|
rrsEnabled: o.isFeatureEnabled("reusableRecommendationStrategy")
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
|
|
127
|
+
}, x = (ce) => n.timed(
|
|
128
|
+
"migration",
|
|
129
|
+
() => Ee(ce, ne, ae)
|
|
130
|
+
);
|
|
131
|
+
let r = {
|
|
132
|
+
html: i && await x(i),
|
|
125
133
|
css: m
|
|
126
134
|
};
|
|
127
|
-
|
|
128
|
-
const ie =
|
|
129
|
-
|
|
130
|
-
const
|
|
131
|
-
preselectedDynamicContentList:
|
|
135
|
+
r.html || (r = await n.timed("default_template", () => U()), r.html = await x(r.html));
|
|
136
|
+
const ie = P ? $(r.html, (e == null ? void 0 : e.trackIdCounter) || 0) : 0;
|
|
137
|
+
_(r.html) && (r.html = await n.timed("timer_clone", () => N(r.html))), P && (d.trackIdSessionFloor = Math.max(ie, $(r.html)));
|
|
138
|
+
const se = {
|
|
139
|
+
preselectedDynamicContentList: O,
|
|
132
140
|
onReady: () => {
|
|
133
|
-
console.debug("guido:ready"),
|
|
141
|
+
console.debug("guido:ready"), a("ready");
|
|
134
142
|
}
|
|
135
143
|
};
|
|
136
|
-
p =
|
|
144
|
+
p = L(), await M(r, v(), se), g.selectedDynamicContentList = O;
|
|
137
145
|
} catch (e) {
|
|
138
|
-
console.error("Failed to initialize Stripo editor:", e);
|
|
146
|
+
console.error("Failed to initialize Stripo editor:", e), n.markFailed();
|
|
139
147
|
}
|
|
140
148
|
};
|
|
141
149
|
return me(async () => {
|
|
142
150
|
var e;
|
|
143
|
-
console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"),
|
|
144
|
-
const t = (e =
|
|
145
|
-
if (t && (
|
|
146
|
-
await
|
|
151
|
+
console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), V().$reset(), w().$reset(), xe().$reset(), Pe().$reset(), D(), h();
|
|
152
|
+
const t = (e = y.value) == null ? void 0 : e.parentElement;
|
|
153
|
+
if (t && (c = new ResizeObserver(h), c.observe(t)), R(), s.ready)
|
|
154
|
+
await E();
|
|
147
155
|
else {
|
|
148
|
-
const
|
|
149
|
-
m && (
|
|
156
|
+
const i = G(() => s.ready, (m) => {
|
|
157
|
+
m && (i(), E());
|
|
150
158
|
});
|
|
151
159
|
}
|
|
152
|
-
document.addEventListener("dynamic-content:open",
|
|
160
|
+
document.addEventListener("dynamic-content:open", b);
|
|
153
161
|
}), le(() => {
|
|
154
|
-
if (
|
|
162
|
+
if (Ce(), ke(), n.dispose(), c == null || c.disconnect(), document.removeEventListener("dynamic-content:open", b), S(p))
|
|
155
163
|
try {
|
|
156
|
-
|
|
164
|
+
w().isStripoInitialized = !1;
|
|
157
165
|
} catch (t) {
|
|
158
166
|
console.debug("Failed to close the editor readiness gate on unmount", t);
|
|
159
167
|
}
|
|
160
|
-
|
|
168
|
+
T(async () => {
|
|
161
169
|
if (S(p))
|
|
162
170
|
try {
|
|
163
171
|
window.UIEditor.removeEditor();
|
|
@@ -165,17 +173,17 @@ const St = /* @__PURE__ */ de({
|
|
|
165
173
|
console.debug("Failed to remove Stripo editor: No editor found");
|
|
166
174
|
}
|
|
167
175
|
}), o.reset();
|
|
168
|
-
}),
|
|
176
|
+
}), q({
|
|
169
177
|
dynamicContent: {
|
|
170
|
-
insert:
|
|
171
|
-
close:
|
|
178
|
+
insert: A,
|
|
179
|
+
close: B
|
|
172
180
|
},
|
|
173
181
|
hasChanges: u,
|
|
174
|
-
saveSilent:
|
|
175
|
-
setLoading:
|
|
176
|
-
}), { __sfc: !0, PreviewContainer:
|
|
182
|
+
saveSilent: I,
|
|
183
|
+
setLoading: F
|
|
184
|
+
}), { __sfc: !0, openMetrics: n, PreviewContainer: K, OnboardingWrapper: j, AssignStrategyDrawer: J, RemoveStrategyModal: Q, LegacyStrategyUpdatedModal: X, headerWrapperRef: k, wrapperRef: y, dynamicContentStore: g, unsubscribeStore: C, props: s, configStore: o, editorStore: d, previewStore: Y, hasChanges: u, isTestPartner: Z, isSaveValidationEnabled: ee, loadRollout: D, saveSilent: I, setLoading: F, emit: a, buildMetadata: v, initPlugin: M, preloadRuntime: R, runExclusive: T, beginMount: L, isCurrentMount: S, mountGeneration: p, getDefaultTemplate: U, cloneTimersOnSave: N, hasTimerBlocks: _, noHeader: te, isRrsEnabled: oe, hasAssignedStrategy: re, insertDynamicContent: A, closeDynamicContent: B, handleDynamicContentOpen: b, ribbonObserver: c, updateRibbonOffset: h, startEditor: E, AutoSaveController: De, AuthErrorModal: Ie, Toaster: Fe, FilterSelectionDrawer: Me, HeaderWrapper: Re, LoadingWrapper: Te, SaveAsTemplateDrawer: Le, UnsubscribeWrapper: Ue, ValidationErrorDrawer: Ne };
|
|
177
185
|
}
|
|
178
186
|
});
|
|
179
187
|
export {
|
|
180
|
-
|
|
188
|
+
ht as default
|
|
181
189
|
};
|