@useinsider/guido 3.21.1-beta.f5fb7ac → 3.21.2
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 +0 -9
- package/dist/@types/config/schemas.js +33 -35
- package/dist/components/Guido.vue.js +5 -5
- package/dist/components/Guido.vue2.js +96 -100
- package/dist/composables/useModuleRepair.js +23 -32
- package/dist/config/compiler/utils/recommendationCompilerUtils.js +55 -53
- package/dist/config/migrator/index.js +9 -10
- package/dist/enums/academy.js +1 -2
- package/dist/extensions/Blocks/Recommendation/block.js +52 -37
- package/dist/extensions/Blocks/Recommendation/controls/image/index.js +76 -16
- package/dist/extensions/Blocks/Recommendation/utils/captureStyleTemplates.js +16 -15
- package/dist/guido.css +1 -1
- package/dist/src/@types/config/schemas.d.ts +0 -4
- package/dist/src/composables/useConfig.d.ts +0 -2
- package/dist/src/composables/useModuleRepair.d.ts +11 -2
- package/dist/src/enums/academy.d.ts +0 -1
- package/dist/src/extensions/Blocks/Recommendation/block.d.ts +2 -0
- package/dist/src/extensions/Blocks/Recommendation/controls/image/index.d.ts +31 -17
- package/dist/src/stores/config.d.ts +0 -20
- package/dist/src/stores/editor.d.ts +0 -25
- package/dist/stores/editor.js +14 -15
- package/package.json +1 -1
- package/dist/components/organisms/unsubscribe/LegacyUnsubscribeConvertedModal.vue.js +0 -17
- package/dist/components/organisms/unsubscribe/LegacyUnsubscribeConvertedModal.vue2.js +0 -30
- package/dist/config/migrator/legacyUnsubscribeTextMigrator.js +0 -16
- package/dist/src/components/organisms/unsubscribe/LegacyUnsubscribeConvertedModal.vue.d.ts +0 -2
- package/dist/src/config/migrator/legacyUnsubscribeTextMigrator.d.ts +0 -1
- package/dist/src/utils/legacyUnsubscribeConversion.d.ts +0 -10
- package/dist/utils/legacyUnsubscribeConversion.js +0 -49
package/README.md
CHANGED
|
@@ -166,7 +166,6 @@ const config: GuidoConfigInput = {
|
|
|
166
166
|
allowlistEnabled?: boolean, // Default: false - Pre-save domain-allowlist check (opt-in). Guido self-serves the block toaster (role lookup, deep-link, copy from window.trans).
|
|
167
167
|
allowSaveWithErrors?: boolean, // Default: true - Allow the validation drawer's "Save and Continue" soft-save. Set false to hard-block invalid saves (transactional + unsubscribe pages).
|
|
168
168
|
reusableRecommendationStrategy?: boolean, // Default: false - Assign an RRS strategy to recommendation blocks instead of per-block algorithm/filters/shuffle/product-count settings.
|
|
169
|
-
legacyUnsubscribeConversion?: boolean, // Default: false - Convert legacy unsubscribe blocks that have no unsubscribe link into text blocks (on load and on module drop/copy) and show a warning modal.
|
|
170
169
|
},
|
|
171
170
|
|
|
172
171
|
// Optional: Callbacks
|
|
@@ -668,14 +667,6 @@ multiple partners (e.g. architect) should key by partner and place the active pa
|
|
|
668
667
|
first. Omit the prop and the repair is a safe no-op — nothing is rewritten and no
|
|
669
668
|
toaster fires (useful before the host has wired the catalog).
|
|
670
669
|
|
|
671
|
-
With `features.legacyUnsubscribeConversion: true`, a dropped or copied module's legacy
|
|
672
|
-
unsubscribe block that has no unsubscribe link (the old editor reused it as plain text,
|
|
673
|
-
e.g. a company address) becomes a plain text block that keeps its content, and a warning
|
|
674
|
-
modal explains it. The same conversion runs when a template is opened. Register these
|
|
675
|
-
keys host-side: `email-editor.legacy-unsubscribe-converted-modal-title`,
|
|
676
|
-
`email-editor.legacy-unsubscribe-converted-modal-message` and
|
|
677
|
-
`email-editor.legacy-unsubscribe-converted-modal-visit-academy` (OK reuses `action-builder.ok`).
|
|
678
|
-
|
|
679
670
|
---
|
|
680
671
|
|
|
681
672
|
## Development
|
|
@@ -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,7 +140,7 @@ 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({
|
|
@@ -150,7 +150,7 @@ const p = {
|
|
|
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,11 +190,11 @@ 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(
|
|
197
|
+
migration: e(v, {})
|
|
198
198
|
}), D = a({
|
|
199
199
|
/** Sender display name */
|
|
200
200
|
senderName: e(t(), ""),
|
|
@@ -210,9 +210,9 @@ const p = {
|
|
|
210
210
|
/** Email header settings */
|
|
211
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),
|
|
@@ -243,9 +243,7 @@ const p = {
|
|
|
243
243
|
linkTrackingIds: e(o(), !1),
|
|
244
244
|
/** Allow persisting a template that still has validation errors (drawer "Save and Continue" soft-save). Host sets false for transactional + unsubscribe. */
|
|
245
245
|
allowSaveWithErrors: e(o(), !0),
|
|
246
|
-
reusableRecommendationStrategy: e(o(), !1)
|
|
247
|
-
/** Convert linkless legacy unsubscribe blocks into text blocks and warn with a modal (opt-in) */
|
|
248
|
-
legacyUnsubscribeConversion: e(o(), !1)
|
|
246
|
+
reusableRecommendationStrategy: e(o(), !1)
|
|
249
247
|
}), w = m([
|
|
250
248
|
"amp-accordion",
|
|
251
249
|
"amp-carousel",
|
|
@@ -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
|
)
|
|
@@ -368,8 +366,8 @@ 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,
|
|
@@ -377,14 +375,14 @@ export {
|
|
|
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
|
-
|
|
385
|
+
v as TemplateMigrationSchema,
|
|
388
386
|
x as TemplateSchema,
|
|
389
387
|
F as UISchema
|
|
390
388
|
};
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import o from "./Guido.vue2.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import i from "../_virtual/_plugin-vue2_normalizer.js";
|
|
4
|
-
var
|
|
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(),
|
|
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
|
-
},
|
|
9
|
+
}, s = [], n = /* @__PURE__ */ i(
|
|
10
10
|
o,
|
|
11
|
-
s,
|
|
12
11
|
t,
|
|
12
|
+
s,
|
|
13
13
|
!1,
|
|
14
14
|
null,
|
|
15
|
-
"
|
|
15
|
+
"c5146fc5"
|
|
16
16
|
);
|
|
17
17
|
const v = n.exports;
|
|
18
18
|
export {
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { useCortexBlueprintBridge as
|
|
3
|
-
import { useEditorLock as
|
|
4
|
-
import { provideGuidoActions as
|
|
5
|
-
import { useGuidoStateBridge as
|
|
6
|
-
import { usePartner as
|
|
7
|
-
import { useSaveValidationRollout as
|
|
8
|
-
import { useStripo as
|
|
1
|
+
import { defineComponent as ie, defineAsyncComponent as m, ref as W, computed as p, watch as G, onMounted as ce, onUnmounted as de } from "vue";
|
|
2
|
+
import { useCortexBlueprintBridge as me } from "../composables/useCortexBlueprintBridge.js";
|
|
3
|
+
import { useEditorLock as le } from "../composables/useEditorLock.js";
|
|
4
|
+
import { provideGuidoActions as ue } from "../composables/useGuidoActions.js";
|
|
5
|
+
import { useGuidoStateBridge as pe } from "../composables/useGuidoStateBridge.js";
|
|
6
|
+
import { usePartner as fe } from "../composables/usePartner.js";
|
|
7
|
+
import { useSaveValidationRollout as ye } from "../composables/useSaveValidationRollout.js";
|
|
8
|
+
import { useStripo as ge } from "../composables/useStripo.js";
|
|
9
9
|
import { useTimerClone as Se } from "../composables/useTimerClone.js";
|
|
10
10
|
import { migrate as V } from "../config/migrator/index.js";
|
|
11
11
|
import { ModuleFolderDefaults as $ } from "../enums/defaults.js";
|
|
12
|
-
import { RIBBON_SELECTOR as
|
|
13
|
-
import { useRecommendationExtensionStore as z, disposeStrategyPageReturnListeners as
|
|
14
|
-
import { disposeUnsubscribeListeners as
|
|
15
|
-
import
|
|
16
|
-
import
|
|
17
|
-
import
|
|
18
|
-
import
|
|
19
|
-
import
|
|
12
|
+
import { RIBBON_SELECTOR as ve } from "../enums/onboarding.js";
|
|
13
|
+
import { useRecommendationExtensionStore as z, disposeStrategyPageReturnListeners as be } from "../extensions/Blocks/Recommendation/store/recommendation.js";
|
|
14
|
+
import { disposeUnsubscribeListeners as he } from "../extensions/Blocks/Unsubscribe/block.js";
|
|
15
|
+
import Ee from "./organisms/AutoSaveController.vue.js";
|
|
16
|
+
import we from "./organisms/base/AuthErrorModal.vue.js";
|
|
17
|
+
import De from "./organisms/base/Toaster.vue.js";
|
|
18
|
+
import Ce from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
|
|
19
|
+
import ke from "./organisms/header/HeaderWrapper.vue.js";
|
|
20
20
|
import Re from "./organisms/LoadingWrapper.vue.js";
|
|
21
|
-
import
|
|
22
|
-
import
|
|
23
|
-
import
|
|
24
|
-
import { useStripoApi as
|
|
25
|
-
import { useConfigStore as
|
|
26
|
-
import { useDynamicContentStore as
|
|
21
|
+
import Fe from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
|
|
22
|
+
import Le from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
|
|
23
|
+
import Me from "./organisms/validation/ValidationErrorDrawer.vue.js";
|
|
24
|
+
import { useStripoApi as Te } from "../services/stripoApi.js";
|
|
25
|
+
import { useConfigStore as Ie } from "../stores/config.js";
|
|
26
|
+
import { useDynamicContentStore as Ue } from "../stores/dynamic-content.js";
|
|
27
27
|
import { useEditorStore as E } from "../stores/editor.js";
|
|
28
|
-
import { usePreviewStore as
|
|
29
|
-
import { useSaveValidationStore as
|
|
30
|
-
import { useTemplateStore as
|
|
31
|
-
import { useUnsubscribeStore as
|
|
28
|
+
import { usePreviewStore as Ae } from "../stores/preview.js";
|
|
29
|
+
import { useSaveValidationStore as Be } from "../stores/save-validation.js";
|
|
30
|
+
import { useTemplateStore as Ne } from "../stores/template.js";
|
|
31
|
+
import { useUnsubscribeStore as Pe } from "../stores/unsubscribe.js";
|
|
32
32
|
import { readTrackFloor as H } from "../utils/linkTrackingIds.js";
|
|
33
|
-
const
|
|
33
|
+
const yt = /* @__PURE__ */ ie({
|
|
34
34
|
__name: "Guido",
|
|
35
35
|
props: {
|
|
36
36
|
config: null,
|
|
@@ -38,146 +38,142 @@ const vo = /* @__PURE__ */ de({
|
|
|
38
38
|
},
|
|
39
39
|
emits: ["dynamic-content:open", "back", "save:start", "save:complete", "on-change", "ready", "onboarding:finished", "test-email:click"],
|
|
40
40
|
setup(q, { expose: K, emit: r }) {
|
|
41
|
-
const
|
|
41
|
+
const s = q, j = m(
|
|
42
42
|
() => import("./organisms/email-preview/PreviewContainer.vue.js")
|
|
43
|
-
), J =
|
|
43
|
+
), J = m(
|
|
44
44
|
() => import("./organisms/onboarding/OnboardingWrapper.vue.js")
|
|
45
|
-
), Q =
|
|
45
|
+
), Q = m(
|
|
46
46
|
() => import("./organisms/extensions/recommendation/AssignStrategyDrawer.vue.js")
|
|
47
|
-
), X =
|
|
47
|
+
), X = m(
|
|
48
48
|
() => import("./organisms/extensions/recommendation/RemoveStrategyModal.vue.js")
|
|
49
|
-
), Y =
|
|
49
|
+
), Y = m(
|
|
50
50
|
() => import("./organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.js")
|
|
51
|
-
),
|
|
52
|
-
|
|
53
|
-
),
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}, F = (o) => {
|
|
59
|
-
d.loadingStatus = o;
|
|
51
|
+
), w = W(), f = W(), y = Ue(), D = Pe(), o = Ie();
|
|
52
|
+
s.ready && o.init(s.config);
|
|
53
|
+
const c = E(), Z = Ae(), l = p(() => c.hasChanges), { isTestPartner: ee } = fe(), { isEnabled: te, loadRollout: C } = ye(), k = () => {
|
|
54
|
+
var t;
|
|
55
|
+
return (t = w.value) == null ? void 0 : t.handleSave(!0);
|
|
56
|
+
}, R = (t) => {
|
|
57
|
+
c.loadingStatus = t;
|
|
60
58
|
};
|
|
61
|
-
|
|
59
|
+
me(), pe();
|
|
62
60
|
const g = () => {
|
|
63
|
-
var
|
|
61
|
+
var t, e;
|
|
64
62
|
return {
|
|
65
|
-
emailId:
|
|
66
|
-
userId:
|
|
67
|
-
username:
|
|
68
|
-
partnerName:
|
|
69
|
-
savedModulesFolderName: ((
|
|
70
|
-
defaultModulesFolderName: ((e =
|
|
63
|
+
emailId: o.templateId,
|
|
64
|
+
userId: o.userId,
|
|
65
|
+
username: o.username,
|
|
66
|
+
partnerName: o.partnerName,
|
|
67
|
+
savedModulesFolderName: ((t = o.editor) == null ? void 0 : t.savedModulesFolderName) || $.SAVED_MODULES,
|
|
68
|
+
defaultModulesFolderName: ((e = o.editor) == null ? void 0 : e.defaultModulesFolderName) || $.DEFAULT_MODULES
|
|
71
69
|
};
|
|
72
|
-
}, { initPlugin:
|
|
73
|
-
let
|
|
74
|
-
const { getDefaultTemplate:
|
|
75
|
-
var
|
|
76
|
-
return !((
|
|
77
|
-
}),
|
|
78
|
-
() => t.isFeatureEnabled("legacyUnsubscribeConversion")
|
|
79
|
-
), ae = l(
|
|
70
|
+
}, { initPlugin: F, preloadRuntime: L } = ge(), { runExclusive: M, beginMount: T, isCurrentMount: S } = le();
|
|
71
|
+
let u = 0;
|
|
72
|
+
const { getDefaultTemplate: I } = Te(), { cloneTimersOnSave: U, hasTimerBlocks: A } = Se(), oe = p(() => {
|
|
73
|
+
var t;
|
|
74
|
+
return !((t = o.ui) != null && t.showHeader);
|
|
75
|
+
}), ne = p(() => o.isFeatureEnabled("reusableRecommendationStrategy")), re = p(
|
|
80
76
|
() => !!z().recommendationConfigs.strategyId
|
|
81
77
|
);
|
|
82
|
-
|
|
78
|
+
ue({
|
|
83
79
|
onBack: () => {
|
|
84
80
|
console.debug("guido:back"), r("back");
|
|
85
81
|
},
|
|
86
82
|
onSaveStart: () => {
|
|
87
83
|
console.debug("guido:save:start"), r("save:start");
|
|
88
84
|
},
|
|
89
|
-
onSaveComplete: (
|
|
90
|
-
const e = { ...
|
|
85
|
+
onSaveComplete: (t) => {
|
|
86
|
+
const e = { ...t, metadata: g() };
|
|
91
87
|
console.debug("guido:save:complete", e), r("save:complete", e);
|
|
92
88
|
},
|
|
93
89
|
onTestEmailClick: () => {
|
|
94
90
|
console.debug("guido:test-email:click"), r("test-email:click");
|
|
95
91
|
}
|
|
96
92
|
});
|
|
97
|
-
const B = (
|
|
98
|
-
console.debug("dynamic-content:close",
|
|
93
|
+
const B = (t) => {
|
|
94
|
+
console.debug("dynamic-content:close", t), y.setSelectedDynamicContent(t), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: t }));
|
|
99
95
|
}, N = () => {
|
|
100
96
|
console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
|
|
101
97
|
};
|
|
102
|
-
G(() =>
|
|
103
|
-
r("on-change",
|
|
98
|
+
G(() => l.value, () => {
|
|
99
|
+
r("on-change", l.value);
|
|
104
100
|
});
|
|
105
|
-
const v = (
|
|
106
|
-
const e =
|
|
107
|
-
console.debug("dynamic-content:open", e.detail), r("dynamic-content:open",
|
|
101
|
+
const v = (t) => {
|
|
102
|
+
const e = t, { attribute: a, position: d } = e.detail;
|
|
103
|
+
console.debug("dynamic-content:open", e.detail), r("dynamic-content:open", a, d);
|
|
108
104
|
};
|
|
109
105
|
let i = null;
|
|
110
|
-
const
|
|
106
|
+
const b = () => {
|
|
111
107
|
var e;
|
|
112
|
-
const
|
|
113
|
-
(e = f.value) == null || e.style.setProperty("--ribbon-offset", `${(
|
|
108
|
+
const t = document.querySelector(ve);
|
|
109
|
+
(e = f.value) == null || e.style.setProperty("--ribbon-offset", `${(t == null ? void 0 : t.offsetHeight) ?? 0}px`);
|
|
114
110
|
}, h = async () => {
|
|
115
|
-
var
|
|
111
|
+
var t;
|
|
116
112
|
try {
|
|
117
|
-
|
|
118
|
-
const e =
|
|
119
|
-
|
|
120
|
-
const _ = ((
|
|
121
|
-
partnerName:
|
|
113
|
+
o.initialized || o.init(s.config), c.templateId = o.templateId;
|
|
114
|
+
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) || [];
|
|
115
|
+
D.selectedUnsubscribePages = (e == null ? void 0 : e.selectedUnsubscribePages) || [];
|
|
116
|
+
const _ = ((t = e == null ? void 0 : e.migration) == null ? void 0 : t.recommendationConfigs) ?? {}, O = o.isFeatureEnabled("linkTrackingIds"), x = {
|
|
117
|
+
partnerName: o.partnerName,
|
|
122
118
|
campaignUrls: e == null ? void 0 : e.recommendationCampaignUrls,
|
|
123
|
-
rrsEnabled:
|
|
119
|
+
rrsEnabled: o.isFeatureEnabled("reusableRecommendationStrategy")
|
|
124
120
|
};
|
|
125
121
|
let n = {
|
|
126
|
-
html:
|
|
127
|
-
css:
|
|
122
|
+
html: a && await V(a, _, x),
|
|
123
|
+
css: d
|
|
128
124
|
};
|
|
129
|
-
n.html || (n = await
|
|
130
|
-
const
|
|
131
|
-
A(n.html) && (n.html = await
|
|
132
|
-
const
|
|
125
|
+
n.html || (n = await I(), n.html = await V(n.html, _, x));
|
|
126
|
+
const ae = O ? H(n.html, (e == null ? void 0 : e.trackIdCounter) || 0) : 0;
|
|
127
|
+
A(n.html) && (n.html = await U(n.html)), O && (c.trackIdSessionFloor = Math.max(ae, H(n.html)));
|
|
128
|
+
const se = {
|
|
133
129
|
preselectedDynamicContentList: P,
|
|
134
130
|
onReady: () => {
|
|
135
131
|
console.debug("guido:ready"), r("ready");
|
|
136
132
|
}
|
|
137
133
|
};
|
|
138
|
-
|
|
134
|
+
u = T(), await F(n, g(), se), y.selectedDynamicContentList = P;
|
|
139
135
|
} catch (e) {
|
|
140
136
|
console.error("Failed to initialize Stripo editor:", e);
|
|
141
137
|
}
|
|
142
138
|
};
|
|
143
|
-
return
|
|
139
|
+
return ce(async () => {
|
|
144
140
|
var e;
|
|
145
|
-
console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), z().$reset(), E().$reset(),
|
|
146
|
-
const
|
|
147
|
-
if (
|
|
141
|
+
console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), z().$reset(), E().$reset(), Ne().$reset(), Be().$reset(), C(), b();
|
|
142
|
+
const t = (e = f.value) == null ? void 0 : e.parentElement;
|
|
143
|
+
if (t && (i = new ResizeObserver(b), i.observe(t)), L(), s.ready)
|
|
148
144
|
await h();
|
|
149
145
|
else {
|
|
150
|
-
const
|
|
151
|
-
|
|
146
|
+
const a = G(() => s.ready, (d) => {
|
|
147
|
+
d && (a(), h());
|
|
152
148
|
});
|
|
153
149
|
}
|
|
154
150
|
document.addEventListener("dynamic-content:open", v);
|
|
155
|
-
}),
|
|
156
|
-
if (
|
|
151
|
+
}), de(() => {
|
|
152
|
+
if (he(), be(), i == null || i.disconnect(), document.removeEventListener("dynamic-content:open", v), S(u))
|
|
157
153
|
try {
|
|
158
154
|
E().isStripoInitialized = !1;
|
|
159
|
-
} catch (
|
|
160
|
-
console.debug("Failed to close the editor readiness gate on unmount",
|
|
155
|
+
} catch (t) {
|
|
156
|
+
console.debug("Failed to close the editor readiness gate on unmount", t);
|
|
161
157
|
}
|
|
162
158
|
M(async () => {
|
|
163
|
-
if (
|
|
159
|
+
if (S(u))
|
|
164
160
|
try {
|
|
165
161
|
window.UIEditor.removeEditor();
|
|
166
162
|
} catch {
|
|
167
163
|
console.debug("Failed to remove Stripo editor: No editor found");
|
|
168
164
|
}
|
|
169
|
-
}),
|
|
165
|
+
}), o.reset();
|
|
170
166
|
}), K({
|
|
171
167
|
dynamicContent: {
|
|
172
168
|
insert: B,
|
|
173
169
|
close: N
|
|
174
170
|
},
|
|
175
|
-
hasChanges:
|
|
171
|
+
hasChanges: l,
|
|
176
172
|
saveSilent: k,
|
|
177
|
-
setLoading:
|
|
178
|
-
}), { __sfc: !0, PreviewContainer: j, OnboardingWrapper: J, AssignStrategyDrawer: Q, RemoveStrategyModal: X, LegacyStrategyUpdatedModal: Y,
|
|
173
|
+
setLoading: R
|
|
174
|
+
}), { __sfc: !0, PreviewContainer: j, OnboardingWrapper: J, AssignStrategyDrawer: Q, RemoveStrategyModal: X, LegacyStrategyUpdatedModal: Y, headerWrapperRef: w, wrapperRef: f, dynamicContentStore: y, unsubscribeStore: D, props: s, configStore: o, editorStore: c, previewStore: Z, hasChanges: l, isTestPartner: ee, isSaveValidationEnabled: te, loadRollout: C, saveSilent: k, setLoading: R, emit: r, buildMetadata: g, initPlugin: F, preloadRuntime: L, runExclusive: M, beginMount: T, isCurrentMount: S, mountGeneration: u, getDefaultTemplate: I, cloneTimersOnSave: U, hasTimerBlocks: A, noHeader: oe, isRrsEnabled: ne, hasAssignedStrategy: re, insertDynamicContent: B, closeDynamicContent: N, handleDynamicContentOpen: v, ribbonObserver: i, updateRibbonOffset: b, startEditor: h, AutoSaveController: Ee, AuthErrorModal: we, Toaster: De, FilterSelectionDrawer: Ce, HeaderWrapper: ke, LoadingWrapper: Re, SaveAsTemplateDrawer: Fe, UnsubscribeWrapper: Le, ValidationErrorDrawer: Me };
|
|
179
175
|
}
|
|
180
176
|
});
|
|
181
177
|
export {
|
|
182
|
-
|
|
178
|
+
yt as default
|
|
183
179
|
};
|
|
@@ -1,42 +1,33 @@
|
|
|
1
|
-
import { useConfig as
|
|
2
|
-
import { useToaster as
|
|
3
|
-
import { useTranslations as
|
|
4
|
-
import { ToasterTypeOptions as
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { flattenDynamicContentList as L } from "../utils/genericUtil.js";
|
|
1
|
+
import { useConfig as C } from "./useConfig.js";
|
|
2
|
+
import { useToaster as T } from "./useToaster.js";
|
|
3
|
+
import { useTranslations as g } from "./useTranslations.js";
|
|
4
|
+
import { ToasterTypeOptions as D } from "../enums/toaster.js";
|
|
5
|
+
import { buildDynamicContentLookup as f, convertModuleDynamicContent as h } from "../utils/dynamicContentConverter.js";
|
|
6
|
+
import { flattenDynamicContentList as O } from "../utils/genericUtil.js";
|
|
8
7
|
import { repairItemsCurrencyAttributes as M } from "../utils/itemsCurrencyRepair.js";
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
var c, l, u;
|
|
8
|
+
const N = "dynamic-content.unresolved-attributes-on-drop", R = () => {
|
|
9
|
+
const { template: p, isFeatureEnabled: m } = C(), { showToaster: a } = T(), y = g();
|
|
10
|
+
return { handleModuleAdd: (e, o) => {
|
|
11
|
+
var s, l, u;
|
|
14
12
|
try {
|
|
15
|
-
if ((
|
|
13
|
+
if ((e == null ? void 0 : e.action) !== "ADD" && (e == null ? void 0 : e.action) !== "COPY")
|
|
16
14
|
return;
|
|
17
|
-
const
|
|
18
|
-
if (!
|
|
15
|
+
const t = (s = o == null ? void 0 : o.getTargetNode) == null ? void 0 : s.call(o), r = (l = t == null ? void 0 : t.getOuterHTML) == null ? void 0 : l.call(t);
|
|
16
|
+
if (!t || typeof r != "string")
|
|
19
17
|
return;
|
|
20
|
-
let
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
T().isLegacyUnsubscribeModalRequested = !0;
|
|
27
|
-
} catch (g) {
|
|
28
|
-
console.error("Failed to request the legacy unsubscribe modal:", g);
|
|
29
|
-
}
|
|
30
|
-
m.length > 0 && y({
|
|
31
|
-
type: h.Warning,
|
|
32
|
-
message: b(E)
|
|
18
|
+
let n = M(r);
|
|
19
|
+
const c = f(O((u = p.value) == null ? void 0 : u.dynamicContentList));
|
|
20
|
+
let i = [];
|
|
21
|
+
c.size > 0 && ({ html: n, unresolved: i } = h(n, c, m("liquidSyntax"))), n !== r && o.modifyHtml(t).replaceWith(n), i.length > 0 && a({
|
|
22
|
+
type: D.Warning,
|
|
23
|
+
message: y(N)
|
|
33
24
|
});
|
|
34
|
-
} catch (
|
|
35
|
-
console.error("Failed to repair module on add:",
|
|
25
|
+
} catch (t) {
|
|
26
|
+
console.error("Failed to repair module on add:", t);
|
|
36
27
|
}
|
|
37
28
|
} };
|
|
38
29
|
};
|
|
39
30
|
export {
|
|
40
|
-
|
|
41
|
-
|
|
31
|
+
N as UNRESOLVED_DYNAMIC_CONTENT_ON_DROP_KEY,
|
|
32
|
+
R as useModuleRepair
|
|
42
33
|
};
|