easy-email-extensions 4.0.0-alpha.8 → 4.1.0
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/lib/index2.js +80 -28
- package/lib/index2.js.map +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";
|
@@ -40216,17 +40216,28 @@ function InlineText({ idx, onChange, children }) {
|
|
40216
40216
|
useEffect(() => {
|
40217
40217
|
const shadowRoot = getShadowRoot();
|
40218
40218
|
const onPaste = (e) => {
|
40219
|
-
var _a;
|
40219
|
+
var _a, _b;
|
40220
40220
|
if (!(e.target instanceof Element) || !e.target.getAttribute("contenteditable"))
|
40221
40221
|
return;
|
40222
40222
|
e.preventDefault();
|
40223
40223
|
const text = ((_a = e.clipboardData) == null ? void 0 : _a.getData("text/plain")) || "";
|
40224
40224
|
document.execCommand("insertHTML", false, text);
|
40225
|
-
|
40225
|
+
const contentEditableType = e.target.getAttribute(DATA_CONTENT_EDITABLE_TYPE);
|
40226
|
+
if (contentEditableType === ContentEditableType.RichText) {
|
40227
|
+
onChange(e.target.innerHTML || "");
|
40228
|
+
} else if (contentEditableType === ContentEditableType.Text) {
|
40229
|
+
onChange(((_b = e.target.textContent) == null ? void 0 : _b.trim()) || "");
|
40230
|
+
}
|
40226
40231
|
};
|
40227
40232
|
const onInput = (e) => {
|
40233
|
+
var _a;
|
40228
40234
|
if (e.target instanceof Element && e.target.getAttribute("contenteditable")) {
|
40229
|
-
|
40235
|
+
const contentEditableType = e.target.getAttribute(DATA_CONTENT_EDITABLE_TYPE);
|
40236
|
+
if (contentEditableType === ContentEditableType.RichText) {
|
40237
|
+
onChange(e.target.innerHTML || "");
|
40238
|
+
} else if (contentEditableType === ContentEditableType.Text) {
|
40239
|
+
onChange(((_a = e.target.textContent) == null ? void 0 : _a.trim()) || "");
|
40240
|
+
}
|
40230
40241
|
}
|
40231
40242
|
};
|
40232
40243
|
shadowRoot.addEventListener("paste", onPaste, true);
|
@@ -43324,6 +43335,7 @@ function BasicTools() {
|
|
43324
43335
|
const { copyBlock, removeBlock } = useBlock();
|
43325
43336
|
const { focusIdx: focusIdx2, setFocusIdx } = useFocusIdx();
|
43326
43337
|
const { modal, setModalVisible } = useAddToCollection();
|
43338
|
+
const { onAddCollection } = useEditorProps();
|
43327
43339
|
const handleAddToCollection = () => {
|
43328
43340
|
if (document.activeElement instanceof HTMLElement) {
|
43329
43341
|
document.activeElement.blur();
|
@@ -43364,7 +43376,7 @@ function BasicTools() {
|
|
43364
43376
|
icon: /* @__PURE__ */ React__default.createElement(IconFont, {
|
43365
43377
|
iconName: "icon-copy"
|
43366
43378
|
})
|
43367
|
-
}), /* @__PURE__ */ React__default.createElement(ToolItem$1, {
|
43379
|
+
}), onAddCollection && /* @__PURE__ */ React__default.createElement(ToolItem$1, {
|
43368
43380
|
onClick: handleAddToCollection,
|
43369
43381
|
title: "Add to collection",
|
43370
43382
|
icon: /* @__PURE__ */ React__default.createElement(IconFont, {
|
@@ -43632,17 +43644,13 @@ function Tools(props) {
|
|
43632
43644
|
const { mergeTags: mergeTags2, enabledMergeTagsBadge } = useEditorProps();
|
43633
43645
|
const { focusBlockNode } = useFocusBlockLayout();
|
43634
43646
|
const { selectionRange, restoreRange, setRangeByElement } = useSelectionRange();
|
43635
|
-
const execCommand = (cmd, val) => {
|
43636
|
-
|
43637
|
-
if (!container2) {
|
43638
|
-
console.error("No container");
|
43639
|
-
return;
|
43640
|
-
}
|
43647
|
+
const execCommand = useCallback((cmd, val) => {
|
43648
|
+
var _a;
|
43641
43649
|
if (!selectionRange) {
|
43642
43650
|
console.error("No selectionRange");
|
43643
43651
|
return;
|
43644
43652
|
}
|
43645
|
-
if (!(
|
43653
|
+
if (!(focusBlockNode == null ? void 0 : focusBlockNode.contains(selectionRange == null ? void 0 : selectionRange.commonAncestorContainer))) {
|
43646
43654
|
console.error("Not commonAncestorContainer");
|
43647
43655
|
return;
|
43648
43656
|
}
|
@@ -43678,19 +43686,15 @@ function Tools(props) {
|
|
43678
43686
|
} else {
|
43679
43687
|
document.execCommand(cmd, false, val);
|
43680
43688
|
}
|
43681
|
-
const html =
|
43689
|
+
const html = ((_a = getShadowRoot().activeElement) == null ? void 0 : _a.innerHTML) || "";
|
43682
43690
|
props.onChange(html);
|
43683
|
-
};
|
43691
|
+
}, [enabledMergeTagsBadge, focusBlockNode, props, restoreRange, selectionRange, setRangeByElement]);
|
43684
43692
|
const execCommandWithRange = useCallback((cmd, val) => {
|
43685
|
-
|
43686
|
-
if (!container2) {
|
43687
|
-
console.error("No container");
|
43688
|
-
return;
|
43689
|
-
}
|
43693
|
+
var _a;
|
43690
43694
|
document.execCommand(cmd, false, val);
|
43691
|
-
const html =
|
43695
|
+
const html = ((_a = getShadowRoot().activeElement) == null ? void 0 : _a.innerHTML) || "";
|
43692
43696
|
props.onChange(html);
|
43693
|
-
}, [
|
43697
|
+
}, [props.onChange]);
|
43694
43698
|
const getPopoverMountNode = () => document.getElementById(FIXED_CONTAINER_ID);
|
43695
43699
|
return /* @__PURE__ */ React__default.createElement("div", {
|
43696
43700
|
id: "Tools",
|
@@ -43821,6 +43825,7 @@ function RichTextToolBar(props) {
|
|
43821
43825
|
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, createPortal(/* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement("style", {
|
43822
43826
|
dangerouslySetInnerHTML: { __html: styleText }
|
43823
43827
|
}), /* @__PURE__ */ React__default.createElement("div", {
|
43828
|
+
id: RICH_TEXT_BAR_ID,
|
43824
43829
|
style: {
|
43825
43830
|
transform: "translate(0,0)",
|
43826
43831
|
padding: "4px 8px",
|
@@ -43845,20 +43850,67 @@ function RichTextToolBar(props) {
|
|
43845
43850
|
}))), root2));
|
43846
43851
|
}
|
43847
43852
|
const RichTextField = (props) => {
|
43848
|
-
const
|
43849
|
-
const
|
43850
|
-
|
43853
|
+
const [contentEditableName, setContentEditableName] = useState("");
|
43854
|
+
const [contentEditableType, setContentEditableType] = useState(CONTENT_EDITABLE_CLASS_NAME);
|
43855
|
+
useEffect(() => {
|
43856
|
+
const onClick = (e) => {
|
43857
|
+
var _a;
|
43858
|
+
if ((_a = getEditorRoot()) == null ? void 0 : _a.contains(e.target)) {
|
43859
|
+
return;
|
43860
|
+
}
|
43861
|
+
const fixedContainer = document.getElementById(FIXED_CONTAINER_ID);
|
43862
|
+
if (fixedContainer == null ? void 0 : fixedContainer.contains(e.target)) {
|
43863
|
+
return;
|
43864
|
+
}
|
43865
|
+
setContentEditableName("");
|
43866
|
+
};
|
43867
|
+
window.addEventListener("click", onClick);
|
43868
|
+
return () => {
|
43869
|
+
window.removeEventListener("click", onClick);
|
43870
|
+
};
|
43871
|
+
}, []);
|
43872
|
+
useEffect(() => {
|
43873
|
+
const root2 = getShadowRoot();
|
43874
|
+
if (!root2)
|
43875
|
+
return;
|
43876
|
+
const onClick = (e) => {
|
43877
|
+
const target2 = e.target;
|
43878
|
+
const fixedContainer = document.getElementById(FIXED_CONTAINER_ID);
|
43879
|
+
const richTextBar = root2.getElementById(RICH_TEXT_BAR_ID);
|
43880
|
+
if ((fixedContainer == null ? void 0 : fixedContainer.contains(target2)) || (richTextBar == null ? void 0 : richTextBar.contains(target2))) {
|
43881
|
+
return;
|
43882
|
+
}
|
43883
|
+
const activeElement = getShadowRoot().activeElement;
|
43884
|
+
if (!activeElement) {
|
43885
|
+
setContentEditableName("");
|
43886
|
+
} else {
|
43887
|
+
const idxName = activeElement.getAttribute(DATA_CONTENT_EDITABLE_IDX);
|
43888
|
+
const type = activeElement.getAttribute(DATA_CONTENT_EDITABLE_TYPE);
|
43889
|
+
setContentEditableType(type);
|
43890
|
+
if (idxName) {
|
43891
|
+
setContentEditableName(idxName);
|
43892
|
+
} else {
|
43893
|
+
setContentEditableName("");
|
43894
|
+
}
|
43895
|
+
}
|
43896
|
+
};
|
43897
|
+
root2.addEventListener("click", onClick);
|
43898
|
+
return () => {
|
43899
|
+
root2.removeEventListener("click", onClick);
|
43900
|
+
};
|
43901
|
+
}, []);
|
43902
|
+
if (!contentEditableName)
|
43851
43903
|
return null;
|
43852
|
-
const name = `${focusIdx2}.data.value.content`;
|
43853
43904
|
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(Field, {
|
43854
|
-
name,
|
43905
|
+
name: contentEditableName,
|
43855
43906
|
parse: (v) => v
|
43856
43907
|
}, ({ input }) => /* @__PURE__ */ React__default.createElement(FieldWrapper, __spreadProps(__spreadValues({}, props), {
|
43908
|
+
contentEditableType,
|
43857
43909
|
input
|
43858
43910
|
}))));
|
43859
43911
|
};
|
43860
43912
|
function FieldWrapper(props) {
|
43861
|
-
const _a = props, { input } = _a, rest = __objRest(_a, ["input"]);
|
43913
|
+
const _a = props, { input, contentEditableType } = _a, rest = __objRest(_a, ["input", "contentEditableType"]);
|
43862
43914
|
const { mergeTagGenerate, enabledMergeTagsBadge } = useEditorProps();
|
43863
43915
|
const debounceCallbackChange = useCallback(lodash.exports.debounce((val) => {
|
43864
43916
|
if (enabledMergeTagsBadge) {
|
@@ -43868,7 +43920,7 @@ function FieldWrapper(props) {
|
|
43868
43920
|
}
|
43869
43921
|
input.onBlur();
|
43870
43922
|
}, 200), [input]);
|
43871
|
-
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(RichTextToolBar, {
|
43923
|
+
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, contentEditableType === ContentEditableType.RichText && /* @__PURE__ */ React__default.createElement(RichTextToolBar, {
|
43872
43924
|
onChange: debounceCallbackChange
|
43873
43925
|
}), /* @__PURE__ */ React__default.createElement(InlineText, __spreadProps(__spreadValues({}, rest), {
|
43874
43926
|
onChange: debounceCallbackChange
|