@teselagen/ove 0.7.27 → 0.7.28

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 (304) hide show
  1. package/AASliver.js +187 -0
  2. package/AddLaddersDialog.js +82 -0
  3. package/AdditionalCutsiteInfoDialog.js +599 -0
  4. package/AlignmentView/Mismatches.d.ts +3 -3
  5. package/AlignmentVisibilityTool.js +105 -0
  6. package/AnnotationContainerHolder.js +20 -0
  7. package/AnnotationPositioner.js +27 -0
  8. package/AutoAnnotate.js +501 -0
  9. package/AutoAnnotateBpMatchingDialog.js +208 -0
  10. package/Axis.js +151 -0
  11. package/AxisNumbers.js +35 -0
  12. package/Browser.js +106 -0
  13. package/Caret.js +63 -0
  14. package/Chromatogram.js +293 -0
  15. package/CircularDnaSequence.js +73 -0
  16. package/CircularView/Labels/index.d.ts +1 -1
  17. package/CircularView/index.d.ts +0 -1
  18. package/CircularZoomMinimap.js +16 -0
  19. package/ColorPicker.js +30 -0
  20. package/CommandHotkeyHandler.js +44 -0
  21. package/CreateAnnotationsPage.d.ts +4 -4
  22. package/CreateAnnotationsPage.js +98 -0
  23. package/Cutsite.js +18 -0
  24. package/CutsiteProperties.js +176 -0
  25. package/CutsiteSelectionLayers.js +47 -0
  26. package/Cutsites.js +271 -0
  27. package/DeletionLayer.js +28 -0
  28. package/DigestTool/Ladder.d.ts +1 -1
  29. package/DropHandler.css +21 -0
  30. package/DropHandler.js +64 -0
  31. package/EditCaretPosition.js +234 -0
  32. package/EditTrackNameDialog.js +30 -0
  33. package/Feature.js +83 -0
  34. package/FeatureProperties.js +6 -0
  35. package/FillWindow.js +47 -0
  36. package/GenbankView.js +74 -0
  37. package/GeneralProperties.js +117 -0
  38. package/GenericAnnotationProperties.js +406 -0
  39. package/GlobalDialog.js +73 -0
  40. package/GlobalDialogUtils.js +110 -0
  41. package/GoToDialog.js +25 -0
  42. package/HorizontalPanelDragHandle.js +35 -0
  43. package/Keyboard.js +85 -0
  44. package/Labels.js +327 -0
  45. package/Ladder.css +20 -0
  46. package/Ladder.js +303 -0
  47. package/MeltingTemp.js +85 -0
  48. package/Menlo.ttf +0 -0
  49. package/Minimap.js +515 -0
  50. package/Mismatches.js +134 -0
  51. package/Monaco.ttf +0 -0
  52. package/MultipleSeqsDetectedOnImportDialog.js +74 -0
  53. package/Orf.js +109 -0
  54. package/OrfProperties.js +117 -0
  55. package/Orfs.js +35 -0
  56. package/PCRTool.js +179 -0
  57. package/PairwiseAlignmentView.js +68 -0
  58. package/Part.js +34 -0
  59. package/PartProperties.js +9 -0
  60. package/PassThrough.js +3 -0
  61. package/PerformantSelectionLayer.js +32 -0
  62. package/PinchHelper.js +24 -0
  63. package/PointedAnnotation.js +347 -0
  64. package/PositionAnnotationOnCircle.js +26 -0
  65. package/Primer.js +41 -0
  66. package/PrimerProperties.js +19 -0
  67. package/Reflex/index.d.ts +0 -1
  68. package/ReflexContainer.js +802 -0
  69. package/ReflexElement.js +160 -0
  70. package/ReflexEvents.js +77 -0
  71. package/ReflexSplitter.js +205 -0
  72. package/RenameSequenceDialog.js +7 -0
  73. package/RotateCircularViewSlider.js +93 -0
  74. package/RowView/index.d.ts +0 -1
  75. package/SelectDialog.js +150 -0
  76. package/SequenceName.js +15 -0
  77. package/SimpleCircularOrLinearView.js +381 -0
  78. package/SimpleOligoPreview.js +39 -0
  79. package/SingleEnzymeCutsiteInfo.js +139 -0
  80. package/ToolBar/ToolbarItem.d.ts +1 -3
  81. package/ToolbarItem.js +192 -0
  82. package/Translation.js +198 -0
  83. package/TranslationProperties.js +149 -0
  84. package/UncontrolledSliderWithPlusMinusBtns.css +5 -0
  85. package/UncontrolledSliderWithPlusMinusBtns.js +134 -0
  86. package/VeTopRightContainer.js +12 -0
  87. package/ZoomCircularViewSlider.js +62 -0
  88. package/ZoomLinearView.js +47 -0
  89. package/addAlignment.js +6 -0
  90. package/addMetaToActionCreators.js +12 -0
  91. package/addWrappedAddons.js +20 -0
  92. package/alignmentTool.js +503 -0
  93. package/alignments.js +379 -0
  94. package/annotationLabelVisibility.js +2 -0
  95. package/annotationSearchSelector.js +24 -0
  96. package/annotationTypes.js +35 -0
  97. package/annotationVisibility.js +196 -0
  98. package/annotationsToSupport.js +104 -0
  99. package/arrayToObjWithIds.js +17 -0
  100. package/arrayUtils.js +19 -0
  101. package/array_move.js +10 -0
  102. package/calculateTickMarkPositionsForGivenRange.js +47 -0
  103. package/caretPosition.js +27 -0
  104. package/cdsFeaturesSelector.js +9 -0
  105. package/charWidth.js +22 -0
  106. package/circular.js +19 -0
  107. package/circularSelector.js +4 -0
  108. package/clickAndDragUtils.js +576 -0
  109. package/coerceInitialValue.js +7 -0
  110. package/combineReducersDontIgnoreKeys.js +12 -0
  111. package/commandUtils.js +20 -0
  112. package/constants.js +2 -0
  113. package/copyOptions.js +34 -0
  114. package/createFragmentLines.js +120 -0
  115. package/createMergedDefaultStateReducer.js +30 -0
  116. package/createMetaAction.js +12 -0
  117. package/createSequenceInputPopup.js +290 -0
  118. package/createSequenceInputPopupStyle.css +87 -0
  119. package/createSimpleDialog.js +89 -0
  120. package/createYourOwnEnzyme.js +39 -0
  121. package/cutsiteLabelColorSelector.js +6 -0
  122. package/cutsiteTool.js +88 -0
  123. package/cutsitesByRangeSelector.js +5 -0
  124. package/cutsitesSelector.js +61 -0
  125. package/darkmode.css +98 -0
  126. package/defaultConfig.js +150 -0
  127. package/deletionLayers.js +36 -0
  128. package/description.js +21 -0
  129. package/digestTool.js +34 -0
  130. package/dnaToColor.js +17 -0
  131. package/downloadTool.js +39 -0
  132. package/draggableClassnames.js +5 -0
  133. package/drawAnnotations.js +440 -0
  134. package/drawDirectedPiePiece.js +142 -0
  135. package/editTool.js +49 -0
  136. package/editorSelector.js +2 -0
  137. package/editorUtils.js +205 -0
  138. package/estimateRowHeight.js +184 -0
  139. package/featureLengthsToHide.js +27 -0
  140. package/featureTool.js +34 -0
  141. package/features.js +19 -0
  142. package/featuresSelector.js +8 -0
  143. package/filteredCutsitesSelector.js +136 -0
  144. package/filteredFeaturesSelector.js +32 -0
  145. package/filteredPartsSelector.js +57 -0
  146. package/filteredPrimersSelector.js +27 -0
  147. package/filteredRestrictionEnzymesSelector.js +1 -0
  148. package/find.png +0 -0
  149. package/findTool.js +79 -0
  150. package/findToolConstants.js +1 -0
  151. package/frameTranslations.js +52 -0
  152. package/fullscreen.png +0 -0
  153. package/getAdditionalEnzymesSelector.js +46 -0
  154. package/getAngleForPositionMidpoint.js +3 -0
  155. package/getAnnotationClassnames.js +12 -0
  156. package/getAnnotationNameAndStartStopString.js +61 -0
  157. package/getBpsPerRow.js +19 -0
  158. package/getCutsiteLabelHeights.js +56 -0
  159. package/getGapMap.js +12 -0
  160. package/getGaps.js +27 -0
  161. package/getInternalLabel.js +40 -0
  162. package/getOveHotkeyDefs.js +12 -0
  163. package/getPairwiseOverviewLinearViewOptions.js +38 -0
  164. package/getRangeAnglesSpecial.js +12 -0
  165. package/getStructuredBases.js +97 -0
  166. package/getTrackFromEvent.js +25 -0
  167. package/getVisibleStartEnd.js +7 -0
  168. package/getXStartAndWidthFromNonCircularRange.js +12 -0
  169. package/getXStartAndWidthOfRangeWrtRow.js +27 -0
  170. package/getXStartAndWidthOfRowAnnotation.js +19 -0
  171. package/getYOffset.js +15 -0
  172. package/hoveredAnnotation.js +24 -0
  173. package/{html2canvas.esm--JN4fLQL.js → html2canvas.esm-DiGWN1gP.js} +187 -229
  174. package/{html2canvas.esm-B7d7VJmQ.cjs → html2canvas.esm-J1esNpMJ.cjs} +187 -229
  175. package/importTool.js +27 -0
  176. package/index.cjs.js +48165 -47142
  177. package/index.es.js +47699 -46676
  178. package/index.js +71 -0
  179. package/inlineFindTool.js +38 -0
  180. package/isElementInViewport.js +29 -0
  181. package/isEnzymeFilterAndSelector.js +1 -0
  182. package/isTargetWithinEl.js +6 -0
  183. package/labelLineIntensity.js +25 -0
  184. package/labelSize.js +23 -0
  185. package/ladderDefaults.js +25 -0
  186. package/lastSavedId.js +20 -0
  187. package/lineageLines.js +11 -0
  188. package/linear.png +0 -0
  189. package/makeStore.js +34 -0
  190. package/massageTickSpacing.js +19 -0
  191. package/materiallyAvailable.js +19 -0
  192. package/middleware.js +112 -0
  193. package/minimumOrfSize.js +24 -0
  194. package/minimumOrfSizeSelector.js +2 -0
  195. package/modalActions.js +3 -0
  196. package/moveCaret.js +58 -0
  197. package/name.js +19 -0
  198. package/normalizeAngle.js +3 -0
  199. package/normalizeAngleRange.js +9 -0
  200. package/oligoTool.js +30 -0
  201. package/onlyUpdateForKeysDeep.js +31 -0
  202. package/orfFrameToColorMap.js +10 -0
  203. package/orfTool.js +136 -0
  204. package/orfsSelector.js +15 -0
  205. package/ove.css +12107 -0
  206. package/package.json +6 -5
  207. package/panelsShown.js +294 -0
  208. package/partLengthsToHide.js +23 -0
  209. package/partOverhangs.js +6 -0
  210. package/partTagSearch.js +69 -0
  211. package/partTool.js +45 -0
  212. package/parts.js +19 -0
  213. package/partsSelector.js +8 -0
  214. package/pie.png +0 -0
  215. package/polarToSpecialCartesian.js +7 -0
  216. package/positionCutsites.js +6 -0
  217. package/prepareRowData.js +64 -0
  218. package/primerBases.js +221 -0
  219. package/primerLengthsToHide.js +27 -0
  220. package/primers.js +19 -0
  221. package/primersSelector.js +8 -0
  222. package/print.png +0 -0
  223. package/printTool.js +31 -0
  224. package/propertiesTool.js +40 -0
  225. package/proteinUtils.js +3 -0
  226. package/pureNoFunc.js +18 -0
  227. package/readOnly.js +25 -0
  228. package/redoTool.js +30 -0
  229. package/reflex-styles.css +128 -0
  230. package/reflex-styles.css.map +9 -0
  231. package/relaxLabelAngles.js +157 -0
  232. package/relaxLabels_DEPRECATED.js +105 -0
  233. package/replacementLayers.js +36 -0
  234. package/restrictionEnzymes.js +52 -0
  235. package/restrictionEnzymesSelector.js +34 -0
  236. package/rowviewContants.js +3 -0
  237. package/ruler.css +89 -0
  238. package/save.png +0 -0
  239. package/saveTool.js +44 -0
  240. package/searchLayersSelector.js +71 -0
  241. package/selectedAnnotations.js +89 -0
  242. package/selectedAnnotationsSelector.js +1 -0
  243. package/selectedCutsitesSelector.js +21 -0
  244. package/selectedPartTags.js +21 -0
  245. package/selectionLayer.js +25 -0
  246. package/selectors/annotationSearchSelector.d.ts +1 -1
  247. package/sequence.js +12 -0
  248. package/sequenceDataHistory.js +43 -0
  249. package/sequenceDataSelector.js +2 -0
  250. package/sequenceLengthSelector.js +5 -0
  251. package/sequenceSelector.js +4 -0
  252. package/sharedActionCreators.js +0 -0
  253. package/shouldFlipText.js +4 -0
  254. package/shouldRerender.js +27 -0
  255. package/showFileDialog.js +25 -0
  256. package/showGCContent.js +23 -0
  257. package/show_cut_sites.png +0 -0
  258. package/show_features.png +0 -0
  259. package/show_orfs.png +0 -0
  260. package/show_primers.png +0 -0
  261. package/simpleDialog.css +13 -0
  262. package/specialCutsiteFilterOptions.js +22 -0
  263. package/src/Editor/DropHandler.js +2 -1
  264. package/src/Editor/index.js +0 -2
  265. package/src/RowItem/StackedAnnotations/getStructuredBases.js +20 -6
  266. package/src/ToolBar/cutsiteTool.js +1 -1
  267. package/src/helperComponents/PropertiesDialog/TranslationProperties.js +2 -1
  268. package/style.css +3 -12100
  269. package/tagsToBoldSelector.js +2 -0
  270. package/toggle_views.svg +1 -0
  271. package/toolBar.js +23 -0
  272. package/translationSearchMatchesSelector.js +14 -0
  273. package/translations.js +20 -0
  274. package/translationsRawSelector.js +8 -0
  275. package/translationsSelector.js +137 -0
  276. package/typeField.js +24 -0
  277. package/undoTool.js +30 -0
  278. package/updateEditor.d.ts +1 -3
  279. package/updateEditor.js +200 -0
  280. package/updateLabelsForInViewFeatures.js +55 -0
  281. package/updateLabelsForInViewFeaturesCircView.js +41 -0
  282. package/updateTrackHelper.js +58 -0
  283. package/uppercaseSequenceMapFont.js +25 -0
  284. package/upsertDeleteActionGenerator.js +31 -0
  285. package/useAAColorType.js +8 -0
  286. package/useAdditionalOrfStartCodons.js +24 -0
  287. package/useAnnotationLimits.js +42 -0
  288. package/useChromatogramPrefs.js +31 -0
  289. package/useFormValue.js +7 -0
  290. package/useLadders.js +6 -0
  291. package/useMeltingTemp.js +7 -0
  292. package/useTmType.js +10 -0
  293. package/userDefinedHandlersAndOpts.js +61 -0
  294. package/utils/getAnnotationNameAndStartStopString.d.ts +1 -5
  295. package/utils/selectionLayer.d.ts +2 -2
  296. package/utils.js +37 -0
  297. package/versionHistory.js +26 -0
  298. package/versionHistoryTool.js +21 -0
  299. package/viewSubmenu.js +479 -0
  300. package/visibilityTool.js +39 -0
  301. package/withEditorInteractions/getBpsPerRow.d.ts +1 -3
  302. package/withHover.js +113 -0
  303. package/withRestrictionEnzymes.js +15 -0
  304. package/index.umd.js +0 -188322
