@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,196 @@
1
+ import { merge } from "lodash";
2
+ import * as createYourOwnEnzyme from "./createYourOwnEnzyme";
3
+ import * as showGCContent from "./showGCContent";
4
+ import * as annotationLabelVisibility from "./annotationLabelVisibility";
5
+ import * as annotationsToSupport from "./annotationsToSupport";
6
+ import * as annotationVisibility from "./annotationVisibility";
7
+ import * as caretPosition from "./caretPosition";
8
+ import * as copyOptions from "./copyOptions";
9
+ import * as deletionLayers from "./deletionLayers";
10
+ import * as digestTool from "./digestTool";
11
+ import * as findTool from "./findTool";
12
+ import * as toolBar from "./toolBar";
13
+ import * as frameTranslations from "./frameTranslations";
14
+ import * as hoveredAnnotation from "./hoveredAnnotation";
15
+ import * as minimumOrfSize from "./minimumOrfSize";
16
+ import * as alignments from "./alignments";
17
+ import * as panelsShown from "./panelsShown";
18
+ import * as propertiesTool from "./propertiesTool";
19
+ import * as lastSavedId from "./lastSavedId";
20
+ import * as readOnly from "./readOnly";
21
+ import * as versionHistory from "./versionHistory";
22
+ import * as replacementLayers from "./replacementLayers";
23
+ import * as restrictionEnzymes from "./restrictionEnzymes";
24
+ import * as selectedAnnotations from "./selectedAnnotations";
25
+ import * as selectionLayer from "./selectionLayer";
26
+ import * as sequenceDataHistory from "./sequenceDataHistory";
27
+ import * as sequenceData from "./sequenceData";
28
+ import * as useAdditionalOrfStartCodons from "./useAdditionalOrfStartCodons";
29
+ import * as uppercaseSequenceMapFont from "./uppercaseSequenceMapFont";
30
+ import * as charWidth from "./charWidth";
31
+ import * as labelLineIntensity from "./labelLineIntensity";
32
+ import * as labelSize from "./labelSize";
33
+ import * as featureLengthsToHide from "./featureLengthsToHide";
34
+ import * as primerLengthsToHide from "./primerLengthsToHide";
35
+ import * as partLengthsToHide from "./partLengthsToHide";
36
+ import * as selectedPartTags from "./selectedPartTags";
37
+ import { combineReducers } from "redux";
38
+ import createAction from "./utils/createMetaAction";
39
+ export { default as vectorEditorMiddleware } from "./middleware";
40
+
41
+ const subReducers = {
42
+ createYourOwnEnzyme,
43
+ annotationLabelVisibility,
44
+ annotationsToSupport,
45
+ annotationVisibility,
46
+ caretPosition,
47
+ copyOptions,
48
+ deletionLayers,
49
+ digestTool,
50
+ toolBar,
51
+ findTool,
52
+ frameTranslations,
53
+ hoveredAnnotation,
54
+ minimumOrfSize,
55
+ panelsShown,
56
+ propertiesTool,
57
+ lastSavedId,
58
+ readOnly,
59
+ versionHistory,
60
+ replacementLayers,
61
+ restrictionEnzymes,
62
+ selectedAnnotations,
63
+ selectionLayer,
64
+ sequenceDataHistory,
65
+ sequenceData,
66
+ useAdditionalOrfStartCodons,
67
+ charWidth,
68
+ uppercaseSequenceMapFont,
69
+ showGCContent,
70
+ labelLineIntensity,
71
+ labelSize,
72
+ partLengthsToHide,
73
+ primerLengthsToHide,
74
+ featureLengthsToHide,
75
+ selectedPartTags
76
+ };
77
+
78
+ const vectorEditorInitialize = createAction("VECTOR_EDITOR_UPDATE");
79
+ const vectorEditorClear = createAction("VECTOR_EDITOR_CLEAR");
80
+
81
+ //export the actions for use elsewhere
82
+ export const actions = {
83
+ ...Object.keys(subReducers).reduce(
84
+ (acc, k) => ({
85
+ ...acc,
86
+ ...subReducers[k]
87
+ }),
88
+ {}
89
+ ),
90
+ ...alignments,
91
+ vectorEditorInitialize,
92
+ vectorEditorClear
93
+ };
94
+
95
+ const mergeDeepKeys = [];
96
+ //define the reducer
97
+ const reducers = {
98
+ ...Object.keys(subReducers).reduce((acc, k) => {
99
+ if (
100
+ subReducers[k].default &&
101
+ subReducers[k].default.__shouldUseMergedState
102
+ ) {
103
+ mergeDeepKeys.push(k);
104
+ }
105
+ return {
106
+ ...acc,
107
+ [k]: subReducers[k].default
108
+ };
109
+ }, {}),
110
+ instantiated: () => true
111
+ };
112
+
113
+ export const editorReducer = combineReducers(reducers);
114
+ const customDeepMerge = (state = {}, newState = {}) => {
115
+ return {
116
+ ...state,
117
+ ...newState,
118
+ ...mergeDeepKeys.reduce((acc, key) => {
119
+ acc[key] = merge(state[key], newState[key]);
120
+ return acc;
121
+ }, {})
122
+ };
123
+ };
124
+
125
+ export default function reducerFactory(initialState = {}) {
126
+ // if (!initialState || !Object.keys(initialState).length) {
127
+ // throw new Error(
128
+ // "Please pass an initial state to the vector editor reducer like: {DemoEditor: {}}!"
129
+ // );
130
+ // }
131
+ return function (state = initialState, action) {
132
+ let editorNames;
133
+ const newState = {};
134
+ if (action.meta && action.meta.editorName) {
135
+ editorNames = Array.isArray(action.meta.editorName)
136
+ ? action.meta.editorName
137
+ : [action.meta.editorName];
138
+ }
139
+ let stateToReturn;
140
+ if (editorNames) {
141
+ //we're dealing with an action specific to a given editor
142
+ editorNames.forEach(function (editorName) {
143
+ let currentState = state[editorName];
144
+ if (action.type === "VECTOR_EDITOR_UPDATE") {
145
+ //deep merge certain parts of the exisiting state with the new payload of props
146
+ //(if you want to do a clean wipe, use VECTOR_EDITOR_CLEAR)
147
+ currentState = customDeepMerge(state[editorName], action.payload);
148
+ }
149
+ if (action.type === "VECTOR_EDITOR_CLEAR") {
150
+ currentState = undefined;
151
+ }
152
+ newState[editorName] = editorReducer(currentState, action);
153
+ });
154
+ stateToReturn = {
155
+ ...state,
156
+ ...newState
157
+ };
158
+ } else {
159
+ //just a normal action
160
+ Object.keys(state).forEach(function (editorName) {
161
+ if (editorName === "__allEditorsOptions") return; //we deal with __allEditorsOptions below so don't pass it here
162
+ newState[editorName] = editorReducer(state[editorName], action);
163
+ });
164
+ stateToReturn = newState;
165
+ }
166
+ return {
167
+ ...stateToReturn,
168
+ //these are reducers that are not editor specific (aka shared across editor instances)
169
+ __allEditorsOptions: [
170
+ ["createYourOwnEnzyme", createYourOwnEnzyme],
171
+ ["uppercaseSequenceMapFont", uppercaseSequenceMapFont],
172
+ ["showGCContent", showGCContent],
173
+ ["labelLineIntensity", labelLineIntensity],
174
+ ["labelSize", labelSize],
175
+ ["alignments", alignments]
176
+ ].reduce((acc, [key, val]) => {
177
+ acc[key] = val.default(
178
+ !state.__allEditorsOptions
179
+ ? undefined
180
+ : state.__allEditorsOptions[key],
181
+ action
182
+ );
183
+ return acc;
184
+ }, {})
185
+ };
186
+ };
187
+ }
188
+
189
+ // export const getBlankEditor = (state) => (state.blankEditor)
190
+ export const getEditorByName = (state, editorName) => state[editorName];
191
+
192
+ // export default connect((state, ownProps) => {
193
+ // return {
194
+ // toggled: state.VectorEditor[ownProps.editorName].annotationVisibility.features
195
+ // }
196
+ // })()
@@ -0,0 +1,25 @@
1
+ import { createReducer } from "redux-act";
2
+
3
+ import createAction from "./utils/createMetaAction";
4
+
5
+ // ------------------------------------
6
+ // Actions
7
+ // ------------------------------------
8
+ export const changeLabelLineIntensity = createAction(
9
+ "changeLabelLineIntensity"
10
+ );
11
+
12
+ const newVal = window.localStorage.getItem("labelLineIntensity");
13
+
14
+ // ------------------------------------
15
+ // Reducer
16
+ // ------------------------------------
17
+ export default createReducer(
18
+ {
19
+ [changeLabelLineIntensity]: (state, payload) => {
20
+ localStorage.setItem("labelLineIntensity", payload);
21
+ return payload;
22
+ }
23
+ },
24
+ newVal ? parseFloat(newVal) : 0.1 // 0.1 (low) || 0.4 (med) || 0.7 (high) || 1.0 (full)
25
+ );
@@ -0,0 +1,23 @@
1
+ import { createReducer } from "redux-act";
2
+
3
+ import createAction from "./utils/createMetaAction";
4
+
5
+ // ------------------------------------
6
+ // Actions
7
+ // ------------------------------------
8
+ export const changeLabelSize = createAction("changeLabelSize");
9
+
10
+ const newVal = window.localStorage.getItem("labelSize");
11
+
12
+ // ------------------------------------
13
+ // Reducer
14
+ // ------------------------------------
15
+ export default createReducer(
16
+ {
17
+ [changeLabelSize]: (state, payload) => {
18
+ localStorage.setItem("labelSize", payload);
19
+ return payload;
20
+ }
21
+ },
22
+ newVal ? parseInt(newVal) : 8 // 8 is 100% label size
23
+ );
@@ -0,0 +1,20 @@
1
+ //./caretPosition.js
2
+ import { createReducer } from "redux-act";
3
+ import createAction from "./utils/createMetaAction";
4
+
5
+ // ------------------------------------
6
+ // Actions
7
+ // ------------------------------------
8
+ export const lastSavedIdUpdate = createAction("lastSavedIdUpdate"); //NOTE!!:: second argument sanitizes actions so no payload is passed
9
+
10
+ // ------------------------------------
11
+ // Reducer
12
+ // ------------------------------------
13
+ export default createReducer(
14
+ {
15
+ [lastSavedIdUpdate]: (state, payload) => {
16
+ return payload;
17
+ }
18
+ },
19
+ null
20
+ );
@@ -0,0 +1,112 @@
1
+ //vectorEditorMiddleware
2
+ //used to add undo/redo abilities to OVE
3
+
4
+ // To Batch actions together use this api:
5
+ // deleteFeature([id1, id2], {
6
+ // batchUndoStart: true
7
+ // });
8
+ // upsertFeature(
9
+ // {
10
+ // ...feat1,
11
+ // id: uuid(),
12
+ // start: start - 1,
13
+ // end: end - 1,
14
+ // name
15
+ // },
16
+ // {
17
+ // batchUndoEnd: true
18
+ // }
19
+ // );
20
+
21
+ export default (store) => (next) => (action) => {
22
+ if (action.meta && action.meta.disregardUndo) {
23
+ return next(action);
24
+ }
25
+ const disregardUndo = true;
26
+ if (action.type === "VE_UNDO" || action.type === "VE_REDO") {
27
+ const { VectorEditor } = store.getState();
28
+ const editorName = action.meta.editorName;
29
+ const editorState = VectorEditor[editorName];
30
+ const stack =
31
+ editorState.sequenceDataHistory[
32
+ action.type === "VE_UNDO" ? "past" : "future"
33
+ ] || [];
34
+ const stateToUse = stack[stack.length - 1];
35
+ store.dispatch({
36
+ type: action.type === "VE_UNDO" ? "VE_UNDO_META" : "VE_REDO_META",
37
+ payload: {
38
+ sequenceData: editorState.sequenceData,
39
+ selectionLayer: editorState.selectionLayer,
40
+ caretPosition: editorState.caretPosition
41
+ },
42
+ meta: { editorName, disregardUndo }
43
+ });
44
+ store.dispatch({
45
+ type: "SEQUENCE_DATA_UPDATE",
46
+ payload: stateToUse.sequenceData,
47
+ meta: { editorName, disregardUndo }
48
+ });
49
+ if (stateToUse.caretPosition > -1) {
50
+ store.dispatch({
51
+ type: "CARET_POSITION_UPDATE",
52
+ payload: stateToUse.caretPosition,
53
+ meta: { editorName, disregardUndo }
54
+ });
55
+ } else {
56
+ store.dispatch({
57
+ type: "SELECTION_LAYER_UPDATE",
58
+ payload: { ...stateToUse.selectionLayer, forceUpdate: Math.random() },
59
+ meta: { editorName, disregardUndo }
60
+ });
61
+ }
62
+ store.dispatch({
63
+ type: "VE_SEQUENCE_CHANGED", //used for external autosave functionality
64
+ payload: {
65
+ sequenceData: stateToUse.sequenceData,
66
+ editorName
67
+ },
68
+ meta: { editorName, disregardUndo: true }
69
+ });
70
+ return next(action);
71
+ } else {
72
+ //pass batchUndoStart, batchUndoMiddle and batchUndoEnd to group actions together
73
+ const { batchUndoEnd, batchUndoStart, batchUndoMiddle } = action.meta || {};
74
+ //get editor state(s)
75
+ const OldVectorEditor = store.getState().VectorEditor;
76
+ const result = next(action);
77
+ const NewVectorEditor = store.getState().VectorEditor;
78
+ Object.keys(NewVectorEditor).forEach((editorName) => {
79
+ const newEditorState = NewVectorEditor[editorName];
80
+ const oldEditorState = OldVectorEditor[editorName];
81
+ if (
82
+ oldEditorState &&
83
+ oldEditorState.sequenceData &&
84
+ oldEditorState.sequenceData !== newEditorState.sequenceData
85
+ ) {
86
+ const { sequenceData, selectionLayer, caretPosition } = oldEditorState;
87
+ !batchUndoEnd &&
88
+ !batchUndoMiddle &&
89
+ store.dispatch({
90
+ type: "ADD_TO_UNDO_STACK",
91
+ payload: {
92
+ selectionLayer,
93
+ sequenceData,
94
+ caretPosition
95
+ },
96
+ meta: { editorName, disregardUndo }
97
+ });
98
+ !batchUndoStart &&
99
+ !batchUndoMiddle &&
100
+ store.dispatch({
101
+ type: "VE_SEQUENCE_CHANGED", //used for external autosave functionality
102
+ payload: {
103
+ sequenceData: newEditorState.sequenceData,
104
+ editorName
105
+ },
106
+ meta: { editorName, disregardUndo: true }
107
+ });
108
+ }
109
+ });
110
+ return result;
111
+ }
112
+ };
@@ -0,0 +1,24 @@
1
+ //./caretPosition.js
2
+ import { createReducer } from "redux-act";
3
+ import createAction from "./utils/createMetaAction";
4
+
5
+ // ------------------------------------
6
+ // Actions
7
+ // ------------------------------------
8
+ export const minimumOrfSizeUpdate = createAction("minimumOrfSizeUpdate");
9
+
10
+ // ------------------------------------
11
+ // Reducer
12
+ // ------------------------------------
13
+ export default createReducer(
14
+ {
15
+ [minimumOrfSizeUpdate]: (state, payload) => {
16
+ return payload;
17
+ }
18
+ },
19
+ 300
20
+ );
21
+
22
+ export function getMinimumOrfSize(state) {
23
+ return state;
24
+ }
@@ -0,0 +1,3 @@
1
+ // ------------------------------------
2
+ // Actions
3
+ // ------------------------------------
@@ -0,0 +1,273 @@
1
+ import { map, flatMap } from "lodash";
2
+ import { createReducer } from "redux-act";
3
+ import createAction from "./utils/createMetaAction";
4
+ import { removeItem } from "../utils/arrayUtils";
5
+ import immer from "immer";
6
+
7
+ //manages which tab panels are shown in the editor
8
+
9
+ // ------------------------------------
10
+ // Actions
11
+ // ------------------------------------
12
+ export const panelsShownUpdate = createAction("PANELS_SHOWN_UPDATE");
13
+ export const addPanelIfItDoesntAlreadyExist = createAction(
14
+ "addPanelIfItDoesntAlreadyExist"
15
+ );
16
+ export const togglePanelFullScreen = createAction("togglePanelFullScreen");
17
+ export const collapsePanel = createAction("collapsePanel");
18
+ export const closePanel = createAction("closePanel");
19
+ export const _collapseSplitScreen = createAction("_collapseSplitScreen");
20
+ export const setPanelAsActive = createAction("setPanelAsActive");
21
+ export const flipActiveTabFromLinearOrCircularIfNecessary = createAction(
22
+ "flipActiveTabFromLinearOrCircularIfNecessary"
23
+ );
24
+ export const expandTabToSplitScreen = createAction("expandTabToSplitScreen");
25
+ export const propertiesViewOpen = (unused, meta) => {
26
+ return setPanelAsActive("properties", meta);
27
+ };
28
+ export const createNewDigest = (unused, meta) => {
29
+ return (dispatch) => {
30
+ dispatch(
31
+ addPanelIfItDoesntAlreadyExist(
32
+ {
33
+ id: "digestTool",
34
+ name: "New Digest",
35
+ active: true,
36
+ canClose: true
37
+ },
38
+ meta
39
+ )
40
+ );
41
+ dispatch(setPanelAsActive("digestTool", meta));
42
+ };
43
+ };
44
+ export const createNewPCR = (unused, meta) => {
45
+ return (dispatch) => {
46
+ dispatch(
47
+ addPanelIfItDoesntAlreadyExist(
48
+ {
49
+ id: "pcrTool",
50
+ name: "New PCR",
51
+ active: true,
52
+ canClose: true
53
+ },
54
+ meta
55
+ )
56
+ );
57
+ dispatch(setPanelAsActive("pcrTool", meta));
58
+ };
59
+ };
60
+
61
+ export const createNewAlignment = (payload, meta) => {
62
+ return (dispatch) => {
63
+ dispatch(
64
+ addPanelIfItDoesntAlreadyExist(
65
+ {
66
+ type: "alignment",
67
+ name: "New Alignment",
68
+ active: true,
69
+ canClose: true,
70
+ ...payload
71
+ },
72
+ meta
73
+ )
74
+ );
75
+ dispatch(setPanelAsActive(payload.id, meta));
76
+ };
77
+ };
78
+
79
+ export const createNewMismatchesList = (payload, meta) => {
80
+ return (dispatch) => {
81
+ dispatch(
82
+ addPanelIfItDoesntAlreadyExist(
83
+ {
84
+ type: "mismatches",
85
+ name: "Mismatches",
86
+ active: true,
87
+ canClose: true,
88
+ ...payload
89
+ },
90
+ meta
91
+ )
92
+ );
93
+ dispatch(setPanelAsActive(payload.id, meta));
94
+ };
95
+ };
96
+
97
+ export const collapseSplitScreen = (activePanelId, meta) => {
98
+ return (dispatch) => {
99
+ dispatch(_collapseSplitScreen(activePanelId, meta));
100
+ activePanelId && dispatch(setPanelAsActive(activePanelId, meta));
101
+ };
102
+ };
103
+
104
+ // ------------------------------------
105
+ // Reducer
106
+ // ------------------------------------
107
+ export default createReducer(
108
+ {
109
+ [addPanelIfItDoesntAlreadyExist]: (state, panelToAdd) => {
110
+ if (
111
+ !state.some((panelGroup) => {
112
+ return panelGroup.some(({ id }) => {
113
+ return id === panelToAdd.id;
114
+ });
115
+ })
116
+ ) {
117
+ return state.map((panelGroup, index) => {
118
+ if (index === 0) return [panelToAdd, ...panelGroup];
119
+ return panelGroup;
120
+ });
121
+ }
122
+ return state;
123
+ },
124
+ [panelsShownUpdate]: (state, payload) => {
125
+ return payload.filter((group) => group.length); //filter out any empty groups
126
+ },
127
+ [flipActiveTabFromLinearOrCircularIfNecessary]: (state, setCircActive) => {
128
+ const newState = immer(state, (s) => {
129
+ s.forEach((g) => {
130
+ flipActiveForGroup(g, setCircActive);
131
+ });
132
+ });
133
+
134
+ return newState;
135
+ },
136
+ [closePanel]: (state, idToClose) => {
137
+ const newState = state.map((group) => {
138
+ let indexToClose;
139
+ group.forEach(({ id }, i) => {
140
+ if (id === idToClose) indexToClose = i;
141
+ });
142
+ if (indexToClose > -1) {
143
+ return removeItem(group, indexToClose).map((tab, i) => {
144
+ if (i === 0) return { ...tab, active: true };
145
+ else {
146
+ return tab;
147
+ }
148
+ });
149
+ }
150
+ return group;
151
+ });
152
+ return newState.filter((group) => group.length); //filter out any empty groups
153
+ },
154
+ [_collapseSplitScreen]: (state) => {
155
+ return [flatMap(state)];
156
+ },
157
+ [expandTabToSplitScreen]: (state, activePanelId) => {
158
+ let panelToMove;
159
+ return [
160
+ state[0]
161
+ .filter((panel) => {
162
+ if (panel.id === activePanelId) {
163
+ panelToMove = panel;
164
+ return false;
165
+ }
166
+ return true;
167
+ })
168
+ .map((panel, i) => {
169
+ return i === 0 ? { ...panel, active: true } : panel;
170
+ }),
171
+ [{ ...panelToMove, active: true }]
172
+ ];
173
+ },
174
+ [setPanelAsActive]: (state, panelId) => {
175
+ return map(state, (panelGroup) => {
176
+ const isPanelInGroup = panelGroup.some(({ id }) => {
177
+ return panelId === id;
178
+ });
179
+ return panelGroup.map((panel) => {
180
+ return {
181
+ ...panel,
182
+ active:
183
+ panelId === panel.id
184
+ ? true
185
+ : isPanelInGroup
186
+ ? false
187
+ : panel.active
188
+ };
189
+ });
190
+ });
191
+ },
192
+ [togglePanelFullScreen]: (state, panelId) => {
193
+ return map(state, (panelGroup) => {
194
+ const isPanelInGroup = panelGroup.some(({ id }) => {
195
+ return panelId === id;
196
+ });
197
+ return panelGroup.map((panel) => {
198
+ return {
199
+ ...panel,
200
+ active:
201
+ panelId === panel.id
202
+ ? true
203
+ : isPanelInGroup
204
+ ? false
205
+ : panel.active,
206
+ fullScreen:
207
+ panelId === panel.id
208
+ ? !panel.fullScreen
209
+ : isPanelInGroup
210
+ ? false
211
+ : panel.fullScreen
212
+ };
213
+ });
214
+ });
215
+ },
216
+ [collapsePanel]: (state, panelToCloseId) => {
217
+ return [
218
+ flatMap(state, (panelGroup) => {
219
+ return panelGroup;
220
+ }).map((panel) => {
221
+ if (panel.id === panelToCloseId) {
222
+ return {
223
+ ...panel,
224
+ active: false
225
+ };
226
+ }
227
+ return panel;
228
+ })
229
+ ];
230
+ }
231
+ },
232
+ [
233
+ [
234
+ {
235
+ id: "circular",
236
+ name: "Circular Map",
237
+ active: true
238
+ // canClose: true
239
+ },
240
+ {
241
+ id: "rail",
242
+ name: "Linear Map",
243
+ active: false
244
+ }
245
+ ],
246
+ [
247
+ {
248
+ id: "sequence",
249
+ name: "Sequence Map",
250
+ active: true
251
+ },
252
+ {
253
+ id: "properties",
254
+ name: "Properties",
255
+ active: false
256
+ }
257
+ ]
258
+ ]
259
+ );
260
+
261
+ function flipActiveForGroup(group, setCircActive) {
262
+ const activeTab = group.find(({ active }) => active);
263
+ if (activeTab?.id === (setCircActive ? "rail" : "circular")) {
264
+ //we're on the wrong tab type so check if the other tab is in
265
+ const newTabToActivate = group.find(
266
+ ({ id }) => id === (setCircActive ? "circular" : "rail")
267
+ );
268
+ if (newTabToActivate) {
269
+ newTabToActivate.active = true;
270
+ activeTab.active = false;
271
+ }
272
+ }
273
+ }
@@ -0,0 +1,23 @@
1
+ import createMergedDefaultStateReducer from "./utils/createMergedDefaultStateReducer";
2
+ import createAction from "./utils/createMetaAction";
3
+
4
+ // ------------------------------------
5
+ // Actions
6
+ // ------------------------------------
7
+ export const updatePartLengthsToHide = createAction("updatePartLengthsToHide");
8
+ export const togglePartLengthsToHide = createAction("togglePartLengthsToHide");
9
+
10
+ // ------------------------------------
11
+ // Reducer
12
+ // ------------------------------------
13
+ export default createMergedDefaultStateReducer(
14
+ {
15
+ [updatePartLengthsToHide]: (state, payload) => {
16
+ return { ...state, ...payload };
17
+ },
18
+ [togglePartLengthsToHide]: (state) => {
19
+ return { ...state, enabled: !state["enabled"] };
20
+ }
21
+ },
22
+ { enabled: false, min: 0, max: 800 }
23
+ );