@useinsider/guido 1.0.0-beta.c2acdd4 → 1.0.0-beta.c674114

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/@types/generic.d.ts +6 -0
  2. package/dist/components/Guido.vue.js +8 -8
  3. package/dist/components/Guido.vue2.js +32 -36
  4. package/dist/components/organisms/header/MiddleSlot.vue.js +7 -7
  5. package/dist/components/organisms/header/MiddleSlot.vue2.js +15 -17
  6. package/dist/components/organisms/header/RightSlot.vue.js +7 -7
  7. package/dist/components/organisms/header/RightSlot.vue2.js +24 -24
  8. package/dist/composables/useActionsApi.d.ts +1 -2
  9. package/dist/composables/useActionsApi.js +35 -45
  10. package/dist/composables/useHttp.js +21 -23
  11. package/dist/guido.css +1 -1
  12. package/dist/stores/editor.d.ts +1 -1
  13. package/dist/stores/editor.js +4 -4
  14. package/dist/utils/tooltipUtils.d.ts +2 -0
  15. package/dist/utils/tooltipUtils.js +9 -0
  16. package/package.json +3 -1
  17. package/dist/components/organisms/save-template/SaveTemplateModal.vue.d.ts +0 -16
  18. package/dist/components/organisms/save-template/SaveTemplateModal.vue.js +0 -20
  19. package/dist/components/organisms/save-template/SaveTemplateModal.vue2.js +0 -78
  20. package/dist/components/wrappers/ModalWrapper.vue.d.ts +0 -72
  21. package/dist/components/wrappers/ModalWrapper.vue.js +0 -19
  22. package/dist/components/wrappers/ModalWrapper.vue2.js +0 -43
  23. package/dist/composables/useSaveAsTemplate.d.ts +0 -7
  24. package/dist/composables/useSaveAsTemplate.js +0 -51
  25. package/dist/composables/useTemplateNameValidation.d.ts +0 -7
  26. package/dist/composables/useTemplateNameValidation.js +0 -33
  27. package/dist/mock/api/template-library.d.ts +0 -2
  28. package/dist/stores/template-categories.d.ts +0 -41
  29. package/dist/stores/template-categories.js +0 -91
  30. package/dist/utils/base64.d.ts +0 -2
  31. package/dist/utils/base64.js +0 -14
  32. package/dist/utils/generic.d.ts +0 -1
  33. package/dist/utils/generic.js +0 -7
  34. package/dist/utils/textUtil.d.ts +0 -2
@@ -9,3 +9,9 @@ export type DynamicContent = {
9
9
  text: string;
10
10
  fallback?: string;
11
11
  };
12
+ export interface TooltipOptions {
13
+ id: string;
14
+ dynamicPosition: boolean;
15
+ staticPosition: 'top' | 'bottom' | 'left' | 'right';
16
+ iconStatus: boolean;
17
+ }
@@ -1,18 +1,18 @@
1
1
  import o from "./Guido.vue2.js";
2
2
  /* empty css */
3
- import a from "../_virtual/_plugin-vue2_normalizer.js";
3
+ import i from "../_virtual/_plugin-vue2_normalizer.js";
4
4
  var s = function() {
5
- var t = this, e = t._self._c, r = t._self._setupProxy;
6
- return e("div", { staticClass: "guido-editor__wrapper" }, [e(r.HeaderWrapper), e("div", { staticClass: "guido-editor__container", attrs: { id: "guido-editor" } }), e(r.SaveTemplateModal, { attrs: { "is-open": r.editorStore.isSaveTemplateModalOpen }, on: { close: r.handleCloseSaveTemplateModal } })], 1);
7
- }, i = [], n = /* @__PURE__ */ a(
5
+ var e = this, r = e._self._c, t = e._self._setupProxy;
6
+ return r("div", { staticClass: "guido-editor__wrapper" }, [r(t.HeaderWrapper), r("div", { staticClass: "guido-editor__container", attrs: { id: "guido-editor" } })], 1);
7
+ }, _ = [], a = /* @__PURE__ */ i(
8
8
  o,
9
9
  s,
10
- i,
10
+ _,
11
11
  !1,
12
12
  null,
13
- "66fa3f35"
13
+ "89bedf08"
14
14
  );
15
- const c = n.exports;
15
+ const f = a.exports;
16
16
  export {
17
- c as default
17
+ f as default
18
18
  };
