From 7ed3ecf5efdd69f8563df262a80094be49edbab2 Mon Sep 17 00:00:00 2001 From: chris <kokosias@yahoo.gr> Date: Fri, 16 Oct 2020 09:04:14 +0300 Subject: [PATCH] find and replace tool button and create component helpers --- .../findAndReplace/FindAndReplaceTool.js | 63 ++++++++++++++++++- .../src/components/tables/CreateTable.js | 24 +------ .../{ui/comments => helpers}/DateParser.js | 0 .../src/helpers/useOnClickOutside.js | 25 ++++++++ wax-prosemirror-components/src/icons/icons.js | 6 ++ .../src/ui/comments/CommentItem.js | 2 +- .../FindAndReplaceService/FindAndReplace.js | 2 +- 7 files changed, 95 insertions(+), 27 deletions(-) rename wax-prosemirror-components/src/{ui/comments => helpers}/DateParser.js (100%) create mode 100644 wax-prosemirror-components/src/helpers/useOnClickOutside.js diff --git a/wax-prosemirror-components/src/components/findAndReplace/FindAndReplaceTool.js b/wax-prosemirror-components/src/components/findAndReplace/FindAndReplaceTool.js index 8296fabc1..33790dab2 100644 --- a/wax-prosemirror-components/src/components/findAndReplace/FindAndReplaceTool.js +++ b/wax-prosemirror-components/src/components/findAndReplace/FindAndReplaceTool.js @@ -1,6 +1,63 @@ -import React from 'react'; +import React, { useEffect, useRef, useMemo, useContext, useState } from 'react'; +import { WaxContext } from 'wax-prosemirror-core'; import styled from 'styled-components'; +import { grid } from '@pubsweet/ui-toolkit'; -export default () => { - return <span>Find</span>; +import MenuButton from '../../ui/buttons/MenuButton'; + +const CreateTable = ({ view = {}, item }) => { + const { + view: { main }, + activeViewId, + } = useContext(WaxContext); + if (item.onlyOnMain) { + view = main; + } + + const Wrapper = styled.div` + font-size: 0; + position: relative; + z-index: 2; + `; + + const DropWrapper = styled.div` + margin-top: ${grid(1)}; + position: absolute; + background: white; + `; + + const { state } = view; + const { enable, icon, run, select, title } = item; + const ref = useRef(); + const [isOpen, setIsOpen] = useState(false); + + const dropComponent = <div> find and replace</div>; + + // const isDisabled = + // enable && !enable(state) && !(select && select(state, activeViewId)); + // + // useOnClickOutside(ref, () => setIsOpen(false)); + + const MemorizedDropdown = useMemo( + () => ( + <Wrapper ref={ref}> + <MenuButton + active={isOpen} + // disabled={isDisabled} + iconName={icon} + onMouseDown={() => { + setIsOpen(!isOpen); + }} + title={title} + /> + + {isOpen && <DropWrapper>{dropComponent}</DropWrapper>} + </Wrapper> + ), + [isOpen], + ); + + return MemorizedDropdown; }; + +export default CreateTable; diff --git a/wax-prosemirror-components/src/components/tables/CreateTable.js b/wax-prosemirror-components/src/components/tables/CreateTable.js index 31b2ec382..f88c45dc8 100644 --- a/wax-prosemirror-components/src/components/tables/CreateTable.js +++ b/wax-prosemirror-components/src/components/tables/CreateTable.js @@ -1,12 +1,13 @@ /* eslint react/prop-types: 0 */ -import React, { useState, useContext, useMemo, useEffect, useRef } from 'react'; +import React, { useState, useContext, useMemo, useRef } from 'react'; import { WaxContext } from 'wax-prosemirror-core'; import styled from 'styled-components'; import { grid } from '@pubsweet/ui-toolkit'; import MenuButton from '../../ui/buttons/MenuButton'; import InsertTableTool from '../../ui/tables/InsertTableTool'; +import useOnClickOutside from '../../helpers/useOnClickOutside'; const Wrapper = styled.div` font-size: 0; @@ -72,25 +73,4 @@ const CreateTable = ({ view = {}, item }) => { return MemorizedDropdown; }; -// Hook -const useOnClickOutside = (ref, handler) => { - useEffect(() => { - const listener = event => { - /* Do nothing if clicking ref's element or descendent elements */ - if (!ref.current || ref.current.contains(event.target)) { - return; - } - - handler(event); - }; - - document.addEventListener('mousedown', listener); - document.addEventListener('touchstart', listener); - - return () => { - document.removeEventListener('mousedown', listener); - document.removeEventListener('touchstart', listener); - }; - }, [ref, handler]); -}; export default CreateTable; diff --git a/wax-prosemirror-components/src/ui/comments/DateParser.js b/wax-prosemirror-components/src/helpers/DateParser.js similarity index 100% rename from wax-prosemirror-components/src/ui/comments/DateParser.js rename to wax-prosemirror-components/src/helpers/DateParser.js diff --git a/wax-prosemirror-components/src/helpers/useOnClickOutside.js b/wax-prosemirror-components/src/helpers/useOnClickOutside.js new file mode 100644 index 000000000..25dffb0b9 --- /dev/null +++ b/wax-prosemirror-components/src/helpers/useOnClickOutside.js @@ -0,0 +1,25 @@ +import { useEffect } from 'react'; + +// Hook +const useOnClickOutside = (ref, handler) => { + useEffect(() => { + const listener = event => { + /* Do nothing if clicking ref's element or descendent elements */ + if (!ref.current || ref.current.contains(event.target)) { + return; + } + + handler(event); + }; + + document.addEventListener('mousedown', listener); + document.addEventListener('touchstart', listener); + + return () => { + document.removeEventListener('mousedown', listener); + document.removeEventListener('touchstart', listener); + }; + }, [ref, handler]); +}; + +export default useOnClickOutside; diff --git a/wax-prosemirror-components/src/icons/icons.js b/wax-prosemirror-components/src/icons/icons.js index 016facfe0..061b56b58 100644 --- a/wax-prosemirror-components/src/icons/icons.js +++ b/wax-prosemirror-components/src/icons/icons.js @@ -218,4 +218,10 @@ export default { <path d="M5 4v3h5.5v12h3V7H19V4z" /> </Svg> ), + findAndReplace: ({ className }) => ( + <Svg className={className} viewBox="0 0 24 24" fill="none"> + <path d="M0 0h24v24H0z" fill="none" /> + <path d="M11 6c1.38 0 2.63.56 3.54 1.46L12 10h6V4l-2.05 2.05C14.68 4.78 12.93 4 11 4c-3.53 0-6.43 2.61-6.92 6H6.1c.46-2.28 2.48-4 4.9-4zm5.64 9.14c.66-.9 1.12-1.97 1.28-3.14H15.9c-.46 2.28-2.48 4-4.9 4-1.38 0-2.63-.56-3.54-1.46L10 12H4v6l2.05-2.05C7.32 17.22 9.07 18 11 18c1.55 0 2.98-.51 4.14-1.36L20 21.49 21.49 20l-4.85-4.86z" /> + </Svg> + ), }; diff --git a/wax-prosemirror-components/src/ui/comments/CommentItem.js b/wax-prosemirror-components/src/ui/comments/CommentItem.js index 0baeb8c2e..3afd06ba8 100644 --- a/wax-prosemirror-components/src/ui/comments/CommentItem.js +++ b/wax-prosemirror-components/src/ui/comments/CommentItem.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import styled from 'styled-components'; import { grid, th } from '@pubsweet/ui-toolkit'; -import DateParser from './DateParser'; +import DateParser from '../../helpers/DateParser'; const Wrapper = styled.div``; diff --git a/wax-prosemirror-services/src/FindAndReplaceService/FindAndReplace.js b/wax-prosemirror-services/src/FindAndReplaceService/FindAndReplace.js index 0b4c557e9..87472e990 100644 --- a/wax-prosemirror-services/src/FindAndReplaceService/FindAndReplace.js +++ b/wax-prosemirror-services/src/FindAndReplaceService/FindAndReplace.js @@ -9,7 +9,7 @@ export default @injectable() class FindAndReplace extends Tools { title = 'Find And Replace'; - icon = 'find'; + icon = 'findAndReplace'; name = 'find'; get run() { -- GitLab