@teselagen/ove 0.7.26 → 0.7.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/AASliver.js +187 -0
  2. package/AddLaddersDialog.js +82 -0
  3. package/AdditionalCutsiteInfoDialog.js +599 -0
  4. package/AlignmentView/Mismatches.d.ts +3 -3
  5. package/AlignmentVisibilityTool.js +105 -0
  6. package/AnnotationContainerHolder.js +20 -0
  7. package/AnnotationPositioner.js +27 -0
  8. package/AutoAnnotate.js +501 -0
  9. package/AutoAnnotateBpMatchingDialog.js +208 -0
  10. package/Axis.js +151 -0
  11. package/AxisNumbers.js +35 -0
  12. package/Browser.js +106 -0
  13. package/Caret.js +63 -0
  14. package/Chromatogram.js +293 -0
  15. package/CircularDnaSequence.js +73 -0
  16. package/CircularView/Labels/index.d.ts +1 -1
  17. package/CircularView/index.d.ts +0 -1
  18. package/CircularZoomMinimap.js +16 -0
  19. package/ColorPicker.js +30 -0
  20. package/CommandHotkeyHandler.js +44 -0
  21. package/CreateAnnotationsPage.d.ts +4 -4
  22. package/CreateAnnotationsPage.js +98 -0
  23. package/Cutsite.js +18 -0
  24. package/CutsiteProperties.js +176 -0
  25. package/CutsiteSelectionLayers.js +47 -0
  26. package/Cutsites.js +271 -0
  27. package/DeletionLayer.js +28 -0
  28. package/DigestTool/Ladder.d.ts +1 -1
  29. package/DropHandler.css +21 -0
  30. package/DropHandler.js +64 -0
  31. package/EditCaretPosition.js +234 -0
  32. package/EditTrackNameDialog.js +30 -0
  33. package/Feature.js +83 -0
  34. package/FeatureProperties.js +6 -0
  35. package/FillWindow.js +47 -0
  36. package/GenbankView.js +74 -0
  37. package/GeneralProperties.js +117 -0
  38. package/GenericAnnotationProperties.js +406 -0
  39. package/GlobalDialog.js +73 -0
  40. package/GlobalDialogUtils.js +110 -0
  41. package/GoToDialog.js +25 -0
  42. package/HorizontalPanelDragHandle.js +35 -0
  43. package/Keyboard.js +85 -0
  44. package/Labels.js +327 -0
  45. package/Ladder.css +20 -0
  46. package/Ladder.js +303 -0
  47. package/MeltingTemp.js +85 -0
  48. package/Menlo.ttf +0 -0
  49. package/Minimap.js +515 -0
  50. package/Mismatches.js +134 -0
  51. package/Monaco.ttf +0 -0
  52. package/MultipleSeqsDetectedOnImportDialog.js +74 -0
  53. package/Orf.js +109 -0
  54. package/OrfProperties.js +117 -0
  55. package/Orfs.js +35 -0
  56. package/PCRTool.js +179 -0
  57. package/PairwiseAlignmentView.js +68 -0
  58. package/Part.js +34 -0
  59. package/PartProperties.js +9 -0
  60. package/PassThrough.js +3 -0
  61. package/PerformantSelectionLayer.js +32 -0
  62. package/PinchHelper.js +24 -0
  63. package/PointedAnnotation.js +347 -0
  64. package/PositionAnnotationOnCircle.js +26 -0
  65. package/Primer.js +41 -0
  66. package/PrimerProperties.js +19 -0
  67. package/Reflex/index.d.ts +0 -1
  68. package/ReflexContainer.js +802 -0
  69. package/ReflexElement.js +160 -0
  70. package/ReflexEvents.js +77 -0
  71. package/ReflexSplitter.js +205 -0
  72. package/RenameSequenceDialog.js +7 -0
  73. package/RotateCircularViewSlider.js +93 -0
  74. package/RowView/index.d.ts +0 -1
  75. package/SelectDialog.js +150 -0
  76. package/SequenceName.js +15 -0
  77. package/SimpleCircularOrLinearView.js +381 -0
  78. package/SimpleOligoPreview.js +39 -0
  79. package/SingleEnzymeCutsiteInfo.js +139 -0
  80. package/ToolBar/ToolbarItem.d.ts +1 -3
  81. package/ToolbarItem.js +192 -0
  82. package/Translation.js +198 -0
  83. package/TranslationProperties.js +149 -0
  84. package/UncontrolledSliderWithPlusMinusBtns.css +5 -0
  85. package/UncontrolledSliderWithPlusMinusBtns.js +134 -0
  86. package/VeTopRightContainer.js +12 -0
  87. package/ZoomCircularViewSlider.js +62 -0
  88. package/ZoomLinearView.js +47 -0
  89. package/addAlignment.js +6 -0
  90. package/addMetaToActionCreators.js +12 -0
  91. package/addWrappedAddons.js +20 -0
  92. package/alignmentTool.js +503 -0
  93. package/alignments.js +379 -0
  94. package/annotationLabelVisibility.js +2 -0
  95. package/annotationSearchSelector.js +24 -0
  96. package/annotationTypes.js +35 -0
  97. package/annotationVisibility.js +196 -0
  98. package/annotationsToSupport.js +104 -0
  99. package/arrayToObjWithIds.js +17 -0
  100. package/arrayUtils.js +19 -0
  101. package/array_move.js +10 -0
  102. package/calculateTickMarkPositionsForGivenRange.js +47 -0
  103. package/caretPosition.js +27 -0
  104. package/cdsFeaturesSelector.js +9 -0
  105. package/charWidth.js +22 -0
  106. package/circular.js +19 -0
  107. package/circularSelector.js +4 -0
  108. package/clickAndDragUtils.js +576 -0
  109. package/coerceInitialValue.js +7 -0
  110. package/combineReducersDontIgnoreKeys.js +12 -0
  111. package/commandUtils.js +20 -0
  112. package/constants.js +2 -0
  113. package/copyOptions.js +34 -0
  114. package/createFragmentLines.js +120 -0
  115. package/createMergedDefaultStateReducer.js +30 -0
  116. package/createMetaAction.js +12 -0
  117. package/createSequenceInputPopup.js +290 -0
  118. package/createSequenceInputPopupStyle.css +87 -0
  119. package/createSimpleDialog.js +89 -0
  120. package/createYourOwnEnzyme.js +39 -0
  121. package/cutsiteLabelColorSelector.js +6 -0
  122. package/cutsiteTool.js +88 -0
  123. package/cutsitesByRangeSelector.js +5 -0
  124. package/cutsitesSelector.js +61 -0
  125. package/darkmode.css +98 -0
  126. package/defaultConfig.js +150 -0
  127. package/deletionLayers.js +36 -0
  128. package/description.js +21 -0
  129. package/digestTool.js +34 -0
  130. package/dnaToColor.js +17 -0
  131. package/downloadTool.js +39 -0
  132. package/draggableClassnames.js +5 -0
  133. package/drawAnnotations.js +440 -0
  134. package/drawDirectedPiePiece.js +142 -0
  135. package/editTool.js +49 -0
  136. package/editorSelector.js +2 -0
  137. package/editorUtils.js +205 -0
  138. package/estimateRowHeight.js +184 -0
  139. package/featureLengthsToHide.js +27 -0
  140. package/featureTool.js +34 -0
  141. package/features.js +19 -0
  142. package/featuresSelector.js +8 -0
  143. package/filteredCutsitesSelector.js +136 -0
  144. package/filteredFeaturesSelector.js +32 -0
  145. package/filteredPartsSelector.js +57 -0
  146. package/filteredPrimersSelector.js +27 -0
  147. package/filteredRestrictionEnzymesSelector.js +1 -0
  148. package/find.png +0 -0
  149. package/findTool.js +79 -0
  150. package/findToolConstants.js +1 -0
  151. package/frameTranslations.js +52 -0
  152. package/fullscreen.png +0 -0
  153. package/getAdditionalEnzymesSelector.js +46 -0
  154. package/getAngleForPositionMidpoint.js +3 -0
  155. package/getAnnotationClassnames.js +12 -0
  156. package/getAnnotationNameAndStartStopString.js +61 -0
  157. package/getBpsPerRow.js +19 -0
  158. package/getCutsiteLabelHeights.js +56 -0
  159. package/getGapMap.js +12 -0
  160. package/getGaps.js +27 -0
  161. package/getInternalLabel.js +40 -0
  162. package/getOveHotkeyDefs.js +12 -0
  163. package/getPairwiseOverviewLinearViewOptions.js +38 -0
  164. package/getRangeAnglesSpecial.js +12 -0
  165. package/getStructuredBases.js +97 -0
  166. package/getTrackFromEvent.js +25 -0
  167. package/getVisibleStartEnd.js +7 -0
  168. package/getXStartAndWidthFromNonCircularRange.js +12 -0
  169. package/getXStartAndWidthOfRangeWrtRow.js +27 -0
  170. package/getXStartAndWidthOfRowAnnotation.js +19 -0
  171. package/getYOffset.js +15 -0
  172. package/hoveredAnnotation.js +24 -0
  173. package/{html2canvas.esm--JN4fLQL.js → html2canvas.esm-DiGWN1gP.js} +187 -229
  174. package/{html2canvas.esm-B7d7VJmQ.cjs → html2canvas.esm-J1esNpMJ.cjs} +187 -229
  175. package/importTool.js +27 -0
  176. package/index.cjs.js +48165 -47142
  177. package/index.es.js +47699 -46676
  178. package/index.js +71 -0
  179. package/inlineFindTool.js +38 -0
  180. package/isElementInViewport.js +29 -0
  181. package/isEnzymeFilterAndSelector.js +1 -0
  182. package/isTargetWithinEl.js +6 -0
  183. package/labelLineIntensity.js +25 -0
  184. package/labelSize.js +23 -0
  185. package/ladderDefaults.js +25 -0
  186. package/lastSavedId.js +20 -0
  187. package/lineageLines.js +11 -0
  188. package/linear.png +0 -0
  189. package/makeStore.js +34 -0
  190. package/massageTickSpacing.js +19 -0
  191. package/materiallyAvailable.js +19 -0
  192. package/middleware.js +112 -0
  193. package/minimumOrfSize.js +24 -0
  194. package/minimumOrfSizeSelector.js +2 -0
  195. package/modalActions.js +3 -0
  196. package/moveCaret.js +58 -0
  197. package/name.js +19 -0
  198. package/normalizeAngle.js +3 -0
  199. package/normalizeAngleRange.js +9 -0
  200. package/oligoTool.js +30 -0
  201. package/onlyUpdateForKeysDeep.js +31 -0
  202. package/orfFrameToColorMap.js +10 -0
  203. package/orfTool.js +136 -0
  204. package/orfsSelector.js +15 -0
  205. package/ove.css +12107 -0
  206. package/package.json +8 -7
  207. package/panelsShown.js +294 -0
  208. package/partLengthsToHide.js +23 -0
  209. package/partOverhangs.js +6 -0
  210. package/partTagSearch.js +69 -0
  211. package/partTool.js +45 -0
  212. package/parts.js +19 -0
  213. package/partsSelector.js +8 -0
  214. package/pie.png +0 -0
  215. package/polarToSpecialCartesian.js +7 -0
  216. package/positionCutsites.js +6 -0
  217. package/prepareRowData.js +64 -0
  218. package/primerBases.js +221 -0
  219. package/primerLengthsToHide.js +27 -0
  220. package/primers.js +19 -0
  221. package/primersSelector.js +8 -0
  222. package/print.png +0 -0
  223. package/printTool.js +31 -0
  224. package/propertiesTool.js +40 -0
  225. package/proteinUtils.js +3 -0
  226. package/pureNoFunc.js +18 -0
  227. package/readOnly.js +25 -0
  228. package/redoTool.js +30 -0
  229. package/reflex-styles.css +128 -0
  230. package/reflex-styles.css.map +9 -0
  231. package/relaxLabelAngles.js +157 -0
  232. package/relaxLabels_DEPRECATED.js +105 -0
  233. package/replacementLayers.js +36 -0
  234. package/restrictionEnzymes.js +52 -0
  235. package/restrictionEnzymesSelector.js +34 -0
  236. package/rowviewContants.js +3 -0
  237. package/ruler.css +89 -0
  238. package/save.png +0 -0
  239. package/saveTool.js +44 -0
  240. package/searchLayersSelector.js +71 -0
  241. package/selectedAnnotations.js +89 -0
  242. package/selectedAnnotationsSelector.js +1 -0
  243. package/selectedCutsitesSelector.js +21 -0
  244. package/selectedPartTags.js +21 -0
  245. package/selectionLayer.js +25 -0
  246. package/selectors/annotationSearchSelector.d.ts +1 -1
  247. package/sequence.js +12 -0
  248. package/sequenceDataHistory.js +43 -0
  249. package/sequenceDataSelector.js +2 -0
  250. package/sequenceLengthSelector.js +5 -0
  251. package/sequenceSelector.js +4 -0
  252. package/sharedActionCreators.js +0 -0
  253. package/shouldFlipText.js +4 -0
  254. package/shouldRerender.js +27 -0
  255. package/showFileDialog.js +25 -0
  256. package/showGCContent.js +23 -0
  257. package/show_cut_sites.png +0 -0
  258. package/show_features.png +0 -0
  259. package/show_orfs.png +0 -0
  260. package/show_primers.png +0 -0
  261. package/simpleDialog.css +13 -0
  262. package/specialCutsiteFilterOptions.js +22 -0
  263. package/src/Editor/DropHandler.js +2 -1
  264. package/src/Editor/index.js +0 -2
  265. package/src/RowItem/StackedAnnotations/getStructuredBases.js +20 -6
  266. package/src/ToolBar/cutsiteTool.js +1 -1
  267. package/src/helperComponents/PropertiesDialog/TranslationProperties.js +2 -1
  268. package/style.css +3 -12100
  269. package/tagsToBoldSelector.js +2 -0
  270. package/toggle_views.svg +1 -0
  271. package/toolBar.js +23 -0
  272. package/translationSearchMatchesSelector.js +14 -0
  273. package/translations.js +20 -0
  274. package/translationsRawSelector.js +8 -0
  275. package/translationsSelector.js +137 -0
  276. package/typeField.js +24 -0
  277. package/undoTool.js +30 -0
  278. package/updateEditor.d.ts +1 -3
  279. package/updateEditor.js +200 -0
  280. package/updateLabelsForInViewFeatures.js +55 -0
  281. package/updateLabelsForInViewFeaturesCircView.js +41 -0
  282. package/updateTrackHelper.js +58 -0
  283. package/uppercaseSequenceMapFont.js +25 -0
  284. package/upsertDeleteActionGenerator.js +31 -0
  285. package/useAAColorType.js +8 -0
  286. package/useAdditionalOrfStartCodons.js +24 -0
  287. package/useAnnotationLimits.js +42 -0
  288. package/useChromatogramPrefs.js +31 -0
  289. package/useFormValue.js +7 -0
  290. package/useLadders.js +6 -0
  291. package/useMeltingTemp.js +7 -0
  292. package/useTmType.js +10 -0
  293. package/userDefinedHandlersAndOpts.js +61 -0
  294. package/utils/getAnnotationNameAndStartStopString.d.ts +1 -5
  295. package/utils/selectionLayer.d.ts +2 -2
  296. package/utils.js +37 -0
  297. package/versionHistory.js +26 -0
  298. package/versionHistoryTool.js +21 -0
  299. package/viewSubmenu.js +479 -0
  300. package/visibilityTool.js +39 -0
  301. package/withEditorInteractions/getBpsPerRow.d.ts +1 -3
  302. package/withHover.js +113 -0
  303. package/withRestrictionEnzymes.js +15 -0
  304. package/index.umd.js +0 -188322