@@ -1,13 +1,11 @@
1
- import { defineComponent as w, onMounted as E } from "vue";
2
- import { provideGuidoActions as T } from "../composables/useGuidoActions.js";
3
- import { usePartner as D } from "../composables/usePartner.js";
4
- import { useStripo as _ } from "../composables/useStripo.js";
5
- import { DefaultUsername as G, DefaultGuidoConfig as I } from "../enums/defaults.js";
6
- import k from "./organisms/header/HeaderWrapper.vue.js";
7
- import M from "./organisms/save-template/SaveTemplateModal.vue.js";
8
- import { useStripoApi as P } from "../services/stripoApi.js";
9
- import { useEditorStore as N } from "../stores/editor.js";
10
- const O = /* @__PURE__ */ w({
1
+ import { defineComponent as h, onMounted as w } from "vue";
2
+ import { provideGuidoActions as D } from "../composables/useGuidoActions.js";
3
+ import { usePartner as E } from "../composables/usePartner.js";
4
+ import { useStripo as S } from "../composables/useStripo.js";
5
+ import { DefaultUsername as _, DefaultGuidoConfig as G } from "../enums/defaults.js";
6
+ import I from "./organisms/header/HeaderWrapper.vue.js";
7
+ import { useStripoApi as k } from "../services/stripoApi.js";
8
+ const B = /* @__PURE__ */ h({
11
9
  __name: "Guido",
12
10
  props: {
13
11
  templateId: null,
@@ -20,65 +18,63 @@ const O = /* @__PURE__ */ w({
20
18
  guidoConfig: null
21
19
  },
22
20
  emits: ["dynamic-content:open", "back", "save:start", "save:complete"],
23
- setup(b, { expose: S, emit: o }) {
24
- const t = b, { getPartnerName: n, getProductType: a } = D(), {
21
+ setup(C, { expose: b, emit: t }) {
22
+ const o = C, { getPartnerName: n, getProductType: a } = E(), {
25
23
  templateId: c,
26
24
  userId: s,
27
- guidoConfig: r,
28
- html: i = "",
25
+ guidoConfig: i,
26
+ html: r = "",
29
27
  css: l = "",
30
28
  partnerName: d = n(),
31
- productType: m = a(),
32
- username: u = G
33
- } = t;
29
+ productType: u = a(),
30
+ username: m = _
31
+ } = o;
34
32
  window.GuidoConfig = {
35
- ...I,
36
- ...r
33
+ ...G,
34
+ ...i
37
35
  };
38
- const { initPlugin: p } = _({ emailId: c, userId: s, username: u, partnerName: d, productType: m }), { getDefaultTemplate: f } = P();
39
- T({
36
+ const { initPlugin: p } = S({ emailId: c, userId: s, username: m, partnerName: d, productType: u }), { getDefaultTemplate: g } = k();
37
+ D({
40
38
  onBack: () => {
41
- console.debug("guido:back"), o("back");
39
+ console.debug("guido:back"), t("back");
42
40
  },
43
41
  onSaveStart: () => {
44
- console.debug("guido:save:start"), o("save:start");
42
+ console.debug("guido:save:start"), t("save:start");
45
43
  },
46
44
  onSaveComplete: (e) => {
47
- console.debug("guido:save:complete", e), o("save:complete", e);
45
+ console.debug("guido:save:complete", e), t("save:complete", e);
48
46
  }
49
47
  });
50
- const g = N(), h = () => {
51
- g.isSaveTemplateModalOpen = !1;
52
- }, v = (e) => {
48
+ const f = (e) => {
53
49
  console.debug("dynamic-content:close", e), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: e }));
54
50
  }, y = () => {
55
51
  console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
56
52
  };
57
- return E(async () => {
53
+ return w(async () => {
58
54
  console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow");
59
55
  try {
60
56
  let e = {
61
- html: i,
57
+ html: r,
62
58
  css: l,
63
59
  forceRecreate: !0
64
60
  // TODO: It should be false for old templates. We will communicate with Stripo
65
61
  };
66
- e.html || (e = await f()), await p(e);
62
+ e.html || (e = await g()), await p(e);
67
63
  } catch (e) {
68
64
  console.error("Failed to initialize Stripo editor:", e);
69
65
  }
70
66
  document.addEventListener("dynamic-content:open", (e) => {
71
- const C = e;
72
- console.debug("dynamic-content:open", C.detail), o("dynamic-content:open", C.detail);
67
+ const v = e;
68
+ console.debug("dynamic-content:open", v.detail), t("dynamic-content:open", v.detail);
73
69
  });
74
- }), S({
70
+ }), b({
75
71
  dynamicContent: {
76
- insert: v,
72
+ insert: f,
77
73
  close: y
78
74
  }
79
- }), { __sfc: !0, props: t, getPartnerName: n, getProductType: a, templateId: c, userId: s, guidoConfig: r, html: i, css: l, partnerName: d, productType: m, username: u, emit: o, initPlugin: p, getDefaultTemplate: f, editorStore: g, handleCloseSaveTemplateModal: h, insertDynamicContent: v, closeDynamicContent: y, HeaderWrapper: k, SaveTemplateModal: M };
75
+ }), { __sfc: !0, props: o, getPartnerName: n, getProductType: a, templateId: c, userId: s, guidoConfig: i, html: r, css: l, partnerName: d, productType: u, username: m, emit: t, initPlugin: p, getDefaultTemplate: g, insertDynamicContent: f, closeDynamicContent: y, HeaderWrapper: I };
80
76
  }
81
77
  });
82
78
  export {
83
- O as default
79
+ B as default
84
80
  };
@@ -1,17 +1,17 @@
1
- import s from "./MiddleSlot.vue2.js";
2
- import i from "../../../_virtual/_plugin-vue2_normalizer.js";
1
+ import i from "./MiddleSlot.vue2.js";
2
+ import s from "../../../_virtual/_plugin-vue2_normalizer.js";
3
3
  var n = function() {
4
4
  var e = this, o = e._self._c, t = e._self._setupProxy;
5
- return t.editorStore.isVersionHistoryOpen ? o("div", { staticClass: "d-f" }, [o(t.VersionHistory), o(t.VersionHistoryViewOptions)], 1) : o("div", { staticClass: "d-f" }, [o(t.InButtonV2, { attrs: { id: "guido__undo-button", "left-icon": "line-undo", styling: "ghost", type: "secondary", "label-text-status": !1 } }), o(t.InButtonV2, { attrs: { id: "guido__redo-button", "left-icon": "line-redo", styling: "ghost", type: "secondary", "label-text-status": !1 } }), o(t.InButtonV2, { attrs: { id: "guido__code-button", "data-testid": "Code Editor", "left-icon": "line-code", styling: "ghost", "tooltip-text": "Code Editor", type: "secondary", "label-text-status": !1, "selected-status": t.editorStore.isCodeEditorOpen, "tooltip-options": t.getTooltipOptions("guido__code-button") } }), o(t.InButtonV2, { attrs: { id: "guido__preview-button", "left-icon": "line-show-on", styling: "ghost", type: "secondary", "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__preview-button"), "tooltip-text": t.trans("newsletter.email-preview") } }), o(t.ViewOptions, { staticClass: "ml-3" })], 1);
6
- }, l = [], r = /* @__PURE__ */ i(
7
- s,
5
+ return t.editorStore.isVersionHistoryOpen ? o("div", { staticClass: "d-f" }, [o(t.VersionHistory), o(t.VersionHistoryViewOptions)], 1) : o("div", { staticClass: "d-f" }, [o(t.InButtonV2, { attrs: { id: "guido__undo-button", "left-icon": "line-undo", styling: "ghost", type: "secondary", "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__undo-button"), "tooltip-text": t.trans("action-builder.undo") } }), o(t.InButtonV2, { attrs: { id: "guido__redo-button", "left-icon": "line-redo", styling: "ghost", type: "secondary", "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__redo-button"), "tooltip-text": t.trans("action-builder.redo") } }), o(t.InButtonV2, { attrs: { id: "guido__code-button", "data-testid": "Code Editor", "left-icon": "line-code", styling: "ghost", type: "secondary", "label-text-status": !1, "selected-status": t.editorStore.isCodeEditorOpen, "tooltip-options": t.getTooltipOptions("guido__code-button"), "tooltip-text": t.codeEditorTooltipText } }), o(t.InButtonV2, { attrs: { id: "guido__preview-button", "left-icon": "line-show-on", styling: "ghost", type: "secondary", "label-text-status": !1, "selected-status": t.editorStore.isPreviewModeOpen, "tooltip-options": t.getTooltipOptions("guido__preview-button"), "tooltip-text": t.previewTooltipText }, on: { click: t.handlePreview } }), o(t.ViewOptions, { staticClass: "ml-3" })], 1);
6
+ }, l = [], r = /* @__PURE__ */ s(
7
+ i,
8
8
  n,
9
9
  l,
10
10
  !1,
11
11
  null,
12
12
  null
13
13
  );
14
- const p = r.exports;
14
+ const u = r.exports;
15
15
  export {
16
- p as default
16
+ u as default
17
17
  };
@@ -1,22 +1,20 @@
1
- import { defineComponent as r } from "vue";
2
- import { useTranslations as s } from "../../../composables/useTranslations.js";
3
- import { useEditorStore as n } from "../../../stores/editor.js";
4
- import { InButtonV2 as e } from "@useinsider/design-system-vue";
5
- import m from "./version-history/VersionHistory.vue.js";
6
- import p from "./version-history/ViewOptions.vue.js";
7
- import f from "./ViewOptions.vue.js";
8
- const y = /* @__PURE__ */ r({
1
+ import { defineComponent as s, computed as t } from "vue";
2
+ import { useTranslations as n } from "../../../composables/useTranslations.js";
3
+ import { useEditorStore as p } from "../../../stores/editor.js";
4
+ import { getTooltipOptions as m } from "../../../utils/tooltipUtils.js";
5
+ import { InButtonV2 as l } from "@useinsider/design-system-vue";
6
+ import d from "./version-history/VersionHistory.vue.js";
7
+ import w from "./version-history/ViewOptions.vue.js";
8
+ import c from "./ViewOptions.vue.js";
9
+ const M = /* @__PURE__ */ s({
9
10
  __name: "MiddleSlot",
10
- setup(a) {
11
- const o = n(), t = s();
12
- return { __sfc: !0, editorStore: o, trans: t, getTooltipOptions: (i) => ({
13
- id: `${i}-tooltip`,
14
- dynamicPosition: !1,
15
- staticPosition: "bottom center",
16
- iconStatus: !1
17
- }), InButtonV2: e, VersionHistory: m, VersionHistoryViewOptions: p, ViewOptions: f };
11
+ setup(f) {
12
+ const e = p(), o = n(), r = t(() => e.isCodeEditorOpen ? o("newsletter.close-html-editor") : o("newsletter.html-editor")), i = t(() => e.isPreviewModeOpen ? o("newsletter.close-email-preview") : o("newsletter.email-preview"));
13
+ return { __sfc: !0, editorStore: e, trans: o, codeEditorTooltipText: r, previewTooltipText: i, handlePreview: () => {
14
+ e.isPreviewModeOpen = !e.isPreviewModeOpen;
15
+ }, getTooltipOptions: m, InButtonV2: l, VersionHistory: d, VersionHistoryViewOptions: w, ViewOptions: c };
18
16
  }
19
17
  });
20
18
  export {
21
- y as default
19
+ M as default
22
20
  };
@@ -1,17 +1,17 @@
1
- import o from "./RightSlot.vue2.js";
1
+ import s from "./RightSlot.vue2.js";
2
2
  import i from "../../../_virtual/_plugin-vue2_normalizer.js";
3
3
  var n = function() {
4
- var s = this, e = s._self._c, t = s._self._setupProxy;
5
- return e("div", { staticClass: "d-f" }, [e(t.InButtonV2, { attrs: { id: "guido__history-button", "left-icon": "line-architect-version-history", styling: "ghost", type: "secondary", "label-text-status": !1, "selected-status": t.editorStore.isVersionHistoryOpen }, on: { click: t.handleVersionHistory } }), e(t.InButtonV2, { attrs: { id: "guido__export-button", "left-icon": "line-export", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryOpen, "label-text-status": !1 }, on: { click: t.exportHtml } }), e(t.InButtonV2, { attrs: { id: "guido__save-as-button", "left-icon": "line-newsletter-save-as-template", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryOpen, "label-text-status": !1 }, on: { click: t.handleSaveAsTemplate } }), e(t.InButtonV2, { attrs: { id: "guido__test-button", "left-icon": "line-architect-test-journey", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryOpen, "label-text-status": !1 } }), e(t.InButtonV2, { staticClass: "ml-3", attrs: { id: "guido__save-button", "label-text": "Save", "disabled-status": t.editorStore.isVersionHistoryOpen }, on: { click: t.handleSave } })], 1);
6
- }, a = [], r = /* @__PURE__ */ i(
7
- o,
4
+ var o = this, e = o._self._c, t = o._self._setupProxy;
5
+ return e("div", { staticClass: "d-f" }, [e(t.InButtonV2, { attrs: { id: "guido__history-button", "left-icon": "line-architect-version-history", styling: "ghost", type: "secondary", "label-text-status": !1, "selected-status": t.editorStore.isVersionHistoryOpen, "tooltip-options": t.getTooltipOptions("guido__history-button"), "tooltip-text": t.versionHistoryTooltipText }, on: { click: t.handleVersionHistory } }), e(t.InButtonV2, { attrs: { id: "guido__export-button", "left-icon": "line-export", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryOpen, "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__export-button"), "tooltip-text": t.trans("newsletter.export") }, on: { click: t.exportHtml } }), e(t.InButtonV2, { attrs: { id: "guido__save-as-button", "left-icon": "line-newsletter-save-as-template", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryOpen, "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__save-as-button"), "tooltip-text": t.trans("newsletter.save-templates") } }), e(t.InButtonV2, { attrs: { id: "guido__test-button", "left-icon": "line-architect-test-journey", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryOpen, "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__test-button"), "tooltip-text": t.trans("newsletter.test-email") } }), e(t.InButtonV2, { staticClass: "ml-3", attrs: { id: "guido__save-button", "label-text": "Save", "disabled-status": t.editorStore.isVersionHistoryOpen }, on: { click: t.handleSave } })], 1);
6
+ }, r = [], l = /* @__PURE__ */ i(
7
+ s,
8
8
  n,
9
- a,
9
+ r,
10
10
  !1,
11
11
  null,
12
12
  null
13
13
  );
14
- const u = r.exports;
14
+ const u = l.exports;
15
15
  export {
16
16
  u as default
17
17
  };
@@ -1,37 +1,37 @@
1
- import { defineComponent as m } from "vue";
2
- import { useActionsApi as p } from "../../../composables/useActionsApi.js";
3
- import { useExport as l } from "../../../composables/useExport.js";
4
- import { useSaveStart as c, useSaveComplete as d } from "../../../composables/useGuidoActions.js";
5
- import { useVersionHistoryApi as f } from "../../../composables/useVersionHistoryApi.js";
6
- import { useEditorStore as u } from "../../../stores/editor.js";
7
- import { InButtonV2 as S } from "@useinsider/design-system-vue";
8
- const T = /* @__PURE__ */ m({
1
+ import { defineComponent as l, computed as f } from "vue";
2
+ import { useActionsApi as u } from "../../../composables/useActionsApi.js";
3
+ import { useExport as d } from "../../../composables/useExport.js";
4
+ import { useSaveStart as y, useSaveComplete as v } from "../../../composables/useGuidoActions.js";
5
+ import { useTranslations as h } from "../../../composables/useTranslations.js";
6
+ import { useVersionHistoryApi as S } from "../../../composables/useVersionHistoryApi.js";
7
+ import { useEditorStore as H } from "../../../stores/editor.js";
8
+ import { getTooltipOptions as _ } from "../../../utils/tooltipUtils.js";
9
+ import { InButtonV2 as V } from "@useinsider/design-system-vue";
10
+ const R = /* @__PURE__ */ l({
9
11
  __name: "RightSlot",
10
- setup(h) {
11
- const { exportHtml: i } = l(), { getCompiledEmail: o } = p(), r = c(), s = d(), { openVersionHistory: n, closeVersionHistory: a } = f(), e = u();
12
- return { __sfc: !0, exportHtml: i, getCompiledEmail: o, saveStart: r, saveComplete: s, openVersionHistory: n, closeVersionHistory: a, editorStore: e, handleVersionHistory: () => {
13
- if (e.isVersionHistoryOpen) {
14
- a();
12
+ setup(g) {
13
+ const { exportHtml: p } = d(), { getCompiledEmail: r } = u(), s = y(), i = v(), { openVersionHistory: n, closeVersionHistory: m } = S(), o = H(), t = h(), a = () => {
14
+ if (o.isVersionHistoryOpen) {
15
+ m();
15
16
  return;
16
17
  }
17
18
  n();
18
- }, handleSaveAsTemplate: async () => {
19
- e.isSaveTemplateModalOpen = !0;
20
- }, handleSave: async () => {
21
- r();
19
+ }, c = f(() => o.isVersionHistoryOpen ? t("newsletter.close-version-history") : t("newsletter.version-history"));
20
+ return { __sfc: !0, exportHtml: p, getCompiledEmail: r, saveStart: s, saveComplete: i, openVersionHistory: n, closeVersionHistory: m, editorStore: o, trans: t, handleVersionHistory: a, versionHistoryTooltipText: c, handleSave: async () => {
21
+ s();
22
22
  try {
23
- const { html: t } = await o();
24
- s({
25
- html: t || "",
23
+ const { html: e } = await r();
24
+ i({
25
+ html: e || "",
26
26
  css: ""
27
27
  // CSS is embedded in HTML from Stripo
28
28
  });
29
- } catch (t) {
30
- console.error("Failed to get template data for save:", t);
29
+ } catch (e) {
30
+ console.error("Failed to get template data for save:", e);
31
31
  }
32
- }, InButtonV2: S };
32
+ }, getTooltipOptions: _, InButtonV2: V };
33
33
  }
34
34
  });
35
35
  export {
36
- T as default
36
+ R as default
37
37
  };
@@ -1,6 +1,5 @@
1
- import { GetCompiledEmailOptions, CompiledEmailResult, TemplateDataResult } from '@@/Types/actions-api';
1
+ import { GetCompiledEmailOptions, CompiledEmailResult } from '@@/Types/actions-api';
2
2
  export declare const useActionsApi: () => {
3
3
  getCompiledEmail: (options?: GetCompiledEmailOptions) => Promise<CompiledEmailResult>;
4
- getRawTemplateData: () => Promise<TemplateDataResult>;
5
4
  activateCustomViewStyles: (isActive?: boolean) => void;
6
5
  };
@@ -1,48 +1,38 @@
1
- const g = () => ({
2
- getCompiledEmail: (t = {}) => new Promise((e, a) => {
3
- const o = {
4
- ...{ ...{
5
- minimize: !0,
6
- utmEntity: {
7
- utmSource: "",
8
- utmMedium: "",
9
- utmCampaign: "",
10
- utmContent: "",
11
- utmTerm: "",
12
- customUtms: [
13
- {
14
- name1: "val1",
15
- name2: "val2"
16
- }
17
- ]
18
- },
19
- mergeTags: ["Tag1", "Tag2"],
20
- forseAmp: !1,
21
- resetDataSavedFlag: !1,
22
- disableLineHeightsReplace: !0
23
- }, ...t },
24
- callback: (i, s, m, n, l) => {
25
- i ? a(i) : e({
26
- html: s,
27
- ampHtml: m,
28
- ampErrors: n,
29
- displayConditions: l
30
- });
31
- }
32
- };
33
- window.StripoEditorApi.actionsApi.compileEmail(o);
34
- }),
35
- getRawTemplateData: () => new Promise((t) => {
36
- window.StripoEditorApi.actionsApi.getTemplateData(
37
- (e) => {
38
- t(e);
39
- }
40
- );
41
- }),
42
- activateCustomViewStyles: (t = !0) => {
43
- window.StripoEditorApi.actionsApi.activateCustomViewStyles(t);
44
- }
45
- });
1
+ const g = () => ({ getCompiledEmail: (t = {}) => new Promise((i, a) => {
2
+ const s = { ...{
3
+ minimize: !0,
4
+ utmEntity: {
5
+ utmSource: "",
6
+ utmMedium: "",
7
+ utmCampaign: "",
8
+ utmContent: "",
9
+ utmTerm: "",
10
+ customUtms: [
11
+ {
12
+ name1: "val1",
13
+ name2: "val2"
14
+ }
15
+ ]
16
+ },
17
+ mergeTags: ["Tag1", "Tag2"],
18
+ forseAmp: !1,
19
+ resetDataSavedFlag: !1,
20
+ disableLineHeightsReplace: !0
21
+ }, ...t }, o = {
22
+ callback: (e, m, l, n, c) => {
23
+ e ? a(e) : i({
24
+ html: m,
25
+ ampHtml: l,
26
+ ampErrors: n,
27
+ displayConditions: c
28
+ });
29
+ },
30
+ ...s
31
+ };
32
+ window.StripoEditorApi.actionsApi.compileEmail(o);
33
+ }), activateCustomViewStyles: (t = !0) => {
34
+ window.StripoEditorApi.actionsApi.activateCustomViewStyles(t);
35
+ } });
46
36
  export {
47
37
  g as useActionsApi
48
38
  };
@@ -1,20 +1,18 @@
1
- import { ref as p, computed as T } from "vue";
2
- import { getCsrfToken as H } from "../utils/generic.js";
3
- const k = (b = {}) => {
4
- const h = p(!1), a = p(null), u = p(null), g = T(() => h.value), y = T(() => a.value !== null), v = {
1
+ import { ref as p, computed as v } from "vue";
2
+ const j = (y = {}) => {
3
+ const h = p(!1), a = p(null), u = p(null), E = v(() => h.value), g = v(() => a.value !== null), T = {
5
4
  baseURL: "",
6
5
  timeout: 1e4,
7
6
  retry: 0,
8
7
  retryDelay: 1e3,
9
8
  headers: {
10
- "Content-Type": "application/json",
11
- "X-CSRF-TOKEN": H()
9
+ "Content-Type": "application/json"
12
10
  },
13
- ...b
11
+ ...y
14
12
  }, w = (e, s) => {
15
13
  if (e.startsWith("http://") || e.startsWith("https://"))
16
14
  return e;
17
- const t = s || v.baseURL || "";
15
+ const t = s || T.baseURL || "";
18
16
  return t.endsWith("/") && e.startsWith("/") ? `${t}${e.slice(1)}` : t.endsWith("/") || e.startsWith("/") ? `${t}${e}` : `${t}/${e}`;
19
17
  }, P = (e) => new Promise((s, t) => {
20
18
  setTimeout(() => {
@@ -24,20 +22,20 @@ const k = (b = {}) => {
24
22
  setTimeout(s, e);
25
23
  }), i = async (e, s, t, D = {}) => {
26
24
  a.value = null, h.value = !0, u.value = new AbortController();
27
- const n = { ...v, ...D }, L = w(s, n.baseURL), c = {
25
+ const n = { ...T, ...D }, L = w(s, n.baseURL), c = {
28
26
  method: e,
29
27
  headers: { ...n.headers },
30
28
  signal: u.value.signal,
31
29
  ...n
32
30
  };
33
31
  t && ["POST", "PUT", "PATCH"].includes(e) && (t instanceof FormData ? (delete c.headers["Content-Type"], c.body = t) : c.body = JSON.stringify(t));
34
- const E = async (m = 0) => {
32
+ const b = async (m = 0) => {
35
33
  try {
36
34
  const o = [fetch(L, c)];
37
35
  n.timeout && o.push(P(n.timeout));
38
36
  const r = await Promise.race(o);
39
37
  if (!r.ok) {
40
- const O = `HTTP Error: ${r.status} ${r.statusText}`, d = new Error(O);
38
+ const H = `HTTP Error: ${r.status} ${r.statusText}`, d = new Error(H);
41
39
  throw d.status = r.status, d.statusText = r.statusText, d.response = r, d;
42
40
  }
43
41
  let f;
@@ -51,36 +49,36 @@ const k = (b = {}) => {
51
49
  } catch (o) {
52
50
  const r = o instanceof Error && o.name === "AbortError";
53
51
  if (m < (n.retry || 0) && !r)
54
- return await x(n.retryDelay || 1e3), E(m + 1);
52
+ return await x(n.retryDelay || 1e3), b(m + 1);
55
53
  throw o instanceof Error ? o.name === "AbortError" ? a.value = { message: "Request was cancelled" } : a.value = { message: o.message } : a.value = o, o;
56
54
  }
57
55
  };
58
56
  try {
59
- return await E();
57
+ return await b();
60
58
  } finally {
61
59
  h.value = !1, u.value = null;
62
60
  }
63
- }, C = (e, s) => i("GET", e, void 0, s), $ = (e, s, t) => i("POST", e, s, t), R = (e, s, t) => i("PUT", e, s, t), U = (e, s, t) => i("PATCH", e, s, t), A = (e, s) => i("DELETE", e, void 0, s), W = (e) => {
61
+ }, $ = (e, s) => i("GET", e, void 0, s), C = (e, s, t) => i("POST", e, s, t), U = (e, s, t) => i("PUT", e, s, t), A = (e, s, t) => i("PATCH", e, s, t), R = (e, s) => i("DELETE", e, void 0, s), W = (e) => {
64
62
  u.value && u.value.abort(e);
65
63
  }, q = () => {
66
64
  a.value = null;
67
65
  };
68
66
  return {
69
67
  // State
70
- loading: g,
71
- error: T(() => a.value),
72
- hasError: y,
68
+ loading: E,
69
+ error: v(() => a.value),
70
+ hasError: g,
73
71
  // Methods
74
72
  request: i,
75
- get: C,
76
- post: $,
77
- put: R,
78
- patch: U,
79
- delete: A,
73
+ get: $,
74
+ post: C,
75
+ put: U,
76
+ patch: A,
77
+ delete: R,
80
78
  cancel: W,
81
79
  clearError: q
82
80
  };
83
81
  };
84
82
  export {
85
- k as useHttp
83
+ j as useHttp
86
84
  };
package/dist/guido.css CHANGED
@@ -1 +1 @@
1
- .version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history-wrapper[data-v-52a77eec]{gap:8px}[data-v-6a2bde67] .guido__verion-history-view-option-selection-desktop svg,[data-v-6a2bde67] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-6a2bde67] .in-segments-wrapper__button_selected,[data-v-6a2bde67] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-0fff376c] .guido__view-option-selection-desktop svg,[data-v-0fff376c] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-0fff376c] .in-segments-wrapper__button_selected,[data-v-0fff376c] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.guido-editor__wrapper[data-v-66fa3f35],.guido-editor__container[data-v-66fa3f35]{width:100%;height:calc(100vh - 75px)}
1
+ .version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history-wrapper[data-v-52a77eec]{gap:8px}[data-v-6a2bde67] .guido__verion-history-view-option-selection-desktop svg,[data-v-6a2bde67] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-6a2bde67] .in-segments-wrapper__button_selected,[data-v-6a2bde67] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-0fff376c] .guido__view-option-selection-desktop svg,[data-v-0fff376c] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-0fff376c] .in-segments-wrapper__button_selected,[data-v-0fff376c] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.guido-editor__wrapper[data-v-89bedf08],.guido-editor__container[data-v-89bedf08]{width:100%;height:calc(100vh - 75px)}
@@ -1,6 +1,6 @@
1
1
  export declare const useEditorStore: import("pinia").StoreDefinition<"editor", {
2
2
  isCodeEditorOpen: boolean;
3
3
  isVersionHistoryOpen: boolean;
4
+ isPreviewModeOpen: boolean;
4
5
  editorVisualMode: string;
5
- isSaveTemplateModalOpen: boolean;
6
6
  }, {}, {}>;
@@ -1,12 +1,12 @@
1
1
  import { defineStore as e } from "pinia";
2
- const t = e("editor", {
2
+ const i = e("editor", {
3
3
  state: () => ({
4
4
  isCodeEditorOpen: !1,
5
5
  isVersionHistoryOpen: !1,
6
- editorVisualMode: "desktop",
7
- isSaveTemplateModalOpen: !1
6
+ isPreviewModeOpen: !1,
7
+ editorVisualMode: "desktop"
8
8
  })
9
9
  });
10
10
  export {
11
- t as useEditorStore
11
+ i as useEditorStore
12
12
  };
@@ -0,0 +1,2 @@
1
+ import type { TooltipOptions } from '../@types/generic';
2
+ export declare const getTooltipOptions: (id: string, options?: Partial<Omit<TooltipOptions, "id">>) => TooltipOptions;
@@ -0,0 +1,9 @@
1
+ const o = (i, t = {}) => ({
2
+ id: i,
3
+ dynamicPosition: t.dynamicPosition ?? !0,
4
+ staticPosition: t.staticPosition ?? "top",
5
+ iconStatus: t.iconStatus ?? !1
6
+ });
7
+ export {
8
+ o as getTooltipOptions
9
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useinsider/guido",
3
- "version": "1.0.0-beta.c2acdd4",
3
+ "version": "1.0.0-beta.c674114",
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",
@@ -31,6 +31,8 @@
31
31
  "dependencies": {
32
32
  "@stripoinc/ui-editor-extensions": "^1.0.6",
33
33
  "@useinsider/design-system-vue": "0.14.8",
34
+ "@vuelidate/core": "2.0.3",
35
+ "@vuelidate/validators": "2.0.4",
34
36
  "lodash-es": "4.17.21",
35
37
  "pinia": "2.3.1",
36
38
  "vite": "6.3.5",
@@ -1,16 +0,0 @@
1
- interface Props {
2
- isOpen: boolean;
3
- }
4
- declare const _default: import("vue").DefineComponent<__VLS_TypePropsToOption<Props>, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {
5
- close: () => void;
6
- }, string, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<Props>>>, {}>;
7
- export default _default;
8
- type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
9
- type __VLS_TypePropsToOption<T> = {
10
- [K in keyof T]-?: {} extends Pick<T, K> ? {
11
- type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
12
- } : {
13
- type: import('vue').PropType<T[K]>;
14
- required: true;
15
- };
16
- };
@@ -1,20 +0,0 @@
1
- import s from "./SaveTemplateModal.vue2.js";
2
- import r from "../../../_virtual/_plugin-vue2_normalizer.js";
3
- var o = function() {
4
- var a = this, t = a._self._c, e = a._self._setupProxy;
5
- return t(e.ModalWrapper, { attrs: { "cancel-button-text": e.trans("products.cancel"), description: e.trans("newsletter.save-template-description"), "is-open": e.props.isOpen, "primary-button-loading": e.saveState.saving, "primary-button-text": e.trans(e.saveState.saving ? "newsletter.saving" : "products.save"), title: e.trans("products.save-template") }, on: { cancel: e.closeModal, close: e.closeModal, save: e.saveTemplate } }, [t(e.InBasicTextInput, { staticClass: "mb-5 w-1", attrs: { id: "template-name-input", name: "templateName", "character-counter-status": !1, "disabled-status": e.saveState.saving, "label-text": e.trans("products.template-name"), "placeholder-text": e.trans("newsletter.enter-template-name"), "state-message": e.getValidationMessage(), states: e.hasError() ? "error" : "", "tooltip-status": !1, value: e.templateName }, on: { input: e.templateNameInputHandler } }), t(e.InMultiSelect, { staticClass: "template-category-dropdown mb-5 w-1", attrs: { "create-option-status": "", "search-status": "", "button-status": !1, "character-limit-validation-text": e.trans("validation-v2.duration-value", {
6
- min: 1,
7
- max: e.templateCategorySearchInputLimit
8
- }), "create-button-label": e.trans("products.create-new-category"), "disabled-status": e.saveState.saving, "label-text": e.trans("products.template-category"), "loading-state": e.categoriesStore.loading || e.categoriesStore.loadingCreate, "max-character-limit": e.templateCategorySearchInputLimit, options: e.categoriesStore.mappedCategories, "placeholder-text": e.trans("products.select-template-category"), value: e.categoriesStore.selectedCategories }, on: { addOption: e.addOption, change: e.categoriesStore.setSelectedCategories, resetAllOptions: e.categoriesStore.setSelectedCategories, selectAllOptions: e.categoriesStore.setSelectedCategories } })], 1);
9
- }, n = [], l = /* @__PURE__ */ r(
10
- s,
11
- o,
12
- n,
13
- !1,
14
- null,
15
- null
16
- );
17
- const d = l.exports;
18
- export {
19
- d as default
20
- };
@@ -1,78 +0,0 @@
1
- import { defineComponent as b, ref as u, computed as A, watch as H } from "vue";
2
- import L from "../../wrappers/ModalWrapper.vue.js";
3
- import { useActionsApi as N } from "../../../composables/useActionsApi.js";
4
- import { useToaster as V } from "../../../composables/useToaster.js";
5
- import { useTranslations as j } from "../../../composables/useTranslations.js";
6
- import { useTemplateCategoriesStore as x } from "../../../stores/template-categories.js";
7
- import { InMultiSelect as B, InBasicTextInput as P } from "@useinsider/design-system-vue";
8
- import { useSaveAsTemplate as E } from "../../../composables/useSaveAsTemplate.js";
9
- import { useTemplateNameValidation as R } from "../../../composables/useTemplateNameValidation.js";
10
- const U = /* @__PURE__ */ b({
11
- __name: "SaveTemplateModal",
12
- props: {
13
- isOpen: { type: Boolean }
14
- },
15
- emits: ["close"],
16
- setup(S, { emit: p }) {
17
- const v = S, n = j(), { showToaster: c } = V(), { getRawTemplateData: f } = N(), a = x(), {
18
- state: t,
19
- saveTemplate: d
20
- } = E(), {
21
- templateName: s,
22
- getValidationMessage: I,
23
- hasError: w,
24
- validateInputs: g,
25
- resetValidation: i
26
- } = R(), l = u(!1), o = u(""), r = u(""), C = 40, y = A(() => t.saving || l.value || a.loading || a.loadingCreate), m = () => {
27
- s.value = "", o.value = "", r.value = "", a.resetSelection(), i();
28
- }, M = (e) => {
29
- s.value = e, i();
30
- }, T = () => {
31
- m(), p("close");
32
- }, _ = async () => {
33
- if (!y.value) {
34
- if (t.saving = !0, !await g()) {
35
- t.saving = !1;
36
- return;
37
- }
38
- try {
39
- await d({
40
- name: s.value,
41
- htmlContent: o.value,
42
- categoryIds: a.getSelectedCategoryIds,
43
- css: r.value
44
- }) && (t.saving = !1, c({
45
- message: n("journey-builder.template-saved-successfully", { name: s.value }),
46
- type: "success"
47
- }), T());
48
- } catch {
49
- t.saving = !1, c({
50
- message: n("journey-builder.template-save-error", { name: s.value }),
51
- type: "error"
52
- });
53
- }
54
- }
55
- }, h = async () => {
56
- l.value = !0;
57
- try {
58
- const { html: e, css: O } = await f();
59
- r.value = O || "", o.value = e || "";
60
- } catch {
61
- o.value = "", r.value = "";
62
- } finally {
63
- l.value = !1;
64
- }
65
- }, D = async (e) => {
66
- await a.createCategory(e);
67
- };
68
- return H(() => v.isOpen, async (e) => {
69
- e ? await Promise.all([
70
- h(),
71
- a.fetchCategories()
72
- ]) : m();
73
- }), { __sfc: !0, props: v, emit: p, trans: n, showToaster: c, getRawTemplateData: f, categoriesStore: a, saveState: t, saveTemplateToLibrary: d, templateName: s, getValidationMessage: I, hasError: w, validateInputs: g, resetValidation: i, isLoadingHtml: l, htmlData: o, cssData: r, templateCategorySearchInputLimit: C, isOperationInProgress: y, resetModalState: m, templateNameInputHandler: M, closeModal: T, saveTemplate: _, fetchHtmlData: h, addOption: D, ModalWrapper: L, InBasicTextInput: P, InMultiSelect: B };
74
- }
75
- });
76
- export {
77
- U as default
78
- };
@@ -1,72 +0,0 @@
1
- interface ModalWrapperProps {
2
- isOpen: boolean;
3
- title: string;
4
- description?: string;
5
- size?: 'small' | 'medium' | 'large';
6
- primaryButtonText?: string;
7
- primaryButtonDisabled?: boolean;
8
- primaryButtonLoading?: boolean;
9
- cancelButtonText?: string;
10
- showCancelButton?: boolean;
11
- className?: string;
12
- }
13
- declare var __VLS_12: {};
14
- type __VLS_Slots = {} & {
15
- default?: (props: typeof __VLS_12) => any;
16
- };
17
- declare const __VLS_component: import("vue").DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToOption<ModalWrapperProps>, {
18
- description: string;
19
- size: string;
20
- primaryButtonText: string;
21
- primaryButtonDisabled: boolean;
22
- primaryButtonLoading: boolean;
23
- cancelButtonText: string;
24
- showCancelButton: boolean;
25
- className: string;
26
- }>, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {
27
- close: () => void;
28
- save: () => void;
29
- cancel: () => void;
30
- }, string, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<ModalWrapperProps>, {
31
- description: string;
32
- size: string;
33
- primaryButtonText: string;
34
- primaryButtonDisabled: boolean;
35
- primaryButtonLoading: boolean;
36
- cancelButtonText: string;
37
- showCancelButton: boolean;
38
- className: string;
39
- }>>>, {
40
- className: string;
41
- size: "small" | "medium" | "large";
42
- description: string;
43
- primaryButtonText: string;
44
- primaryButtonDisabled: boolean;
45
- primaryButtonLoading: boolean;
46
- cancelButtonText: string;
47
- showCancelButton: boolean;
48
- }>;
49
- declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
50
- export default _default;
51
- type __VLS_WithDefaults<P, D> = {
52
- [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_PrettifyLocal<P[K] & {
53
- default: D[K];
54
- }> : P[K];
55
- };
56
- type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
57
- type __VLS_TypePropsToOption<T> = {
58
- [K in keyof T]-?: {} extends Pick<T, K> ? {
59
- type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
60
- } : {
61
- type: import('vue').PropType<T[K]>;
62
- required: true;
63
- };
64
- };
65
- type __VLS_WithSlots<T, S> = T & {
66
- new (): {
67
- $scopedSlots: S;
68
- };
69
- };
70
- type __VLS_PrettifyLocal<T> = {
71
- [K in keyof T]: T[K];
72
- } & {};
@@ -1,19 +0,0 @@
1
- import r from "./ModalWrapper.vue2.js";
2
- import o from "../../_virtual/_plugin-vue2_normalizer.js";
3
- var s = function() {
4
- var t = this, n = t._self._c, e = t._self._setupProxy;
5
- return n(e.InDrawer, { attrs: { id: "modal-wrapper", "description-text": t.description, "footer-button-group-options": e.drawerFooterOptions, size: t.size, status: t.isOpen, "title-text": t.title }, on: { cancelOrBackButtonEvent: e.handleCancel, onCloseEvent: e.handleClose, primaryButtonEvent: e.handleSave }, scopedSlots: t._u([{ key: "contentSlot", fn: function() {
6
- return [n("div", { staticClass: "modal-content-wrapper", class: t.className }, [t._t("default")], 2)];
7
- }, proxy: !0 }], null, !0) });
8
- }, a = [], l = /* @__PURE__ */ o(
9
- r,
10
- s,
11
- a,
12
- !1,
13
- null,
14
- null
15
- );
16
- const u = l.exports;
17
- export {
18
- u as default
19
- };
@@ -1,43 +0,0 @@
1
- import { defineComponent as o, computed as l } from "vue";
2
- import { InDrawer as s } from "@useinsider/design-system-vue";
3
- const i = /* @__PURE__ */ o({
4
- __name: "ModalWrapper",
5
- props: {
6
- isOpen: { type: Boolean },
7
- title: null,
8
- description: { default: "" },
9
- size: { default: "small" },
10
- primaryButtonText: { default: "" },
11
- primaryButtonDisabled: { type: Boolean, default: !1 },
12
- primaryButtonLoading: { type: Boolean, default: !1 },
13
- cancelButtonText: { default: "" },
14
- showCancelButton: { type: Boolean, default: !0 },
15
- className: { default: "" }
16
- },
17
- emits: ["close", "save", "cancel"],
18
- setup(a, { emit: t }) {
19
- const e = a, n = l(() => ({
20
- primaryButton: {
21
- styling: "solid",
22
- type: "primary",
23
- labelText: e.primaryButtonText,
24
- disabledStatus: e.primaryButtonDisabled || e.primaryButtonLoading
25
- },
26
- cancelOrBackButton: e.showCancelButton ? {
27
- type: "secondary",
28
- styling: "ghost",
29
- labelText: e.cancelButtonText
30
- } : void 0
31
- }));
32
- return { __sfc: !0, props: e, emit: t, drawerFooterOptions: n, handleClose: () => {
33
- t("close");
34
- }, handleSave: () => {
35
- t("save");
36
- }, handleCancel: () => {
37
- t("cancel");
38
- }, InDrawer: s };
39
- }
40
- });
41
- export {
42
- i as default
43
- };
@@ -1,7 +0,0 @@
1
- import type { SaveTemplatePayload } from '@@/Types/save-as-template';
2
- export declare const useSaveAsTemplate: () => {
3
- state: {
4
- saving: boolean;
5
- };
6
- saveTemplate: (data: SaveTemplatePayload) => Promise<boolean>;
7
- };
@@ -1,51 +0,0 @@
1
- import { useHttp as m } from "./useHttp.js";
2
- import { base64EncodeWithSpecialChars as t } from "../utils/base64.js";
3
- import { reactive as a } from "vue";
4
- const u = () => {
5
- const { post: o } = m(), n = a({
6
- saving: !1
7
- });
8
- return {
9
- state: n,
10
- saveTemplate: async (e) => {
11
- n.saving = !0;
12
- const i = {
13
- editor: "stripo",
14
- html: t(e.htmlContent),
15
- css: t(e.css)
16
- }, c = t(JSON.stringify(i ?? ""));
17
- try {
18
- const s = {
19
- name: e.name,
20
- categories: e.categoryIds,
21
- productId: 60,
22
- editorType: 2,
23
- messageType: 2,
24
- stripoConfig: c,
25
- content: t(e.htmlContent),
26
- unsubscriptionPreferencePages: [],
27
- unsubscriptionPreferencePageStatus: !1
28
- };
29
- e.css && (s.css = t(e.css)), e.stripoConfig && (s.stripoConfig = t(
30
- JSON.stringify(e.stripoConfig)
31
- )), e.recommendationConfigs && (s.recommendationConfigs = t(
32
- JSON.stringify(e.recommendationConfigs)
33
- )), e.recommendationCampaignUrls && (s.recommendationCampaignUrls = t(
34
- JSON.stringify(e.recommendationCampaignUrls)
35
- ));
36
- const r = await o(
37
- "/newsletter/template-library/create-template",
38
- s
39
- );
40
- return !(!r.data || r.data.type === "error");
41
- } catch {
42
- return !1;
43
- } finally {
44
- n.saving = !1;
45
- }
46
- }
47
- };
48
- };
49
- export {
50
- u as useSaveAsTemplate
51
- };
@@ -1,7 +0,0 @@
1
- export declare function useTemplateNameValidation(): {
2
- templateName: import("vue").Ref<string>;
3
- getValidationMessage: () => string;
4
- hasError: () => boolean;
5
- validateInputs: () => Promise<boolean>;
6
- resetValidation: () => void;
7
- };
@@ -1,33 +0,0 @@
1
- import { ref as r } from "vue";
2
- import { useHttp as i } from "./useHttp.js";
3
- import { useTranslations as m } from "./useTranslations.js";
4
- const o = 255;
5
- function h() {
6
- const n = r(""), e = r(""), t = m();
7
- return {
8
- templateName: n,
9
- getValidationMessage: () => e.value,
10
- hasError: () => !!e.value.length,
11
- validateInputs: async () => {
12
- const a = n.value.trim();
13
- if (!a)
14
- return e.value = t("whatsapp-business.template-name-required"), !1;
15
- if (a.length > o)
16
- return e.value = t("validations.enter-up-to-x-characters", {
17
- article: "a",
18
- field: t("products.template-name"),
19
- max: o
20
- }), !1;
21
- const l = encodeURIComponent(a), { data: s = {} } = await i().get(
22
- `/newsletter/template-library/template-name-exists?name=${l}`
23
- );
24
- return s != null && s.status ? (e.value = t("whatsapp-business.template-name-exists"), !1) : !0;
25
- },
26
- resetValidation: () => {
27
- e.value = "";
28
- }
29
- };
30
- }
31
- export {
32
- h as useTemplateNameValidation
33
- };
@@ -1,2 +0,0 @@
1
- declare const _default: import("msw").HttpHandler[];
2
- export default _default;
@@ -1,41 +0,0 @@
1
- import type { TemplateCategory } from '@@/Types/save-as-template';
2
- export interface MappedCategory {
3
- value: string;
4
- text: string;
5
- }
6
- export interface TemplateCategoriesState {
7
- categories: TemplateCategory[];
8
- mappedCategories: MappedCategory[];
9
- selectedCategories: MappedCategory[];
10
- loading: boolean;
11
- loadingCreate: boolean;
12
- }
13
- export declare const useTemplateCategoriesStore: import("pinia").StoreDefinition<"templateCategories", TemplateCategoriesState, {
14
- getSelectedCategoryIds: (state: {
15
- categories: {
16
- id: number;
17
- name: string;
18
- partnerId: number;
19
- isStripo: boolean;
20
- templatesCount: number;
21
- }[];
22
- mappedCategories: {
23
- value: string;
24
- text: string;
25
- }[];
26
- selectedCategories: {
27
- value: string;
28
- text: string;
29
- }[];
30
- loading: boolean;
31
- loadingCreate: boolean;
32
- } & import("pinia").PiniaCustomStateProperties<TemplateCategoriesState>) => number[];
33
- }, {
34
- fetchCategories(): Promise<void>;
35
- checkCategoryNameExists(name: string): Promise<boolean>;
36
- createCategory(name: string): Promise<void>;
37
- setSelectedCategories(categories: MappedCategory[]): void;
38
- selectCategory(category: MappedCategory): void;
39
- resetSelection(): void;
40
- resetStore(): void;
41
- }>;
@@ -1,91 +0,0 @@
1
- import { useHttp as c } from "../composables/useHttp.js";
2
- import { useToaster as r } from "../composables/useToaster.js";
3
- import { defineStore as g } from "pinia";
4
- const l = () => ({
5
- categories: [],
6
- mappedCategories: [],
7
- selectedCategories: [],
8
- loading: !1,
9
- loadingCreate: !1
10
- }), m = g("templateCategories", {
11
- state: () => l(),
12
- getters: {
13
- getSelectedCategoryIds: (e) => e.selectedCategories.map((s) => parseInt(s.value))
14
- },
15
- actions: {
16
- async fetchCategories() {
17
- this.loading = !0;
18
- const { get: e } = c();
19
- try {
20
- const t = (await e("/newsletter/template-library/get-template-categories")).data || [];
21
- this.categories = t, this.mappedCategories = t.map((a) => ({
22
- value: a.id.toString(),
23
- text: a.name
24
- }));
25
- } catch (s) {
26
- const { handleError: t } = r();
27
- t(s, "Error fetching template categories:"), this.categories = [], this.mappedCategories = [];
28
- } finally {
29
- this.loading = !1;
30
- }
31
- },
32
- async checkCategoryNameExists(e) {
33
- const { get: s } = c();
34
- try {
35
- const a = `/newsletter/template-library/category-name-exists?name=${encodeURIComponent(e)}`;
36
- return (await s(a)).data.status;
37
- } catch (t) {
38
- const { handleError: a } = r();
39
- return a(t, "Error checking category name:"), !1;
40
- }
41
- },
42
- async createCategory(e) {
43
- this.loadingCreate = !0;
44
- const { post: s } = c(), { showToaster: t } = r();
45
- try {
46
- if (await this.checkCategoryNameExists(e)) {
47
- t({
48
- type: "error",
49
- message: "Category name already exists"
50
- });
51
- return;
52
- }
53
- const i = (await s("/newsletter/template-library/create-category", { name: e })).data;
54
- if (i) {
55
- this.categories.push(i);
56
- const n = {
57
- value: i.id.toString(),
58
- text: e
59
- };
60
- this.mappedCategories.push(n), this.selectedCategories.push(n), t({
61
- type: "success",
62
- message: "Category created successfully"
63
- });
64
- }
65
- } catch (a) {
66
- const { handleError: o } = r();
67
- o(a, "Error creating category:");
68
- } finally {
69
- this.loadingCreate = !1;
70
- }
71
- },
72
- setSelectedCategories(e) {
73
- this.selectedCategories = [...e];
74
- },
75
- selectCategory(e) {
76
- const s = this.selectedCategories.findIndex(
77
- (t) => t.value === e.value
78
- );
79
- s === -1 ? this.selectedCategories.push(e) : this.selectedCategories.splice(s, 1);
80
- },
81
- resetSelection() {
82
- this.selectedCategories = [];
83
- },
84
- resetStore() {
85
- Object.assign(this, l());
86
- }
87
- }
88
- });
89
- export {
90
- m as useTemplateCategoriesStore
91
- };
@@ -1,2 +0,0 @@
1
- export declare const base64EncodeWithSpecialChars: (input: string) => string;
2
- export declare const base64DecodeWithSpecialChars: (input: string) => string;
@@ -1,14 +0,0 @@
1
- const c = (e) => {
2
- try {
3
- const n = new TextEncoder().encode(e);
4
- let o = "";
5
- return n.forEach((r) => {
6
- o += String.fromCharCode(r);
7
- }), window.btoa(o);
8
- } catch {
9
- return window.btoa(unescape(encodeURIComponent(e)));
10
- }
11
- };
12
- export {
13
- c as base64EncodeWithSpecialChars
14
- };
@@ -1 +0,0 @@
1
- export declare const getCsrfToken: () => string;
@@ -1,7 +0,0 @@
1
- const t = () => {
2
- var e;
3
- return ((e = document.head.querySelector('meta[name="csrf-token"]')) == null ? void 0 : e.getAttribute("content")) ?? "";
4
- };
5
- export {
6
- t as getCsrfToken
7
- };
@@ -1,2 +0,0 @@
1
- export declare function getValueFromDotNotation<T extends object>(path: string, obj: T): unknown;
2
- export declare function isEmpty(value: unknown): boolean;