@@ -10,7 +10,9 @@ import stringToSequence from "../../string-to-sequence.js"
1010import Tooltip from "@material-ui/core/Tooltip"
1111import RelationshipArrows from "../RelationshipArrows"
1212import colors from "../../colors"
13+ import ArrowToMouse from "../ArrowToMouse"
1314import { useTimeout , useWindowSize } from "react-use"
15+ import classNames from "classnames"
1416
1517const Container = styled ( "div" ) ( ( { relationshipsOn } ) => ( {
1618 lineHeight : 1.5 ,
@@ -21,6 +23,7 @@ const Container = styled("div")(({ relationshipsOn }) => ({
2123
2224const SequenceItem = styled ( "span" ) ( ( { color, relationshipsOn } ) => ( {
2325 display : "inline-flex" ,
26+ cursor : "pointer" ,
2427 backgroundColor : color ,
2528 color : "#fff" ,
2629 padding : 4 ,
@@ -30,12 +33,20 @@ const SequenceItem = styled("span")(({ color, relationshipsOn }) => ({
3033 paddingRight : 10 ,
3134 borderRadius : 4 ,
3235 userSelect : "none" ,
36+ boxSizing : "border-box" ,
3337 "&.unlabeled" : {
3438 color : "#333" ,
3539 paddingTop : 4 ,
3640 paddingBottom : 4 ,
3741 paddingLeft : 2 ,
38- paddingRight : 2
42+ paddingRight : 2 ,
43+ ".notSpace:hover" : {
44+ paddingTop : 2 ,
45+ paddingBottom : 2 ,
46+ paddingLeft : 0 ,
47+ paddingRight : 0 ,
48+ border : `2px dashed #ccc`
49+ }
3950 }
4051} ) )
4152
@@ -68,7 +79,7 @@ export default function Document({
6879 sequence,
6980 relationships,
7081 onHighlightedChanged = ( ) => null ,
71- onLastPairClickedChanged = ( ) => null ,
82+ onCreateEmptyRelationship = ( ) => null ,
7283 onSequenceChange = ( ) => null ,
7384 onRelationshipsChange = ( ) => null ,
7485 nothingHighlighted = false ,
@@ -77,7 +88,7 @@ export default function Document({
7788} : Props ) {
7889 const sequenceItemPositionsRef = useRef ( { } )
7990 const [ mouseDown , changeMouseDown ] = useState ( )
80- const [ timeoutCalled , cancelTimeout , resetTimeout ] = useTimeout ( 10 ) // Force rerender after mounting
91+ const [ timeoutCalled , cancelTimeout , resetTimeout ] = useTimeout ( 30 ) // Force rerender after mounting
8192 const windowSize = useWindowSize ( )
8293 useEffect ( ( ) => {
8394 resetTimeout ( )
@@ -87,10 +98,18 @@ export default function Document({
8798 changeHighlightedRangeState
8899 ] = useState ( [ null , null ] )
89100
101+ const [ firstSequenceItem , setFirstSequenceItem ] = useState ( null )
102+ const [ secondSequenceItem , setSecondSequenceItem ] = useState ( null )
103+
104+ useEffect ( ( ) => {
105+ setFirstSequenceItem ( null )
106+ setSecondSequenceItem ( null )
107+ changeHighlightedRangeState ( [ null , null ] )
108+ changeMouseDown ( false )
109+ } , [ createRelationshipsMode ] )
110+
90111 const changeHighlightedRange = ( [ first , last ] ) => {
91- if ( first !== firstSelected && first !== null && firstSelected !== null ) {
92- onLastPairClickedChanged ( [ firstSelected , first ] )
93- }
112+ if ( createRelationshipsMode ) return
94113 changeHighlightedRangeState ( [ first , last ] )
95114 const highlightedItems = [ ]
96115 for ( let i = Math . min ( first , last ) ; i <= Math . max ( first , last ) ; i ++ )
@@ -111,7 +130,15 @@ export default function Document({
111130 < Container
112131 relationshipsOn = { Boolean ( relationships ) }
113132 onMouseDown = { ( ) => changeMouseDown ( true ) }
114- onMouseUp = { ( ) => changeMouseDown ( false ) }
133+ onMouseUp = { ( ) => {
134+ if ( createRelationshipsMode && firstSequenceItem ) {
135+ setFirstSequenceItem ( null )
136+ if ( secondSequenceItem ) {
137+ setSecondSequenceItem ( null )
138+ }
139+ }
140+ changeMouseDown ( false )
141+ } }
115142 >
116143 { sequence . map ( ( seq , i ) => (
117144 < SequenceItem
@@ -128,10 +155,26 @@ export default function Document({
128155 }
129156 } }
130157 relationshipsOn = { Boolean ( relationships ) }
131- onClick = { e => e . stopPropagation ( ) }
158+ onMouseUp = { e => {
159+ if ( ! createRelationshipsMode ) return
160+ if ( ! secondSequenceItem ) {
161+ setFirstSequenceItem ( null )
162+ setSecondSequenceItem ( null )
163+ onCreateEmptyRelationship ( [ firstSequenceItem , seq . textId ] )
164+ } else {
165+ setFirstSequenceItem ( null )
166+ setSecondSequenceItem ( null )
167+ }
168+ } }
132169 onMouseDown = { ( ) => {
133- if ( seq . label && ! createRelationshipsMode ) return
134- changeHighlightedRange ( [ i , i ] )
170+ if ( createRelationshipsMode ) {
171+ if ( ! firstSequenceItem ) {
172+ setFirstSequenceItem ( seq . textId )
173+ }
174+ } else {
175+ if ( seq . label ) return
176+ changeHighlightedRange ( [ i , i ] )
177+ }
135178 } }
136179 onMouseMove = { ( ) => {
137180 if ( ! mouseDown ) return
@@ -145,7 +188,10 @@ export default function Document({
145188 }
146189 }
147190 } }
148- className = { seq . label ? "label" : "unlabeled" }
191+ className = { classNames (
192+ seq . label ? "label" : "unlabeled" ,
193+ seq . text . trim ( ) . length > 0 && "notSpace"
194+ ) }
149195 color = {
150196 seq . label
151197 ? seq . color || colorLabelMap [ seq . label ] || "#333"
@@ -164,7 +210,7 @@ export default function Document({
164210 ) : (
165211 < div > { seq . text } </ div >
166212 ) }
167- { seq . label && (
213+ { seq . label && ! createRelationshipsMode && (
168214 < LabeledText
169215 onClick = { e => {
170216 e . stopPropagation ( )
@@ -180,6 +226,14 @@ export default function Document({
180226 ) }
181227 </ SequenceItem >
182228 ) ) }
229+ { firstSequenceItem && ! secondSequenceItem && (
230+ < ArrowToMouse
231+ startAt = {
232+ ( ( sequenceItemPositionsRef . current || { } ) [ firstSequenceItem ] || { } )
233+ . offset
234+ }
235+ />
236+ ) }
183237 { relationships && (
184238 < RelationshipArrows
185239 onClickArrow = { ( { label, from, to } ) => {
0 commit comments