@teselagen/ove 0.7.26 → 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 +8 -7
  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/Ladder.js ADDED
@@ -0,0 +1,303 @@
1
+ /* eslint-disable react/jsx-no-bind */
2
+ import React, { useState } from "react";
3
+ import { showConfirmationDialog, TgSelect } from "@teselagen/ui";
4
+
5
+ import "./Ladder.css";
6
+ import { Button, Tooltip } from "@blueprintjs/core";
7
+ import { showDialog } from "../GlobalDialogUtils";
8
+ import { AddLaddersDialog } from "./AddLaddersDialog";
9
+ import { ladderDefaults } from "./ladderDefaults";
10
+ import useLadders from "../utils/useLadders";
11
+ import { map } from "lodash-es";
12
+ import { filter } from "lodash-es";
13
+
14
+ export default function Ladder({
15
+ // gelDigestEnzymes = [],
16
+ boxHeight = 550,
17
+ lanes = [],
18
+ digestLaneRightClicked,
19
+ selectedFragment,
20
+ ladders = ladderDefaults
21
+ }) {
22
+ const [additionalLadders, setLadders] = useLadders();
23
+ const laddersToUse = [
24
+ ...ladders,
25
+ ...map(additionalLadders, (l, i) => ({
26
+ ...l,
27
+ label: (
28
+ <div
29
+ key={i}
30
+ style={{
31
+ display: "flex",
32
+ alignItems: "center",
33
+ justifyContent: "space-between",
34
+ width: "100%"
35
+ }}
36
+ >
37
+ {l.label}{" "}
38
+ <Button
39
+ onClick={async e => {
40
+ e.preventDefault();
41
+ e.stopPropagation();
42
+ const confirm = await showConfirmationDialog({
43
+ text: "Are you sure you want to delete this custom ladder? You cannot undo this action",
44
+ intent: "danger",
45
+ confirmButtonText: "Delete",
46
+ cancelButtonText: "Cancel",
47
+ canEscapeKeyCancel: true
48
+ });
49
+ if (!confirm) {
50
+ return;
51
+ }
52
+ setSelectedLadder(ladders[0].value);
53
+ setLadders(
54
+ filter(additionalLadders, lad => lad.value !== l.value)
55
+ );
56
+ }}
57
+ intent="danger"
58
+ small
59
+ minimal
60
+ icon="trash"
61
+ ></Button>
62
+ </div>
63
+ )
64
+ }))
65
+ ];
66
+ const [highlightedFragment, setHighlightedFragment] = useState();
67
+ const [selectedLadder, setSelectedLadder] = useState(ladders[0].value);
68
+ let ladderInfo;
69
+ laddersToUse.forEach(ladder => {
70
+ if (ladder.value === selectedLadder)
71
+ ladderInfo = {
72
+ ...ladder,
73
+ markings: ladder.markings.sort((a, b) => {
74
+ return b - a;
75
+ })
76
+ };
77
+ });
78
+ if (!ladderInfo) {
79
+ return console.error("Uh oh there needs to be ladder info here!");
80
+ }
81
+ const sharedStyle = { color: "white", background: "black" }; //use a shared style to get the copy image to look nice
82
+ const upperBoundary = ladderInfo.markings[0];
83
+ return (
84
+ <div>
85
+ Ladder:
86
+ <div style={{ display: "flex" }}>
87
+ <TgSelect
88
+ className="tg-ladder-selector"
89
+ value={selectedLadder}
90
+ onChange={val => setSelectedLadder(val.value)}
91
+ options={laddersToUse}
92
+ />
93
+ <Button
94
+ onClick={() => {
95
+ showDialog({
96
+ ModalComponent: AddLaddersDialog,
97
+ props: {
98
+ setSelectedLadder
99
+ }
100
+ });
101
+ }}
102
+ style={{ minWidth: 150 }}
103
+ minimal
104
+ small
105
+ icon="plus"
106
+ intent="primary"
107
+ >
108
+ Add Ladder
109
+ </Button>
110
+ </div>
111
+ <br />
112
+ <div
113
+ className="ve-digest-outer-container"
114
+ style={{
115
+ position: "relative",
116
+ width: "fit-content",
117
+ ...sharedStyle
118
+ }}
119
+ >
120
+ {navigator.clipboard && window.isSecureContext && (
121
+ <Button
122
+ icon="duplicate"
123
+ minimal
124
+ style={{ position: "absolute", top: 5, right: 5, color: "white" }}
125
+ onClick={async () => {
126
+ try {
127
+ const canvas = await import("html2canvas");
128
+ canvas
129
+ .default(document.querySelector(".ve-digest-container"))
130
+ .then(canvas => {
131
+ canvas.toBlob(blob =>
132
+ navigator.clipboard.write([
133
+ new window.ClipboardItem({ "image/png": blob })
134
+ ])
135
+ );
136
+ window.toastr.success("Image copied to clipboard!");
137
+ });
138
+ } catch (e) {
139
+ window.toastr.error(
140
+ "Error copying the image, try just taking a screenshot instead ;)"
141
+ );
142
+ }
143
+ }}
144
+ ></Button>
145
+ )}
146
+ <div style={{ padding: 3, paddingLeft: 7, width: 290 }}>
147
+ Highlighted Fragment:{" "}
148
+ {highlightedFragment ? highlightedFragment.size : "--"}{" "}
149
+ </div>
150
+ <div
151
+ style={{ height: boxHeight, ...sharedStyle }}
152
+ className="ve-digest-container"
153
+ >
154
+ <div
155
+ style={{ width: 100 }}
156
+ className="ve-digest-column ve-digest-ladder"
157
+ >
158
+ <div className="ve-digest-header"> </div>
159
+ {ladderInfo.markings.map((val, index) => {
160
+ return (
161
+ <div
162
+ key={index}
163
+ style={{
164
+ fontSize: 12,
165
+ position: "absolute",
166
+ width: "100%",
167
+ display: "flex",
168
+ alignItems: "center",
169
+ color: "white",
170
+ bottom: calculateOffset(boxHeight, val, upperBoundary) - 3 //subtract 3 to get the labels to align better
171
+ }}
172
+ >
173
+ <span
174
+ style={{
175
+ color: "white",
176
+ paddingLeft: 6,
177
+ paddingRight: 4
178
+ }}
179
+ >
180
+ {val}{" "}
181
+ </span>
182
+ <span style={{ color: "white", paddingRight: 4 }}> bp </span>
183
+ </div>
184
+ );
185
+ })}
186
+ </div>
187
+ <div className="ve-digest-column ve-digest-ladder">
188
+ <div className="ve-digest-header">Ladder </div>
189
+ {ladderInfo.markings.map((val, index) => {
190
+ return (
191
+ <div
192
+ key={index}
193
+ style={{
194
+ fontSize: 12,
195
+ position: "absolute",
196
+ width: "100%",
197
+ display: "flex",
198
+ alignItems: "center",
199
+ color: "white",
200
+ height: "2px",
201
+ background: "white",
202
+ bottom: calculateOffset(boxHeight, val, upperBoundary)
203
+ }}
204
+ />
205
+ );
206
+ })}
207
+ </div>
208
+ {lanes.map((fragments, index) => {
209
+ return (
210
+ <Lane
211
+ key={index}
212
+ {...{
213
+ onMouseOver: fragment => setHighlightedFragment(fragment),
214
+ onMouseOut: () => setHighlightedFragment(undefined),
215
+ digestLaneRightClicked,
216
+ laneNumber: index + 1,
217
+ fragments,
218
+ highlightedFragment,
219
+ selectedFragment,
220
+ boxHeight,
221
+ upperBoundary
222
+ }}
223
+ />
224
+ );
225
+ })}
226
+ </div>
227
+ </div>
228
+ </div>
229
+ );
230
+ }
231
+
232
+ function Lane({
233
+ laneNumber,
234
+ onMouseOver,
235
+ onMouseOut,
236
+ digestLaneRightClicked,
237
+ fragments,
238
+ highlightedFragment,
239
+ selectedFragment,
240
+ boxHeight,
241
+ upperBoundary
242
+ }) {
243
+ return (
244
+ <div
245
+ style={{ marginLeft: 20, marginRight: 20 }}
246
+ className="ve-digest-column ve-digest-lane"
247
+ >
248
+ <div className="ve-digest-header">Lane {laneNumber} </div>
249
+ {fragments.map((fragment, index) => {
250
+ const { size, id, name } = fragment;
251
+ const isHighlighted =
252
+ (highlightedFragment && id === highlightedFragment.id) ||
253
+ (selectedFragment && id === highlightedFragment.id);
254
+ return (
255
+ <div
256
+ key={index}
257
+ onMouseOver={() => {
258
+ onMouseOver(fragment);
259
+ }}
260
+ onMouseOut={() => {
261
+ onMouseOut(fragment);
262
+ }}
263
+ onClick={() => {
264
+ fragment.onFragmentSelect();
265
+ }}
266
+ onContextMenu={e => {
267
+ fragment.onFragmentSelect();
268
+ digestLaneRightClicked(e);
269
+ }}
270
+ data-test={name}
271
+ style={{
272
+ fontSize: 12,
273
+ position: "absolute",
274
+ display: "flex",
275
+ alignItems: "center",
276
+ color: isHighlighted ? "#fdffdd" : "white",
277
+ width: "90%",
278
+ height: isHighlighted ? "3px" : "2px",
279
+ background: "white",
280
+ bottom: calculateOffset(boxHeight, size, upperBoundary)
281
+ }}
282
+ >
283
+ <Tooltip
284
+ className="ve-digest-fragment-tooltip"
285
+ content={<div>{name}</div>}
286
+ >
287
+ <div
288
+ style={{
289
+ width: "100%",
290
+ height: isHighlighted ? "3px" : "2px"
291
+ }}
292
+ />
293
+ </Tooltip>
294
+ </div>
295
+ );
296
+ })}
297
+ </div>
298
+ );
299
+ }
300
+
301
+ function calculateOffset(boxHeight, size, upperBoundary) {
302
+ return (boxHeight * Math.log(size)) / Math.log(upperBoundary) - 55;
303
+ }
package/MeltingTemp.js ADDED
@@ -0,0 +1,85 @@
1
+ import React from "react";
2
+ import { Button, Icon, Popover, RadioGroup } from "@blueprintjs/core";
3
+
4
+ import { calculateTm, calculateNebTm } from "@teselagen/sequence-utils";
5
+
6
+ import { isNumber, isString } from "lodash-es";
7
+ import { popoverOverflowModifiers } from "@teselagen/ui";
8
+ import useTmType from "../utils/useTmType";
9
+
10
+ export default function MeltingTemp({
11
+ sequence,
12
+ WrapperToUse = p => <div>{p.children}</div>,
13
+ InnerWrapper = p => (
14
+ <Button minimal small>
15
+ {p.children}
16
+ </Button>
17
+ )
18
+ }) {
19
+ const [primerConc /* , setPrimerConcentration */] = React.useState(0.0000005);
20
+ const [monovalentCationConc /* , setMonovalentCationConc */] =
21
+ React.useState(0.05);
22
+ const [tmType, setTmType] = useTmType();
23
+ let tm = (tmType === "neb_tm" ? calculateNebTm : calculateTm)(sequence, {
24
+ monovalentCationConc,
25
+ primerConc
26
+ });
27
+ if (isNumber(tm)) {
28
+ tm = tm.toFixed(1);
29
+ }
30
+ const hasWarning = isString(tm) && tm.length > 7 && tm;
31
+ return (
32
+ <WrapperToUse dataTest="veStatusBar-selection-tm">
33
+ <Popover
34
+ modifiers={popoverOverflowModifiers}
35
+ content={
36
+ <div style={{ maxWidth: 300, padding: 20 }}>
37
+ Using Tm calculations based on these{" "}
38
+ <a
39
+ rel="noopener noreferrer"
40
+ target="_blank"
41
+ href="https://github.com/TeselaGen/tg-oss/blob/master/packages/sequence-utils/src/calculateNebTm.js"
42
+ >
43
+ algorithms
44
+ </a>
45
+ <br></br>
46
+ <br></br>
47
+ <RadioGroup
48
+ label="Choose Tm Type:"
49
+ options={[
50
+ { value: "default", label: "Default Tm (Breslauer)" },
51
+ { value: "neb_tm", label: "NEB Tm (SantaLucia)" }
52
+ ]}
53
+ onChange={e => setTmType(e.target.value)}
54
+ selectedValue={tmType}
55
+ ></RadioGroup>
56
+ {hasWarning && (
57
+ <div>
58
+ <Icon
59
+ style={{ marginLeft: 5, marginRight: 5 }}
60
+ size={10}
61
+ icon="warning-sign"
62
+ ></Icon>
63
+ {hasWarning}
64
+ <br></br>
65
+ <br></br>
66
+ Try using the Default Tm
67
+ </div>
68
+ )}
69
+ </div>
70
+ }
71
+ >
72
+ <React.Fragment>
73
+ <InnerWrapper>Melting Temp: {Number(tm) || 0} </InnerWrapper>
74
+ {hasWarning && (
75
+ <Icon
76
+ style={{ marginLeft: 5, marginRight: 5 }}
77
+ size={10}
78
+ icon="warning-sign"
79
+ ></Icon>
80
+ )}
81
+ </React.Fragment>
82
+ </Popover>
83
+ </WrapperToUse>
84
+ );
85
+ }
package/Menlo.ttf ADDED
Binary file