diff --git a/LICENSE b/LICENSE index c6d1521ff758de916ce04fef32c747676c818c9c..25d4f9fb2bc79f181e40c5aa7026d0e80195c935 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2019, Adam Hyde +Copyright (c) 2019 MIT License (https://opensource.org/licenses/MIT) diff --git a/package.json b/package.json index eac8c34ecbc0be7250f9dd7b5a0f11d5f28624d0..6472eb3c00db022238346b18a6c1f6171a9d9fd1 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "wax-prosemirror-monorepo", - "version": "0.0.1", + "version": "0.0.13", "main": "index.js", - "author": "Collaborative Knowledge Foundation", + "author": "Christos Kokosias", "description": "Monorepo for wax-prosemirror, its components and its integrations", "repository": { "type": "git", diff --git a/wax-prosemirror-components/package.json b/wax-prosemirror-components/package.json index cfb0da02f1e61f36036e4f0c9fb0bbe588d4b3bf..aad9053e8b3d7f61707bf2aef86b52c0ed44860c 100644 --- a/wax-prosemirror-components/package.json +++ b/wax-prosemirror-components/package.json @@ -1,6 +1,6 @@ { "name": "wax-prosemirror-components", - "author": "Collaborative Knowledge Foundation", + "author": "Christos Kokosias", "version": "0.0.13", "description": "Wax prosemirror UI components", "license": "MIT", diff --git a/wax-prosemirror-components/src/components/Button.js b/wax-prosemirror-components/src/components/Button.js index cb1049ccad5968155f4a940998db55b03d70a1c9..85cf9df094a3b0ca9905ef4ee68277b3a5332bd3 100644 --- a/wax-prosemirror-components/src/components/Button.js +++ b/wax-prosemirror-components/src/components/Button.js @@ -1,3 +1,4 @@ +/* eslint react/prop-types: 0 */ import React, { useContext } from 'react'; import styled from 'styled-components'; import { ButtonStyles } from 'wax-prosemirror-themes'; diff --git a/wax-prosemirror-components/src/components/HeadingsDropDown.js b/wax-prosemirror-components/src/components/HeadingsDropDown.js index d4fdcaea747f914ccf1329ba587303778e7d4258..18d1a5712be65f19f96ec19f5b60fbc4f3df1f6e 100644 --- a/wax-prosemirror-components/src/components/HeadingsDropDown.js +++ b/wax-prosemirror-components/src/components/HeadingsDropDown.js @@ -1,20 +1,21 @@ -import React from "react"; -import styled from "styled-components"; -import { Commands } from "wax-prosemirror-utilities"; -import Dropdown from "react-dropdown"; -import "react-dropdown/style.css"; +/* eslint react/prop-types: 0 */ +import React from 'react'; +import styled from 'styled-components'; +import { Commands } from 'wax-prosemirror-utilities'; +import Dropdown from 'react-dropdown'; +import 'react-dropdown/style.css'; const DropdownStyled = styled(Dropdown)` - display: ${props => (props.select ? "inline-flex" : "none")}; + display: ${props => (props.select ? 'inline-flex' : 'none')}; .Dropdown-control { border: none; } `; const dropDownOptions = [ - { label: "Heading 1", value: "1" }, - { label: "Heading 2", value: "2" }, - { label: "Heading 3", value: "3" } + { label: 'Heading 1', value: '1' }, + { label: 'Heading 2', value: '2' }, + { label: 'Heading 3', value: '3' }, ]; const HeadingsDropDown = ({ dispatch, state, item }) => ( @@ -22,7 +23,7 @@ const HeadingsDropDown = ({ dispatch, state, item }) => ( options={dropDownOptions} onChange={option => { Commands.setBlockType(state.config.schema.nodes.heading, { - level: option.value + level: option.value, })(state, dispatch); }} placeholder="Choose heading" diff --git a/wax-prosemirror-components/src/components/ImageUpload.js b/wax-prosemirror-components/src/components/ImageUpload.js index a82798f3235855db220bd20e96db1b4ec1260e8c..965f46be22f609676998bb98e9f8bf81a6acc9d1 100644 --- a/wax-prosemirror-components/src/components/ImageUpload.js +++ b/wax-prosemirror-components/src/components/ImageUpload.js @@ -1,7 +1,11 @@ -import React from "react"; -import styled from "styled-components"; +/* eslint react/prop-types: 0 */ +import React, { useContext } from 'react'; +import { WaxContext } from 'wax-prosemirror-core'; +import styled from 'styled-components'; const UploadImage = styled.div` + opacity: ${props => (props.select ? 1 : 0.4)}; + pointer-events: ${props => (props.select ? 'default' : 'none')}; color: #777; display: inline-flex; padding: 0px 10px; @@ -14,20 +18,23 @@ const UploadImage = styled.div` display: none; } `; -const ImageUpload = ({ item, fileUpload }) => ( - <UploadImage> - <label - className="custom-file-upload" - title="upload image" - htmlFor="file-upload" - > - {item.content} - <input - id="file-upload" - onChange={e => fileUpload(e.target.files[0])} - type="file" - /> - </label> - </UploadImage> -); +const ImageUpload = ({ item, fileUpload, view }) => { + const { activeViewId } = useContext(WaxContext); + return ( + <UploadImage select={item.select && item.select(view.state, activeViewId)}> + <label + className="custom-file-upload" + title="upload image" + htmlFor="file-upload" + > + {item.content} + <input + id="file-upload" + onChange={e => fileUpload(e.target.files[0])} + type="file" + /> + </label> + </UploadImage> + ); +}; export default ImageUpload; diff --git a/wax-prosemirror-components/src/components/TableDropDown.js b/wax-prosemirror-components/src/components/TableDropDown.js index 950c1a53eac116eadc25865e9b744510d41f204f..72c1f5d69c7b1edc3219ca0cd85b91ce00bbceea 100644 --- a/wax-prosemirror-components/src/components/TableDropDown.js +++ b/wax-prosemirror-components/src/components/TableDropDown.js @@ -1,14 +1,15 @@ -import React from "react"; -import styled from "styled-components"; -import * as tablesFn from "prosemirror-tables"; -import Dropdown from "react-dropdown"; -import "react-dropdown/style.css"; +/* eslint react/prop-types: 0 */ +import React from 'react'; +import styled from 'styled-components'; +import * as tablesFn from 'prosemirror-tables'; +import Dropdown from 'react-dropdown'; +import 'react-dropdown/style.css'; const DropdownStyled = styled(Dropdown)` display: inline-flex; cursor: not-allowed; opacity: ${props => (props.select ? 1 : 0.4)}; - pointer-events: ${props => (props.select ? "default" : "none")}; + pointer-events: ${props => (props.select ? 'default' : 'none')}; .Dropdown-control { border: none; } @@ -28,28 +29,29 @@ const DropdownStyled = styled(Dropdown)` `; const dropDownOptions = [ - { label: "add column before", value: "addColumnBefore" }, - { label: "add column after", value: "addColumnAfter" }, - { label: "Delete column", value: "deleteColumn" }, - { label: "Insert row before", value: "addRowBefore" }, - { label: "Insert row after", value: "addRowAfter" }, - { label: "Delete row", value: "deleteRow" }, - { label: "Delete table", value: "deleteTable" }, - { label: "Merge cells", value: "mergeCells" }, - { label: "Split cell", value: "splitCell" }, - { label: "Toggle header column", value: "toggleHeaderColumn" }, - { label: "Toggle header row", value: "toggleHeaderRow" }, - { label: "Toggle header cells", value: "toggleHeaderCell" } + { label: 'add column before', value: 'addColumnBefore' }, + { label: 'add column after', value: 'addColumnAfter' }, + { label: 'Delete column', value: 'deleteColumn' }, + { label: 'Insert row before', value: 'addRowBefore' }, + { label: 'Insert row after', value: 'addRowAfter' }, + { label: 'Delete row', value: 'deleteRow' }, + { label: 'Delete table', value: 'deleteTable' }, + { label: 'Merge cells', value: 'mergeCells' }, + { label: 'Split cell', value: 'splitCell' }, + { label: 'Toggle header column', value: 'toggleHeaderColumn' }, + { label: 'Toggle header row', value: 'toggleHeaderRow' }, + { label: 'Toggle header cells', value: 'toggleHeaderCell' }, ]; const TableDropDown = ({ view: { dispatch, state }, item }) => ( <DropdownStyled options={dropDownOptions} onChange={option => { - tablesFn[option.value](state, dispatch); + item.run(state, dispatch, tablesFn[option.value]); }} placeholder="Table Options" select={item.select && item.select(state)} /> ); + export default TableDropDown; diff --git a/wax-prosemirror-components/src/components/comments/Comment.js b/wax-prosemirror-components/src/components/comments/Comment.js index 6845cc58adf9f372f9d7b21f6b71912bbc87ea2d..c215af8c8a0e474692012968405d2a74041f6531 100644 --- a/wax-prosemirror-components/src/components/comments/Comment.js +++ b/wax-prosemirror-components/src/components/comments/Comment.js @@ -1,3 +1,4 @@ +/* eslint react/prop-types: 0 */ import React, { useState, useRef, useEffect } from 'react'; import { v4 as uuidv4 } from 'uuid'; import { last } from 'lodash'; @@ -43,7 +44,7 @@ export default ({ comment, activeView, user, active }) => { const { current: { value }, } = commentInput; - const { tr, doc } = state; + const { tr } = state; const obj = { content: value, diff --git a/wax-prosemirror-components/src/components/comments/CommentBox.js b/wax-prosemirror-components/src/components/comments/CommentBox.js index d77ee80323133a2ae2d613960d8666dd9d61d81d..05b730cb2f9a79898ca8bf90ef89ef69a8e5c657 100644 --- a/wax-prosemirror-components/src/components/comments/CommentBox.js +++ b/wax-prosemirror-components/src/components/comments/CommentBox.js @@ -1,3 +1,4 @@ +/* eslint react/prop-types: 0 */ import React, { useState, useEffect, useContext, memo } from 'react'; import { TextSelection } from 'prosemirror-state'; import { last, maxBy } from 'lodash'; @@ -27,12 +28,12 @@ const CommentBoxStyled = styled.div` return 0.6; case 'entered': return 1; + default: } }}; `; export default ({ comment, top, dataBox }) => { - console.log('rerender'); const [animate, setAnimate] = useState(false); const { attrs: { id }, diff --git a/wax-prosemirror-components/src/components/comments/CommentBubbleComponent.js b/wax-prosemirror-components/src/components/comments/CommentBubbleComponent.js index 1c8b2fcd02d6a0a10f071265b1451a5f96d17c73..79b2a117e4a22157962d8638ea3769a1ea2e3f97 100644 --- a/wax-prosemirror-components/src/components/comments/CommentBubbleComponent.js +++ b/wax-prosemirror-components/src/components/comments/CommentBubbleComponent.js @@ -1,5 +1,5 @@ -import React, { useLayoutEffect, useState, useContext } from 'react'; -import styled from 'styled-components'; +/* eslint react/prop-types: 0 */ +import React, { useLayoutEffect, useContext } from 'react'; import { Commands, DocumentHelpers } from 'wax-prosemirror-utilities'; import { WaxContext } from 'wax-prosemirror-core'; @@ -32,12 +32,8 @@ const CommentBubbleComponent = ({ const isSelectionComment = () => { const commentMark = activeView.state.schema.marks.comment; const mark = DocumentHelpers.findMark(state, commentMark, true); - const { - selection: { $from, $to }, - doc, - } = state; - //TODO Overlapping comments . for now don't allow + // TODO Overlapping comments . for now don't allow if (mark.length >= 1) return true; return false; }; diff --git a/wax-prosemirror-components/src/components/link/LinkComponent.js b/wax-prosemirror-components/src/components/link/LinkComponent.js index 7fc43a202c8c296700f9298f65e1a0f19462e21c..8c4b32a8d8699758e7ccd677c9af3cd225dd43df 100644 --- a/wax-prosemirror-components/src/components/link/LinkComponent.js +++ b/wax-prosemirror-components/src/components/link/LinkComponent.js @@ -1,7 +1,8 @@ -import React, { useRef, useEffect, useState, useContext } from "react"; -import styled from "styled-components"; -import { WaxContext } from "wax-prosemirror-core"; -import { DocumentHelpers } from "wax-prosemirror-utilities"; +/* eslint react/prop-types: 0 */ +import React, { useRef, useEffect, useState, useContext } from 'react'; +import styled from 'styled-components'; +import { WaxContext } from 'wax-prosemirror-core'; +import { DocumentHelpers } from 'wax-prosemirror-utilities'; const LinkWrapper = styled.div` padding: 20px; @@ -19,25 +20,23 @@ const Button = styled.button` `; const LinkComponent = ({ mark, setPosition, position }) => { - const href = mark ? mark.attrs.href : null, - linkMark = mark ? mark : null, - { view: { main }, activeView } = useContext(WaxContext), - { state, dispatch } = activeView, - ref = useRef(null), - linkInput = useRef(null), - [addButtonText, setButtonText] = useState("Create"), - [lastLinkMark, setLLastLinkMark] = useState(linkMark), - [linkHref, setLinkHref] = useState(href); + const href = mark ? mark.attrs.href : null; + const linkMark = mark ? mark : null; + const { + view: { main }, + activeView, + } = useContext(WaxContext); + const { state, dispatch } = activeView; + const ref = useRef(null); + const linkInput = useRef(null); + const [addButtonText, setButtonText] = useState('Create'); + const [lastLinkMark, setLLastLinkMark] = useState(linkMark); + const [linkHref, setLinkHref] = useState(href); - useEffect( - () => { - const width = ref.current ? ref.current.offsetWidth : 0; - const left = Math.abs(position.left - width / 2); - setLinkText(); - removeMarkIfEmptyHref(); - }, - [ref.current, href] - ); + useEffect(() => { + setLinkText(); + removeMarkIfEmptyHref(); + }, [ref.current, href]); const addLinkHref = () => { const href = linkHref; @@ -50,9 +49,9 @@ const LinkComponent = ({ mark, setPosition, position }) => { mark.to, linkMark.create({ ...((mark && mark.attrs) || {}), - href - }) - ) + href, + }), + ), ); activeView.focus(); }; @@ -63,45 +62,49 @@ const LinkComponent = ({ mark, setPosition, position }) => { }; const handleKeyDown = event => { - if (event.key === "Enter" || event.which === 13) { + if (event.key === 'Enter' || event.which === 13) { addLinkHref(); } }; const updateLinkHref = () => { - const { current: { value } } = linkInput; + const { + current: { value }, + } = linkInput; setLinkHref(value); }; const setLinkText = () => { - if (mark && mark.attrs.href !== "") { - setButtonText("Update"); + if (mark && mark.attrs.href !== '') { + setButtonText('Update'); setLinkHref(mark.attrs.href); } else { - setButtonText("Create"); - setLinkHref(""); + setButtonText('Create'); + setLinkHref(''); if (linkInput.current) linkInput.current.focus(); } }; const removeMarkIfEmptyHref = () => { - const { selection: { $from, $to } } = state; - const PMLinkMark = state.schema.marks["link"]; + const { + selection: { $from, $to }, + } = state; + const PMLinkMark = state.schema.marks['link']; const actualMark = DocumentHelpers.getSelectionMark(state, PMLinkMark); setLLastLinkMark(actualMark); if ( - lastLinkMark.attrs.href === "" && + lastLinkMark.attrs.href === '' && ($from.pos < lastLinkMark.from || $to.pos > lastLinkMark.to) ) { dispatch( state.tr - .setMeta("addToHistory", false) + .setMeta('addToHistory', false) .removeMark( lastLinkMark.from, lastLinkMark.to, - state.schema.marks.link - ) + state.schema.marks.link, + ), ); } }; diff --git a/wax-prosemirror-components/src/components/notes/NoteEditorContainer.js b/wax-prosemirror-components/src/components/notes/NoteEditorContainer.js index 9aee856a0018f196896ff03d37c48417e977270d..3d06af2633608efd024b5c63801b421c18877e9c 100644 --- a/wax-prosemirror-components/src/components/notes/NoteEditorContainer.js +++ b/wax-prosemirror-components/src/components/notes/NoteEditorContainer.js @@ -1,7 +1,7 @@ -import React from "react"; -import styled from "styled-components"; +import React from 'react'; +import styled from 'styled-components'; -import NoteNumber from "./NoteNumber"; +import NoteNumber from './NoteNumber'; const NoteEditorContainerStyled = styled.div` display: flex; @@ -23,6 +23,11 @@ const NoteStyled = styled.div` &:focus { outline: none; } + + p { + margin: 0; + } + span.comment { border-bottom: 2px solid #ffab20; border-radius: 3px 3px 0 0; diff --git a/wax-prosemirror-components/src/components/notes/NoteNumber.js b/wax-prosemirror-components/src/components/notes/NoteNumber.js index aa79ea8c7644ff3cd5bc67b3e89dcf44fc35bfdd..3341978eda376a797e347092c672e92854df9f2f 100644 --- a/wax-prosemirror-components/src/components/notes/NoteNumber.js +++ b/wax-prosemirror-components/src/components/notes/NoteNumber.js @@ -1,5 +1,6 @@ -import React from "react"; -import styled from "styled-components"; +/* eslint react/prop-types: 0 */ +import React from 'react'; +import styled from 'styled-components'; const NoteNumberStyled = styled.div` display: flex; diff --git a/wax-prosemirror-components/src/components/rightArea/BoxList.js b/wax-prosemirror-components/src/components/rightArea/BoxList.js index 10d1d454d041b6bacfc5d33a01716707abc60f61..23e2ab47a3a6fca236f11b694ededc4d75700398 100644 --- a/wax-prosemirror-components/src/components/rightArea/BoxList.js +++ b/wax-prosemirror-components/src/components/rightArea/BoxList.js @@ -1,3 +1,4 @@ +/* eslint react/prop-types: 0 */ import { Mark } from 'prosemirror-model'; import React from 'react'; import CommentBox from '../comments/CommentBox'; diff --git a/wax-prosemirror-components/src/components/rightArea/RightArea.js b/wax-prosemirror-components/src/components/rightArea/RightArea.js index a11ecbbb708743a0a9514d2dad8b82b6523b1f71..b66fa208e103b1ef45964ac047cf50a9df15613f 100644 --- a/wax-prosemirror-components/src/components/rightArea/RightArea.js +++ b/wax-prosemirror-components/src/components/rightArea/RightArea.js @@ -1,11 +1,6 @@ +/* eslint react/prop-types: 0 */ import { Mark } from 'prosemirror-model'; -import React, { - useContext, - useState, - useEffect, - useMemo, - useCallback, -} from 'react'; +import React, { useContext, useState, useMemo, useCallback } from 'react'; import useDeepCompareEffect from 'use-deep-compare-effect'; import { each, uniqBy, sortBy } from 'lodash'; import { WaxContext } from 'wax-prosemirror-core'; diff --git a/wax-prosemirror-components/src/components/trackChanges/TrackChangeBox.js b/wax-prosemirror-components/src/components/trackChanges/TrackChangeBox.js index d2ec7235f617014fde5d83da1c61a40437f3c674..b81aa5ec4122eaf91de33a7d7593bd0073429c8f 100644 --- a/wax-prosemirror-components/src/components/trackChanges/TrackChangeBox.js +++ b/wax-prosemirror-components/src/components/trackChanges/TrackChangeBox.js @@ -1,8 +1,9 @@ -import { Mark } from "prosemirror-model"; -import React, { Fragment, useState, useEffect, useContext } from "react"; -import { Transition } from "react-transition-group"; -import styled from "styled-components"; -import { WaxContext } from "wax-prosemirror-core"; +/* eslint react/prop-types: 0 */ +import { Mark } from 'prosemirror-model'; +import React, { useState, useEffect, useContext } from 'react'; +import { Transition } from 'react-transition-group'; +import styled from 'styled-components'; +import { WaxContext } from 'wax-prosemirror-core'; const TrackChangeBoxStyled = styled.div` display: flex; @@ -10,30 +11,37 @@ const TrackChangeBoxStyled = styled.div` margin-top: 10px; border: 1px solid blue; position: absolute; - transition: ${({ state }) => "top 1s, opacity 1.5s, left 1s"}; + 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 }) => { switch (state) { - case "exited": + case 'exited': return 0.2; - case "exiting": + case 'exiting': return 0.4; - case "entering": + case 'entering': return 0.6; - case "entered": + case 'entered': return 1; + default: } }}; `; export default ({ trackChange, view, top, dataBox }) => { const [animate, setAnimate] = useState(false); - const { view: { main }, app, activeView } = useContext(WaxContext); + const { + view: { main }, + app, + activeView, + } = useContext(WaxContext); let action; if (trackChange instanceof Mark) { - if ((trackChange.type.name = "format_change")) { - const { attrs: { username, before, after } } = trackChange; + if ((trackChange.type.name = 'format_change')) { + const { + attrs: { username, before, after }, + } = trackChange; action = `User ${username} added ${after[0]}`; } } else { @@ -46,7 +54,7 @@ export default ({ trackChange, view, top, dataBox }) => { }, []); return ( - <Fragment> + <> <Transition in={animate} timeout={1000}> {state => ( <TrackChangeBoxStyled @@ -63,6 +71,6 @@ export default ({ trackChange, view, top, dataBox }) => { </TrackChangeBoxStyled> )} </Transition> - </Fragment> + </> ); }; diff --git a/wax-prosemirror-components/src/components/trackChanges/TrackChangeEnable.js b/wax-prosemirror-components/src/components/trackChanges/TrackChangeEnable.js index 4966c984113a2807d546e6d8a0956a47814c34b6..742f9a9b0765e19d6844c3cf3682e5937d8c1390 100644 --- a/wax-prosemirror-components/src/components/trackChanges/TrackChangeEnable.js +++ b/wax-prosemirror-components/src/components/trackChanges/TrackChangeEnable.js @@ -1,3 +1,4 @@ +/* eslint react/prop-types: 0 */ import React, { useContext, useState } from 'react'; import styled from 'styled-components'; import { ButtonStyles } from 'wax-prosemirror-themes'; diff --git a/wax-prosemirror-core/package.json b/wax-prosemirror-core/package.json index e4767e473ad2678bcd33824fe0b6b36b9e00534d..a344cd488f65ee8e745ab0e136eb9c6e388ff20d 100644 --- a/wax-prosemirror-core/package.json +++ b/wax-prosemirror-core/package.json @@ -1,6 +1,6 @@ { "name": "wax-prosemirror-core", - "author": "Collaborative Knowledge Foundation", + "author": "Christos Kokosias", "version": "0.0.13", "description": "Wax prosemirror core", "license": "MIT", diff --git a/wax-prosemirror-core/src/Wax.js b/wax-prosemirror-core/src/Wax.js index 9c98429022b57a79686833c3490591f292590eba..a562140c2732086d8d02394a7e1e94906f8057e8 100644 --- a/wax-prosemirror-core/src/Wax.js +++ b/wax-prosemirror-core/src/Wax.js @@ -1,3 +1,4 @@ +/* eslint react/prop-types: 0 */ import React, { useEffect, useState } from 'react'; import debounce from 'lodash/debounce'; import styled from 'styled-components'; @@ -77,7 +78,7 @@ const Wax = props => { const WaxOnchange = onChange ? onChange : value => true; - const editorContent = value ? value : ''; + const editorContent = value || ''; finalPlugins = defaultPlugins.concat([ createPlaceholder(placeholder), diff --git a/wax-prosemirror-layouts/package.json b/wax-prosemirror-layouts/package.json index b808116174e1fe0d3eaebc7dc915b08c59bd8625..07aa8505d5d0520fa03983d718720a2c410ea1e8 100644 --- a/wax-prosemirror-layouts/package.json +++ b/wax-prosemirror-layouts/package.json @@ -1,6 +1,6 @@ { "name": "wax-prosemirror-layouts", - "author": "Collaborative Knowledge Foundation", + "author": "Christos Kokosias", "version": "0.0.13", "description": "Wax prosemirror layouts", "license": "MIT", diff --git a/wax-prosemirror-layouts/src/layouts/EditorElements.js b/wax-prosemirror-layouts/src/layouts/EditorElements.js index bff58dbea4d1a510afe180e2b942e5c2764b0a78..32cce8b5db0e6772ebd91f56ef73b1e1859bf930 100644 --- a/wax-prosemirror-layouts/src/layouts/EditorElements.js +++ b/wax-prosemirror-layouts/src/layouts/EditorElements.js @@ -170,6 +170,9 @@ export default css` span.deletion { text-decoration: line-through; color: red; + footnote { + background: red; + } } span.insertion { diff --git a/wax-prosemirror-plugins/package.json b/wax-prosemirror-plugins/package.json index 28d548f453cd92b8c0155b97d2539b43eb46b679..3340795d9862f8e1e8218bdd03bbaf6f4a4dfac1 100644 --- a/wax-prosemirror-plugins/package.json +++ b/wax-prosemirror-plugins/package.json @@ -1,6 +1,6 @@ { "name": "wax-prosemirror-plugins", - "author": "Collaborative Knowledge Foundation", + "author": "Christos Kokosias", "version": "0.0.13", "description": "Wax prosemirror plugins", "license": "MIT", diff --git a/wax-prosemirror-schema/package.json b/wax-prosemirror-schema/package.json index 0a1a0bd5bdc56d1550d1813da44798008c40864e..41892f0ec9ea72d6921b5b1a66ef200c0f4b3d9e 100644 --- a/wax-prosemirror-schema/package.json +++ b/wax-prosemirror-schema/package.json @@ -1,6 +1,6 @@ { "name": "wax-prosemirror-schema", - "author": "Collaborative Knowledge Foundation", + "author": "Christos Kokosias", "version": "0.0.13", "description": "Wax prosemirror schema", "license": "MIT", @@ -11,6 +11,7 @@ }, "dependencies": { "prosemirror-schema-list": "^1.1.2", - "prosemirror-tables": "^1.1.0" + "prosemirror-tables": "^1.1.0", + "wax-prosemirror-utilities": "0.0.13" } } diff --git a/wax-prosemirror-schema/src/nodes/codeBlockNode.js b/wax-prosemirror-schema/src/nodes/codeBlockNode.js index 213c59b47a819e85bbb0a7d209345c4579c1275e..888b9645b42fae5c11bb73ac36351326cb168dd1 100644 --- a/wax-prosemirror-schema/src/nodes/codeBlockNode.js +++ b/wax-prosemirror-schema/src/nodes/codeBlockNode.js @@ -3,7 +3,7 @@ const codeBlock = { group: 'block', code: true, defining: true, - marks: 'comment', + marks: 'comment insertion deletion', attrs: { params: { default: '' } }, parseDOM: [ { diff --git a/wax-prosemirror-schema/src/nodes/footNoteNode.js b/wax-prosemirror-schema/src/nodes/footNoteNode.js index 4b98de07b2325ad0e6678876f35b4075255fb475..f1a97afd24d119771461e380e62d25c238eef635 100644 --- a/wax-prosemirror-schema/src/nodes/footNoteNode.js +++ b/wax-prosemirror-schema/src/nodes/footNoteNode.js @@ -1,7 +1,7 @@ // TODO Write the node in WaxSchema const footnote = { group: 'inline', - content: 'inline*', + content: 'block*', inline: true, atom: true, attrs: { diff --git a/wax-prosemirror-schema/src/nodes/imageNode.js b/wax-prosemirror-schema/src/nodes/imageNode.js index 9ac1badd366fb0a74a50e0801b6015b0b635565c..9f5d51daae462dcbe1beb74fc35ef4bfe433411b 100644 --- a/wax-prosemirror-schema/src/nodes/imageNode.js +++ b/wax-prosemirror-schema/src/nodes/imageNode.js @@ -4,34 +4,34 @@ const image = { src: {}, alt: { default: null }, title: { default: null }, - track: { default: [] } + track: { default: [] }, }, - group: "inline", + group: 'inline', draggable: true, parseDOM: [ { - tag: "img[src]", + tag: 'img[src]', getAttrs(hook, next) { Object.assign(hook, { - src: hook.dom.getAttribute("src"), - title: hook.dom.getAttribute("title"), + src: hook.dom.getAttribute('src'), + title: hook.dom.getAttribute('title'), // track: parseTracks(hook.dom.dataset.track), - alt: hook.dom.getAttribute("alt") + alt: hook.dom.getAttribute('alt'), }); next(); - } - } + }, + }, ], toDOM(hook, next) { const attrs = {}; - let temp = ""; + let temp = ''; // if (hook.node.attrs.track.length) { // // attrs["data-track"] = JSON.stringify(hook.node.attrs.track); // } - let { src, alt, title } = hook.node.attrs; - hook.value = ["img", { src, alt, title }]; + const { src, alt, title } = hook.node.attrs; + hook.value = ['img', { src, alt, title }]; next(); - } + }, }; export default image; diff --git a/wax-prosemirror-schema/src/nodes/listItemNode.js b/wax-prosemirror-schema/src/nodes/listItemNode.js index c71fdb2c7f81467b487cf903144b24c9026c9845..ffc88e827530007c3fbd6ac5965026dc2815f012 100644 --- a/wax-prosemirror-schema/src/nodes/listItemNode.js +++ b/wax-prosemirror-schema/src/nodes/listItemNode.js @@ -1,30 +1,31 @@ -import { SchemaHelpers } from "wax-prosemirror-utilities"; +/* eslint-disable camelcase */ +import { SchemaHelpers } from 'wax-prosemirror-utilities'; const list_item = { - content: "paragraph block*", + content: 'paragraph block*', attrs: { - track: { default: [] } + track: { default: [] }, }, parseDOM: [ { - tag: "li", + tag: 'li', getAttrs(hook, next) { Object.assign(hook, { - track: SchemaHelpers.parseTracks(hook.dom.dataset.track) + track: SchemaHelpers.parseTracks(hook.dom.dataset.track), }); next(); - } - } + }, + }, ], toDOM(hook, next) { const attrs = {}; if (hook.node.attrs.track.length) { - attrs["data-track"] = JSON.stringify(hook.node.attrs.track); + attrs['data-track'] = JSON.stringify(hook.node.attrs.track); } - hook.value = ["li", attrs, 0]; + hook.value = ['li', attrs, 0]; next(); }, - defining: true + defining: true, }; export default list_item; diff --git a/wax-prosemirror-services/package.json b/wax-prosemirror-services/package.json index 22673079458da5934fafea02e8dd14c8a6ed710f..b2326e6dc8478b3dfe6f5c3d5e697081c6e63e1a 100644 --- a/wax-prosemirror-services/package.json +++ b/wax-prosemirror-services/package.json @@ -1,6 +1,6 @@ { "name": "wax-prosemirror-services", - "author": "Collaborative Knowledge Foundation", + "author": "Christos Kokosias", "version": "0.0.13", "description": "Wax prosemirror services", "license": "MIT", diff --git a/wax-prosemirror-services/src/CodeBlockService/CodeBlockTool.js b/wax-prosemirror-services/src/CodeBlockService/CodeBlockTool.js index 6b2b9fca1fcd5bd68db6221ba8312a032084754d..b533ca58d0d42ce09caa904241a45b79d1401789 100644 --- a/wax-prosemirror-services/src/CodeBlockService/CodeBlockTool.js +++ b/wax-prosemirror-services/src/CodeBlockService/CodeBlockTool.js @@ -14,6 +14,11 @@ class CodeBlockTool extends Tools { }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return setBlockType(state.config.schema.nodes.code_block)(state); diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js b/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js index 6d68ff01db12d5efedef6a3b489b485eb0b36eb4..a3ee0f83e7593b9738f3fe690814b3e8ae182cd0 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js @@ -15,6 +15,11 @@ class Author extends Tools { }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return Commands.setBlockType(state.config.schema.nodes.author)(state); diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js index 819a449b1ec67d9c4b4f6cc39386068922b241a9..b0637041a9e2dbd9312e494bed0600736a2344ef 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js @@ -15,6 +15,11 @@ class EpigraphPoetry extends Tools { }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return Commands.setBlockType(state.config.schema.nodes.epigraphPoetry)( diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js index d4a504b3554d4f20dbb0b58d31880e4d3fa1bc44..7ec1f1494876e32a27d6517b48550182bbdb1ab4 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js @@ -16,6 +16,11 @@ class EpigraphProse extends Tools { }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return Commands.setBlockType(state.config.schema.nodes.epigraphProse)( diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js index d1724fc9d888d2f21146d52be5c530ae8ca2800c..ce22bd8b3883fbd00c86878c3c1eb729cde7e8f7 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js @@ -17,6 +17,11 @@ class Heading1 extends Tools { }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return Commands.setBlockType(state.config.schema.nodes.heading, { diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js index 792d810b09767ca9fdab1a7a1e43717698af2a42..da42959866840a0d4a823b2c634cd9250cf61850 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js @@ -17,6 +17,11 @@ class Heading2 extends Tools { }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return Commands.setBlockType(state.config.schema.nodes.heading, { diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js index e1e133d52c26e6f93811586530aeb236a1c32d47..1706b0c14c1329d717e37ddddd8a1a7d1d5464a5 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js @@ -17,6 +17,11 @@ class Heading3 extends Tools { }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return Commands.setBlockType(state.config.schema.nodes.heading, { diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js b/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js index 332d816d9aee15c4e1d616d2382d500875954cb1..d8957703e8782056a3ebced585220b614e534a7e 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js @@ -1,20 +1,25 @@ -import Tools from "../../lib/Tools"; -import { injectable } from "inversify"; -import { Commands } from "wax-prosemirror-utilities"; +import Tools from '../../lib/Tools'; +import { injectable } from 'inversify'; +import { Commands } from 'wax-prosemirror-utilities'; @injectable() export default class SubTitle extends Tools { - title = "Change to Subtitle"; - content = "Subtitle"; + title = 'Change to Subtitle'; + content = 'Subtitle'; get run() { return (state, dispatch) => { Commands.setBlockType(state.config.schema.nodes.subtitle, { - class: "cst" + class: 'cst', })(state, dispatch); }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return Commands.setBlockType(state.config.schema.nodes.subtitle)(state); diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js b/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js index 469096c151095cef8c20dee2ffd9ebeac9acc39c..7548b7b705127f95cbac7ecad04f9c20a15573e0 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js @@ -1,20 +1,25 @@ -import Tools from "../../lib/Tools"; -import { injectable } from "inversify"; -import { Commands } from "wax-prosemirror-utilities"; +import Tools from '../../lib/Tools'; +import { injectable } from 'inversify'; +import { Commands } from 'wax-prosemirror-utilities'; @injectable() export default class Title extends Tools { - title = "Change to Title"; - content = "Title"; + title = 'Change to Title'; + content = 'Title'; get run() { return (state, dispatch) => { Commands.setBlockType(state.config.schema.nodes.title, { - class: "title" + class: 'title', })(state, dispatch); }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return Commands.setBlockType(state.config.schema.nodes.title)(state); diff --git a/wax-prosemirror-services/src/ImageService/Image.js b/wax-prosemirror-services/src/ImageService/Image.js index 7f0e6fea2b83d42969ee7b49c866a8e7d25adc38..726284945fc44ffcc7c6fdb70f81e6c66b78e673 100644 --- a/wax-prosemirror-services/src/ImageService/Image.js +++ b/wax-prosemirror-services/src/ImageService/Image.js @@ -17,6 +17,11 @@ class Image extends Tools { return () => true; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return Commands.canInsert(state.config.schema.nodes.image)(state); @@ -31,7 +36,12 @@ class Image extends Tools { this.pmplugins.get('imagePlaceHolder'), ); return this._isDisplayed ? ( - <ImageUpload key={uuidv4()} item={this.toJSON()} fileUpload={upload} /> + <ImageUpload + key={uuidv4()} + item={this.toJSON()} + fileUpload={upload} + view={view} + /> ) : null; } } diff --git a/wax-prosemirror-services/src/ListsService/BulletListService/BulletList.js b/wax-prosemirror-services/src/ListsService/BulletListService/BulletList.js index 80ab99f14769e795af2350193d5e37a3970f5a93..eab23cb2aeed0cb9a17d45a288e2a9c0056f32c6 100644 --- a/wax-prosemirror-services/src/ListsService/BulletListService/BulletList.js +++ b/wax-prosemirror-services/src/ListsService/BulletListService/BulletList.js @@ -1,12 +1,12 @@ -import Tools from "../../lib/Tools"; -import { injectable } from "inversify"; -import { icons } from "wax-prosemirror-components"; -import { wrapInList } from "prosemirror-schema-list"; -import { Commands } from "wax-prosemirror-utilities"; +import Tools from '../../lib/Tools'; +import { injectable } from 'inversify'; +import { icons } from 'wax-prosemirror-components'; +import { wrapInList } from 'prosemirror-schema-list'; +import { Commands } from 'wax-prosemirror-utilities'; @injectable() export default class BulletList extends Tools { - title = "Wrap in bullet list"; + title = 'Wrap in bullet list'; content = icons.bullet_list; get run() { @@ -21,6 +21,11 @@ export default class BulletList extends Tools { }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get active() { return state => { return Commands.blockActive(state.config.schema.nodes.bulletlist)(state); diff --git a/wax-prosemirror-services/src/ListsService/OrderedListService/OrderedList.js b/wax-prosemirror-services/src/ListsService/OrderedListService/OrderedList.js index 9f01a6b82605b9517a4686950d2f0cd7a431d3d2..e421df0959c0bf438c0cbaa1e521ef14bee452b9 100644 --- a/wax-prosemirror-services/src/ListsService/OrderedListService/OrderedList.js +++ b/wax-prosemirror-services/src/ListsService/OrderedListService/OrderedList.js @@ -1,12 +1,12 @@ -import Tools from "../../lib/Tools"; -import { injectable } from "inversify"; -import { icons } from "wax-prosemirror-components"; -import { wrapInList } from "prosemirror-schema-list"; -import { Commands } from "wax-prosemirror-utilities"; +import Tools from '../../lib/Tools'; +import { injectable } from 'inversify'; +import { icons } from 'wax-prosemirror-components'; +import { wrapInList } from 'prosemirror-schema-list'; +import { Commands } from 'wax-prosemirror-utilities'; @injectable() export default class OrderedList extends Tools { - title = "Wrap in ordered list"; + title = 'Wrap in ordered list'; content = icons.ordered_list; get run() { @@ -21,6 +21,11 @@ export default class OrderedList extends Tools { }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get active() { return state => { return Commands.blockActive(state.config.schema.nodes.orderedlist)(state); diff --git a/wax-prosemirror-services/src/NoteService/Editor.js b/wax-prosemirror-services/src/NoteService/Editor.js index acd9b3974b2a59c649752ab8fc9e85c415ff21c2..035acd1b6fd43d212f6075d0f18b1c128db0c952 100644 --- a/wax-prosemirror-services/src/NoteService/Editor.js +++ b/wax-prosemirror-services/src/NoteService/Editor.js @@ -1,3 +1,4 @@ +/* eslint react/prop-types: 0 */ import React, { useEffect, useRef, useContext } from 'react'; import { filter } from 'lodash'; import { EditorView } from 'prosemirror-view'; @@ -10,6 +11,7 @@ import { WaxContext } from 'wax-prosemirror-core'; import { NoteEditorContainer } from 'wax-prosemirror-components'; import { DocumentHelpers } from 'wax-prosemirror-utilities'; import transformPasted from './helpers/TransformPasted'; +import trackedTransaction from '../TrackChangeService/track-changes/trackedTransaction'; export default ({ node, view }) => { const editorRef = useRef(); @@ -54,7 +56,16 @@ export default ({ node, view }) => { } }, []); - const dispatchTransaction = tr => { + const dispatchTransaction = transaction => { + const { user } = view.props; + const TrackChange = context.app.config.get( + 'config.EnableTrackChangeService', + ); + + const tr = TrackChange.enabled + ? trackedTransaction(transaction, noteView.state, user) + : transaction; + const { state, transactions } = noteView.state.applyTransaction(tr); noteView.updateState(state); @@ -74,8 +85,8 @@ export default ({ node, view }) => { }, 20); if (!tr.getMeta('fromOutside')) { - let outerTr = view.state.tr, - offsetMap = StepMap.offset(noteFound[0].pos + 1); + const outerTr = view.state.tr; + const offsetMap = StepMap.offset(noteFound[0].pos + 1); for (let i = 0; i < transactions.length; i++) { let steps = transactions[i].steps; for (let j = 0; j < steps.length; j++) diff --git a/wax-prosemirror-services/src/NoteService/Note.js b/wax-prosemirror-services/src/NoteService/Note.js index a676d1cf054f6ac66fafdccbd7791a4d14174b57..75f04f45bf6f20e74c2be08b321cac8c502ef211 100644 --- a/wax-prosemirror-services/src/NoteService/Note.js +++ b/wax-prosemirror-services/src/NoteService/Note.js @@ -1,12 +1,12 @@ -import Tools from "../lib/Tools"; -import { injectable } from "inversify"; -import { icons } from "wax-prosemirror-components"; -import { Fragment } from "prosemirror-model"; -import { v4 as uuidv4 } from "uuid"; +import Tools from '../lib/Tools'; +import { injectable } from 'inversify'; +import { icons } from 'wax-prosemirror-components'; +import { Fragment } from 'prosemirror-model'; +import { v4 as uuidv4 } from 'uuid'; @injectable() export default class Note extends Tools { - title = "Insert Note"; + title = 'Insert Note'; content = icons.footnote; get run() { @@ -16,18 +16,22 @@ export default class Note extends Tools { if (!empty && $from.sameParent($to) && $from.parent.inlineContent) content = $from.parent.content.cut( $from.parentOffset, - $to.parentOffset + $to.parentOffset, ); const footnote = state.config.schema.nodes.footnote.create( { id: uuidv4() }, - content + content, ); dispatch(state.tr.replaceSelectionWith(footnote)); }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { - // // TODO disable on notes editor return state => { return true; }; diff --git a/wax-prosemirror-services/src/TablesService/EditTableService/TableDropDownOptions.js b/wax-prosemirror-services/src/TablesService/EditTableService/TableDropDownOptions.js index c08f229bb9caad1e51d23ce04f2774f9de1ec743..d487015827e81304ab6657b82022bce028de1569 100644 --- a/wax-prosemirror-services/src/TablesService/EditTableService/TableDropDownOptions.js +++ b/wax-prosemirror-services/src/TablesService/EditTableService/TableDropDownOptions.js @@ -1,20 +1,20 @@ -import React from "react"; -import { v4 as uuidv4 } from "uuid"; -import { injectable } from "inversify"; -import { isEmpty } from "lodash"; -import { TableDropDown } from "wax-prosemirror-components"; -import { addColumnBefore } from "prosemirror-tables"; -import { Commands } from "wax-prosemirror-utilities"; -import Tools from "../../lib/Tools"; +import React from 'react'; +import { v4 as uuidv4 } from 'uuid'; +import { injectable } from 'inversify'; +import { isEmpty } from 'lodash'; +import { TableDropDown } from 'wax-prosemirror-components'; +import { addColumnBefore } from 'prosemirror-tables'; +import { Commands } from 'wax-prosemirror-utilities'; +import Tools from '../../lib/Tools'; @injectable() export default class TableDropDownOptions extends Tools { - title = "Select Options"; - content = "table"; + title = 'Select Options'; + content = 'table'; get run() { - return () => { - return true; + return (state, dispatch, tableFn) => { + tableFn(state, dispatch); }; } diff --git a/wax-prosemirror-services/src/TablesService/InsertTableService/Table.js b/wax-prosemirror-services/src/TablesService/InsertTableService/Table.js index cae1293ff31721cdfcf1022dc4bfd4c26c7faf13..5e0f685052a5810b6257f12d6277c687ce829826 100644 --- a/wax-prosemirror-services/src/TablesService/InsertTableService/Table.js +++ b/wax-prosemirror-services/src/TablesService/InsertTableService/Table.js @@ -1,11 +1,12 @@ -import Tools from "../../lib/Tools"; -import { Commands } from "wax-prosemirror-utilities"; -import { injectable } from "inversify"; -import { icons } from "wax-prosemirror-components"; +import { Commands } from 'wax-prosemirror-utilities'; +import { injectable } from 'inversify'; +import { icons } from 'wax-prosemirror-components'; +import Tools from '../../lib/Tools'; +export default @injectable() -export default class Table extends Tools { - title = "Insert table"; +class Table extends Tools { + title = 'Insert table'; content = icons.table; get run() { @@ -14,6 +15,11 @@ export default class Table extends Tools { }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return Commands.canInsert(state.config.schema.nodes.table)(state); diff --git a/wax-prosemirror-services/src/TextBlockLevel/BlockQuoteService/BlockQuote.js b/wax-prosemirror-services/src/TextBlockLevel/BlockQuoteService/BlockQuote.js index 77ac0af54e863f2ce42ec57ce4f0b1fc8944f5c0..2c2e9ceb26b7c9f3f63c167e86e6f1fc4f28f3cd 100644 --- a/wax-prosemirror-services/src/TextBlockLevel/BlockQuoteService/BlockQuote.js +++ b/wax-prosemirror-services/src/TextBlockLevel/BlockQuoteService/BlockQuote.js @@ -1,11 +1,11 @@ -import Tools from "../../lib/Tools"; -import { injectable } from "inversify"; -import { wrapIn } from "prosemirror-commands"; +import Tools from '../../lib/Tools'; +import { injectable } from 'inversify'; +import { wrapIn } from 'prosemirror-commands'; @injectable() class BlockQuote extends Tools { - title = "Change to Block Quote"; - content = "Block Quote"; + title = 'Change to Block Quote'; + content = 'Block Quote'; get run() { return (state, dispatch) => { @@ -13,6 +13,11 @@ class BlockQuote extends Tools { }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return wrapIn(state.config.schema.nodes.blockquote)(state); diff --git a/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js b/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js index d4c87d7f53c796d5f07077a0a40fd555a083e409..8ec0b529daece7882dab92478265c3188039ee21 100644 --- a/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js +++ b/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js @@ -1,24 +1,29 @@ -import Tools from "../../lib/Tools"; -import { injectable } from "inversify"; -import { Commands } from "wax-prosemirror-utilities"; +import Tools from '../../lib/Tools'; +import { injectable } from 'inversify'; +import { Commands } from 'wax-prosemirror-utilities'; @injectable() class ExtractPoetry extends Tools { - title = "Change to Extract Poetry"; - content = "Extract Poetry"; + title = 'Change to Extract Poetry'; + content = 'Extract Poetry'; get run() { return (state, dispatch) => { Commands.setBlockType(state.config.schema.nodes.extractPoetry, { - class: "extract-poetry" + class: 'extract-poetry', })(state, dispatch); }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return Commands.setBlockType(state.config.schema.nodes.extractPoetry)( - state + state, ); }; } diff --git a/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js b/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js index e887b90542a3012cbf8e269f719a1c119c0a4ed0..c3acd93e47c225ffde0d9132a92965edecd2f7fc 100644 --- a/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js +++ b/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js @@ -1,24 +1,29 @@ -import Tools from "../../lib/Tools"; -import { injectable } from "inversify"; -import { Commands } from "wax-prosemirror-utilities"; +import Tools from '../../lib/Tools'; +import { injectable } from 'inversify'; +import { Commands } from 'wax-prosemirror-utilities'; @injectable() class ExtractProse extends Tools { - title = "Change to Extract Prose"; - content = "Extract Prose"; + title = 'Change to Extract Prose'; + content = 'Extract Prose'; get run() { return (state, dispatch) => { Commands.setBlockType(state.config.schema.nodes.extractProse, { - class: "extract-prose" + class: 'extract-prose', })(state, dispatch); }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return Commands.setBlockType(state.config.schema.nodes.extractProse)( - state + state, ); }; } diff --git a/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js b/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js index 0821ef32b4390949cb99a1452a6c43b97d775f1d..c3d9b03ed90bdbb62b3c6849c326b818deacc7ba 100644 --- a/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js +++ b/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js @@ -1,24 +1,29 @@ -import Tools from "../../lib/Tools"; -import { injectable } from "inversify"; -import { Commands } from "wax-prosemirror-utilities"; +import Tools from '../../lib/Tools'; +import { injectable } from 'inversify'; +import { Commands } from 'wax-prosemirror-utilities'; @injectable() class ParagraphContinued extends Tools { - title = "Change to Paragraph Continued"; - content = "Paragraph Continued"; + title = 'Change to Paragraph Continued'; + content = 'Paragraph Continued'; get run() { return (state, dispatch) => { Commands.setBlockType(state.config.schema.nodes.paragraphCont, { - class: "paragraph-cont" + class: 'paragraph-cont', })(state, dispatch); }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return Commands.setBlockType(state.config.schema.nodes.paragraphCont)( - state + state, ); }; } diff --git a/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js b/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js index e3018a4e2bcf78c83f10d8c8480cdec20345178f..918ae7607b1538c5b28e0c0f966d523429d0a60f 100644 --- a/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js +++ b/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js @@ -1,20 +1,25 @@ -import Tools from "../../lib/Tools"; -import { injectable } from "inversify"; -import { Commands } from "wax-prosemirror-utilities"; +import Tools from '../../lib/Tools'; +import { injectable } from 'inversify'; +import { Commands } from 'wax-prosemirror-utilities'; @injectable() export default class Paragraph extends Tools { - title = "Change to Paragraph"; - content = "Paragraph"; + title = 'Change to Paragraph'; + content = 'Paragraph'; get run() { return (state, dispatch) => { Commands.setBlockType(state.config.schema.nodes.paragraph, { - class: "paragraph" + class: 'paragraph', })(state, dispatch); }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return Commands.setBlockType(state.config.schema.nodes.paragraph)(state); diff --git a/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js b/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js index 3e333e8dd142d1c4906db3e38f43db467a7bfb62..b40a17d1d27fd6fde502925b614d984fe621a4d6 100644 --- a/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js +++ b/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js @@ -1,20 +1,25 @@ -import Tools from "../../lib/Tools"; -import { injectable } from "inversify"; -import { Commands } from "wax-prosemirror-utilities"; +import Tools from '../../lib/Tools'; +import { injectable } from 'inversify'; +import { Commands } from 'wax-prosemirror-utilities'; @injectable() class SourceNote extends Tools { - title = "Change to Source Note"; - content = "Source Note"; + title = 'Change to Source Note'; + content = 'Source Note'; get run() { return (state, dispatch) => { Commands.setBlockType(state.config.schema.nodes.sourceNote, { - class: "source-note" + class: 'source-note', })(state, dispatch); }; } + select = (state, activeViewId) => { + if (activeViewId !== 'main') return false; + return true; + }; + get enable() { return state => { return Commands.setBlockType(state.config.schema.nodes.sourceNote)(state); diff --git a/wax-prosemirror-services/src/TrackChangeService/track-changes/README.md b/wax-prosemirror-services/src/TrackChangeService/track-changes/README.md new file mode 100644 index 0000000000000000000000000000000000000000..93647423f45206782dcabb533338aad3ee024912 --- /dev/null +++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/README.md @@ -0,0 +1,3 @@ +This belongs to https://github.com/fiduswriter/fiduswriter +This is a modified version of: https://github.com/fiduswriter/fiduswriter/blob/develop/fiduswriter/document/static/js/modules/editor/track/amend_transaction.js +License included. diff --git a/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/addMarkStep.js b/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/addMarkStep.js index e573ef705d9925d810650f101168b89f8e68a3c0..79fe7d527088f7f36029a4d39e2a1679c2e877d0 100644 --- a/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/addMarkStep.js +++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/helpers/addMarkStep.js @@ -15,7 +15,7 @@ const addMarkStep = (state, tr, step, newTr, map, doc, user, date, group) => { ); if ( - !['comment'].includes(step.mark.type.name) && + !['comment', 'deletion'].includes(step.mark.type.name) && !node.marks.find(mark => mark.type === step.mark.type) ) { const formatChangeMark = node.marks.find( diff --git a/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js b/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js index 0742b8a908d192fd0a541eac401f5c87e83ee31e..bd697c1396fe2a50db04bd2ba5a32b3633e0c77f 100644 --- a/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js +++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/trackedTransaction.js @@ -1,9 +1,3 @@ -/* -This belongs to https://github.com/fiduswriter/fiduswriter -check: https://github.com/fiduswriter/fiduswriter/blob/develop/fiduswriter/document/static/js/modules/editor/track/amend_transaction.js -License included in folder. -*/ - import { TextSelection } from 'prosemirror-state'; import { ReplaceStep, @@ -20,6 +14,17 @@ import addMarkStep from './helpers/addMarkStep'; import removeMarkStep from './helpers/removeMarkStep'; const trackedTransaction = (tr, state, user) => { + // Don't track table operations + if (!tr.selectionSet) { + const $pos = state.selection.$anchor; + for (let { depth } = $pos; depth > 0; depth -= 1) { + const node = $pos.node(depth); + if (node.type.spec.tableRole === 'table') { + return tr; + } + } + } + if ( !tr.steps.length || (tr.meta && @@ -62,12 +67,9 @@ const trackedTransaction = (tr, state, user) => { } }); - if (tr.getMeta('inputType')) { - newTr.setMeta(tr.getMeta('inputType')); - } - if (tr.getMeta('uiEvent')) { - newTr.setMeta(tr.getMeta('uiEvent')); - } + if (tr.getMeta('inputType')) newTr.setMeta(tr.getMeta('inputType')); + + if (tr.getMeta('uiEvent')) newTr.setMeta(tr.getMeta('uiEvent')); if (tr.selectionSet) { const deletionMarkSchema = state.schema.marks.deletion; @@ -90,27 +92,24 @@ const trackedTransaction = (tr, state, user) => { } else { newTr.setSelection(tr.selection.map(newTr.doc, map)); } - } - - if ( + } else if ( state.selection.from - tr.selection.from > 1 && tr.selection.$head.depth > 1 ) { const caretPos = map.map(tr.selection.from - 2, -1); newTr.setSelection(new TextSelection(newTr.doc.resolve(caretPos))); } else { - const caretPos = map.map(tr.selection.from, -1); - newTr.setSelection(new TextSelection(newTr.doc.resolve(caretPos))); - // const slice = map.slice(newTr.selection.from, newTr.selection.to); - // map.appendMap(slice); + if (state.selection.from === state.selection.to) { + const caretPos = map.map(tr.selection.from, -1); + newTr.setSelection(new TextSelection(newTr.doc.resolve(caretPos))); + } + const slice = map.slice(newTr.selection.from, newTr.selection.to); + map.appendMap(slice); } - if (tr.storedMarksSet) { - newTr.setStoredMarks(tr.storedMarks); - } - if (tr.scrolledIntoView) { - newTr.scrollIntoView(); - } + if (tr.storedMarksSet) newTr.setStoredMarks(tr.storedMarks); + + if (tr.scrolledIntoView) newTr.scrollIntoView(); return newTr; }; diff --git a/wax-prosemirror-themes/package.json b/wax-prosemirror-themes/package.json index cb35a2db4b95ed62d326d19ce708cca1d5025940..d63550ca5b630d9c39c928c48d7100089cc02874 100644 --- a/wax-prosemirror-themes/package.json +++ b/wax-prosemirror-themes/package.json @@ -1,6 +1,6 @@ { "name": "wax-prosemirror-themes", - "author": "Collaborative Knowledge Foundation", + "author": "Christos Kokosias", "version": "0.0.13", "description": "Wax prosemirror themes", "license": "MIT", diff --git a/wax-prosemirror-utilities/package.json b/wax-prosemirror-utilities/package.json index 5161ee3a4545b5c7d5f1c0c2214b8ba9b814497d..28ea30ba3b99c93dfd1caf72c4d82210e17808e3 100644 --- a/wax-prosemirror-utilities/package.json +++ b/wax-prosemirror-utilities/package.json @@ -1,6 +1,6 @@ { "name": "wax-prosemirror-utilities", - "author": "Collaborative Knowledge Foundation", + "author": "Christos Kokosias", "version": "0.0.13", "description": "Wax prosemirror utilities", "license": "MIT",