@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,90 @@
1
+ import classnames from "classnames";
2
+ import { compose } from "redux";
3
+ import { connect } from "react-redux";
4
+ import React from "react";
5
+ import { store } from "@risingstack/react-easy-state";
6
+ import * as hoveredAnnotationActions from "../redux/hoveredAnnotation";
7
+ import { withHandlers, branch } from "recompose";
8
+ import { modifiableTypes } from "@teselagen/sequence-utils";
9
+
10
+ export const HoveredIdContext = React.createContext({
11
+ hoveredId: "" // default value
12
+ });
13
+
14
+ export function withHoveredIdFromContext(Component) {
15
+ return function HoveredIdComponent(props) {
16
+ return (
17
+ <HoveredIdContext.Consumer>
18
+ {(contexts) => <Component {...props} {...contexts} />}
19
+ </HoveredIdContext.Consumer>
20
+ );
21
+ };
22
+ }
23
+ export const hoveredAnnEasyStore = store({
24
+ hoveredAnn: undefined,
25
+ selectedAnn: undefined
26
+ });
27
+
28
+ export default compose(
29
+ withHoveredIdFromContext,
30
+ branch(
31
+ ({ noRedux }) => !noRedux,
32
+ connect(function (
33
+ state,
34
+ {
35
+ id,
36
+ editorName = "StandaloneEditor",
37
+ className,
38
+ hoveredId: hoveredIdFromContext,
39
+ passHoveredId
40
+ }
41
+ ) {
42
+ if (!editorName) {
43
+ console.warn(
44
+ "please pass an editorName to the withHover() wrapped component"
45
+ );
46
+ }
47
+ const editorState = state.VectorEditor[editorName] || {};
48
+ const hoveredId = editorState.hoveredAnnotation || hoveredIdFromContext; //we can pass a hoveredId from context in order to still use the hover functionality without being connected to redux! see http://localhost:3344/#/SimpleCircularOrLinearView for an example
49
+ const isIdHashmap = typeof id === "object";
50
+
51
+ const hovered = !!(isIdHashmap ? id[hoveredId] : hoveredId === id);
52
+ const newClassName = classnames(className, "hoverHelper", {
53
+ veAnnotationHovered: hovered
54
+ });
55
+ const toReturn = {
56
+ hovered,
57
+ className: newClassName
58
+ };
59
+ if (hovered && passHoveredId) {
60
+ //only pass hoveredId if it is hovered
61
+ toReturn.hoveredId = hoveredId;
62
+ }
63
+ return toReturn;
64
+ },
65
+ hoveredAnnotationActions)
66
+ ),
67
+ withHandlers({
68
+ onMouseOver: (props) => (e) => {
69
+ const { editorName, id, hoveredAnnotationUpdate } = props;
70
+ const isIdHashmap = typeof id === "object";
71
+ const idToPass = isIdHashmap ? Object.keys(id)[0] : id;
72
+ const annot = props?.annotation || props?.label?.annotation;
73
+ if (modifiableTypes.includes(annot?.annotationTypePlural)) {
74
+ hoveredAnnEasyStore.hoveredAnn = annot;
75
+ }
76
+ //because the calling onHover can slow things down, we disable it if dragging or scrolling
77
+ if (window.__veDragging || window.__veScrolling) return;
78
+ e.stopPropagation(); //this is important otherwise hovering labels inside circular view label groups won't work
79
+ hoveredAnnotationUpdate &&
80
+ hoveredAnnotationUpdate(idToPass, { editorName });
81
+ },
82
+ onMouseLeave: (props) => (e) => {
83
+ hoveredAnnEasyStore.hoveredAnn = undefined;
84
+ const { editorName, hoveredAnnotationClear } = props;
85
+ e.stopPropagation();
86
+ if (window.__veDragging || window.__veScrolling) return;
87
+ hoveredAnnotationClear && hoveredAnnotationClear(true, { editorName });
88
+ }
89
+ })
90
+ );
package/src/index.js ADDED
@@ -0,0 +1,60 @@
1
+ import "@fontsource/ubuntu-mono";
2
+ import { FocusStyleManager } from "@blueprintjs/core";
3
+ import { showContextMenu } from "@teselagen/ui";
4
+ import "./createVectorEditor";
5
+ import "./style.css";
6
+ export { getUserGroupLabel } from "./CutsiteFilter/AdditionalCutsiteInfoDialog";
7
+
8
+ window.tgCreateMenu = showContextMenu;
9
+ // window.tgCreateMenu = (menu, e, e2) => {
10
+ // (e||e2).stopPropagation()
11
+ // (e || e2)
12
+ // } //add this to the window so people can easily override the default context menus
13
+
14
+ FocusStyleManager.onlyShowFocusOnTabs();
15
+ export { getGaps } from "./AlignmentView/getGaps";
16
+ export { default as createVectorEditor } from "./createVectorEditor";
17
+ export { default as withEditorProps, connectToEditor } from "./withEditorProps";
18
+ export { default as withEditorInteractions } from "./withEditorInteractions";
19
+ export { default as specialCutsiteFilterOptions } from "./constants/specialCutsiteFilterOptions";
20
+ //export components
21
+ export {
22
+ default as CircularView,
23
+ CircularView as CircularViewUnconnected
24
+ } from "./CircularView";
25
+ export { default as SimpleCircularOrLinearView } from "./SimpleCircularOrLinearView";
26
+ export { default as RowView, RowView as RowViewUnconnected } from "./RowView";
27
+ export { default as RowItem } from "./RowItem";
28
+ export { default as Editor, Editor as EditorUnconnected } from "./Editor";
29
+ export { ToolBar } from "./ToolBar";
30
+ export {
31
+ default as CutsiteFilter,
32
+ CutsiteFilter as CutsiteFilterUnconnected
33
+ } from "./CutsiteFilter";
34
+ export {
35
+ default as LinearView,
36
+ LinearView as LinearViewUnconnected
37
+ } from "./LinearView";
38
+ export {
39
+ default as StatusBar,
40
+ StatusBar as StatusBarUnconnected
41
+ } from "./StatusBar";
42
+ export {
43
+ default as DigestTool,
44
+ DigestTool as DigestToolUnconnected
45
+ } from "./DigestTool/DigestTool";
46
+ export { default as withHover } from "./helperComponents/withHover";
47
+
48
+ export {
49
+ default as vectorEditorReducer,
50
+ vectorEditorMiddleware,
51
+ actions
52
+ } from "./redux";
53
+ export { default as updateEditor } from "./updateEditor";
54
+ export { default as addAlignment } from "./addAlignment";
55
+
56
+ export { default as getRangeAnglesSpecial } from "./CircularView/getRangeAnglesSpecial";
57
+ export { default as PositionAnnotationOnCircle } from "./CircularView/PositionAnnotationOnCircle";
58
+ export { default as EnzymeViewer } from "./EnzymeViewer";
59
+ export { default as AlignmentView } from "./AlignmentView";
60
+ export { default as getOveHotkeyDefs } from "./commands/getOveHotkeyDefs";
@@ -0,0 +1,373 @@
1
+ import {
2
+ tidyUpSequenceData /* generateSequenceData */,
3
+ condensePairwiseAlignmentDifferences
4
+ } from "@teselagen/sequence-utils";
5
+ import { convertBasePosTraceToPerBpTrace } from "@teselagen/bio-parsers";
6
+ import shortid from "shortid";
7
+
8
+ import addDashesForMatchStartAndEndForTracks from "./utils/addDashesForMatchStartAndEndForTracks";
9
+
10
+ import { /* createReducer, */ createAction } from "redux-act";
11
+ import { omit } from "lodash";
12
+
13
+ const alignmentAnnotationSettings = {
14
+ axis: true,
15
+ axisNumbers: true,
16
+ chromatogram: false,
17
+ dnaColors: false,
18
+ features: false,
19
+ parts: false,
20
+ reverseSequence: false,
21
+ sequence: true,
22
+ translations: true,
23
+ orfs: false,
24
+ orfTranslations: false,
25
+ cdsFeatureTranslations: false,
26
+ cutsites: false,
27
+ primers: false,
28
+ compactNames: false
29
+ };
30
+
31
+ const defaultVisibilities = {
32
+ alignmentAnnotationVisibility: alignmentAnnotationSettings,
33
+ pairwise_alignmentAnnotationVisibility: alignmentAnnotationSettings,
34
+ alignmentAnnotationLabelVisibility: {
35
+ features: false,
36
+ parts: false,
37
+ cutsites: false
38
+ },
39
+ pairwise_alignmentAnnotationLabelVisibility: {
40
+ features: false,
41
+ parts: false,
42
+ cutsites: false
43
+ }
44
+ };
45
+ const defaultVisibilityTypes = Object.keys(defaultVisibilities);
46
+
47
+ try {
48
+ defaultVisibilityTypes.forEach((type) => {
49
+ const newVal = JSON.parse(window.localStorage.getItem(type));
50
+ if (newVal)
51
+ defaultVisibilities[type] = {
52
+ ...defaultVisibilities[type],
53
+ ...newVal
54
+ };
55
+ });
56
+ } catch (e) {
57
+ console.error("error setting localstorage visibility config", e);
58
+ }
59
+
60
+ // ------------------------------------
61
+ // Actions
62
+ // ------------------------------------
63
+ export const upsertAlignmentRun = createAction("UPSERT_ALIGNMENT_RUN");
64
+ export const removeAlignmentFromRedux = createAction(
65
+ "REMOVE_ALIGNMENT_FROM_REDUX"
66
+ );
67
+ export const updateAlignmentViewVisibility = createAction(
68
+ "UPDATE_ALIGNMENT_VIEW_VISIBILITY"
69
+ );
70
+ export const alignmentRunUpdate = createAction("ALIGNMENT_RUN_UPDATE");
71
+
72
+ const highlightRangeProps = {
73
+ color: "red",
74
+ hideCarets: true,
75
+ ignoreGaps: true
76
+ };
77
+ function addHighlightedDifferences(alignmentTracks) {
78
+ return alignmentTracks.map((track) => {
79
+ if (track.isUnmapped) {
80
+ return track;
81
+ }
82
+ const sequenceData = tidyUpSequenceData(track.sequenceData);
83
+ const matchHighlightRanges = getRangeMatchesBetweenTemplateAndNonTemplate(
84
+ alignmentTracks[0].alignmentData.sequence,
85
+ track.alignmentData.sequence
86
+ );
87
+ // .filter by the user-specified mismatch overrides (initially [])
88
+ const mismatches = matchHighlightRanges.filter(({ isMatch }) => !isMatch);
89
+ return {
90
+ ...track,
91
+ sequenceData,
92
+ matchHighlightRanges,
93
+ additionalSelectionLayers: matchHighlightRanges
94
+ .filter(({ isMatch }) => !isMatch)
95
+ .map((range) => {
96
+ return { ...range, ...highlightRangeProps };
97
+ }),
98
+ mismatches
99
+ };
100
+ });
101
+ }
102
+
103
+ // alignmentTracks = addHighlightedDifferences(alignmentTracks);
104
+
105
+ // ------------------------------------
106
+ // Reducer
107
+ // ------------------------------------
108
+
109
+ export default (state = {}, { payload = {}, type }) => {
110
+ if (type === "ALIGNMENT_RUN_UPDATE") {
111
+ const { alignmentId } = payload;
112
+ const newState = {
113
+ ...state,
114
+ [alignmentId]: {
115
+ ...state[alignmentId],
116
+ ...payload
117
+ }
118
+ };
119
+ return newState;
120
+ }
121
+
122
+ if (type === "UPDATE_ALIGNMENT_VIEW_VISIBILITY") {
123
+ defaultVisibilityTypes.forEach((type) => {
124
+ if (
125
+ (type.startsWith("pairwise_") && payload.pairwiseAlignments) ||
126
+ (!type.startsWith("pairwise_") && !payload.pairwiseAlignments)
127
+ ) {
128
+ defaultVisibilities[type] = {
129
+ ...defaultVisibilities[type],
130
+ ...payload[type.replace("pairwise_", "")]
131
+ };
132
+
133
+ localStorage.setItem(
134
+ type,
135
+ JSON.stringify({
136
+ ...defaultVisibilities[type],
137
+ ...payload[type.replace("pairwise_", "")]
138
+ })
139
+ );
140
+ }
141
+ });
142
+ return {
143
+ ...state,
144
+ [payload.id]: { ...payload }
145
+ };
146
+ }
147
+ if (type === "UPSERT_ALIGNMENT_RUN") {
148
+ const { id } = payload;
149
+ const payloadToUse = {
150
+ stateTrackingId: state[id]?.stateTrackingId ? shortid() : "initialLoadId",
151
+ alignmentType: state[id]?.alignmentType,
152
+ ...payload,
153
+ //assign default visibilities
154
+ ...defaultVisibilityTypes.reduce((acc, type) => {
155
+ if (
156
+ (type.startsWith("pairwise_") && payload.pairwiseAlignments) ||
157
+ (!type.startsWith("pairwise_") && !payload.pairwiseAlignments)
158
+ ) {
159
+ acc[type.replace("pairwise_", "")] = {
160
+ ...defaultVisibilities[type],
161
+ ...payload[type.replace("pairwise_", "")]
162
+ };
163
+ }
164
+ return acc;
165
+ }, {})
166
+ };
167
+ if (payloadToUse.pairwiseAlignments) {
168
+ if (
169
+ payloadToUse.pairwiseAlignments[0][0].alignmentData.matchStart !==
170
+ undefined
171
+ ) {
172
+ payloadToUse.pairwiseAlignments = payloadToUse.pairwiseAlignments.map(
173
+ addDashesForMatchStartAndEndForTracks
174
+ );
175
+ }
176
+ const templateSeq = payloadToUse.pairwiseAlignments[0][0];
177
+ //we need to get all of the sequences in a single alignment (turning inserts into single BP red highlights)
178
+ const pairwiseOverviewAlignmentTracks = [
179
+ {
180
+ //add the template seq as the first track in the Pairwise Alignment Overview
181
+ ...templateSeq,
182
+ sequenceData: tidyUpSequenceData(templateSeq.sequenceData),
183
+ alignmentData: { sequence: templateSeq.sequenceData.sequence } //remove the gaps from the template sequence
184
+ }
185
+ ]; // start with just the template seq in there!
186
+
187
+ payloadToUse.pairwiseAlignments.forEach(([template, alignedSeq]) => {
188
+ const condensedSeq = condensePairwiseAlignmentDifferences(
189
+ template.alignmentData.sequence,
190
+ alignedSeq.alignmentData.sequence
191
+ );
192
+ let re = /r+/gi;
193
+ let match;
194
+ const additionalSelectionLayers = [];
195
+ while ((match = re.exec(condensedSeq)) != null) {
196
+ additionalSelectionLayers.push({
197
+ start: match.index,
198
+ end: match.index + match[0].length - 1,
199
+ ...highlightRangeProps
200
+ });
201
+ }
202
+ re = /g+/gi;
203
+ // let match;
204
+ while ((match = re.exec(condensedSeq)) != null) {
205
+ additionalSelectionLayers.push({
206
+ start: match.index,
207
+ end: match.index + match[0].length - 1,
208
+ ...highlightRangeProps,
209
+ color: "grey"
210
+ });
211
+ }
212
+
213
+ const alignedSeqMinusInserts = {
214
+ ...alignedSeq,
215
+ sequenceData: {
216
+ ...tidyUpSequenceData(alignedSeq.sequenceData),
217
+ sequence: template.sequenceData.sequence
218
+ },
219
+ additionalSelectionLayers,
220
+ alignmentData: {
221
+ sequence: condensedSeq
222
+ }
223
+ };
224
+ pairwiseOverviewAlignmentTracks.push(alignedSeqMinusInserts);
225
+ });
226
+ payloadToUse.pairwiseOverviewAlignmentTracks =
227
+ pairwiseOverviewAlignmentTracks;
228
+ payloadToUse.pairwiseAlignments = payloadToUse.pairwiseAlignments.map(
229
+ addHighlightedDifferences
230
+ );
231
+ }
232
+ if (payloadToUse.alignmentTracks) {
233
+ payloadToUse.alignmentTracks = addHighlightedDifferences(
234
+ payloadToUse.alignmentTracks
235
+ );
236
+ }
237
+ //check for issues
238
+ let hasError = checkForIssues(
239
+ payloadToUse.alignmentTracks,
240
+ payload.alignmentType
241
+ );
242
+ (payloadToUse.pairwiseAlignments || []).forEach((alignment) => {
243
+ const error = alignment;
244
+ if (error) {
245
+ hasError = error;
246
+ }
247
+ });
248
+ return {
249
+ ...state,
250
+ [payload.id]: {
251
+ ...payloadToUse,
252
+ hasError
253
+ }
254
+ };
255
+ }
256
+ if (type === "REMOVE_ALIGNMENT_FROM_REDUX") {
257
+ const { id } = payload;
258
+ state = omit(state, [id]);
259
+ }
260
+ return state;
261
+ };
262
+
263
+ //returns an array like so: [{start: 0, end: 4, isMatch: false}, {start,end,isMatch} ... etc]
264
+ function getRangeMatchesBetweenTemplateAndNonTemplate(tempSeq, nonTempSeq) {
265
+ //assume all sequences are the same length (with gap characters "-" in some places)
266
+ //loop through all non template sequences and compare them with the template
267
+
268
+ const seqLength = nonTempSeq.length;
269
+ const ranges = [];
270
+ // const startIndex = "".match/[-]/ Math.max(0, .indexOf("-"));
271
+ const nonTempSeqWithoutLeadingDashes = nonTempSeq.replace(/^-+/g, "");
272
+ const nonTempSeqWithoutTrailingDashes = nonTempSeq.replace(/-+$/g, "");
273
+
274
+ const startIndex = seqLength - nonTempSeqWithoutLeadingDashes.length;
275
+ const endIndex =
276
+ seqLength - (seqLength - nonTempSeqWithoutTrailingDashes.length);
277
+ for (let index = startIndex; index < endIndex; index++) {
278
+ const isMatch =
279
+ tempSeq[index].toLowerCase() === nonTempSeq[index].toLowerCase();
280
+ const previousRange = ranges[ranges.length - 1];
281
+ if (previousRange) {
282
+ if (previousRange.isMatch === isMatch) {
283
+ previousRange.end++;
284
+ } else {
285
+ ranges.push({
286
+ start: index,
287
+ end: index,
288
+ isMatch
289
+ });
290
+ }
291
+ } else {
292
+ ranges.push({
293
+ start: startIndex,
294
+ end: startIndex,
295
+ isMatch
296
+ });
297
+ }
298
+ }
299
+ return ranges;
300
+ }
301
+
302
+ function checkForIssues(alignmentTracks, alignmentType) {
303
+ if (
304
+ !alignmentTracks ||
305
+ !alignmentTracks[0] ||
306
+ !alignmentTracks[0].alignmentData
307
+ ) {
308
+ return;
309
+ }
310
+
311
+ const alignmentTrackLength = alignmentTracks[0].alignmentData.sequence.length;
312
+ let hasError;
313
+ alignmentTracks.some((track) => {
314
+ if (track.alignmentData.sequence.length !== alignmentTrackLength) {
315
+ console.error("incorrect length", alignmentTracks);
316
+
317
+ return "incorrect length";
318
+ }
319
+ if (
320
+ track.chromatogramData &&
321
+ track.sequenceData.sequence.length !==
322
+ track.chromatogramData.baseCalls.length
323
+ ) {
324
+ console.error("incorrect chromatogram length", alignmentTracks);
325
+
326
+ return "incorrect chromatogram length";
327
+ }
328
+ if (track.chromatogramData && !track.chromatogramData.baseTraces) {
329
+ if (!track.chromatogramData.basePos) {
330
+ console.error("corrupted chromatogram data", alignmentTracks);
331
+ return "corrupted chromatogram data";
332
+ }
333
+ track.chromatogramData = convertBasePosTraceToPerBpTrace(
334
+ track.chromatogramData
335
+ );
336
+ }
337
+ if (
338
+ alignmentType !== "Parallel Part Creation" &&
339
+ track.sequenceData.sequence.length !==
340
+ track.alignmentData.sequence.replace(/-/g, "").length
341
+ ) {
342
+ console.error(
343
+ "sequence data length does not match alignment data w/o gaps"
344
+ );
345
+ console.error(
346
+ "track.sequenceData.sequence:",
347
+ track.sequenceData.sequence
348
+ );
349
+ console.error(
350
+ "track.sequenceData.sequence.length:",
351
+ track.sequenceData.sequence.length
352
+ );
353
+ console.error(
354
+ "track.alignmentData.sequence:",
355
+ track.alignmentData.sequence
356
+ );
357
+ console.error(
358
+ 'track.alignmentData.sequence.replace(/-/g,""):',
359
+ track.alignmentData.sequence.replace(/-/g, "")
360
+ );
361
+ console.error(
362
+ 'track.alignmentData.sequence.replace(/-/g,"").length:',
363
+ track.alignmentData.sequence.replace(/-/g, "").length
364
+ );
365
+ hasError = "sequence data length does not match alignment data w/o gaps";
366
+ return true;
367
+ }
368
+ return false;
369
+ });
370
+ if (hasError) {
371
+ return hasError;
372
+ }
373
+ }
@@ -0,0 +1,53 @@
1
+ //./caretPosition.js
2
+ import createAction from "./utils/createMetaAction";
3
+ import createMergedDefaultStateReducer from "./utils/createMergedDefaultStateReducer";
4
+
5
+ const visibilityInitialValues = {
6
+ features: true,
7
+ parts: true,
8
+ primers: true,
9
+ cutsites: true,
10
+ assemblyPieces: true,
11
+ lineageAnnotations: true,
12
+ warnings: true
13
+ };
14
+
15
+ // ------------------------------------
16
+ // Actions
17
+ // ------------------------------------
18
+ export const annotationLabelVisibilityToggle = createAction(
19
+ "annotationLabelVisibilityToggle"
20
+ );
21
+ export const annotationLabelVisibilityShow = createAction(
22
+ "annotationLabelVisibilityShow"
23
+ );
24
+ export const annotationLabelVisibilityHide = createAction(
25
+ "annotationLabelVisibilityHide"
26
+ );
27
+
28
+ // ------------------------------------
29
+ // Reducer
30
+ // ------------------------------------
31
+ export default createMergedDefaultStateReducer(
32
+ {
33
+ [annotationLabelVisibilityToggle]: (state, payload) => {
34
+ return {
35
+ ...state,
36
+ [payload]: !state[payload]
37
+ };
38
+ },
39
+ [annotationLabelVisibilityShow]: (state, payload) => {
40
+ return {
41
+ ...state,
42
+ [payload]: true
43
+ };
44
+ },
45
+ [annotationLabelVisibilityHide]: (state, payload) => {
46
+ return {
47
+ ...state,
48
+ [payload]: false
49
+ };
50
+ }
51
+ },
52
+ visibilityInitialValues
53
+ );