@teselagen/ove 0.0.13 → 0.0.15

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 (362) hide show
  1. package/index.umd.js +164751 -135808
  2. package/package.json +78 -2
  3. package/src/AlignmentTool/index.js +16 -0
  4. package/src/AlignmentView/AlignmentVisibilityTool.js +105 -0
  5. package/src/AlignmentView/EditTrackNameDialog.js +34 -0
  6. package/src/AlignmentView/HorizontalPanelDragHandle.js +35 -0
  7. package/src/AlignmentView/Minimap.js +520 -0
  8. package/src/AlignmentView/Mismatches.js +134 -0
  9. package/src/AlignmentView/PairwiseAlignmentView.js +68 -0
  10. package/src/AlignmentView/PerformantSelectionLayer.js +32 -0
  11. package/src/AlignmentView/coerceInitialValue.js +7 -0
  12. package/src/AlignmentView/getGapMap.js +12 -0
  13. package/src/AlignmentView/getGaps.js +27 -0
  14. package/src/AlignmentView/getPairwiseOverviewLinearViewOptions.js +38 -0
  15. package/src/AlignmentView/getTrackFromEvent.js +25 -0
  16. package/src/AlignmentView/index.js +2058 -0
  17. package/src/AlignmentView/isTargetWithinEl.js +6 -0
  18. package/src/AlignmentView/style.css +100 -0
  19. package/src/AlignmentView/updateTrackHelper.js +58 -0
  20. package/src/AutoAnnotate.js +500 -0
  21. package/src/AutoAnnotateBpMatchingDialog.js +208 -0
  22. package/src/CircularView/Axis.js +40 -0
  23. package/src/CircularView/AxisNumbers.js +35 -0
  24. package/src/CircularView/Caret.js +63 -0
  25. package/src/CircularView/CircularDnaSequence.js +73 -0
  26. package/src/CircularView/CircularZoomMinimap.js +16 -0
  27. package/src/CircularView/Cutsite.js +18 -0
  28. package/src/CircularView/Cutsites.js +113 -0
  29. package/src/CircularView/DeletionLayer.js +28 -0
  30. package/src/CircularView/Feature.js +83 -0
  31. package/src/CircularView/Labels/index.js +536 -0
  32. package/src/CircularView/Labels/relaxLabelAngles.js +157 -0
  33. package/src/CircularView/Labels/relaxLabels_DEPRECATED.js +105 -0
  34. package/src/CircularView/Labels/style.css +55 -0
  35. package/src/CircularView/Orf.js +25 -0
  36. package/src/CircularView/Part.js +34 -0
  37. package/src/CircularView/PositionAnnotationOnCircle.js +26 -0
  38. package/src/CircularView/Primer.js +41 -0
  39. package/src/CircularView/RotateCircularViewSlider.js +82 -0
  40. package/src/CircularView/SelectionLayer.js +132 -0
  41. package/src/CircularView/VeTopRightContainer.js +12 -0
  42. package/src/CircularView/ZoomCircularViewSlider.js +62 -0
  43. package/src/CircularView/drawAnnotations.js +433 -0
  44. package/src/CircularView/drawDirectedPiePiece.js +142 -0
  45. package/src/CircularView/getAngleForPositionMidpoint.js +3 -0
  46. package/src/CircularView/getInternalLabel.js +40 -0
  47. package/src/CircularView/getRangeAnglesSpecial.js +12 -0
  48. package/src/CircularView/getYOffset.js +15 -0
  49. package/src/CircularView/index.d.ts +20 -0
  50. package/src/CircularView/index.js +930 -0
  51. package/src/CircularView/normalizeAngle.js +3 -0
  52. package/src/CircularView/normalizeAngleRange.js +9 -0
  53. package/src/CircularView/positionCutsites.js +6 -0
  54. package/src/CircularView/shouldFlipText.js +4 -0
  55. package/src/CircularView/style.css +47 -0
  56. package/src/CircularView/utils/polarToSpecialCartesian.js +7 -0
  57. package/src/CreateAnnotationsPage.js +96 -0
  58. package/src/CreateCustomEnzyme/index.js +337 -0
  59. package/src/CreateCustomEnzyme/style.css +100 -0
  60. package/src/CutsiteFilter/AdditionalCutsiteInfoDialog.js +599 -0
  61. package/src/CutsiteFilter/index.js +408 -0
  62. package/src/CutsiteFilter/style.css +23 -0
  63. package/src/CutsiteFilter/withRestrictionEnzymes.js +15 -0
  64. package/src/DigestTool/AddLaddersDialog.js +82 -0
  65. package/src/DigestTool/DigestTool.js +223 -0
  66. package/src/DigestTool/Ladder.css +20 -0
  67. package/src/DigestTool/Ladder.js +303 -0
  68. package/src/DigestTool/createFragmentLines.js +120 -0
  69. package/src/DigestTool/ladderDefaults.js +26 -0
  70. package/src/DigestTool/ruler.css +89 -0
  71. package/src/Editor/CommandHotkeyHandler.js +44 -0
  72. package/src/Editor/DropHandler.css +21 -0
  73. package/src/Editor/DropHandler.js +64 -0
  74. package/src/Editor/FillWindow.js +46 -0
  75. package/src/Editor/darkmode.css +98 -0
  76. package/src/Editor/index.js +1005 -0
  77. package/src/Editor/style.css +235 -0
  78. package/src/Editor/userDefinedHandlersAndOpts.js +56 -0
  79. package/src/EnzymeViewer/index.js +81 -0
  80. package/src/EnzymeViewer/style.css +6 -0
  81. package/src/FindBar/index.js +411 -0
  82. package/src/FindBar/style.css +46 -0
  83. package/src/GlobalDialog.js +66 -0
  84. package/src/GlobalDialogUtils.js +85 -0
  85. package/src/LinearView/SequenceName.js +15 -0
  86. package/src/LinearView/ZoomLinearView.js +47 -0
  87. package/src/LinearView/index.js +374 -0
  88. package/src/LinearView/style.css +12 -0
  89. package/src/ManageEnzymes/index.js +326 -0
  90. package/src/ManageEnzymes/style.css +100 -0
  91. package/src/MenuBar/defaultConfig.js +149 -0
  92. package/src/MenuBar/index.js +98 -0
  93. package/src/MenuBar/viewSubmenu.js +479 -0
  94. package/src/PCRTool/PCRTool.js +173 -0
  95. package/src/Reflex/Browser.js +107 -0
  96. package/src/Reflex/ReflexContainer.js +802 -0
  97. package/src/Reflex/ReflexElement.js +160 -0
  98. package/src/Reflex/ReflexEvents.js +77 -0
  99. package/src/Reflex/ReflexSplitter.js +205 -0
  100. package/src/Reflex/index.js +5 -0
  101. package/src/Reflex/reflex-styles.css +128 -0
  102. package/src/Reflex/reflex-styles.css.map +9 -0
  103. package/src/RowItem/AnnotationContainerHolder.js +20 -0
  104. package/src/RowItem/AnnotationPositioner.js +27 -0
  105. package/src/RowItem/Axis.js +149 -0
  106. package/src/RowItem/Caret/index.js +64 -0
  107. package/src/RowItem/Caret/style.css +8 -0
  108. package/src/RowItem/Chromatograms/Chromatogram.js +289 -0
  109. package/src/RowItem/CutsiteSelectionLayers.js +47 -0
  110. package/src/RowItem/Cutsites.js +271 -0
  111. package/src/RowItem/DeletionLayers/index.js +113 -0
  112. package/src/RowItem/DeletionLayers/style.css +5 -0
  113. package/src/RowItem/Labels.js +327 -0
  114. package/src/RowItem/Orf.js +109 -0
  115. package/src/RowItem/Orfs.js +35 -0
  116. package/src/RowItem/ReplacementLayers/style.css +5 -0
  117. package/src/RowItem/SelectionLayer/index.js +184 -0
  118. package/src/RowItem/SelectionLayer/style.css +21 -0
  119. package/src/RowItem/Sequence.js +269 -0
  120. package/src/RowItem/StackedAnnotations/PointedAnnotation.js +347 -0
  121. package/src/RowItem/StackedAnnotations/getStructuredBases.js +97 -0
  122. package/src/RowItem/StackedAnnotations/index.js +182 -0
  123. package/src/RowItem/StackedAnnotations/primerBases.js +218 -0
  124. package/src/RowItem/StackedAnnotations/style.css +14 -0
  125. package/src/RowItem/Translations/AASliver.js +190 -0
  126. package/src/RowItem/Translations/Translation.js +162 -0
  127. package/src/RowItem/Translations/index.js +54 -0
  128. package/src/RowItem/Translations/style.css +3 -0
  129. package/src/RowItem/constants.js +3 -0
  130. package/src/RowItem/getCutsiteLabelHeights.js +56 -0
  131. package/src/RowItem/getXStartAndWidthFromNonCircularRange.js +12 -0
  132. package/src/RowItem/getXStartAndWidthOfRangeWrtRow.js +27 -0
  133. package/src/RowItem/getXStartAndWidthOfRowAnnotation.js +19 -0
  134. package/src/RowItem/index.js +647 -0
  135. package/src/RowItem/partOverhangs.js +6 -0
  136. package/src/RowItem/style.css +103 -0
  137. package/src/RowItem/utils.js +32 -0
  138. package/src/RowView/estimateRowHeight.js +184 -0
  139. package/src/RowView/index.d.ts +10 -0
  140. package/src/RowView/index.js +554 -0
  141. package/src/RowView/style.css +12 -0
  142. package/src/SimpleCircularOrLinearView.js +379 -0
  143. package/src/SimpleOligoPreview.js +39 -0
  144. package/src/StatusBar/MeltingTemp.js +81 -0
  145. package/src/StatusBar/index.js +275 -0
  146. package/src/StatusBar/style.css +38 -0
  147. package/src/ToolBar/ToolbarItem.js +194 -0
  148. package/src/ToolBar/alignmentTool.js +503 -0
  149. package/src/ToolBar/array_move.js +10 -0
  150. package/src/ToolBar/cutsiteTool.js +88 -0
  151. package/src/ToolBar/downloadTool.js +38 -0
  152. package/src/ToolBar/editTool.js +26 -0
  153. package/src/ToolBar/featureTool.js +34 -0
  154. package/src/ToolBar/findTool.js +2 -0
  155. package/src/ToolBar/importTool.js +27 -0
  156. package/src/ToolBar/index.js +231 -0
  157. package/src/ToolBar/inlineFindTool.js +38 -0
  158. package/src/ToolBar/oligoTool.js +30 -0
  159. package/src/ToolBar/orfTool.js +141 -0
  160. package/src/ToolBar/partTool.js +47 -0
  161. package/src/ToolBar/printTool.js +31 -0
  162. package/src/ToolBar/redoTool.js +30 -0
  163. package/src/ToolBar/saveTool.js +48 -0
  164. package/src/ToolBar/style.css +138 -0
  165. package/src/ToolBar/undoTool.js +30 -0
  166. package/src/ToolBar/veToolbarIcons/find.png +0 -0
  167. package/src/ToolBar/veToolbarIcons/fullscreen.png +0 -0
  168. package/src/ToolBar/veToolbarIcons/linear.png +0 -0
  169. package/src/ToolBar/veToolbarIcons/pie.png +0 -0
  170. package/src/ToolBar/veToolbarIcons/print.png +0 -0
  171. package/src/ToolBar/veToolbarIcons/save.png +0 -0
  172. package/src/ToolBar/veToolbarIcons/show_cut_sites.png +0 -0
  173. package/src/ToolBar/veToolbarIcons/show_features.png +0 -0
  174. package/src/ToolBar/veToolbarIcons/show_orfs.png +0 -0
  175. package/src/ToolBar/veToolbarIcons/show_primers.png +0 -0
  176. package/src/ToolBar/veToolbarIcons/toggle_views.svg +1 -0
  177. package/src/ToolBar/versionHistoryTool.js +20 -0
  178. package/src/ToolBar/visibilityTool.js +39 -0
  179. package/src/VersionHistoryView/index.js +215 -0
  180. package/src/addAlignment.js +6 -0
  181. package/src/commands/getOveHotkeyDefs.js +12 -0
  182. package/src/commands/index.js +1585 -0
  183. package/src/constants/constants.js +2 -0
  184. package/src/constants/dnaToColor.js +17 -0
  185. package/src/constants/draggableClassnames.js +5 -0
  186. package/src/constants/findToolConstants.js +1 -0
  187. package/src/constants/orfFrameToColorMap.js +10 -0
  188. package/src/constants/rowviewContants.js +3 -0
  189. package/src/constants/specialCutsiteFilterOptions.js +22 -0
  190. package/src/constants.js +1 -0
  191. package/src/createVectorEditor/index.js +138 -0
  192. package/src/createVectorEditor/makeStore.js +34 -0
  193. package/src/fileUtils.js +103 -0
  194. package/src/helperComponents/AddOrEditAnnotationDialog/index.js +711 -0
  195. package/src/helperComponents/AddOrEditAnnotationDialog/style.css +11 -0
  196. package/src/helperComponents/AddOrEditFeatureDialog/index.js +58 -0
  197. package/src/helperComponents/AddOrEditPartDialog/index.js +101 -0
  198. package/src/helperComponents/AddOrEditPrimerDialog/EditCaretPosition.js +234 -0
  199. package/src/helperComponents/AddOrEditPrimerDialog/index.js +329 -0
  200. package/src/helperComponents/AddOrEditPrimerDialog/style.css +41 -0
  201. package/src/helperComponents/EnzymesDialog/index.js +904 -0
  202. package/src/helperComponents/EnzymesDialog/style.css +21 -0
  203. package/src/helperComponents/GoToDialog.js +21 -0
  204. package/src/helperComponents/MergeFeaturesDialog/index.js +253 -0
  205. package/src/helperComponents/MergeFeaturesDialog/style.css +3 -0
  206. package/src/helperComponents/MultipleSeqsDetectedOnImportDialog.js +74 -0
  207. package/src/helperComponents/PinchHelper/PinchHelper.js +24 -0
  208. package/src/helperComponents/PrintDialog/index.js +396 -0
  209. package/src/helperComponents/PrintDialog/style.css +4 -0
  210. package/src/helperComponents/PropertiesDialog/ColorPicker.js +30 -0
  211. package/src/helperComponents/PropertiesDialog/CutsiteProperties.js +185 -0
  212. package/src/helperComponents/PropertiesDialog/FeatureProperties.js +6 -0
  213. package/src/helperComponents/PropertiesDialog/GenbankView.js +74 -0
  214. package/src/helperComponents/PropertiesDialog/GeneralProperties.js +140 -0
  215. package/src/helperComponents/PropertiesDialog/GenericAnnotationProperties.js +406 -0
  216. package/src/helperComponents/PropertiesDialog/OrfProperties.js +117 -0
  217. package/src/helperComponents/PropertiesDialog/PartProperties.js +9 -0
  218. package/src/helperComponents/PropertiesDialog/PrimerProperties.js +19 -0
  219. package/src/helperComponents/PropertiesDialog/SingleEnzymeCutsiteInfo.js +131 -0
  220. package/src/helperComponents/PropertiesDialog/TranslationProperties.js +149 -0
  221. package/src/helperComponents/PropertiesDialog/index.js +166 -0
  222. package/src/helperComponents/PropertiesDialog/style.css +68 -0
  223. package/src/helperComponents/PropertiesDialog/typeField.js +24 -0
  224. package/src/helperComponents/PropertiesDialog/utils.js +37 -0
  225. package/src/helperComponents/RemoveDuplicates/index.js +194 -0
  226. package/src/helperComponents/RenameSequenceDialog.js +7 -0
  227. package/src/helperComponents/SelectDialog.js +150 -0
  228. package/src/helperComponents/UncontrolledSliderWithPlusMinusBtns.css +5 -0
  229. package/src/helperComponents/UncontrolledSliderWithPlusMinusBtns.js +134 -0
  230. package/src/helperComponents/VeWarning/index.js +22 -0
  231. package/src/helperComponents/VeWarning/style.css +10 -0
  232. package/src/helperComponents/createSimpleDialog.js +89 -0
  233. package/src/helperComponents/partTagSearch.js +72 -0
  234. package/src/helperComponents/simpleDialog.css +13 -0
  235. package/src/helperComponents/withHover.js +90 -0
  236. package/src/index.js +60 -0
  237. package/src/redux/alignments.js +373 -0
  238. package/src/redux/annotationLabelVisibility.js +53 -0
  239. package/src/redux/annotationVisibility.js +196 -0
  240. package/src/redux/annotationsToSupport.js +104 -0
  241. package/src/redux/caretPosition.js +27 -0
  242. package/src/redux/charWidth.js +22 -0
  243. package/src/redux/copyOptions.js +34 -0
  244. package/src/redux/createYourOwnEnzyme.js +39 -0
  245. package/src/redux/deletionLayers.js +36 -0
  246. package/src/redux/digestTool.js +34 -0
  247. package/src/redux/featureLengthsToHide.js +27 -0
  248. package/src/redux/findTool.js +79 -0
  249. package/src/redux/frameTranslations.js +52 -0
  250. package/src/redux/hoveredAnnotation.js +24 -0
  251. package/src/redux/index.js +196 -0
  252. package/src/redux/labelLineIntensity.js +25 -0
  253. package/src/redux/labelSize.js +23 -0
  254. package/src/redux/lastSavedId.js +20 -0
  255. package/src/redux/middleware.js +112 -0
  256. package/src/redux/minimumOrfSize.js +24 -0
  257. package/src/redux/modalActions.js +3 -0
  258. package/src/redux/panelsShown.js +273 -0
  259. package/src/redux/partLengthsToHide.js +23 -0
  260. package/src/redux/primerLengthsToHide.js +27 -0
  261. package/src/redux/propertiesTool.js +40 -0
  262. package/src/redux/readOnly.js +28 -0
  263. package/src/redux/replacementLayers.js +36 -0
  264. package/src/redux/restrictionEnzymes.js +52 -0
  265. package/src/redux/selectedAnnotations.js +89 -0
  266. package/src/redux/selectedPartTags.js +21 -0
  267. package/src/redux/selectionLayer.js +46 -0
  268. package/src/redux/sequenceData/circular.js +19 -0
  269. package/src/redux/sequenceData/description.js +21 -0
  270. package/src/redux/sequenceData/features.js +19 -0
  271. package/src/redux/sequenceData/index.js +81 -0
  272. package/src/redux/sequenceData/lineageLines.js +11 -0
  273. package/src/redux/sequenceData/materiallyAvailable.js +19 -0
  274. package/src/redux/sequenceData/name.js +19 -0
  275. package/src/redux/sequenceData/parts.js +19 -0
  276. package/src/redux/sequenceData/primers.js +19 -0
  277. package/src/redux/sequenceData/sequence.js +12 -0
  278. package/src/redux/sequenceData/sharedActionCreators.js +0 -0
  279. package/src/redux/sequenceData/translations.js +20 -0
  280. package/src/redux/sequenceData/upsertDeleteActionGenerator.js +31 -0
  281. package/src/redux/sequenceDataHistory.js +43 -0
  282. package/src/redux/showGCContent.js +23 -0
  283. package/src/redux/toolBar.js +25 -0
  284. package/src/redux/uppercaseSequenceMapFont.js +25 -0
  285. package/src/redux/useAdditionalOrfStartCodons.js +24 -0
  286. package/src/redux/utils/addDashesForMatchStartAndEndForTracks/index.js +71 -0
  287. package/src/redux/utils/addMetaToActionCreators.js +12 -0
  288. package/src/redux/utils/createMergedDefaultStateReducer.js +30 -0
  289. package/src/redux/utils/createMetaAction.js +12 -0
  290. package/src/redux/versionHistory.js +27 -0
  291. package/src/selectors/annotationLabelVisibility.js +2 -0
  292. package/src/selectors/annotationSearchSelector.js +24 -0
  293. package/src/selectors/cdsFeaturesSelector.js +9 -0
  294. package/src/selectors/circularSelector.js +4 -0
  295. package/src/selectors/cutsiteLabelColorSelector.js +6 -0
  296. package/src/selectors/cutsitesByRangeSelector.js +5 -0
  297. package/src/selectors/cutsitesSelector.js +61 -0
  298. package/src/selectors/editorSelector.js +2 -0
  299. package/src/selectors/featuresSelector.js +8 -0
  300. package/src/selectors/filteredCutsitesSelector.js +137 -0
  301. package/src/selectors/filteredFeaturesSelector.js +32 -0
  302. package/src/selectors/filteredPartsSelector.js +57 -0
  303. package/src/selectors/filteredPrimersSelector.js +27 -0
  304. package/src/selectors/filteredRestrictionEnzymesSelector.js +1 -0
  305. package/src/selectors/getAdditionalEnzymesSelector.js +46 -0
  306. package/src/selectors/index.js +41 -0
  307. package/src/selectors/isEnzymeFilterAndSelector.js +1 -0
  308. package/src/selectors/minimumOrfSizeSelector.js +2 -0
  309. package/src/selectors/orfsSelector.js +15 -0
  310. package/src/selectors/partsSelector.js +8 -0
  311. package/src/selectors/primersSelector.js +8 -0
  312. package/src/selectors/restrictionEnzymesSelector.js +34 -0
  313. package/src/selectors/searchLayersSelector.js +71 -0
  314. package/src/selectors/selectedAnnotationsSelector.js +1 -0
  315. package/src/selectors/selectedCutsitesSelector.js +21 -0
  316. package/src/selectors/sequenceDataSelector.js +2 -0
  317. package/src/selectors/sequenceLengthSelector.js +5 -0
  318. package/src/selectors/sequenceSelector.js +4 -0
  319. package/src/selectors/tagsToBoldSelector.js +2 -0
  320. package/src/selectors/translationSearchMatchesSelector.js +14 -0
  321. package/src/selectors/translationsRawSelector.js +8 -0
  322. package/src/selectors/translationsSelector.js +137 -0
  323. package/src/style.css +82 -0
  324. package/src/updateEditor.js +198 -0
  325. package/src/utils/PassThrough.js +3 -0
  326. package/src/utils/addWrappedAddons.js +20 -0
  327. package/src/utils/annotationTypes.js +37 -0
  328. package/src/utils/arrayUtils.js +19 -0
  329. package/src/utils/calculateTickMarkPositionsForGivenRange.js +47 -0
  330. package/src/utils/cleanSequenceData_DEPRECATED/arrayToObjWithIds.js +17 -0
  331. package/src/utils/combineReducersDontIgnoreKeys.js +12 -0
  332. package/src/utils/commandUtils.js +18 -0
  333. package/src/utils/editorUtils.js +223 -0
  334. package/src/utils/getAnnotationClassnames.js +12 -0
  335. package/src/utils/getAnnotationNameAndStartStopString.js +61 -0
  336. package/src/utils/getVisibleStartEnd.js +7 -0
  337. package/src/utils/massageTickSpacing.js +19 -0
  338. package/src/utils/onlyUpdateForKeysDeep.js +31 -0
  339. package/src/utils/prepareRowData.js +64 -0
  340. package/src/utils/proteinUtils.js +3 -0
  341. package/src/utils/pureNoFunc.js +18 -0
  342. package/src/utils/selectionLayer.js +25 -0
  343. package/src/utils/shouldRerender.js +27 -0
  344. package/src/utils/showFileDialog.js +26 -0
  345. package/src/utils/updateLabelsForInViewFeatures.js +55 -0
  346. package/src/utils/updateLabelsForInViewFeaturesCircView.js +41 -0
  347. package/src/utils/useAAColorType.js +8 -0
  348. package/src/utils/useAnnotationLimits.js +42 -0
  349. package/src/utils/useChromatogramPrefs.js +31 -0
  350. package/src/utils/useLadders.js +6 -0
  351. package/src/utils/useMeltingTemp.js +7 -0
  352. package/src/utils/useTmType.js +10 -0
  353. package/src/withEditorInteractions/Keyboard.js +86 -0
  354. package/src/withEditorInteractions/clickAndDragUtils.js +576 -0
  355. package/src/withEditorInteractions/createSequenceInputPopup.js +296 -0
  356. package/src/withEditorInteractions/createSequenceInputPopupStyle.css +85 -0
  357. package/src/withEditorInteractions/getBpsPerRow.js +19 -0
  358. package/src/withEditorInteractions/index.js +1252 -0
  359. package/src/withEditorInteractions/isElementInViewport.js +29 -0
  360. package/src/withEditorInteractions/moveCaret.js +58 -0
  361. package/src/withEditorProps/index.js +1010 -0
  362. package/index.mjs +0 -193201