package/Keyboard.js ADDED
@@ -0,0 +1,85 @@
1
+ import { noop } from "lodash-es";
2
+ import React from "react";
3
+
4
+ class Clipboard extends React.Component {
5
+ // static propTypes = {
6
+ // value: PropTypes.string.isRequired
7
+ // };
8
+
9
+ static defaultProps = {
10
+ className: "clipboard"
11
+ };
12
+
13
+ componentDidMount() {
14
+ this.node.parentNode.addEventListener("keydown", this.handleKeyDown, false);
15
+ this.node.parentNode.addEventListener("keyup", this.handleKeyUp, false);
16
+ }
17
+
18
+ componentWillUnmount() {
19
+ this.node.parentNode.removeEventListener(
20
+ "keydown",
21
+ this.handleKeyDown,
22
+ false
23
+ );
24
+ this.node.parentNode.removeEventListener("keyup", this.handleKeyUp, false);
25
+ }
26
+
27
+ handleKeyDown = e => {
28
+ if (
29
+ document.activeElement &&
30
+ ["input", "select", "textarea"].indexOf(
31
+ document.activeElement.tagName.toLowerCase()
32
+ ) !== -1
33
+ ) {
34
+ return; //stop early if we're inside an input
35
+ }
36
+ const metaKeyIsDown = e.ctrlKey || e.metaKey;
37
+ if (!metaKeyIsDown || !["x", "c", "v"].includes(e.key)) {
38
+ this.origFocusedElement = null;
39
+ return;
40
+ }
41
+ this.origFocusedElement = document.activeElement;
42
+ this.node.select();
43
+ };
44
+
45
+ handleKeyUp = () => {
46
+ if (this.origFocusedElement) {
47
+ this.origFocusedElement.focus();
48
+ }
49
+ };
50
+
51
+ render() {
52
+ const value = this.props.value;
53
+ const style = {
54
+ position: "fixed",
55
+ width: 1,
56
+ height: 1,
57
+ opacity: 0,
58
+ left: 0,
59
+ padding: 0,
60
+ top: 0,
61
+ margin: 0,
62
+ zIndex: 100
63
+ };
64
+ return (
65
+ <input
66
+ ref={c => {
67
+ if (c) {
68
+ this.node = c;
69
+ }
70
+ }}
71
+ style={style}
72
+ type="text"
73
+ value={value}
74
+ onChange={noop}
75
+ readOnly
76
+ className="clipboard"
77
+ onPaste={this.props.onPaste}
78
+ onCopy={this.props.onCopy}
79
+ onCut={this.props.onCut}
80
+ />
81
+ );
82
+ }
83
+ }
84
+
85
+ export default Clipboard;
package/Labels.js ADDED
@@ -0,0 +1,327 @@
1
+ import React from "react";
2
+ import { onlyUpdateForKeys } from "recompose";
3
+ import withHover from "../helperComponents/withHover";
4
+ import getXStartAndWidthOfRowAnnotation from "./getXStartAndWidthOfRowAnnotation";
5
+ import IntervalTree from "node-interval-tree";
6
+ import getYOffset from "../CircularView/getYOffset";
7
+ import { reduce, values, startCase, filter, clamp } from "lodash-es";
8
+ import { getRangeLength } from "@teselagen/range-utils";
9
+ import { doesLabelFitInAnnotation } from "./utils";
10
+ import getAnnotationNameAndStartStopString from "../utils/getAnnotationNameAndStartStopString";
11
+
12
+ const BUFFER_WIDTH = 6; //labels shouldn't be less than 6px from eachother on the same line
13
+
14
+ function Labels(props) {
15
+ let {
16
+ annotationRanges = {},
17
+ bpsPerRow,
18
+ charWidth,
19
+ rangeMax,
20
+ onlyShowLabelsThatDoNotFit,
21
+ annotationHeight,
22
+ textWidth = 6,
23
+ editorName,
24
+ labelLineIntensity,
25
+ isProtein,
26
+ noRedux,
27
+ readOnly,
28
+ noLabelLine
29
+ } = props;
30
+
31
+ if (annotationRanges.length === 0) {
32
+ return null;
33
+ }
34
+ const warningMessage = null;
35
+ // if (Object.keys(annotationRanges).length > 50) {
36
+ // warningMessage = (
37
+ // <span style={{ color: "red" }}>
38
+ // <br />
39
+ // Warning: Only the first 50 cutsites will be displayed. Filter the
40
+ // cutsites you wish to see using the filter tool <br />
41
+ // </span>
42
+ // );
43
+ // }
44
+
45
+ const rowLength = bpsPerRow * charWidth;
46
+ // let counter = 0;
47
+ let maxAnnotationYOffset = 0;
48
+ const annotationsSVG = [];
49
+ const rowCenter = rowLength / 2;
50
+ const iTree = new IntervalTree(rowCenter);
51
+
52
+ annotationRanges = values(
53
+ reduce(
54
+ annotationRanges,
55
+ (accum, annotationRange) => {
56
+ const identifier =
57
+ annotationRange.annotation.annotationTypePlural +
58
+ "--" +
59
+ annotationRange.id;
60
+ if (
61
+ // annotationRange.annotation.annotationTypePlural === "parts" ||
62
+ !accum[identifier] ||
63
+ getRangeLength(accum[identifier], rangeMax) <
64
+ getRangeLength(annotationRange, rangeMax)
65
+ ) {
66
+ accum[identifier] = annotationRange;
67
+ return accum;
68
+ } else {
69
+ return accum;
70
+ }
71
+ },
72
+ {}
73
+ )
74
+ );
75
+
76
+ filter(annotationRanges, r => {
77
+ if (onlyShowLabelsThatDoNotFit) {
78
+ //tnrtodo: more work needs to be done here to make this actually configurable
79
+ //check if annotation name will fit
80
+ if (
81
+ r.annotation.annotationTypePlural === "cutsites" ||
82
+ (r.annotation.annotationTypePlural === "primers" && r.annotation.bases)
83
+ ) {
84
+ //we don't want to filter out any cutsite labels
85
+ return true;
86
+ }
87
+ return !doesLabelFitInAnnotation(
88
+ r.annotation.name,
89
+ { range: r },
90
+ charWidth
91
+ );
92
+ }
93
+ return true;
94
+ }).forEach(function (annotationRange, index) {
95
+ const pluralType = annotationRange.annotation.annotationTypePlural;
96
+ let annotation = annotationRange.annotation;
97
+ if (!annotation) {
98
+ annotation = annotationRange;
99
+ }
100
+ const annotationLength =
101
+ (
102
+ annotation.name ||
103
+ (annotation.restrictionEnzyme && annotation.restrictionEnzyme.name) ||
104
+ ""
105
+ ).length * textWidth;
106
+ let { xStart, width } = getXStartAndWidthOfRowAnnotation(
107
+ annotationRange,
108
+ bpsPerRow,
109
+ charWidth
110
+ );
111
+
112
+ xStart =
113
+ annotation.annotationTypePlural === "cutsites"
114
+ ? xStart
115
+ : xStart + width / 2;
116
+
117
+ const xStartOriginal = xStart;
118
+ let xEnd = xStart + annotationLength;
119
+
120
+ if (xEnd > rowLength) {
121
+ xStart = xStart - (xEnd - rowLength);
122
+ xEnd = rowLength;
123
+ }
124
+ xEnd += BUFFER_WIDTH;
125
+ const yOffset = getYOffset(iTree, xStart, xEnd);
126
+ iTree.insert(xStart, xEnd, {
127
+ ...annotationRange,
128
+ yOffset
129
+ });
130
+
131
+ if (yOffset > maxAnnotationYOffset) {
132
+ maxAnnotationYOffset = yOffset;
133
+ }
134
+ const height = yOffset * annotationHeight;
135
+ annotationsSVG.push(
136
+ <DrawLabel
137
+ id={annotation.id}
138
+ key={"cutsiteLabel" + index}
139
+ {...{
140
+ readOnly,
141
+ editorName,
142
+ annotation,
143
+ noLabelLine,
144
+ className: `${annotationRange.annotation.labelClassName || ""} ${
145
+ labelClassNames[pluralType]
146
+ } veLabel `,
147
+ isProtein,
148
+ xStartOriginal,
149
+ onClick: annotationRange.onClick,
150
+ onDoubleClick: annotationRange.onDoubleClick,
151
+ onRightClick: annotationRange.onRightClick,
152
+ height,
153
+ xStart,
154
+ xEnd,
155
+ textWidth,
156
+ labelLineIntensity,
157
+ noRedux
158
+ }}
159
+ />
160
+ );
161
+ });
162
+ if (!annotationsSVG.length) return null;
163
+ const containerHeight = (maxAnnotationYOffset + 1) * annotationHeight;
164
+ return (
165
+ <div
166
+ width="100%"
167
+ style={{
168
+ position: "relative",
169
+ height: containerHeight,
170
+ display: "block"
171
+ }}
172
+ className="veRowViewLabelsContainer"
173
+ >
174
+ {annotationsSVG}
175
+ {warningMessage}
176
+ </div>
177
+ );
178
+ }
179
+
180
+ export default onlyUpdateForKeys([
181
+ "annotationRanges",
182
+ "bpsPerRow",
183
+ "charWidth",
184
+ "annotationHeight",
185
+ "spaceBetweenAnnotations",
186
+ "onClick",
187
+ "onRightClick",
188
+ "onDoubleClick",
189
+ "textWidth",
190
+ "editorName"
191
+ ])(Labels);
192
+
193
+ const DrawLabel = withHover(
194
+ class DrawLabelInner extends React.Component {
195
+ render() {
196
+ const {
197
+ hovered,
198
+ className,
199
+ annotation,
200
+ onClick,
201
+ noLabelLine,
202
+ onDoubleClick,
203
+ onRightClick,
204
+ height,
205
+ xStartOriginal,
206
+ xStart,
207
+ onMouseLeave,
208
+ isProtein,
209
+ onMouseOver,
210
+ editorName,
211
+ labelLineIntensity,
212
+ textWidth,
213
+ readOnly
214
+ } = this.props;
215
+ let heightToUse = height;
216
+ let bottom = 0;
217
+ if (hovered) {
218
+ try {
219
+ const line = this.n;
220
+ const isRowView = document
221
+ .querySelector(`.veEditor.${editorName} .veRowView`)
222
+ .contains(line);
223
+
224
+ const el = line
225
+ .closest(".veRowItem")
226
+
227
+ .querySelector(
228
+ annotation.annotationTypePlural === "cutsites"
229
+ ? isRowView
230
+ ? ".cutsiteLabelSelectionLayer"
231
+ : ".veRowViewAxis"
232
+ : `[data-id="${annotation.id}"].veRowView${startCase(
233
+ annotation.annotationTypePlural.slice(0, -1)
234
+ )}`
235
+ );
236
+ const annDims = el.getBoundingClientRect();
237
+ const lineDims = line.getBoundingClientRect();
238
+ const heightDiff =
239
+ annDims.bottom - lineDims.bottom - annDims.height / 2;
240
+ heightToUse = height + heightDiff;
241
+ bottom = -heightDiff;
242
+ } catch (e) {
243
+ window.veDebugLabels && console.error(`err computing label line:`, e);
244
+ }
245
+ }
246
+
247
+ const truncateLabelIfNeeded = (annotationText, xLeftCoord) => {
248
+ const numberOfCharsToChop =
249
+ xLeftCoord < 0 ? Math.ceil(Math.abs(xLeftCoord) / textWidth) + 2 : 0;
250
+ return numberOfCharsToChop > 0
251
+ ? annotationText.slice(0, -numberOfCharsToChop) + ".."
252
+ : annotationText;
253
+ };
254
+ const titleText = getAnnotationNameAndStartStopString(annotation, {
255
+ isProtein,
256
+ readOnly
257
+ });
258
+ const labelText = annotation.name || annotation.restrictionEnzyme.name;
259
+ return (
260
+ <div>
261
+ <div
262
+ {...{ onMouseLeave, onMouseOver }}
263
+ className={className + " veLabelText ve-monospace-font"}
264
+ onClick={function (event) {
265
+ onClick && onClick({ event, annotation });
266
+ event.stopPropagation();
267
+ }}
268
+ onDoubleClick={function (event) {
269
+ if (onDoubleClick) {
270
+ onDoubleClick({ event, annotation });
271
+ event.stopPropagation();
272
+ }
273
+ }}
274
+ onContextMenu={function (event) {
275
+ onRightClick({ event, annotation });
276
+ event.stopPropagation();
277
+ }}
278
+ title={titleText}
279
+ style={{
280
+ cursor: "pointer",
281
+ position: "absolute",
282
+ bottom: height,
283
+ ...(hovered && { textDecoration: "underline" }),
284
+ ...(annotation.annotationTypePlural !== "cutsites" && {
285
+ fontStyle: "normal"
286
+ }),
287
+ left: clamp(xStart, 0, Number.MAX_VALUE),
288
+ whiteSpace: "nowrap",
289
+ color:
290
+ annotation.annotationTypePlural === "parts"
291
+ ? "#ac68cc"
292
+ : annotation.labelColor,
293
+ zIndex: 10
294
+ }}
295
+ >
296
+ {truncateLabelIfNeeded(labelText, xStart)}
297
+ </div>
298
+
299
+ {!noLabelLine && (
300
+ <div
301
+ ref={n => {
302
+ if (n) this.n = n;
303
+ }}
304
+ className="veLabelLine"
305
+ style={{
306
+ zIndex: 50,
307
+ position: "absolute",
308
+ left: xStartOriginal,
309
+ bottom,
310
+ height: Math.max(heightToUse, 3),
311
+ width: hovered ? 2 : 1,
312
+ opacity: hovered ? 1 : labelLineIntensity
313
+ // background: "black"
314
+ }}
315
+ />
316
+ )}
317
+ </div>
318
+ );
319
+ }
320
+ }
321
+ );
322
+
323
+ const labelClassNames = {
324
+ cutsites: "veCutsiteLabel",
325
+ parts: "vePartLabel",
326
+ features: "veFeatureLabel"
327
+ };
package/Ladder.css ADDED
@@ -0,0 +1,20 @@
1
+ .ve-digest-column {
2
+ position: relative;
3
+ width: 90px;
4
+ }
5
+ .ve-digest-header {
6
+ height: 40px;
7
+ padding-left: 10px;
8
+ padding-top: 10px;
9
+ }
10
+ .ve-digest-container {
11
+ display: flex;
12
+ width: fit-content;
13
+ }
14
+ .ve-digest-fragment-tooltip {
15
+ height: 100%;
16
+ width: 100%;
17
+ }
18
+ .tg-ladder-selector .tg-select-value .bp3-button {
19
+ display: none;
20
+ }