@teselagen/ove 0.7.28 → 0.7.30-beta.1

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 (301) hide show
  1. package/CreateAnnotationsPage.d.ts +4 -3
  2. package/README.md +1 -1
  3. package/fileUtils.d.ts +12 -0
  4. package/html2canvas.esm--JN4fLQL.js +7891 -0
  5. package/html2canvas.esm-B7d7VJmQ.cjs +7891 -0
  6. package/index.cjs.js +1305 -1121
  7. package/index.es.js +1305 -1121
  8. package/index.umd.js +189161 -0
  9. package/ove.css +17 -4
  10. package/package.json +5 -9
  11. package/redux/findTool.d.ts +1 -0
  12. package/selectors/searchLayersSelector.d.ts +1 -1
  13. package/src/AutoAnnotate.js +1 -1
  14. package/src/CreateAnnotationsPage.js +1 -2
  15. package/src/Editor/style.css +8 -3
  16. package/src/FindBar/index.js +32 -1
  17. package/src/RowItem/SelectionLayer/index.js +42 -4
  18. package/src/RowItem/SelectionLayer/style.css +8 -0
  19. package/src/fileUtils.js +103 -0
  20. package/src/helperComponents/PropertiesDialog/TranslationProperties.js +1 -1
  21. package/src/redux/findTool.js +9 -0
  22. package/src/selectors/searchLayersSelector.js +40 -2
  23. package/style.css +12098 -1
  24. package/AASliver.js +0 -187
  25. package/AddLaddersDialog.js +0 -82
  26. package/AdditionalCutsiteInfoDialog.js +0 -599
  27. package/AlignmentVisibilityTool.js +0 -105
  28. package/AnnotationContainerHolder.js +0 -20
  29. package/AnnotationPositioner.js +0 -27
  30. package/AutoAnnotate.js +0 -501
  31. package/AutoAnnotateBpMatchingDialog.js +0 -208
  32. package/Axis.js +0 -151
  33. package/AxisNumbers.js +0 -35
  34. package/Browser.js +0 -106
  35. package/Caret.js +0 -63
  36. package/Chromatogram.js +0 -293
  37. package/CircularDnaSequence.js +0 -73
  38. package/CircularZoomMinimap.js +0 -16
  39. package/ColorPicker.js +0 -30
  40. package/CommandHotkeyHandler.js +0 -44
  41. package/CreateAnnotationsPage.js +0 -98
  42. package/Cutsite.js +0 -18
  43. package/CutsiteProperties.js +0 -176
  44. package/CutsiteSelectionLayers.js +0 -47
  45. package/Cutsites.js +0 -271
  46. package/DeletionLayer.js +0 -28
  47. package/DropHandler.css +0 -21
  48. package/DropHandler.js +0 -64
  49. package/EditCaretPosition.js +0 -234
  50. package/EditTrackNameDialog.js +0 -30
  51. package/Feature.js +0 -83
  52. package/FeatureProperties.js +0 -6
  53. package/FillWindow.js +0 -47
  54. package/GenbankView.js +0 -74
  55. package/GeneralProperties.js +0 -117
  56. package/GenericAnnotationProperties.js +0 -406
  57. package/GlobalDialog.js +0 -73
  58. package/GlobalDialogUtils.js +0 -110
  59. package/GoToDialog.js +0 -25
  60. package/HorizontalPanelDragHandle.js +0 -35
  61. package/Keyboard.js +0 -85
  62. package/Labels.js +0 -327
  63. package/Ladder.css +0 -20
  64. package/Ladder.js +0 -303
  65. package/MeltingTemp.js +0 -85
  66. package/Menlo.ttf +0 -0
  67. package/Minimap.js +0 -515
  68. package/Mismatches.js +0 -134
  69. package/Monaco.ttf +0 -0
  70. package/MultipleSeqsDetectedOnImportDialog.js +0 -74
  71. package/Orf.js +0 -109
  72. package/OrfProperties.js +0 -117
  73. package/Orfs.js +0 -35
  74. package/PCRTool.js +0 -179
  75. package/PairwiseAlignmentView.js +0 -68
  76. package/Part.js +0 -34
  77. package/PartProperties.js +0 -9
  78. package/PassThrough.js +0 -3
  79. package/PerformantSelectionLayer.js +0 -32
  80. package/PinchHelper.js +0 -24
  81. package/PointedAnnotation.js +0 -347
  82. package/PositionAnnotationOnCircle.js +0 -26
  83. package/Primer.js +0 -41
  84. package/PrimerProperties.js +0 -19
  85. package/ReflexContainer.js +0 -802
  86. package/ReflexElement.js +0 -160
  87. package/ReflexEvents.js +0 -77
  88. package/ReflexSplitter.js +0 -205
  89. package/RenameSequenceDialog.js +0 -7
  90. package/RotateCircularViewSlider.js +0 -93
  91. package/SelectDialog.js +0 -150
  92. package/SequenceName.js +0 -15
  93. package/SimpleCircularOrLinearView.js +0 -381
  94. package/SimpleOligoPreview.js +0 -39
  95. package/SingleEnzymeCutsiteInfo.js +0 -139
  96. package/ToolbarItem.js +0 -192
  97. package/Translation.js +0 -198
  98. package/TranslationProperties.js +0 -149
  99. package/UncontrolledSliderWithPlusMinusBtns.css +0 -5
  100. package/UncontrolledSliderWithPlusMinusBtns.js +0 -134
  101. package/VeTopRightContainer.js +0 -12
  102. package/ZoomCircularViewSlider.js +0 -62
  103. package/ZoomLinearView.js +0 -47
  104. package/addAlignment.js +0 -6
  105. package/addMetaToActionCreators.js +0 -12
  106. package/addWrappedAddons.js +0 -20
  107. package/alignmentTool.js +0 -503
  108. package/alignments.js +0 -379
  109. package/annotationLabelVisibility.js +0 -2
  110. package/annotationSearchSelector.js +0 -24
  111. package/annotationTypes.js +0 -35
  112. package/annotationVisibility.js +0 -196
  113. package/annotationsToSupport.js +0 -104
  114. package/arrayToObjWithIds.js +0 -17
  115. package/arrayUtils.js +0 -19
  116. package/array_move.js +0 -10
  117. package/calculateTickMarkPositionsForGivenRange.js +0 -47
  118. package/caretPosition.js +0 -27
  119. package/cdsFeaturesSelector.js +0 -9
  120. package/charWidth.js +0 -22
  121. package/circular.js +0 -19
  122. package/circularSelector.js +0 -4
  123. package/clickAndDragUtils.js +0 -576
  124. package/coerceInitialValue.js +0 -7
  125. package/combineReducersDontIgnoreKeys.js +0 -12
  126. package/commandUtils.js +0 -20
  127. package/constants.js +0 -2
  128. package/copyOptions.js +0 -34
  129. package/createFragmentLines.js +0 -120
  130. package/createMergedDefaultStateReducer.js +0 -30
  131. package/createMetaAction.js +0 -12
  132. package/createSequenceInputPopup.js +0 -290
  133. package/createSequenceInputPopupStyle.css +0 -87
  134. package/createSimpleDialog.js +0 -89
  135. package/createYourOwnEnzyme.js +0 -39
  136. package/cutsiteLabelColorSelector.js +0 -6
  137. package/cutsiteTool.js +0 -88
  138. package/cutsitesByRangeSelector.js +0 -5
  139. package/cutsitesSelector.js +0 -61
  140. package/darkmode.css +0 -98
  141. package/defaultConfig.js +0 -150
  142. package/deletionLayers.js +0 -36
  143. package/description.js +0 -21
  144. package/digestTool.js +0 -34
  145. package/dnaToColor.js +0 -17
  146. package/downloadTool.js +0 -39
  147. package/draggableClassnames.js +0 -5
  148. package/drawAnnotations.js +0 -440
  149. package/drawDirectedPiePiece.js +0 -142
  150. package/editTool.js +0 -49
  151. package/editorSelector.js +0 -2
  152. package/editorUtils.js +0 -205
  153. package/estimateRowHeight.js +0 -184
  154. package/featureLengthsToHide.js +0 -27
  155. package/featureTool.js +0 -34
  156. package/features.js +0 -19
  157. package/featuresSelector.js +0 -8
  158. package/filteredCutsitesSelector.js +0 -136
  159. package/filteredFeaturesSelector.js +0 -32
  160. package/filteredPartsSelector.js +0 -57
  161. package/filteredPrimersSelector.js +0 -27
  162. package/filteredRestrictionEnzymesSelector.js +0 -1
  163. package/find.png +0 -0
  164. package/findTool.js +0 -79
  165. package/findToolConstants.js +0 -1
  166. package/frameTranslations.js +0 -52
  167. package/fullscreen.png +0 -0
  168. package/getAdditionalEnzymesSelector.js +0 -46
  169. package/getAngleForPositionMidpoint.js +0 -3
  170. package/getAnnotationClassnames.js +0 -12
  171. package/getAnnotationNameAndStartStopString.js +0 -61
  172. package/getBpsPerRow.js +0 -19
  173. package/getCutsiteLabelHeights.js +0 -56
  174. package/getGapMap.js +0 -12
  175. package/getGaps.js +0 -27
  176. package/getInternalLabel.js +0 -40
  177. package/getOveHotkeyDefs.js +0 -12
  178. package/getPairwiseOverviewLinearViewOptions.js +0 -38
  179. package/getRangeAnglesSpecial.js +0 -12
  180. package/getStructuredBases.js +0 -97
  181. package/getTrackFromEvent.js +0 -25
  182. package/getVisibleStartEnd.js +0 -7
  183. package/getXStartAndWidthFromNonCircularRange.js +0 -12
  184. package/getXStartAndWidthOfRangeWrtRow.js +0 -27
  185. package/getXStartAndWidthOfRowAnnotation.js +0 -19
  186. package/getYOffset.js +0 -15
  187. package/hoveredAnnotation.js +0 -24
  188. package/importTool.js +0 -27
  189. package/index.js +0 -71
  190. package/inlineFindTool.js +0 -38
  191. package/isElementInViewport.js +0 -29
  192. package/isEnzymeFilterAndSelector.js +0 -1
  193. package/isTargetWithinEl.js +0 -6
  194. package/labelLineIntensity.js +0 -25
  195. package/labelSize.js +0 -23
  196. package/ladderDefaults.js +0 -25
  197. package/lastSavedId.js +0 -20
  198. package/lineageLines.js +0 -11
  199. package/linear.png +0 -0
  200. package/makeStore.js +0 -34
  201. package/massageTickSpacing.js +0 -19
  202. package/materiallyAvailable.js +0 -19
  203. package/middleware.js +0 -112
  204. package/minimumOrfSize.js +0 -24
  205. package/minimumOrfSizeSelector.js +0 -2
  206. package/modalActions.js +0 -3
  207. package/moveCaret.js +0 -58
  208. package/name.js +0 -19
  209. package/normalizeAngle.js +0 -3
  210. package/normalizeAngleRange.js +0 -9
  211. package/oligoTool.js +0 -30
  212. package/onlyUpdateForKeysDeep.js +0 -31
  213. package/orfFrameToColorMap.js +0 -10
  214. package/orfTool.js +0 -136
  215. package/orfsSelector.js +0 -15
  216. package/panelsShown.js +0 -294
  217. package/partLengthsToHide.js +0 -23
  218. package/partOverhangs.js +0 -6
  219. package/partTagSearch.js +0 -69
  220. package/partTool.js +0 -45
  221. package/parts.js +0 -19
  222. package/partsSelector.js +0 -8
  223. package/pie.png +0 -0
  224. package/polarToSpecialCartesian.js +0 -7
  225. package/positionCutsites.js +0 -6
  226. package/prepareRowData.js +0 -64
  227. package/primerBases.js +0 -221
  228. package/primerLengthsToHide.js +0 -27
  229. package/primers.js +0 -19
  230. package/primersSelector.js +0 -8
  231. package/print.png +0 -0
  232. package/printTool.js +0 -31
  233. package/propertiesTool.js +0 -40
  234. package/proteinUtils.js +0 -3
  235. package/pureNoFunc.js +0 -18
  236. package/readOnly.js +0 -25
  237. package/redoTool.js +0 -30
  238. package/reflex-styles.css +0 -128
  239. package/reflex-styles.css.map +0 -9
  240. package/relaxLabelAngles.js +0 -157
  241. package/relaxLabels_DEPRECATED.js +0 -105
  242. package/replacementLayers.js +0 -36
  243. package/restrictionEnzymes.js +0 -52
  244. package/restrictionEnzymesSelector.js +0 -34
  245. package/rowviewContants.js +0 -3
  246. package/ruler.css +0 -89
  247. package/save.png +0 -0
  248. package/saveTool.js +0 -44
  249. package/searchLayersSelector.js +0 -71
  250. package/selectedAnnotations.js +0 -89
  251. package/selectedAnnotationsSelector.js +0 -1
  252. package/selectedCutsitesSelector.js +0 -21
  253. package/selectedPartTags.js +0 -21
  254. package/selectionLayer.js +0 -25
  255. package/sequence.js +0 -12
  256. package/sequenceDataHistory.js +0 -43
  257. package/sequenceDataSelector.js +0 -2
  258. package/sequenceLengthSelector.js +0 -5
  259. package/sequenceSelector.js +0 -4
  260. package/sharedActionCreators.js +0 -0
  261. package/shouldFlipText.js +0 -4
  262. package/shouldRerender.js +0 -27
  263. package/showFileDialog.js +0 -25
  264. package/showGCContent.js +0 -23
  265. package/show_cut_sites.png +0 -0
  266. package/show_features.png +0 -0
  267. package/show_orfs.png +0 -0
  268. package/show_primers.png +0 -0
  269. package/simpleDialog.css +0 -13
  270. package/specialCutsiteFilterOptions.js +0 -22
  271. package/tagsToBoldSelector.js +0 -2
  272. package/toggle_views.svg +0 -1
  273. package/toolBar.js +0 -23
  274. package/translationSearchMatchesSelector.js +0 -14
  275. package/translations.js +0 -20
  276. package/translationsRawSelector.js +0 -8
  277. package/translationsSelector.js +0 -137
  278. package/typeField.js +0 -24
  279. package/undoTool.js +0 -30
  280. package/updateEditor.js +0 -200
  281. package/updateLabelsForInViewFeatures.js +0 -55
  282. package/updateLabelsForInViewFeaturesCircView.js +0 -41
  283. package/updateTrackHelper.js +0 -58
  284. package/uppercaseSequenceMapFont.js +0 -25
  285. package/upsertDeleteActionGenerator.js +0 -31
  286. package/useAAColorType.js +0 -8
  287. package/useAdditionalOrfStartCodons.js +0 -24
  288. package/useAnnotationLimits.js +0 -42
  289. package/useChromatogramPrefs.js +0 -31
  290. package/useFormValue.js +0 -7
  291. package/useLadders.js +0 -6
  292. package/useMeltingTemp.js +0 -7
  293. package/useTmType.js +0 -10
  294. package/userDefinedHandlersAndOpts.js +0 -61
  295. package/utils.js +0 -37
  296. package/versionHistory.js +0 -26
  297. package/versionHistoryTool.js +0 -21
  298. package/viewSubmenu.js +0 -479
  299. package/visibilityTool.js +0 -39
  300. package/withHover.js +0 -113
  301. package/withRestrictionEnzymes.js +0 -15