package/viewSubmenu.js ADDED
@@ -0,0 +1,479 @@
1
+ import { MenuItem } from "@blueprintjs/core";
2
+ import React from "react";
3
+ import { InfoHelper } from "@teselagen/ui";
4
+ import useAAColorType from "../utils/useAAColorType";
5
+ import { LimitAnnotations } from "../utils/useAnnotationLimits";
6
+ import { chromatogramMenu } from "../utils/useChromatogramPrefs";
7
+ import useMeltingTemp from "../utils/useMeltingTemp";
8
+
9
+ export const translationsSubmenu = [
10
+ {
11
+ cmd: "toggleTranslations",
12
+ shouldDismissPopover: false
13
+ },
14
+ {
15
+ cmd: "toggleCdsFeatureTranslations",
16
+ shouldDismissPopover: false
17
+ },
18
+ {
19
+ cmd: "toggleOrfTranslations",
20
+ shouldDismissPopover: false
21
+ },
22
+ { cmd: "toggleAminoAcidNumbers_dna", shouldDismissPopover: false }
23
+ ];
24
+ export const orfsSubmenu = [
25
+ {
26
+ cmd: "toggleOrfs",
27
+ shouldDismissPopover: false
28
+ },
29
+ {
30
+ cmd: "toggleOrfTranslations",
31
+ shouldDismissPopover: false
32
+ },
33
+ {
34
+ cmd: "useGtgAndCtgAsStartCodons",
35
+ shouldDismissPopover: false
36
+ },
37
+ {
38
+ cmd: "minOrfSizeCmd",
39
+ shouldDismissPopover: false
40
+ }
41
+ ];
42
+ export const cutsitesSubmenu = [
43
+ {
44
+ cmd: "toggleCutsites",
45
+ shouldDismissPopover: false
46
+ }
47
+ ];
48
+ export const featuresSubmenu = [
49
+ {
50
+ cmd: "toggleFeatures",
51
+ shouldDismissPopover: false
52
+ },
53
+ "onConfigureFeatureTypesClick",
54
+ {
55
+ cmd: "featureTypesCmd",
56
+ shouldDismissPopover: false
57
+ },
58
+ {
59
+ cmd: "featureFilterIndividualCmd",
60
+ shouldDismissPopover: false
61
+ },
62
+ {
63
+ cmd: "filterFeatureLengthsCmd",
64
+ shouldDismissPopover: false
65
+ }
66
+ ];
67
+ export const partsSubmenu = props => {
68
+ return [
69
+ {
70
+ cmd: "toggleParts",
71
+ shouldDismissPopover: false
72
+ },
73
+ {
74
+ cmd: "partFilterIndividualCmd",
75
+ shouldDismissPopover: false
76
+ },
77
+ ...(props.allPartTags
78
+ ? [
79
+ {
80
+ cmd: "filterPartsByTagCmd",
81
+ shouldDismissPopover: false
82
+ }
83
+ ]
84
+ : []),
85
+ {
86
+ cmd: "filterPartLengthsCmd",
87
+ shouldDismissPopover: false
88
+ }
89
+ ];
90
+ };
91
+ export const primersSubmenu = [
92
+ {
93
+ cmd: "togglePrimers",
94
+ shouldDismissPopover: false
95
+ },
96
+ {
97
+ cmd: "primerFilterIndividualCmd",
98
+ shouldDismissPopover: false
99
+ },
100
+ {
101
+ cmd: "filterPrimerLengthsCmd",
102
+ shouldDismissPopover: false
103
+ }
104
+ ];
105
+
106
+ export const fullSequenceTranslationMenu = {
107
+ text: "Full Sequence Translation",
108
+ cmd: "fullSequenceTranslations",
109
+ submenu: [
110
+ {
111
+ shouldDismissPopover: false,
112
+ cmd: "sequenceAA_allFrames",
113
+ text: "All Frames"
114
+ // frameNumber: "all" // TODO ?
115
+ },
116
+ {
117
+ shouldDismissPopover: false,
118
+ cmd: "sequenceAA_frame1",
119
+ text: "Frame 1"
120
+ // frameNumber: 1 // TODO ?
121
+ },
122
+ {
123
+ shouldDismissPopover: false,
124
+ cmd: "sequenceAA_frame2",
125
+ text: "Frame 2"
126
+ // frameNumber: 2 // TODO ?
127
+ },
128
+ {
129
+ shouldDismissPopover: false,
130
+ cmd: "sequenceAA_frame3",
131
+ text: "Frame 3"
132
+ // frameNumber: 3 // TODO ?
133
+ },
134
+ {
135
+ shouldDismissPopover: false,
136
+ cmd: "sequenceAAReverse_allFrames",
137
+ text: "All Reverse Frames"
138
+ // frameNumber: "all" // TODO ?
139
+ },
140
+ {
141
+ shouldDismissPopover: false,
142
+ cmd: "sequenceAAReverse_frame1",
143
+ text: "Frame -1"
144
+ // frameNumber: 1 // TODO ?
145
+ },
146
+ {
147
+ shouldDismissPopover: false,
148
+ cmd: "sequenceAAReverse_frame2",
149
+ text: "Frame -2"
150
+ // frameNumber: 2 // TODO ?
151
+ },
152
+ {
153
+ shouldDismissPopover: false,
154
+ cmd: "sequenceAAReverse_frame3",
155
+ text: "Frame -3"
156
+ // frameNumber: 3 // TODO ?
157
+ }
158
+ ]
159
+ };
160
+ export default [
161
+ // { cmd: "mapCaret" },
162
+ { cmd: "showAll", shouldDismissPopover: false },
163
+ { cmd: "hideAll", shouldDismissPopover: false },
164
+ {
165
+ cmd: "toggleChromatogram",
166
+ shouldDismissPopover: false,
167
+ submenu: [
168
+ { cmd: "toggleChromatogram", shouldDismissPopover: false },
169
+ chromatogramMenu
170
+ ]
171
+ },
172
+ { cmd: "toggleWarnings", shouldDismissPopover: false },
173
+ { cmd: "toggleAssemblyPieces", shouldDismissPopover: false },
174
+ { cmd: "toggleLineageAnnotations", shouldDismissPopover: false },
175
+ //deprecating
176
+ //{ cmd: "toggleFeatures", shouldDismissPopover: false },
177
+ {
178
+ cmd: "toggleFeatures",
179
+ // onClick: () => {}, //commenting this out to allow top level clicking -- https://github.com/TeselaGen/openVectorEditor/issues/865)
180
+ shouldDismissPopover: false,
181
+ submenu: featuresSubmenu
182
+ },
183
+ {
184
+ cmd: "toggleTranslations",
185
+ // onClick: () => {}, //commenting this out to allow top level clicking -- https://github.com/TeselaGen/openVectorEditor/issues/865)
186
+ shouldDismissPopover: false,
187
+ submenu: translationsSubmenu
188
+ },
189
+ { cmd: "togglePrimers", shouldDismissPopover: false },
190
+ // {
191
+ // // TODO preprocess this as needed
192
+ // cmd: "featureTypes",
193
+ // itemId: "featureTypes",
194
+ // //submenu of checklist of all feature types here
195
+ // submenu: [{ text: "TO DO...", disabled: true }]
196
+ // },
197
+ {
198
+ cmd: "togglePartsWithSubmenu",
199
+ // onClick: () => {}, //commenting this out to allow top level clicking -- https://github.com/TeselaGen/openVectorEditor/issues/865)
200
+ shouldDismissPopover: false
201
+ },
202
+ { cmd: "toggleCutsites", shouldDismissPopover: false },
203
+ // TODO translations, cds feature translations?
204
+ {
205
+ cmd: "toggleOrfs",
206
+ // onClick: () => {}, //commenting this out to allow top level clicking -- https://github.com/TeselaGen/openVectorEditor/issues/865)
207
+ shouldDismissPopover: false,
208
+ submenu: orfsSubmenu
209
+ },
210
+ // { cmd: "complementary" },
211
+ // { cmd: "spaces" },
212
+ { divider: "" },
213
+ {
214
+ cmd: "toggleShowGCContent",
215
+ shouldDismissPopover: false,
216
+ text: "Percent GC Content of Selection"
217
+ },
218
+ {
219
+ text: "Melting Temp of Selection",
220
+ component: ToggleShowMeltingTemp
221
+ },
222
+ { divider: "" },
223
+ fullSequenceTranslationMenu,
224
+ { divider: "" },
225
+
226
+ { cmd: "toggleAxis", shouldDismissPopover: false },
227
+ { cmd: "toggleAxisNumbers", shouldDismissPopover: false },
228
+ {
229
+ cmd: "toggleAminoAcidNumbers_protein",
230
+ shouldDismissPopover: false
231
+ },
232
+ {
233
+ text: "Amino Acid Colors (by Hydrophobicity/by Family)",
234
+ component: function AAColorType(props) {
235
+ const [aaColorType, setAAColorType] = useAAColorType();
236
+ return (
237
+ <MenuItem
238
+ {...props}
239
+ text="Amino Acid Colors"
240
+ shouldDismissPopover={false}
241
+ >
242
+ <MenuItem
243
+ {...props}
244
+ text={
245
+ <div style={{ display: "flex" }}>
246
+ <span style={{ marginRight: 10 }}>Color By Hydrophobicity</span>
247
+ <InfoHelper
248
+ content={
249
+ <div style={{ color: "white" }}>
250
+ <div
251
+ style={{
252
+ padding: 2,
253
+ backgroundColor: "hsl(258.1, 100%, 69%)"
254
+ }}
255
+ >
256
+ More Hydrophilic (4.5)
257
+ </div>
258
+ <div
259
+ style={{
260
+ padding: 2,
261
+ backgroundColor: "hsl(356.9, 100%, 69%)"
262
+ }}
263
+ >
264
+ More Hydrophobic (-4.5)
265
+ </div>
266
+ </div>
267
+ }
268
+ ></InfoHelper>
269
+ </div>
270
+ }
271
+ shouldDismissPopover={false}
272
+ onClick={() => {
273
+ setAAColorType("byHydrophobicity");
274
+ }}
275
+ icon={aaColorType === "byHydrophobicity" ? "small-tick" : "blank"}
276
+ ></MenuItem>
277
+ <MenuItem
278
+ {...props}
279
+ text={
280
+ <div style={{ display: "flex" }}>
281
+ <span style={{ marginRight: 10 }}>Color By Family</span>
282
+ <InfoHelper
283
+ content={
284
+ <div style={{ color: "black" }}>
285
+ <div style={{ padding: 2, backgroundColor: "#FFC0CB" }}>
286
+ Positive: K, H, R
287
+ </div>
288
+ <div style={{ padding: 2, backgroundColor: "#EE82EE" }}>
289
+ Negative: D, E
290
+ </div>
291
+ <div style={{ padding: 2, backgroundColor: "#D3D3D3" }}>
292
+ Amidic: N, Q
293
+ </div>
294
+ <div style={{ padding: 2, backgroundColor: "#00FFFF" }}>
295
+ Aliphatic: A, G, L, I, P, V
296
+ </div>
297
+ <div style={{ padding: 2, backgroundColor: "#FFA500" }}>
298
+ Aromatic: F, W, Y
299
+ </div>
300
+ <div style={{ padding: 2, backgroundColor: "#FFFF00" }}>
301
+ Sulfur: C, M
302
+ </div>
303
+ <div style={{ padding: 2, backgroundColor: "#90EE90" }}>
304
+ Hydroxylic: S, T
305
+ </div>
306
+ </div>
307
+ }
308
+ ></InfoHelper>
309
+ </div>
310
+ }
311
+ shouldDismissPopover={false}
312
+ onClick={() => {
313
+ setAAColorType("byFamily");
314
+ }}
315
+ icon={aaColorType === "byFamily" ? "small-tick" : "blank"}
316
+ ></MenuItem>
317
+ </MenuItem>
318
+ );
319
+ },
320
+ shouldDismissPopover: false
321
+ },
322
+ { cmd: "toggleDnaColors", shouldDismissPopover: false },
323
+ {
324
+ text: "Sequence",
325
+ submenu: [
326
+ { cmd: "toggleSequence", shouldDismissPopover: false },
327
+ { cmd: "toggleFivePrimeThreePrimeHints", shouldDismissPopover: false },
328
+ { cmd: "toggleReverseSequence", shouldDismissPopover: false },
329
+
330
+ {
331
+ text: "Case",
332
+ cmd: "sequenceCase",
333
+ submenu: [
334
+ {
335
+ cmd: "toggleSequenceMapFontUpper",
336
+ text: "Upper Case",
337
+ shouldDismissPopover: false
338
+ },
339
+ {
340
+ cmd: "toggleSequenceMapFontRaw",
341
+ text: "No Preference",
342
+ shouldDismissPopover: false
343
+ },
344
+ {
345
+ cmd: "toggleSequenceMapFontLower",
346
+ text: "Lower Case",
347
+ shouldDismissPopover: false
348
+ }
349
+ ]
350
+ },
351
+ {
352
+ cmd: "setRowViewSequenceSpacing",
353
+ shouldDismissPopover: false
354
+ }
355
+ ]
356
+ },
357
+
358
+ { divider: "" },
359
+ {
360
+ text: "Limits",
361
+ cmd: "limitsMenu",
362
+ submenu: [
363
+ {
364
+ text: "Max Features To Show",
365
+ component: LimitAnnotations,
366
+ type: "features"
367
+ },
368
+ {
369
+ text: "Max Parts To Show",
370
+ type: "parts",
371
+ component: LimitAnnotations
372
+ },
373
+ {
374
+ text: "Max Cut Sites To Show",
375
+ component: LimitAnnotations,
376
+ type: "cutsites"
377
+ },
378
+ {
379
+ text: "Max Primers To Show",
380
+ component: LimitAnnotations,
381
+ type: "primers"
382
+ },
383
+ {
384
+ text: "Max Warnings To Show",
385
+ component: LimitAnnotations,
386
+ type: "warnings"
387
+ },
388
+ {
389
+ text: "Max Assembly Pieces To Show",
390
+ component: LimitAnnotations,
391
+ type: "assemblyPieces"
392
+ },
393
+ {
394
+ text: "Max Lineage Annotations To Show",
395
+ component: LimitAnnotations,
396
+ type: "lineageAnnotations"
397
+ }
398
+ ]
399
+ },
400
+ {
401
+ text: "Labels",
402
+ submenu: [
403
+ { divider: "External Labels:" },
404
+ {
405
+ text: "Show All",
406
+ hiddenButSearchableText: "labels",
407
+ cmd: "showAllLabels",
408
+ shouldDismissPopover: false
409
+ },
410
+ {
411
+ text: "Hide All",
412
+ hiddenButSearchableText: "labels",
413
+ cmd: "hideAllLabels",
414
+ shouldDismissPopover: false
415
+ },
416
+ {
417
+ text: "Features",
418
+ hiddenButSearchableText: "labels",
419
+ cmd: "toggleFeatureLabels",
420
+ shouldDismissPopover: false
421
+ },
422
+ {
423
+ text: "Parts",
424
+ hiddenButSearchableText: "labels",
425
+ cmd: "togglePartLabels",
426
+ shouldDismissPopover: false
427
+ },
428
+ {
429
+ text: "Cutsites",
430
+ hiddenButSearchableText: "labels",
431
+ cmd: "toggleCutsiteLabels",
432
+ shouldDismissPopover: false
433
+ },
434
+ {
435
+ text: "Assembly Pieces",
436
+ hiddenButSearchableText: "labels",
437
+ cmd: "toggleAssemblyPieceLabels",
438
+ shouldDismissPopover: false
439
+ },
440
+ {
441
+ text: "LineageAnnotations",
442
+ hiddenButSearchableText: "labels",
443
+ cmd: "toggleLineageAnnotationLabels",
444
+ shouldDismissPopover: false
445
+ },
446
+ {
447
+ text: "Warnings",
448
+ hiddenButSearchableText: "labels",
449
+ cmd: "toggleWarningLabels",
450
+ shouldDismissPopover: false
451
+ },
452
+ {
453
+ text: "Primers",
454
+ hiddenButSearchableText: "labels",
455
+ cmd: "togglePrimerLabels",
456
+ shouldDismissPopover: false
457
+ },
458
+
459
+ { divider: "" },
460
+
461
+ { cmd: "adjustLabelLineIntensity", shouldDismissPopover: false },
462
+ { cmd: "adjustLabelSize", shouldDismissPopover: false }
463
+ ]
464
+ }
465
+ ];
466
+
467
+ function ToggleShowMeltingTemp(props) {
468
+ const [showMeltingTemp, setShowMeltingTemp] = useMeltingTemp();
469
+ return (
470
+ <MenuItem
471
+ {...props}
472
+ shouldDismissPopover={false}
473
+ onClick={() => {
474
+ setShowMeltingTemp(!showMeltingTemp);
475
+ }}
476
+ icon={showMeltingTemp ? "small-tick" : "blank"}
477
+ ></MenuItem>
478
+ );
479
+ }
@@ -0,0 +1,39 @@
1
+ import { Icon, Menu } from "@blueprintjs/core";
2
+ import React from "react";
3
+ import { createCommandMenu } from "@teselagen/ui";
4
+ import viewSubmenu from "../MenuBar/viewSubmenu";
5
+ import getCommands from "../commands";
6
+ import ToolbarItem from "./ToolbarItem";
7
+ import { connectToEditor } from "../withEditorProps";
8
+ import withEditorProps from "../withEditorProps";
9
+
10
+ export default connectToEditor(({ toolBar = {} }) => {
11
+ return {
12
+ isOpen: toolBar.openItem === "visibilityTool"
13
+ };
14
+ })(({ toolbarItemProps, isOpen }) => {
15
+ return (
16
+ <ToolbarItem
17
+ {...{
18
+ Icon: <Icon icon="eye-open" />,
19
+ onIconClick: "toggleDropdown",
20
+ Dropdown: VisibilityOptions,
21
+ noDropdownIcon: true,
22
+ toggled: isOpen,
23
+ tooltip: isOpen ? "Hide Visibility Options" : "Show Visibility Options",
24
+ ...toolbarItemProps
25
+ }}
26
+ />
27
+ );
28
+ });
29
+
30
+ const VisibilityOptions = withEditorProps(function (props) {
31
+ return (
32
+ <Menu>
33
+ {createCommandMenu(viewSubmenu, getCommands({ props }), {
34
+ useTicks: true,
35
+ omitIcons: true
36
+ })}
37
+ </Menu>
38
+ );
39
+ });
@@ -1,9 +1,7 @@
1
1
  export default function getBpsPerRow({ charWidth, width, dimensions: { width: width2 }, marginWidth, sequenceData }: {
2
2
  charWidth?: number | undefined;
3
3
  width?: number | undefined;
4
- dimensions?: {
5
- width: any;
6
- } | undefined;
4
+ dimensions?: {} | undefined;
7
5
  marginWidth?: number | undefined;
8
6
  sequenceData: any;
9
7
  }): number;
