@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,194 @@
1
+ import React from "react";
2
+ import { reduxForm } from "redux-form";
3
+
4
+ import {
5
+ wrapDialog,
6
+ DataTable,
7
+ withSelectedEntities,
8
+ SwitchField,
9
+ tgFormValues
10
+ } from "@teselagen/ui";
11
+ import { compose } from "redux";
12
+ import { Button, Classes, Popover } from "@blueprintjs/core";
13
+ import classNames from "classnames";
14
+
15
+ import withEditorProps from "../../withEditorProps";
16
+ import { forEach, camelCase, startCase } from "lodash";
17
+ import { sizeSchema } from "../PropertiesDialog/utils";
18
+ import { getRangeLength } from "@teselagen/range-utils";
19
+
20
+ const schema = {
21
+ fields: [
22
+ // ...(noColor
23
+ // ? []
24
+ // : [
25
+ // {
26
+ // path: "color",
27
+ // type: "string",
28
+ // render: color => {
29
+ // return (
30
+ // <ColorPickerPopover>
31
+ // <div style={{ height: 20, width: 20, background: color }} />
32
+ // </ColorPickerPopover>
33
+ // );
34
+ // }
35
+ // }
36
+ // ]),
37
+ { path: "name", type: "string" },
38
+ // ...(noType ? [] : [{ path: "type", type: "string" }]),
39
+ sizeSchema,
40
+ { path: "strand", type: "string" }
41
+ ]
42
+ };
43
+
44
+ class RemoveDuplicatesDialog extends React.Component {
45
+ state = {
46
+ dups: []
47
+ };
48
+ componentDidMount() {
49
+ this.recomputeDups();
50
+ }
51
+
52
+ checkboxStyle = { marginTop: 0, marginBottom: 0 };
53
+
54
+ delayedRecomputeDups = () => {
55
+ setTimeout(() => {
56
+ this.recomputeDups();
57
+ });
58
+ };
59
+ recomputeDups = () => {
60
+ const {
61
+ // hideModal,
62
+ type,
63
+ sequenceData = { sequence: "" },
64
+ // handleSubmit,
65
+ sequenceLength,
66
+ ignoreName,
67
+ ignoreStrand,
68
+ ignoreStartAndEnd
69
+ // circular,
70
+ // upsertFeature
71
+ } = this.props;
72
+
73
+ const annotations = sequenceData[type];
74
+ const dups = [];
75
+ const seqsHashByStartEndStrandName = {};
76
+ forEach(annotations, (a) => {
77
+ const hash = `${ignoreStartAndEnd ? "" : a.start}&${
78
+ ignoreStartAndEnd ? "" : a.end
79
+ }&${ignoreStrand ? "" : a.strand}&${ignoreName ? "" : a.name}`;
80
+ if (seqsHashByStartEndStrandName[hash]) {
81
+ dups.push({ ...a, size: getRangeLength(a, sequenceLength) });
82
+ } else {
83
+ seqsHashByStartEndStrandName[hash] = true;
84
+ }
85
+ });
86
+ this.setState({ dups });
87
+ };
88
+ render() {
89
+ const { duplicatesToRemoveSelectedEntities, hideModal, type } = this.props;
90
+
91
+ const selectedIds = this.state.dups.map((d) => d.id);
92
+ // const sequenceLength = sequenceData.sequence.length;
93
+ // const isCirc = (this.state || {}).circular;
94
+ return (
95
+ <div className={classNames(Classes.DIALOG_BODY, "tg-min-width-dialog")}>
96
+ {/* {dups.map((d) => {
97
+ return <div>
98
+
99
+ </div>
100
+ })} */}
101
+ <DataTable
102
+ noPadding
103
+ withCheckboxes
104
+ noFullscreenButton
105
+ // onRowSelect={this.onRowSelect}
106
+ maxHeight={400}
107
+ selectedIds={selectedIds}
108
+ formName="duplicatesToRemove"
109
+ noRouter
110
+ noRowsFoundMessage="No duplicates found"
111
+ compact
112
+ noHeader
113
+ noFooter
114
+ withSearch={false}
115
+ hideSelectedCount
116
+ isInfinite
117
+ schema={schema}
118
+ entities={this.state.dups}
119
+ />
120
+ <div
121
+ style={{
122
+ marginTop: 10,
123
+ display: "flex",
124
+ justifyContent: "space-between"
125
+ }}
126
+ >
127
+ <Popover
128
+ target={<Button icon="settings" />}
129
+ content={
130
+ <div style={{ padding: 20, maxWidth: 250 }}>
131
+ <div>Ignore These Fields While Finding Duplicates:</div>
132
+ <br></br>
133
+ <SwitchField
134
+ containerStyle={{ marginBottom: 2 }}
135
+ //delay the call to recompute dups until redux has had time to update
136
+ onFieldSubmit={this.delayedRecomputeDups}
137
+ style={this.checkboxStyle}
138
+ name="ignoreName"
139
+ label="Name"
140
+ ></SwitchField>
141
+ <SwitchField
142
+ containerStyle={{ marginBottom: 2 }}
143
+ //delay the call to recompute dups until redux has had time to update
144
+ onFieldSubmit={this.delayedRecomputeDups}
145
+ style={this.checkboxStyle}
146
+ name="ignoreStrand"
147
+ label="Strand"
148
+ ></SwitchField>
149
+ <SwitchField
150
+ containerStyle={{ marginBottom: 2 }}
151
+ //delay the call to recompute dups until redux has had time to update
152
+ onFieldSubmit={this.delayedRecomputeDups}
153
+ style={this.checkboxStyle}
154
+ name="ignoreStartAndEnd"
155
+ label="Start and End"
156
+ ></SwitchField>
157
+ </div>
158
+ }
159
+ ></Popover>
160
+
161
+ <Button
162
+ intent="primary"
163
+ onClick={() => {
164
+ this.props[camelCase(`delete_${type}`).slice(0, -1)](
165
+ duplicatesToRemoveSelectedEntities.map((d) => d.id)
166
+ );
167
+ window.toastr.success(
168
+ `Successfully Deleted ${
169
+ duplicatesToRemoveSelectedEntities.length
170
+ } ${startCase(type)}`
171
+ );
172
+ hideModal();
173
+ }}
174
+ disabled={!(duplicatesToRemoveSelectedEntities || []).length}
175
+ >
176
+ Remove {duplicatesToRemoveSelectedEntities.length} Duplicates
177
+ </Button>
178
+ </div>
179
+ </div>
180
+ );
181
+ }
182
+ }
183
+
184
+ export default compose(
185
+ wrapDialog(),
186
+ withEditorProps,
187
+
188
+ withSelectedEntities("duplicatesToRemove"),
189
+
190
+ reduxForm({
191
+ form: "RemoveDuplicatesDialog"
192
+ }),
193
+ tgFormValues("ignoreName", "ignoreStrand", "ignoreStartAndEnd")
194
+ )(RemoveDuplicatesDialog);
@@ -0,0 +1,7 @@
1
+ import createSimpleDialog from "./createSimpleDialog";
2
+
3
+ export default createSimpleDialog({
4
+ formName: "renameSequenceDialog",
5
+ fields: [{ name: "newName", isRequired: true }],
6
+ withDialogProps: { title: "Rename Sequence", height: 190 }
7
+ });
@@ -0,0 +1,150 @@
1
+ import { convertRangeTo0Based } from "@teselagen/range-utils";
2
+ import classNames from "classnames";
3
+ import React from "react";
4
+
5
+ import { reduxForm } from "redux-form";
6
+ import { tgFormValues, wrapDialog } from "@teselagen/ui";
7
+ import { compose } from "redux";
8
+ import { Button, Intent, Classes } from "@blueprintjs/core";
9
+
10
+ import { NumericInputField } from "@teselagen/ui";
11
+ import { get } from "lodash";
12
+ import { getRangeLength } from "@teselagen/range-utils";
13
+ import { tryToRefocusEditor } from "../utils/editorUtils";
14
+
15
+ // Single validation function - from & to have the same range
16
+ const validate = (val, vals, props) => {
17
+ const { min, max } = get(props, "extraProps.from", {});
18
+ const circular = get(props, "extraProps.circular");
19
+ if ((min && val < min) || (max && val > max)) {
20
+ return "Invalid position";
21
+ }
22
+ if (!circular && Number(vals.from) > Number(vals.to)) {
23
+ return "Wrong from/to order";
24
+ }
25
+ };
26
+ // const selector = formValueSelector("selectDialog");
27
+ export default compose(
28
+ wrapDialog({
29
+ isDraggable: true,
30
+ width: 400,
31
+ title: "Select Range",
32
+ height: 270,
33
+ onCloseHook: tryToRefocusEditor
34
+ }),
35
+ reduxForm({
36
+ form: "selectDialog"
37
+ }),
38
+ tgFormValues("from", "to")
39
+ )(
40
+ class SelectDialog extends React.Component {
41
+ updateTempHighlight =
42
+ ({ isStart, isEnd } = {}) =>
43
+ (val) => {
44
+ const { selectionLayerUpdate, from, to, invalid } = this.props;
45
+ if (invalid) return;
46
+ selectionLayerUpdate(
47
+ convertRangeTo0Based({
48
+ start: isStart ? Math.round(val) : from,
49
+ end: isEnd ? Math.round(val) : to
50
+ })
51
+ );
52
+ };
53
+ componentDidMount() {
54
+ const { from, to, initialCaretPosition } = this.props;
55
+ this.initialSelection = { from, to, initialCaretPosition };
56
+ this.updateTempHighlight()();
57
+ }
58
+ render() {
59
+ const {
60
+ hideModal,
61
+ onSubmit,
62
+ selectionLayerUpdate,
63
+ from,
64
+ to,
65
+ initialCaretPosition,
66
+ caretPositionUpdate,
67
+ sequenceLength,
68
+ extraProps,
69
+ isProtein,
70
+ invalid,
71
+ handleSubmit
72
+ } = this.props;
73
+ const selectionLength = getRangeLength(
74
+ {
75
+ start: Number(from),
76
+ end: Number(to)
77
+ },
78
+ sequenceLength
79
+ );
80
+
81
+ return (
82
+ <form
83
+ onSubmit={handleSubmit((data) => {
84
+ if (onSubmit) onSubmit(data);
85
+ hideModal();
86
+ tryToRefocusEditor();
87
+ })}
88
+ className={classNames(
89
+ Classes.DIALOG_BODY,
90
+ "tg-min-width-dialog simple-dialog"
91
+ )}
92
+ >
93
+ <NumericInputField
94
+ autoFocus
95
+ minorStepSize={1}
96
+ label="From:"
97
+ clampValueOnBlur
98
+ {...extraProps.to}
99
+ validate={validate}
100
+ //tnrtodo this normalization will actually work when https://github.com/palantir/blueprint/issues/3553 gets resolved
101
+ normalize={normalizeToInt}
102
+ onAnyNumberChange={this.updateTempHighlight({ isStart: true })}
103
+ name="from"
104
+ />
105
+ <NumericInputField
106
+ label="To:"
107
+ clampValueOnBlur
108
+ minorStepSize={1}
109
+ {...extraProps.from}
110
+ validate={validate}
111
+ normalize={normalizeToInt}
112
+ onAnyNumberChange={this.updateTempHighlight({ isEnd: true })}
113
+ name="to"
114
+ />
115
+ <div className="dialog-buttons">
116
+ <Button
117
+ onClick={() => {
118
+ if (initialCaretPosition > -1) {
119
+ caretPositionUpdate(initialCaretPosition);
120
+ } else {
121
+ selectionLayerUpdate({
122
+ start: this.initialSelection.from,
123
+ end: this.initialSelection.to
124
+ });
125
+ }
126
+ hideModal();
127
+ tryToRefocusEditor();
128
+ }}
129
+ text="Cancel"
130
+ />
131
+ <Button
132
+ type="submit"
133
+ intent={Intent.PRIMARY}
134
+ text={`Select ${invalid ? 0 : selectionLength} ${
135
+ isProtein ? "AA" : "BP"
136
+ }${selectionLength === 1 ? "" : "s"}`}
137
+ disabled={invalid}
138
+ />
139
+ </div>
140
+ </form>
141
+ );
142
+ }
143
+ }
144
+ );
145
+
146
+ const normalizeToInt = (val) => {
147
+ const int = Math.round(val);
148
+ const normalizedVal = `${int >= 0 ? int : 1}`;
149
+ return normalizedVal;
150
+ };
@@ -0,0 +1,5 @@
1
+ .small-slider .bp3-slider-handle {
2
+ width: 12px;
3
+ height: 12px;
4
+ top: 2px;
5
+ }
@@ -0,0 +1,134 @@
1
+ import React from "react";
2
+ import { Icon, Slider, Intent } from "@blueprintjs/core";
3
+ import { preventDefaultStopPropagation } from "../utils/editorUtils";
4
+ import { clamp, isNumber } from "lodash";
5
+ import "./UncontrolledSliderWithPlusMinusBtns.css";
6
+
7
+ export default class UncontrolledSliderWithPlusMinusBtns extends React.Component {
8
+ state = { value: 0 };
9
+
10
+ static getDerivedStateFromProps(nextProps, prevState) {
11
+ if (
12
+ nextProps.justUpdateInitialValOnce &&
13
+ prevState.oldInitialValue !== undefined
14
+ ) {
15
+ return null;
16
+ }
17
+ //potentially coerce the initial value coming in
18
+ if (prevState.oldInitialValue !== nextProps.initialValue) {
19
+ const val = nextProps.coerceInitialValue
20
+ ? nextProps.coerceInitialValue(nextProps)
21
+ : nextProps.initialValue;
22
+ return {
23
+ value: val, //set the state value if a new initial value comes in!
24
+ oldInitialValue: nextProps.initialValue
25
+ };
26
+ } else {
27
+ return null;
28
+ }
29
+ }
30
+
31
+ render() {
32
+ const { value } = this.state;
33
+ const {
34
+ noWraparound,
35
+ title,
36
+ initialValue,
37
+ label,
38
+ passedRef,
39
+ clickStepSize,
40
+ style,
41
+ onClick,
42
+ smallSlider,
43
+ bindOutsideChangeHelper,
44
+ className,
45
+ ...rest
46
+ } = this.props;
47
+ const { min, max } = this.props;
48
+
49
+ const stepSize = this.props.stepSize || (max - min) / 10;
50
+ if (bindOutsideChangeHelper) {
51
+ bindOutsideChangeHelper.triggerChange = (fn) => {
52
+ const valToPass =
53
+ isNumber(value) && !isNaN(value) ? value : initialValue;
54
+ return fn({
55
+ value: valToPass,
56
+ changeValue: (newVal) => {
57
+ const newnew = clamp(newVal, min, max);
58
+ this.setState({ value: newnew });
59
+ this.props.onChange && this.props.onChange(newnew);
60
+ this.props.onRelease && this.props.onRelease(newnew);
61
+ }
62
+ });
63
+ };
64
+ }
65
+ return (
66
+ <div
67
+ className={`${className} ${smallSlider ? "small-slider" : ""}`}
68
+ onClick={(e) => {
69
+ onClick && onClick(e);
70
+ preventDefaultStopPropagation(e);
71
+ }}
72
+ ref={passedRef}
73
+ onDrag={preventDefaultStopPropagation}
74
+ onDragStart={preventDefaultStopPropagation}
75
+ onDragEnd={preventDefaultStopPropagation}
76
+ onMouseDown={preventDefaultStopPropagation}
77
+ // onMouseUp={preventDefaultStopPropagation} //tnr: commenting this out because it was breaking sliders onRelease
78
+ title={title}
79
+ style={{ ...style, display: "flex", marginLeft: 15, marginRight: 20 }}
80
+ >
81
+ <Icon
82
+ onClick={() => {
83
+ let newVal = value - (clickStepSize || stepSize);
84
+ if (newVal < min) {
85
+ if (noWraparound) {
86
+ newVal = min;
87
+ } else {
88
+ newVal = max - (clickStepSize || stepSize);
89
+ }
90
+ }
91
+ this.setState({
92
+ value: newVal
93
+ });
94
+ this.props.onChange(newVal);
95
+ this.props.onRelease && this.props.onRelease(newVal);
96
+ }}
97
+ style={{ cursor: "pointer", marginRight: 8 }}
98
+ intent={Intent.PRIMARY}
99
+ icon={this.props.leftIcon || "minus"}
100
+ />
101
+ <Slider
102
+ {...{ ...rest, value }}
103
+ onRelease={(newVal) =>
104
+ this.props.onRelease && this.props.onRelease(newVal)
105
+ }
106
+ onChange={(value) => {
107
+ this.setState({ value });
108
+ this.props.onChange && this.props.onChange(value);
109
+ }}
110
+ />
111
+ <Icon
112
+ onClick={() => {
113
+ let newVal = value + (clickStepSize || stepSize);
114
+ if (newVal > max) {
115
+ if (noWraparound) {
116
+ newVal = max;
117
+ } else {
118
+ newVal = min + (clickStepSize || stepSize);
119
+ }
120
+ }
121
+ this.setState({
122
+ value: newVal
123
+ });
124
+ this.props.onChange(newVal);
125
+ this.props.onRelease && this.props.onRelease(newVal);
126
+ }}
127
+ style={{ cursor: "pointer", marginLeft: 8 }}
128
+ intent={Intent.PRIMARY}
129
+ icon={this.props.rightIcon || "plus"}
130
+ />
131
+ </div>
132
+ );
133
+ }
134
+ }
@@ -0,0 +1,22 @@
1
+ import React from "react";
2
+ import { Icon, Tooltip } from "@blueprintjs/core";
3
+ import "./style.css";
4
+
5
+ function VeWarning(props) {
6
+ const { message, tooltip, ...rest } = props;
7
+ return (
8
+ <div className="veWarningMessage" {...rest}>
9
+ <Tooltip
10
+ position="bottom"
11
+ intent="warning"
12
+ popoverClassName="bp3-popover-content-sizing"
13
+ content={tooltip}
14
+ >
15
+ <Icon size={20} intent="warning" icon="warning-sign" />
16
+ </Tooltip>
17
+ {message}
18
+ </div>
19
+ );
20
+ }
21
+
22
+ export default VeWarning;
@@ -0,0 +1,10 @@
1
+ .veWarningMessage {
2
+ /* color: red; */
3
+ display: flex;
4
+ justify-content: center;
5
+ align-items: center;
6
+ font-size: 13px;
7
+ }
8
+ .veWarningMessage svg {
9
+ margin-right: 10px;
10
+ }
@@ -0,0 +1,89 @@
1
+ import React from "react";
2
+
3
+ import { reduxForm } from "redux-form";
4
+ import { startCase } from "lodash";
5
+ import { withProps } from "recompose";
6
+ import { InputField, wrapDialog } from "@teselagen/ui";
7
+ import { compose } from "redux";
8
+ import { Button, Intent, Classes } from "@blueprintjs/core";
9
+ import classNames from "classnames";
10
+ import "./simpleDialog.css";
11
+ import { tryToRefocusEditor } from "../utils/editorUtils";
12
+
13
+ // TODO: move to TRC
14
+ class SimpleGenericDialogForm extends React.Component {
15
+ render() {
16
+ const {
17
+ hideModal,
18
+ handleSubmit,
19
+ fields,
20
+ buttonText = "OK",
21
+ showCancel = true,
22
+ onSubmit,
23
+ invalid,
24
+ extraProps = {}
25
+ } = this.props;
26
+ return (
27
+ <form
28
+ onSubmit={handleSubmit((data) => {
29
+ if (onSubmit) onSubmit(data);
30
+ hideModal();
31
+ tryToRefocusEditor();
32
+ })}
33
+ className={classNames(
34
+ Classes.DIALOG_BODY,
35
+ "tg-min-width-dialog simple-dialog"
36
+ )}
37
+ >
38
+ {fields.map((field, i) => {
39
+ const { component, isRequired, ...props } = field;
40
+ const FieldComp = component || InputField;
41
+ const fieldProps = {
42
+ autoFocus: i === 0,
43
+ ...props,
44
+ ...extraProps[props.name]
45
+ };
46
+ fieldProps.label =
47
+ fieldProps.label || startCase(fieldProps.name) + ":";
48
+ if (isRequired) fieldProps.validate = required;
49
+ return <FieldComp key={field.name} {...fieldProps} />;
50
+ })}
51
+ <div className="dialog-buttons">
52
+ {showCancel && (
53
+ <Button
54
+ onClick={() => {
55
+ hideModal();
56
+ tryToRefocusEditor();
57
+ }}
58
+ text="Cancel"
59
+ />
60
+ )}
61
+ <Button
62
+ type="submit"
63
+ intent={Intent.PRIMARY}
64
+ text={buttonText}
65
+ disabled={invalid}
66
+ />
67
+ </div>
68
+ </form>
69
+ );
70
+ }
71
+ }
72
+
73
+ function required(val) {
74
+ if (!val) return "Required";
75
+ }
76
+
77
+ export default function createSimpleDialog(props) {
78
+ return compose(
79
+ wrapDialog({
80
+ isDraggable: true,
81
+ width: 400,
82
+ ...props.withDialogProps
83
+ }),
84
+ reduxForm({
85
+ form: props.formName
86
+ }),
87
+ withProps(props)
88
+ )(SimpleGenericDialogForm);
89
+ }
@@ -0,0 +1,72 @@
1
+ import React from "react";
2
+ import withEditorProps from "../withEditorProps";
3
+ import {
4
+ TgSelect,
5
+ getKeyedTagsAndTagOptions
6
+ } from "@teselagen/ui";
7
+ import { flatMap } from "lodash";
8
+ import { uniqBy } from "lodash";
9
+
10
+ export const PartTagSearch = withEditorProps(PartToolDropdown);
11
+
12
+ function PartToolDropdown({
13
+ sequenceData,
14
+ updateSelectedPartTags,
15
+ selectedPartTags,
16
+ allPartTags,
17
+ annotationVisibilityShow,
18
+ editTagsLink,
19
+ dontAutoOpen
20
+ }) {
21
+ if (!sequenceData) return <div>No Parts Present</div>;
22
+ const keyedTags = getKeyedTagsAndTagOptions(allPartTags);
23
+
24
+ // this is what keyedTags looks like:
25
+ // keyedTags = {
26
+ // '12:4': {label,value,id},
27
+ // '12:1': {label,value,id},
28
+ // '44': {label,value,id},
29
+ // }
30
+
31
+ const tags = uniqBy(
32
+ flatMap(sequenceData.parts, ({ tags }) => {
33
+ return flatMap(tags, (t) => {
34
+ const tag = keyedTags[t];
35
+ if (!tag) return [];
36
+ return tag;
37
+ });
38
+ }),
39
+ "value"
40
+ );
41
+ return (
42
+ <div style={{ width: "100%" }}>
43
+ <div>Search Parts By Tag: </div>
44
+ <div style={{ display: "flex" }}>
45
+ <TgSelect
46
+ value={selectedPartTags.parts}
47
+ onChange={(...args) => {
48
+ annotationVisibilityShow("parts");
49
+ updateSelectedPartTags(...args);
50
+ }}
51
+ isTagSelect
52
+ multi
53
+ popoverProps={{
54
+ usePortal: false,
55
+ modifiers: {
56
+ preventOverflow: { enabled: false },
57
+ hide: {
58
+ enabled: false
59
+ },
60
+ flip: {
61
+ boundariesElement: "viewport"
62
+ }
63
+ }
64
+ }}
65
+ options={tags}
66
+ autoOpen={!dontAutoOpen}
67
+ ></TgSelect>
68
+ {editTagsLink || null}
69
+ </div>
70
+ </div>
71
+ );
72
+ }
@@ -0,0 +1,13 @@
1
+ .simple-dialog .dialog-buttons {
2
+ display: flex;
3
+ flex-direction: row;
4
+ justify-content: flex-end;
5
+ }
6
+
7
+ .simple-dialog .dialog-buttons > * {
8
+ margin-left: 10px;
9
+ }
10
+
11
+ .simple-dialog .bp3-form-content {
12
+ height: 40px;
13
+ }