@teselagen/ove 0.0.14 → 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 +164777 -135861
  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 -193228
@@ -0,0 +1,433 @@
1
+ import React from "react";
2
+ import IntervalTree from "node-interval-tree";
3
+ import { sortBy, noop } from "lodash";
4
+ import { getRangeLength } from "@teselagen/range-utils";
5
+ import getRangeAngles from "./getRangeAnglesSpecial";
6
+ import getYOffset from "./getYOffset";
7
+ import withHover from "../helperComponents/withHover";
8
+ import PositionAnnotationOnCircle from "./PositionAnnotationOnCircle";
9
+ import getAnnotationNameAndStartStopString from "../utils/getAnnotationNameAndStartStopString";
10
+ import Feature from "./Feature";
11
+ import getAnnotationClassnames from "../utils/getAnnotationClassnames";
12
+ // import { normalizeAngleRange } from "./normalizeAngleRange";
13
+ // import { normalizeAngle } from "./normalizeAngle";
14
+
15
+ //annotations coming in can be positioned either by caretPosition or range
16
+ function drawAnnotations(props) {
17
+ const {
18
+ readOnly,
19
+ annotationType,
20
+ radius,
21
+ noHover,
22
+ isProtein,
23
+ type,
24
+ annotations,
25
+ annotationHeight,
26
+ noTitle,
27
+ spaceBetweenAnnotations,
28
+ sequenceLength,
29
+ showCicularViewInternalLabels,
30
+ // reverseAnnotations, //set true when drawing annotations that use the drawDirectedPiePiece function because that function returns things that need to be flipped
31
+ // editorName,
32
+ getColor,
33
+ useStartAngle, //use the startAngle instead of the centerAngle to position the labels
34
+ onClick = noop,
35
+ noHeight,
36
+ positionBy, //by default the annotation.start and annotation.end are used to position the annotation on the circle, but passing a function here gives an option to override that
37
+ allOnSameLevel, //by default overlapping annotations are given different yOffsets. Setting this to true prevents that and positions all annotations on the same level (no y-offsets given). Cutsites for example just get drawn all on the same level
38
+ onRightClicked = noop,
39
+ onDoubleClick = noop,
40
+ showLabels,
41
+ hideAnnotation,
42
+ // rotationRadians,
43
+ labelOptions,
44
+ annotationProps,
45
+ fontStyle
46
+ // isZoomedIn,
47
+ // visibleAngleRange
48
+ } = props;
49
+ const totalAnnotationHeight = annotationHeight + spaceBetweenAnnotations;
50
+ const featureITree = new IntervalTree();
51
+ let maxYOffset = 0;
52
+ const svgGroup = [];
53
+ const labels = {};
54
+
55
+ if (!Object.keys(annotations).length) return null;
56
+ sortBy(annotations, (a) => {
57
+ return -getRangeLength(a, sequenceLength);
58
+ })
59
+ .map((annotation) => {
60
+ const { startAngle, endAngle, totalAngle, centerAngle, locationAngles } =
61
+ getRangeAngles(
62
+ positionBy ? positionBy(annotation) : annotation,
63
+ sequenceLength
64
+ );
65
+ const spansOrigin = startAngle > endAngle;
66
+ const annotationCopy = {
67
+ ...annotation,
68
+ startAngle,
69
+ endAngle,
70
+ locationAngles,
71
+ totalAngle,
72
+ centerAngle,
73
+ yOffset: 0
74
+ };
75
+ if (!allOnSameLevel) {
76
+ //expand the end angle if annotation spans the origin
77
+ const expandedEndAngle = spansOrigin
78
+ ? endAngle + 2 * Math.PI
79
+ : endAngle;
80
+ let yOffset1;
81
+ let yOffset2;
82
+ if (spansOrigin) {
83
+ annotationCopy.yOffset = getYOffset(
84
+ featureITree,
85
+ startAngle,
86
+ expandedEndAngle
87
+ );
88
+ } else {
89
+ //we need to check both locations to account for annotations that span the origin
90
+ yOffset1 = getYOffset(featureITree, startAngle, expandedEndAngle);
91
+ yOffset2 = getYOffset(
92
+ featureITree,
93
+ startAngle + Math.PI * 2,
94
+ expandedEndAngle + Math.PI * 2
95
+ );
96
+ annotationCopy.yOffset = Math.max(yOffset1, yOffset2);
97
+ }
98
+
99
+ if (spansOrigin) {
100
+ featureITree.insert(startAngle, expandedEndAngle, {
101
+ ...annotationCopy
102
+ });
103
+ } else {
104
+ //normal feature
105
+ // we need to add it twice to the interval tree to accomodate features which span the origin
106
+ featureITree.insert(startAngle, expandedEndAngle, {
107
+ ...annotationCopy
108
+ });
109
+ featureITree.insert(
110
+ startAngle + 2 * Math.PI,
111
+ expandedEndAngle + 2 * Math.PI,
112
+
113
+ { ...annotationCopy }
114
+ );
115
+ }
116
+
117
+ if (annotationCopy.yOffset > maxYOffset) {
118
+ maxYOffset = annotationCopy.yOffset;
119
+ }
120
+ }
121
+
122
+ return annotationCopy;
123
+ })
124
+ .forEach(function (annotation, index) {
125
+ annotation.yOffset = maxYOffset - annotation.yOffset;
126
+ function _onClick(event) {
127
+ onClick && onClick({ event, annotation });
128
+ annotation.onClick && annotation.onClick({ event, annotation });
129
+ }
130
+ function onContextMenu(event) {
131
+ onRightClicked({ event, annotation });
132
+ if (annotation.onRightClick) {
133
+ annotation.onRightClick({ event, annotation });
134
+ }
135
+ }
136
+ function _onDoubleClick(event) {
137
+ onDoubleClick && onDoubleClick({ event, annotation });
138
+ if (annotation.onDoubleClick) {
139
+ annotation.onDoubleClick({ event, annotation });
140
+ }
141
+ }
142
+
143
+ const {
144
+ startAngle,
145
+ endAngle,
146
+ totalAngle,
147
+ centerAngle,
148
+ locationAngles,
149
+ ...rest
150
+ } = annotation;
151
+
152
+ const _annotationProps = {
153
+ ...annotationProps,
154
+ ...rest
155
+ };
156
+
157
+ const titleText = getAnnotationNameAndStartStopString(annotation, {
158
+ isProtein,
159
+ readOnly
160
+ });
161
+
162
+ const classNames = getAnnotationClassnames(annotation, {
163
+ viewName: "CircularView",
164
+ type,
165
+ isProtein,
166
+ readOnly
167
+ });
168
+
169
+ const annotationRadius =
170
+ radius + annotation.yOffset * totalAnnotationHeight;
171
+ const name =
172
+ annotation.name ||
173
+ (annotation.restrictionEnzyme && annotation.restrictionEnzyme.name);
174
+ let ellipsizedName;
175
+ // let spaceBeforeName = 0;
176
+ let angleAdjust;
177
+
178
+ if (name && showCicularViewInternalLabels) {
179
+ // eslint-disable-next-line no-inner-declarations
180
+ function getEllipsizedName(totalAngle) {
181
+ let ellipsizedName;
182
+ const arcLength =
183
+ 2 * Math.PI * (annotationRadius - annotationHeight) * totalAngle; //for arrowhead
184
+
185
+ const annLength = Math.max(0, Math.floor(arcLength / 55 - 3));
186
+ ellipsizedName = name.slice(0, annLength);
187
+ if (ellipsizedName && ellipsizedName !== name) {
188
+ if (ellipsizedName.length >= name.length - 2) {
189
+ ellipsizedName = name;
190
+ } else if (ellipsizedName.length > 3) {
191
+ ellipsizedName += "..";
192
+ } else {
193
+ ellipsizedName = undefined;
194
+ }
195
+ }
196
+ return ellipsizedName;
197
+ }
198
+ if (locationAngles) {
199
+ annotation.locationAngles = locationAngles.map((l) => {
200
+ const en = getEllipsizedName(l.totalAngle);
201
+ if (en?.length > (ellipsizedName?.length || 0)) {
202
+ ellipsizedName = en;
203
+ }
204
+ return {
205
+ ...l,
206
+ ellipsizedName: en
207
+ };
208
+ });
209
+ } else {
210
+ ellipsizedName = getEllipsizedName(totalAngle);
211
+ }
212
+
213
+ // //tnr: WIP to try to adjust the inline label in the circular view to always show up even when zoomed in
214
+ // if (ellipsizedName && isZoomedIn) {
215
+ // const nameAngle =
216
+ // ((ellipsizedName.length + 3) * 55) /
217
+ // (2 * Math.PI * (annotationRadius - annotationHeight));
218
+ // const maxAngleAdjust = (totalAngle - nameAngle) / 2;
219
+ // const idealAngle = normalizeAngle(
220
+ // -normalizeAngle(rotationRadians) - normalizeAngle(centerAngle)
221
+ // );
222
+ // angleAdjust = idealAngle;
223
+ // if (
224
+ // Math.min(maxAngleAdjust, idealAngle) !== idealAngle
225
+ // // &&
226
+ // // Math.min(maxAngleAdjust, 2 * Math.PI - idealAngle) !==
227
+ // // 2 * Math.PI - idealAngle
228
+ // ) {
229
+ // angleAdjust = -maxAngleAdjust;
230
+ // if (
231
+ // normalizeAngle(
232
+ // normalizeAngle(centerAngle) + normalizeAngle(rotationRadians)
233
+ // ) > Math.PI
234
+ // ) {
235
+ // angleAdjust = -angleAdjust;
236
+ // }
237
+ // }
238
+ // // angleAdjust =idealAngle
239
+ // angleAdjust = (angleAdjust / Math.PI) * 180;
240
+ // // if (normalizeAngle(normalizeAngle(centerAngle) + normalizeAngle(rotationRadians)) > Math.PI) {
241
+ // // angleAdjust = -angleAdjust;
242
+ // // }
243
+ // }
244
+ }
245
+ if (showLabels && !ellipsizedName) {
246
+ //add labels to the exported label array (to be drawn by the label component)
247
+ labels[annotation.id] = {
248
+ annotation,
249
+ annotationType,
250
+ annotationCenterAngle: useStartAngle ? startAngle : centerAngle,
251
+ annotationCenterRadius: annotationRadius,
252
+ text: name,
253
+ id: annotation.id,
254
+ title: titleText,
255
+ className: `${classNames} ${annotation.labelClassName || ""}`,
256
+ highPriorityLabel: annotation.highPriorityLabel,
257
+ onClick: _onClick,
258
+ onDoubleClick: _onDoubleClick,
259
+ fontStyle: fontStyle || "normal",
260
+ color:
261
+ annotation.labelColor ||
262
+ (annotationType === "part" ? "#ac68cc" : "black"),
263
+ onContextMenu,
264
+ ...labelOptions
265
+ };
266
+ }
267
+ if (!hideAnnotation) {
268
+ const annotationColor = getColor
269
+ ? getColor(annotation)
270
+ : annotation.color || "#ac68cc";
271
+ DrawAnnotation.displayName = annotationType + "--- DrawAnnotation";
272
+ const CompToUse = noHover ? DrawAnnotationInner : DrawAnnotation;
273
+ svgGroup.push(
274
+ <CompToUse
275
+ {...{
276
+ ...props,
277
+ ...rest,
278
+ ...annotation,
279
+ angleAdjust,
280
+ ellipsizedName,
281
+ name,
282
+ annotationHeight,
283
+ annotationRadius,
284
+ annotationType,
285
+ isProtein,
286
+ noTitle,
287
+ titleText,
288
+ classNames,
289
+ onClick: _onClick,
290
+ onDoubleClick: _onDoubleClick,
291
+ onContextMenu,
292
+ annotation,
293
+ annotationColor,
294
+ totalAngle,
295
+ centerAngle,
296
+ annotationProps: _annotationProps
297
+ }}
298
+ id={annotation.id}
299
+ key={"veAnnotation-" + annotationType + index}
300
+ />
301
+ );
302
+ }
303
+ });
304
+ return {
305
+ component: (
306
+ <g
307
+ className={"veAnnotations-" + annotationType}
308
+ key={"veAnnotations-" + annotationType}
309
+ >
310
+ {svgGroup}
311
+ </g>
312
+ ),
313
+ height: noHeight
314
+ ? 0
315
+ : maxYOffset * totalAnnotationHeight + 0.5 * annotationHeight,
316
+ labels
317
+ };
318
+ }
319
+
320
+ export default drawAnnotations;
321
+
322
+ function DrawAnnotationInner({
323
+ className,
324
+ startAngle,
325
+ endAngle,
326
+ onClick,
327
+ onDoubleClick,
328
+ onContextMenu,
329
+ titleText,
330
+ classNames,
331
+ locationAngles,
332
+ annotation,
333
+ reverseAnnotations,
334
+ Annotation = Feature,
335
+ totalAngle,
336
+ annotationColor,
337
+ isProtein,
338
+ annotationRadius,
339
+ annotationHeight,
340
+ onMouseLeave,
341
+ onMouseOver,
342
+ annotationType,
343
+ annotationProps,
344
+ addHeight,
345
+ noTitle,
346
+ useCenter,
347
+ centerAngle,
348
+ perAnnotationProps,
349
+ passAnnotation,
350
+ ellipsizedName,
351
+ angleAdjust,
352
+ rotationRadians
353
+ }) {
354
+ const sharedProps = {
355
+ style: noTitle ? undefined : { cursor: "pointer" },
356
+ className: `${className} ${classNames}`,
357
+ onContextMenu: onContextMenu,
358
+ onClick: onClick,
359
+ onDoubleClick: onDoubleClick,
360
+ onMouseLeave,
361
+ onMouseOver
362
+ };
363
+ const title = <title>{titleText}</title>;
364
+ function getInner(
365
+ {
366
+ startAngle,
367
+ endAngle,
368
+ totalAngle,
369
+ isNotLocation,
370
+ containsLocations,
371
+ ellipsizedName: ellipsizedNameLocation
372
+ },
373
+ i
374
+ ) {
375
+ const { transform, revTransform } = PositionAnnotationOnCircle({
376
+ sAngle: useCenter ? centerAngle : startAngle,
377
+ eAngle: useCenter ? centerAngle : endAngle,
378
+ height: addHeight ? annotationRadius : undefined,
379
+ forward: reverseAnnotations ? !annotation.forward : annotation.forward
380
+ });
381
+ return (
382
+ <g
383
+ transform={transform}
384
+ key={
385
+ isNotLocation
386
+ ? "notLocation"
387
+ : "location--" + annotation.id + "--" + i
388
+ }
389
+ // {...(ellipsizedName && ellipsizedName !== name
390
+ // ? { "data-tip": name }
391
+ // : {})}
392
+ {...sharedProps}
393
+ >
394
+ {noTitle ? null : title}
395
+ <Annotation
396
+ {...(passAnnotation && { annotation })}
397
+ annotationType={annotationType}
398
+ arrowheadType={annotation.arrowheadType}
399
+ totalAngle={totalAngle}
400
+ centerAngle={centerAngle}
401
+ revTransform={revTransform}
402
+ rotationRadians={rotationRadians}
403
+ ellipsizedName={
404
+ containsLocations ? ellipsizedNameLocation : ellipsizedName
405
+ }
406
+ locationNumber={i}
407
+ angleAdjust={angleAdjust}
408
+ color={annotationColor}
409
+ isProtein={isProtein}
410
+ containsLocations={containsLocations}
411
+ radius={annotationRadius}
412
+ annotationHeight={annotationHeight}
413
+ {...annotationProps}
414
+ {...(perAnnotationProps && perAnnotationProps(annotation))}
415
+ />
416
+ </g>
417
+ );
418
+ }
419
+ return (
420
+ <React.Fragment>
421
+ {getInner({
422
+ startAngle,
423
+ endAngle,
424
+ totalAngle,
425
+ centerAngle,
426
+ containsLocations: !!locationAngles
427
+ })}
428
+ {locationAngles && locationAngles.map(getInner)}
429
+ </React.Fragment>
430
+ );
431
+ }
432
+
433
+ const DrawAnnotation = withHover(DrawAnnotationInner);
@@ -0,0 +1,142 @@
1
+ import Path from "paths-js/path";
2
+ function polarToSpecialCartesian(radius, angleInRadians) {
3
+ //the 0 angle returns the 0,1 point on the unit circle instead of the 1,0 point like normal
4
+ return {
5
+ x: radius * Math.cos(angleInRadians - Math.PI / 2),
6
+ y: radius * Math.sin(angleInRadians - Math.PI / 2)
7
+ };
8
+ }
9
+ const stickOutThisMuch = 0.03;
10
+
11
+ // draws a directed piece of the pie with an arrowhead, starts at 0 angle, only draws in one direction (use transforms to move it around the )
12
+ export default function drawDirectedPiePiece({
13
+ tailThickness = 0.6,
14
+ // arrowheadLength = 1,
15
+ radius,
16
+ arrowheadType,
17
+ overlapsSelf,
18
+ annotationHeight,
19
+ totalAngle,
20
+ hasLabel,
21
+ labelNeedsFlip,
22
+ returnTextPath
23
+ }) {
24
+ const tailHeight = annotationHeight * tailThickness;
25
+
26
+ const arrowheadOuterRadius = radius + annotationHeight / 2;
27
+ const arrowheadInnerRadius = radius - annotationHeight / 2;
28
+ const tailOuterRadius = radius + tailHeight / 2;
29
+ const tailInnerRadius = radius - tailHeight / 2;
30
+
31
+ // var arrowheadAngle = totalAngle / 2
32
+ let arrowheadAngle = 80 / radius / (Math.PI * 2);
33
+
34
+ if (totalAngle < arrowheadAngle) {
35
+ //set arrowhead length to the angle in radians length
36
+ arrowheadAngle = totalAngle;
37
+ }
38
+
39
+ if (arrowheadType === "NONE") arrowheadAngle = 0;
40
+ const arcAngle = totalAngle - arrowheadAngle;
41
+
42
+ //the main points we need to draw the arrow and in the order we draw them in:
43
+ const arrowheadPoint = polarToSpecialCartesian(radius, 0);
44
+
45
+ const arrowheadBottom = polarToSpecialCartesian(
46
+ arrowheadInnerRadius,
47
+ arrowheadAngle
48
+ );
49
+ const arcLeftBottom = polarToSpecialCartesian(
50
+ tailInnerRadius,
51
+ arrowheadAngle
52
+ );
53
+ const arcRightBottom = polarToSpecialCartesian(tailInnerRadius, totalAngle);
54
+ const arcRightTop = polarToSpecialCartesian(tailOuterRadius, totalAngle);
55
+ const arcRightMiddle = polarToSpecialCartesian(radius, totalAngle);
56
+ const arcRightMiddleOuter = polarToSpecialCartesian(
57
+ radius,
58
+ totalAngle + stickOutThisMuch
59
+ );
60
+ const arcLeftTop = polarToSpecialCartesian(tailOuterRadius, arrowheadAngle);
61
+ const arrowheadTop = polarToSpecialCartesian(
62
+ arrowheadOuterRadius,
63
+ arrowheadAngle
64
+ );
65
+
66
+ const largeArcFlag = arcAngle > Math.PI ? 1 : 0;
67
+ let path = Path().moveto(arrowheadPoint.x, arrowheadPoint.y);
68
+
69
+ if (overlapsSelf) {
70
+ const arrowheadPointInner = polarToSpecialCartesian(
71
+ radius,
72
+ -stickOutThisMuch
73
+ );
74
+ path = path
75
+ .lineto(arrowheadPointInner.x, arrowheadPointInner.y)
76
+ .lineto(arrowheadPoint.x, arrowheadPoint.y);
77
+ }
78
+
79
+ path = path
80
+ .lineto(arrowheadBottom.x, arrowheadBottom.y)
81
+ .lineto(arcLeftBottom.x, arcLeftBottom.y)
82
+ .arc({
83
+ rx: tailInnerRadius,
84
+ ry: tailInnerRadius,
85
+ xrot: 0,
86
+ largeArcFlag,
87
+ sweepFlag: 1,
88
+ x: arcRightBottom.x,
89
+ y: arcRightBottom.y
90
+ });
91
+
92
+ if (overlapsSelf) {
93
+ path = path
94
+ .lineto(arcRightMiddle.x, arcRightMiddle.y)
95
+ .lineto(arcRightMiddleOuter.x, arcRightMiddleOuter.y)
96
+ .lineto(arcRightMiddle.x, arcRightMiddle.y);
97
+ }
98
+ let textPath;
99
+ if (returnTextPath && hasLabel) {
100
+ if (labelNeedsFlip) {
101
+ const arcLeftTop = polarToSpecialCartesian(tailOuterRadius, 0);
102
+ textPath = Path().moveto(arcRightTop.x, arcRightTop.y).arc({
103
+ rx: tailOuterRadius,
104
+ ry: tailOuterRadius,
105
+ xrot: 0,
106
+ largeArcFlag,
107
+ sweepFlag: 0,
108
+ x: arcLeftTop.x,
109
+ y: arcLeftTop.y
110
+ });
111
+ } else {
112
+ const arcLeftBottom = polarToSpecialCartesian(tailInnerRadius, 0);
113
+ textPath = Path().moveto(arcLeftBottom.x, arcLeftBottom.y).arc({
114
+ rx: tailInnerRadius,
115
+ ry: tailInnerRadius,
116
+ xrot: 0,
117
+ largeArcFlag,
118
+ sweepFlag: 1,
119
+ x: arcRightBottom.x,
120
+ y: arcRightBottom.y
121
+ });
122
+ }
123
+ }
124
+ path = path
125
+
126
+ .lineto(arcRightTop.x, arcRightTop.y)
127
+ .arc({
128
+ rx: tailOuterRadius,
129
+ ry: tailOuterRadius,
130
+ xrot: 0,
131
+ largeArcFlag,
132
+ sweepFlag: 0,
133
+ x: arcLeftTop.x,
134
+ y: arcLeftTop.y
135
+ })
136
+ .lineto(arrowheadTop.x, arrowheadTop.y)
137
+ .closepath();
138
+ if (returnTextPath) {
139
+ return [path, textPath];
140
+ }
141
+ return path;
142
+ }
@@ -0,0 +1,3 @@
1
+ export default function getAngleForPositionMidpoint(position, maxLength) {
2
+ return maxLength === 0 ? 0 : (position + 0.5) / maxLength * Math.PI * 2;
3
+ }
@@ -0,0 +1,40 @@
1
+ import Color from "color";
2
+ import React from "react";
3
+
4
+ export function getInternalLabel({
5
+ ellipsizedName,
6
+ id,
7
+ annotationType,
8
+ revTransform,
9
+ angleAdjust,
10
+ isPart,
11
+ colorToUse,
12
+ textPath,
13
+ locationNumber
14
+ }) {
15
+ if (!ellipsizedName) return null;
16
+ const pathId = `${annotationType}${id}${locationNumber ?? ""}`;
17
+ return (
18
+ <>
19
+ <path id={pathId} fill="none" d={textPath.print()}></path>
20
+ <text
21
+ className="veLabelText veCircularViewInternalLabelText ve-monospace-font"
22
+ transform={
23
+ (revTransform || "") + (angleAdjust ? ` rotate(${angleAdjust})` : "")
24
+ }
25
+ fill={
26
+ isPart ? "#ac68cc" : Color(colorToUse).isDark() ? "white" : "black"
27
+ }
28
+ dy={-3}
29
+ >
30
+ <textPath
31
+ textAnchor="middle"
32
+ startOffset="50%"
33
+ xlinkHref={`#${pathId}`}
34
+ >
35
+ {ellipsizedName}
36
+ </textPath>
37
+ </text>
38
+ </>
39
+ );
40
+ }
@@ -0,0 +1,12 @@
1
+ import { getRangeAngles } from "@teselagen/range-utils";
2
+ export default function getRangeAnglesSpecial() {
3
+ const { endAngle, totalAngle, ...rest } = getRangeAngles.apply(
4
+ this,
5
+ arguments
6
+ );
7
+ return {
8
+ endAngle: endAngle - 0.00001, //we subtract a tiny amount because an angle of 2PI will cause nothing to be drawn!
9
+ totalAngle: totalAngle - 0.00001, //we subtract a tiny amount because we don't want the range comparisons to treat the same angle as overlapping
10
+ ...rest
11
+ };
12
+ }
@@ -0,0 +1,15 @@
1
+ export default function getYOffset(iTree, start, end) {
2
+ //get all potentially overlapping annotations
3
+
4
+ const potentiallyOverlappingAnnotations = iTree.search(start, end);
5
+ //we don't want to render the new annotation on top of any of these potentially overlapping annotations
6
+ const potentialPositionsForNewAnnotation =
7
+ potentiallyOverlappingAnnotations.map(() => true);
8
+ potentiallyOverlappingAnnotations.forEach(function (otherAnnotation) {
9
+ potentialPositionsForNewAnnotation[otherAnnotation.yOffset] = false;
10
+ });
11
+ //get first occurence of empty yOffset
12
+ const yOffset = potentialPositionsForNewAnnotation.indexOf(true);
13
+ //if there are no empty slots, make a new slot
14
+ return yOffset > -1 ? yOffset : potentialPositionsForNewAnnotation.length;
15
+ }
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ export interface CircularViewProps {
3
+ editorName: string, //the name of the editor instance (this should match what you've set up in your redux store)
4
+ maxAnnotationsToDisplay,
5
+ circularAndLinearTickSpacing: number,
6
+ spaceBetweenAnnotations: number, // default = 2,
7
+ annotationHeight: number, // default = 15,
8
+ hideName: boolean,
9
+ }
10
+
11
+ export interface maxAnnotationsToDisplay {
12
+ features: number,
13
+ primers: number,
14
+ // translations: number,
15
+ // parts: number,
16
+ orfs: number,
17
+ cutsites: number,
18
+ }
19
+
20
+ export default class CircularView extends React.Component <CircularViewProps> {}