@@ -10,7 +10,9 @@ import stringToSequence from "../../string-to-sequence.js"
10
10
import Tooltip from "@material-ui/core/Tooltip"
11
11
import RelationshipArrows from "../RelationshipArrows"
12
12
import colors from "../../colors"
13
+ import ArrowToMouse from "../ArrowToMouse"
13
14
import { useTimeout , useWindowSize } from "react-use"
15
+ import classNames from "classnames"
14
16
15
17
const Container = styled ( "div" ) ( ( { relationshipsOn } ) => ( {
16
18
lineHeight : 1.5 ,
@@ -21,6 +23,7 @@ const Container = styled("div")(({ relationshipsOn }) => ({
21
23
22
24
const SequenceItem = styled ( "span" ) ( ( { color, relationshipsOn } ) => ( {
23
25
display : "inline-flex" ,
26
+ cursor : "pointer" ,
24
27
backgroundColor : color ,
25
28
color : "#fff" ,
26
29
padding : 4 ,
@@ -30,12 +33,20 @@ const SequenceItem = styled("span")(({ color, relationshipsOn }) => ({
30
33
paddingRight : 10 ,
31
34
borderRadius : 4 ,
32
35
userSelect : "none" ,
36
+ boxSizing : "border-box" ,
33
37
"&.unlabeled" : {
34
38
color : "#333" ,
35
39
paddingTop : 4 ,
36
40
paddingBottom : 4 ,
37
41
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
+ }
39
50
}
40
51
} ) )
41
52
@@ -68,7 +79,7 @@ export default function Document({
68
79
sequence,
69
80
relationships,
70
81
onHighlightedChanged = ( ) => null ,
71
- onLastPairClickedChanged = ( ) => null ,
82
+ onCreateEmptyRelationship = ( ) => null ,
72
83
onSequenceChange = ( ) => null ,
73
84
onRelationshipsChange = ( ) => null ,
74
85
nothingHighlighted = false ,
@@ -77,7 +88,7 @@ export default function Document({
77
88
} : Props ) {
78
89
const sequenceItemPositionsRef = useRef ( { } )
79
90
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
81
92
const windowSize = useWindowSize ( )
82
93
useEffect ( ( ) => {
83
94
resetTimeout ( )
@@ -87,10 +98,18 @@ export default function Document({
87
98
changeHighlightedRangeState
88
99
] = useState ( [ null , null ] )
89
100
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
+
90
111
const changeHighlightedRange = ( [ first , last ] ) => {
91
- if ( first !== firstSelected && first !== null && firstSelected !== null ) {
92
- onLastPairClickedChanged ( [ firstSelected , first ] )
93
- }
112
+ if ( createRelationshipsMode ) return
94
113
changeHighlightedRangeState ( [ first , last ] )
95
114
const highlightedItems = [ ]
96
115
for ( let i = Math . min ( first , last ) ; i <= Math . max ( first , last ) ; i ++ )
@@ -111,7 +130,15 @@ export default function Document({
111
130
< Container
112
131
relationshipsOn = { Boolean ( relationships ) }
113
132
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
+ } }
115
142
>
116
143
{ sequence . map ( ( seq , i ) => (
117
144
< SequenceItem
@@ -128,10 +155,26 @@ export default function Document({
128
155
}
129
156
} }
130
157
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
+ } }
132
169
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
+ }
135
178
} }
136
179
onMouseMove = { ( ) => {
137
180
if ( ! mouseDown ) return
@@ -145,7 +188,10 @@ export default function Document({
145
188
}
146
189
}
147
190
} }
148
- className = { seq . label ? "label" : "unlabeled" }
191
+ className = { classNames (
192
+ seq . label ? "label" : "unlabeled" ,
193
+ seq . text . trim ( ) . length > 0 && "notSpace"
194
+ ) }
149
195
color = {
150
196
seq . label
151
197
? seq . color || colorLabelMap [ seq . label ] || "#333"
@@ -164,7 +210,7 @@ export default function Document({
164
210
) : (
165
211
< div > { seq . text } </ div >
166
212
) }
167
- { seq . label && (
213
+ { seq . label && ! createRelationshipsMode && (
168
214
< LabeledText
169
215
onClick = { e => {
170
216
e . stopPropagation ( )
@@ -180,6 +226,14 @@ export default function Document({
180
226
) }
181
227
</ SequenceItem >
182
228
) ) }
229
+ { firstSequenceItem && ! secondSequenceItem && (
230
+ < ArrowToMouse
231
+ startAt = {
232
+ ( ( sequenceItemPositionsRef . current || { } ) [ firstSequenceItem ] || { } )
233
+ . offset
234
+ }
235
+ />
236
+ ) }
183
237
{ relationships && (
184
238
< RelationshipArrows
185
239
onClickArrow = { ( { label, from, to } ) => {
0 commit comments