@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
@@ -1,139 +0,0 @@
1
- import React, { useCallback, useMemo } from "react";
2
- import { DataTable } from "@teselagen/ui";
3
- import { CutsiteTag } from "../../CutsiteFilter/AdditionalCutsiteInfoDialog";
4
- import EnzymeViewer from "../../EnzymeViewer";
5
- import { getEnzymeAliases } from "../../utils/editorUtils";
6
-
7
- const schema = {
8
- fields: [
9
- { path: "topSnipPosition", displayName: "Top Snip", type: "string" },
10
- { path: "position", type: "string" },
11
- { path: "strand", type: "string" }
12
- ]
13
- };
14
-
15
- export default function SingleEnzymeCutsiteInfo({
16
- cutsiteGroup,
17
- enzyme,
18
- dispatch,
19
- allRestrictionEnzymes,
20
- editorName,
21
- selectedAnnotationId,
22
- allCutsites,
23
- filteredCutsites: { cutsitesByName: cutsitesByNameActive }
24
- }) {
25
- const onRowSelect = useCallback(
26
- ([record]) => {
27
- if (!record) return;
28
-
29
- dispatch({
30
- type: "CARET_POSITION_UPDATE",
31
- payload: record.topSnipPosition,
32
- meta: {
33
- editorName
34
- }
35
- });
36
- },
37
- [dispatch, editorName]
38
- );
39
-
40
- const aliases = useMemo(() => getEnzymeAliases(enzyme), [enzyme]);
41
- const entities = useMemo(
42
- () =>
43
- cutsiteGroup
44
- .sort((a, b) => a.topSnipPosition - b.topSnipPosition)
45
- .map(
46
- ({
47
- restrictionEnzyme: { forwardRegex, reverseRegex } = {},
48
- forward,
49
- id,
50
- topSnipBeforeBottom,
51
- topSnipPosition,
52
- bottomSnipPosition
53
- }) => {
54
- return {
55
- id,
56
- topSnipPosition,
57
- position: topSnipBeforeBottom
58
- ? topSnipPosition + " - " + bottomSnipPosition
59
- : bottomSnipPosition + " - " + topSnipPosition,
60
- strand:
61
- forwardRegex === reverseRegex
62
- ? "Palindromic"
63
- : forward
64
- ? "1"
65
- : "-1"
66
- };
67
- }
68
- ),
69
- [cutsiteGroup]
70
- );
71
-
72
- return (
73
- <div>
74
- <div
75
- className="ve-enzymeSubrow"
76
- style={{
77
- margin: 10
78
- }}
79
- >
80
- {enzyme && (
81
- <EnzymeViewer
82
- sequence={enzyme.site}
83
- reverseSnipPosition={enzyme.bottomSnipOffset}
84
- forwardSnipPosition={enzyme.topSnipOffset}
85
- />
86
- )}
87
- <br />
88
- {entities && !!entities.length && (
89
- <div>
90
- <DataTable
91
- style={{ minHeight: 0, maxHeight: 200 }}
92
- selectedIds={selectedAnnotationId}
93
- maxHeight={300}
94
- onRowSelect={onRowSelect}
95
- formName="cutLocations"
96
- isSingleSelect
97
- compact
98
- noRouter
99
- minimalStyle
100
- scrollToSelectedRowRelativeToDom
101
- noHeader
102
- isSimple
103
- noFullscreenButton
104
- isInfinite
105
- withSearch={false}
106
- withFilter={false}
107
- schema={schema}
108
- entities={entities}
109
- />
110
- </div>
111
- )}
112
- {aliases && aliases.length && (
113
- <div style={{ marginTop: 10 }}>
114
- Aliases:
115
- <div style={{ display: "flex", flexWrap: "wrap" }}>
116
- {aliases.map((n, i) => {
117
- return (
118
- <CutsiteTag
119
- allRestrictionEnzymes={allRestrictionEnzymes}
120
- cutsitesByNameActive={cutsitesByNameActive}
121
- cutsitesByName={allCutsites.cutsitesByName}
122
- key={i}
123
- name={n}
124
- doNotShowCuts
125
- />
126
- );
127
- })}
128
- </div>
129
- </div>
130
- )}
131
- </div>
132
- </div>
133
- );
134
- }
135
-
136
- // export default compose(
137
- // withEditorProps,
138
- // withRestrictionEnzymes
139
- // )(SingleEnzymeCutsiteInfo);
package/ToolbarItem.js DELETED
@@ -1,192 +0,0 @@
1
- import { connectToEditor } from "../withEditorProps";
2
- // import download from 'in-browser-download'
3
- import {
4
- Popover,
5
- Position,
6
- Tooltip,
7
- Icon as BpIcon,
8
- AnchorButton,
9
- Intent
10
- } from "@blueprintjs/core";
11
- import React from "react";
12
- import "./style.css";
13
- import { noop } from "lodash-es";
14
-
15
- class ToolbarItem extends React.Component {
16
- toggleDropdown = ({ forceClose } = {}) => {
17
- const { toolName, isOpen } = this.props;
18
-
19
- this.props.openToolbarItemUpdate(isOpen || forceClose ? "" : toolName);
20
- };
21
-
22
- render() {
23
- const { overrides = {} } = this.props;
24
- const {
25
- isOpen,
26
- index,
27
- Icon,
28
- // dynamicIcon,
29
- onIconClick = noop,
30
- tooltip = "",
31
- tooltipToggled,
32
- dropdowntooltip = "",
33
- Dropdown,
34
- disabled,
35
- isHidden,
36
- renderIconAbove,
37
- noDropdownIcon,
38
- IconWrapper,
39
- editorName,
40
- popoverDisabled,
41
- IconWrapperProps,
42
- toolName,
43
- dropdownicon,
44
- tooltipDisabled,
45
- toggled = false,
46
- ...rest
47
- } = { ...this.props, ...overrides };
48
- if (!toolName) console.warn("toolName is required!");
49
- if (isHidden) return null;
50
- let tooltipToDisplay = tooltip;
51
- if (toggled && tooltipToggled) {
52
- tooltipToDisplay = tooltipToggled;
53
- }
54
- // const Dropdown = _DropDown && withEditorProps && withEditorProps(_DropDown);
55
-
56
- const buttonTarget = (
57
- <div
58
- className={
59
- `veToolbarItemOuter ve-tool-container-${toolName}` +
60
- (disabled ? " disabled " : "")
61
- }
62
- >
63
- {renderIconAbove && (
64
- <div>
65
- <div className="veToolbarItem">{Icon}</div>
66
- </div>
67
- )}
68
-
69
- {Icon && !renderIconAbove && (
70
- <Tooltip
71
- disabled={tooltipDisabled}
72
- portalClassName="ve-toolbar-item-popover"
73
- content={tooltipToDisplay}
74
- >
75
- <AnchorButton
76
- intent={Intent.PRIMARY}
77
- onClick={
78
- onIconClick === "toggleDropdown"
79
- ? this.toggleDropdown
80
- : onIconClick
81
- }
82
- active={toggled}
83
- disabled={disabled}
84
- minimal
85
- icon={
86
- React.isValidElement(Icon) ? (
87
- Icon
88
- ) : (
89
- <Icon toggleDropdown={this.toggleDropdown} />
90
- )
91
- }
92
- />
93
- </Tooltip>
94
- )}
95
- {Dropdown && !noDropdownIcon ? (
96
- <Tooltip disabled={tooltipDisabled} content={dropdowntooltip}>
97
- <div
98
- className={
99
- (isOpen ? " isOpen " : "") +
100
- (dropdownicon ? "" : " veToolbarDropdown")
101
- }
102
- onClick={this.toggleDropdown}
103
- >
104
- {dropdownicon ? (
105
- <div className="veToolbarIcon">
106
- <div>{dropdownicon}</div>
107
- </div>
108
- ) : isOpen ? (
109
- <BpIcon
110
- data-test={toolName + "Dropdown"}
111
- iconSize={13}
112
- icon="caret-up"
113
- />
114
- ) : (
115
- <BpIcon
116
- data-test={toolName + "Dropdown"}
117
- iconSize={13}
118
- icon="caret-down"
119
- />
120
- )}
121
- </div>
122
- </Tooltip>
123
- ) : null}
124
- </div>
125
- );
126
- const content = (
127
- <div
128
- ref={n => {
129
- if (n) this.dropdownNode = n;
130
- }}
131
- style={{ padding: 10, minWidth: 250, maxWidth: 350 }}
132
- className="ve-toolbar-dropdown content"
133
- >
134
- {Dropdown && (
135
- <Dropdown
136
- {...rest}
137
- editorName={editorName}
138
- toggleDropdown={this.toggleDropdown}
139
- />
140
- )}
141
- </div>
142
- );
143
- const target = IconWrapper ? (
144
- <IconWrapper {...IconWrapperProps}>
145
- {({ getRootProps, getInputProps }) => (
146
- <div {...getRootProps()}>
147
- <input {...getInputProps()} />
148
- {buttonTarget}
149
- </div>
150
- )}
151
- </IconWrapper>
152
- ) : (
153
- buttonTarget
154
- );
155
-
156
- return (
157
- <div style={{ display: "flex", alignItems: "center" }}>
158
- {index !== 0 && <div className="veToolbarSpacer" />}
159
-
160
- <Popover
161
- disabled={popoverDisabled}
162
- isOpen={!!Dropdown && isOpen}
163
- onClose={e => {
164
- let srcElement;
165
- if (e) {
166
- srcElement = e.srcElement || e.target;
167
- }
168
- if (
169
- e &&
170
- srcElement &&
171
- this.dropdownNode &&
172
- (this.dropdownNode.contains(srcElement) ||
173
- !document.body.contains(srcElement))
174
- ) {
175
- return;
176
- }
177
- this.toggleDropdown({ forceClose: true });
178
- }}
179
- canEscapeKeyClose
180
- minimal
181
- position={Position.BOTTOM}
182
- target={target}
183
- content={content}
184
- />
185
- </div>
186
- );
187
- }
188
- }
189
-
190
- export default connectToEditor(({ toolBar = {} }, { toolName }) => ({
191
- isOpen: toolBar.openItem === toolName
192
- }))(ToolbarItem);
package/Translation.js DELETED
@@ -1,198 +0,0 @@
1
- import React from "react";
2
- import {
3
- getSequenceWithinRange,
4
- zeroSubrangeByContainerRange
5
- } from "@teselagen/range-utils";
6
- import AASliver from "./AASliver";
7
- import pureNoFunc from "../../utils/pureNoFunc";
8
- import { proteinAlphabet } from "@teselagen/sequence-utils";
9
-
10
- class Translation extends React.Component {
11
- state = {
12
- hasMounted: false
13
- };
14
- componentDidMount() {
15
- this.timeout = setTimeout(() => {
16
- this.setState({
17
- hasMounted: true
18
- });
19
- }, 5);
20
- }
21
- componentWillUnmount() {
22
- !window.Cypress && clearTimeout(this.timeout);
23
- }
24
- render() {
25
- const {
26
- annotationRange,
27
- height,
28
- showAminoAcidNumbers,
29
- charWidth,
30
- aminoAcidNumbersHeight,
31
- onClick,
32
- onRightClick,
33
- onDoubleClick,
34
- sequenceLength,
35
- getGaps,
36
- colorType,
37
- isProtein
38
- } = this.props;
39
- const { hasMounted } = this.state;
40
- const { annotation } = annotationRange;
41
- if (!hasMounted && !isProtein) {
42
- return <g height={height} className="translationLayer" />;
43
- }
44
- //we have an amino acid representation of our entire annotation, but it is an array
45
- //starting at 0, even if the annotation starts at some arbitrary point in the sequence
46
- const { aminoAcids = [] } = annotation;
47
- //so we "zero" our subRange by the annotation start
48
- const subrangeStartRelativeToAnnotationStart = zeroSubrangeByContainerRange(
49
- annotationRange,
50
- annotation,
51
- sequenceLength
52
- );
53
- //which allows us to then get the amino acids for the subRange
54
- const aminoAcidsForSubrange = getSequenceWithinRange(
55
- subrangeStartRelativeToAnnotationStart,
56
- aminoAcids
57
- );
58
-
59
- //we then loop over all the amino acids in the sub range and draw them onto the row
60
- let prevAaSliver;
61
- let nextAaSliver = aminoAcidsForSubrange[1];
62
- // The last index in the sequence
63
- const lastIndex = aminoAcidsForSubrange.length - 1;
64
-
65
- const translationSVG = aminoAcidsForSubrange.map(
66
- function (aminoAcidSliver, index) {
67
- if (aminoAcidSliver.positionInCodon === null) {
68
- prevAaSliver = aminoAcidSliver;
69
- nextAaSliver = aminoAcidsForSubrange[index + 2];
70
- return (
71
- <rect
72
- key={annotation.id + aminoAcidSliver.sequenceIndex}
73
- x={index * charWidth}
74
- y={height / 2 - height / 16}
75
- width={charWidth}
76
- height={height / 8}
77
- fill="grey"
78
- stroke="black"
79
- strokeWidth={1}
80
- ></rect>
81
- );
82
- }
83
- const isEndFiller =
84
- (index === 0 || prevAaSliver?.positionInCodon === null) &&
85
- aminoAcidSliver.positionInCodon === (annotation.forward ? 2 : 0);
86
-
87
- const isStartFiller =
88
- (index === lastIndex || nextAaSliver?.positionInCodon === null) &&
89
- aminoAcidSliver.positionInCodon === (annotation.forward ? 0 : 2);
90
-
91
- let isTruncatedEnd =
92
- (index === 0 || prevAaSliver?.positionInCodon === null) &&
93
- aminoAcidSliver.positionInCodon === 1;
94
- let isTruncatedStart =
95
- (index === lastIndex || nextAaSliver?.positionInCodon === null) &&
96
- aminoAcidSliver.positionInCodon === 1;
97
-
98
- if (!annotation.forward) {
99
- const holder = isTruncatedEnd;
100
- isTruncatedEnd = isTruncatedStart;
101
- isTruncatedStart = holder;
102
- }
103
- if (
104
- aminoAcidSliver.positionInCodon !== 1 &&
105
- !isStartFiller &&
106
- !isEndFiller
107
- ) {
108
- prevAaSliver = aminoAcidSliver;
109
- nextAaSliver = aminoAcidsForSubrange[index + 2];
110
- return null;
111
- }
112
- const { gapsInside, gapsBefore } = getGaps(aminoAcidSliver.codonRange);
113
- const gapsInsideFeatureStartToBp = getGaps({
114
- start: annotationRange.start,
115
- end: aminoAcidSliver.sequenceIndex
116
- }).gapsInside;
117
- // var relativeAAPositionInTranslation = annotationRange.start % bpsPerRow + index;
118
- const relativeAAPositionInTranslation = index;
119
- const aminoAcid = aminoAcidSliver.aminoAcid || {};
120
- //get the codonIndices relative to
121
- const alphVal = proteinAlphabet[aminoAcid.value];
122
- let color;
123
- if (alphVal) {
124
- color =
125
- colorType === "byHydrophobicity"
126
- ? alphVal.color
127
- : alphVal.colorByFamily;
128
- } else {
129
- color = aminoAcid.color;
130
- }
131
- prevAaSliver = aminoAcidSliver;
132
- nextAaSliver = aminoAcidsForSubrange[index + 2];
133
-
134
- return (
135
- <AASliver
136
- // isTruncatedEnd && isTruncatedStart is the special case of a single base exon
137
- isFiller={
138
- isEndFiller ||
139
- isStartFiller ||
140
- (isTruncatedEnd && isTruncatedStart)
141
- }
142
- isTruncatedEnd={isTruncatedEnd}
143
- isTruncatedStart={isTruncatedStart}
144
- onClick={function (event) {
145
- onClick({
146
- annotation: aminoAcidSliver.codonRange,
147
- codonRange: aminoAcidSliver.codonRange,
148
- event,
149
- gapsInside,
150
- gapsBefore
151
- });
152
- }}
153
- onContextMenu={function (event) {
154
- onRightClick &&
155
- onRightClick({
156
- annotation,
157
- codonRange: aminoAcidSliver.codonRange,
158
- event,
159
- gapsInside,
160
- gapsBefore
161
- });
162
- }}
163
- title={`${aminoAcid.name} -- Index: ${
164
- aminoAcidSliver.aminoAcidIndex + 1
165
- } -- Hydrophobicity: ${aminoAcid.hydrophobicity} -- Mass: ${
166
- aminoAcid.mass
167
- }\n
168
- Part of ${annotation.translationType} Translation from BPs ${
169
- annotation.start + 1
170
- } to ${annotation.end + 1} (${aminoAcids.length / 3} AAs)`}
171
- showAminoAcidNumbers={showAminoAcidNumbers}
172
- aminoAcidIndex={aminoAcidSliver.aminoAcidIndex}
173
- onDoubleClick={function (event) {
174
- onDoubleClick({ annotation, event });
175
- }}
176
- getGaps={getGaps}
177
- key={annotation.id + aminoAcidSliver.sequenceIndex}
178
- forward={annotation.forward}
179
- width={charWidth}
180
- height={
181
- showAminoAcidNumbers ? height - aminoAcidNumbersHeight : height
182
- }
183
- relativeAAPositionInTranslation={
184
- relativeAAPositionInTranslation + gapsInsideFeatureStartToBp
185
- }
186
- letter={aminoAcid.value}
187
- color={color}
188
- positionInCodon={aminoAcidSliver.positionInCodon}
189
- />
190
- );
191
- }
192
- );
193
-
194
- return <g className="translationLayer">{translationSVG}</g>;
195
- }
196
- }
197
-
198
- export default pureNoFunc(Translation);
@@ -1,149 +0,0 @@
1
- import { Tooltip, AnchorButton } from "@blueprintjs/core";
2
- import React from "react";
3
- import {
4
- DataTable,
5
- withSelectedEntities,
6
- createCommandMenu
7
- } from "@teselagen/ui";
8
- import getCommands from "../../commands";
9
- import { map } from "lodash-es";
10
- import { getRangeLength } from "@teselagen/range-utils";
11
- import { connectToEditor } from "../../withEditorProps";
12
- import { compose } from "recompose";
13
- import selectors from "../../selectors";
14
- import { getMassOfAaString } from "@teselagen/sequence-utils";
15
- import { translationsSubmenu } from "../../MenuBar/viewSubmenu";
16
- import { getVisFilter } from "./GenericAnnotationProperties";
17
-
18
- class TranslationProperties extends React.Component {
19
- constructor(props) {
20
- super(props);
21
- this.commands = getCommands(this);
22
- }
23
- onRowSelect = ([record]) => {
24
- if (!record) return;
25
- const { dispatch, editorName } = this.props;
26
- dispatch({
27
- type: "SELECTION_LAYER_UPDATE",
28
- payload: record,
29
- meta: {
30
- editorName
31
- }
32
- });
33
- };
34
- render() {
35
- const {
36
- readOnly,
37
- translations,
38
- translationPropertiesSelectedEntities,
39
- deleteTranslation,
40
- sequenceLength,
41
- selectedAnnotationId,
42
- annotationVisibility
43
- } = this.props;
44
- const translationsToUse = map(translations, translation => {
45
- let aaString = "";
46
- for (let i = 0; i < translation.aminoAcids.length; i++) {
47
- aaString += translation.aminoAcids[i].aminoAcid.value;
48
- }
49
- return {
50
- ...translation,
51
- sizeBps: getRangeLength(translation, sequenceLength),
52
- sizeAa:
53
- translation.translationType === "ORF"
54
- ? Math.floor(getRangeLength(translation, sequenceLength) / 3 - 1)
55
- : Math.floor(getRangeLength(translation, sequenceLength) / 3),
56
- ...(translation.strand === undefined && {
57
- strand: translation.forward ? 1 : -1
58
- }),
59
- mass: getMassOfAaString(aaString, 2, true)
60
- };
61
- });
62
- return (
63
- <div style={{ display: "flex", flexDirection: "column" }}>
64
- <DataTable
65
- withCheckboxes
66
- noPadding
67
- onRowSelect={this.onRowSelect}
68
- selectedIds={selectedAnnotationId}
69
- formName="translationProperties"
70
- noRouter
71
- compact
72
- topLeftItems={getVisFilter(
73
- createCommandMenu(translationsSubmenu, this.commands, {
74
- useTicks: true
75
- })
76
- )}
77
- leftOfSearchBarItems={
78
- !readOnly && (
79
- <Tooltip
80
- content={
81
- translationPropertiesSelectedEntities.length &&
82
- translationPropertiesSelectedEntities[0].translationType !==
83
- "User Created"
84
- ? `Only "User Created" translations can be deleted`
85
- : undefined
86
- }
87
- >
88
- <AnchorButton
89
- onClick={() => {
90
- deleteTranslation(translationPropertiesSelectedEntities);
91
- }}
92
- intent="danger"
93
- icon="trash"
94
- style={{ marginLeft: 10, marginRight: 15, height: 30 }}
95
- disabled={
96
- !translationPropertiesSelectedEntities.length ||
97
- translationPropertiesSelectedEntities[0].translationType !==
98
- "User Created"
99
- }
100
- ></AnchorButton>
101
- </Tooltip>
102
- )
103
- }
104
- annotationVisibility={annotationVisibility} //we need to pass this in order to force the DT to rerender
105
- hideSelectedCount
106
- noFooter
107
- noFullscreenButton
108
- isInfinite
109
- schema={{
110
- fields: [
111
- {
112
- path: "translationType",
113
- displayName: "Type",
114
- type: "string"
115
- },
116
- {
117
- path: "sizeAa",
118
- displayName: "Size (aa)",
119
- type: "number"
120
- },
121
- {
122
- path: "mass",
123
- displayName: "Mass (g/mol)",
124
- type: "number"
125
- },
126
- { path: "strand", type: "number" }
127
- ]
128
- }}
129
- entities={translationsToUse}
130
- />
131
- </div>
132
- );
133
- }
134
- }
135
-
136
- export default compose(
137
- connectToEditor(editorState => {
138
- const { readOnly, annotationVisibility = {}, sequenceData } = editorState;
139
- return {
140
- readOnly,
141
- translations: selectors.translationsSelector(editorState),
142
- orfs: selectors.orfsSelector(editorState),
143
- annotationVisibility,
144
- sequenceLength: (sequenceData.sequence || "").length,
145
- sequenceData
146
- };
147
- }),
148
- withSelectedEntities("translationProperties")
149
- )(TranslationProperties);
@@ -1,5 +0,0 @@
1
- .small-slider .bp3-slider-handle {
2
- width: 12px;
3
- height: 12px;
4
- top: 2px;
5
- }