@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,3 @@
1
+ export function normalizeAngle(a) {
2
+ return (a + Math.PI * 2) % (Math.PI * 2);
3
+ }
@@ -0,0 +1,9 @@
1
+ import { normalizeAngle } from "./normalizeAngle";
2
+
3
+ export function normalizeAngleRange(r) {
4
+ return {
5
+ ...r,
6
+ start: normalizeAngle(r.start),
7
+ end: normalizeAngle(r.end)
8
+ };
9
+ }
@@ -0,0 +1,6 @@
1
+ export function positionCutsites(annotation) {
2
+ return {
3
+ start: annotation.topSnipPosition,
4
+ end: annotation.topSnipPosition
5
+ };
6
+ }
@@ -0,0 +1,4 @@
1
+ export default function shouldFlipText(_angle) {
2
+ const angle = _angle > 2 * Math.PI ? _angle - 2 * Math.PI : _angle;
3
+ return angle > Math.PI * 0.5 && angle < Math.PI * 1.5;
4
+ }
@@ -0,0 +1,47 @@
1
+ .veCircularViewMiddleOfVectorText {
2
+ position: absolute;
3
+ top: 50%;
4
+ /* position the top edge of the element at the middle of the parent */
5
+ left: 49.5%;
6
+ /* position the left edge of the element at the middle of the parent */
7
+ transform: translate(-50%, -50%);
8
+ z-index: 10;
9
+ text-align: center;
10
+ /* This is a shorthand of
11
+ translateX(-50%) and translateY(-50%) */
12
+ }
13
+
14
+ .selectionLayerInverseWrapper {
15
+ fill: none !important;
16
+ }
17
+
18
+ .veHideLabels .veLabels,
19
+ .veHideLabels .veCircularViewMiddleOfVectorText {
20
+ display: none;
21
+ }
22
+
23
+ .circularViewMinimap {
24
+ margin: 4px;
25
+ --v: calc(((18 / 5) * var(--p) - 90) * 1deg);
26
+ --bg: #fff;
27
+ width: 30px;
28
+ height: 30px;
29
+ display: inline-block;
30
+ border-radius: 50%;
31
+ padding: 5px;
32
+ background: linear-gradient(var(--bg), var(--bg)) content-box,
33
+ linear-gradient(var(--v), #ccc 50%, transparent 0) 0 /
34
+ min(100%, calc(50 - var(--p)) * 100%),
35
+ linear-gradient(var(--v), transparent 50%, #4ac5ed 0) 0 /
36
+ min(100%, calc(var(--p) - 50) * 100%),
37
+ linear-gradient(to right, #ccc 50%, #4ac5ed 0);
38
+ }
39
+ .bp3-dark .circularViewMinimap {
40
+ --bg: #293742;
41
+ }
42
+ .veCircularView .ve-monospace-font.veCircularViewInternalLabelText {
43
+ font-size: 13px;
44
+ }
45
+ .veCircularView {
46
+ pointer-events: initial;
47
+ }
@@ -0,0 +1,7 @@
1
+ export default function polarToSpecialCartesian(radius, angle) {
2
+ //the 0 angle returns the 0,1 point on the unit circle instead of the 1,0 point like normal
3
+ return {
4
+ x: radius * Math.cos(angle - Math.PI / 2),
5
+ y: radius * Math.sin(angle - Math.PI / 2)
6
+ };
7
+ }
@@ -0,0 +1,96 @@
1
+ import { compose } from "redux";
2
+ import pluralize from "pluralize";
3
+
4
+
5
+
6
+ import { formName } from "./constants";
7
+ import { typeField } from "./helperComponents/PropertiesDialog/typeField";
8
+ import { DataTable, DialogFooter, withSelectTableRecords, withSelectedEntities } from "@teselagen/ui";
9
+ import { useEffect } from "react";
10
+ import { hideDialog } from "./GlobalDialogUtils";
11
+ import { startCase } from "lodash";
12
+ import { tidyUpAnnotation } from "@teselagen/sequence-utils";
13
+
14
+
15
+ const schemaFeatures = ["name", typeField, "start", "end", "strand"];
16
+ const schemaOther = ["name", "start", "end", "strand"];
17
+ export default compose(
18
+ withSelectedEntities(formName),
19
+ withSelectTableRecords(formName)
20
+ )(function CreateAnnotationsPage(props) {
21
+ const {
22
+ newAnnotations,
23
+ annotationType,
24
+ annotationVisibilityShow,
25
+ beforeAnnotationCreate,
26
+ handleSubmit,
27
+ selectTableRecords,
28
+ sequenceData
29
+ } = props;
30
+ const ents = props[`${formName}SelectedEntities`];
31
+ useEffect(() => {
32
+ selectTableRecords(newAnnotations);
33
+ }, [newAnnotations, selectTableRecords]);
34
+ return (
35
+ <div className="bp3-dialog-body">
36
+ <div>
37
+ The following {annotationType}
38
+ {newAnnotations.length > 1 ? "s" : ""} will be added:
39
+ <DataTable
40
+ isInfinite
41
+ formName={formName}
42
+ entities={newAnnotations.map((e) => ({
43
+ ...e,
44
+ start: e.start + 1,
45
+ end: e.end + 1
46
+ }))}
47
+ withCheckboxes
48
+ schema={annotationType === "feature" ? schemaFeatures : schemaOther}
49
+ ></DataTable>
50
+ </div>
51
+ <DialogFooter
52
+ hideModal={hideDialog}
53
+ onClick={handleSubmit(async () => {
54
+ const annotationTypePlural = pluralize(annotationType);
55
+
56
+ ents.forEach((newAnnotation, i) => {
57
+ beforeAnnotationCreate &&
58
+ beforeAnnotationCreate({
59
+ annotationTypePlural,
60
+ annotation: newAnnotation,
61
+ props: props
62
+ });
63
+
64
+ let conditionals = {};
65
+ if (ents.length > 1) {
66
+ if (i === 0) {
67
+ conditionals = {
68
+ batchUndoStart: true
69
+ };
70
+ } else if (i === ents.length - 1) {
71
+ conditionals = {
72
+ batchUndoEnd: true
73
+ };
74
+ } else {
75
+ conditionals = {
76
+ batchUndoMiddle: true
77
+ };
78
+ }
79
+ }
80
+ props[`upsert${startCase(annotationType)}`](
81
+ tidyUpAnnotation(newAnnotation, {
82
+ sequenceData,
83
+ annotationType: annotationTypePlural
84
+ }),
85
+ conditionals
86
+ );
87
+ annotationVisibilityShow(annotationTypePlural);
88
+ });
89
+
90
+ hideDialog();
91
+ })}
92
+ text="Add"
93
+ ></DialogFooter>
94
+ </div>
95
+ );
96
+ });
@@ -0,0 +1,337 @@
1
+ import { connect } from "react-redux";
2
+ // import {reduxForm, Field, formValueSelector} from 'redux-form'
3
+ import React from "react";
4
+ import {
5
+ DialogFooter,
6
+ InfoHelper,
7
+ wrapDialog
8
+ } from "@teselagen/ui";
9
+
10
+ // import './style.css';
11
+ import { cutSequenceByRestrictionEnzyme } from "@teselagen/sequence-utils";
12
+ // import QuestionTooltip from '../../components/QuestionTooltip';
13
+ import {
14
+ defaultEnzymesByName,
15
+ getReverseComplementSequenceString
16
+ } from "@teselagen/sequence-utils";
17
+ import EnzymeViewer from "../EnzymeViewer";
18
+ import "./style.css";
19
+ import { connectToEditor } from "../withEditorProps";
20
+ import { compose } from "recompose";
21
+ import { Callout } from "@blueprintjs/core";
22
+ import { addCustomEnzyme } from "../utils/editorUtils";
23
+
24
+ const CreateCustomEnzyme = function (props) {
25
+ const paddingStart = "-------";
26
+ const paddingEnd = "-------";
27
+ const {
28
+ inputSequenceToTestAgainst = "", //pass this prop in!
29
+ seqName = "Destination Vector",
30
+ createYourOwnEnzyme,
31
+ dispatch,
32
+ hideModal,
33
+ editorName
34
+ } = props;
35
+
36
+ createYourOwnEnzyme.chop_top_index = Number(
37
+ createYourOwnEnzyme.chop_top_index
38
+ );
39
+ createYourOwnEnzyme.chop_bottom_index = Number(
40
+ createYourOwnEnzyme.chop_bottom_index
41
+ );
42
+
43
+ const {
44
+ sequence = "",
45
+ chop_top_index = 0,
46
+ chop_bottom_index = 0,
47
+ name = ""
48
+ } = createYourOwnEnzyme;
49
+ const regexString = bpsToRegexString(sequence);
50
+ const enzyme = {
51
+ name: name,
52
+ site: sequence,
53
+ forwardRegex: regexString,
54
+ reverseRegex: getReverseComplementSequenceString(regexString),
55
+ topSnipOffset: chop_top_index,
56
+ bottomSnipOffset: chop_bottom_index,
57
+ usForward: 0,
58
+ usReverse: 0,
59
+ color: "black"
60
+ };
61
+ let invalid;
62
+ if (
63
+ !enzyme.name ||
64
+ !enzyme.site ||
65
+ !enzyme.forwardRegex ||
66
+ !enzyme.reverseRegex ||
67
+ (!enzyme.topSnipOffset && enzyme.topSnipOffset !== 0) ||
68
+ (!enzyme.bottomSnipOffset && enzyme.bottomSnipOffset !== 0)
69
+ ) {
70
+ invalid = true;
71
+ }
72
+
73
+ let matches;
74
+ if (regexString.length === 0) {
75
+ matches = [];
76
+ } else {
77
+ matches = cutSequenceByRestrictionEnzyme(
78
+ inputSequenceToTestAgainst,
79
+ true,
80
+ enzyme
81
+ );
82
+ }
83
+
84
+ const errors = validate(createYourOwnEnzyme);
85
+ if (Object.keys(errors || {}).length) {
86
+ invalid = true;
87
+ }
88
+ function onChange(updatedVal) {
89
+ dispatch({
90
+ type: "CREATE_YOUR_OWN_ENZYME_UPDATE",
91
+ payload: {
92
+ ...createYourOwnEnzyme,
93
+ ...updatedVal
94
+ }
95
+ });
96
+ }
97
+
98
+ return (
99
+ <div className="createYourOwnEnzyme">
100
+ <Callout intent="primary">
101
+ This enzyme will be added to the "My Enzymes" group
102
+ </Callout>
103
+ <CustomInput
104
+ error={errors["name"]}
105
+ value={name}
106
+ onChange={onChange}
107
+ name="name"
108
+ label="Name:"
109
+ />
110
+ <CustomInput
111
+ error={errors["sequence"]}
112
+ value={sequence}
113
+ onChange={onChange}
114
+ name="sequence"
115
+ label={
116
+ <div className="labelWithIcon">
117
+ <InfoHelper>
118
+ <div className="taLineHolder">
119
+ <Line> Special Characters: </Line>
120
+ <Line> R = G A (purine) </Line>
121
+ <Line> Y = T C (pyrimidine) </Line>
122
+ <Line> K = G T (keto) </Line>
123
+ <Line> M = A C (amino) </Line>
124
+ <Line> S = G C (strong bonds) </Line>
125
+ <Line> W = A T (weak bonds) </Line>
126
+ <Line> B = G T C (all but A) </Line>
127
+ <Line> D = G A T (all but C) </Line>
128
+ <Line> H = A C T (all but G) </Line>
129
+ <Line> V = G C A (all but T) </Line>
130
+ <Line> N = A G C T (any) </Line>
131
+ </div>
132
+ </InfoHelper>
133
+ <span>Recognition sequence:</span>
134
+ </div>
135
+ }
136
+ onInput={function (input) {
137
+ const inputValue = input.target.value;
138
+ const cleanInput = inputValue.replace(/[^rykmswbdhvnagct]/gi, "");
139
+ input.target.value = cleanInput;
140
+ }}
141
+ />
142
+
143
+ <CustomInput
144
+ error={errors["chop_top_index"]}
145
+ value={chop_top_index}
146
+ onChange={onChange}
147
+ name="chop_top_index"
148
+ label="Chop top index:"
149
+ type="number"
150
+ />
151
+ <CustomInput
152
+ error={errors["chop_bottom_index"]}
153
+ value={chop_bottom_index}
154
+ onChange={onChange}
155
+ name="chop_bottom_index"
156
+ label="Chop bottom index:"
157
+ type="number"
158
+ />
159
+
160
+ <EnzymeViewer
161
+ {...{
162
+ forwardSnipPosition: chop_top_index,
163
+ paddingEnd,
164
+ paddingStart,
165
+ reverseSnipPosition: chop_bottom_index,
166
+ sequence
167
+ }}
168
+ />
169
+ <br />
170
+
171
+ <h3 className={"cutnumber " + (matches.length === 0 && "invalid")}>
172
+ {matches.length > 10
173
+ ? `Cuts more than 10 times in ${seqName}`
174
+ : `Cuts ${matches.length} time${
175
+ matches.length === 1 ? "" : "s"
176
+ } in ${seqName}`}
177
+ </h3>
178
+ <DialogFooter
179
+ hideModal={hideModal}
180
+ disabled={invalid}
181
+ onClick={() => {
182
+ addCustomEnzyme(enzyme);
183
+ dispatch({
184
+ type: "FILTERED_RESTRICTION_ENZYMES_ADD", //filteredRestrictionEnzymesAdd
185
+ payload: {
186
+ value: name
187
+ },
188
+ meta: {
189
+ editorName
190
+ }
191
+ });
192
+ hideModal && hideModal();
193
+ }}
194
+ ></DialogFooter>
195
+ {/* <div className="buttonHolder">
196
+ <Button
197
+ className="addAdditionalEnzymeBtn"
198
+ onClick={stopCreatingYourOwnEnzyme}
199
+ >
200
+ Back
201
+ </Button>
202
+ <Button
203
+ className={
204
+ " ta_useCutsite addAdditionalEnzymeBtn " + (invalid && "disabled")
205
+ }
206
+ onClick={function () {}}
207
+ >
208
+ Use Enzyme
209
+ </Button>
210
+ </div> */}
211
+ </div>
212
+ );
213
+ };
214
+
215
+ export default compose(
216
+ wrapDialog({
217
+ title: "Create Custom Enzyme"
218
+ }),
219
+ connectToEditor(({ sequenceData = {} }) => {
220
+ return {
221
+ seqName: sequenceData.name,
222
+ inputSequenceToTestAgainst: sequenceData.sequence || ""
223
+ };
224
+ }),
225
+ connect(function (state) {
226
+ return {
227
+ createYourOwnEnzyme:
228
+ state.VectorEditor.__allEditorsOptions.createYourOwnEnzyme
229
+ };
230
+ })
231
+ )(CreateCustomEnzyme);
232
+
233
+ function validate(values) {
234
+ const errors = {};
235
+
236
+ if (!values.name || values.name.trim() === "") {
237
+ errors.name = "Input cannot be blank";
238
+ } else if (defaultEnzymesByName[values.name.toLowerCase()]) {
239
+ errors.name = `The name ${values.name} is already taken.`;
240
+ }
241
+
242
+ if (
243
+ !values.sequence ||
244
+ values.sequence.trim() === "" ||
245
+ values.sequence.trim().length < 4
246
+ ) {
247
+ errors.sequence = "Enzyme recognition sequence must be at least 4bps long";
248
+ }
249
+
250
+ if (
251
+ values.sequence &&
252
+ values.sequence.replace(/[^atgcrykmswbdhvn]/gi, "").length !==
253
+ values.sequence.length
254
+ ) {
255
+ errors.sequence = "Sequence must only contain valid bases";
256
+ }
257
+
258
+ if (!values.chop_top_index && values.chop_top_index !== 0) {
259
+ errors.chop_top_index = "Input cannot be blank";
260
+ }
261
+ if (!values.chop_bottom_index && values.chop_bottom_index !== 0) {
262
+ errors.chop_bottom_index = "Input cannot be blank";
263
+ }
264
+ return errors;
265
+ }
266
+
267
+ // connect(
268
+ // function(state, props) {
269
+ // const editorState = state.VectorEditor[props.editorName];
270
+ // let selectedEnzymes = s.restrictionEnzymesSelector(editorState, props.additionalEnzymes);
271
+ // return {
272
+ // selectedEnzymes
273
+ // };
274
+ // },
275
+ // { createYourOwnEnzymeClose }
276
+ // )(ManageEnzymes);
277
+
278
+ // export default ManageEnzymes;
279
+
280
+ function bpsToRegexString(bps) {
281
+ let regexString = "";
282
+ if (typeof bps === "string") {
283
+ bps.split("").forEach(function (bp) {
284
+ if (bp === "r") {
285
+ regexString += "[ga]";
286
+ } else if (bp === "y") {
287
+ regexString += "[tc]";
288
+ } else if (bp === "k") {
289
+ regexString += "[gt]";
290
+ } else if (bp === "m") {
291
+ regexString += "[ac]";
292
+ } else if (bp === "s") {
293
+ regexString += "[gc]";
294
+ } else if (bp === "w") {
295
+ regexString += "[at]";
296
+ } else if (bp === "b") {
297
+ regexString += "[gtc]";
298
+ } else if (bp === "d") {
299
+ regexString += "[gat]";
300
+ } else if (bp === "h") {
301
+ regexString += "[act]";
302
+ } else if (bp === "v") {
303
+ regexString += "[gca]";
304
+ } else if (bp === "n") {
305
+ regexString += "[agct]";
306
+ } else {
307
+ regexString += bp;
308
+ }
309
+ });
310
+ }
311
+ return regexString;
312
+ }
313
+
314
+ function CustomInput({ name, value, onChange, onInput, label, error, type }) {
315
+ return (
316
+ <div className={"inputHolder " + (error && "error")}>
317
+ <div>
318
+ <span>{label}</span>
319
+ <input
320
+ value={value}
321
+ onChange={function (e) {
322
+ onChange({
323
+ [name]: e.target.value
324
+ });
325
+ }}
326
+ onInput={onInput}
327
+ type={type}
328
+ />
329
+ </div>
330
+ {error && <p className="errorMessage">{error}</p>}
331
+ </div>
332
+ );
333
+ }
334
+
335
+ function Line({ children }) {
336
+ return <div className="taLine"> {children}</div>;
337
+ }
@@ -0,0 +1,100 @@
1
+ .inputHolder {
2
+ display: flex;
3
+ align-items: center;
4
+ flex-direction: column;
5
+ }
6
+ .inputHolder.error input {
7
+ background: pink;
8
+ }
9
+ .inputHolder.error .errorMessage {
10
+ color: red;
11
+ margin-top: 0px;
12
+ margin-bottom: 0px;
13
+ margin-left: 95px;
14
+ }
15
+ .inputHolder > div {
16
+ display: flex;
17
+ align-items: center;
18
+ }
19
+ .inputHolder > div > span {
20
+ width: 210px;
21
+ margin-right: 0.5em;
22
+ text-align: right;
23
+ }
24
+
25
+ .addAdditionalEnzymeBtn {
26
+ width: 120px !important;
27
+ margin: 10px;
28
+ }
29
+
30
+ .addAdditionalEnzyme {
31
+ display: flex;
32
+ flex-direction: column;
33
+ align-items: center;
34
+ justify-content: center;
35
+ padding: 20px;
36
+ }
37
+ .addAdditionalEnzyme > span {
38
+ max-width: 350px;
39
+ }
40
+
41
+ .createYourOwnEnzyme {
42
+ display: flex;
43
+ flex-direction: column;
44
+ align-items: center;
45
+ justify-content: center;
46
+ padding: 20px;
47
+ }
48
+ .createYourOwnEnzyme .inputHolder input {
49
+ flex: 1;
50
+ display: block;
51
+ min-width: 0;
52
+ margin: 10px;
53
+ }
54
+ .createYourOwnEnzyme .buttonHolder {
55
+ display: flex;
56
+ }
57
+ .createYourOwnEnzyme .cutnumber.invalid {
58
+ color: red;
59
+ }
60
+
61
+ .ta_useCutsite {
62
+ margin: 10px;
63
+ }
64
+ .ta_useCutsite.disabled {
65
+ cursor: not-allowed;
66
+ opacity: 0.5;
67
+ }
68
+
69
+ .labelWithIcon {
70
+ display: flex;
71
+ justify-content: flex-end;
72
+ }
73
+ .labelWithIcon > div {
74
+ padding-right: 10px;
75
+ }
76
+
77
+ .createYourOwnButton {
78
+ padding-top: 40px;
79
+ display: flex;
80
+ align-items: center;
81
+ }
82
+ .createYourOwnButton > span {
83
+ width: 250px;
84
+ }
85
+
86
+ .filterAndButton {
87
+ display: flex;
88
+ align-items: center;
89
+ }
90
+
91
+ .taLine {
92
+ text-align: left;
93
+ }
94
+
95
+ .taLineHolder {
96
+ width: 100%;
97
+ }
98
+ .taLineHolder div {
99
+ width: 100%;
100
+ }