@useinsider/guido 3.11.0-beta.f4ab671 → 3.12.0-beta.00cbb4c
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 +29 -0
- package/dist/@types/config/schemas.js +3 -4
- package/dist/components/organisms/header/ViewOptions.vue.js +3 -3
- package/dist/components/organisms/header/version-history/ViewOptions.vue.js +1 -1
- package/dist/components/organisms/onboarding/AMPOnboarding.vue.js +11 -10
- package/dist/components/organisms/onboarding/GenericOnboarding.vue.js +1 -1
- package/dist/components/organisms/onboarding/ItemsOnboarding.vue.js +6 -6
- package/dist/components/organisms/onboarding/NewVersionPopup.vue2.js +20 -23
- package/dist/components/organisms/onboarding/TextBlockOnboarding.vue.js +3 -3
- package/dist/components/organisms/onboarding/VersionHistoryOnboarding.vue.js +8 -7
- package/dist/config/migrator/index.js +7 -6
- package/dist/config/migrator/socialIconMigrator.js +29 -0
- package/dist/enums/academy.js +1 -1
- package/dist/enums/date.js +3 -4
- package/dist/extensions/Blocks/Items/controls/price/formattedPrice.js +43 -41
- package/dist/guido.css +1 -1
- package/dist/src/@types/config/schemas.d.ts +6 -8
- package/dist/src/@types/generic.d.ts +1 -1
- package/dist/src/config/migrator/socialIconMigrator.d.ts +1 -0
- package/dist/src/enums/academy.d.ts +3 -3
- package/dist/src/utils/environmentUtil.d.ts +5 -2
- package/dist/utils/dateUtil.js +10 -23
- package/dist/utils/environmentUtil.js +3 -2
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -113,6 +113,14 @@ const config: GuidoConfigInput = {
|
|
|
113
113
|
html?: string,
|
|
114
114
|
css?: string,
|
|
115
115
|
preselectedDynamicContent?: DynamicContent[],
|
|
116
|
+
// Partner-keyed catalog of the account's dynamic-content attributes, e.g.
|
|
117
|
+
// { [partnerName]: [{ text, value, children }] } (architect is multi-partner).
|
|
118
|
+
// Guido flattens the active (first) partner's leaf attributes and uses them to
|
|
119
|
+
// repair label-form tokens (`{{ Phone Number }}` -> `{{phone_number}}`) in
|
|
120
|
+
// dropped saved modules; an unresolvable token raises a single warning toaster
|
|
121
|
+
// (translation key `dynamic-content.unresolved-attributes-on-drop`, registered
|
|
122
|
+
// host-side). Omit it and the repair is a silent no-op. Default: {}.
|
|
123
|
+
dynamicContentList?: DynamicContentList,
|
|
116
124
|
selectedUnsubscribePages?: number[],
|
|
117
125
|
forceRecreate?: boolean, // Default: false - Force recreate template in Stripo storage
|
|
118
126
|
migration?: {
|
|
@@ -520,6 +528,8 @@ import type {
|
|
|
520
528
|
BlocksConfig,
|
|
521
529
|
CompilerConfig,
|
|
522
530
|
DynamicContent,
|
|
531
|
+
DynamicContentList,
|
|
532
|
+
DynamicContentNode,
|
|
523
533
|
DefaultBlockType,
|
|
524
534
|
CustomBlockType,
|
|
525
535
|
} from '@useinsider/guido';
|
|
@@ -584,6 +594,25 @@ const closeModal = () => {
|
|
|
584
594
|
</script>
|
|
585
595
|
```
|
|
586
596
|
|
|
597
|
+
### Saved-module token repair
|
|
598
|
+
|
|
599
|
+
Legacy **saved modules** may serialize their merge-tag chips by display label
|
|
600
|
+
(`{{ Phone Number }}`) instead of the canonical token (`{{phone_number}}`), which the
|
|
601
|
+
backend can't resolve. When such a module is dropped or copied into the editor, Guido
|
|
602
|
+
repairs these automatically using the `template.dynamicContentList` catalog (see
|
|
603
|
+
[Configuration](#configuration)):
|
|
604
|
+
|
|
605
|
+
- **Label match** → canonical value: `{{ Phone Number }}` → `{{phone_number}}` (any author `| default:` / format tail is preserved).
|
|
606
|
+
- Already-canonical values, Liquid nested tokens (`coupon.code`), recommendation-block variables (`123_0_price`), allowed system tokens, and `data-*` product tags are left untouched.
|
|
607
|
+
- An **unresolvable** token is left in place and raises a single **warning toaster** (translation key `dynamic-content.unresolved-attributes-on-drop`; register the copy host-side).
|
|
608
|
+
|
|
609
|
+
Pass `template.dynamicContentList` as a **partner-keyed** tree
|
|
610
|
+
(`{ [partnerName]: DynamicContentNode[] }`, where a node is `{ text, value, children? }`).
|
|
611
|
+
Guido flattens the **active (first) partner's** leaf attributes. Products that manage
|
|
612
|
+
multiple partners (e.g. architect) should key by partner and place the active partner
|
|
613
|
+
first. Omit the prop and the repair is a safe no-op — nothing is rewritten and no
|
|
614
|
+
toaster fires (useful before the host has wired the catalog).
|
|
615
|
+
|
|
587
616
|
---
|
|
588
617
|
|
|
589
618
|
## Development
|
|
@@ -147,10 +147,9 @@ const d = {
|
|
|
147
147
|
),
|
|
148
148
|
/**
|
|
149
149
|
* Partner-keyed set of dynamic-content items the account offers, e.g.
|
|
150
|
-
* `{ [partnerName]: [{ text, value, children }] }`. Guido flattens
|
|
151
|
-
* (
|
|
152
|
-
*
|
|
153
|
-
* saved modules.
|
|
150
|
+
* `{ [partnerName]: [{ text, value, children }] }`. Guido flattens the active
|
|
151
|
+
* (first) partner's leaf attributes into the label→token map that repairs
|
|
152
|
+
* label-form placeholders (`{{ Phone Number }}`) in dropped saved modules.
|
|
154
153
|
*/
|
|
155
154
|
dynamicContentList: e(P, {}),
|
|
156
155
|
/** Valid custom field attribute names from the partner's categorized fields */
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import d from "./AMPOnboarding.vue2.js";
|
|
2
|
+
/* empty css */
|
|
2
3
|
import g from "../../../_virtual/_plugin-vue2_normalizer.js";
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
return o.isVisible ? p(o.InOnboard, { key: "guido__amp-onboard", staticClass: "w-21-s p-a z-11", class: (
|
|
4
|
+
var c = function() {
|
|
5
|
+
var n, r, e, i, a, s;
|
|
6
|
+
var t = this, p = t._self._c, o = t._self._setupProxy;
|
|
7
|
+
return o.isVisible ? p(o.InOnboard, { key: "guido__amp-onboard", staticClass: "w-21-s p-a z-11", class: (n = o.onboardingStore.getAmpCurrentCard) == null ? void 0 : n.classes, attrs: { id: "guido__amp-onboard", "is-multiple-page": "", visible: "", "image-source": "", title: "", "bottom-position": (r = o.onboardingStore.getAmpCurrentCard) == null ? void 0 : r.bottom, "left-position": (e = o.onboardingStore.getAmpCurrentCard) == null ? void 0 : e.left, "pages-config": o.onboardingStore.onboardings.ampOnboarding.config, "pointer-position": (i = o.onboardingStore.getAmpCurrentCard) == null ? void 0 : i.position, "right-position": (a = o.onboardingStore.getAmpCurrentCard) == null ? void 0 : a.right, "top-position": (s = o.onboardingStore.getAmpCurrentCard) == null ? void 0 : s.top }, on: { backButtonClick: o.handleBack, close: function(b) {
|
|
7
8
|
return o.onboardingStore.close("ampOnboarding");
|
|
8
|
-
}, nextButtonClick: o.handleNext } }) :
|
|
9
|
-
}, m = [],
|
|
9
|
+
}, nextButtonClick: o.handleNext } }) : t._e();
|
|
10
|
+
}, m = [], l = /* @__PURE__ */ g(
|
|
10
11
|
d,
|
|
11
|
-
|
|
12
|
+
c,
|
|
12
13
|
m,
|
|
13
14
|
!1,
|
|
14
15
|
null,
|
|
15
|
-
|
|
16
|
+
"6bcaca8a"
|
|
16
17
|
);
|
|
17
|
-
const
|
|
18
|
+
const S = l.exports;
|
|
18
19
|
export {
|
|
19
|
-
|
|
20
|
+
S as default
|
|
20
21
|
};
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import g from "./ItemsOnboarding.vue2.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import m from "../../../_virtual/_plugin-vue2_normalizer.js";
|
|
4
|
-
var
|
|
4
|
+
var c = function() {
|
|
5
5
|
var e, n, r, i, s, a;
|
|
6
6
|
var o = this, d = o._self._c, t = o._self._setupProxy;
|
|
7
|
-
return t.isVisible ? d(t.InOnboard, { key: "guido__items-onboard", staticClass: "w-21-s p-a z-11", class: (e = t.onboardingStore.getItemsCurrentCard) == null ? void 0 : e.classes, attrs: { id: "guido__items-onboard", "is-multiple-page": "", visible: "", "image-source": "", title: "", "bottom-position": (n = t.onboardingStore.getItemsCurrentCard) == null ? void 0 : n.bottom, "left-position": (r = t.onboardingStore.getItemsCurrentCard) == null ? void 0 : r.left, "pages-config": t.onboardingStore.onboardings.itemsOnboarding.config, "pointer-position": (i = t.onboardingStore.getItemsCurrentCard) == null ? void 0 : i.position, "right-position": (s = t.onboardingStore.getItemsCurrentCard) == null ? void 0 : s.right, "top-position": (a = t.onboardingStore.getItemsCurrentCard) == null ? void 0 : a.top }, on: { backButtonClick: t.handleBack, close: function(
|
|
7
|
+
return t.isVisible ? d(t.InOnboard, { key: "guido__items-onboard", staticClass: "w-21-s p-a z-11", class: (e = t.onboardingStore.getItemsCurrentCard) == null ? void 0 : e.classes, attrs: { id: "guido__items-onboard", "is-multiple-page": "", visible: "", "image-source": "", title: "", "bottom-position": (n = t.onboardingStore.getItemsCurrentCard) == null ? void 0 : n.bottom, "left-position": (r = t.onboardingStore.getItemsCurrentCard) == null ? void 0 : r.left, "pages-config": t.onboardingStore.onboardings.itemsOnboarding.config, "pointer-position": (i = t.onboardingStore.getItemsCurrentCard) == null ? void 0 : i.position, "right-position": (s = t.onboardingStore.getItemsCurrentCard) == null ? void 0 : s.right, "top-position": (a = t.onboardingStore.getItemsCurrentCard) == null ? void 0 : a.top }, on: { backButtonClick: t.handleBack, close: function(_) {
|
|
8
8
|
return t.onboardingStore.close("itemsOnboarding");
|
|
9
9
|
}, nextButtonClick: t.handleNext } }) : o._e();
|
|
10
|
-
},
|
|
10
|
+
}, l = [], b = /* @__PURE__ */ m(
|
|
11
11
|
g,
|
|
12
|
-
l,
|
|
13
12
|
c,
|
|
13
|
+
l,
|
|
14
14
|
!1,
|
|
15
15
|
null,
|
|
16
|
-
"
|
|
16
|
+
"bb3cca55"
|
|
17
17
|
);
|
|
18
|
-
const I =
|
|
18
|
+
const I = b.exports;
|
|
19
19
|
export {
|
|
20
20
|
I as default
|
|
21
21
|
};
|
|
@@ -1,46 +1,43 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import
|
|
3
|
-
import { useConfig as
|
|
1
|
+
import { defineComponent as b, ref as v, computed as o } from "vue";
|
|
2
|
+
import D from "../../wrappers/WpModal.vue.js";
|
|
3
|
+
import { useConfig as _ } from "../../../composables/useConfig.js";
|
|
4
4
|
import { useTranslations as y } from "../../../composables/useTranslations.js";
|
|
5
|
-
import { ACADEMY_LINKS as
|
|
5
|
+
import { ACADEMY_LINKS as m } from "../../../enums/academy.js";
|
|
6
6
|
import L from "../../../static/assets/onboarding-img.svg.js";
|
|
7
|
-
import { useOnboardingStore as
|
|
8
|
-
import { isAfterDate as
|
|
9
|
-
const
|
|
7
|
+
import { useOnboardingStore as h } from "../../../stores/onboarding.js";
|
|
8
|
+
import { isAfterDate as C } from "../../../utils/dateUtil.js";
|
|
9
|
+
const x = /* @__PURE__ */ b({
|
|
10
10
|
__name: "NewVersionPopup",
|
|
11
11
|
emits: ["onboarding-finished"],
|
|
12
|
-
setup(
|
|
13
|
-
const e = y(), t =
|
|
14
|
-
var l,
|
|
15
|
-
return (
|
|
16
|
-
}), n = o(() =>
|
|
17
|
-
|
|
18
|
-
)), f = o(() => n.value ? e("email-editor.onboarding-popup-sunsetted-title") : e("email-editor.onboarding-title")), g = o(() => n.value ? e("email-editor.onboarding-popup-sunsetted-description", {
|
|
19
|
-
sunsetDate: d.value,
|
|
20
|
-
academyLink: c.EMAIL_EDITOR
|
|
12
|
+
setup(w, { emit: i }) {
|
|
13
|
+
const e = y(), t = h(), a = v(!0), { config: s } = _(), p = o(() => {
|
|
14
|
+
var l, u;
|
|
15
|
+
return (u = (l = s.value) == null ? void 0 : l.editor) == null ? void 0 : u.migrationDate;
|
|
16
|
+
}), n = o(() => C(p.value || 0)), c = o(() => n.value ? e("email-editor.onboarding-popup-sunsetted-title") : e("email-editor.onboarding-title")), f = o(() => n.value ? e("email-editor.onboarding-popup-sunsetted-description", {
|
|
17
|
+
academyLink: m.EMAIL_EDITOR
|
|
21
18
|
}) : e("email-editor.onboarding-description", {
|
|
22
|
-
academyLink:
|
|
23
|
-
})),
|
|
19
|
+
academyLink: m.EMAIL_EDITOR
|
|
20
|
+
})), d = o(() => n.value ? e("products.cancel") : e("products.remind-me-later")), g = o(() => ({
|
|
24
21
|
primaryButton: {
|
|
25
22
|
type: "primary",
|
|
26
23
|
labelText: e("left-menu.discover-now")
|
|
27
24
|
},
|
|
28
25
|
secondaryButton: {
|
|
29
26
|
type: "subtle-primary",
|
|
30
|
-
labelText:
|
|
27
|
+
labelText: d.value
|
|
31
28
|
}
|
|
32
29
|
})), r = () => {
|
|
33
|
-
|
|
30
|
+
a.value = !1, i("onboarding-finished");
|
|
34
31
|
};
|
|
35
|
-
return { __sfc: !0, emit:
|
|
32
|
+
return { __sfc: !0, emit: i, trans: e, onboardingStore: t, isVisible: a, config: s, migrationDate: p, isAfterMigrationDate: n, popupTitle: c, popupDescription: f, secondaryButtonLabel: d, footerButtonOptions: g, closePopup: r, handleDiscoverNow: () => {
|
|
36
33
|
t.onDiscoverNowClicked(), r();
|
|
37
34
|
}, handleRemindLater: () => {
|
|
38
35
|
t.onRemindMeLater(), r();
|
|
39
36
|
}, handleClose: () => {
|
|
40
37
|
t.onNewVersionPopupClose(), r();
|
|
41
|
-
}, WpModal:
|
|
38
|
+
}, WpModal: D, onboardingImageSvg: L };
|
|
42
39
|
}
|
|
43
40
|
});
|
|
44
41
|
export {
|
|
45
|
-
|
|
42
|
+
x as default
|
|
46
43
|
};
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import g from "./VersionHistoryOnboarding.vue2.js";
|
|
2
|
+
/* empty css */
|
|
2
3
|
import l from "../../../_virtual/_plugin-vue2_normalizer.js";
|
|
3
4
|
var c = function() {
|
|
4
|
-
var
|
|
5
|
+
var t, n, i, e, s, a;
|
|
5
6
|
var r = this, d = r._self._c, o = r._self._setupProxy;
|
|
6
|
-
return o.isVisible ? d(o.InOnboard, { key: "guido__version-history-onboard", staticClass: "w-21-s p-a z-11", class: (
|
|
7
|
+
return o.isVisible ? d(o.InOnboard, { key: "guido__version-history-onboard", staticClass: "w-21-s p-a z-11", class: (t = o.onboardingStore.getVersionHistoryCurrentCard) == null ? void 0 : t.classes, attrs: { id: "guido__version-history-onboard", "is-multiple-page": "", visible: "", "image-source": "", title: "", "bottom-position": (n = o.onboardingStore.getVersionHistoryCurrentCard) == null ? void 0 : n.bottom, "left-position": (i = o.onboardingStore.getVersionHistoryCurrentCard) == null ? void 0 : i.left, "pages-config": o.onboardingStore.onboardings.versionHistoryOnboarding.config, "pointer-position": (e = o.onboardingStore.getVersionHistoryCurrentCard) == null ? void 0 : e.position, "right-position": (s = o.onboardingStore.getVersionHistoryCurrentCard) == null ? void 0 : s.right, "top-position": (a = o.onboardingStore.getVersionHistoryCurrentCard) == null ? void 0 : a.top }, on: { backButtonClick: o.handleBack, close: function(u) {
|
|
7
8
|
return o.onboardingStore.close("versionHistoryOnboarding");
|
|
8
9
|
}, nextButtonClick: o.handleNext } }) : r._e();
|
|
9
|
-
},
|
|
10
|
+
}, p = [], _ = /* @__PURE__ */ l(
|
|
10
11
|
g,
|
|
11
12
|
c,
|
|
12
|
-
|
|
13
|
+
p,
|
|
13
14
|
!1,
|
|
14
15
|
null,
|
|
15
|
-
|
|
16
|
+
"9bdef600"
|
|
16
17
|
);
|
|
17
|
-
const
|
|
18
|
+
const y = _.exports;
|
|
18
19
|
export {
|
|
19
|
-
|
|
20
|
+
y as default
|
|
20
21
|
};
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { migrateCheckbox as
|
|
1
|
+
import { migrateCheckbox as t } from "./checkboxMigrator.js";
|
|
2
2
|
import { migrateCouponBlock as i } from "./couponBlockMigrator.js";
|
|
3
3
|
import { migrateItemsBlock as e } from "./itemsBlockMigrator.js";
|
|
4
4
|
import { migrateRadioButton as a } from "./radioButtonMigrator.js";
|
|
5
|
-
import { migrateRecommendation as
|
|
5
|
+
import { migrateRecommendation as c } from "./recommendationMigrator.js";
|
|
6
|
+
import { migrateSocialIcons as g } from "./socialIconMigrator.js";
|
|
6
7
|
import { migrateUnsubscribe as n } from "./unsubscribeMigrator.js";
|
|
7
|
-
const
|
|
8
|
-
let m =
|
|
9
|
-
return m =
|
|
8
|
+
const k = async (o, r = {}) => {
|
|
9
|
+
let m = o;
|
|
10
|
+
return m = t(m), m = a(m), m = await n(m), m = i(m), m = c(m, r), m = e(m), m = g(m), m;
|
|
10
11
|
};
|
|
11
12
|
export {
|
|
12
|
-
|
|
13
|
+
k as migrate
|
|
13
14
|
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
var u = Object.defineProperty;
|
|
2
|
+
var T = (e, t, r) => t in e ? u(e, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[t] = r;
|
|
3
|
+
var s = (e, t, r) => T(e, typeof t != "symbol" ? t + "" : t, r);
|
|
4
|
+
const i = "twitter", E = "xcom", o = "esd-tmp-icon-type", p = new RegExp(i, "i");
|
|
5
|
+
class g {
|
|
6
|
+
constructor() {
|
|
7
|
+
s(this, "parser");
|
|
8
|
+
this.parser = new DOMParser();
|
|
9
|
+
}
|
|
10
|
+
migrate(t) {
|
|
11
|
+
try {
|
|
12
|
+
if (!p.test(t))
|
|
13
|
+
return t;
|
|
14
|
+
const r = this.parser.parseFromString(t, "text/html"), a = r.querySelectorAll(`[${o}]`);
|
|
15
|
+
let n = !1;
|
|
16
|
+
return a.forEach((c) => {
|
|
17
|
+
String(c.getAttribute(o)).toLowerCase() === i && (c.setAttribute(o, E), n = !0);
|
|
18
|
+
}), n ? r.documentElement.outerHTML : t;
|
|
19
|
+
} catch (r) {
|
|
20
|
+
return console.error("SocialIconMigrator failed:", r), t;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function _(e) {
|
|
25
|
+
return new g().migrate(e);
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
_ as migrateSocialIcons
|
|
29
|
+
};
|
package/dist/enums/academy.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const e = "https://academy.insiderone.com
|
|
1
|
+
const e = "https://academy.insiderone.com", o = {
|
|
2
2
|
EMAIL_EDITOR: `${e}/docs/email-drag-and-drop-editor`,
|
|
3
3
|
GLOBAL_UNSUBSCRIBE: `${e}/docs/global-unsubscribe-preference-center`,
|
|
4
4
|
AMP_FOR_EMAILS: `${e}/docs/amp-for-emails`
|
package/dist/enums/date.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { ModificationDescription as
|
|
2
|
-
import { CommonControl as
|
|
3
|
-
import { ItemsBlockControlId as R, ItemsBlockId as
|
|
4
|
-
import { productPairs as
|
|
5
|
-
import { getItemsBlockConfig as
|
|
6
|
-
const
|
|
1
|
+
import { ModificationDescription as C, UIElementType as _, UEAttr as L } from "../../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
|
|
2
|
+
import { CommonControl as D } from "../../../common-control.js";
|
|
3
|
+
import { ItemsBlockControlId as R, ItemsBlockId as I } from "../../enums/controlEnums.js";
|
|
4
|
+
import { productPairs as p } from "../../enums/productEnums.js";
|
|
5
|
+
import { getItemsBlockConfig as l, setItemsBlockConfig as h, escapeReplacement as g } from "../../utils/nodeConfigUtils.js";
|
|
6
|
+
const O = R.PRICE_FORMATTED_PRICE, a = {
|
|
7
7
|
FORMATTED_PRICE: "formattedPrice"
|
|
8
8
|
};
|
|
9
|
-
class k extends
|
|
9
|
+
class k extends D {
|
|
10
10
|
getId() {
|
|
11
|
-
return
|
|
11
|
+
return O;
|
|
12
12
|
}
|
|
13
13
|
getTemplate() {
|
|
14
14
|
return `
|
|
@@ -18,56 +18,58 @@ class k extends h {
|
|
|
18
18
|
`;
|
|
19
19
|
}
|
|
20
20
|
onRender() {
|
|
21
|
-
const
|
|
22
|
-
this.api.updateValues({ [
|
|
23
|
-
this._onFormattedPriceChange(
|
|
21
|
+
const e = l(this.currentNode);
|
|
22
|
+
this.api.updateValues({ [a.FORMATTED_PRICE]: (e == null ? void 0 : e.priceFormatted) ?? !0 }), this.api.onValueChanged(a.FORMATTED_PRICE, (t) => {
|
|
23
|
+
this._onFormattedPriceChange(t);
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
|
-
onTemplateNodeUpdated(
|
|
27
|
-
super.onTemplateNodeUpdated(
|
|
28
|
-
const
|
|
29
|
-
this.api.updateValues({ [
|
|
26
|
+
onTemplateNodeUpdated(e) {
|
|
27
|
+
super.onTemplateNodeUpdated(e), this.handleBlockInstanceChange(() => {
|
|
28
|
+
const t = l(this.currentNode);
|
|
29
|
+
this.api.updateValues({ [a.FORMATTED_PRICE]: (t == null ? void 0 : t.priceFormatted) ?? !0 });
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
|
-
_onFormattedPriceChange(
|
|
33
|
-
if (console.debug("Formatted price changed to: ",
|
|
32
|
+
_onFormattedPriceChange(e) {
|
|
33
|
+
if (console.debug("Formatted price changed to: ", e), !this.currentNode)
|
|
34
34
|
return;
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
const t = l(this.currentNode), n = (t == null ? void 0 : t.type) ?? "CART_ITEMS", o = (t == null ? void 0 : t.priceSinglePrice) ?? !1, r = p.PAIRS_FOR_EXTENSION.price[n], i = p.PAIRS_FOR_EXTENSION.originalPrice[n], [E, m] = e ? [
|
|
36
|
+
o ? r.DEFAULT_SINGLE_PRICE : r.DEFAULT_PRICE,
|
|
37
|
+
o ? r.DEFAULT_SINGLE_PRICE_FORMATTED : r.DEFAULT_PRICE_FORMATTED
|
|
38
38
|
] : [
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
],
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
39
|
+
o ? r.DEFAULT_SINGLE_PRICE_FORMATTED : r.DEFAULT_PRICE_FORMATTED,
|
|
40
|
+
o ? r.DEFAULT_SINGLE_PRICE : r.DEFAULT_PRICE
|
|
41
|
+
], T = o ? i.DEFAULT_SINGLE_PRICE : i.DEFAULT_PRICE, P = o ? i.DEFAULT_SINGLE_PRICE_FORMATTED : i.DEFAULT_PRICE_FORMATTED, [F, A] = e ? [T, P] : [P, T], s = this.api.getDocumentModifier();
|
|
42
|
+
h(this.currentNode, this.api, { priceFormatted: e }, s);
|
|
43
|
+
const c = this.currentNode.closest(".items-block");
|
|
44
|
+
((c == null ? void 0 : c.querySelectorAll(
|
|
45
|
+
`[esd-extension-block-id="${I.PRICE}"]`
|
|
46
|
+
)) || []).forEach((d) => {
|
|
47
|
+
this._updatePriceBlock(s, d, E, m, e);
|
|
48
|
+
}), ((c == null ? void 0 : c.querySelectorAll(
|
|
49
|
+
`[esd-extension-block-id="${I.ORIGINAL_PRICE}"]`
|
|
50
|
+
)) || []).forEach((d) => {
|
|
51
|
+
this._updatePriceBlock(s, d, F, A, e);
|
|
52
|
+
}), s.apply(new C(
|
|
53
|
+
`Updated price to ${e ? "formatted" : "unformatted"}`
|
|
52
54
|
));
|
|
53
55
|
}
|
|
54
|
-
_updatePriceBlock(
|
|
55
|
-
const r =
|
|
56
|
-
|
|
56
|
+
_updatePriceBlock(e, t, n, o, r) {
|
|
57
|
+
const i = `data-formated="${r ? "true" : "false"}"`, E = t.getInnerHTML().trim().replace(n, g(o)).replace(/data-formated=(?:"[^"]*"|'[^']*')/g, i);
|
|
58
|
+
e.modifyHtml(t).setInnerHtml(E);
|
|
57
59
|
}
|
|
58
60
|
_getFormattedPrice() {
|
|
59
61
|
return `
|
|
60
62
|
<div class="display-flex align-items-center justify-content-between">
|
|
61
|
-
<${
|
|
62
|
-
${
|
|
63
|
+
<${_.LABEL}
|
|
64
|
+
${L.LABEL.text}="${this.api.translate("Formatted Price (e.g. $9.90)")}"
|
|
63
65
|
>
|
|
64
|
-
</${
|
|
65
|
-
${this._GuToggle(
|
|
66
|
+
</${_.LABEL}>
|
|
67
|
+
${this._GuToggle(a.FORMATTED_PRICE)}
|
|
66
68
|
</div>
|
|
67
69
|
`;
|
|
68
70
|
}
|
|
69
71
|
}
|
|
70
72
|
export {
|
|
71
|
-
|
|
73
|
+
O as CONTROL_BLOCK_ID,
|
|
72
74
|
k as PriceFormattedPriceControl
|
|
73
75
|
};
|
package/dist/guido.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-73199fa4] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-
|
|
1
|
+
.gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-73199fa4] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-10599c37]{position:relative;display:inline-block}.new-tag[data-v-10599c37]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-10599c37] .guido__view-option-selection-desktop svg,[data-v-10599c37] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-10599c37] .in-segments-wrapper__button_selected,[data-v-10599c37] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-fad98586]{gap:8px}.version-history__toolbar[data-v-fad98586]{gap:4px}.view-options-wrapper[data-v-38eb0a73]{position:relative;display:inline-block}.new-tag[data-v-38eb0a73]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-38eb0a73] .guido__verion-history-view-option-selection-desktop svg,[data-v-38eb0a73] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-38eb0a73] .in-segments-wrapper__button_selected,[data-v-38eb0a73] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.auto-save-toggle[data-v-2c964af4]{position:relative}.auto-save-toggle__info-box[data-v-2c964af4]{position:absolute;top:100%;left:0;z-index:10;width:280px}.editor-actions[data-v-6e711fd7]{gap:4px}.header-wrapper[data-v-d11dd577]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-50dac6de]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-50dac6de]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-50dac6de]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-91a26acd]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-91a26acd]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-91a26acd]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-91a26acd]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-91a26acd]{object-fit:cover;transform:scale(1)}[data-v-b9a93c6e] .guido__verion-history-view-option-selection-desktop svg,[data-v-b9a93c6e] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-b9a93c6e] .in-segments-wrapper__button_selected,[data-v-b9a93c6e] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-06afaecb]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-06afaecb]{min-height:504px}.iframe-wrapper[data-v-cbafc185]{width:258px}.iframe-scaled[data-v-cbafc185]{width:320px;height:124.0310077519%;transform:scale(.80625);transform-origin:top left}.cropped-text[data-v-eb3d05d7]{width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-preview-wrapper__phone[data-v-3f472f96]{width:282px}.mobile-preview-wrapper__phone img[data-v-3f472f96]{object-fit:cover;border-radius:44px}.mobile-preview-wrapper__content[data-v-3f472f96]{width:258px;height:450px;left:12px}[data-v-6bcaca8a] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-f16f20f8] .vueperslides__bullets{pointer-events:none!important}[data-v-f16f20f8] .vueperslides__parallax-wrapper{padding-bottom:110px!important}[data-v-bb3cca55] .vueperslides__bullets{pointer-events:none!important}[data-v-bb3cca55] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-b09e80c4] .vueperslides__bullets{pointer-events:none!important}[data-v-b09e80c4] .vueperslides__parallax-wrapper{height:110px!important;padding-bottom:110px!important}[data-v-9bdef600] .vueperslides__parallax-wrapper{padding-bottom:110px!important}
|
|
@@ -245,10 +245,9 @@ export declare const TemplateSchema: v.ObjectSchema<{
|
|
|
245
245
|
}, undefined>, undefined>, readonly []>;
|
|
246
246
|
/**
|
|
247
247
|
* Partner-keyed set of dynamic-content items the account offers, e.g.
|
|
248
|
-
* `{ [partnerName]: [{ text, value, children }] }`. Guido flattens
|
|
249
|
-
* (
|
|
250
|
-
*
|
|
251
|
-
* saved modules.
|
|
248
|
+
* `{ [partnerName]: [{ text, value, children }] }`. Guido flattens the active
|
|
249
|
+
* (first) partner's leaf attributes into the label→token map that repairs
|
|
250
|
+
* label-form placeholders (`{{ Phone Number }}`) in dropped saved modules.
|
|
252
251
|
*/
|
|
253
252
|
readonly dynamicContentList: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.SchemaWithFallback<v.ArraySchema<v.GenericSchema<DynamicContentNode>, undefined>, readonly []>, undefined>, {}>;
|
|
254
253
|
/** Valid custom field attribute names from the partner's categorized fields */
|
|
@@ -648,10 +647,9 @@ export declare const GuidoConfigSchema: v.ObjectSchema<{
|
|
|
648
647
|
}, undefined>, undefined>, readonly []>;
|
|
649
648
|
/**
|
|
650
649
|
* Partner-keyed set of dynamic-content items the account offers, e.g.
|
|
651
|
-
* `{ [partnerName]: [{ text, value, children }] }`. Guido flattens
|
|
652
|
-
* (
|
|
653
|
-
*
|
|
654
|
-
* saved modules.
|
|
650
|
+
* `{ [partnerName]: [{ text, value, children }] }`. Guido flattens the active
|
|
651
|
+
* (first) partner's leaf attributes into the label→token map that repairs
|
|
652
|
+
* label-form placeholders (`{{ Phone Number }}`) in dropped saved modules.
|
|
655
653
|
*/
|
|
656
654
|
readonly dynamicContentList: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.SchemaWithFallback<v.ArraySchema<v.GenericSchema<DynamicContentNode>, undefined>, readonly []>, undefined>, {}>;
|
|
657
655
|
/** Valid custom field attribute names from the partner's categorized fields */
|
|
@@ -28,7 +28,7 @@ export type DynamicContentNode = {
|
|
|
28
28
|
/**
|
|
29
29
|
* Partner-keyed dynamic-content list. Architect is multi-partner, so the map is
|
|
30
30
|
* keyed by partner name; each entry is that partner's category tree. Guido
|
|
31
|
-
* flattens
|
|
31
|
+
* flattens the active (first) partner's leaf attributes into a `DynamicContent[]`.
|
|
32
32
|
*/
|
|
33
33
|
export type DynamicContentList = Record<string, DynamicContentNode[]>;
|
|
34
34
|
export type MergeTag = BaseDynamicContent & {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function migrateSocialIcons(html: string): string;
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* for easy maintenance and domain migration.
|
|
6
6
|
*/
|
|
7
7
|
export declare const ACADEMY_LINKS: {
|
|
8
|
-
readonly EMAIL_EDITOR: "https://academy.insiderone.com
|
|
9
|
-
readonly GLOBAL_UNSUBSCRIBE: "https://academy.insiderone.com
|
|
10
|
-
readonly AMP_FOR_EMAILS: "https://academy.insiderone.com
|
|
8
|
+
readonly EMAIL_EDITOR: "https://academy.insiderone.com/docs/email-drag-and-drop-editor";
|
|
9
|
+
readonly GLOBAL_UNSUBSCRIBE: "https://academy.insiderone.com/docs/global-unsubscribe-preference-center";
|
|
10
|
+
readonly AMP_FOR_EMAILS: "https://academy.insiderone.com/docs/amp-for-emails";
|
|
11
11
|
};
|
|
12
12
|
export type AcademyLinkKey = keyof typeof ACADEMY_LINKS;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
/** Production default — pony-express builds unsubscribe links on mail.useinsider.com. */
|
|
2
|
+
export declare const DEFAULT_ENVIRONMENT_PREFIX = "useinsider";
|
|
1
3
|
/**
|
|
2
|
-
* Gets the
|
|
3
|
-
*
|
|
4
|
+
* Gets the environment prefix by parsing the current hostname (third segment),
|
|
5
|
+
* falling back to the production default when that segment is absent or empty —
|
|
6
|
+
* so unsubscribe links never compile to `https://mail.undefined.com/...` (SD-145225).
|
|
4
7
|
*/
|
|
5
8
|
export declare const getEnvironmentPrefix: () => string;
|
package/dist/utils/dateUtil.js
CHANGED
|
@@ -1,19 +1,10 @@
|
|
|
1
|
-
import { DEFAULT_LOCALE as r, DEFAULT as
|
|
2
|
-
const
|
|
1
|
+
import { DEFAULT_LOCALE as r, DEFAULT as o } from "../enums/date.js";
|
|
2
|
+
const c = () => {
|
|
3
3
|
const t = window.l10n;
|
|
4
|
-
return (t == null ? void 0 : t.locale) ===
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}, D = (t, e = s(), n = f()) => {
|
|
9
|
-
const o = {
|
|
10
|
-
year: "numeric",
|
|
11
|
-
month: "2-digit",
|
|
12
|
-
day: "2-digit",
|
|
13
|
-
timeZone: n
|
|
14
|
-
}, i = m(t);
|
|
15
|
-
return new Intl.DateTimeFormat(e, o).format(i);
|
|
16
|
-
}, T = (t) => {
|
|
4
|
+
return (t == null ? void 0 : t.locale) === o ? r : (t == null ? void 0 : t.locale) || r;
|
|
5
|
+
};
|
|
6
|
+
new Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
7
|
+
const i = (t) => {
|
|
17
8
|
if (!t)
|
|
18
9
|
return "";
|
|
19
10
|
const e = new Date(t);
|
|
@@ -25,13 +16,9 @@ const m = (t) => t ? t instanceof Date ? t : typeof t == "string" ? t.length ===
|
|
|
25
16
|
second: "2-digit",
|
|
26
17
|
hour12: !1
|
|
27
18
|
}).format(e);
|
|
28
|
-
},
|
|
19
|
+
}, m = (t) => t ? Math.floor(Date.now() / 1e3) >= t : !1;
|
|
29
20
|
export {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
h as isAfterDate,
|
|
34
|
-
u as localTz,
|
|
35
|
-
s as locale,
|
|
36
|
-
f as timezone
|
|
21
|
+
i as formatPatchDate,
|
|
22
|
+
m as isAfterDate,
|
|
23
|
+
c as locale
|
|
37
24
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@useinsider/guido",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.12.0-beta.00cbb4c",
|
|
4
4
|
"description": "Guido is a Vue + TypeScript wrapper for Email Plugin. Easily embed the email editor in your Vue applications.",
|
|
5
5
|
"main": "./dist/guido.umd.cjs",
|
|
6
6
|
"module": "./dist/library.js",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"license": "ISC",
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"@stripoinc/ui-editor-extensions": "3.8.0",
|
|
47
|
-
"@useinsider/design-system-vue": "
|
|
47
|
+
"@useinsider/design-system-vue": "2.0.0",
|
|
48
48
|
"@vueuse/core": "11.3.0",
|
|
49
49
|
"lodash-es": "4.17.21",
|
|
50
50
|
"pinia": "2.3.1",
|