diff --git a/wax-prosemirror-components/src/components/comments/ConnectedComment.js b/wax-prosemirror-components/src/components/comments/ConnectedComment.js index 998aae93ed85789e41b29032893621e23d9fd897..6123e7382bb9dc8761fee39e671d82dfdff61ee3 100644 --- a/wax-prosemirror-components/src/components/comments/ConnectedComment.js +++ b/wax-prosemirror-components/src/components/comments/ConnectedComment.js @@ -112,7 +112,6 @@ export default ({ comment, top, commentId, recalculateTops }) => { let minPos = comment.pos; allCommentsWithSameId.forEach(singleComment => { - console.log(singleComment.pos); const markPosition = DocumentHelpers.findMarkPosition( state, singleComment.pos, diff --git a/wax-prosemirror-services/src/NoteService/Editor.js b/wax-prosemirror-services/src/NoteService/Editor.js index ae90d0fae42f3e4cee21c16d254a229600418ee7..88a3b7298da028fa2c868c2eaf4fc580115ed138 100644 --- a/wax-prosemirror-services/src/NoteService/Editor.js +++ b/wax-prosemirror-services/src/NoteService/Editor.js @@ -2,7 +2,7 @@ import React, { useEffect, useRef, useContext, useMemo } from 'react'; import { filter } from 'lodash'; import { EditorView } from 'prosemirror-view'; -import { EditorState, TextSelection } from 'prosemirror-state'; +import { EditorState } from 'prosemirror-state'; import { StepMap } from 'prosemirror-transform'; import { baseKeymap } from 'prosemirror-commands'; import { keymap } from 'prosemirror-keymap'; @@ -139,9 +139,9 @@ export default ({ node, view }) => { ); } } - const MemorizedComponent = useMemo( + const NoteEditorContainerComponent = useMemo( () => <NoteEditorContainer ref={editorRef} />, [], ); - return <>{MemorizedComponent}</>; + return <>{NoteEditorContainerComponent}</>; }; diff --git a/wax-prosemirror-utilities/src/commands/Commands.js b/wax-prosemirror-utilities/src/commands/Commands.js index 95b579ff46495ef5621462f1d5a9ba449af4d3e4..358bf429a979c8ce14fd55204f137138957147a7 100644 --- a/wax-prosemirror-utilities/src/commands/Commands.js +++ b/wax-prosemirror-utilities/src/commands/Commands.js @@ -1,5 +1,6 @@ import { v4 as uuidv4 } from 'uuid'; import { toggleMark } from 'prosemirror-commands'; +import { AddMarkStep } from 'prosemirror-transform'; const setBlockType = (nodeType, attrs = {}) => { return (state, dispatch) => { @@ -120,6 +121,19 @@ const isOnSameTextBlock = state => { }; const createComment = (state, dispatch, group, viewid) => { + const { + selection: { $from, $to }, + } = state; + let footnote = false; + state.doc.nodesBetween($from.pos, $to.pos, (node, from) => { + if (node.type.name === 'footnote') { + footnote = true; + } + }); + + createCommentOnFootnote(state, dispatch, group, viewid); + if (footnote) return; + toggleMark(state.config.schema.marks.comment, { id: uuidv4(), group, @@ -128,6 +142,70 @@ const createComment = (state, dispatch, group, viewid) => { })(state, dispatch); }; +const createCommentOnFootnote = (state, dispatch, group, viewid) => { + const { + selection: { $from }, + selection, + tr, + } = state; + + const { content } = $from.parent; + const $pos = state.doc.resolve($from.pos); + const commentStart = $from.pos - $pos.textOffset; + const commentEnd = commentStart + $pos.parent.child($pos.index()).nodeSize; + + let start = $from.pos; + let end = commentEnd; + const ranges = []; + + const allFragments = []; + + selection.content().content.content.forEach(node => { + node.content.content.forEach(fragment => { + allFragments.push(fragment); + }); + }); + + allFragments.forEach((contentNode, index) => { + start = index === 0 ? start : end; + end = index === 0 ? end : end + contentNode.nodeSize; + ranges.push({ + start, + end, + footnote: contentNode.type.name === 'footnote', + }); + }); + + const mergedRanges = []; + ranges.forEach((item, i) => { + if (item.footnote) { + mergedRanges[mergedRanges.length - 1].end = + mergedRanges[mergedRanges.length - 1].end + 1; + } else { + mergedRanges.push(item); + } + }); + + const id = uuidv4(); + + mergedRanges.forEach(range => { + tr.step( + new AddMarkStep( + range.start, + range.end, + state.config.schema.marks.comment.create({ + id, + group, + conversation: [], + viewid, + }), + ), + ); + }); + + dispatch(tr); +}; + export default { setBlockType, blockActive,