@gravity-ui/markdown-editor 15.3.1 → 15.4.1

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 (195) hide show
  1. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +7 -3
  2. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
  3. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
  4. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +15 -2
  5. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
  6. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.d.ts +3 -0
  7. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.js +7 -1
  8. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.js.map +1 -1
  9. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.d.ts +1 -1
  10. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.js +8 -2
  11. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.js.map +1 -1
  12. package/build/cjs/extensions/additional/Mermaid/actions.js +12 -5
  13. package/build/cjs/extensions/additional/Mermaid/actions.js.map +1 -1
  14. package/build/cjs/extensions/additional/Mermaid/types.d.ts +3 -0
  15. package/build/cjs/extensions/additional/Mermaid/types.js +3 -0
  16. package/build/cjs/extensions/additional/Mermaid/types.js.map +1 -0
  17. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.d.ts +1 -0
  18. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js +14 -5
  19. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js.map +1 -1
  20. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +13 -12
  21. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  22. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.d.ts +3 -0
  23. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js +7 -1
  24. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js.map +1 -1
  25. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.d.ts +1 -1
  26. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js +8 -2
  27. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js.map +1 -1
  28. package/build/cjs/extensions/additional/YfmHtmlBlock/actions.js +9 -2
  29. package/build/cjs/extensions/additional/YfmHtmlBlock/actions.js.map +1 -1
  30. package/build/cjs/extensions/additional/YfmHtmlBlock/types.d.ts +3 -0
  31. package/build/cjs/extensions/additional/YfmHtmlBlock/types.js +3 -0
  32. package/build/cjs/extensions/additional/YfmHtmlBlock/types.js.map +1 -0
  33. package/build/cjs/extensions/behavior/Autocomplete/index.d.ts +1 -0
  34. package/build/cjs/extensions/behavior/Autocomplete/index.js +5 -3
  35. package/build/cjs/extensions/behavior/Autocomplete/index.js.map +1 -1
  36. package/build/cjs/extensions/behavior/Autocomplete/types.d.ts +1 -1
  37. package/build/cjs/extensions/behavior/Autocomplete/types.js.map +1 -1
  38. package/build/cjs/extensions/behavior/Autocomplete/utils.d.ts +3 -0
  39. package/build/cjs/extensions/behavior/Autocomplete/utils.js +8 -0
  40. package/build/cjs/extensions/behavior/Autocomplete/utils.js.map +1 -0
  41. package/build/cjs/extensions/behavior/Clipboard/code.d.ts +7 -1
  42. package/build/cjs/extensions/behavior/Clipboard/code.js +60 -0
  43. package/build/cjs/extensions/behavior/Clipboard/code.js.map +1 -1
  44. package/build/cjs/extensions/behavior/Clipboard/index.js +2 -0
  45. package/build/cjs/extensions/behavior/Clipboard/index.js.map +1 -1
  46. package/build/cjs/extensions/behavior/CommandMenu/handler.js +6 -6
  47. package/build/cjs/extensions/behavior/CommandMenu/handler.js.map +1 -1
  48. package/build/cjs/extensions/behavior/SharedState/SharedState.d.ts +7 -0
  49. package/build/cjs/extensions/behavior/SharedState/SharedState.js +16 -0
  50. package/build/cjs/extensions/behavior/SharedState/SharedState.js.map +1 -0
  51. package/build/cjs/extensions/behavior/SharedState/index.d.ts +1 -0
  52. package/build/cjs/extensions/behavior/SharedState/index.js +5 -0
  53. package/build/cjs/extensions/behavior/SharedState/index.js.map +1 -0
  54. package/build/cjs/extensions/behavior/SharedState/plugin.d.ts +3 -0
  55. package/build/cjs/extensions/behavior/SharedState/plugin.js +62 -0
  56. package/build/cjs/extensions/behavior/SharedState/plugin.js.map +1 -0
  57. package/build/cjs/extensions/behavior/SharedState/types.d.ts +1 -0
  58. package/build/cjs/extensions/behavior/SharedState/types.js +3 -0
  59. package/build/cjs/extensions/behavior/SharedState/types.js.map +1 -0
  60. package/build/cjs/extensions/behavior/SharedState/utils.d.ts +29 -0
  61. package/build/cjs/extensions/behavior/SharedState/utils.js +60 -0
  62. package/build/cjs/extensions/behavior/SharedState/utils.js.map +1 -0
  63. package/build/cjs/extensions/behavior/index.d.ts +2 -0
  64. package/build/cjs/extensions/behavior/index.js +4 -0
  65. package/build/cjs/extensions/behavior/index.js.map +1 -1
  66. package/build/cjs/extensions/markdown/Link/plugins/LinkTooltipPlugin/index.js +7 -12
  67. package/build/cjs/extensions/markdown/Link/plugins/LinkTooltipPlugin/index.js.map +1 -1
  68. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.d.ts +0 -1
  69. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +7 -6
  70. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
  71. package/build/cjs/react-utils/index.d.ts +1 -0
  72. package/build/cjs/react-utils/index.js +1 -0
  73. package/build/cjs/react-utils/index.js.map +1 -1
  74. package/build/cjs/react-utils/useSharedEditingState.d.ts +5 -0
  75. package/build/cjs/react-utils/useSharedEditingState.js +25 -0
  76. package/build/cjs/react-utils/useSharedEditingState.js.map +1 -0
  77. package/build/cjs/toolbar/ToolbarButton.d.ts +6 -8
  78. package/build/cjs/toolbar/ToolbarButton.js +2 -2
  79. package/build/cjs/toolbar/ToolbarButton.js.map +1 -1
  80. package/build/cjs/toolbar/ToolbarListButton.js +7 -8
  81. package/build/cjs/toolbar/ToolbarListButton.js.map +1 -1
  82. package/build/cjs/utils/descedants.d.ts +8 -0
  83. package/build/cjs/utils/descedants.js +15 -0
  84. package/build/cjs/utils/descedants.js.map +1 -0
  85. package/build/cjs/utils/entity-id.d.ts +11 -0
  86. package/build/cjs/utils/entity-id.js +21 -0
  87. package/build/cjs/utils/entity-id.js.map +1 -0
  88. package/build/cjs/utils/index.d.ts +2 -0
  89. package/build/cjs/utils/index.js +2 -0
  90. package/build/cjs/utils/index.js.map +1 -1
  91. package/build/cjs/version.js +1 -1
  92. package/build/cjs/version.js.map +1 -1
  93. package/build/cjs/view/hocs/withYfmHtml/index.d.ts +2 -0
  94. package/build/cjs/view/hocs/withYfmHtml/index.js +2 -2
  95. package/build/cjs/view/hocs/withYfmHtml/index.js.map +1 -1
  96. package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js +3 -1
  97. package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js.map +1 -1
  98. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +8 -4
  99. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
  100. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
  101. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +14 -1
  102. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
  103. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.d.ts +3 -0
  104. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.js +6 -0
  105. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.js.map +1 -1
  106. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.d.ts +2 -2
  107. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.js +8 -3
  108. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.js.map +1 -1
  109. package/build/esm/extensions/additional/Mermaid/actions.js +12 -5
  110. package/build/esm/extensions/additional/Mermaid/actions.js.map +1 -1
  111. package/build/esm/extensions/additional/Mermaid/types.d.ts +3 -0
  112. package/build/esm/extensions/additional/Mermaid/types.js +2 -0
  113. package/build/esm/extensions/additional/Mermaid/types.js.map +1 -0
  114. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.d.ts +1 -0
  115. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js +14 -5
  116. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js.map +1 -1
  117. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +13 -11
  118. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  119. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.d.ts +3 -0
  120. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js +6 -0
  121. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js.map +1 -1
  122. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.d.ts +2 -2
  123. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js +8 -3
  124. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js.map +1 -1
  125. package/build/esm/extensions/additional/YfmHtmlBlock/actions.js +9 -2
  126. package/build/esm/extensions/additional/YfmHtmlBlock/actions.js.map +1 -1
  127. package/build/esm/extensions/additional/YfmHtmlBlock/types.d.ts +3 -0
  128. package/build/esm/extensions/additional/YfmHtmlBlock/types.js +2 -0
  129. package/build/esm/extensions/additional/YfmHtmlBlock/types.js.map +1 -0
  130. package/build/esm/extensions/behavior/Autocomplete/index.d.ts +1 -0
  131. package/build/esm/extensions/behavior/Autocomplete/index.js +2 -1
  132. package/build/esm/extensions/behavior/Autocomplete/index.js.map +1 -1
  133. package/build/esm/extensions/behavior/Autocomplete/types.d.ts +1 -1
  134. package/build/esm/extensions/behavior/Autocomplete/types.js.map +1 -1
  135. package/build/esm/extensions/behavior/Autocomplete/utils.d.ts +3 -0
  136. package/build/esm/extensions/behavior/Autocomplete/utils.js +5 -0
  137. package/build/esm/extensions/behavior/Autocomplete/utils.js.map +1 -0
  138. package/build/esm/extensions/behavior/Clipboard/code.d.ts +7 -1
  139. package/build/esm/extensions/behavior/Clipboard/code.js +57 -0
  140. package/build/esm/extensions/behavior/Clipboard/code.js.map +1 -1
  141. package/build/esm/extensions/behavior/Clipboard/index.js +2 -0
  142. package/build/esm/extensions/behavior/Clipboard/index.js.map +1 -1
  143. package/build/esm/extensions/behavior/CommandMenu/handler.js +7 -7
  144. package/build/esm/extensions/behavior/CommandMenu/handler.js.map +1 -1
  145. package/build/esm/extensions/behavior/SharedState/SharedState.d.ts +7 -0
  146. package/build/esm/extensions/behavior/SharedState/SharedState.js +11 -0
  147. package/build/esm/extensions/behavior/SharedState/SharedState.js.map +1 -0
  148. package/build/esm/extensions/behavior/SharedState/index.d.ts +1 -0
  149. package/build/esm/extensions/behavior/SharedState/index.js +2 -0
  150. package/build/esm/extensions/behavior/SharedState/index.js.map +1 -0
  151. package/build/esm/extensions/behavior/SharedState/plugin.d.ts +3 -0
  152. package/build/esm/extensions/behavior/SharedState/plugin.js +59 -0
  153. package/build/esm/extensions/behavior/SharedState/plugin.js.map +1 -0
  154. package/build/esm/extensions/behavior/SharedState/types.d.ts +1 -0
  155. package/build/esm/extensions/behavior/SharedState/types.js +2 -0
  156. package/build/esm/extensions/behavior/SharedState/types.js.map +1 -0
  157. package/build/esm/extensions/behavior/SharedState/utils.d.ts +29 -0
  158. package/build/esm/extensions/behavior/SharedState/utils.js +56 -0
  159. package/build/esm/extensions/behavior/SharedState/utils.js.map +1 -0
  160. package/build/esm/extensions/behavior/index.d.ts +2 -0
  161. package/build/esm/extensions/behavior/index.js +4 -0
  162. package/build/esm/extensions/behavior/index.js.map +1 -1
  163. package/build/esm/extensions/markdown/Link/plugins/LinkTooltipPlugin/index.js +7 -12
  164. package/build/esm/extensions/markdown/Link/plugins/LinkTooltipPlugin/index.js.map +1 -1
  165. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.d.ts +0 -1
  166. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +8 -7
  167. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
  168. package/build/esm/react-utils/index.d.ts +1 -0
  169. package/build/esm/react-utils/index.js +1 -0
  170. package/build/esm/react-utils/index.js.map +1 -1
  171. package/build/esm/react-utils/useSharedEditingState.d.ts +5 -0
  172. package/build/esm/react-utils/useSharedEditingState.js +22 -0
  173. package/build/esm/react-utils/useSharedEditingState.js.map +1 -0
  174. package/build/esm/toolbar/ToolbarButton.d.ts +6 -8
  175. package/build/esm/toolbar/ToolbarButton.js +2 -2
  176. package/build/esm/toolbar/ToolbarButton.js.map +1 -1
  177. package/build/esm/toolbar/ToolbarListButton.js +8 -9
  178. package/build/esm/toolbar/ToolbarListButton.js.map +1 -1
  179. package/build/esm/utils/descedants.d.ts +8 -0
  180. package/build/esm/utils/descedants.js +12 -0
  181. package/build/esm/utils/descedants.js.map +1 -0
  182. package/build/esm/utils/entity-id.d.ts +11 -0
  183. package/build/esm/utils/entity-id.js +16 -0
  184. package/build/esm/utils/entity-id.js.map +1 -0
  185. package/build/esm/utils/index.d.ts +2 -0
  186. package/build/esm/utils/index.js +2 -0
  187. package/build/esm/utils/index.js.map +1 -1
  188. package/build/esm/version.js +1 -1
  189. package/build/esm/version.js.map +1 -1
  190. package/build/esm/view/hocs/withYfmHtml/index.d.ts +2 -0
  191. package/build/esm/view/hocs/withYfmHtml/index.js +2 -2
  192. package/build/esm/view/hocs/withYfmHtml/index.js.map +1 -1
  193. package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js +3 -1
  194. package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js.map +1 -1
  195. package/package.json +15 -4