@@ -0,0 +1,149 @@
1
+ import { normalizePositionByRangeLength } from "@teselagen/range-utils";
2
+ import getXStartAndWidthOfRangeWrtRow from "./getXStartAndWidthOfRangeWrtRow";
3
+ import React, { useMemo } from "react";
4
+ import calculateTickMarkPositionsForGivenRange from "../utils/calculateTickMarkPositionsForGivenRange";
5
+ import { divideBy3 } from "../utils/proteinUtils";
6
+ import { view } from "@risingstack/react-easy-state";
7
+ import { getVisibleStartEnd } from "../utils/getVisibleStartEnd";
8
+
9
+ const Axis = function (props) {
10
+ const {
11
+ row,
12
+ tickSpacing,
13
+ bpsPerRow,
14
+ charWidth,
15
+ annotationHeight,
16
+ marginTop,
17
+ sequenceLength,
18
+ showAxisNumbers = true,
19
+ getGaps,
20
+ scrollData,
21
+ isProtein,
22
+ style,
23
+ isLinearView
24
+ } = props;
25
+ const noRows = row.start === 0 && row.end === 0;
26
+ /* eslint-disable react-hooks/exhaustive-deps */
27
+ //memoize this function because it does the heavy lifting
28
+ const tickMarkPositions = useMemo(() => {
29
+ if (noRows) return [];
30
+ return calculateTickMarkPositionsForGivenRange({
31
+ tickSpacing,
32
+ range: row,
33
+ sequenceLength,
34
+ isProtein
35
+ }).map((tickMarkPosition) => {
36
+ const gaps = getGaps ? getGaps(tickMarkPosition).gapsBefore : 0;
37
+ const xCenter =
38
+ (tickMarkPosition - (isProtein ? 1 : 0) + gaps) * charWidth +
39
+ charWidth / 2;
40
+ return {
41
+ tickMarkPosition,
42
+ xCenter
43
+ };
44
+ });
45
+ }, [
46
+ noRows,
47
+ tickSpacing,
48
+ row.start,
49
+ row.end,
50
+ sequenceLength,
51
+ isProtein,
52
+ charWidth
53
+ ]);
54
+ /* eslint-enable react-hooks/exhaustive-deps*/
55
+ if (noRows) {
56
+ return null;
57
+ }
58
+ const { xStart, width } = getXStartAndWidthOfRangeWrtRow({
59
+ row,
60
+ range: row,
61
+ charWidth,
62
+ sequenceLength,
63
+ ...(getGaps ? getGaps(row) : {})
64
+ });
65
+ //this function should take in a desired tickSpacing (eg 10 bps between tick mark)
66
+ //and output an array of tickMarkPositions for the given row (eg, [0, 10, 20])
67
+ const xEnd = xStart + width;
68
+ let visibleStart, visibleEnd;
69
+ if (scrollData) {
70
+ const val = getVisibleStartEnd({
71
+ scrollData,
72
+ width: sequenceLength * charWidth
73
+ });
74
+ //add a small buffer to either side of the visible start/end
75
+ visibleStart = val.visibleStart - 400;
76
+ visibleEnd = val.visibleEnd + 400;
77
+ }
78
+
79
+ const yStart = 0;
80
+ // const yEnd = annotationHeight / 3;
81
+
82
+ const tickMarkSVG = [];
83
+
84
+ tickMarkPositions.forEach(function ({ tickMarkPosition, xCenter }, i) {
85
+ // const xCenterPlusXStart = xCenter + xStart;
86
+
87
+ if (scrollData && !(xCenter < visibleEnd && xCenter > visibleStart)) return;
88
+ tickMarkSVG.push(
89
+ <rect
90
+ className="veAxisTick"
91
+ key={"axisTickMarkPath " + i + " " + tickMarkPosition}
92
+ x={xCenter}
93
+ width={1}
94
+ height={5}
95
+ />
96
+ );
97
+ if (showAxisNumbers) {
98
+ const position =
99
+ normalizePositionByRangeLength(
100
+ row.start + tickMarkPosition,
101
+ sequenceLength
102
+ ) + (isProtein ? 0 : 1);
103
+
104
+ const positionLength = position.toString().length * 4;
105
+ const textInner = divideBy3(position + (isProtein ? 1 : 0), isProtein);
106
+
107
+ let x = xCenter;
108
+ if (!isLinearView) {
109
+ x =
110
+ i === 0 //if first label in row, or last label in row, we add checks to make sure the axis number labels don't go outside of the width of the row
111
+ ? Math.max(positionLength, xCenter)
112
+ : i === tickMarkPositions.length - 1
113
+ ? Math.min(bpsPerRow * charWidth - positionLength, xCenter)
114
+ : xCenter;
115
+ }
116
+ tickMarkSVG.push(
117
+ <text
118
+ data-tick-mark={textInner}
119
+ key={"axisTickMarkText " + i + " " + tickMarkPosition}
120
+ fill="black"
121
+ x={x}
122
+ y={annotationHeight}
123
+ style={{ textAnchor: "middle", fontSize: 10, fontFamily: "Verdana" }}
124
+ >
125
+ {textInner}
126
+ </text>
127
+ );
128
+ }
129
+ });
130
+
131
+ return (
132
+ <svg
133
+ className="veRowViewAxis veAxis"
134
+ height={annotationHeight}
135
+ style={{ marginTop, overflow: "visible", display: "block", ...style }}
136
+ >
137
+ {tickMarkSVG}
138
+ <path
139
+ className="veAxisLine"
140
+ d={"M" + xStart + "," + yStart + " L" + xEnd + "," + yStart}
141
+ stroke="black"
142
+ />
143
+ </svg>
144
+ );
145
+ };
146
+
147
+ // export default Axis
148
+ export default view(Axis);
149
+ // export default pureNoFunc(Axis);
@@ -0,0 +1,64 @@
1
+ import React from "react";
2
+ import classnames from "classnames";
3
+ // import pure from "../../utils/pureNoFunc";
4
+ import "./style.css";
5
+ import { getSelectionMessage } from "../../utils/editorUtils";
6
+ // import draggableClassnames from "../../constants/draggableClassnames";
7
+
8
+ function Caret(props) {
9
+ const {
10
+ charWidth,
11
+ row,
12
+ sequenceLength,
13
+ caretPosition,
14
+ isProtein,
15
+ onClick,
16
+ isDraggable,
17
+ leftMargin = 0,
18
+ onRightClick,
19
+ style,
20
+ selectionMessage,
21
+ className = ""
22
+ } = props;
23
+
24
+ if (
25
+ (row.start <= caretPosition && row.end + 1 >= caretPosition) ||
26
+ (row.end === sequenceLength - 1 && row.end < caretPosition)
27
+ ) {
28
+ //the second logical operator catches the special case where we're at the very end of the sequence..
29
+ const cursorEl = (
30
+ <div
31
+ onClick={onClick}
32
+ onContextMenu={
33
+ onRightClick
34
+ ? (e) => {
35
+ onRightClick(e);
36
+ }
37
+ : undefined
38
+ }
39
+ title={
40
+ selectionMessage ||
41
+ getSelectionMessage({ caretPosition, isProtein, sequenceLength })
42
+ }
43
+ className={classnames(
44
+ {
45
+ notClickable: !isDraggable
46
+ },
47
+ "veCaret",
48
+ "veRowViewCaret",
49
+ className
50
+ )}
51
+ style={{
52
+ left: leftMargin + (caretPosition - row.start) * charWidth - 2,
53
+ ...style
54
+ }}
55
+ />
56
+ );
57
+ return cursorEl;
58
+ } else {
59
+ return null;
60
+ }
61
+ }
62
+
63
+ export default Caret;
64
+ // export default pure(Caret);
@@ -0,0 +1,8 @@
1
+ .veRowViewCaret {
2
+ height: 100%;
3
+ /* background: black; */
4
+ position: absolute;
5
+ top: -2px;
6
+ width: 2px;
7
+ /* cursor: ew-resize; */
8
+ }
@@ -0,0 +1,289 @@
1
+ import { showContextMenu } from "@teselagen/ui";
2
+ import React, { useEffect, useRef, useState } from "react";
3
+ import { Button } from "@blueprintjs/core";
4
+ import {
5
+ chromatogramMenu,
6
+ useShowChromQualScores
7
+ } from "../../utils/useChromatogramPrefs";
8
+ import classNames from "classnames";
9
+
10
+ export default function Chromatogram(props) {
11
+ const { isRowView, chromatogramData, row, getGaps, charWidth } = props;
12
+ const [showChromQualScores] = useShowChromQualScores();
13
+ let [scalePct, setScalePct] = useState(0.05);
14
+ const [hasDrawnOnce, setHasDrawnOnce] = useState(false);
15
+ if (props.scalePct) scalePct = props.scalePct;
16
+ if (props.setScalePct) setScalePct = props.setScalePct;
17
+ const canvasRef = useRef();
18
+ const gapsBeforeRow = getGaps(row.start).gapsBefore;
19
+ useEffect(() => {
20
+ if (
21
+ !chromatogramData ||
22
+ !chromatogramData.baseTraces ||
23
+ !canvasRef.current
24
+ ) {
25
+ return true;
26
+ }
27
+ const painter = new drawTrace({
28
+ isRowView,
29
+ showChromQualScores,
30
+ peakCanvas: canvasRef.current,
31
+ traceData: chromatogramData,
32
+ charWidth: charWidth,
33
+ startBp: row.start,
34
+ endBp: row.end,
35
+ getGaps,
36
+ gapsBeforeRow,
37
+ scalePct: scalePct
38
+ });
39
+ painter.paintCanvas();
40
+ setHasDrawnOnce(true);
41
+ }, [
42
+ setHasDrawnOnce,
43
+ showChromQualScores,
44
+ chromatogramData,
45
+ charWidth,
46
+ row.start,
47
+ row.end,
48
+ gapsBeforeRow,
49
+ isRowView,
50
+ scalePct,
51
+ getGaps,
52
+ canvasRef
53
+ ]);
54
+ const marginLeft = gapsBeforeRow * charWidth;
55
+
56
+ return (
57
+ <div
58
+ className={classNames("chromatogram", {
59
+ noQualityScores: !showChromQualScores
60
+ })}
61
+ style={{
62
+ position: "relative"
63
+ }}
64
+ onContextMenu={(e) => {
65
+ showContextMenu([chromatogramMenu], undefined, e);
66
+ }}
67
+ >
68
+ <Button
69
+ minimal
70
+ data-tip="Scale Chromatogram Up"
71
+ className="scaleChromatogramButtonUp"
72
+ icon="caret-up"
73
+ onClick={(e) => {
74
+ e.stopPropagation();
75
+ setScalePct(scalePct + 0.01);
76
+ }}
77
+ style={{
78
+ zIndex: 10,
79
+ position: "sticky",
80
+ left: 145
81
+ }}
82
+ />
83
+ <Button
84
+ minimal
85
+ data-tip="Scale Chromatogram Down"
86
+ className="scaleChromatogramButtonDown"
87
+ icon="caret-down"
88
+ onClick={(e) => {
89
+ e.stopPropagation();
90
+ setScalePct(scalePct - 0.01);
91
+ }}
92
+ style={{
93
+ zIndex: 10,
94
+ position: "sticky",
95
+ left: 175
96
+ }}
97
+ />
98
+ <br />
99
+
100
+ <div
101
+ className={classNames({
102
+ "chromatogram-trace": true,
103
+ "chromatogram-trace-initialized": hasDrawnOnce
104
+ })}
105
+ style={{
106
+ zIndex: 1,
107
+ position: "relative",
108
+ left: 0,
109
+ // left: posOfSeqRead,
110
+ display: "inline-block"
111
+ }}
112
+ // tnr comment back in for start of tooltip work
113
+ // onMouseEnter={() => {
114
+ // this.setState({ showTooltip: true });
115
+ // }}
116
+ // onMouseLeave={() => {
117
+ // this.setState({ showTooltip: false });
118
+ // }}
119
+ // onMouseMove={(e) => {
120
+ // const { row } = this.props;
121
+ // const boundingRowRect =
122
+ // this.chromatogramRef.getBoundingClientRect();
123
+ // let nearestCaretPos;
124
+ // if (
125
+ // getClientY(e) > boundingRowRect.top &&
126
+ // getClientY(e) < boundingRowRect.top + boundingRowRect.height
127
+ // ) {
128
+ // if (getClientX(e) - boundingRowRect.left < 0) {
129
+ // nearestCaretPos = row.start;
130
+ // } else {
131
+ // const clickXPositionRelativeToRowContainer =
132
+ // getClientX(e) - boundingRowRect.left;
133
+ // const numberOfBPsInFromRowStart = Math.floor(
134
+ // (clickXPositionRelativeToRowContainer + charWidth / 2) /
135
+ // charWidth
136
+ // );
137
+ // nearestCaretPos = numberOfBPsInFromRowStart + row.start;
138
+ // if (nearestCaretPos > row.end + 1) {
139
+ // nearestCaretPos = row.end + 1;
140
+ // }
141
+ // }
142
+ // this.setState({
143
+ // nearestCaretPos
144
+ // });
145
+ // if (this.tooltipRef) {
146
+ // this.tooltipRef.style.left =
147
+ // getClientX(e) - boundingRowRect.left + "px";
148
+ // this.tooltipRef.style.top =
149
+ // getClientY(e) - boundingRowRect.top + "px";
150
+ // }
151
+ // if (this.tooltipHolderRef) {
152
+ // this.tooltipHolderRef.reposition();
153
+ // }
154
+ // }
155
+ // }}
156
+ // ref={(n) => {
157
+ // if (n) this.chromatogramRef = n;
158
+ // }}
159
+ >
160
+ {/* tnr comment back in for start of tooltip work {this.state.showTooltip && (
161
+ <div
162
+ style={{
163
+ position: "absolute",
164
+ height: 1,
165
+ width: 1,
166
+ background: "white",
167
+ top: this.state.tooltipTop,
168
+ left: this.state.tooltipLeft
169
+ }}
170
+ ref={(n) => {
171
+ if (n) this.tooltipRef = n;
172
+ }}
173
+ className="tg-chromatogram-tooltip"
174
+ >
175
+ <Tooltip
176
+ hoverOpenDelay={300}
177
+ ref={(n) => {
178
+ if (n) this.tooltipHolderRef = n;
179
+ }}
180
+ isOpen={true}
181
+ content={<div>{this.state.nearestCaretPos + 1}</div>}
182
+ >
183
+ <div></div>
184
+ </Tooltip>
185
+ </div>
186
+ )} */}
187
+
188
+ <canvas style={{ marginLeft }} ref={canvasRef} height="100" />
189
+ </div>
190
+ </div>
191
+ );
192
+ }
193
+
194
+ function drawTrace({
195
+ traceData,
196
+ charWidth,
197
+ startBp,
198
+ peakCanvas,
199
+ endBp,
200
+ getGaps,
201
+ gapsBeforeRow,
202
+ showChromQualScores,
203
+ // isRowView,
204
+ scalePct
205
+ }) {
206
+ const colors = {
207
+ adenine: "green",
208
+ thymine: "red",
209
+ guanine: "black",
210
+ cytosine: "blue",
211
+ other: "#ac68cc"
212
+ };
213
+ const ctx = peakCanvas.getContext("2d");
214
+
215
+ const bottomBuffer = 0;
216
+ const maxHeight = peakCanvas.height;
217
+
218
+ const seqLengthWithGaps =
219
+ endBp - startBp + 1 + getGaps(endBp).gapsBefore - gapsBeforeRow;
220
+ const maxWidth = seqLengthWithGaps * charWidth;
221
+
222
+ peakCanvas.width = maxWidth;
223
+
224
+ const scaledHeight = maxHeight - bottomBuffer;
225
+
226
+ this.drawPeaks = function (traceType, lineColor) {
227
+ ctx.beginPath();
228
+ //loop through base positions [ 43, 53, 70, 77, ...]
229
+ // looping through the entire sequence length
230
+ for (let baseIndex = startBp; baseIndex <= endBp; baseIndex++) {
231
+ // each base's beginning and end of its peak
232
+ // grab the start and end (43, 53) , (53, 70) ...
233
+ // looping through each base's peak
234
+ const traceForIndex = traceData.baseTraces[baseIndex][traceType];
235
+ const gapsBefore = getGaps(baseIndex - 1).gapsBefore || 0;
236
+ const gapsAt = getGaps(baseIndex).gapsBefore;
237
+ const startXPosition =
238
+ (baseIndex + gapsAt - startBp - gapsBeforeRow) * charWidth;
239
+ const hasGaps = gapsBefore !== gapsAt;
240
+ const traceLength = traceForIndex.length;
241
+ const tracePointSpacing = charWidth / traceLength;
242
+ // eslint-disable-next-line no-loop-func
243
+ traceForIndex.forEach((_tracePoint, tracePointIndex) => {
244
+ const tracePoint = scaledHeight - scalePct * _tracePoint;
245
+ if (hasGaps && tracePointIndex === 0) {
246
+ ctx.moveTo(startXPosition, tracePoint);
247
+ }
248
+ ctx.lineTo(
249
+ startXPosition + tracePointSpacing * tracePointIndex,
250
+ tracePoint
251
+ );
252
+ });
253
+ }
254
+ ctx.strokeStyle = lineColor;
255
+ ctx.stroke();
256
+ };
257
+
258
+ this.drawQualityScoreHistogram = function () {
259
+ if (!traceData.qualNums || !showChromQualScores) return;
260
+ const qualMax = Math.max(...traceData.qualNums);
261
+ const scalePctQual = scaledHeight / qualMax;
262
+
263
+ for (let baseIndex = startBp; baseIndex <= endBp; baseIndex++) {
264
+ const gapsAt = getGaps(baseIndex).gapsBefore;
265
+ const startXPosition =
266
+ (baseIndex + gapsAt - startBp - gapsBeforeRow) * charWidth;
267
+
268
+ ctx.rect(
269
+ startXPosition,
270
+ scaledHeight - traceData.qualNums[baseIndex] * scalePctQual,
271
+ charWidth,
272
+ traceData.qualNums[baseIndex] * scalePctQual
273
+ );
274
+ }
275
+ ctx.fillStyle = "#cfc3c3";
276
+ ctx.fill();
277
+ ctx.strokeStyle = "#e9e3f4";
278
+ ctx.stroke();
279
+ };
280
+
281
+ this.paintCanvas = function () {
282
+ this.drawQualityScoreHistogram();
283
+ this.drawPeaks("aTrace", colors.adenine);
284
+ this.drawPeaks("tTrace", colors.thymine);
285
+ this.drawPeaks("gTrace", colors.guanine);
286
+ this.drawPeaks("cTrace", colors.cytosine);
287
+ ctx.closePath();
288
+ };
289
+ }
@@ -0,0 +1,47 @@
1
+ import React from "react";
2
+ import SelectionLayer from "./SelectionLayer";
3
+ import { connectToEditor } from "../withEditorProps";
4
+ import classNames from "classnames";
5
+
6
+ export const CutsiteSelectionLayers = connectToEditor(
7
+ ({ hoveredAnnotation }) => ({
8
+ hoveredAnnotation
9
+ })
10
+ )(function CutsiteSelectionLayersInner({
11
+ hoveredAnnotation,
12
+ cutsites,
13
+ annotationCommonProps,
14
+ showReverseSequence,
15
+ sequenceHeight,
16
+ alignmentData,
17
+ row
18
+ }) {
19
+ return Object.keys(cutsites)
20
+ .sort((a) => (cutsites[a].id === hoveredAnnotation ? 1 : -1))
21
+ .map(function (id, index) {
22
+ const cutsite = cutsites[id];
23
+ const isHovered = hoveredAnnotation === cutsite.id;
24
+ const layer = cutsite.annotation.recognitionSiteRange;
25
+ return (
26
+ layer.start > -1 && (
27
+ <SelectionLayer
28
+ hideTitle
29
+ {...annotationCommonProps}
30
+ {...{
31
+ id: cutsite.id,
32
+ key: "restrictionSiteRange" + index,
33
+ height: showReverseSequence ? sequenceHeight * 2 : sequenceHeight,
34
+ regions: [layer],
35
+ row: alignmentData
36
+ ? { start: 0, end: alignmentData.sequence.length - 1 }
37
+ : row,
38
+ className: classNames("cutsiteLabelSelectionLayer", {
39
+ cutsiteLabelSelectionLayerHovered: isHovered
40
+ }),
41
+ hideCarets: true
42
+ }}
43
+ />
44
+ )
45
+ );
46
+ });
47
+ });