package/SelectDialog.js DELETED
@@ -1,150 +0,0 @@
1
- import { convertRangeTo0Based } from "@teselagen/range-utils";
2
- import classNames from "classnames";
3
- import React from "react";
4
-
5
- import { reduxForm } from "redux-form";
6
- import { tgFormValues, wrapDialog } from "@teselagen/ui";
7
- import { compose } from "redux";
8
- import { Button, Intent, Classes } from "@blueprintjs/core";
9
-
10
- import { NumericInputField } from "@teselagen/ui";
11
- import { get } from "lodash-es";
12
- import { getRangeLength } from "@teselagen/range-utils";
13
- import { tryToRefocusEditor } from "../utils/editorUtils";
14
-
15
- // Single validation function - from & to have the same range
16
- const validate = (val, vals, props) => {
17
- const { min, max } = get(props, "extraProps.from", {});
18
- const circular = get(props, "extraProps.circular");
19
- if ((min && val < min) || (max && val > max)) {
20
- return "Invalid position";
21
- }
22
- if (!circular && Number(vals.from) > Number(vals.to)) {
23
- return "Wrong from/to order";
24
- }
25
- };
26
- // const selector = formValueSelector("selectDialog");
27
- export default compose(
28
- wrapDialog({
29
- isDraggable: true,
30
- width: 400,
31
- title: "Select Range",
32
- height: 270,
33
- onCloseHook: tryToRefocusEditor
34
- }),
35
- reduxForm({
36
- form: "selectDialog"
37
- }),
38
- tgFormValues("from", "to")
39
- )(
40
- class SelectDialog extends React.Component {
41
- updateTempHighlight =
42
- ({ isStart, isEnd } = {}) =>
43
- val => {
44
- const { selectionLayerUpdate, from, to, invalid } = this.props;
45
- if (invalid) return;
46
- selectionLayerUpdate(
47
- convertRangeTo0Based({
48
- start: isStart ? Math.round(val) : from,
49
- end: isEnd ? Math.round(val) : to
50
- })
51
- );
52
- };
53
- componentDidMount() {
54
- const { from, to, initialCaretPosition } = this.props;
55
- this.initialSelection = { from, to, initialCaretPosition };
56
- this.updateTempHighlight()();
57
- }
58
- render() {
59
- const {
60
- hideModal,
61
- onSubmit,
62
- selectionLayerUpdate,
63
- from,
64
- to,
65
- initialCaretPosition,
66
- caretPositionUpdate,
67
- sequenceLength,
68
- extraProps,
69
- isProtein,
70
- invalid,
71
- handleSubmit
72
- } = this.props;
73
- const selectionLength = getRangeLength(
74
- {
75
- start: Number(from),
76
- end: Number(to)
77
- },
78
- sequenceLength
79
- );
80
-
81
- return (
82
- <form
83
- onSubmit={handleSubmit(data => {
84
- if (onSubmit) onSubmit(data);
85
- hideModal();
86
- tryToRefocusEditor();
87
- })}
88
- className={classNames(
89
- Classes.DIALOG_BODY,
90
- "tg-min-width-dialog simple-dialog"
91
- )}
92
- >
93
- <NumericInputField
94
- autoFocus
95
- minorStepSize={1}
96
- label="From:"
97
- clampValueOnBlur
98
- {...extraProps.to}
99
- validate={validate}
100
- //tnrtodo this normalization will actually work when https://github.com/palantir/blueprint/issues/3553 gets resolved
101
- normalize={normalizeToInt}
102
- onAnyNumberChange={this.updateTempHighlight({ isStart: true })}
103
- name="from"
104
- />
105
- <NumericInputField
106
- label="To:"
107
- clampValueOnBlur
108
- minorStepSize={1}
109
- {...extraProps.from}
110
- validate={validate}
111
- normalize={normalizeToInt}
112
- onAnyNumberChange={this.updateTempHighlight({ isEnd: true })}
113
- name="to"
114
- />
115
- <div className="dialog-buttons">
116
- <Button
117
- onClick={() => {
118
- if (initialCaretPosition > -1) {
119
- caretPositionUpdate(initialCaretPosition);
120
- } else {
121
- selectionLayerUpdate({
122
- start: this.initialSelection.from,
123
- end: this.initialSelection.to
124
- });
125
- }
126
- hideModal();
127
- tryToRefocusEditor();
128
- }}
129
- text="Cancel"
130
- />
131
- <Button
132
- type="submit"
133
- intent={Intent.PRIMARY}
134
- text={`Select ${invalid ? 0 : selectionLength} ${
135
- isProtein ? "AA" : "BP"
136
- }${selectionLength === 1 ? "" : "s"}`}
137
- disabled={invalid}
138
- />
139
- </div>
140
- </form>
141
- );
142
- }
143
- }
144
- );
145
-
146
- const normalizeToInt = val => {
147
- const int = Math.round(val);
148
- const normalizedVal = `${int >= 0 ? int : 1}`;
149
- return normalizedVal;
150
- };
package/SequenceName.js DELETED
@@ -1,15 +0,0 @@
1
- import React from "react";
2
-
3
- export function SequenceName({ sequenceName, sequenceLength, isProtein }) {
4
- return (
5
- <div key="sequenceNameText" className="sequenceNameText">
6
- <span>{sequenceName} </span>
7
- <br />
8
- <span>
9
- {isProtein
10
- ? `${Math.floor(sequenceLength / 3)} AAs`
11
- : `${sequenceLength} bps`}
12
- </span>
13
- </div>
14
- );
15
- }
@@ -1,381 +0,0 @@
1
- import React, { useState } from "react";
2
- import {
3
- showContextMenu,
4
- commandMenuEnhancer,
5
- FillWindow
6
- } from "@teselagen/ui";
7
-
8
- import { CircularView } from "./CircularView";
9
- import { LinearView } from "./LinearView";
10
- import { RowView } from "./RowView";
11
-
12
- import { HoveredIdContext } from "./helperComponents/withHover";
13
- import { visibilityDefaultValues } from "./redux/annotationVisibility";
14
- import { addWrappedAddons } from "./utils/addWrappedAddons";
15
- import { SimpleOligoPreview } from "./SimpleOligoPreview";
16
- import { cloneDeep, flatMap, map, startCase } from "lodash-es";
17
- import {
18
- Button,
19
- ButtonGroup,
20
- Menu,
21
- MenuItem,
22
- Popover,
23
- Tooltip
24
- } from "@blueprintjs/core";
25
- import getCommands from "./commands";
26
- import { withHandlers } from "recompose";
27
- import { exportSequenceToFile } from "./withEditorProps";
28
- import {
29
- editorClicked,
30
- updateSelectionOrCaret
31
- } from "./withEditorInteractions/clickAndDragUtils";
32
-
33
- //this view is meant to be a helper for showing a simple (non-redux connected) circular or linear view!
34
- export default props => {
35
- let {
36
- sequenceData: _sequenceData,
37
- annotationVisibility: _annotationVisibility = {},
38
- noWarnings = true,
39
- withDownload,
40
- withChoosePreviewType,
41
- withCaretEnabled,
42
- withSelectionEnabled,
43
- smallSlider,
44
- withVisibilityOptions,
45
- minimalPreviewTypeBtns,
46
- withFullscreen,
47
- selectionLayer,
48
- selectionLayerUpdate,
49
- caretPositionUpdate,
50
- editorName = "tg-simple-dna-view"
51
- } = props;
52
- const [previewType, setPreviewType] = useState(
53
- _sequenceData.circular ? "circular" : "linear"
54
- );
55
- const [isPopoverOpen, setPopoverOpen] = useState(false);
56
- const [isFullscreen, setFullscreen] = useState(false);
57
- const [visibilityOptions, setVisibilityOptions] = useState({});
58
- const [caretPosition, _caretPositionUpdate] = useState(
59
- withCaretEnabled ? -1 : undefined
60
- );
61
- const [_selectionLayer, _selectionLayerUpdate] = useState(
62
- withSelectionEnabled ? { start: -1, end: -1 } : undefined
63
- );
64
- const sequenceLength = _sequenceData.noSequence
65
- ? _sequenceData.size
66
- : _sequenceData.sequence.length;
67
- selectionLayer = selectionLayer || _selectionLayer;
68
-
69
- const selectionLayerUpdateOld = selectionLayerUpdate || _selectionLayerUpdate;
70
- const caretPositionUpdateOld = caretPositionUpdate || _caretPositionUpdate;
71
-
72
- selectionLayerUpdate = (newSel, dontTrigger) => {
73
- if (!dontTrigger && newSel.start > -1) {
74
- caretPositionUpdate(-1, true);
75
- }
76
- selectionLayerUpdateOld(newSel);
77
- };
78
- caretPositionUpdate = (newCaret, dontTrigger) => {
79
- if (!dontTrigger && newCaret > -1) {
80
- selectionLayerUpdate({ start: -1, end: -1 }, true);
81
- }
82
- caretPositionUpdateOld(newCaret);
83
- };
84
- function annotationClicked({ annotation, event }) {
85
- event.stopPropagation();
86
- event.preventDefault();
87
- withSelectionEnabled &&
88
- updateSelectionOrCaret({
89
- doNotWrapOrigin: !sequenceData.circular,
90
- shiftHeld: event.shiftKey,
91
- sequenceLength,
92
- newRangeOrCaret: annotation,
93
- caretPosition,
94
- selectionLayer,
95
- selectionLayerUpdate: selectionLayerUpdate,
96
- caretPositionUpdate: caretPositionUpdate
97
- });
98
- }
99
-
100
- let tickSpacing = undefined;
101
- let Component = (
102
- withChoosePreviewType ? previewType === "circular" : _sequenceData.circular
103
- )
104
- ? CircularView
105
- : _sequenceData.isOligo && _sequenceData.sequence
106
- ? SimpleOligoPreview
107
- : LinearView;
108
- if (withChoosePreviewType && previewType === "row") {
109
- Component = RowView;
110
- tickSpacing = undefined;
111
- }
112
-
113
- let sequenceData = cloneDeep(_sequenceData);
114
- const annotationVisibility = {
115
- ...visibilityDefaultValues,
116
- ..._annotationVisibility,
117
- ...visibilityOptions
118
- };
119
-
120
- //here we're making it possible to not pass a sequenceData.sequence
121
- //we can just pass a .size property to save having to send the whole sequence if it isn't needed!
122
- if (sequenceData.noSequence) {
123
- annotationVisibility.sequence = false;
124
- annotationVisibility.reverseSequence = false;
125
- if (sequenceData.size === undefined) {
126
- return (
127
- <div>
128
- Error: No sequenceData.size detected when using noSequence flag{" "}
129
- </div>
130
- );
131
- }
132
- sequenceData = {
133
- ...sequenceData,
134
- sequence: {
135
- length: sequenceData.size
136
- }
137
- };
138
- }
139
- sequenceData.parts = addWrappedAddons(
140
- sequenceData.parts,
141
- sequenceData.sequence.length
142
- );
143
- const inner = ({ width, height }) => (
144
- <HoveredIdContext.Provider value={{ hoveredId: props.hoveredId }}>
145
- <div style={{ width: "fit-content" }}>
146
- {(withDownload ||
147
- withChoosePreviewType ||
148
- withFullscreen ||
149
- VisibilityOptions) && (
150
- <div
151
- style={{
152
- marginLeft: 10,
153
- marginBottom: 5,
154
- ...(isFullscreen && {
155
- marginRight: 10,
156
- paddingTop: 10
157
- }),
158
- display: "flex",
159
- justifyContent: "end"
160
- }}
161
- >
162
- {withDownload && <DownloadBtn {...props}></DownloadBtn>}
163
- {withVisibilityOptions && (
164
- <VisibilityOptions
165
- {...{
166
- ...props,
167
- sequenceData,
168
- annotationVisibility,
169
- setVisibilityOptions,
170
- isPopoverOpen,
171
- setPopoverOpen
172
- }}
173
- ></VisibilityOptions>
174
- )}
175
-
176
- {withChoosePreviewType && (
177
- <ButtonGroup>
178
- <Tooltip content="Circular View">
179
- <Button
180
- minimal={minimalPreviewTypeBtns}
181
- className="tgPreviewTypeCircular"
182
- active={previewType === "circular"}
183
- intent="primary"
184
- onClick={() => setPreviewType("circular")}
185
- icon="circle"
186
- ></Button>
187
- </Tooltip>
188
- <Tooltip content="Linear View">
189
- <Button
190
- minimal={minimalPreviewTypeBtns}
191
- className="tgPreviewTypeLinear"
192
- active={previewType === "linear"}
193
- intent="primary"
194
- onClick={() => setPreviewType("linear")}
195
- icon="layout-linear"
196
- ></Button>
197
- </Tooltip>
198
- <Tooltip content="Sequence View">
199
- <Button
200
- minimal={minimalPreviewTypeBtns}
201
- className="tgPreviewTypeRow"
202
- active={previewType === "row"}
203
- intent="primary"
204
- onClick={() => setPreviewType("row")}
205
- icon="menu"
206
- ></Button>
207
- </Tooltip>
208
- </ButtonGroup>
209
- )}
210
- {withFullscreen && (
211
- <FullscreenBtn
212
- {...{ setFullscreen, isFullscreen }}
213
- ></FullscreenBtn>
214
- )}
215
- </div>
216
- )}
217
- <Component
218
- {...{
219
- showCicularViewInternalLabels: true,
220
- className: `${editorName} veEditor tg-simple-dna-view`,
221
- width: 300,
222
- height: 300,
223
- noWarnings,
224
- partClicked: annotationClicked,
225
- featureClicked: annotationClicked,
226
- primerClicked: annotationClicked,
227
- ...props,
228
- ...(isFullscreen && {
229
- width: width - 10,
230
- height: height - 10
231
- }),
232
- smartCircViewLabelRender: true,
233
- caretPosition,
234
- smallSlider,
235
- ...(withSelectionEnabled && {
236
- selectionLayer,
237
- selectionLayerUpdate
238
- }),
239
- readOnly: true,
240
- editorClicked: ({ nearestCaretPos, event } = {}) => {
241
- if (!withCaretEnabled) {
242
- if (!withSelectionEnabled) return;
243
- if (!event.shiftKey) return;
244
- if (!(selectionLayer.start > -1)) return;
245
- }
246
-
247
- editorClicked({
248
- nearestCaretPos,
249
- shiftHeld: !withSelectionEnabled ? false : event.shiftKey,
250
- updateSelectionOrCaret: (shiftHeld, newRangeOrCaret) => {
251
- updateSelectionOrCaret({
252
- doNotWrapOrigin: !sequenceData.circular,
253
- sequenceLength,
254
- shiftHeld,
255
- newRangeOrCaret,
256
- caretPosition,
257
- selectionLayer,
258
- selectionLayerUpdate: selectionLayerUpdate,
259
- caretPositionUpdate: caretPositionUpdate
260
- });
261
- }
262
- });
263
- },
264
- instantiated: true,
265
- tickSpacing,
266
- hoveredId: props.hoveredId,
267
- annotationVisibility,
268
- sequenceData,
269
- showTitle: true
270
- }}
271
- />
272
- </div>
273
- </HoveredIdContext.Provider>
274
- );
275
- if (isFullscreen) {
276
- return (
277
- <FillWindow asPortal className="tgSimpleViewFullscreen">
278
- {inner}
279
- </FillWindow>
280
- );
281
- }
282
- return inner({});
283
- };
284
-
285
- const DownloadBtn = withHandlers({ exportSequenceToFile })(props => {
286
- return (
287
- <Tooltip content="Download">
288
- <Button
289
- className="veDownloadButton"
290
- style={{ marginRight: 10 }}
291
- onClick={event =>
292
- showContextMenu(
293
- [
294
- "exportSequenceAsGenbank",
295
- "exportDNASequenceAsFasta",
296
- "exportProteinSequenceAsFasta",
297
- "exportSequenceAsTeselagenJson"
298
- ],
299
- [
300
- commandMenuEnhancer(getCommands({ props }), {
301
- useTicks: true,
302
- omitIcons: true
303
- })
304
- ],
305
- event
306
- )
307
- }
308
- minimal
309
- intent="primary"
310
- icon="download"
311
- ></Button>
312
- </Tooltip>
313
- );
314
- });
315
- const FullscreenBtn = ({ setFullscreen, isFullscreen }) => {
316
- return (
317
- <Tooltip content={`${isFullscreen ? "Close " : ""}Fullscreen`}>
318
- <Button
319
- className="veFullscreenButton"
320
- style={{ marginLeft: 10, marginRight: 10 }}
321
- onClick={() => {
322
- setFullscreen(!isFullscreen);
323
- }}
324
- minimal
325
- intent="primary"
326
- icon={!isFullscreen ? "maximize" : "minimize"}
327
- ></Button>
328
- </Tooltip>
329
- );
330
- };
331
- const VisibilityOptions = ({
332
- annotationVisibility,
333
- sequenceData,
334
- setVisibilityOptions,
335
- isPopoverOpen,
336
- setPopoverOpen
337
- }) => {
338
- return (
339
- <Tooltip disabled={isPopoverOpen} content="Visibility Options">
340
- <Popover
341
- minimal
342
- onInteraction={isOpen => {
343
- setPopoverOpen(isOpen);
344
- }}
345
- isOpen={isPopoverOpen}
346
- content={
347
- <Menu>
348
- {flatMap(
349
- ["features", "parts", "primers", "translations", "cutsites"],
350
- name => {
351
- if (!map(sequenceData[name]).length) return [];
352
- return (
353
- <MenuItem
354
- onClick={e => {
355
- setVisibilityOptions({
356
- ...annotationVisibility,
357
- [name]: !annotationVisibility[name]
358
- });
359
- e.stopPropagation();
360
- }}
361
- icon={annotationVisibility[name] ? "tick" : "blank"}
362
- key={name}
363
- text={startCase(name)}
364
- ></MenuItem>
365
- );
366
- }
367
- )}
368
- </Menu>
369
- }
370
- >
371
- <Button
372
- className="veSimpleVisibilityBtn"
373
- style={{ marginLeft: 10, marginRight: 10 }}
374
- minimal
375
- intent="primary"
376
- icon="eye-open"
377
- ></Button>
378
- </Popover>
379
- </Tooltip>
380
- );
381
- };
@@ -1,39 +0,0 @@
1
- import React from "react";
2
- import { SequenceName } from "./LinearView/SequenceName";
3
- import classNames from "classnames";
4
-
5
- export function SimpleOligoPreview({
6
- className,
7
- width,
8
- height,
9
- sequenceData,
10
- showTitle
11
- }) {
12
- return (
13
- <div
14
- style={{
15
- width,
16
- height,
17
- paddingLeft: 5,
18
- display: "flex",
19
- flexDirection: "column"
20
- }}
21
- className={classNames("tg-simple-oligo-viewer", className)}
22
- >
23
- {showTitle && (
24
- <SequenceName
25
- {...{
26
- isProtein: sequenceData.isProtein,
27
- sequenceName: sequenceData.name || "",
28
- sequenceLength: sequenceData.sequence
29
- ? sequenceData.sequence.length
30
- : 0
31
- }}
32
- />
33
- )}
34
- <div style={{ height: "100%", overflow: "auto", wordBreak: "break-all" }}>
35
- {sequenceData.sequence || ""}
36
- </div>
37
- </div>
38
- );
39
- }