@@ -5,6 +5,8 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const icons_1 = require("@gravity-ui/icons");
7
7
  const uikit_1 = require("@gravity-ui/uikit");
8
+ const SharedState_1 = require("../../../behavior/SharedState/index.js");
9
+ const useSharedEditingState_1 = require("../../../../react-utils/useSharedEditingState.js");
8
10
  const classname_1 = require("../../../../classname.js");
9
11
  const TextInput_1 = require("../../../../forms/TextInput.js");
10
12
  const common_1 = require("../../../../i18n/common/index.js");
@@ -49,10 +51,12 @@ const DiagramEditMode = ({ initialText, onSave, onCancel, mermaidInstance }) =>
49
51
  }, autoFocus: true }) }), (0, jsx_runtime_1.jsx)("div", { className: b('Controls'), children: (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(uikit_1.Button, { onClick: onCancel, view: 'flat', children: (0, jsx_runtime_1.jsx)("span", { className: exports.STOP_EVENT_CLASSNAME, children: (0, common_1.i18n)('cancel') }) }), (0, jsx_runtime_1.jsx)(uikit_1.Button, { onClick: () => onSave(text), view: 'action', children: (0, jsx_runtime_1.jsx)("span", { className: exports.STOP_EVENT_CLASSNAME, children: (0, common_1.i18n)('save') }) })] }) })] })] }));
50
52
  };
