diff --git a/features/step_definitions/event.rb b/features/step_definitions/event.rb index d9925aae..f7589117 100644 --- a/features/step_definitions/event.rb +++ b/features/step_definitions/event.rb @@ -71,7 +71,7 @@ text = selection.toString(); ") expect(page.evaluate_script('text')).to eq(markdown) - click_button(class: 'create-fragment') + click_on_contextual_menu_item('Comment the selected text...', 'main col', 2) end Quand("j'essaie d'éditer le document") do @@ -84,8 +84,8 @@ end Quand("j'essaie d'accorder les droits d'édition à {string}") do |userName| - find(".more-btn > button").trigger("click") - find(".dropdown-item-share").click + expect(page).to have_css('.scholium') + click_on_contextual_menu_item('Invite editors...', 'scholium', 0) find(".add-user-input").fill_in with: userName find(".add-user-input-btn").click end diff --git a/features/support/env.rb b/features/support/env.rb index 3aeaf73a..5a06c5aa 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -61,3 +61,13 @@ def fill_element(selector, text) def click_on_element(class_name, text) find(class_name, text: text).click end + +def click_on_contextual_menu_item(item_locator, context_classes, context_order = 0) + page.execute_script(" + let area = document.getElementsByClassName('#{context_classes}')[#{context_order}]; + let dropdown = area.getElementsByClassName('dropdown')[0]; + dropdown.style.visibility = 'visible'; + dropdown.getElementsByClassName('toggle')[0].dispatchEvent(new Event('click', {bubbles:true})) + ") + click_on(item_locator) +end diff --git a/frontend/src/components/EditableText.jsx b/frontend/src/components/EditableText.jsx index be6e1088..5287654c 100644 --- a/frontend/src/components/EditableText.jsx +++ b/frontend/src/components/EditableText.jsx @@ -5,7 +5,7 @@ import FormattedText from './FormattedText'; import PassageMarginMenu from './PassageMarginMenu'; import {v4 as uuid} from 'uuid'; -function EditableText({id, text, rubric, isPartOf, links, fragment, setFragment, setHighlightedText, backend, setLastUpdate}) { +function EditableText({id, text, rubric, isPartOf, links, fragment, setFragment, setHighlightedText, setSelectedText, backend, setLastUpdate}) { const [beingEdited, setBeingEdited] = useState(false); const [editedDocument, setEditedDocument] = useState(); const [editedText, setEditedText] = useState(); @@ -82,13 +82,14 @@ function EditableText({id, text, rubric, isPartOf, links, fragment, setFragment, }) .then(x => setLastUpdate(x.rev)) .then(() => setBeingEdited(false)) + .then(() => setHighlightedText()) .catch(console.error); }; if (!beingEdited) return (
- + {editedText || text}
diff --git a/frontend/src/components/FormattedText.jsx b/frontend/src/components/FormattedText.jsx index a0c3be23..f52954b6 100644 --- a/frontend/src/components/FormattedText.jsx +++ b/frontend/src/components/FormattedText.jsx @@ -1,5 +1,3 @@ -import { useState } from 'react'; -import SelectPopUp from './SelectPopUp'; import ReactMarkdown from 'react-markdown'; import remarkUnwrapImages from 'remark-unwrap-images'; import { remarkDefinitionList, defListHastHandlers } from 'remark-definition-list'; @@ -7,17 +5,17 @@ import CroppedImage from './CroppedImage'; import VideoComment from './VideoComment'; import FragmentComment from './FragmentComment'; -function FormattedText({children, setHighlightedText, selectable, setFragment}) { - const [selectedText, setSelectedText] = useState(); +function FormattedText({children, setHighlightedText, selectable, setSelectedText}) { const handleMouseUp = () => { if (selectable) { - setSelectedText(window.getSelection().toString()); + let text = window.getSelection().toString(); + setSelectedText(text); + setHighlightedText(text); } }; return (<> - setShow(false); const handleShow = () => setShow(true); + const Toggle = forwardRef(({onClick}, ref) => ( + + )); + Toggle.displayName = 'Toggle'; + let addEditor = () => { if (!loading) { setLoading(true); @@ -37,9 +42,7 @@ export default function More({metadata, backend}) { return ( <> - - - + Invite editors... diff --git a/frontend/src/components/Passage.jsx b/frontend/src/components/Passage.jsx index 75d3ba18..4da6ffe0 100644 --- a/frontend/src/components/Passage.jsx +++ b/frontend/src/components/Passage.jsx @@ -7,8 +7,10 @@ import Col from 'react-bootstrap/Col'; import { Marker } from 'react-mark.js'; import FormattedText from './FormattedText'; import EditableText from '../components/EditableText'; +import PassageSourceMenu from './PassageSourceMenu'; function Passage({source, rubric, scholia, margin, sourceId, backend, setLastUpdate}) { + const [selectedText, setSelectedText] = useState(); const [highlightedText, setHighlightedText] = useState(''); const [fragment, setFragment] = useState(); @@ -26,28 +28,29 @@ function Passage({source, rubric, scholia, margin, sourceId, backend, setLastUpd - + {source} - + ); } -function PassageSource({children, highlightedText, setHighlightedText, setFragment}) { +function PassageSource({children, highlightedText, setHighlightedText, setFragment, selectedText, setSelectedText}) { return ( {children.map((chunk, index) => - + {chunk} )} + ); } @@ -58,12 +61,12 @@ function Rubric({id}) { ); } -function PassageMargin({active, scholia, setHighlightedText, fragment, setFragment, backend, setLastUpdate}) { +function PassageMargin({active, scholia, setHighlightedText, fragment, setFragment, setSelectedText, backend, setLastUpdate}) { if (!active) return; return ( {scholia.map((scholium, i) => - + )} ); diff --git a/frontend/src/components/PassageMarginMenu.jsx b/frontend/src/components/PassageMarginMenu.jsx index 3b0f2a39..a6e2221e 100644 --- a/frontend/src/components/PassageMarginMenu.jsx +++ b/frontend/src/components/PassageMarginMenu.jsx @@ -22,7 +22,7 @@ function PassageMarginMenu ({ id, backend, handleImageUrl }) { <> - + Add a picture... @@ -44,7 +44,7 @@ const BlockMenuButton = forwardRef(({ children, onClick }, ref) => ( e.preventDefault(); onClick(e); }} - ref={ref} className="editable-button"> + ref={ref} className="toggle"> {children} )); diff --git a/frontend/src/components/PassageSourceMenu.jsx b/frontend/src/components/PassageSourceMenu.jsx new file mode 100644 index 00000000..a94178f9 --- /dev/null +++ b/frontend/src/components/PassageSourceMenu.jsx @@ -0,0 +1,32 @@ +import '../styles/PassageMarginMenu.css'; + +import { forwardRef } from 'react'; +import { Dropdown } from 'react-bootstrap'; +import { ThreeDotsVertical } from 'react-bootstrap-icons'; + +function PassageSourceMenu({selectedText, setSelectedText, setFragment}) { + + const handleClick = () => { + setFragment(`[${selectedText}]\n`); + setSelectedText(); + }; + + const Toggle = forwardRef(({onClick}, ref) => ( + + )); + Toggle.displayName = 'Toggle'; + + return ( + + + + + Comment the selected text... + + + + ); +} + +export default PassageSourceMenu; + diff --git a/frontend/src/components/SelectPopUp.jsx b/frontend/src/components/SelectPopUp.jsx deleted file mode 100644 index a5cd337c..00000000 --- a/frontend/src/components/SelectPopUp.jsx +++ /dev/null @@ -1,19 +0,0 @@ -function SelectPopUp({selectedText, setSelectedText, setFragment}) { - - let handleClick = () => { - setFragment(`[${selectedText}]\n`); - setSelectedText(); - }; - - if (selectedText) return ( -
- -
- ); -} - -export default SelectPopUp; diff --git a/frontend/src/styles/Lectern.css b/frontend/src/styles/Lectern.css index ad700dd1..c0e2c188 100644 --- a/frontend/src/styles/Lectern.css +++ b/frontend/src/styles/Lectern.css @@ -19,6 +19,10 @@ background-color: ghostwhite; } +.main .col { + display: flex; +} + .lectern .runningHead div { padding-top: 17px; padding-bottom: 17px; diff --git a/frontend/src/styles/PassageMarginMenu.css b/frontend/src/styles/PassageMarginMenu.css index 86306691..e8fa1e52 100644 --- a/frontend/src/styles/PassageMarginMenu.css +++ b/frontend/src/styles/PassageMarginMenu.css @@ -1,18 +1,14 @@ -.editable-button { +.dropdown { visibility: hidden; - margin-top: 0.25rem; - color: crimson; } -.editable:hover .editable-button { +:is(.scholium, .main):hover .dropdown { visibility: visible; - cursor: pointer; } -#block-actions .dropdown-item:hover { - background-color: lightgray; +.toggle { + margin-top: 0.25rem; + color: crimson; + cursor: pointer; } -#block-actions .dropdown-item:active { - color: black; -}