diff --git a/editors/editoria/package.json b/editors/editoria/package.json index aa5d831e059fdf415030400b904a1096cedb9d5e..1574cdf6f3c0b770916eb60e2543fac87eac468d 100644 --- a/editors/editoria/package.json +++ b/editors/editoria/package.json @@ -4,9 +4,9 @@ "private": true, "dependencies": { "@guardian/prosemirror-invisibles": "^1.2.0", - "prosemirror-tables": "^0.9.5", - "react": "^16.8.6", - "react-dom": "^16.8.6", + "prosemirror-tables": "^1.1.0", + "react": "^16.13.1", + "react-dom": "^16.13.1", "styled-components": "^4.2.0", "wax-prosemirror-components": "^0.0.8", "wax-prosemirror-core": "^0.0.8", @@ -23,12 +23,7 @@ "eslintConfig": { "extends": "react-app" }, - "browserslist": [ - ">0.2%", - "not dead", - "not ie <= 11", - "not op_mini all" - ], + "browserslist": [">0.2%", "not dead", "not ie <= 11", "not op_mini all"], "devDependencies": { "babel-eslint": "10.0.3", "babel-loader": "8.0.6", diff --git a/editors/editoria/src/Editoria.js b/editors/editoria/src/Editoria.js index ae4e7c88fd33bd2be26ca21014d8d4037fdb8edd..feb57c6796d0fbc6cf6ca9bd1ae1a4ead25eae15 100644 --- a/editors/editoria/src/Editoria.js +++ b/editors/editoria/src/Editoria.js @@ -49,6 +49,7 @@ const Editoria = () => ( fileUpload={file => renderImage(file)} value={"this is some content"} layout={EditoriaLayout} + // TrackChange // onChange={source => console.log(source)} user={user} /> diff --git a/wax-prosemirror-components/index.js b/wax-prosemirror-components/index.js index 49f165241f8026c65c7951706e246b295d3aa964..770e1e4b638ca7a286075f68de24d49c82db7a92 100644 --- a/wax-prosemirror-components/index.js +++ b/wax-prosemirror-components/index.js @@ -18,6 +18,4 @@ export { default as CommentBubbleComponent } from "./src/components/comments/CommentBubbleComponent"; -export { - default as CommentComponent -} from "./src/components/comments/CommentComponent"; +export { default as RightArea } from "./src/components/rightArea/RightArea"; diff --git a/wax-prosemirror-components/package.json b/wax-prosemirror-components/package.json index 3852da3073048dff2dd64b5631e8672c4573e209..e9fed7f0484b6ca37c8de7a08b7502e8a152e744 100644 --- a/wax-prosemirror-components/package.json +++ b/wax-prosemirror-components/package.json @@ -14,8 +14,8 @@ "@fortawesome/free-solid-svg-icons": "^5.12.0", "@fortawesome/react-fontawesome": "^0.0.17", "lodash": "^4.17.4", - "react": "^16.8.6", - "react-dom": "^16.8.6", + "react": "^16.13.1", + "react-dom": "^16.13.1", "react-dropdown": "^1.6.2", "react-transition-group": "^4.3.0", "styled-components": "^4.2.0", diff --git a/wax-prosemirror-components/src/components/comments/CommentBox.js b/wax-prosemirror-components/src/components/comments/CommentBox.js index 301591f51427b2aab4391f3835bced54be175dbd..c394e7a9dbdf79fd80674217393c531d3ea36d6f 100644 --- a/wax-prosemirror-components/src/components/comments/CommentBox.js +++ b/wax-prosemirror-components/src/components/comments/CommentBox.js @@ -11,7 +11,7 @@ const CommentBoxStyled = styled.div` margin-top: 10px; background: black; position: absolute; - transition: ${({ state }) => "top 1s, opacity 1.5s"}; + transition: ${({ state }) => "top 1s, opacity 1.5s, left 1s"}; top: ${props => (props.top ? `${props.top}px` : 0)}; left: ${props => (props.active ? `${63}%` : `${65}%`)}; opacity: ${({ state }) => { diff --git a/wax-prosemirror-components/src/components/comments/CommentComponent.js b/wax-prosemirror-components/src/components/rightArea/RightArea.js similarity index 66% rename from wax-prosemirror-components/src/components/comments/CommentComponent.js rename to wax-prosemirror-components/src/components/rightArea/RightArea.js index 35b5b12adee0a7c68b1cba75d7543442e391f796..910204385638f5d7c15c58e66dcbd4f8abda60f9 100644 --- a/wax-prosemirror-components/src/components/comments/CommentComponent.js +++ b/wax-prosemirror-components/src/components/rightArea/RightArea.js @@ -9,52 +9,51 @@ import React, { import styled from "styled-components"; import { WaxContext } from "wax-prosemirror-core"; import { DocumentHelpers } from "wax-prosemirror-utilities"; -import CommentsBoxList from "./CommentsBoxList"; +import CommentsBoxList from "./../comments/CommentsBoxList"; import { each } from "lodash"; export default ({ area }) => { const { view: { main }, app, activeView } = useContext(WaxContext); const activeCommentPlugin = app.PmPlugins.get("activeComment"); - const [comments, setComments] = useState([]); + const [marks, setMarks] = useState([]); const [position, setPosition] = useState(); const setTops = useCallback(() => { const result = []; - let commentEl = null; + let markEl = null; let annotationTop = 0; let boxHeight = 0; let top = 0; const allCommentsTop = []; - each(comments[area], (comment, pos) => { + each(marks[area], (mark, pos) => { const WaxSurface = main.dom.getBoundingClientRect(); - const { attrs: { id } } = comment; + const { attrs: { id } } = mark; const activeComment = activeCommentPlugin.getState(activeView.state) .comment; let isActive = false; - if (activeComment && comment.attrs.id === activeComment.attrs.id) + if (activeComment && mark.attrs.id === activeComment.attrs.id) isActive = true; //annotation top if (area === "main") { - commentEl = document.querySelector(`span[data-id="${id}"]`); - if (commentEl) - annotationTop = - commentEl.getBoundingClientRect().top - WaxSurface.top; + markEl = document.querySelector(`span[data-id="${id}"]`); + if (markEl) + annotationTop = markEl.getBoundingClientRect().top - WaxSurface.top; } else { const panelWrapper = document.getElementsByClassName("panelWrapper"); const panelWrapperHeight = panelWrapper[0].getBoundingClientRect() .height; - commentEl = document + markEl = document .querySelector("#notes-container") .querySelector(`span[data-id="${id}"]`); - if (commentEl) + if (markEl) annotationTop = - commentEl.getBoundingClientRect().top - panelWrapperHeight - 50; + markEl.getBoundingClientRect().top - panelWrapperHeight - 50; } - // get height of this comment box + // get height of this mark box const boxEl = document.querySelector(`div[data-comment="comment-${id}"]`); if (boxEl) boxHeight = parseInt(boxEl.offsetHeight); @@ -63,20 +62,20 @@ export default ({ area }) => { // if the above comment box has already taken up the height, move down if (pos > 0) { - const previousBox = comments[area][pos - 1]; + const previousBox = marks[area][pos - 1]; const previousEndHeight = previousBox.endHeight; if (annotationTop < previousEndHeight) { top = previousEndHeight + 2; } } // store where the box ends to be aware of overlaps in the next box - comment.endHeight = top + boxHeight + 2; + mark.endHeight = top + boxHeight + 2; result[pos] = top; allCommentsTop.push({ [id]: result[pos] }); // if active, move as many boxes above as needed to bring it to the annotation's height if (isActive) { - comment.endHeight = annotationTop + boxHeight + 2; + mark.endHeight = annotationTop + boxHeight + 2; result[pos] = annotationTop; allCommentsTop[pos][id] = result[pos]; let b = true; @@ -86,7 +85,7 @@ export default ({ area }) => { if (i === 0) b = false; while (b) { - const boxAbove = comments[area][i - 1]; + const boxAbove = marks[area][i - 1]; const boxAboveEnds = boxAbove.endHeight; const currentTop = result[i]; @@ -96,8 +95,7 @@ export default ({ area }) => { const overlap = boxAboveEnds - currentTop; result[i - 1] -= overlap; - allCommentsTop[i - 1][comments[area][i - 1].attrs.id] = - result[i - 1]; + allCommentsTop[i - 1][marks[area][i - 1].attrs.id] = result[i - 1]; } if (!doesOverlap) b = false; @@ -112,49 +110,49 @@ export default ({ area }) => { useEffect( () => { - setComments(updateComments(main)); + setMarks(updateMarks(main)); setPosition(setTops()); }, - [JSON.stringify(updateComments(main)), JSON.stringify(setTops())] + [JSON.stringify(updateMarks(main)), JSON.stringify(setTops())] ); - const CommentComponent = useMemo( + const CommentTrackComponent = useMemo( () => ( <CommentsBoxList - comments={comments[area] || []} + comments={marks[area] || []} area={area} view={main} position={position} /> ), - [comments[area] || [], position] + [marks[area] || [], position] ); - return <Fragment>{CommentComponent}</Fragment>; + return <Fragment>{CommentTrackComponent}</Fragment>; }; -const updateComments = view => { +const updateMarks = view => { if (view) { - const nodes = DocumentHelpers.findChildrenByMark( + const commentNodes = DocumentHelpers.findChildrenByMark( view.state.doc, view.state.schema.marks.comment, true ); - const allComments = nodes.map(node => { + const allComments = commentNodes.map(node => { return node.node.marks.filter(comment => { return comment.type.name === "comment"; }); }); - const groupedComments = {}; + const groupedNodes = {}; allComments.forEach(comment => { - if (!groupedComments[comment[0].attrs.group]) { - groupedComments[comment[0].attrs.group] = [comment[0]]; + if (!groupedNodes[comment[0].attrs.group]) { + groupedNodes[comment[0].attrs.group] = [comment[0]]; } else { - groupedComments[comment[0].attrs.group].push(comment[0]); + groupedNodes[comment[0].attrs.group].push(comment[0]); } }); - return groupedComments; + return groupedNodes; } return []; }; diff --git a/wax-prosemirror-core/package.json b/wax-prosemirror-core/package.json index b70bf140447e5196f16ea9cdf769576b26f086d8..c1412d604367b242c795e7532062b1249beb064b 100644 --- a/wax-prosemirror-core/package.json +++ b/wax-prosemirror-core/package.json @@ -10,10 +10,14 @@ "build": "BABEL_ENV=production rollup -c" }, "dependencies": { + "react": "^16.13.1", + "react-dom": "^16.13.1", "deepmerge": "^4.2.2", "inversify": "^5.0.1", "inversify-inject-decorators": "^3.1.0", "lodash": "^4.17.4", + "reflect-metadata": "^0.1.13", + "styled-components": "^4.2.0", "prosemirror-commands": "^1.1.3", "prosemirror-dev-tools": "^2.1.1", "prosemirror-dropcursor": "^1.3.2", @@ -24,11 +28,7 @@ "prosemirror-model": "^1.9.1", "prosemirror-state": "^1.3.2", "prosemirror-transform": "^1.2.3", - "prosemirror-view": "^1.13.11", - "react": "^16.8.6", - "react-dom": "^16.8.6", - "reflect-metadata": "^0.1.13", - "styled-components": "^4.2.0" + "prosemirror-view": "^1.13.11" }, "devDependencies": { "mocha": "^3.4.2", diff --git a/wax-prosemirror-layouts/package.json b/wax-prosemirror-layouts/package.json index 615957c08178ae89cd172e95e2cf5eb5c854c7e4..cd8e9ef1b36d7d6bef78121083b09530a1c9af0f 100644 --- a/wax-prosemirror-layouts/package.json +++ b/wax-prosemirror-layouts/package.json @@ -10,8 +10,8 @@ "build": "BABEL_ENV=production rollup -c" }, "dependencies": { - "react": "^16.8.6", - "react-dom": "^16.8.6", + "react": "^16.13.1", + "react-dom": "^16.13.1", "react-panelgroup": "^1.0.10", "styled-components": "^4.2.0" } diff --git a/wax-prosemirror-layouts/src/layouts/EditoriaLayout.js b/wax-prosemirror-layouts/src/layouts/EditoriaLayout.js index b14375b4dfdf4e9614b67eb94517ba3e6ec4113e..d77f088e657f0bb3dab96d8f9f329169f759d6a5 100644 --- a/wax-prosemirror-layouts/src/layouts/EditoriaLayout.js +++ b/wax-prosemirror-layouts/src/layouts/EditoriaLayout.js @@ -204,7 +204,7 @@ const LeftSideBar = componentPlugin("leftSideBar"); const RightSideBar = componentPlugin("rightSideBar"); const TopBar = componentPlugin("topBar"); const NotesArea = componentPlugin("notesArea"); -const CommentsArea = componentPlugin("commentsArea"); +const RightArea = componentPlugin("rightArea"); const WaxOverlays = componentPlugin("waxOverlays"); const withNotes = () => { @@ -214,7 +214,7 @@ const withNotes = () => { <NotesArea /> </NotesContainer> <CommentsContainer> - <CommentsArea area="notes" /> + <RightArea area="notes" /> </CommentsContainer> </NotesAreaContainer> ); @@ -257,7 +257,7 @@ const EditoriaLayout = ({ editor }) => { <WaxSurfaceScroll className="wax-surface-scroll"> <EditorContainer>{editor}</EditorContainer> <CommentsContainer> - <CommentsArea area="main" /> + <RightArea area="main" /> </CommentsContainer> </WaxSurfaceScroll> <RightSideBar /> diff --git a/wax-prosemirror-schema/package.json b/wax-prosemirror-schema/package.json index bdc57cff05dad81d2a5bb4d8d25d67d873abc4f8..02b4770200b291befb4324c02d84012d1bfa9e3f 100644 --- a/wax-prosemirror-schema/package.json +++ b/wax-prosemirror-schema/package.json @@ -11,6 +11,6 @@ }, "dependencies": { "prosemirror-schema-list": "^1.1.2", - "prosemirror-tables": "^1.0.0" + "prosemirror-tables": "^1.1.0" } } diff --git a/wax-prosemirror-schema/src/marks/trackChangesMarks/deletionMark.js b/wax-prosemirror-schema/src/marks/trackChangesMarks/deletionMark.js index 7294dc1fe1344f60bff1c9054ab5f7ec0c5c5304..1de64cb023ee6bc9cf21e91ef49fdd737b717645 100644 --- a/wax-prosemirror-schema/src/marks/trackChangesMarks/deletionMark.js +++ b/wax-prosemirror-schema/src/marks/trackChangesMarks/deletionMark.js @@ -1,14 +1,10 @@ const deletion = { attrs: { - user: { - default: 0 - }, - username: { - default: "" - }, - date: { - default: 0 - } + id: { default: "" }, + user: { default: 0 }, + username: { default: "" }, + date: { default: 0 }, + group: { default: "" } }, inclusive: false, group: "track", @@ -17,9 +13,11 @@ const deletion = { tag: "span.deletion", getAttrs(dom) { return { + id: dom.dataset.id, user: parseInt(dom.dataset.user), username: dom.dataset.username, - date: parseInt(dom.dataset.date) + date: parseInt(dom.dataset.date), + group: dom.dataset.group }; } } @@ -29,9 +27,11 @@ const deletion = { "span", { class: `deletion user-${node.attrs.user}`, + "data-id": node.attrs.id, "data-user": node.attrs.user, "data-username": node.attrs.username, - "data-date": node.attrs.date + "data-date": node.attrs.date, + "data-group": node.attrs.group } ]; } diff --git a/wax-prosemirror-schema/src/marks/trackChangesMarks/formatChangeMark.js b/wax-prosemirror-schema/src/marks/trackChangesMarks/formatChangeMark.js index 37ceac821b6f8eb05db3a62762b42945b8cb7575..5fc79a00c48462208ed9e68150d36253f0f09b9c 100644 --- a/wax-prosemirror-schema/src/marks/trackChangesMarks/formatChangeMark.js +++ b/wax-prosemirror-schema/src/marks/trackChangesMarks/formatChangeMark.js @@ -1,20 +1,12 @@ const format_change = { attrs: { - user: { - default: 0 - }, - username: { - default: "" - }, - date: { - default: 0 - }, - before: { - default: [] - }, - after: { - default: [] - } + id: { default: "" }, + user: { default: 0 }, + username: { default: "" }, + date: { default: 0 }, + before: { default: [] }, + after: { default: [] }, + group: { default: "" } }, inclusive: false, group: "track", @@ -23,11 +15,13 @@ const format_change = { tag: "span.format-change", getAttrs(dom) { return { + id: dom.dataset.id, user: parseInt(dom.dataset.user), username: dom.dataset.username, date: parseInt(dom.dataset.date), before: parseFormatList(dom.dataset.before), - after: parseFormatList(dom.dataset.after) + after: parseFormatList(dom.dataset.after), + group: dom.dataset.group }; } } @@ -37,11 +31,13 @@ const format_change = { "span", { class: `format-change user-${node.attrs.user}`, + "data-id": node.attrs.id, "data-user": node.attrs.user, "data-username": node.attrs.username, "data-date": node.attrs.date, "data-before": JSON.stringify(node.attrs.before), - "data-after": JSON.stringify(node.attrs.after) + "data-after": JSON.stringify(node.attrs.after), + "data-group": node.attrs.group } ]; } diff --git a/wax-prosemirror-schema/src/marks/trackChangesMarks/insertionMark.js b/wax-prosemirror-schema/src/marks/trackChangesMarks/insertionMark.js index 365ccc3c52806b747bad3fe069aa6593c5c59dd5..945d52ea756b773020d1c7692f4596446a95b747 100644 --- a/wax-prosemirror-schema/src/marks/trackChangesMarks/insertionMark.js +++ b/wax-prosemirror-schema/src/marks/trackChangesMarks/insertionMark.js @@ -1,17 +1,11 @@ const insertion = { attrs: { - user: { - default: 0 - }, - username: { - default: "" - }, - date: { - default: 0 - }, - approved: { - default: true - } + id: { default: "" }, + user: { default: 0 }, + username: { default: "" }, + date: { default: 0 }, + approved: { default: true }, + group: { default: "" } }, inclusive: false, group: "track", @@ -20,11 +14,13 @@ const insertion = { tag: "span.insertion", getAttrs(dom) { return { + id: dom.dataset.id, user: parseInt(dom.dataset.user), username: dom.dataset.username, date: parseInt(dom.dataset.date), inline: true, - approved: false + approved: false, + group: dom.dataset.group }; } }, @@ -32,11 +28,13 @@ const insertion = { tag: "span.approved-insertion", getAttrs(dom) { return { + "data-id": node.attrs.id, user: parseInt(dom.dataset.user), username: dom.dataset.username, date: parseInt(dom.dataset.date), inline: true, - approved: true + approved: true, + group: dom.dataset.group }; } } @@ -48,9 +46,11 @@ const insertion = { class: node.attrs.approved ? "approved-insertion" : `insertion user-${node.attrs.user}`, + "data-id": node.attrs.id, "data-user": node.attrs.user, "data-username": node.attrs.username, - "data-date": node.attrs.date + "data-date": node.attrs.date, + "data-group": node.attrs.group } ]; } diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/authorTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/authorTrackNode.js index bc39089d513508c7c3a2b2b01c9297a341825692..4ee38f0b2f9704e57b3f87b737a20ebebe37e09a 100644 --- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/authorTrackNode.js +++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/authorTrackNode.js @@ -6,14 +6,18 @@ const author = { priority: 0, defining: true, attrs: { - track: { default: [] } + id: { default: "" }, + track: { default: [] }, + group: { default: "" } }, parseDOM: [ { tag: "p.author", getAttrs(hook, next) { Object.assign(hook, { - track: SchemaHelpers.parseTracks(hook.dom.dataset.track) + id: hook.dom.dataset.id, + track: SchemaHelpers.parseTracks(hook.dom.dataset.track), + group: hook.dom.dataset.group }); next(); } @@ -22,7 +26,9 @@ const author = { toDOM(hook, next) { if (hook.node.attrs.track.length) { Object.assign(hook.value[1], { - "data-track": JSON.stringify(hook.node.attrs.track) + "data-id": hook.node.attrs.id, + "data-track": JSON.stringify(hook.node.attrs.track), + "data-group": hook.node.attrs.group }); } next(); diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphPoetryTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphPoetryTrackNode.js index f228c72d18b244951ec73ba55d4f56108d7a13c5..e888ed541803edf6cc7865a2b207895560f7b213 100644 --- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphPoetryTrackNode.js +++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphPoetryTrackNode.js @@ -6,14 +6,18 @@ const epigraphPoetry = { priority: 0, defining: true, attrs: { - track: { default: [] } + id: { default: "" }, + track: { default: [] }, + group: { default: "" } }, parseDOM: [ { tag: "p.epigraph-poetry", getAttrs(hook, next) { Object.assign(hook, { - track: SchemaHelpers.parseTracks(hook.dom.dataset.track) + id: hook.dom.dataset.id, + track: SchemaHelpers.parseTracks(hook.dom.dataset.track), + group: hook.dom.dataset.group }); next(); } @@ -22,7 +26,9 @@ const epigraphPoetry = { toDOM(hook, next) { if (hook.node.attrs.track.length) { Object.assign(hook.value[1], { - "data-track": JSON.stringify(hook.node.attrs.track) + "data-id": hook.node.attrs.id, + "data-track": JSON.stringify(hook.node.attrs.track), + "data-group": hook.node.attrs.group }); } next(); diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphProseTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphProseTrackNode.js index 56515d4e66912b4ee9f40976af5c2b20ccc30fe9..e4135cf066f6a8bfafd80c67bdfff739efd81d35 100644 --- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphProseTrackNode.js +++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphProseTrackNode.js @@ -6,14 +6,18 @@ const epigraphProse = { priority: 0, defining: true, attrs: { - track: { default: [] } + id: { default: "" }, + track: { default: [] }, + group: { default: "" } }, parseDOM: [ { tag: "p.epigraph-prose", getAttrs(hook, next) { Object.assign(hook, { - track: SchemaHelpers.parseTracks(hook.dom.dataset.track) + id: hook.dom.dataset.id, + track: SchemaHelpers.parseTracks(hook.dom.dataset.track), + group: hook.dom.dataset.group }); next(); } @@ -22,7 +26,9 @@ const epigraphProse = { toDOM(hook, next) { if (hook.node.attrs.track.length) { Object.assign(hook.value[1], { - "data-track": JSON.stringify(hook.node.attrs.track) + "data-id": hook.node.attrs.id, + "data-track": JSON.stringify(hook.node.attrs.track), + "data-group": hook.node.attrs.group }); } next(); diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractPoetryTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractPoetryTrackNode.js index c14c0fa3a4f8139fa9c1e8cdb022abf248a88678..937af7bd409a759bf6d7f6964bce034fc4a5652a 100644 --- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractPoetryTrackNode.js +++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractPoetryTrackNode.js @@ -6,14 +6,18 @@ const extractPoetry = { priority: 0, defining: true, attrs: { - track: { default: [] } + id: { default: "" }, + track: { default: [] }, + group: { default: "" } }, parseDOM: [ { tag: "p.extract-poetry", getAttrs(hook, next) { Object.assign(hook, { - track: SchemaHelpers.parseTracks(hook.dom.dataset.track) + id: hook.dom.dataset.id, + track: SchemaHelpers.parseTracks(hook.dom.dataset.track), + group: hook.dom.dataset.group }); next(); } @@ -22,7 +26,9 @@ const extractPoetry = { toDOM(hook, next) { if (hook.node.attrs.track.length) { Object.assign(hook.value[1], { - "data-track": JSON.stringify(hook.node.attrs.track) + "data-id": hook.node.attrs.id, + "data-track": JSON.stringify(hook.node.attrs.track), + "data-group": hook.node.attrs.group }); } next(); diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractProseTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractProseTrackNode.js index 3d097662d0d416f441735bd59a085e3b104b81c7..83d9bda493c84dd53f96423beb3e4c3aae914462 100644 --- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractProseTrackNode.js +++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractProseTrackNode.js @@ -6,14 +6,18 @@ const extractProse = { priority: 0, defining: true, attrs: { - track: { default: [] } + id: { default: "" }, + track: { default: [] }, + group: { default: "" } }, parseDOM: [ { tag: "p.extract-prose", getAttrs(hook, next) { Object.assign(hook, { - track: SchemaHelpers.parseTracks(hook.dom.dataset.track) + id: hook.dom.dataset.id, + track: SchemaHelpers.parseTracks(hook.dom.dataset.track), + group: hook.dom.dataset.group }); next(); } @@ -22,7 +26,9 @@ const extractProse = { toDOM(hook, next) { if (hook.node.attrs.track.length) { Object.assign(hook.value[1], { - "data-track": JSON.stringify(hook.node.attrs.track) + "data-id": hook.node.attrs.id, + "data-track": JSON.stringify(hook.node.attrs.track), + "data-group": hook.node.attrs.group }); } next(); diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/headingTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/headingTrackNode.js index 9f97c4bc7b1efbbf5b6c22769789fc640cd51280..55be2a66ac193dfde9ceb1173573cf41108c1b9e 100644 --- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/headingTrackNode.js +++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/headingTrackNode.js @@ -2,7 +2,9 @@ import { SchemaHelpers } from "wax-prosemirror-utilities"; const heading = { attrs: { - track: { default: [] } + id: { default: "" }, + track: { default: [] }, + group: { default: "" } }, content: "inline*", group: "block", @@ -12,7 +14,9 @@ const heading = { tag: "h1", getAttrs(hook, next) { Object.assign(hook, { - track: SchemaHelpers.parseTracks(hook.dom.dataset.track) + id: hook.dom.dataset.id, + track: SchemaHelpers.parseTracks(hook.dom.dataset.track), + group: hook.dom.dataset.group }); next(); } @@ -21,7 +25,9 @@ const heading = { tag: "h2", getAttrs(hook, next) { Object.assign(hook, { - track: SchemaHelpers.parseTracks(hook.dom.dataset.track) + id: hook.dom.dataset.id, + track: SchemaHelpers.parseTracks(hook.dom.dataset.track), + group: hook.dom.dataset.group }); next(); } @@ -30,7 +36,9 @@ const heading = { tag: "h3", getAttrs(hook, next) { Object.assign(hook, { - track: SchemaHelpers.parseTracks(hook.dom.dataset.track) + id: hook.dom.dataset.id, + track: SchemaHelpers.parseTracks(hook.dom.dataset.track), + group: hook.dom.dataset.group }); next(); } @@ -39,7 +47,9 @@ const heading = { toDOM(hook, next) { if (hook.node.attrs.track.length) { Object.assign(hook.value[1], { - "data-track": JSON.stringify(hook.node.attrs.track) + "data-id": hook.node.attrs.id, + "data-track": JSON.stringify(hook.node.attrs.track), + "data-group": hook.node.attrs.group }); } next(); diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/orderedListTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/orderedListTrackNode.js index bdb3840b97f5a943460e70557825876aab562a66..a4214da44d0fc2b9fb84141c968cee15b2bab89d 100644 --- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/orderedListTrackNode.js +++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/orderedListTrackNode.js @@ -4,14 +4,18 @@ const orderedlist = { group: "block", content: "list_item+", attrs: { - track: { default: [] } + id: { default: "" }, + track: { default: [] }, + group: { default: "" } }, parseDOM: [ { tag: "ol", getAttrs(hook, next) { Object.assign(hook, { - track: SchemaHelpers.parseTracks(hook.dom.dataset.track) + id: hook.dom.dataset.id, + track: SchemaHelpers.parseTracks(hook.dom.dataset.track), + group: hook.dom.dataset.group }); next(); } @@ -20,7 +24,9 @@ const orderedlist = { toDOM(hook, next) { if (hook.node.attrs.track.length) { Object.assign(hook.value[1], { - "data-track": JSON.stringify(hook.node.attrs.track) + "data-id": hook.node.attrs.id, + "data-track": JSON.stringify(hook.node.attrs.track), + "data-group": hook.node.attrs.group }); } next(); diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/paragraphContTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/paragraphContTrackNode.js index 4443b04b29ed46bfe1e9ec1bfd32b202a0eed732..3bc477abf0276a19fe589ea4720ea7f21875e4ad 100644 --- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/paragraphContTrackNode.js +++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/paragraphContTrackNode.js @@ -6,14 +6,18 @@ const paragraphCont = { priority: 0, defining: true, attrs: { - track: { default: [] } + id: { default: "" }, + track: { default: [] }, + group: { default: "" } }, parseDOM: [ { tag: "p.paragraph-cont", getAttrs(hook, next) { Object.assign(hook, { - track: SchemaHelpers.parseTracks(hook.dom.dataset.track) + id: hook.dom.dataset.id, + track: SchemaHelpers.parseTracks(hook.dom.dataset.track), + group: hook.dom.dataset.group }); next(); } @@ -22,7 +26,9 @@ const paragraphCont = { toDOM(hook, next) { if (hook.node.attrs.track.length) { Object.assign(hook.value[1], { - "data-track": JSON.stringify(hook.node.attrs.track) + "data-id": hook.node.attrs.id, + "data-track": JSON.stringify(hook.node.attrs.track), + "data-group": hook.node.attrs.group }); } next(); diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/sourceNoteTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/sourceNoteTrackNode.js index d09938b4470b907a060b446be41f2650c8cfddb4..cf9437b3c0dee938b6d47a1eb15f30fa19b3571f 100644 --- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/sourceNoteTrackNode.js +++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/sourceNoteTrackNode.js @@ -6,14 +6,18 @@ const sourceNote = { priority: 0, defining: true, attrs: { - track: { default: [] } + id: { default: "" }, + track: { default: [] }, + group: { default: "" } }, parseDOM: [ { tag: "p.source-note", getAttrs(hook, next) { Object.assign(hook, { - track: SchemaHelpers.parseTracks(hook.dom.dataset.track) + id: hook.dom.dataset.id, + track: SchemaHelpers.parseTracks(hook.dom.dataset.track), + group: hook.dom.dataset.group }); next(); } @@ -22,7 +26,9 @@ const sourceNote = { toDOM(hook, next) { if (hook.node.attrs.track.length) { Object.assign(hook.value[1], { - "data-track": JSON.stringify(hook.node.attrs.track) + "data-id": hook.node.attrs.id, + "data-track": JSON.stringify(hook.node.attrs.track), + "data-group": hook.node.attrs.group }); } next(); diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/subTitleTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/subTitleTrackNode.js index e89a2e8402e8c8b63921c245f116e4aea48ce25c..c2d21e6124556dfc41efd55eed8c91927f878295 100644 --- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/subTitleTrackNode.js +++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/subTitleTrackNode.js @@ -6,14 +6,18 @@ const subtitle = { priority: 0, defining: true, attrs: { - track: { default: [] } + id: { default: "" }, + track: { default: [] }, + group: { default: "" } }, parseDOM: [ { tag: "p.cst", getAttrs(hook, next) { Object.assign(hook, { - track: SchemaHelpers.parseTracks(hook.dom.dataset.track) + id: hook.dom.dataset.id, + track: SchemaHelpers.parseTracks(hook.dom.dataset.track), + group: hook.dom.dataset.group }); next(); } @@ -22,7 +26,9 @@ const subtitle = { toDOM(hook, next) { if (hook.node.attrs.track.length) { Object.assign(hook.value[1], { - "data-track": JSON.stringify(hook.node.attrs.track) + "data-id": hook.node.attrs.id, + "data-track": JSON.stringify(hook.node.attrs.track), + "data-group": hook.node.attrs.group }); } next(); diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/titleTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/titleTrackNode.js index 02c835d435804eb51e56db2919842c5dfe4a9cdd..81de595b527ab4a1761d3abaab3cd353480f2343 100644 --- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/titleTrackNode.js +++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/titleTrackNode.js @@ -6,14 +6,18 @@ const title = { priority: 0, defining: true, attrs: { - track: { default: [] } + id: { default: "" }, + track: { default: [] }, + group: { default: "" } }, parseDOM: [ { tag: "p.title", getAttrs(hook, next) { Object.assign(hook, { - track: SchemaHelpers.parseTracks(hook.dom.dataset.track) + id: hook.dom.dataset.id, + track: SchemaHelpers.parseTracks(hook.dom.dataset.track), + group: hook.dom.dataset.group }); next(); } @@ -22,7 +26,9 @@ const title = { toDOM(hook, next) { if (hook.node.attrs.track.length) { Object.assign(hook.value[1], { - "data-track": JSON.stringify(hook.node.attrs.track) + "data-id": hook.node.attrs.id, + "data-track": JSON.stringify(hook.node.attrs.track), + "data-group": hook.node.attrs.group }); } next(); diff --git a/wax-prosemirror-services/package.json b/wax-prosemirror-services/package.json index 01681fa80ffc857e22fb6db876e1e0e3c96c8acd..f639604af144dc8009c83b952919699f4f29c897 100644 --- a/wax-prosemirror-services/package.json +++ b/wax-prosemirror-services/package.json @@ -10,6 +10,8 @@ "build": "BABEL_ENV=production rollup -c" }, "dependencies": { + "react": "^16.13.1", + "react-dom": "^16.13.1", "inversify": "^5.0.1", "inversify-inject-decorators": "^3.1.0", "styled-components": "^4.2.0", diff --git a/wax-prosemirror-services/src/CommentsService/CommentsService.js b/wax-prosemirror-services/src/CommentsService/CommentsService.js index ad91909f20c428a62370ecc444d045ab91065b03..96d9ef630a477dbbfcfa9fae7f352f6327a16ccb 100644 --- a/wax-prosemirror-services/src/CommentsService/CommentsService.js +++ b/wax-prosemirror-services/src/CommentsService/CommentsService.js @@ -1,9 +1,6 @@ import Service from "../Service"; import { commentMark } from "wax-prosemirror-schema"; -import { - CommentComponent, - CommentBubbleComponent -} from "wax-prosemirror-components"; +import { RightArea, CommentBubbleComponent } from "wax-prosemirror-components"; import { ActiveComment } from "wax-prosemirror-plugins"; const PLUGIN_KEY = "activeComment"; @@ -27,7 +24,7 @@ export default class CommentsService extends Service { selection: true } ); - layout.addComponent("commentsArea", CommentComponent); + layout.addComponent("rightArea", RightArea); } register() { diff --git a/wax-prosemirror-services/src/SchemaService/DefaultSchema.js b/wax-prosemirror-services/src/SchemaService/DefaultSchema.js index 88b4f88c11c767cfa005f0eb18c9de88ae13ec90..23653b144e7c4f1ba734999afe5ddecba5bb721f 100644 --- a/wax-prosemirror-services/src/SchemaService/DefaultSchema.js +++ b/wax-prosemirror-services/src/SchemaService/DefaultSchema.js @@ -21,16 +21,20 @@ export default { group: "block", content: "inline*", attrs: { + id: { default: "" }, class: { default: "paragraph" }, - track: { default: [] } + track: { default: [] }, + group: { default: "" } }, parseDOM: [ { tag: "p.paragraph", getAttrs(dom) { return { + id: dom.dataset.id, class: dom.getAttribute("class"), - track: SchemaHelpers.parseTracks(dom.dataset.track) + track: SchemaHelpers.parseTracks(dom.dataset.track), + group: dom.dataset.group }; } } diff --git a/wax-prosemirror-services/src/TrackChangeService/track-changes/markWrapping.js b/wax-prosemirror-services/src/TrackChangeService/track-changes/markWrapping.js index 9e1ebc7cfbeb9ba3cff843f71e199a9b0dbeffde..e15856960572a4d2f080101551c63f2ca75e991b 100644 --- a/wax-prosemirror-services/src/TrackChangeService/track-changes/markWrapping.js +++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/markWrapping.js @@ -1,3 +1,5 @@ +import { v4 as uuidv4 } from "uuid"; + const markWrapping = (tr, pos, oldNode, newNode, user, username, date1) => { let track = oldNode.attrs.track.slice(), blockTrack = track.find(track => track.type === "block_change"); @@ -36,7 +38,11 @@ const markWrapping = (tr, pos, oldNode, newNode, user, username, date1) => { track.push(blockTrack); } - tr.setNodeMarkup(pos, null, Object.assign({}, newNode.attrs, { track })); + tr.setNodeMarkup( + pos, + null, + Object.assign({}, newNode.attrs, { id: uuidv4(), track }) + ); }; export default markWrapping; diff --git a/wax-prosemirror-utilities/src/schema/SchemaHelpers.js b/wax-prosemirror-utilities/src/schema/SchemaHelpers.js index fc773c2db35005ac17ae27a63a9b1ede15b24e34..40cac9e012a537675757e8afc68e529a7849e209 100644 --- a/wax-prosemirror-utilities/src/schema/SchemaHelpers.js +++ b/wax-prosemirror-utilities/src/schema/SchemaHelpers.js @@ -40,8 +40,10 @@ const parseTracks = str => { const blockLevelToDOM = node => { const attrs = node.attrs.track.length ? { + "data-id": node.attrs.id, class: node.attrs.class, - "data-track": JSON.stringify(node.attrs.track) + "data-track": JSON.stringify(node.attrs.track), + "data-group": node.attrs.group } : { class: node.attrs.class }; return attrs;