51
53
  const MermaidView = ({ onChange, node, getPos, view, getMermaidInstance }) => {
52
- const [mermaidInstance, setMermaidInstance] = (0, react_1.useState)(null);
53
- const [editing, setEditing, unsetEditing, toggleEditing] = (0, react_utils_1.useBooleanState)(Boolean(node.attrs[const_1.MermaidConsts.NodeAttrs.newCreated]));
54
+ const enitityId = node.attrs[const_1.MermaidConsts.NodeAttrs.EntityId];
55
+ const entityKey = (0, react_1.useMemo)(() => SharedState_1.SharedStateKey.define({ name: enitityId }), [enitityId]);
56
+ const [editing, setEditing, unsetEditing] = (0, useSharedEditingState_1.useSharedEditingState)(view, entityKey);
54
57
  const [menuOpen, , closeMenu, toggleMenuOpen] = (0, react_utils_1.useBooleanState)(false);
55
58
  const [anchorElement, setAnchorElement] = (0, react_utils_1.useElementState)();
59
+ const [mermaidInstance, setMermaidInstance] = (0, react_1.useState)(null);
56
60
  (0, react_1.useEffect)(() => {
57
61
  const waitForMermaid = () => setTimeout(() => {
58
62
  const instance = getMermaidInstance();
@@ -71,7 +75,7 @@ const MermaidView = ({ onChange, node, getPos, view, getMermaidInstance }) => {
71
75
  } }));
72
76
  }
73
77
  return ((0, jsx_runtime_1.jsxs)("div", { className: b(), onDoubleClick: setEditing, children: [(0, jsx_runtime_1.jsx)(MermaidPreview, { mermaidInstance: mermaidInstance, text: node.attrs[const_1.MermaidConsts.NodeAttrs.content] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(uikit_1.Button, { onClick: toggleMenuOpen, ref: setAnchorElement, size: 's', className: exports.STOP_EVENT_CLASSNAME, children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Ellipsis, className: exports.STOP_EVENT_CLASSNAME }) }), (0, jsx_runtime_1.jsx)(uikit_1.Popup, { open: menuOpen, anchorElement: anchorElement, onOpenChange: closeMenu, placement: "bottom-end", children: (0, jsx_runtime_1.jsxs)(uikit_1.Menu, { children: [(0, jsx_runtime_1.jsx)(uikit_1.Menu.Item, { onClick: () => {
74
- toggleEditing();
78
+ setEditing();
75
79
  closeMenu();
76
80
  }, children: (0, common_1.i18n)('edit') }), (0, jsx_runtime_1.jsx)(uikit_1.Menu.Item, { onClick: () => {
77
81
  const pos = getPos();
@@ -1 +1 @@
1
- {"version":3,"file":"MermaidView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/Mermaid/MermaidNodeView/MermaidView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useEffect, useState} from 'react';\n\nimport {Ellipsis as DotsIcon} from '@gravity-ui/icons';\nimport {Button, Icon, Loader, Menu, Popup} from '@gravity-ui/uikit';\nimport type {Mermaid} from 'mermaid' with {'resolution-mode': 'import'};\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from '../../../../classname';\nimport {TextAreaFixed as TextArea} from '../../../../forms/TextInput';\nimport {i18n} from '../../../../i18n/common';\nimport {useBooleanState, useElementState} from '../../../../react-utils';\nimport {removeNode} from '../../../../utils';\nimport {MermaidConsts} from '../MermaidSpecs/const';\nexport const cnMermaid = cn('Mermaid');\n\nexport const STOP_EVENT_CLASSNAME = 'prosemirror-stop-event';\n\nimport './Mermaid.scss';\n\nconst b = cnMermaid;\n\nconst MermaidPreview: React.FC<{mermaidInstance: Mermaid | null; text: string}> = ({\n mermaidInstance,\n text = '',\n}) => {\n const [svg, setSvg] = useState<string>();\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const p = async () => {\n if (mermaidInstance) {\n try {\n // Validates syntax and throws error if text is invalid\n await mermaidInstance.parse(text);\n\n const {svg: S} = await mermaidInstance.render(`mermaid-${Date.now()}`, text);\n\n setSvg(S);\n setError(null);\n } catch (e) {\n setError((e as Error).message);\n }\n }\n };\n\n p();\n }, [mermaidInstance, text]);\n\n if (error) {\n return <div className={b('Error')}>{error && <div>{error}</div>}</div>;\n }\n\n return (\n <div className={b('Preview')}>\n {svg ? <div className=\"mermaid\" dangerouslySetInnerHTML={{__html: svg}} /> : <Loader />}\n </div>\n );\n};\n\nconst DiagramEditMode: React.FC<{\n initialText: string;\n mermaidInstance: Mermaid | null;\n onSave: (v: string) => void;\n onCancel: () => void;\n}> = ({initialText, onSave, onCancel, mermaidInstance}) => {\n const [text, setText] = useState(initialText || '');\n\n return (\n <div className={b()}>\n <MermaidPreview mermaidInstance={mermaidInstance} text={text} />\n <div className={b('Editor')}>\n <div>\n <TextArea\n controlProps={{\n className: STOP_EVENT_CLASSNAME,\n }}\n value={text}\n onUpdate={(v) => {\n setText(v);\n }}\n autoFocus\n />\n </div>\n <div className={b('Controls')}>\n <div>\n <Button onClick={onCancel} view={'flat'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('cancel')}</span>\n </Button>\n <Button onClick={() => onSave(text)} view={'action'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('save')}</span>\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport const MermaidView: React.FC<{\n view: EditorView;\n onChange: (attrs: {[MermaidConsts.NodeAttrs.content]: string}) => void;\n getMermaidInstance: () => Mermaid;\n node: Node;\n getPos: () => number | undefined;\n}> = ({onChange, node, getPos, view, getMermaidInstance}) => {\n const [mermaidInstance, setMermaidInstance] = useState<Mermaid | null>(null);\n const [editing, setEditing, unsetEditing, toggleEditing] = useBooleanState(\n Boolean(node.attrs[MermaidConsts.NodeAttrs.newCreated]),\n );\n const [menuOpen, , closeMenu, toggleMenuOpen] = useBooleanState(false);\n const [anchorElement, setAnchorElement] = useElementState();\n\n useEffect(() => {\n const waitForMermaid = () =>\n setTimeout(() => {\n const instance = getMermaidInstance();\n if (instance) {\n setMermaidInstance(instance);\n\n return;\n }\n\n waitForMermaid();\n }, 100);\n\n waitForMermaid();\n }, []);\n\n if (editing) {\n return (\n <DiagramEditMode\n initialText={node.attrs[MermaidConsts.NodeAttrs.content]}\n mermaidInstance={mermaidInstance}\n onCancel={unsetEditing}\n onSave={(v) => {\n onChange({[MermaidConsts.NodeAttrs.content]: v});\n unsetEditing();\n }}\n />\n );\n }\n\n return (\n <div className={b()} onDoubleClick={setEditing}>\n <MermaidPreview\n mermaidInstance={mermaidInstance}\n text={node.attrs[MermaidConsts.NodeAttrs.content]}\n />\n <div>\n <Button\n onClick={toggleMenuOpen}\n ref={setAnchorElement}\n size={'s'}\n className={STOP_EVENT_CLASSNAME}\n >\n <Icon data={DotsIcon} className={STOP_EVENT_CLASSNAME} />\n </Button>\n <Popup\n open={menuOpen}\n anchorElement={anchorElement}\n onOpenChange={closeMenu}\n placement=\"bottom-end\"\n >\n <Menu>\n <Menu.Item\n onClick={() => {\n toggleEditing();\n closeMenu();\n }}\n >\n {i18n('edit')}\n </Menu.Item>\n <Menu.Item\n onClick={() => {\n const pos = getPos();\n if (pos === undefined) return;\n removeNode({\n node,\n pos,\n tr: view.state.tr,\n dispatch: view.dispatch,\n });\n }}\n >\n {i18n('remove')}\n </Menu.Item>\n </Menu>\n </Popup>\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"MermaidView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/Mermaid/MermaidNodeView/MermaidView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useEffect, useMemo, useState} from 'react';\n\nimport {Ellipsis as DotsIcon} from '@gravity-ui/icons';\nimport {Button, Icon, Loader, Menu, Popup} from '@gravity-ui/uikit';\nimport type {Mermaid} from 'mermaid' with {'resolution-mode': 'import'};\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {SharedStateKey} from 'src/extensions/behavior/SharedState';\nimport {useSharedEditingState} from 'src/react-utils/useSharedEditingState';\n\nimport {cn} from '../../../../classname';\nimport {TextAreaFixed as TextArea} from '../../../../forms/TextInput';\nimport {i18n} from '../../../../i18n/common';\nimport {useBooleanState, useElementState} from '../../../../react-utils';\nimport {removeNode} from '../../../../utils';\nimport {MermaidConsts} from '../MermaidSpecs/const';\nimport type {MermaidEntitySharedState} from '../types';\n\nexport const cnMermaid = cn('Mermaid');\n\nexport const STOP_EVENT_CLASSNAME = 'prosemirror-stop-event';\n\nimport './Mermaid.scss';\n\nconst b = cnMermaid;\n\nconst MermaidPreview: React.FC<{mermaidInstance: Mermaid | null; text: string}> = ({\n mermaidInstance,\n text = '',\n}) => {\n const [svg, setSvg] = useState<string>();\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const p = async () => {\n if (mermaidInstance) {\n try {\n // Validates syntax and throws error if text is invalid\n await mermaidInstance.parse(text);\n\n const {svg: S} = await mermaidInstance.render(`mermaid-${Date.now()}`, text);\n\n setSvg(S);\n setError(null);\n } catch (e) {\n setError((e as Error).message);\n }\n }\n };\n\n p();\n }, [mermaidInstance, text]);\n\n if (error) {\n return <div className={b('Error')}>{error && <div>{error}</div>}</div>;\n }\n\n return (\n <div className={b('Preview')}>\n {svg ? <div className=\"mermaid\" dangerouslySetInnerHTML={{__html: svg}} /> : <Loader />}\n </div>\n );\n};\n\nconst DiagramEditMode: React.FC<{\n initialText: string;\n mermaidInstance: Mermaid | null;\n onSave: (v: string) => void;\n onCancel: () => void;\n}> = ({initialText, onSave, onCancel, mermaidInstance}) => {\n const [text, setText] = useState(initialText || '');\n\n return (\n <div className={b()}>\n <MermaidPreview mermaidInstance={mermaidInstance} text={text} />\n <div className={b('Editor')}>\n <div>\n <TextArea\n controlProps={{\n className: STOP_EVENT_CLASSNAME,\n }}\n value={text}\n onUpdate={(v) => {\n setText(v);\n }}\n autoFocus\n />\n </div>\n <div className={b('Controls')}>\n <div>\n <Button onClick={onCancel} view={'flat'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('cancel')}</span>\n </Button>\n <Button onClick={() => onSave(text)} view={'action'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('save')}</span>\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport const MermaidView: React.FC<{\n view: EditorView;\n onChange: (attrs: {[MermaidConsts.NodeAttrs.content]: string}) => void;\n getMermaidInstance: () => Mermaid;\n node: Node;\n getPos: () => number | undefined;\n}> = ({onChange, node, getPos, view, getMermaidInstance}) => {\n const enitityId: string = node.attrs[MermaidConsts.NodeAttrs.EntityId];\n const entityKey = useMemo(\n () => SharedStateKey.define<MermaidEntitySharedState>({name: enitityId}),\n [enitityId],\n );\n\n const [editing, setEditing, unsetEditing] = useSharedEditingState(view, entityKey);\n const [menuOpen, , closeMenu, toggleMenuOpen] = useBooleanState(false);\n const [anchorElement, setAnchorElement] = useElementState();\n\n const [mermaidInstance, setMermaidInstance] = useState<Mermaid | null>(null);\n useEffect(() => {\n const waitForMermaid = () =>\n setTimeout(() => {\n const instance = getMermaidInstance();\n if (instance) {\n setMermaidInstance(instance);\n\n return;\n }\n\n waitForMermaid();\n }, 100);\n\n waitForMermaid();\n }, []);\n\n if (editing) {\n return (\n <DiagramEditMode\n initialText={node.attrs[MermaidConsts.NodeAttrs.content]}\n mermaidInstance={mermaidInstance}\n onCancel={unsetEditing}\n onSave={(v) => {\n onChange({[MermaidConsts.NodeAttrs.content]: v});\n unsetEditing();\n }}\n />\n );\n }\n\n return (\n <div className={b()} onDoubleClick={setEditing}>\n <MermaidPreview\n mermaidInstance={mermaidInstance}\n text={node.attrs[MermaidConsts.NodeAttrs.content]}\n />\n <div>\n <Button\n onClick={toggleMenuOpen}\n ref={setAnchorElement}\n size={'s'}\n className={STOP_EVENT_CLASSNAME}\n >\n <Icon data={DotsIcon} className={STOP_EVENT_CLASSNAME} />\n </Button>\n <Popup\n open={menuOpen}\n anchorElement={anchorElement}\n onOpenChange={closeMenu}\n placement=\"bottom-end\"\n >\n <Menu>\n <Menu.Item\n onClick={() => {\n setEditing();\n closeMenu();\n }}\n >\n {i18n('edit')}\n </Menu.Item>\n <Menu.Item\n onClick={() => {\n const pos = getPos();\n if (pos === undefined) return;\n removeNode({\n node,\n pos,\n tr: view.state.tr,\n dispatch: view.dispatch,\n });\n }}\n >\n {i18n('remove')}\n </Menu.Item>\n </Menu>\n </Popup>\n </div>\n </div>\n );\n};\n"]}
@@ -14,6 +14,7 @@ export declare class WMermaidNodeView implements NodeView {
14
14
  destroy(): void;
15
15
  ignoreMutation(): boolean;
16
16
  stopEvent(e: Event): boolean;
17
+ private validateEntityId;
17
18
  private onChange;
18
19
  private getMermaidInstance;
19
20
  private renderMermaid;
@@ -3,7 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WMermaidNodeView = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const uikit_1 = require("@gravity-ui/uikit");
6
- const behavior_1 = require("../../../behavior/index.js");
6
+ const ReactRenderer_1 = require("../../../behavior/ReactRenderer/index.js");
7
+ const entity_id_1 = require("../../../../utils/entity-id.js");
8
+ const const_1 = require("../MermaidSpecs/const.js");
7
9
  const MermaidView_1 = require("./MermaidView.js");
8
10
  let mermaidInstance;
9
11
  class WMermaidNodeView {
@@ -23,7 +25,8 @@ class WMermaidNodeView {
23
25
  this.getPos = getPos;
24
26
  this.loadRuntimeScript = loadRuntimeScript;
25
27
  this.initializeMermaid();
26
- this.renderItem = (0, behavior_1.getReactRendererFromState)(view.state).createItem('mermaid-view', this.renderMermaid.bind(this));
28
+ this.renderItem = (0, ReactRenderer_1.getReactRendererFromState)(view.state).createItem('mermaid-view', this.renderMermaid.bind(this));
29
+ this.validateEntityId();
27
30
  }
28
31
  initializeMermaid() {
29
32
  // https://github.com/diplodoc-platform/mermaid-extension/tree/master#prepared-mermaid-runtime
@@ -50,6 +53,16 @@ class WMermaidNodeView {
50
53
  const target = e.target;
51
54
  return target.classList.contains(MermaidView_1.STOP_EVENT_CLASSNAME);
52
55
  }
56
+ validateEntityId() {
57
+ if ((0, entity_id_1.isInvalidEntityId)({
58
+ node: this.node,
59
+ doc: this.view.state.doc,
60
+ defaultId: const_1.defaultMermaidEntityId,
61
+ })) {
62
+ const newId = (0, entity_id_1.generateEntityId)(const_1.MermaidConsts.NodeName);
63
+ this.view.dispatch(this.view.state.tr.setNodeAttribute(this.getPos(), const_1.MermaidConsts.NodeAttrs.EntityId, newId));
64
+ }
65
+ }
53
66
  onChange(attrs) {
54
67
  const pos = this.getPos();
55
68
  if (pos === undefined)
@@ -1 +1 @@
1
- {"version":3,"file":"NodeView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/Mermaid/MermaidNodeView/NodeView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Portal} from '@gravity-ui/uikit';\nimport type {Mermaid} from 'mermaid' with {'resolution-mode': 'import'};\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView, NodeView} from 'prosemirror-view';\n\nimport type {MermaidOptions} from '..';\nimport {getReactRendererFromState} from '../../../behavior';\nimport type {MermaidConsts} from '../MermaidSpecs/const';\n\nimport {MermaidView, STOP_EVENT_CLASSNAME} from './MermaidView';\n\nlet mermaidInstance: Mermaid;\n\nexport class WMermaidNodeView implements NodeView {\n readonly dom: HTMLElement;\n private node: Node;\n private readonly view;\n private readonly getPos;\n private readonly renderItem;\n private readonly loadRuntimeScript: () => void;\n\n constructor(\n node: Node,\n view: EditorView,\n getPos: () => number | undefined,\n opts: MermaidOptions,\n ) {\n const {loadRuntimeScript} = opts;\n this.node = node;\n this.dom = document.createElement('div');\n this.dom.classList.add('mermaid-container');\n this.dom.contentEditable = 'false';\n this.view = view;\n this.getPos = getPos;\n this.loadRuntimeScript = loadRuntimeScript;\n this.initializeMermaid();\n this.renderItem = getReactRendererFromState(view.state).createItem(\n 'mermaid-view',\n this.renderMermaid.bind(this),\n );\n }\n\n initializeMermaid() {\n // https://github.com/diplodoc-platform/mermaid-extension/tree/master#prepared-mermaid-runtime\n window.mermaidJsonp = window.mermaidJsonp || [];\n window.mermaidJsonp.push((mermaid: Mermaid) => {\n mermaidInstance = mermaid;\n });\n\n this.loadRuntimeScript();\n }\n\n update(node: Node) {\n if (node.type !== this.node.type) return false;\n this.node = node;\n this.renderItem.rerender();\n return true;\n }\n\n destroy() {\n this.renderItem.remove();\n }\n\n ignoreMutation() {\n return true;\n }\n\n stopEvent(e: Event) {\n const target = e.target as Element;\n return target.classList.contains(STOP_EVENT_CLASSNAME);\n }\n\n private onChange(attrs: {[MermaidConsts.NodeAttrs.content]: string}) {\n const pos = this.getPos();\n if (pos === undefined) return;\n\n const tr = this.view.state.tr.setNodeMarkup(\n pos,\n undefined,\n {\n ...this.node.attrs,\n ...attrs,\n },\n [],\n );\n\n this.view.dispatch(tr);\n }\n\n private getMermaidInstance = () => mermaidInstance;\n\n private renderMermaid() {\n return (\n <Portal container={this.dom}>\n <MermaidView\n view={this.view}\n onChange={this.onChange.bind(this)}\n node={this.node}\n getMermaidInstance={this.getMermaidInstance}\n getPos={this.getPos}\n />\n </Portal>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"NodeView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/Mermaid/MermaidNodeView/NodeView.tsx"],"names":[],"mappings":";;;;AAAA,6CAAyC;AAKzC,4EAAgF;AAChF,8DAAwE;AAGxE,oDAA4E;AAE5E,kDAAgE;AAEhE,IAAI,eAAwB,CAAC;AAE7B,MAAa,gBAAgB;IAChB,GAAG,CAAc;IAClB,IAAI,CAAO;IACF,IAAI,CAAC;IACL,MAAM,CAAC;IACP,UAAU,CAAC;IACX,iBAAiB,CAAa;IAE/C,YACI,IAAU,EACV,IAAgB,EAChB,MAAgC,EAChC,IAAoB;QAEpB,MAAM,EAAC,iBAAiB,EAAC,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,OAAO,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,IAAA,yCAAyB,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAC9D,cAAc,EACd,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAChC,CAAC;QAEF,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IAED,iBAAiB;QACb,8FAA8F;QAC9F,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;QAChD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,OAAgB,EAAE,EAAE;YAC1C,eAAe,GAAG,OAAO,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,IAAU;QACb,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO;QACH,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;IAC7B,CAAC;IAED,cAAc;QACV,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,CAAQ;QACd,MAAM,MAAM,GAAG,CAAC,CAAC,MAAiB,CAAC;QACnC,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,kCAAoB,CAAC,CAAC;IAC3D,CAAC;IAEO,gBAAgB;QACpB,IACI,IAAA,6BAAiB,EAAC;YACd,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG;YACxB,SAAS,EAAE,8BAAsB;SACpC,CAAC,EACJ,CAAC;YACC,MAAM,KAAK,GAAG,IAAA,4BAAgB,EAAC,qBAAa,CAAC,QAAQ,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,QAAQ,CACd,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAC/B,IAAI,CAAC,MAAM,EAAG,EACd,qBAAa,CAAC,SAAS,CAAC,QAAQ,EAChC,KAAK,CACR,CACJ,CAAC;QACN,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,KAAkD;QAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO;QAE9B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CACvC,GAAG,EACH,SAAS,EACT;YACI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK;YAClB,GAAG,KAAK;SACX,EACD,EAAE,CACL,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAEO,kBAAkB,GAAG,GAAG,EAAE,CAAC,eAAe,CAAC;IAE3C,aAAa;QACjB,OAAO,CACH,uBAAC,cAAM,IAAC,SAAS,EAAE,IAAI,CAAC,GAAG,YACvB,uBAAC,yBAAW,IACR,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAClC,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAC3C,MAAM,EAAE,IAAI,CAAC,MAAM,GACrB,GACG,CACZ,CAAC;IACN,CAAC;CACJ;AAhHD,4CAgHC","sourcesContent":["import {Portal} from '@gravity-ui/uikit';\nimport type {Mermaid} from 'mermaid' with {'resolution-mode': 'import'};\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView, NodeView} from 'prosemirror-view';\n\nimport {getReactRendererFromState} from 'src/extensions/behavior/ReactRenderer';\nimport {generateEntityId, isInvalidEntityId} from 'src/utils/entity-id';\n\nimport type {MermaidOptions} from '..';\nimport {MermaidConsts, defaultMermaidEntityId} from '../MermaidSpecs/const';\n\nimport {MermaidView, STOP_EVENT_CLASSNAME} from './MermaidView';\n\nlet mermaidInstance: Mermaid;\n\nexport class WMermaidNodeView implements NodeView {\n readonly dom: HTMLElement;\n private node: Node;\n private readonly view;\n private readonly getPos;\n private readonly renderItem;\n private readonly loadRuntimeScript: () => void;\n\n constructor(\n node: Node,\n view: EditorView,\n getPos: () => number | undefined,\n opts: MermaidOptions,\n ) {\n const {loadRuntimeScript} = opts;\n this.node = node;\n this.dom = document.createElement('div');\n this.dom.classList.add('mermaid-container');\n this.dom.contentEditable = 'false';\n this.view = view;\n this.getPos = getPos;\n this.loadRuntimeScript = loadRuntimeScript;\n this.initializeMermaid();\n this.renderItem = getReactRendererFromState(view.state).createItem(\n 'mermaid-view',\n this.renderMermaid.bind(this),\n );\n\n this.validateEntityId();\n }\n\n initializeMermaid() {\n // https://github.com/diplodoc-platform/mermaid-extension/tree/master#prepared-mermaid-runtime\n window.mermaidJsonp = window.mermaidJsonp || [];\n window.mermaidJsonp.push((mermaid: Mermaid) => {\n mermaidInstance = mermaid;\n });\n\n this.loadRuntimeScript();\n }\n\n update(node: Node) {\n if (node.type !== this.node.type) return false;\n this.node = node;\n this.renderItem.rerender();\n return true;\n }\n\n destroy() {\n this.renderItem.remove();\n }\n\n ignoreMutation() {\n return true;\n }\n\n stopEvent(e: Event) {\n const target = e.target as Element;\n return target.classList.contains(STOP_EVENT_CLASSNAME);\n }\n\n private validateEntityId() {\n if (\n isInvalidEntityId({\n node: this.node,\n doc: this.view.state.doc,\n defaultId: defaultMermaidEntityId,\n })\n ) {\n const newId = generateEntityId(MermaidConsts.NodeName);\n this.view.dispatch(\n this.view.state.tr.setNodeAttribute(\n this.getPos()!,\n MermaidConsts.NodeAttrs.EntityId,\n newId,\n ),\n );\n }\n }\n\n private onChange(attrs: {[MermaidConsts.NodeAttrs.content]: string}) {\n const pos = this.getPos();\n if (pos === undefined) return;\n\n const tr = this.view.state.tr.setNodeMarkup(\n pos,\n undefined,\n {\n ...this.node.attrs,\n ...attrs,\n },\n [],\n );\n\n this.view.dispatch(tr);\n }\n\n private getMermaidInstance = () => mermaidInstance;\n\n private renderMermaid() {\n return (\n <Portal container={this.dom}>\n <MermaidView\n view={this.view}\n onChange={this.onChange.bind(this)}\n node={this.node}\n getMermaidInstance={this.getMermaidInstance}\n getPos={this.getPos}\n />\n </Portal>\n );\n }\n}\n"]}
@@ -1,6 +1,8 @@
1
1
  export declare enum MermaidAttrs {
2
+ EntityId = "data-entity-id",
2
3
  content = "content",
3
4
  class = "class",
5
+ /** @deprecated This is no longer used. Removed in next major version */
4
6
  newCreated = "newCreated"
5
7
  }
6
8
  export declare const mermaidNodeName = "mermaid";
@@ -11,3 +13,4 @@ export declare const MermaidConsts: {
11
13
  readonly NodeAttrs: typeof MermaidAttrs;
12
14
  readonly nodeType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
13
15
  };
16
+ export declare const defaultMermaidEntityId: string;
@@ -1,11 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MermaidConsts = exports.MermaidAction = exports.mermaidNodeType = exports.mermaidNodeName = exports.MermaidAttrs = void 0;
3
+ exports.defaultMermaidEntityId = exports.MermaidConsts = exports.MermaidAction = exports.mermaidNodeType = exports.mermaidNodeName = exports.MermaidAttrs = void 0;
4
+ const entity_id_1 = require("../../../../utils/entity-id.js");
4
5
  const schema_1 = require("../../../../utils/schema.js");
5
6
  var MermaidAttrs;
6
7
  (function (MermaidAttrs) {
8
+ // @ts-expect-error error TS18055
9
+ MermaidAttrs["EntityId"] = "data-entity-id";
7
10
  MermaidAttrs["content"] = "content";
8
11
  MermaidAttrs["class"] = "class";
12
+ // MAJOR: remove before next major
13
+ /** @deprecated This is no longer used. Removed in next major version */
9
14
  MermaidAttrs["newCreated"] = "newCreated";
10
15
  })(MermaidAttrs || (exports.MermaidAttrs = MermaidAttrs = {}));
11
16
  exports.mermaidNodeName = 'mermaid';
@@ -16,4 +21,5 @@ exports.MermaidConsts = {
16
21
  NodeAttrs: MermaidAttrs,
17
22
  nodeType: exports.mermaidNodeType,
18
23
  };
24
+ exports.defaultMermaidEntityId = exports.mermaidNodeName + '#0';
19
25
  //# sourceMappingURL=const.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/Mermaid/MermaidSpecs/const.ts"],"names":[],"mappings":";;;AAAA,wDAAyD;AAEzD,IAAY,YAIX;AAJD,WAAY,YAAY;IACpB,mCAAmB,CAAA;IACnB,+BAAe,CAAA;IACf,yCAAyB,CAAA;AAC7B,CAAC,EAJW,YAAY,4BAAZ,YAAY,QAIvB;AAEY,QAAA,eAAe,GAAG,SAAS,CAAC;AAC5B,QAAA,eAAe,GAAG,IAAA,wBAAe,EAAC,uBAAe,CAAC,CAAC;AAEnD,QAAA,aAAa,GAAG,eAAe,CAAC;AAEhC,QAAA,aAAa,GAAG;IACzB,QAAQ,EAAE,uBAAe;IACzB,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,uBAAe;CACnB,CAAC","sourcesContent":["import {nodeTypeFactory} from '../../../../utils/schema';\n\nexport enum MermaidAttrs {\n content = 'content',\n class = 'class',\n newCreated = 'newCreated',\n}\n\nexport const mermaidNodeName = 'mermaid';\nexport const mermaidNodeType = nodeTypeFactory(mermaidNodeName);\n\nexport const MermaidAction = 'createMermaid';\n\nexport const MermaidConsts = {\n NodeName: mermaidNodeName,\n NodeAttrs: MermaidAttrs,\n nodeType: mermaidNodeType,\n} as const;\n"]}
1
+ {"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/Mermaid/MermaidSpecs/const.ts"],"names":[],"mappings":";;;AAAA,8DAAiD;AACjD,wDAAiD;AAEjD,IAAY,YAQX;AARD,WAAY,YAAY;IACpB,iCAAiC;IACjC,2CAAuB,CAAA;IACvB,mCAAmB,CAAA;IACnB,+BAAe,CAAA;IACf,kCAAkC;IAClC,wEAAwE;IACxE,yCAAyB,CAAA;AAC7B,CAAC,EARW,YAAY,4BAAZ,YAAY,QAQvB;AAEY,QAAA,eAAe,GAAG,SAAS,CAAC;AAC5B,QAAA,eAAe,GAAG,IAAA,wBAAe,EAAC,uBAAe,CAAC,CAAC;AAEnD,QAAA,aAAa,GAAG,eAAe,CAAC;AAEhC,QAAA,aAAa,GAAG;IACzB,QAAQ,EAAE,uBAAe;IACzB,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,uBAAe;CACnB,CAAC;AAEE,QAAA,sBAAsB,GAAG,uBAAe,GAAG,IAAI,CAAC","sourcesContent":["import {entityIdAttr} from 'src/utils/entity-id';\nimport {nodeTypeFactory} from 'src/utils/schema';\n\nexport enum MermaidAttrs {\n // @ts-expect-error error TS18055\n EntityId = entityIdAttr,\n content = 'content',\n class = 'class',\n // MAJOR: remove before next major\n /** @deprecated This is no longer used. Removed in next major version */\n newCreated = 'newCreated',\n}\n\nexport const mermaidNodeName = 'mermaid';\nexport const mermaidNodeType = nodeTypeFactory(mermaidNodeName);\n\nexport const MermaidAction = 'createMermaid';\n\nexport const MermaidConsts = {\n NodeName: mermaidNodeName,\n NodeAttrs: MermaidAttrs,\n nodeType: mermaidNodeType,\n} as const;\n\nexport const defaultMermaidEntityId = mermaidNodeName + '#0';\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { ExtensionNodeSpec } from "../../../../core/index.js";
2
- export { mermaidNodeName } from "./const.js";
2
+ export { mermaidNodeName, MermaidConsts } from "./const.js";
3
3
  export type MermaidSpecsOptions = {
4
4
  nodeView?: ExtensionNodeSpec['view'];
5
5
  };
@@ -1,11 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MermaidSpecs = exports.mermaidNodeName = void 0;
3
+ exports.MermaidSpecs = exports.MermaidConsts = exports.mermaidNodeName = void 0;
4
4
  // eslint-disable-next-line import/no-extraneous-dependencies
5
5
  const mermaid_extension_1 = require("@diplodoc/mermaid-extension");
6
+ const entity_id_1 = require("../../../../utils/entity-id.js");
6
7
  const const_1 = require("./const.js");
7
8
  var const_2 = require("./const.js");
8
9
  Object.defineProperty(exports, "mermaidNodeName", { enumerable: true, get: function () { return const_2.mermaidNodeName; } });
10
+ Object.defineProperty(exports, "MermaidConsts", { enumerable: true, get: function () { return const_2.MermaidConsts; } });
9
11
  const MermaidSpecsExtension = (builder, { nodeView }) => {
10
12
  builder
11
13
  .configureMd((md) => md.use((0, mermaid_extension_1.transform)({ runtime: 'mermaid', bundle: false }), {}))
@@ -14,7 +16,10 @@ const MermaidSpecsExtension = (builder, { nodeView }) => {
14
16
  tokenSpec: {
15
17
  name: const_1.mermaidNodeName,
16
18
  type: 'node',
17
- getAttrs: ({ content }) => ({ content }),
19
+ getAttrs: ({ content }) => ({
20
+ [const_1.MermaidConsts.NodeAttrs.content]: content,
21
+ [const_1.MermaidConsts.NodeAttrs.EntityId]: (0, entity_id_1.generateEntityId)(const_1.mermaidNodeName),
22
+ }),
18
23
  },
19
24
  },
20
25
  spec: {
@@ -24,6 +29,7 @@ const MermaidSpecsExtension = (builder, { nodeView }) => {
24
29
  attrs: {
25
30
  [const_1.MermaidConsts.NodeAttrs.content]: { default: '' },
26
31
  [const_1.MermaidConsts.NodeAttrs.class]: { default: 'mermaid' },
32
+ [const_1.MermaidConsts.NodeAttrs.EntityId]: { default: const_1.defaultMermaidEntityId },
27
33
  [const_1.MermaidConsts.NodeAttrs.newCreated]: { default: null },
28
34
  },
29
35
  parseDOM: [],
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/Mermaid/MermaidSpecs/index.tsx"],"names":[],"mappings":";;;AAAA,6DAA6D;AAC7D,mEAAsD;AAItD,sCAAuD;AACvD,oCAAwC;AAAhC,wGAAA,eAAe,OAAA;AAMvB,MAAM,qBAAqB,GAAuC,CAAC,OAAO,EAAE,EAAC,QAAQ,EAAC,EAAE,EAAE;IACtF,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,IAAA,6BAAS,EAAC,EAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SAC/E,OAAO,CAAC,uBAAe,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7B,MAAM,EAAE;YACJ,SAAS,EAAE;gBACP,IAAI,EAAE,uBAAe;gBACrB,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,CAAC,EAAC,OAAO,EAAC,EAAE,EAAE,CAAC,CAAC,EAAC,OAAO,EAAC,CAAC;aACvC;SACJ;QACD,IAAI,EAAE;YACF,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,OAAO;YACd,KAAK,EAAE;gBACH,CAAC,qBAAa,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAC,OAAO,EAAE,EAAE,EAAC;gBAChD,CAAC,qBAAa,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAC,OAAO,EAAE,SAAS,EAAC;gBACrD,CAAC,qBAAa,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;aACxD;YACD,QAAQ,EAAE,EAAE;YACZ,KAAK,CAAC,IAAI;gBACN,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;YACD,GAAG,EAAE,EAAC,KAAK,EAAE,EAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,EAAC;SACjC;QACD,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAClB,MAAM,OAAO,GAAW,IAAI,CAAC,KAAK,CAAC,qBAAa,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAE1E,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC1B,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;YAClC,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,KAAK,CAAC,aAAa,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AAEW,QAAA,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,qBAAa,CAAC,CAAC","sourcesContent":["// eslint-disable-next-line import/no-extraneous-dependencies\nimport {transform} from '@diplodoc/mermaid-extension';\n\nimport type {ExtensionAuto, ExtensionNodeSpec} from '../../../../core';\n\nimport {MermaidConsts, mermaidNodeName} from './const';\nexport {mermaidNodeName} from './const';\n\nexport type MermaidSpecsOptions = {\n nodeView?: ExtensionNodeSpec['view'];\n};\n\nconst MermaidSpecsExtension: ExtensionAuto<MermaidSpecsOptions> = (builder, {nodeView}) => {\n builder\n .configureMd((md) => md.use(transform({runtime: 'mermaid', bundle: false}), {}))\n .addNode(mermaidNodeName, () => ({\n fromMd: {\n tokenSpec: {\n name: mermaidNodeName,\n type: 'node',\n getAttrs: ({content}) => ({content}),\n },\n },\n spec: {\n selectable: true,\n atom: true,\n group: 'block',\n attrs: {\n [MermaidConsts.NodeAttrs.content]: {default: ''},\n [MermaidConsts.NodeAttrs.class]: {default: 'mermaid'},\n [MermaidConsts.NodeAttrs.newCreated]: {default: null},\n },\n parseDOM: [],\n toDOM(node) {\n return ['div', node.attrs];\n },\n dnd: {props: {offset: [8, 1]}},\n },\n toMd: (state, node) => {\n const content: string = node.attrs[MermaidConsts.NodeAttrs.content] || '';\n\n state.write('```mermaid');\n state.ensureNewLine();\n state.text(content.trim(), false);\n state.ensureNewLine();\n state.write('```');\n state.ensureNewLine();\n },\n view: nodeView,\n }));\n};\n\nexport const MermaidSpecs = Object.assign(MermaidSpecsExtension, MermaidConsts);\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/Mermaid/MermaidSpecs/index.tsx"],"names":[],"mappings":";;;AAAA,6DAA6D;AAC7D,mEAAsD;AAGtD,8DAAqD;AAErD,sCAA+E;AAC/E,oCAAuD;AAA/C,wGAAA,eAAe,OAAA;AAAE,sGAAA,aAAa,OAAA;AAMtC,MAAM,qBAAqB,GAAuC,CAAC,OAAO,EAAE,EAAC,QAAQ,EAAC,EAAE,EAAE;IACtF,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,IAAA,6BAAS,EAAC,EAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SAC/E,OAAO,CAAC,uBAAe,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7B,MAAM,EAAE;YACJ,SAAS,EAAE;gBACP,IAAI,EAAE,uBAAe;gBACrB,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,CAAC,EAAC,OAAO,EAAC,EAAE,EAAE,CAAC,CAAC;oBACtB,CAAC,qBAAa,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO;oBAC1C,CAAC,qBAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAA,4BAAgB,EAAC,uBAAe,CAAC;iBACxE,CAAC;aACL;SACJ;QACD,IAAI,EAAE;YACF,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,OAAO;YACd,KAAK,EAAE;gBACH,CAAC,qBAAa,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAC,OAAO,EAAE,EAAE,EAAC;gBAChD,CAAC,qBAAa,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAC,OAAO,EAAE,SAAS,EAAC;gBACrD,CAAC,qBAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAC,OAAO,EAAE,8BAAsB,EAAC;gBACrE,CAAC,qBAAa,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;aACxD;YACD,QAAQ,EAAE,EAAE;YACZ,KAAK,CAAC,IAAI;gBACN,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;YACD,GAAG,EAAE,EAAC,KAAK,EAAE,EAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,EAAC;SACjC;QACD,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAClB,MAAM,OAAO,GAAW,IAAI,CAAC,KAAK,CAAC,qBAAa,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAE1E,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC1B,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;YAClC,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,KAAK,CAAC,aAAa,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AAEW,QAAA,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,qBAAa,CAAC,CAAC","sourcesContent":["// eslint-disable-next-line import/no-extraneous-dependencies\nimport {transform} from '@diplodoc/mermaid-extension';\n\nimport type {ExtensionAuto, ExtensionNodeSpec} from '#core';\nimport {generateEntityId} from 'src/utils/entity-id';\n\nimport {MermaidConsts, defaultMermaidEntityId, mermaidNodeName} from './const';\nexport {mermaidNodeName, MermaidConsts} from './const';\n\nexport type MermaidSpecsOptions = {\n nodeView?: ExtensionNodeSpec['view'];\n};\n\nconst MermaidSpecsExtension: ExtensionAuto<MermaidSpecsOptions> = (builder, {nodeView}) => {\n builder\n .configureMd((md) => md.use(transform({runtime: 'mermaid', bundle: false}), {}))\n .addNode(mermaidNodeName, () => ({\n fromMd: {\n tokenSpec: {\n name: mermaidNodeName,\n type: 'node',\n getAttrs: ({content}) => ({\n [MermaidConsts.NodeAttrs.content]: content,\n [MermaidConsts.NodeAttrs.EntityId]: generateEntityId(mermaidNodeName),\n }),\n },\n },\n spec: {\n selectable: true,\n atom: true,\n group: 'block',\n attrs: {\n [MermaidConsts.NodeAttrs.content]: {default: ''},\n [MermaidConsts.NodeAttrs.class]: {default: 'mermaid'},\n [MermaidConsts.NodeAttrs.EntityId]: {default: defaultMermaidEntityId},\n [MermaidConsts.NodeAttrs.newCreated]: {default: null},\n },\n parseDOM: [],\n toDOM(node) {\n return ['div', node.attrs];\n },\n dnd: {props: {offset: [8, 1]}},\n },\n toMd: (state, node) => {\n const content: string = node.attrs[MermaidConsts.NodeAttrs.content] || '';\n\n state.write('```mermaid');\n state.ensureNewLine();\n state.text(content.trim(), false);\n state.ensureNewLine();\n state.write('```');\n state.ensureNewLine();\n },\n view: nodeView,\n }));\n};\n\nexport const MermaidSpecs = Object.assign(MermaidSpecsExtension, MermaidConsts);\n"]}
@@ -1,20 +1,27 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.addMermaid = void 0;
4
- const const_1 = require("./MermaidSpecs/const.js");
4
+ const utils_1 = require("../../behavior/SharedState/utils.js");
5
+ const entity_id_1 = require("../../../utils/entity-id.js");
6
+ const MermaidSpecs_1 = require("./MermaidSpecs/index.js");
5
7
  exports.addMermaid = {
6
8
  isEnable(state) {
7
9
  return state.selection.empty;
8
10
  },
9
11
  run(state, dispatch, _view) {
10
- dispatch(state.tr.insert(state.selection.from, (0, const_1.mermaidNodeType)(state.schema).create({
11
- content: [
12
+ const newEntityId = (0, entity_id_1.generateEntityId)(MermaidSpecs_1.MermaidConsts.NodeName);
13
+ const sharedKey = utils_1.SharedStateKey.define({ name: newEntityId });
14
+ const tr = state.tr.insert(state.selection.from, MermaidSpecs_1.MermaidConsts.nodeType(state.schema).create({
15
+ [MermaidSpecs_1.MermaidConsts.NodeAttrs.content]: [
12
16
  'sequenceDiagram',
13
17
  '\tAlice->>Bob: Hi Bob',
14
18
  '\tBob->>Alice: Hi Alice',
15
19
  ].join('\n'),
16
- newCreated: true,
17
- })));
20
+ [MermaidSpecs_1.MermaidConsts.NodeAttrs.newCreated]: true,
21
+ [MermaidSpecs_1.MermaidConsts.NodeAttrs.EntityId]: newEntityId,
22
+ }));
23
+ sharedKey.appendTransaction.set(tr, { editing: true });
24
+ dispatch(tr);
18
25
  },
19
26
  };
20
27
  //# sourceMappingURL=actions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","sourceRoot":"../../../../../src","sources":["extensions/additional/Mermaid/actions.ts"],"names":[],"mappings":";;;AAEA,mDAAqD;AAExC,QAAA,UAAU,GAAe;IAClC,QAAQ,CAAC,KAAK;QACV,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;IACjC,CAAC;IACD,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK;QACtB,QAAQ,CACJ,KAAK,CAAC,EAAE,CAAC,MAAM,CACX,KAAK,CAAC,SAAS,CAAC,IAAI,EACpB,IAAA,uBAAe,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;YACjC,OAAO,EAAE;gBACL,iBAAiB;gBACjB,uBAAuB;gBACvB,yBAAyB;aAC5B,CAAC,IAAI,CAAC,IAAI,CAAC;YACZ,UAAU,EAAE,IAAI;SACnB,CAAC,CACL,CACJ,CAAC;IACN,CAAC;CACJ,CAAC","sourcesContent":["import type {ActionSpec} from '../../../core';\n\nimport {mermaidNodeType} from './MermaidSpecs/const';\n\nexport const addMermaid: ActionSpec = {\n isEnable(state) {\n return state.selection.empty;\n },\n run(state, dispatch, _view) {\n dispatch(\n state.tr.insert(\n state.selection.from,\n mermaidNodeType(state.schema).create({\n content: [\n 'sequenceDiagram',\n '\\tAlice->>Bob: Hi Bob',\n '\\tBob->>Alice: Hi Alice',\n ].join('\\n'),\n newCreated: true,\n }),\n ),\n );\n },\n};\n"]}
1
+ {"version":3,"file":"actions.js","sourceRoot":"../../../../../src","sources":["extensions/additional/Mermaid/actions.ts"],"names":[],"mappings":";;;AACA,+DAAyE;AACzE,2DAAqD;AAErD,0DAA6C;AAGhC,QAAA,UAAU,GAAe;IAClC,QAAQ,CAAC,KAAK;QACV,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;IACjC,CAAC;IACD,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK;QACtB,MAAM,WAAW,GAAG,IAAA,4BAAgB,EAAC,4BAAa,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,sBAAc,CAAC,MAAM,CAA2B,EAAC,IAAI,EAAE,WAAW,EAAC,CAAC,CAAC;QAEvF,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CACtB,KAAK,CAAC,SAAS,CAAC,IAAI,EACpB,4BAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;YACxC,CAAC,4BAAa,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;gBAC/B,iBAAiB;gBACjB,uBAAuB;gBACvB,yBAAyB;aAC5B,CAAC,IAAI,CAAC,IAAI,CAAC;YACZ,CAAC,4BAAa,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI;YAC1C,CAAC,4BAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,WAAW;SAClD,CAAC,CACL,CAAC;QAEF,SAAS,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC;QAErD,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;CACJ,CAAC","sourcesContent":["import type {ActionSpec} from '#core';\nimport {SharedStateKey} from 'src/extensions/behavior/SharedState/utils';\nimport {generateEntityId} from 'src/utils/entity-id';\n\nimport {MermaidConsts} from './MermaidSpecs';\nimport type {MermaidEntitySharedState} from './types';\n\nexport const addMermaid: ActionSpec = {\n isEnable(state) {\n return state.selection.empty;\n },\n run(state, dispatch, _view) {\n const newEntityId = generateEntityId(MermaidConsts.NodeName);\n const sharedKey = SharedStateKey.define<MermaidEntitySharedState>({name: newEntityId});\n\n const tr = state.tr.insert(\n state.selection.from,\n MermaidConsts.nodeType(state.schema).create({\n [MermaidConsts.NodeAttrs.content]: [\n 'sequenceDiagram',\n '\\tAlice->>Bob: Hi Bob',\n '\\tBob->>Alice: Hi Alice',\n ].join('\\n'),\n [MermaidConsts.NodeAttrs.newCreated]: true,\n [MermaidConsts.NodeAttrs.EntityId]: newEntityId,\n }),\n );\n\n sharedKey.appendTransaction.set(tr, {editing: true});\n\n dispatch(tr);\n },\n};\n"]}
@@ -0,0 +1,3 @@
1
+ export type MermaidEntitySharedState = {
2
+ editing: boolean;
3
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["extensions/additional/Mermaid/types.ts"],"names":[],"mappings":"","sourcesContent":["export type MermaidEntitySharedState = {\n editing: boolean;\n};\n"]}
@@ -18,6 +18,7 @@ export declare class WYfmHtmlBlockNodeView implements NodeView {
18
18
  destroy(): void;
19
19
  ignoreMutation(): boolean;
20
20
  stopEvent(e: Event): boolean;
21
+ private validateEntityId;
21
22
  private onChange;
22
23
  private renderYfmHtmlBlock;
23
24
  }
@@ -3,7 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WYfmHtmlBlockNodeView = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const uikit_1 = require("@gravity-ui/uikit");
6
- const behavior_1 = require("../../../behavior/index.js");
6
+ const ReactRenderer_1 = require("../../../behavior/ReactRenderer/index.js");
7
+ const entity_id_1 = require("../../../../utils/entity-id.js");
7
8
  const const_1 = require("../YfmHtmlBlockSpecs/const.js");
8
9
  const YfmHtmlBlockView_1 = require("./YfmHtmlBlockView.js");
9
10
  class WYfmHtmlBlockNodeView {
@@ -21,14 +22,12 @@ class WYfmHtmlBlockNodeView {
21
22
  this.view = view;
22
23
  this.getPos = getPos;
23
24
  this.options = options;
24
- this.renderItem = (0, behavior_1.getReactRendererFromState)(view.state).createItem('yfmHtmlBlock-view', this.renderYfmHtmlBlock.bind(this));
25
+ this.renderItem = (0, ReactRenderer_1.getReactRendererFromState)(view.state).createItem('yfmHtmlBlock-view', this.renderYfmHtmlBlock.bind(this));
26
+ this.validateEntityId();
25
27
  }
26
28
  update(node) {
27
29
  if (node.type !== this.node.type)
28
30
  return false;
29
- if (node.attrs[const_1.YfmHtmlBlockConsts.NodeAttrs.newCreated] !==
30
- this.node.attrs[const_1.YfmHtmlBlockConsts.NodeAttrs.newCreated])
31
- return false;
32
31
  this.node = node;
33
32
  this.renderItem.rerender();
34
33
  return true;
@@ -43,6 +42,16 @@ class WYfmHtmlBlockNodeView {
43
42
  const target = e.target;
44
43
  return target.classList.contains(YfmHtmlBlockView_1.STOP_EVENT_CLASSNAME);
45
44
  }
45
+ validateEntityId() {
46
+ if ((0, entity_id_1.isInvalidEntityId)({
47
+ node: this.node,
48
+ doc: this.view.state.doc,
49
+ defaultId: const_1.defaultYfmHtmlBlockEntityId,
50
+ })) {
51
+ const newId = (0, entity_id_1.generateEntityId)(const_1.YfmHtmlBlockConsts.NodeName);
52
+ this.view.dispatch(this.view.state.tr.setNodeAttribute(this.getPos(), const_1.YfmHtmlBlockConsts.NodeAttrs.EntityId, newId));
53
+ }
54
+ }
46
55
  onChange(attrs) {
47
56
  const pos = this.getPos();
48
57
  if (pos === undefined)
@@ -1 +1 @@
1
- {"version":3,"file":"NodeView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.tsx"],"names":[],"mappings":";;;;AAAA,6CAAyC;AAIzC,yDAA4D;AAC5D,yDAA8D;AAG9D,4DAA0E;AAE1E,MAAa,qBAAqB;IACrB,GAAG,CAAc;IAClB,IAAI,CAAO;IACF,IAAI,CAAC;IACL,MAAM,CAAC;IACP,OAAO,GAAwB,EAAE,CAAC;IAClC,UAAU,CAAC;IAE5B,YAAY,EACR,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,OAAO,GAMV;QACG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,OAAO,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,IAAI,CAAC,UAAU,GAAG,IAAA,oCAAyB,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAC9D,mBAAmB,EACnB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CACrC,CAAC;IACN,CAAC;IAED,MAAM,CAAC,IAAU;QACb,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC/C,IACI,IAAI,CAAC,KAAK,CAAC,0BAAkB,CAAC,SAAS,CAAC,UAAU,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,0BAAkB,CAAC,SAAS,CAAC,UAAU,CAAC;YAExD,OAAO,KAAK,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO;QACH,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;IAC7B,CAAC;IAED,cAAc;QACV,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,CAAQ;QACd,MAAM,MAAM,GAAG,CAAC,CAAC,MAAiB,CAAC;QACnC,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,uCAAoB,CAAC,CAAC;IAC3D,CAAC;IAEO,QAAQ,CAAC,KAAsD;QACnE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO;QAE9B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CACvC,GAAG,EACH,SAAS,EACT;YACI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK;YAClB,GAAG,KAAK;SACX,EACD,EAAE,CACL,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAEO,kBAAkB;QACtB,OAAO,CACH,uBAAC,cAAM,IAAC,SAAS,EAAE,IAAI,CAAC,GAAG,YACvB,uBAAC,mCAAgB,IACb,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAClC,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAE,IAAI,CAAC,IAAI,GACjB,GACG,CACZ,CAAC;IACN,CAAC;CACJ;AAxFD,sDAwFC","sourcesContent":["import {Portal} from '@gravity-ui/uikit';\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView, NodeView} from 'prosemirror-view';\n\nimport {getReactRendererFromState} from '../../../behavior';\nimport {YfmHtmlBlockConsts} from '../YfmHtmlBlockSpecs/const';\nimport type {YfmHtmlBlockOptions} from '../index';\n\nimport {STOP_EVENT_CLASSNAME, YfmHtmlBlockView} from './YfmHtmlBlockView';\n\nexport class WYfmHtmlBlockNodeView implements NodeView {\n readonly dom: HTMLElement;\n private node: Node;\n private readonly view;\n private readonly getPos;\n private readonly options: YfmHtmlBlockOptions = {};\n private readonly renderItem;\n\n constructor({\n node,\n view,\n getPos,\n options,\n }: {\n node: Node;\n view: EditorView;\n getPos: () => number | undefined;\n options: YfmHtmlBlockOptions;\n }) {\n this.node = node;\n this.dom = document.createElement('div');\n this.dom.classList.add('yfm-html-block-container');\n this.dom.contentEditable = 'false';\n this.view = view;\n this.getPos = getPos;\n this.options = options;\n\n this.renderItem = getReactRendererFromState(view.state).createItem(\n 'yfmHtmlBlock-view',\n this.renderYfmHtmlBlock.bind(this),\n );\n }\n\n update(node: Node) {\n if (node.type !== this.node.type) return false;\n if (\n node.attrs[YfmHtmlBlockConsts.NodeAttrs.newCreated] !==\n this.node.attrs[YfmHtmlBlockConsts.NodeAttrs.newCreated]\n )\n return false;\n this.node = node;\n this.renderItem.rerender();\n return true;\n }\n\n destroy() {\n this.renderItem.remove();\n }\n\n ignoreMutation() {\n return true;\n }\n\n stopEvent(e: Event) {\n const target = e.target as Element;\n return target.classList.contains(STOP_EVENT_CLASSNAME);\n }\n\n private onChange(attrs: {[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: string}) {\n const pos = this.getPos();\n if (pos === undefined) return;\n\n const tr = this.view.state.tr.setNodeMarkup(\n pos,\n undefined,\n {\n ...this.node.attrs,\n ...attrs,\n },\n [],\n );\n\n this.view.dispatch(tr);\n }\n\n private renderYfmHtmlBlock() {\n return (\n <Portal container={this.dom}>\n <YfmHtmlBlockView\n getPos={this.getPos}\n node={this.node}\n onChange={this.onChange.bind(this)}\n options={this.options}\n view={this.view}\n />\n </Portal>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"NodeView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Portal} from '@gravity-ui/uikit';\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView, NodeView} from 'prosemirror-view';\n\nimport {getReactRendererFromState} from 'src/extensions/behavior/ReactRenderer';\nimport {generateEntityId, isInvalidEntityId} from 'src/utils/entity-id';\n\nimport {YfmHtmlBlockConsts, defaultYfmHtmlBlockEntityId} from '../YfmHtmlBlockSpecs/const';\nimport type {YfmHtmlBlockOptions} from '../index';\n\nimport {STOP_EVENT_CLASSNAME, YfmHtmlBlockView} from './YfmHtmlBlockView';\n\nexport class WYfmHtmlBlockNodeView implements NodeView {\n readonly dom: HTMLElement;\n private node: Node;\n private readonly view;\n private readonly getPos;\n private readonly options: YfmHtmlBlockOptions = {};\n private readonly renderItem;\n\n constructor({\n node,\n view,\n getPos,\n options,\n }: {\n node: Node;\n view: EditorView;\n getPos: () => number | undefined;\n options: YfmHtmlBlockOptions;\n }) {\n this.node = node;\n this.dom = document.createElement('div');\n this.dom.classList.add('yfm-html-block-container');\n this.dom.contentEditable = 'false';\n this.view = view;\n this.getPos = getPos;\n this.options = options;\n\n this.renderItem = getReactRendererFromState(view.state).createItem(\n 'yfmHtmlBlock-view',\n this.renderYfmHtmlBlock.bind(this),\n );\n\n this.validateEntityId();\n }\n\n update(node: Node) {\n if (node.type !== this.node.type) return false;\n this.node = node;\n this.renderItem.rerender();\n return true;\n }\n\n destroy() {\n this.renderItem.remove();\n }\n\n ignoreMutation() {\n return true;\n }\n\n stopEvent(e: Event) {\n const target = e.target as Element;\n return target.classList.contains(STOP_EVENT_CLASSNAME);\n }\n\n private validateEntityId() {\n if (\n isInvalidEntityId({\n node: this.node,\n doc: this.view.state.doc,\n defaultId: defaultYfmHtmlBlockEntityId,\n })\n ) {\n const newId = generateEntityId(YfmHtmlBlockConsts.NodeName);\n this.view.dispatch(\n this.view.state.tr.setNodeAttribute(\n this.getPos()!,\n YfmHtmlBlockConsts.NodeAttrs.EntityId,\n newId,\n ),\n );\n }\n }\n\n private onChange(attrs: {[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: string}) {\n const pos = this.getPos();\n if (pos === undefined) return;\n\n const tr = this.view.state.tr.setNodeMarkup(\n pos,\n undefined,\n {\n ...this.node.attrs,\n ...attrs,\n },\n [],\n );\n\n this.view.dispatch(tr);\n }\n\n private renderYfmHtmlBlock() {\n return (\n <Portal container={this.dom}>\n <YfmHtmlBlockView\n getPos={this.getPos}\n node={this.node}\n onChange={this.onChange.bind(this)}\n options={this.options}\n view={this.view}\n />\n </Portal>\n );\n }\n}\n"]}
@@ -2,17 +2,18 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.YfmHtmlBlockView = exports.STOP_EVENT_CLASSNAME = exports.cnYfmHtmlBlock = void 0;
4
4
  exports.generateID = generateID;
5
- const tslib_1 = require("tslib");
6
5
  const jsx_runtime_1 = require("react/jsx-runtime");
7
6
  const react_1 = require("react");
8
7
  const html_extension_1 = require("@diplodoc/html-extension");
9
8
  const icons_1 = require("@gravity-ui/icons");
10
9
  const uikit_1 = require("@gravity-ui/uikit");
11
- const debounce_1 = tslib_1.__importDefault(require("lodash/debounce.js"));
12
10
  const classname_1 = require("../../../../classname.js");
11
+ const SharedState_1 = require("../../../behavior/SharedState/index.js");
13
12
  const TextInput_1 = require("../../../../forms/TextInput.js");
14
13
  const common_1 = require("../../../../i18n/common/index.js");
14
+ const lodash_1 = require("../../../../lodash.js");
15
15
  const hooks_1 = require("../../../../react-utils/hooks.js");
16
+ const useSharedEditingState_1 = require("../../../../react-utils/useSharedEditingState.js");
16
17
  const remove_node_1 = require("../../../../utils/remove-node.js");
17
18
  const const_1 = require("../YfmHtmlBlockSpecs/const.js");
18
19
  require("./YfmHtmlBlock.css");
@@ -34,7 +35,7 @@ const createLinkCLickHandler = (value, document) => (event) => {
34
35
  }
35
36
  }
36
37
  };
37
- const YfmHtmlBlockPreview = ({ html, onСlick, config }) => {
38
+ const YfmHtmlBlockPreview = ({ html, onClick, config }) => {
38
39
  const ref = (0, react_1.useRef)(null);
39
40
  const styles = (0, react_1.useRef)({});
40
41
  const classNames = (0, react_1.useRef)([]);
@@ -50,7 +51,7 @@ const YfmHtmlBlockPreview = ({ html, onСlick, config }) => {
50
51
  if (contentWindow) {
51
52
  const frameDocument = contentWindow.document;
52
53
  frameDocument.addEventListener('dblclick', () => {
53
- onСlick();
54
+ onClick();
54
55
  });
55
56
  }
56
57
  };
@@ -130,7 +131,7 @@ const YfmHtmlBlockPreview = ({ html, onСlick, config }) => {
130
131
  }, [html]);
131
132
  (0, react_1.useEffect)(() => {
132
133
  if (ref.current) {
133
- const resizeObserver = new window.ResizeObserver((0, debounce_1.default)(handleResizeIFrame, DEFAULT_DELAY));
134
+ const resizeObserver = new window.ResizeObserver((0, lodash_1.debounce)(handleResizeIFrame, DEFAULT_DELAY));
134
135
  resizeObserver.observe(ref.current);
135
136
  }
136
137
  }, [ref.current?.contentWindow?.document?.body]);
@@ -147,13 +148,12 @@ const CodeEditMode = ({ initialText, onSave, onCancel }) => {
147
148
  }, autoFocus: true }), (0, jsx_runtime_1.jsx)("div", { className: b('controls'), children: (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(uikit_1.Button, { onClick: onCancel, view: 'flat', children: (0, jsx_runtime_1.jsx)("span", { className: exports.STOP_EVENT_CLASSNAME, children: (0, common_1.i18n)('cancel') }) }), (0, jsx_runtime_1.jsx)(uikit_1.Button, { onClick: () => onSave(text), view: 'action', children: (0, jsx_runtime_1.jsx)("span", { className: exports.STOP_EVENT_CLASSNAME, children: (0, common_1.i18n)('save') }) })] }) })] }) }));
148
149
  };
149
150
  const YfmHtmlBlockView = ({ onChange, node, getPos, view, options: { useConfig, sanitize, styles, baseTarget = '_parent', head: headContent = '' }, }) => {
150
- const [editing, setEditing, unsetEditing, toggleEditing] = (0, hooks_1.useBooleanState)(Boolean(node.attrs[const_1.YfmHtmlBlockConsts.NodeAttrs.newCreated]));
151
+ const entityId = node.attrs[const_1.YfmHtmlBlockConsts.NodeAttrs.EntityId];
152
+ const entityKey = (0, react_1.useMemo)(() => SharedState_1.SharedStateKey.define({ name: entityId }), [entityId]);
151
153
  const config = useConfig?.();
154
+ const [editing, setEditing, unsetEditing] = (0, useSharedEditingState_1.useSharedEditingState)(view, entityKey);
152
155
  const [menuOpen, _openMenu, closeMenu, toggleMenuOpen] = (0, hooks_1.useBooleanState)(false);
153
156
  const [anchorElement, setAnchorElement] = (0, hooks_1.useElementState)();
154
- const handleClick = () => {
155
- setEditing();
156
- };
157
157
  if (editing) {
158
158
  return ((0, jsx_runtime_1.jsx)(CodeEditMode, { initialText: node.attrs[const_1.YfmHtmlBlockConsts.NodeAttrs.srcdoc], onCancel: unsetEditing, onSave: (v) => {
159
159
  onChange({ [const_1.YfmHtmlBlockConsts.NodeAttrs.srcdoc]: v });
@@ -170,9 +170,10 @@ const YfmHtmlBlockView = ({ onChange, node, getPos, view, options: { useConfig,
170
170
  const head = `<head>${headContent || additional}</head>`;
171
171
  const body = `<body>${node.attrs[const_1.YfmHtmlBlockConsts.NodeAttrs.srcdoc] ?? ''}</body>`;
172
172
  const html = `<!DOCTYPE html><html>${head}${body}</html>`;
173
- const resultHtml = sanitize ? sanitize(html) : html;
174
- return ((0, jsx_runtime_1.jsxs)("div", { className: b(), onDoubleClick: setEditing, children: [(0, jsx_runtime_1.jsx)(uikit_1.Label, { className: b('label'), icon: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { size: 16, data: icons_1.Eye }), children: (0, common_1.i18n)('preview') }), (0, jsx_runtime_1.jsx)(YfmHtmlBlockPreview, { html: resultHtml, "on\u0421lick": handleClick, config: config }), (0, jsx_runtime_1.jsxs)("div", { className: b('menu'), children: [(0, jsx_runtime_1.jsx)(uikit_1.Button, { onClick: toggleMenuOpen, ref: setAnchorElement, size: "s", className: exports.STOP_EVENT_CLASSNAME, children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Ellipsis, className: exports.STOP_EVENT_CLASSNAME }) }), (0, jsx_runtime_1.jsx)(uikit_1.Popup, { anchorElement: anchorElement, open: menuOpen, onOpenChange: closeMenu, placement: "bottom-end", children: (0, jsx_runtime_1.jsxs)(uikit_1.Menu, { children: [(0, jsx_runtime_1.jsx)(uikit_1.Menu.Item, { onClick: () => {
175
- toggleEditing();
173
+ const sanitizeFunction = typeof sanitize === 'function' ? sanitize : sanitize?.body;
174
+ const resultHtml = sanitizeFunction ? sanitizeFunction(html) : html;
175
+ return ((0, jsx_runtime_1.jsxs)("div", { className: b(), onDoubleClick: setEditing, children: [(0, jsx_runtime_1.jsx)(uikit_1.Label, { className: b('label'), icon: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { size: 16, data: icons_1.Eye }), children: (0, common_1.i18n)('preview') }), (0, jsx_runtime_1.jsx)(YfmHtmlBlockPreview, { html: resultHtml, onClick: setEditing, config: config }), (0, jsx_runtime_1.jsxs)("div", { className: b('menu'), children: [(0, jsx_runtime_1.jsx)(uikit_1.Button, { onClick: toggleMenuOpen, ref: setAnchorElement, size: "s", className: exports.STOP_EVENT_CLASSNAME, children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Ellipsis, className: exports.STOP_EVENT_CLASSNAME }) }), (0, jsx_runtime_1.jsx)(uikit_1.Popup, { anchorElement: anchorElement, open: menuOpen, onOpenChange: closeMenu, placement: "bottom-end", children: (0, jsx_runtime_1.jsxs)(uikit_1.Menu, { children: [(0, jsx_runtime_1.jsx)(uikit_1.Menu.Item, { onClick: () => {
176
+ setEditing();
176
177
  closeMenu();
177
178
  }, children: (0, common_1.i18n)('edit') }), (0, jsx_runtime_1.jsx)(uikit_1.Menu.Item, { onClick: () => {
178
179
  const pos = getPos();