@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,140 @@
1
+ import React from "react";
2
+ import {
3
+ InputField,
4
+ BPSelect,
5
+ TextareaField
6
+ } from "@teselagen/ui";
7
+ import { reduxForm } from "redux-form";
8
+ import withEditorProps from "../../withEditorProps";
9
+ import { compose } from "recompose";
10
+
11
+ class GeneralProperties extends React.Component {
12
+ updateSeqDesc = (val) => {
13
+ return this.props.sequenceDescriptionUpdate(val);
14
+ };
15
+ render() {
16
+ const {
17
+ readOnly,
18
+ showReadOnly = true,
19
+ updateCircular,
20
+ isProtein,
21
+ disableSetReadOnly,
22
+ updateAvailability,
23
+ sequenceData,
24
+ updateReadOnlyMode,
25
+ onSave,
26
+ showAvailability,
27
+ sequenceNameUpdate
28
+ } = this.props;
29
+ const {
30
+ description,
31
+ name,
32
+ isOligo,
33
+ isRna,
34
+ sequence = "",
35
+ proteinSequence = "",
36
+ circular,
37
+ materiallyAvailable
38
+ } = sequenceData || {};
39
+ return (
40
+ <React.Fragment>
41
+ <div className="ve-flex-row">
42
+ <div className="ve-column-left bp3-label">Name</div>{" "}
43
+ <div className="ve-column-right">
44
+ <InputField
45
+ disabled={readOnly}
46
+ onFieldSubmit={(val) => {
47
+ sequenceNameUpdate(val);
48
+ }}
49
+ name="name"
50
+ enableReinitialize
51
+ defaultValue={name}
52
+ />{" "}
53
+ </div>
54
+ </div>
55
+ {!isProtein && !isOligo && !isRna && (
56
+ <div className="ve-flex-row circularLinearSelect">
57
+ <div className="ve-column-left bp3-label">Circular/Linear</div>{" "}
58
+ <div className="ve-column-right">
59
+ {" "}
60
+ <BPSelect
61
+ disabled={readOnly}
62
+ onChange={(val) => {
63
+ updateCircular(val === "circular");
64
+ }}
65
+ value={circular ? "circular" : "linear"}
66
+ options={[
67
+ { label: "Circular", value: "circular" },
68
+ { label: "Linear", value: "linear" }
69
+ ]}
70
+ />
71
+ </div>
72
+ </div>
73
+ )}
74
+
75
+ {showAvailability && (
76
+ <div className="ve-flex-row">
77
+ <div className="ve-column-left bp3-label">
78
+ Material Availability
79
+ </div>{" "}
80
+ <div className="ve-column-right">
81
+ {" "}
82
+ <BPSelect
83
+ disabled={readOnly}
84
+ onChange={(val) => {
85
+ updateAvailability(val === "available");
86
+ }}
87
+ value={materiallyAvailable ? "available" : "unavailable"}
88
+ options={[
89
+ { label: "Available", value: "available" },
90
+ { label: "Unavailable", value: "unavailable" }
91
+ ]}
92
+ />
93
+ </div>
94
+ </div>
95
+ )}
96
+ <div className="ve-flex-row">
97
+ <div className="ve-column-left bp3-label">Length</div>{" "}
98
+ <div className="ve-column-right">
99
+ {" "}
100
+ {isProtein ? proteinSequence.length : sequence.length}
101
+ </div>
102
+ </div>
103
+ {showReadOnly && (
104
+ <div className="ve-flex-row">
105
+ <div className="ve-column-left bp3-label">Is Editable</div>{" "}
106
+ <div className="ve-column-right">
107
+ {" "}
108
+ <BPSelect
109
+ disabled={!onSave || disableSetReadOnly}
110
+ onChange={(val) => {
111
+ updateReadOnlyMode(val === "readOnly");
112
+ }}
113
+ value={readOnly ? "readOnly" : "editable"}
114
+ options={[
115
+ { label: "Read Only", value: "readOnly" },
116
+ { label: "Editable", value: "editable" }
117
+ ]}
118
+ />
119
+ </div>
120
+ </div>
121
+ )}
122
+ <div>Description</div>
123
+ <TextareaField
124
+ clickToEdit
125
+ name="description"
126
+ onFieldSubmit={this.updateSeqDesc}
127
+ defaultValue={description}
128
+ disabled={readOnly}
129
+ />
130
+ </React.Fragment>
131
+ );
132
+ }
133
+ }
134
+
135
+ export default compose(
136
+ withEditorProps,
137
+ reduxForm({
138
+ form: "GeneralProperties"
139
+ })
140
+ )(GeneralProperties);
@@ -0,0 +1,406 @@
1
+ import React from "react";
2
+ import {
3
+ DataTable,
4
+ withSelectedEntities,
5
+ CmdButton,
6
+ getTagProps,
7
+ getKeyedTagsAndTagOptions,
8
+ DropdownButton,
9
+ createCommandMenu,
10
+ popoverOverflowModifiers,
11
+ removeDuplicatesIcon
12
+ } from "@teselagen/ui";
13
+ import { map, upperFirst, pick, startCase, isFunction } from "lodash";
14
+ import {
15
+ AnchorButton,
16
+ ButtonGroup,
17
+ Icon,
18
+ Menu,
19
+ Tag,
20
+ Tooltip
21
+ } from "@blueprintjs/core";
22
+ import { getRangeLength } from "@teselagen/range-utils";
23
+ // import { Popover } from "@blueprintjs/core";
24
+ // import ColorPicker from "./ColorPicker";
25
+ import { connectToEditor } from "../../withEditorProps";
26
+ import { compose } from "recompose";
27
+ import commands from "../../commands";
28
+ import { sizeSchema } from "./utils";
29
+ import { showAddOrEditAnnotationDialog } from "../../GlobalDialogUtils";
30
+ import { typeField } from "./typeField";
31
+ import { getSequenceWithinRange } from "@teselagen/range-utils";
32
+ import { getReverseComplementSequenceString } from "@teselagen/sequence-utils";
33
+
34
+ const genericAnnotationProperties = ({
35
+ annotationType,
36
+ noType,
37
+ visSubmenu,
38
+ withTags,
39
+ withBases,
40
+ additionalFooterEls
41
+ }) => {
42
+ const annotationTypeUpper = upperFirst(annotationType);
43
+ class AnnotationProperties extends React.Component {
44
+ constructor(props) {
45
+ super(props);
46
+ this.commands = commands(this);
47
+ this.schema = {
48
+ fields: [
49
+ {
50
+ path: "name",
51
+ type: "string",
52
+
53
+ render: (name, ann, row, props) => {
54
+ const checked =
55
+ !props.annotationVisibility[
56
+ `${annotationType}IndividualToHide`
57
+ ][ann.id];
58
+
59
+ return (
60
+ <>
61
+ <Icon
62
+ data-tip="Hide/Show"
63
+ onClick={(e) => {
64
+ e.stopPropagation();
65
+ const upperType = startCase(annotationType);
66
+ if (checked) {
67
+ props[`hide${upperType}Individual`]([ann.id]);
68
+ } else {
69
+ props[`show${upperType}Individual`]([ann.id]);
70
+ }
71
+ }}
72
+ style={{
73
+ cursor: "pointer",
74
+ marginRight: 4,
75
+ marginTop: 3,
76
+ color: "darkgray"
77
+ }}
78
+ icon={`eye-${checked ? "open" : "off"}`}
79
+ ></Icon>
80
+ {name}
81
+ </>
82
+ );
83
+ }
84
+ },
85
+
86
+ ...(!withBases
87
+ ? []
88
+ : [
89
+ {
90
+ path: "bases",
91
+ type: "string",
92
+ render: (bases, primer, row, props) => {
93
+ let bps = bases;
94
+ if (!bases) {
95
+ bps = getSequenceWithinRange(primer, props.sequence);
96
+ if (!primer.forward) {
97
+ bps = getReverseComplementSequenceString(bps);
98
+ }
99
+ }
100
+ return bps;
101
+ }
102
+ }
103
+ ]),
104
+ ...(noType
105
+ ? []
106
+ : [
107
+ typeField,
108
+ {
109
+ path: "color",
110
+ type: "string",
111
+ width: 50,
112
+ render: (color) => {
113
+ return (
114
+ <div
115
+ style={{ height: 20, width: 20, background: color }}
116
+ />
117
+ // <ColorPickerPopover>
118
+ // <div style={{ height: 20, width: 20, background: color }} />
119
+ // </ColorPickerPopover>
120
+ );
121
+ }
122
+ }
123
+ ]),
124
+ sizeSchema,
125
+ ...(withTags && this.props.allPartTags
126
+ ? [
127
+ {
128
+ path: "tags",
129
+ type: "string",
130
+ getValueToFilterOn: (o, { keyedPartTags }) => {
131
+ const toRet = (o.tags || [])
132
+ .map((tagId) => {
133
+ const tag = keyedPartTags[tagId];
134
+ if (!tag) return "";
135
+ return tag.label;
136
+ })
137
+ .join(" ");
138
+ return toRet;
139
+ },
140
+ render: (tags, b, c, { keyedPartTags = {} }) => {
141
+ return (
142
+ <div style={{ display: "flex" }}>
143
+ {(tags || []).map((tagId, i) => {
144
+ const tag = keyedPartTags[tagId];
145
+ if (!tag) return null;
146
+ return <Tag key={i} {...getTagProps(tag)}></Tag>;
147
+ })}
148
+ </div>
149
+ );
150
+ }
151
+ }
152
+ ]
153
+ : []),
154
+ { path: "strand", type: "number" }
155
+ ]
156
+ };
157
+ }
158
+ onRowSelect = ([record]) => {
159
+ if (!record) return;
160
+ const { dispatch, editorName } = this.props;
161
+ dispatch({
162
+ type: "SELECTION_LAYER_UPDATE",
163
+ payload: record,
164
+ meta: {
165
+ editorName
166
+ }
167
+ });
168
+ };
169
+ render() {
170
+ const {
171
+ readOnly,
172
+ annotations = {},
173
+ annotationVisibility,
174
+ sequenceLength,
175
+ selectionLayer,
176
+ sequence,
177
+ isProtein,
178
+ allPartTags,
179
+ annotationPropertiesSelectedEntities:
180
+ _annotationPropertiesSelectedEntities,
181
+ selectedAnnotationId
182
+ } = this.props;
183
+ const annotationPropertiesSelectedEntities =
184
+ _annotationPropertiesSelectedEntities.filter((a) => annotations[a.id]);
185
+
186
+ const deleteAnnotation = this.props[`delete${annotationTypeUpper}`];
187
+
188
+ const annotationsToUse = map(annotations, (annotation) => {
189
+ return {
190
+ ...annotation,
191
+ ...(annotation.strand === undefined && {
192
+ strand: annotation.forward ? 1 : -1
193
+ }),
194
+ size: getRangeLength(annotation, sequenceLength)
195
+ };
196
+ });
197
+
198
+ return (
199
+ <DataTable
200
+ topLeftItems={getVisFilter(
201
+ createCommandMenu(
202
+ isFunction(visSubmenu) ? visSubmenu(this.props) : visSubmenu,
203
+ this.commands,
204
+ {
205
+ useTicks: true
206
+ }
207
+ )
208
+ )}
209
+ annotationPropertiesSelectedEntities={
210
+ annotationPropertiesSelectedEntities
211
+ }
212
+ leftOfSearchBarItems={
213
+ <>
214
+ {!readOnly && (
215
+ <ButtonGroup style={{ marginTop: 3, marginRight: 4 }}>
216
+ <Tooltip
217
+ position="top"
218
+ modifiers={popoverOverflowModifiers}
219
+ content="New"
220
+ >
221
+ <AnchorButton
222
+ disabled={!sequenceLength}
223
+ icon="plus"
224
+ className="tgNewAnnBtn"
225
+ onClick={() => {
226
+ showAddOrEditAnnotationDialog({
227
+ type: annotationType,
228
+ annotation: pick(
229
+ selectionLayer,
230
+ "start",
231
+ "end",
232
+ "forward"
233
+ )
234
+ });
235
+ }}
236
+ ></AnchorButton>
237
+ </Tooltip>
238
+ <Tooltip
239
+ position="top"
240
+ modifiers={popoverOverflowModifiers}
241
+ content="Edit"
242
+ >
243
+ <AnchorButton
244
+ onClick={() => {
245
+ showAddOrEditAnnotationDialog({
246
+ type: annotationType,
247
+ annotation: annotationPropertiesSelectedEntities[0]
248
+ });
249
+ }}
250
+ disabled={
251
+ annotationPropertiesSelectedEntities.length !== 1
252
+ }
253
+ icon="edit"
254
+ ></AnchorButton>
255
+ </Tooltip>
256
+
257
+ {["feature"].includes(annotationType) && (
258
+ <CmdButton
259
+ text=""
260
+ icon="cog"
261
+ data-tip="Configure Feature Types"
262
+ cmd={this.commands.onConfigureFeatureTypesClick}
263
+ />
264
+ )}
265
+ {["part", "primer", "feature"].includes(annotationType) && (
266
+ <CmdButton
267
+ text=""
268
+ icon={removeDuplicatesIcon}
269
+ data-tip="Remove Duplicates"
270
+ cmd={
271
+ this.commands[
272
+ `showRemoveDuplicatesDialog${
273
+ annotationTypeUpper + "s"
274
+ }`
275
+ ]
276
+ }
277
+ />
278
+ )}
279
+
280
+ {additionalFooterEls && additionalFooterEls(this.props)}
281
+ <Tooltip
282
+ position="top"
283
+ modifiers={popoverOverflowModifiers}
284
+ content="Delete"
285
+ >
286
+ <AnchorButton
287
+ onClick={() => {
288
+ deleteAnnotation(
289
+ annotationPropertiesSelectedEntities
290
+ );
291
+ }}
292
+ className="tgDeleteAnnsBtn"
293
+ intent="danger"
294
+ disabled={!annotationPropertiesSelectedEntities.length}
295
+ icon="trash"
296
+ ></AnchorButton>
297
+ </Tooltip>
298
+ </ButtonGroup>
299
+ )}
300
+ {/* {createCommandMenu(
301
+ {
302
+ cmd: "featureFilterIndividualCmd",
303
+ // text: 'hahah',
304
+ shouldDismissPopover: false
305
+ },
306
+ this.commands,
307
+ {
308
+ useTicks: true
309
+ }
310
+ )} */}
311
+ {/* <CmdCheckbox
312
+ prefix="Show "
313
+ cmd={this.commands.featureFilterIndividualCmd}
314
+ /> */}
315
+ </>
316
+ }
317
+ onDoubleClick={(annotation) => {
318
+ showAddOrEditAnnotationDialog({
319
+ type: annotationType,
320
+ annotation
321
+ });
322
+ }}
323
+ withCheckboxes
324
+ showFeatureIndividual={this.props.showFeatureIndividual} //we need to pass this in order to force the DT to rerenderannotationVisibility={annotationVisibility}
325
+ hideFeatureIndividual={this.props.hideFeatureIndividual} //we need to pass this in order to force the DT to rerenderannotationVisibility={annotationVisibility}
326
+ showPartIndividual={this.props.showPartIndividual} //we need to pass this in order to force the DT to rerenderannotationVisibility={annotationVisibility}
327
+ hidePartIndividual={this.props.hidePartIndividual} //we need to pass this in order to force the DT to rerenderannotationVisibility={annotationVisibility}
328
+ showPrimerIndividual={this.props.showPrimerIndividual} //we need to pass this in order to force the DT to rerenderannotationVisibility={annotationVisibility}
329
+ hidePrimerIndividual={this.props.hidePrimerIndividual} //we need to pass this in order to force the DT to rerenderannotationVisibility={annotationVisibility}
330
+ annotationVisibility={annotationVisibility} //we need to pass this in order to force the DT to rerenderannotationVisibility={annotationVisibility}
331
+ featureLengthsToHide={this.props.featureLengthsToHide} //we need to pass this in order to force the DT to rerenderannotationVisibility={annotationVisibility}
332
+ primerLengthsToHide={this.props.primerLengthsToHide} //we need to pass this in order to force the DT to rerenderannotationVisibility={annotationVisibility}
333
+ partLengthsToHide={this.props.partLengthsToHide} //we need to pass this in order to force the DT to rerenderannotationVisibility={annotationVisibility}
334
+ sequence={sequence} //we need to pass this in order to force the DT to rerenderannotationVisibility={annotationVisibility}
335
+ noPadding
336
+ noFullscreenButton
337
+ onRowSelect={this.onRowSelect}
338
+ selectedIds={selectedAnnotationId}
339
+ formName="annotationProperties"
340
+ noRouter
341
+ isProtein={isProtein}
342
+ keyedPartTags={getKeyedTagsAndTagOptions(allPartTags)}
343
+ compact
344
+ isInfinite
345
+ schema={this.schema}
346
+ entities={annotationsToUse}
347
+ />
348
+ );
349
+ }
350
+ }
351
+
352
+ return compose(
353
+ connectToEditor(
354
+ ({
355
+ readOnly,
356
+ annotationVisibility = {},
357
+ sequenceData,
358
+ selectionLayer,
359
+ featureLengthsToHide,
360
+ primerLengthsToHide,
361
+ partLengthsToHide
362
+ }) => {
363
+ return {
364
+ annotationVisibility,
365
+ selectionLayer,
366
+ readOnly,
367
+ featureLengthsToHide,
368
+ primerLengthsToHide,
369
+ partLengthsToHide,
370
+ sequenceData,
371
+ sequence: sequenceData.sequence,
372
+ annotations: sequenceData[annotationType + "s"],
373
+ [annotationType + "s"]: sequenceData[annotationType + "s"],
374
+ sequenceLength: sequenceData.sequence.length
375
+ };
376
+ }
377
+ ),
378
+ // withEditorProps,
379
+ withSelectedEntities("annotationProperties")
380
+ )(AnnotationProperties);
381
+ };
382
+
383
+ export default genericAnnotationProperties;
384
+
385
+ // const ColorPickerPopover = ({ readOnly, onColorSelect, children }) => {
386
+ // return (
387
+ // <Popover
388
+ // disabled={readOnly}
389
+ // content={<ColorPicker onColorSelect={onColorSelect} />}
390
+ // >
391
+ // {children}
392
+ // </Popover>
393
+ // );
394
+ // };
395
+
396
+ export function getVisFilter(submenu) {
397
+ return (
398
+ <DropdownButton
399
+ style={{ marginTop: 3 }}
400
+ icon="eye-open"
401
+ className="propertiesVisFilter"
402
+ data-tip="Visibility Filter"
403
+ menu={<Menu>{submenu}</Menu>}
404
+ ></DropdownButton>
405
+ );
406
+ }
@@ -0,0 +1,117 @@
1
+ import React from "react";
2
+ import {
3
+ DataTable,
4
+ withSelectedEntities,
5
+ createCommandMenu
6
+ } from "@teselagen/ui";
7
+ import { map } from "lodash";
8
+ // import { Button } from "@blueprintjs/core";
9
+ import { getRangeLength } from "@teselagen/range-utils";
10
+ import { getOrfColor } from "../../constants/orfFrameToColorMap";
11
+ import { connectToEditor } from "../../withEditorProps";
12
+ import { compose } from "recompose";
13
+ import selectors from "../../selectors";
14
+
15
+ import getCommands from "../../commands";
16
+ import { sizeSchema } from "./utils";
17
+ import { orfsSubmenu } from "../../MenuBar/viewSubmenu";
18
+ import { getVisFilter } from "./GenericAnnotationProperties";
19
+
20
+ class OrfProperties extends React.Component {
21
+ constructor(props) {
22
+ super(props);
23
+ this.commands = getCommands(this);
24
+ }
25
+ onRowSelect = ([record]) => {
26
+ if (!record) return;
27
+ const { dispatch, editorName } = this.props;
28
+ dispatch({
29
+ type: "SELECTION_LAYER_UPDATE",
30
+ payload: record,
31
+ meta: {
32
+ editorName
33
+ }
34
+ });
35
+ };
36
+ render() {
37
+ const { orfs, sequenceLength, annotationVisibility } = this.props;
38
+ const orfsToUse = map(orfs, (orf) => {
39
+ return {
40
+ ...orf,
41
+ color: getOrfColor(orf),
42
+ frame: orf.frame + 1,
43
+ ...(orf.strand === undefined && {
44
+ strand: orf.forward ? 1 : -1
45
+ }),
46
+ size: getRangeLength(orf, sequenceLength),
47
+ sizeAa: Math.floor(getRangeLength(orf, sequenceLength) / 3 - 1)
48
+ };
49
+ });
50
+ return (
51
+ <React.Fragment>
52
+ <DataTable
53
+ topLeftItems={getVisFilter(
54
+ createCommandMenu(orfsSubmenu, this.commands, {
55
+ useTicks: true
56
+ })
57
+ )}
58
+ annotationVisibility={annotationVisibility} //we need to pass this in order to force the DT to rerender
59
+ noPadding
60
+ noFullscreenButton
61
+ onRowSelect={this.onRowSelect}
62
+ withSearch={false}
63
+ formName="orfProperties"
64
+ noRouter
65
+ compact
66
+ isInfinite
67
+ schema={{
68
+ fields: [
69
+ {
70
+ path: "color",
71
+ type: "string",
72
+ render: (color) => {
73
+ return (
74
+ <div style={{ height: 20, width: 20, background: color }} />
75
+ );
76
+ }
77
+ },
78
+ {
79
+ path: "sizeAa",
80
+ displayName: "Size (aa)",
81
+ type: "number"
82
+ },
83
+ sizeSchema,
84
+ { path: "frame", type: "number" },
85
+ { path: "strand", type: "number" }
86
+ ]
87
+ }}
88
+ entities={orfsToUse}
89
+ />
90
+ <br />
91
+ </React.Fragment>
92
+ );
93
+ }
94
+ }
95
+
96
+ export default compose(
97
+ connectToEditor((editorState) => {
98
+ const {
99
+ readOnly,
100
+ annotationVisibility = {},
101
+ sequenceData: { sequence = "" } = {},
102
+ sequenceData,
103
+ minimumOrfSize,
104
+ useAdditionalOrfStartCodons
105
+ } = editorState;
106
+ return {
107
+ readOnly,
108
+ annotationVisibility,
109
+ useAdditionalOrfStartCodons,
110
+ orfs: selectors.orfsSelector(editorState),
111
+ sequenceLength: sequence.length,
112
+ sequenceData,
113
+ minimumOrfSize
114
+ };
115
+ }),
116
+ withSelectedEntities("orfProperties")
117
+ )(OrfProperties);
@@ -0,0 +1,9 @@
1
+ import { partsSubmenu } from "../../MenuBar/viewSubmenu";
2
+ import genericAnnotationProperties from "./GenericAnnotationProperties";
3
+ export default genericAnnotationProperties({
4
+ annotationType: "part",
5
+ noColor: true,
6
+ visSubmenu: partsSubmenu,
7
+ withTags: true,
8
+ noType: true
9
+ });
@@ -0,0 +1,19 @@
1
+ import { Button } from "@blueprintjs/core";
2
+ import React from "react";
3
+ import { primersSubmenu } from "../../MenuBar/viewSubmenu";
4
+
5
+ import genericAnnotationProperties from "./GenericAnnotationProperties";
6
+ export default genericAnnotationProperties({
7
+ annotationType: "primer",
8
+ noColor: true,
9
+ visSubmenu: primersSubmenu,
10
+ noType: true,
11
+ withBases: true,
12
+ additionalFooterEls: (props) => {
13
+ return (
14
+ <Button onClick={props.createNewPCR} intent="success">
15
+ Simulate PCR
16
+ </Button>
17
+ );
18
+ }
19
+ });