@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,374 @@
1
+ import { debounce, noop, startCase } from "lodash";
2
+ import draggableClassnames from "../constants/draggableClassnames";
3
+ import prepareRowData from "../utils/prepareRowData";
4
+ import React from "react";
5
+ import Draggable from "react-draggable";
6
+ import RowItem from "../RowItem";
7
+ import withEditorInteractions from "../withEditorInteractions";
8
+ import { withEditorPropsNoRedux } from "../withEditorProps";
9
+ import "./style.css";
10
+ import {
11
+ getClientX,
12
+ getEmptyText,
13
+ getParedDownWarning,
14
+ pareDownAnnotations
15
+ } from "../utils/editorUtils";
16
+ import useAnnotationLimits from "../utils/useAnnotationLimits";
17
+ import { SequenceName } from "./SequenceName";
18
+ import classNames from "classnames";
19
+ import { massageTickSpacing } from "../utils/massageTickSpacing";
20
+ import PinchHelper from "../helperComponents/PinchHelper/PinchHelper";
21
+
22
+ import { updateLabelsForInViewFeatures } from "../utils/updateLabelsForInViewFeatures";
23
+ import { VeTopRightContainer } from "../CircularView/VeTopRightContainer";
24
+ import { ZoomLinearView } from "./ZoomLinearView";
25
+ import {
26
+ editorDragged,
27
+ editorDragStarted,
28
+ editorDragStopped
29
+ } from "../withEditorInteractions/clickAndDragUtils";
30
+ import { store } from "@risingstack/react-easy-state";
31
+
32
+ const defaultMarginWidth = 10;
33
+
34
+
35
+
36
+ class _LinearView extends React.Component {
37
+ state = {};
38
+ bindOutsideChangeHelper = {};
39
+ getNearestCursorPositionToMouseEvent(rowData, event, callback) {
40
+ //loop through all the rendered rows to see if the click event lands in one of them
41
+ let nearestCaretPos = 0;
42
+ let rowDomNode = this.linearView;
43
+ rowDomNode = rowDomNode.querySelector(".veRowItem");
44
+ const boundingRowRect = rowDomNode.getBoundingClientRect();
45
+ const maxEnd = this.getMaxLength();
46
+ if (getClientX(event) - boundingRowRect.left < 0) {
47
+ nearestCaretPos = 0;
48
+ } else {
49
+ const clickXPositionRelativeToRowContainer =
50
+ getClientX(event) - boundingRowRect.left;
51
+ const numberOfBPsInFromRowStart = Math.floor(
52
+ (clickXPositionRelativeToRowContainer + this.charWidth / 2) /
53
+ this.charWidth
54
+ );
55
+ nearestCaretPos = numberOfBPsInFromRowStart + 0;
56
+ if (nearestCaretPos > maxEnd + 1) {
57
+ nearestCaretPos = maxEnd + 1;
58
+ }
59
+ }
60
+ if (this.props.sequenceData && this.props.sequenceData.isProtein) {
61
+ nearestCaretPos = Math.round(nearestCaretPos / 3) * 3;
62
+ }
63
+ if (maxEnd === 0) nearestCaretPos = 0;
64
+ const {
65
+ updateSelectionOrCaret,
66
+ caretPosition,
67
+ selectionLayer,
68
+ caretPositionUpdate,
69
+ selectionLayerUpdate
70
+ } = this.props;
71
+ const callbackVals = {
72
+ updateSelectionOrCaret,
73
+ caretPosition,
74
+ selectionLayer,
75
+ caretPositionUpdate,
76
+ selectionLayerUpdate,
77
+ sequenceLength: maxEnd,
78
+ doNotWrapOrigin: !(
79
+ this.props.sequenceData && this.props.sequenceData.circular
80
+ ),
81
+ event,
82
+ shiftHeld: event.shiftKey,
83
+ nearestCaretPos,
84
+ // caretGrabbed: event.target.className === "cursor",
85
+ selectionStartGrabbed: event.target.classList.contains(
86
+ draggableClassnames.selectionStart
87
+ ),
88
+ selectionEndGrabbed: event.target.classList.contains(
89
+ draggableClassnames.selectionEnd
90
+ )
91
+ };
92
+ callback(callbackVals);
93
+ }
94
+ getMaxLength = () => {
95
+ const { sequenceData = { sequence: "" }, alignmentData } = this.props;
96
+ const data = alignmentData || sequenceData;
97
+ return data.noSequence ? data.size : data.sequence.length;
98
+ };
99
+
100
+ getRowData = () => {
101
+ const {
102
+ limits,
103
+ sequenceData = { sequence: "" },
104
+ maxAnnotationsToDisplay
105
+ } = this.props;
106
+ // if (!isEqual(sequenceData, this.oldSeqData)) {
107
+ this.paredDownMessages = [];
108
+ const paredDownSeqData = ["parts", "features", "cutsites"].reduce(
109
+ (acc, type) => {
110
+ const nameUpper = startCase(type);
111
+ const maxToShow =
112
+ (maxAnnotationsToDisplay
113
+ ? maxAnnotationsToDisplay[type]
114
+ : limits[type]) || 50;
115
+ const [annotations, paredDown] = pareDownAnnotations(
116
+ sequenceData["filtered" + nameUpper] || sequenceData[type] || {},
117
+ maxToShow
118
+ );
119
+
120
+ if (paredDown) {
121
+ this.paredDownMessages.push(
122
+ getParedDownWarning({
123
+ nameUpper,
124
+ isAdjustable: !maxAnnotationsToDisplay,
125
+ maxToShow
126
+ })
127
+ );
128
+ }
129
+ acc[type] = annotations;
130
+ return acc;
131
+ },
132
+ {}
133
+ );
134
+ this.rowData = prepareRowData(
135
+ {
136
+ ...sequenceData,
137
+ ...paredDownSeqData
138
+ },
139
+ sequenceData.sequence ? sequenceData.sequence.length : 0
140
+ );
141
+ this.oldSeqData = sequenceData;
142
+ // }
143
+ return this.rowData;
144
+ };
145
+ updateLabelsForInViewFeaturesDebounced = debounce(() => {
146
+ updateLabelsForInViewFeatures();
147
+ }, 20);
148
+ easyStore = store({
149
+ percentScrolled: 0,
150
+ viewportWidth: 400
151
+ });
152
+
153
+ render() {
154
+ const {
155
+ //currently found in props
156
+ sequenceData = { sequence: "" },
157
+ alignmentData,
158
+ hideName = false,
159
+ editorClicked = noop,
160
+ width = 400,
161
+ className,
162
+ tickSpacing,
163
+ scrollDataPassed,
164
+ caretPosition,
165
+ backgroundRightClicked = noop,
166
+ RowItemProps = {},
167
+ marginWidth = defaultMarginWidth,
168
+ height,
169
+ isInAlignment,
170
+ withZoomLinearView = false,
171
+ editorName,
172
+ smallSlider,
173
+ paddingBottom,
174
+ linearViewCharWidth,
175
+ annotationVisibilityOverrides,
176
+ isProtein,
177
+ noWarnings,
178
+ ...rest
179
+ } = this.props;
180
+
181
+ const bpsPerRow = this.getMaxLength();
182
+ let innerWidth = Math.max(width - marginWidth - 20, 0);
183
+ if (isNaN(innerWidth)) {
184
+ innerWidth = 0;
185
+ }
186
+ const initialCharWidth = Math.min(innerWidth / bpsPerRow, 20);
187
+ this.charWidth =
188
+ this.state.charWidthInLinearView ||
189
+ linearViewCharWidth ||
190
+ initialCharWidth;
191
+ const isLinViewZoomed = this.charWidth !== initialCharWidth;
192
+ const sequenceName = hideName ? "" : sequenceData.name || "";
193
+ const rowData = this.getRowData();
194
+ const linearZoomEnabled = bpsPerRow >= 50 && withZoomLinearView;
195
+ const minCharWidth = initialCharWidth;
196
+ const PinchHelperToUse = linearZoomEnabled ? PinchHelper : React.Fragment;
197
+ const pinchHandler = {
198
+ onPinch: ({ delta: [d] }) => {
199
+ if (d === 0) return;
200
+ this.bindOutsideChangeHelper.triggerChange(({ value, changeValue }) => {
201
+ // changeValue(d);
202
+ if (d > 0) {
203
+ if (value > 8) {
204
+ changeValue(value + 0.4);
205
+ } else {
206
+ changeValue(value + 0.2);
207
+ }
208
+ } else if (d < 0) {
209
+ if (value > 8) {
210
+ changeValue(value - 0.4);
211
+ } else {
212
+ changeValue(value - 0.2);
213
+ }
214
+ }
215
+ });
216
+ updateLabelsForInViewFeatures();
217
+ }
218
+ };
219
+ return (
220
+ <Draggable
221
+ enableUserSelectHack={false} //needed to prevent the input bubble from losing focus post user drag
222
+ bounds={{ top: 0, left: 0, right: 0, bottom: 0 }}
223
+ onDrag={(event) => {
224
+ this.getNearestCursorPositionToMouseEvent(
225
+ rowData,
226
+ event,
227
+ this.props.editorDragged || editorDragged
228
+ );
229
+ }}
230
+ onStart={(event) => {
231
+ this.getNearestCursorPositionToMouseEvent(
232
+ rowData,
233
+ event,
234
+ this.props.editorDragStarted || editorDragStarted
235
+ );
236
+ }}
237
+ onStop={this.props.editorDragStopped || editorDragStopped}
238
+ >
239
+ <div
240
+ ref={(ref) => (this.linearView = ref)}
241
+ className={classNames("veLinearView", className, {
242
+ isLinViewZoomed
243
+ })}
244
+ style={{
245
+ width,
246
+ ...(height && { height }),
247
+ paddingLeft: marginWidth / 2,
248
+ ...(paddingBottom && { paddingBottom })
249
+ }}
250
+ onContextMenu={(event) => {
251
+ this.getNearestCursorPositionToMouseEvent(
252
+ rowData,
253
+ event,
254
+ backgroundRightClicked
255
+ );
256
+ }}
257
+ onClick={(event) => {
258
+ this.getNearestCursorPositionToMouseEvent(
259
+ rowData,
260
+ event,
261
+ editorClicked
262
+ );
263
+ }}
264
+ >
265
+ {linearZoomEnabled && ( //so this for conditonal rendering
266
+ <ZoomLinearView
267
+ charWidth={this.charWidth}
268
+ bindOutsideChangeHelper={this.bindOutsideChangeHelper}
269
+ minCharWidth={minCharWidth}
270
+ smallSlider={smallSlider}
271
+ editorName={editorName}
272
+ setCharWidth={(v) => {
273
+ this.setState({
274
+ charWidthInLinearView: v === initialCharWidth ? undefined : v
275
+ });
276
+ }}
277
+ afterOnChange={() => {
278
+ updateLabelsForInViewFeatures();
279
+ }}
280
+ ></ZoomLinearView>
281
+ )}
282
+ {!hideName && (
283
+ <SequenceName
284
+ {...{
285
+ isProtein,
286
+ sequenceName,
287
+ sequenceLength: sequenceData.sequence
288
+ ? sequenceData.sequence.length
289
+ : 0
290
+ }}
291
+ />
292
+ )}
293
+ {!noWarnings && (
294
+ <VeTopRightContainer>{this.paredDownMessages}</VeTopRightContainer>
295
+ )}
296
+
297
+ <PinchHelperToUse {...(linearZoomEnabled && pinchHandler)}>
298
+ <RowItem
299
+ {...{
300
+ ...rest,
301
+ editorName,
302
+ onScroll: () => {
303
+ this.easyStore.viewportWidth = width;
304
+ const row =
305
+ this.linearView.querySelector(".veRowItemWrapper");
306
+ const scrollPercentage =
307
+ row.scrollLeft / (row.scrollWidth - row.clientWidth);
308
+ this.easyStore.percentScrolled = scrollPercentage;
309
+ updateLabelsForInViewFeatures();
310
+ },
311
+ rowContainerStyle: {
312
+ height: height - 36,
313
+ width: innerWidth + 26,
314
+ paddingRight: marginWidth / 2,
315
+ ...(isLinViewZoomed &&
316
+ !isInAlignment && { paddingBottom: 15 })
317
+ },
318
+ charWidth: this.charWidth,
319
+ scrollData:
320
+ scrollDataPassed ||
321
+ (isLinViewZoomed ? this.easyStore : undefined),
322
+ caretPosition,
323
+ isProtein: sequenceData.isProtein,
324
+ alignmentData,
325
+ sequenceLength: this.getMaxLength(),
326
+ bpsPerRow,
327
+ fullSequence: sequenceData.sequence,
328
+ emptyText: getEmptyText({ sequenceData, caretPosition }),
329
+ tickSpacing:
330
+ tickSpacing ||
331
+ (isLinViewZoomed
332
+ ? massageTickSpacing(Math.ceil(120 / this.charWidth))
333
+ : Math.floor(
334
+ this.getMaxLength() / (sequenceData.isProtein ? 9 : 10)
335
+ )),
336
+ annotationVisibility: {
337
+ ...rest.annotationVisibility,
338
+ ...((!isLinViewZoomed || this.charWidth < 5) && {
339
+ translations: false,
340
+ primaryProteinSequence: false,
341
+ reverseSequence: false,
342
+ sequence: false,
343
+ cutsitesInSequence: false
344
+ }),
345
+ ...annotationVisibilityOverrides
346
+ },
347
+ ...RowItemProps
348
+ }}
349
+ row={rowData[0]}
350
+ isLinearView
351
+ />
352
+ </PinchHelperToUse>
353
+ </div>
354
+ </Draggable>
355
+ );
356
+ }
357
+ }
358
+
359
+ const WithAnnotationLimitsHoc = (Component) => (props) => {
360
+ // eslint-disable-next-line react-hooks/rules-of-hooks
361
+ const [limits = {}] = useAnnotationLimits();
362
+ return <Component limits={limits} {...props}></Component>;
363
+ };
364
+ export const LinearView = WithAnnotationLimitsHoc(_LinearView);
365
+
366
+ export const NonReduxEnhancedLinearView = withEditorPropsNoRedux(LinearView);
367
+
368
+ export default withEditorInteractions(LinearView);
369
+
370
+ export const scrollToCaret = () => {
371
+ const el = window.document.querySelector(".veLinearView .veRowViewCaret");
372
+ if (!el) return;
373
+ el.scrollIntoView({ inline: "center", block: "nearest" });
374
+ };
@@ -0,0 +1,12 @@
1
+ .veLinearView .veRowItemWrapper {
2
+ display: flex;
3
+ justify-content: center;
4
+ overflow: auto;
5
+ }
6
+
7
+ /* .tg-pinch-helper {
8
+ touch-action: none;
9
+ -moz-user-select: none;
10
+ -webkit-user-drag: none;
11
+ user-select: none;
12
+ } */
@@ -0,0 +1,326 @@
1
+ import { connect } from "react-redux";
2
+ // import {reduxForm, Field, formValueSelector} from 'redux-form'
3
+ import React from "react";
4
+ import { DialogFooter, InfoHelper } from "@teselagen/ui";
5
+
6
+ // import './style.css';
7
+ import { cutSequenceByRestrictionEnzyme } from "@teselagen/sequence-utils";
8
+ // import QuestionTooltip from '../../components/QuestionTooltip';
9
+ import {
10
+ defaultEnzymesByName,
11
+ getReverseComplementSequenceString
12
+ } from "@teselagen/sequence-utils";
13
+ import EnzymeViewer from "../EnzymeViewer";
14
+ import "./style.css";
15
+ import { connectToEditor } from "../withEditorProps";
16
+ import { compose } from "recompose";
17
+ import { Callout } from "@blueprintjs/core";
18
+ import { addCustomEnzyme } from "../utils/editorUtils";
19
+
20
+ let CreateCustomEnzyme = function (props) {
21
+ const paddingStart = "-------";
22
+ const paddingEnd = "-------";
23
+ const {
24
+ // filteredRestrictionEnzymesAdd,
25
+ // addRestrictionEnzyme,
26
+ inputSequenceToTestAgainst = "", //pass this prop in!
27
+ seqName = "Destination Vector",
28
+ createYourOwnEnzyme,
29
+ dispatch,
30
+ hideModal,
31
+ editorName
32
+ } = props;
33
+
34
+ createYourOwnEnzyme.chop_top_index = Number(
35
+ createYourOwnEnzyme.chop_top_index
36
+ );
37
+ createYourOwnEnzyme.chop_bottom_index = Number(
38
+ createYourOwnEnzyme.chop_bottom_index
39
+ );
40
+
41
+ const {
42
+ sequence = "",
43
+ chop_top_index = 0,
44
+ chop_bottom_index = 0,
45
+ name = ""
46
+ } = createYourOwnEnzyme;
47
+ const regexString = bpsToRegexString(sequence);
48
+ const enzyme = {
49
+ name: name,
50
+ site: sequence,
51
+ forwardRegex: regexString,
52
+ reverseRegex: getReverseComplementSequenceString(regexString),
53
+ topSnipOffset: chop_top_index,
54
+ bottomSnipOffset: chop_bottom_index,
55
+ usForward: 0,
56
+ usReverse: 0,
57
+ color: "black"
58
+ };
59
+ let invalid;
60
+ if (
61
+ !enzyme.name ||
62
+ !enzyme.site ||
63
+ !enzyme.forwardRegex ||
64
+ !enzyme.reverseRegex ||
65
+ (!enzyme.topSnipOffset && enzyme.topSnipOffset !== 0) ||
66
+ (!enzyme.bottomSnipOffset && enzyme.bottomSnipOffset !== 0)
67
+ ) {
68
+ invalid = true;
69
+ }
70
+
71
+ let matches;
72
+ if (regexString.length === 0) {
73
+ matches = [];
74
+ } else {
75
+ matches = cutSequenceByRestrictionEnzyme(
76
+ inputSequenceToTestAgainst,
77
+ true,
78
+ enzyme
79
+ );
80
+ }
81
+
82
+ const errors = validate(createYourOwnEnzyme);
83
+ if (Object.keys(errors || {}).length) {
84
+ invalid = true;
85
+ }
86
+ function onChange(updatedVal) {
87
+ dispatch({
88
+ type: "CREATE_YOUR_OWN_ENZYME_UPDATE",
89
+ payload: {
90
+ ...createYourOwnEnzyme,
91
+ ...updatedVal
92
+ }
93
+ });
94
+ }
95
+
96
+ return (
97
+ <div className="createYourOwnEnzyme">
98
+ <Callout intent="primary">
99
+ This enzyme will be added to the "My Enzymes" group
100
+ </Callout>
101
+ <CustomInput
102
+ error={errors["name"]}
103
+ value={name}
104
+ onChange={onChange}
105
+ name="name"
106
+ label="Name:"
107
+ />
108
+ <CustomInput
109
+ error={errors["sequence"]}
110
+ value={sequence}
111
+ onChange={onChange}
112
+ name="sequence"
113
+ label={
114
+ <div className="labelWithIcon">
115
+ <InfoHelper>
116
+ <div className="taLineHolder">
117
+ <Line> Special Characters: </Line>
118
+ <Line> R = G A (purine) </Line>
119
+ <Line> Y = T C (pyrimidine) </Line>
120
+ <Line> K = G T (keto) </Line>
121
+ <Line> M = A C (amino) </Line>
122
+ <Line> S = G C (strong bonds) </Line>
123
+ <Line> W = A T (weak bonds) </Line>
124
+ <Line> B = G T C (all but A) </Line>
125
+ <Line> D = G A T (all but C) </Line>
126
+ <Line> H = A C T (all but G) </Line>
127
+ <Line> V = G C A (all but T) </Line>
128
+ <Line> N = A G C T (any) </Line>
129
+ </div>
130
+ </InfoHelper>
131
+ <span>Recognition sequence:</span>
132
+ </div>
133
+ }
134
+ onInput={function (input) {
135
+ const inputValue = input.target.value;
136
+ const cleanInput = inputValue.replace(/[^rykmswbdhvnagct]/gi, "");
137
+ input.target.value = cleanInput;
138
+ }}
139
+ />
140
+
141
+ <CustomInput
142
+ error={errors["chop_top_index"]}
143
+ value={chop_top_index}
144
+ onChange={onChange}
145
+ name="chop_top_index"
146
+ label="Chop top index:"
147
+ type="number"
148
+ />
149
+ <CustomInput
150
+ error={errors["chop_bottom_index"]}
151
+ value={chop_bottom_index}
152
+ onChange={onChange}
153
+ name="chop_bottom_index"
154
+ label="Chop bottom index:"
155
+ type="number"
156
+ />
157
+
158
+ <EnzymeViewer
159
+ {...{
160
+ forwardSnipPosition: chop_top_index,
161
+ paddingEnd,
162
+ paddingStart,
163
+ reverseSnipPosition: chop_bottom_index,
164
+ sequence
165
+ }}
166
+ />
167
+ <br />
168
+
169
+ <h3 className={"cutnumber " + (matches.length === 0 && "invalid")}>
170
+ {matches.length > 10
171
+ ? `Cuts more than 10 times in ${seqName}`
172
+ : `Cuts ${matches.length} time${
173
+ matches.length === 1 ? "" : "s"
174
+ } in ${seqName}`}
175
+ </h3>
176
+ <DialogFooter
177
+ hideModal={hideModal}
178
+ disabled={invalid}
179
+ onClick={() => {
180
+ addCustomEnzyme(enzyme);
181
+ dispatch({
182
+ type: "FILTERED_RESTRICTION_ENZYMES_ADD", //filteredRestrictionEnzymesAdd
183
+ payload: {
184
+ value: name
185
+ },
186
+ meta: {
187
+ editorName
188
+ }
189
+ });
190
+ hideModal && hideModal();
191
+ }}
192
+ ></DialogFooter>
193
+ {/* <div className="buttonHolder">
194
+ <Button
195
+ className="addAdditionalEnzymeBtn"
196
+ onClick={stopCreatingYourOwnEnzyme}
197
+ >
198
+ Back
199
+ </Button>
200
+ <Button
201
+ className={
202
+ " ta_useCutsite addAdditionalEnzymeBtn " + (invalid && "disabled")
203
+ }
204
+ onClick={function () {}}
205
+ >
206
+ Use Enzyme
207
+ </Button>
208
+ </div> */}
209
+ </div>
210
+ );
211
+ };
212
+
213
+ CreateCustomEnzyme = compose(
214
+ connectToEditor(({ sequenceData = {} }) => {
215
+ return {
216
+ seqName: sequenceData.name,
217
+ inputSequenceToTestAgainst: sequenceData.sequence || ""
218
+ };
219
+ }),
220
+ connect(function (state) {
221
+ return {
222
+ createYourOwnEnzyme:
223
+ state.VectorEditor.__allEditorsOptions.createYourOwnEnzyme
224
+ };
225
+ })
226
+ )(CreateCustomEnzyme);
227
+
228
+ export default CreateCustomEnzyme;
229
+
230
+ function validate(values) {
231
+ const errors = {};
232
+
233
+ if (!values.name || values.name.trim() === "") {
234
+ errors.name = "Input cannot be blank";
235
+ } else if (defaultEnzymesByName[values.name.toLowerCase()]) {
236
+ errors.name = `The name ${values.name} is already taken.`;
237
+ }
238
+
239
+ if (
240
+ !values.sequence ||
241
+ values.sequence.trim() === "" ||
242
+ values.sequence.trim().length < 4
243
+ ) {
244
+ errors.sequence = "Enzyme recognition sequence must be at least 4bps long";
245
+ }
246
+
247
+ if (
248
+ values.sequence &&
249
+ values.sequence.replace(/[^atgcrykmswbdhvn]/gi, "").length !==
250
+ values.sequence.length
251
+ ) {
252
+ errors.sequence = "Sequence must only contain valid bases";
253
+ }
254
+
255
+ if (!values.chop_top_index && values.chop_top_index !== 0) {
256
+ errors.chop_top_index = "Input cannot be blank";
257
+ }
258
+ if (!values.chop_bottom_index && values.chop_bottom_index !== 0) {
259
+ errors.chop_bottom_index = "Input cannot be blank";
260
+ }
261
+ return errors;
262
+ }
263
+
264
+ function bpsToRegexString(bps) {
265
+ let regexString = "";
266
+ if (typeof bps === "string") {
267
+ bps.split("").forEach(function (bp) {
268
+ if (bp === "r") {
269
+ regexString += "[ga]";
270
+ } else if (bp === "y") {
271
+ regexString += "[tc]";
272
+ } else if (bp === "k") {
273
+ regexString += "[gt]";
274
+ } else if (bp === "m") {
275
+ regexString += "[ac]";
276
+ } else if (bp === "s") {
277
+ regexString += "[gc]";
278
+ } else if (bp === "w") {
279
+ regexString += "[at]";
280
+ } else if (bp === "b") {
281
+ regexString += "[gtc]";
282
+ } else if (bp === "d") {
283
+ regexString += "[gat]";
284
+ } else if (bp === "h") {
285
+ regexString += "[act]";
286
+ } else if (bp === "v") {
287
+ regexString += "[gca]";
288
+ } else if (bp === "n") {
289
+ regexString += "[agct]";
290
+ } else {
291
+ regexString += bp;
292
+ }
293
+ });
294
+ }
295
+ return regexString;
296
+ }
297
+
298
+ // function CustomInput({name, type, label, onInput}) {
299
+ // return <Field name={name} label={label} type={type} onInput={onInput} component={RenderInput} >
300
+ // </Field>
301
+ // }
302
+
303
+ function CustomInput({ name, value, onChange, onInput, label, error, type }) {
304
+ return (
305
+ <div className={"inputHolder " + (error && "error")}>
306
+ <div>
307
+ <span>{label}</span>
308
+ <input
309
+ value={value}
310
+ onChange={function (e) {
311
+ onChange({
312
+ [name]: e.target.value
313
+ });
314
+ }}
315
+ onInput={onInput}
316
+ type={type}
317
+ />
318
+ </div>
319
+ {error && <p className="errorMessage">{error}</p>}
320
+ </div>
321
+ );
322
+ }
323
+
324
+ function Line({ children }) {
325
+ return <div className="taLine"> {children}</div>;
326
+ }