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;
-}