easy-email-extensions 4.0.0 → 4.1.2
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/hooks/useFontFamily.d.ts +1 -1
- package/lib/index2.js +100 -43
- package/lib/index2.js.map +1 -1
- package/lib/style.css +1 -1
- package/package.json +2 -2
package/lib/index2.js
CHANGED
@@ -55,7 +55,7 @@ var __async = (__this, __arguments, generator) => {
|
|
55
55
|
};
|
56
56
|
import * as React from "react";
|
57
57
|
import React__default, { Children, isValidElement, cloneElement, createContext, useContext, Component, useMemo, memo, forwardRef, useEffect, useRef, useLayoutEffect, useState, createRef, useImperativeHandle, PureComponent, useCallback, useReducer, Fragment, createElement, Suspense } from "react";
|
58
|
-
import { IconFont, useEditorProps, Stack as Stack$6, getShadowRoot, TextStyle, useEditorContext, useBlock, useFocusIdx, useFocusBlockLayout,
|
58
|
+
import { IconFont, useEditorProps, Stack as Stack$6, getShadowRoot, DATA_CONTENT_EDITABLE_TYPE, ContentEditableType, TextStyle, useEditorContext, useBlock, useFocusIdx, useFocusBlockLayout, MergeTagBadge, FIXED_CONTAINER_ID, getPluginElement, RICH_TEXT_BAR_ID, CONTENT_EDITABLE_CLASS_NAME, getEditorRoot, DATA_CONTENT_EDITABLE_IDX, scrollBlockEleIntoView, useHoverIdx, useDataTransfer, useRefState, getBlockNodeByChildEle, getDirectionPosition, DATA_ATTRIBUTE_DROP_CONTAINER, BlockAvatarWrapper, isTextBlock, getBlockNodeByIdx, useLazyState, useActiveTab, ActiveTabKeys } from "easy-email-editor";
|
59
59
|
import { BasicType, ImageManager, EMAIL_BLOCK_CLASS_NAME, BlockManager, createBlockDataByType, AdvancedType, Operator, OperatorSymbol, isAdvancedBlock, getParentByIdx, getParentIdx, getIndexByIdx, getSiblingIdx, getNodeIdxFromClassName, getNodeIdxClassName, getPageIdx, getChildIdx, MjmlToJson, JsonToMjml, getNodeTypeFromClassName } from "easy-email-core";
|
60
60
|
import ReactDOM, { findDOMNode, render as render$1, unmountComponentAtNode, createPortal } from "react-dom";
|
61
61
|
import { useField, Field, useForm as useForm$1, Form as Form$3, version as version$2, useFormState } from "react-final-form";
|
@@ -39793,6 +39793,21 @@ ImageManager.add(defaultImagesMap$1);
|
|
39793
39793
|
function getImg$1(name) {
|
39794
39794
|
return ImageManager.get(name);
|
39795
39795
|
}
|
39796
|
+
const helperText = "_helperText_1m9nq_1";
|
39797
|
+
const labelHidden = "_label-hidden_1m9nq_9";
|
39798
|
+
const editTab = "_editTab_1m9nq_20";
|
39799
|
+
const inputWithUnit = "_inputWithUnit_1m9nq_27";
|
39800
|
+
const inputWithUnitSelectOption = "_inputWithUnitSelectOption_1m9nq_35";
|
39801
|
+
const colorPicker = "_colorPicker_1m9nq_40";
|
39802
|
+
var styles$3 = {
|
39803
|
+
helperText,
|
39804
|
+
"label-hidden": "_label-hidden_1m9nq_9",
|
39805
|
+
labelHidden,
|
39806
|
+
editTab,
|
39807
|
+
inputWithUnit,
|
39808
|
+
inputWithUnitSelectOption,
|
39809
|
+
colorPicker
|
39810
|
+
};
|
39796
39811
|
function ColorPicker(props) {
|
39797
39812
|
const { colors: presetColors, addCurrentColor } = useContext(PresetColorsContext);
|
39798
39813
|
const [color, setColor] = useState("");
|
@@ -39819,12 +39834,14 @@ function ColorPicker(props) {
|
|
39819
39834
|
title: props.label,
|
39820
39835
|
trigger: "click"
|
39821
39836
|
}, props), {
|
39822
|
-
content: /* @__PURE__ */ React__default.createElement(
|
39837
|
+
content: /* @__PURE__ */ React__default.createElement("div", {
|
39838
|
+
className: styles$3.colorPicker
|
39839
|
+
}, /* @__PURE__ */ React__default.createElement(SketchPicker, {
|
39823
39840
|
presetColors,
|
39824
39841
|
color,
|
39825
39842
|
disableAlpha: true,
|
39826
39843
|
onChangeComplete
|
39827
|
-
})
|
39844
|
+
}))
|
39828
39845
|
}), children || /* @__PURE__ */ React__default.createElement("div", {
|
39829
39846
|
style: {
|
39830
39847
|
display: "inline-block",
|
@@ -39888,19 +39905,6 @@ function RadioGroup(props) {
|
|
39888
39905
|
value: item2.value
|
39889
39906
|
}, item2.label))));
|
39890
39907
|
}
|
39891
|
-
const helperText = "_helperText_k05ys_1";
|
39892
|
-
const labelHidden = "_label-hidden_k05ys_9";
|
39893
|
-
const editTab = "_editTab_k05ys_20";
|
39894
|
-
const inputWithUnit = "_inputWithUnit_k05ys_27";
|
39895
|
-
const inputWithUnitSelectOption = "_inputWithUnitSelectOption_k05ys_35";
|
39896
|
-
var styles$3 = {
|
39897
|
-
helperText,
|
39898
|
-
"label-hidden": "_label-hidden_k05ys_9",
|
39899
|
-
labelHidden,
|
39900
|
-
editTab,
|
39901
|
-
inputWithUnit,
|
39902
|
-
inputWithUnitSelectOption
|
39903
|
-
};
|
39904
39908
|
let primaryId = 0;
|
39905
39909
|
const parse = (v) => v;
|
39906
39910
|
function enhancer(Component2, changeAdapter) {
|
@@ -40216,17 +40220,28 @@ function InlineText({ idx, onChange, children }) {
|
|
40216
40220
|
useEffect(() => {
|
40217
40221
|
const shadowRoot = getShadowRoot();
|
40218
40222
|
const onPaste = (e) => {
|
40219
|
-
var _a;
|
40223
|
+
var _a, _b;
|
40220
40224
|
if (!(e.target instanceof Element) || !e.target.getAttribute("contenteditable"))
|
40221
40225
|
return;
|
40222
40226
|
e.preventDefault();
|
40223
40227
|
const text = ((_a = e.clipboardData) == null ? void 0 : _a.getData("text/plain")) || "";
|
40224
40228
|
document.execCommand("insertHTML", false, text);
|
40225
|
-
|
40229
|
+
const contentEditableType = e.target.getAttribute(DATA_CONTENT_EDITABLE_TYPE);
|
40230
|
+
if (contentEditableType === ContentEditableType.RichText) {
|
40231
|
+
onChange(e.target.innerHTML || "");
|
40232
|
+
} else if (contentEditableType === ContentEditableType.Text) {
|
40233
|
+
onChange(((_b = e.target.textContent) == null ? void 0 : _b.trim()) || "");
|
40234
|
+
}
|
40226
40235
|
};
|
40227
40236
|
const onInput = (e) => {
|
40237
|
+
var _a;
|
40228
40238
|
if (e.target instanceof Element && e.target.getAttribute("contenteditable")) {
|
40229
|
-
|
40239
|
+
const contentEditableType = e.target.getAttribute(DATA_CONTENT_EDITABLE_TYPE);
|
40240
|
+
if (contentEditableType === ContentEditableType.RichText) {
|
40241
|
+
onChange(e.target.innerHTML || "");
|
40242
|
+
} else if (contentEditableType === ContentEditableType.Text) {
|
40243
|
+
onChange(((_a = e.target.textContent) == null ? void 0 : _a.trim()) || "");
|
40244
|
+
}
|
40230
40245
|
}
|
40231
40246
|
};
|
40232
40247
|
shadowRoot.addEventListener("paste", onPaste, true);
|
@@ -40385,7 +40400,9 @@ function useFontFamily() {
|
|
40385
40400
|
const options2 = addFonts.map((item2) => ({ value: item2.name, label: item2.name }));
|
40386
40401
|
fonts.unshift(...options2);
|
40387
40402
|
}
|
40388
|
-
return fonts
|
40403
|
+
return fonts.map((item2) => ({ value: item2.value, label: /* @__PURE__ */ React__default.createElement("span", {
|
40404
|
+
style: { fontFamily: item2.value }
|
40405
|
+
}, item2.label) }));
|
40389
40406
|
}, [addFonts, defaultFontList]);
|
40390
40407
|
return {
|
40391
40408
|
fontList: fontList2
|
@@ -43633,17 +43650,13 @@ function Tools(props) {
|
|
43633
43650
|
const { mergeTags: mergeTags2, enabledMergeTagsBadge } = useEditorProps();
|
43634
43651
|
const { focusBlockNode } = useFocusBlockLayout();
|
43635
43652
|
const { selectionRange, restoreRange, setRangeByElement } = useSelectionRange();
|
43636
|
-
const execCommand = (cmd, val) => {
|
43637
|
-
|
43638
|
-
if (!container2) {
|
43639
|
-
console.error("No container");
|
43640
|
-
return;
|
43641
|
-
}
|
43653
|
+
const execCommand = useCallback((cmd, val) => {
|
43654
|
+
var _a;
|
43642
43655
|
if (!selectionRange) {
|
43643
43656
|
console.error("No selectionRange");
|
43644
43657
|
return;
|
43645
43658
|
}
|
43646
|
-
if (!(
|
43659
|
+
if (!(focusBlockNode == null ? void 0 : focusBlockNode.contains(selectionRange == null ? void 0 : selectionRange.commonAncestorContainer))) {
|
43647
43660
|
console.error("Not commonAncestorContainer");
|
43648
43661
|
return;
|
43649
43662
|
}
|
@@ -43679,19 +43692,15 @@ function Tools(props) {
|
|
43679
43692
|
} else {
|
43680
43693
|
document.execCommand(cmd, false, val);
|
43681
43694
|
}
|
43682
|
-
const html =
|
43695
|
+
const html = ((_a = getShadowRoot().activeElement) == null ? void 0 : _a.innerHTML) || "";
|
43683
43696
|
props.onChange(html);
|
43684
|
-
};
|
43697
|
+
}, [enabledMergeTagsBadge, focusBlockNode, props, restoreRange, selectionRange, setRangeByElement]);
|
43685
43698
|
const execCommandWithRange = useCallback((cmd, val) => {
|
43686
|
-
|
43687
|
-
if (!container2) {
|
43688
|
-
console.error("No container");
|
43689
|
-
return;
|
43690
|
-
}
|
43699
|
+
var _a;
|
43691
43700
|
document.execCommand(cmd, false, val);
|
43692
|
-
const html =
|
43701
|
+
const html = ((_a = getShadowRoot().activeElement) == null ? void 0 : _a.innerHTML) || "";
|
43693
43702
|
props.onChange(html);
|
43694
|
-
}, [
|
43703
|
+
}, [props.onChange]);
|
43695
43704
|
const getPopoverMountNode = () => document.getElementById(FIXED_CONTAINER_ID);
|
43696
43705
|
return /* @__PURE__ */ React__default.createElement("div", {
|
43697
43706
|
id: "Tools",
|
@@ -43822,6 +43831,7 @@ function RichTextToolBar(props) {
|
|
43822
43831
|
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, createPortal(/* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement("style", {
|
43823
43832
|
dangerouslySetInnerHTML: { __html: styleText }
|
43824
43833
|
}), /* @__PURE__ */ React__default.createElement("div", {
|
43834
|
+
id: RICH_TEXT_BAR_ID,
|
43825
43835
|
style: {
|
43826
43836
|
transform: "translate(0,0)",
|
43827
43837
|
padding: "4px 8px",
|
@@ -43846,20 +43856,67 @@ function RichTextToolBar(props) {
|
|
43846
43856
|
}))), root2));
|
43847
43857
|
}
|
43848
43858
|
const RichTextField = (props) => {
|
43849
|
-
const
|
43850
|
-
const
|
43851
|
-
|
43859
|
+
const [contentEditableName, setContentEditableName] = useState("");
|
43860
|
+
const [contentEditableType, setContentEditableType] = useState(CONTENT_EDITABLE_CLASS_NAME);
|
43861
|
+
useEffect(() => {
|
43862
|
+
const onClick = (e) => {
|
43863
|
+
var _a;
|
43864
|
+
if ((_a = getEditorRoot()) == null ? void 0 : _a.contains(e.target)) {
|
43865
|
+
return;
|
43866
|
+
}
|
43867
|
+
const fixedContainer = document.getElementById(FIXED_CONTAINER_ID);
|
43868
|
+
if (fixedContainer == null ? void 0 : fixedContainer.contains(e.target)) {
|
43869
|
+
return;
|
43870
|
+
}
|
43871
|
+
setContentEditableName("");
|
43872
|
+
};
|
43873
|
+
window.addEventListener("click", onClick);
|
43874
|
+
return () => {
|
43875
|
+
window.removeEventListener("click", onClick);
|
43876
|
+
};
|
43877
|
+
}, []);
|
43878
|
+
useEffect(() => {
|
43879
|
+
const root2 = getShadowRoot();
|
43880
|
+
if (!root2)
|
43881
|
+
return;
|
43882
|
+
const onClick = (e) => {
|
43883
|
+
const target2 = e.target;
|
43884
|
+
const fixedContainer = document.getElementById(FIXED_CONTAINER_ID);
|
43885
|
+
const richTextBar = root2.getElementById(RICH_TEXT_BAR_ID);
|
43886
|
+
if ((fixedContainer == null ? void 0 : fixedContainer.contains(target2)) || (richTextBar == null ? void 0 : richTextBar.contains(target2))) {
|
43887
|
+
return;
|
43888
|
+
}
|
43889
|
+
const activeElement = getShadowRoot().activeElement;
|
43890
|
+
if (!activeElement) {
|
43891
|
+
setContentEditableName("");
|
43892
|
+
} else {
|
43893
|
+
const idxName = activeElement.getAttribute(DATA_CONTENT_EDITABLE_IDX);
|
43894
|
+
const type = activeElement.getAttribute(DATA_CONTENT_EDITABLE_TYPE);
|
43895
|
+
setContentEditableType(type);
|
43896
|
+
if (idxName) {
|
43897
|
+
setContentEditableName(idxName);
|
43898
|
+
} else {
|
43899
|
+
setContentEditableName("");
|
43900
|
+
}
|
43901
|
+
}
|
43902
|
+
};
|
43903
|
+
root2.addEventListener("click", onClick);
|
43904
|
+
return () => {
|
43905
|
+
root2.removeEventListener("click", onClick);
|
43906
|
+
};
|
43907
|
+
}, []);
|
43908
|
+
if (!contentEditableName)
|
43852
43909
|
return null;
|
43853
|
-
const name = `${focusIdx2}.data.value.content`;
|
43854
43910
|
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(Field, {
|
43855
|
-
name,
|
43911
|
+
name: contentEditableName,
|
43856
43912
|
parse: (v) => v
|
43857
43913
|
}, ({ input }) => /* @__PURE__ */ React__default.createElement(FieldWrapper, __spreadProps(__spreadValues({}, props), {
|
43914
|
+
contentEditableType,
|
43858
43915
|
input
|
43859
43916
|
}))));
|
43860
43917
|
};
|
43861
43918
|
function FieldWrapper(props) {
|
43862
|
-
const _a = props, { input } = _a, rest = __objRest(_a, ["input"]);
|
43919
|
+
const _a = props, { input, contentEditableType } = _a, rest = __objRest(_a, ["input", "contentEditableType"]);
|
43863
43920
|
const { mergeTagGenerate, enabledMergeTagsBadge } = useEditorProps();
|
43864
43921
|
const debounceCallbackChange = useCallback(lodash.exports.debounce((val) => {
|
43865
43922
|
if (enabledMergeTagsBadge) {
|
@@ -43869,7 +43926,7 @@ function FieldWrapper(props) {
|
|
43869
43926
|
}
|
43870
43927
|
input.onBlur();
|
43871
43928
|
}, 200), [input]);
|
43872
|
-
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(RichTextToolBar, {
|
43929
|
+
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, contentEditableType === ContentEditableType.RichText && /* @__PURE__ */ React__default.createElement(RichTextToolBar, {
|
43873
43930
|
onChange: debounceCallbackChange
|
43874
43931
|
}), /* @__PURE__ */ React__default.createElement(InlineText, __spreadProps(__spreadValues({}, rest), {
|
43875
43932
|
onChange: debounceCallbackChange
|