package/withHover.js ADDED
@@ -0,0 +1,113 @@
1
+ import classnames from "classnames";
2
+ import { compose } from "redux";
3
+ import { connect } from "react-redux";
4
+ import React from "react";
5
+ import { store } from "@risingstack/react-easy-state";
6
+ import * as hoveredAnnotationActions from "../redux/hoveredAnnotation";
7
+ import { withHandlers, branch } from "recompose";
8
+ import { modifiableTypes } from "@teselagen/sequence-utils";
9
+
10
+ export const HoveredIdContext = React.createContext({
11
+ hoveredId: "" // default value
12
+ });
13
+
14
+ export function withHoveredIdFromContext(Component) {
15
+ return function HoveredIdComponent(props) {
16
+ return (
17
+ <HoveredIdContext.Consumer>
18
+ {contexts => <Component {...props} {...contexts} />}
19
+ </HoveredIdContext.Consumer>
20
+ );
21
+ };
22
+ }
23
+ export const hoveredAnnEasyStore = store({
24
+ hoveredAnn: undefined,
25
+ selectedAnn: undefined
26
+ });
27
+
28
+ export default compose(
29
+ withHoveredIdFromContext,
30
+ branch(
31
+ ({ noRedux }) => !noRedux,
32
+ connect(function (
33
+ state,
34
+ {
35
+ id,
36
+ editorName = "StandaloneEditor",
37
+ className,
38
+ hoveredId: hoveredIdFromContext,
39
+ passHoveredId
40
+ }
41
+ ) {
42
+ if (!editorName) {
43
+ console.warn(
44
+ "please pass an editorName to the withHover() wrapped component"
45
+ );
46
+ }
47
+ const editorState = state.VectorEditor[editorName] || {};
48
+ const hoveredId = editorState.hoveredAnnotation || hoveredIdFromContext; //we can pass a hoveredId from context in order to still use the hover functionality without being connected to redux! see http://localhost:3344/#/SimpleCircularOrLinearView for an example
49
+ const isIdHashmap = typeof id === "object";
50
+
51
+ const hovered = !!(isIdHashmap ? id[hoveredId] : hoveredId === id);
52
+ const newClassName = classnames(className, "hoverHelper", {
53
+ veAnnotationHovered: hovered
54
+ });
55
+ const toReturn = {
56
+ hovered,
57
+ className: newClassName
58
+ };
59
+ if (hovered && passHoveredId) {
60
+ //only pass hoveredId if it is hovered
61
+ toReturn.hoveredId = hoveredId;
62
+ }
63
+ return toReturn;
64
+ }, hoveredAnnotationActions)
65
+ ),
66
+ withHandlers({
67
+ onMouseOver: props =>
68
+ function (e) {
69
+ // loop through the target element and the parents and see if any of them have the hoverHelper class
70
+ // if they do, then we don't want to trigger the hover event
71
+ // if they don't, then we do want to trigger the hover event
72
+ // we should stop the loop if the target element is implementing this onMouseOver event
73
+ // e.stopPropagation(); //this is important otherwise hovering labels inside circular view label groups won't work
74
+ const target = e.target;
75
+ let alreadyHandled = false;
76
+ let currentElement = target;
77
+ while (currentElement) {
78
+ if (currentElement === e.currentTarget) {
79
+ break;
80
+ }
81
+ // console.log(`currentElement:`, currentElement)
82
+
83
+ if (currentElement.classList.contains("hoverHelper")) {
84
+ alreadyHandled = true;
85
+ break;
86
+ }
87
+ currentElement = currentElement.parentElement;
88
+ }
89
+ if (alreadyHandled) return;
90
+
91
+ // const alreadyHandled = e.target.classList.contains("hoverHelper");
92
+ const { editorName, id, hoveredAnnotationUpdate } = props;
93
+ const isIdHashmap = typeof id === "object";
94
+ const idToPass = isIdHashmap ? Object.keys(id)[0] : id;
95
+ const annot = props?.annotation || props?.label?.annotation;
96
+ if (modifiableTypes.includes(annot?.annotationTypePlural)) {
97
+ hoveredAnnEasyStore.hoveredAnn = annot;
98
+ }
99
+ //because the calling onHover can slow things down, we disable it if dragging or scrolling
100
+ if (window.__veDragging || window.__veScrolling) return;
101
+
102
+ hoveredAnnotationUpdate &&
103
+ hoveredAnnotationUpdate(idToPass, { editorName });
104
+ },
105
+ onMouseLeave: props => e => {
106
+ hoveredAnnEasyStore.hoveredAnn = undefined;
107
+ const { editorName, hoveredAnnotationClear } = props;
108
+ e.stopPropagation();
109
+ if (window.__veDragging || window.__veScrolling) return;
110
+ hoveredAnnotationClear && hoveredAnnotationClear(true, { editorName });
111
+ }
112
+ })
113
+ );
@@ -0,0 +1,15 @@
1
+ import { connectToEditor } from "../withEditorProps";
2
+ import restrictionEnzymesSelector from "../selectors/restrictionEnzymesSelector";
3
+
4
+ export const withRestrictionEnzymes = connectToEditor(
5
+ (editorState, ownProps) => {
6
+ const allRestrictionEnzymes = restrictionEnzymesSelector(
7
+ editorState,
8
+ ownProps.additionalEnzymes,
9
+ ownProps.enzymeGroupsOverride
10
+ );
11
+ return {
12
+ allRestrictionEnzymes
13
+ };
14
+ }
15
+ );