@@ -6,13 +6,14 @@ import type {
66 Relationship
77} from "../../types"
88import { styled } from "@material-ui/styles"
9- import stringToSequence from "../../string-to-sequence.js"
10- import Tooltip from "@material-ui/core/Tooltip"
119import RelationshipArrows from "../RelationshipArrows"
1210import colors from "../../colors"
1311import ArrowToMouse from "../ArrowToMouse"
1412import { useTimeout , useWindowSize } from "react-use"
13+ import SequenceItem from "../SequenceItem"
1514import classNames from "classnames"
15+ import stringToSequence from "../../string-to-sequence"
16+ import useEventCallback from "use-event-callback"
1617
1718const Container = styled ( "div" ) ( ( { relationshipsOn } ) => ( {
1819 lineHeight : 1.5 ,
@@ -21,50 +22,6 @@ const Container = styled("div")(({ relationshipsOn }) => ({
2122 flexWrap : "wrap"
2223} ) )
2324
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-
6825type Props = {
6926 sequence : Array < SequenceItemData > ,
7027 relationships : Array < Relationship > ,
@@ -126,6 +83,16 @@ export default function Document({
12683 highlightedItems . push ( i )
12784 }
12885
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+
12996 return (
13097 < Container
13198 relationshipsOn = { Boolean ( relationships ) }
@@ -142,89 +109,25 @@ export default function Document({
142109 >
143110 { sequence . map ( ( seq , i ) => (
144111 < 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 }
157115 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 ] }
204129 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+ />
228131 ) ) }
229132 { firstSequenceItem && ! secondSequenceItem && (
230133 < ArrowToMouse
0 commit comments