From 99262fc669dcf7d8e9654344e76f87dbd2f13590 Mon Sep 17 00:00:00 2001 From: chris <kokosias@yahoo.gr> Date: Mon, 18 Jan 2021 16:37:42 +0200 Subject: [PATCH] disable tools in readonly --- .../src/components/Button.js | 7 +++++- .../src/components/ImageUpload.js | 12 ++++++++-- .../src/components/TitleButton.js | 7 +++++- .../findAndReplace/FindAndReplaceTool.js | 23 ++++++++++++++++--- .../SpecialCharactersTool.js | 17 +++++++++++--- .../src/components/tables/CreateTable.js | 9 ++++++-- .../src/NoteService/Editor.js | 7 +++++- 7 files changed, 69 insertions(+), 13 deletions(-) diff --git a/wax-prosemirror-components/src/components/Button.js b/wax-prosemirror-components/src/components/Button.js index 7694bfb36..d45d543c5 100644 --- a/wax-prosemirror-components/src/components/Button.js +++ b/wax-prosemirror-components/src/components/Button.js @@ -14,6 +14,10 @@ const Button = ({ view = {}, item }) => { if (onlyOnMain) view = main; + const isEditable = main.props.editable(editable => { + return editable; + }); + const { dispatch, state } = view; const handleMouseDown = (e, editorState, editorDispatch) => { @@ -25,7 +29,8 @@ const Button = ({ view = {}, item }) => { active(state, activeViewId) && select(state, activeViewId) ); - const isDisabled = !select(state, activeViewId, activeView); + let isDisabled = !select(state, activeViewId, activeView); + if (!isEditable) isDisabled = true; const MenuButtonComponent = useMemo( () => ( diff --git a/wax-prosemirror-components/src/components/ImageUpload.js b/wax-prosemirror-components/src/components/ImageUpload.js index 8a0be5040..0ac2a7198 100644 --- a/wax-prosemirror-components/src/components/ImageUpload.js +++ b/wax-prosemirror-components/src/components/ImageUpload.js @@ -12,12 +12,20 @@ const Wrapper = styled.div` `; const ImageUpload = ({ item, fileUpload, view }) => { - const { activeViewId } = useContext(WaxContext); + const { + activeViewId, + view: { main }, + } = useContext(WaxContext); const inputRef = useRef(null); const handleMouseDown = () => inputRef.current.click(); - const isDisabled = !item.select(view.state, activeViewId); + let isDisabled = !item.select(view.state, activeViewId); + + const isEditable = main.props.editable(editable => { + return editable; + }); + if (!isEditable) isDisabled = true; const ImageUploadComponent = useMemo( () => ( diff --git a/wax-prosemirror-components/src/components/TitleButton.js b/wax-prosemirror-components/src/components/TitleButton.js index 2fc82591b..3eb7c9f26 100644 --- a/wax-prosemirror-components/src/components/TitleButton.js +++ b/wax-prosemirror-components/src/components/TitleButton.js @@ -40,7 +40,12 @@ const TitleButton = ({ view = {}, item }) => { }, [JSON.stringify(titleNode[0])]); const isActive = !!active(state, activeViewId); - const isDisabled = !select(state, activeViewId, activeView); + let isDisabled = !select(state, activeViewId, activeView); + + const isEditable = main.props.editable(editable => { + return editable; + }); + if (!isEditable) isDisabled = true; const TitleButtonComponent = useMemo( () => ( diff --git a/wax-prosemirror-components/src/components/findAndReplace/FindAndReplaceTool.js b/wax-prosemirror-components/src/components/findAndReplace/FindAndReplaceTool.js index 4936b7cb5..0d843993a 100644 --- a/wax-prosemirror-components/src/components/findAndReplace/FindAndReplaceTool.js +++ b/wax-prosemirror-components/src/components/findAndReplace/FindAndReplaceTool.js @@ -1,7 +1,14 @@ -import React, { useRef, useMemo, useState, useLayoutEffect } from 'react'; +import React, { + useContext, + useRef, + useMemo, + useState, + useLayoutEffect, +} from 'react'; import styled from 'styled-components'; import { grid } from '@pubsweet/ui-toolkit'; +import { WaxContext } from 'wax-prosemirror-core'; import MenuButton from '../../ui/buttons/MenuButton'; import FindAndReplaceComponent from './FindAndReplaceComponent'; @@ -13,13 +20,17 @@ const Wrapper = styled.div` `; const DropWrapper = styled.div` + background: white; margin-top: ${grid(1)}; position: absolute; - background: white; top: 32px; `; const FindAndReplaceTool = ({ view = {}, item }) => { + const { + view: { main }, + } = useContext(WaxContext); + const { icon, title } = item; const dropElement = useRef(); const [isOpen, setIsOpen] = useState(false); @@ -27,6 +38,12 @@ const FindAndReplaceTool = ({ view = {}, item }) => { let styles = { right: '-205px' }; const [style, setStyle] = useState(styles); + let isDisabled = false; + const isEditable = main.props.editable(editable => { + return editable; + }); + if (!isEditable) isDisabled = true; + useLayoutEffect(() => { setStyle(styles); if (!dropElement.current) return; @@ -43,7 +60,7 @@ const FindAndReplaceTool = ({ view = {}, item }) => { <Wrapper> <MenuButton active={isOpen} - disabled={false} + disabled={isDisabled} iconName={icon} onMouseDown={() => { setIsOpen(!isOpen); diff --git a/wax-prosemirror-components/src/components/specialCharacters/SpecialCharactersTool.js b/wax-prosemirror-components/src/components/specialCharacters/SpecialCharactersTool.js index ff6bbc9d4..4576c9533 100644 --- a/wax-prosemirror-components/src/components/specialCharacters/SpecialCharactersTool.js +++ b/wax-prosemirror-components/src/components/specialCharacters/SpecialCharactersTool.js @@ -1,7 +1,8 @@ -import React, { useMemo, useState, useRef } from 'react'; +import React, { useContext, useMemo, useState, useRef } from 'react'; import styled from 'styled-components'; import { grid } from '@pubsweet/ui-toolkit'; +import { WaxContext } from 'wax-prosemirror-core'; import MenuButton from '../../ui/buttons/MenuButton'; import SpecialCharactersComponent from './SpecialCharactersComponent'; @@ -14,25 +15,35 @@ const Wrapper = styled.div` `; const DropWrapper = styled.div` + background: white; margin-top: ${grid(1)}; position: absolute; - background: white; top: 32px; `; const SpecialCharactersTool = ({ view = {}, item }) => { + const { + view: { main }, + } = useContext(WaxContext); + const { icon, title } = item; const [isOpen, setIsOpen] = useState(false); const ref = useRef(); useOnClickOutside(ref, () => setIsOpen(false)); + let isDisabled = false; + const isEditable = main.props.editable(editable => { + return editable; + }); + if (!isEditable) isDisabled = true; + const MemorizedDropdown = useMemo( () => ( <Wrapper ref={ref}> <MenuButton active={isOpen} - disabled={false} + disabled={isDisabled} iconName={icon} onMouseDown={() => { setIsOpen(!isOpen); diff --git a/wax-prosemirror-components/src/components/tables/CreateTable.js b/wax-prosemirror-components/src/components/tables/CreateTable.js index 032de1c8b..6dcac6066 100644 --- a/wax-prosemirror-components/src/components/tables/CreateTable.js +++ b/wax-prosemirror-components/src/components/tables/CreateTable.js @@ -16,9 +16,9 @@ const Wrapper = styled.div` `; const DropWrapper = styled.div` + background: white; margin-top: ${grid(1)}; position: absolute; - background: white; `; const CreateTable = ({ view = {}, item }) => { @@ -46,7 +46,12 @@ const CreateTable = ({ view = {}, item }) => { setIsOpen(!isOpen); }; - const isDisabled = !select(state, activeViewId); + let isDisabled = !select(state, activeViewId); + + const isEditable = main.props.editable(editable => { + return editable; + }); + if (!isEditable) isDisabled = true; useOnClickOutside(ref, () => setIsOpen(false)); diff --git a/wax-prosemirror-services/src/NoteService/Editor.js b/wax-prosemirror-services/src/NoteService/Editor.js index 8051a106f..482346d38 100644 --- a/wax-prosemirror-services/src/NoteService/Editor.js +++ b/wax-prosemirror-services/src/NoteService/Editor.js @@ -18,12 +18,17 @@ export default ({ node, view }) => { const context = useContext(WaxContext); const noteId = node.attrs.id; let noteView; - let updateMainView = true; + + // eslint-disable-next-line react/destructuring-assignment + const isEditable = context.view.main.props.editable(editable => { + return editable; + }); useEffect(() => { noteView = new EditorView( { mount: editorRef.current }, { + editable: () => isEditable, state: EditorState.create({ doc: node, plugins: [keymap(createKeyBindings()), ...context.app.getPlugins()], -- GitLab