@@ -6,13 +6,14 @@ import type {
6
6
Relationship
7
7
} from "../../types"
8
8
import { styled } from "@material-ui/styles"
9
- import stringToSequence from "../../string-to-sequence.js"
10
- import Tooltip from "@material-ui/core/Tooltip"
11
9
import RelationshipArrows from "../RelationshipArrows"
12
10
import colors from "../../colors"
13
11
import ArrowToMouse from "../ArrowToMouse"
14
12
import { useTimeout , useWindowSize } from "react-use"
13
+ import SequenceItem from "../SequenceItem"
15
14
import classNames from "classnames"
15
+ import stringToSequence from "../../string-to-sequence"
16
+ import useEventCallback from "use-event-callback"
16
17
17
18
const Container = styled ( "div" ) ( ( { relationshipsOn } ) => ( {
18
19
lineHeight : 1.5 ,
@@ -21,50 +22,6 @@ const Container = styled("div")(({ relationshipsOn }) => ({
21
22
flexWrap : "wrap"
22
23
} ) )
23
24
24
- const SequenceItem = styled ( "span" ) ( ( { color, relationshipsOn } ) => ( {
25
- display : "inline-flex" ,
26
- cursor : "pointer" ,
27
- backgroundColor : color ,
28
- color : "#fff" ,
29
- padding : 4 ,
30
- margin : 4 ,
31
- marginBottom : relationshipsOn ? 64 : 4 ,
32
- paddingLeft : 10 ,
33
- paddingRight : 10 ,
34
- borderRadius : 4 ,
35
- userSelect : "none" ,
36
- boxSizing : "border-box" ,
37
- "&.unlabeled" : {
38
- color : "#333" ,
39
- paddingTop : 4 ,
40
- paddingBottom : 4 ,
41
- paddingLeft : 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
- }
50
- }
51
- } ) )
52
-
53
- const LabeledText = styled ( "div" ) ( {
54
- display : "inline-flex" ,
55
- cursor : "pointer" ,
56
- alignSelf : "center" ,
57
- fontSize : 11 ,
58
- width : 18 ,
59
- height : 18 ,
60
- alignItems : "center" ,
61
- justifyContent : "center" ,
62
- marginLeft : 4 ,
63
- borderRadius : 9 ,
64
- color : "#fff" ,
65
- backgroundColor : "rgba(0,0,0,0.2)"
66
- } )
67
-
68
25
type Props = {
69
26
sequence : Array < SequenceItemData > ,
70
27
relationships : Array < Relationship > ,
@@ -126,6 +83,16 @@ export default function Document({
126
83
highlightedItems . push ( i )
127
84
}
128
85
86
+ const onRemoveLabel = useEventCallback ( sequenceItemIndex => {
87
+ onSequenceChange (
88
+ sequence
89
+ . flatMap ( ( s , i ) =>
90
+ i !== sequenceItemIndex ? s : stringToSequence ( s . text )
91
+ )
92
+ . filter ( s => s . text . length > 0 )
93
+ )
94
+ } )
95
+
129
96
return (
130
97
< Container
131
98
relationshipsOn = { Boolean ( relationships ) }
@@ -142,89 +109,25 @@ export default function Document({
142
109
>
143
110
{ sequence . map ( ( seq , i ) => (
144
111
< SequenceItem
145
- key = { seq . textId || i }
146
- ref = { elm => {
147
- if ( ! elm ) return
148
- sequenceItemPositionsRef . current [ seq . textId ] = {
149
- offset : {
150
- left : elm . offsetLeft ,
151
- top : elm . offsetTop ,
152
- width : elm . offsetWidth ,
153
- height : elm . offsetHeight
154
- }
155
- }
156
- } }
112
+ { ...seq }
113
+ sequenceItemIndex = { i }
114
+ sequenceItemPositionsRef = { sequenceItemPositionsRef }
157
115
relationshipsOn = { Boolean ( relationships ) }
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
- } }
169
- onMouseDown = { ( ) => {
170
- if ( createRelationshipsMode ) {
171
- if ( ! firstSequenceItem ) {
172
- setFirstSequenceItem ( seq . textId )
173
- }
174
- } else {
175
- if ( seq . label ) return
176
- changeHighlightedRange ( [ i , i ] )
177
- }
178
- } }
179
- onMouseMove = { ( ) => {
180
- if ( ! mouseDown ) return
181
- if ( ! createRelationshipsMode ) {
182
- if ( seq . label ) return
183
- if ( i !== lastSelected ) {
184
- changeHighlightedRange ( [
185
- firstSelected === null ? i : firstSelected ,
186
- i
187
- ] )
188
- }
189
- }
190
- } }
191
- className = { classNames (
192
- seq . label ? "label" : "unlabeled" ,
193
- seq . text . trim ( ) . length > 0 && "notSpace"
194
- ) }
195
- color = {
196
- seq . label
197
- ? seq . color || colorLabelMap [ seq . label ] || "#333"
198
- : ! createRelationshipsMode &&
199
- seq . text !== " " &&
200
- highlightedItems . includes ( i )
201
- ? "#ccc"
202
- : "inherit"
203
- }
116
+ createRelationshipsMode = { createRelationshipsMode }
117
+ onChangeFirstSequenceItem = { setFirstSequenceItem }
118
+ onChangeSecondSequenceItem = { setSecondSequenceItem }
119
+ onCreateEmptyRelationship = { onCreateEmptyRelationship }
120
+ onChangeHighlightedRange = { changeHighlightedRange }
121
+ firstSequenceItem = { firstSequenceItem }
122
+ secondSequenceItem = { secondSequenceItem }
123
+ mouseDown = { mouseDown }
124
+ firstSelected = { firstSelected }
125
+ lastSelected = { lastSelected }
126
+ isHighlighted = { highlightedItems . includes ( i ) }
127
+ onRemoveLabel = { onRemoveLabel }
128
+ color = { seq . color || colorLabelMap [ seq . label ] }
204
129
key = { i }
205
- >
206
- { seq . label ? (
207
- < Tooltip title = { seq . label } placement = "bottom" >
208
- < div > { seq . text } </ div >
209
- </ Tooltip >
210
- ) : (
211
- < div > { seq . text } </ div >
212
- ) }
213
- { seq . label && ! createRelationshipsMode && (
214
- < LabeledText
215
- onClick = { e => {
216
- e . stopPropagation ( )
217
- onSequenceChange (
218
- sequence
219
- . flatMap ( s => ( s !== seq ? s : stringToSequence ( s . text ) ) )
220
- . filter ( s => s . text . length > 0 )
221
- )
222
- } }
223
- >
224
- < span > { "\u2716" } </ span >
225
- </ LabeledText >
226
- ) }
227
- </ SequenceItem >
130
+ />
228
131
) ) }
229
132
{ firstSequenceItem && ! secondSequenceItem && (
230
133
< ArrowToMouse
0 commit comments