@teselagen/ove 0.7.28 → 0.7.29

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 (285) hide show
  1. package/index.cjs.js +1055 -996
  2. package/index.es.js +1055 -996
  3. package/index.umd.js +189036 -0
  4. package/ove.css +1 -1
  5. package/package.json +2 -6
  6. package/src/helperComponents/PropertiesDialog/TranslationProperties.js +1 -1
  7. package/AASliver.js +0 -187
  8. package/AddLaddersDialog.js +0 -82
  9. package/AdditionalCutsiteInfoDialog.js +0 -599
  10. package/AlignmentVisibilityTool.js +0 -105
  11. package/AnnotationContainerHolder.js +0 -20
  12. package/AnnotationPositioner.js +0 -27
  13. package/AutoAnnotate.js +0 -501
  14. package/AutoAnnotateBpMatchingDialog.js +0 -208
  15. package/Axis.js +0 -151
  16. package/AxisNumbers.js +0 -35
  17. package/Browser.js +0 -106
  18. package/Caret.js +0 -63
  19. package/Chromatogram.js +0 -293
  20. package/CircularDnaSequence.js +0 -73
  21. package/CircularZoomMinimap.js +0 -16
  22. package/ColorPicker.js +0 -30
  23. package/CommandHotkeyHandler.js +0 -44
  24. package/CreateAnnotationsPage.js +0 -98
  25. package/Cutsite.js +0 -18
  26. package/CutsiteProperties.js +0 -176
  27. package/CutsiteSelectionLayers.js +0 -47
  28. package/Cutsites.js +0 -271
  29. package/DeletionLayer.js +0 -28
  30. package/DropHandler.css +0 -21
  31. package/DropHandler.js +0 -64
  32. package/EditCaretPosition.js +0 -234
  33. package/EditTrackNameDialog.js +0 -30
  34. package/Feature.js +0 -83
  35. package/FeatureProperties.js +0 -6
  36. package/FillWindow.js +0 -47
  37. package/GenbankView.js +0 -74
  38. package/GeneralProperties.js +0 -117
  39. package/GenericAnnotationProperties.js +0 -406
  40. package/GlobalDialog.js +0 -73
  41. package/GlobalDialogUtils.js +0 -110
  42. package/GoToDialog.js +0 -25
  43. package/HorizontalPanelDragHandle.js +0 -35
  44. package/Keyboard.js +0 -85
  45. package/Labels.js +0 -327
  46. package/Ladder.css +0 -20
  47. package/Ladder.js +0 -303
  48. package/MeltingTemp.js +0 -85
  49. package/Menlo.ttf +0 -0
  50. package/Minimap.js +0 -515
  51. package/Mismatches.js +0 -134
  52. package/Monaco.ttf +0 -0
  53. package/MultipleSeqsDetectedOnImportDialog.js +0 -74
  54. package/Orf.js +0 -109
  55. package/OrfProperties.js +0 -117
  56. package/Orfs.js +0 -35
  57. package/PCRTool.js +0 -179
  58. package/PairwiseAlignmentView.js +0 -68
  59. package/Part.js +0 -34
  60. package/PartProperties.js +0 -9
  61. package/PassThrough.js +0 -3
  62. package/PerformantSelectionLayer.js +0 -32
  63. package/PinchHelper.js +0 -24
  64. package/PointedAnnotation.js +0 -347
  65. package/PositionAnnotationOnCircle.js +0 -26
  66. package/Primer.js +0 -41
  67. package/PrimerProperties.js +0 -19
  68. package/ReflexContainer.js +0 -802
  69. package/ReflexElement.js +0 -160
  70. package/ReflexEvents.js +0 -77
  71. package/ReflexSplitter.js +0 -205
  72. package/RenameSequenceDialog.js +0 -7
  73. package/RotateCircularViewSlider.js +0 -93
  74. package/SelectDialog.js +0 -150
  75. package/SequenceName.js +0 -15
  76. package/SimpleCircularOrLinearView.js +0 -381
  77. package/SimpleOligoPreview.js +0 -39
  78. package/SingleEnzymeCutsiteInfo.js +0 -139
  79. package/ToolbarItem.js +0 -192
  80. package/Translation.js +0 -198
  81. package/TranslationProperties.js +0 -149
  82. package/UncontrolledSliderWithPlusMinusBtns.css +0 -5
  83. package/UncontrolledSliderWithPlusMinusBtns.js +0 -134
  84. package/VeTopRightContainer.js +0 -12
  85. package/ZoomCircularViewSlider.js +0 -62
  86. package/ZoomLinearView.js +0 -47
  87. package/addAlignment.js +0 -6
  88. package/addMetaToActionCreators.js +0 -12
  89. package/addWrappedAddons.js +0 -20
  90. package/alignmentTool.js +0 -503
  91. package/alignments.js +0 -379
  92. package/annotationLabelVisibility.js +0 -2
  93. package/annotationSearchSelector.js +0 -24
  94. package/annotationTypes.js +0 -35
  95. package/annotationVisibility.js +0 -196
  96. package/annotationsToSupport.js +0 -104
  97. package/arrayToObjWithIds.js +0 -17
  98. package/arrayUtils.js +0 -19
  99. package/array_move.js +0 -10
  100. package/calculateTickMarkPositionsForGivenRange.js +0 -47
  101. package/caretPosition.js +0 -27
  102. package/cdsFeaturesSelector.js +0 -9
  103. package/charWidth.js +0 -22
  104. package/circular.js +0 -19
  105. package/circularSelector.js +0 -4
  106. package/clickAndDragUtils.js +0 -576
  107. package/coerceInitialValue.js +0 -7
  108. package/combineReducersDontIgnoreKeys.js +0 -12
  109. package/commandUtils.js +0 -20
  110. package/constants.js +0 -2
  111. package/copyOptions.js +0 -34
  112. package/createFragmentLines.js +0 -120
  113. package/createMergedDefaultStateReducer.js +0 -30
  114. package/createMetaAction.js +0 -12
  115. package/createSequenceInputPopup.js +0 -290
  116. package/createSequenceInputPopupStyle.css +0 -87
  117. package/createSimpleDialog.js +0 -89
  118. package/createYourOwnEnzyme.js +0 -39
  119. package/cutsiteLabelColorSelector.js +0 -6
  120. package/cutsiteTool.js +0 -88
  121. package/cutsitesByRangeSelector.js +0 -5
  122. package/cutsitesSelector.js +0 -61
  123. package/darkmode.css +0 -98
  124. package/defaultConfig.js +0 -150
  125. package/deletionLayers.js +0 -36
  126. package/description.js +0 -21
  127. package/digestTool.js +0 -34
  128. package/dnaToColor.js +0 -17
  129. package/downloadTool.js +0 -39
  130. package/draggableClassnames.js +0 -5
  131. package/drawAnnotations.js +0 -440
  132. package/drawDirectedPiePiece.js +0 -142
  133. package/editTool.js +0 -49
  134. package/editorSelector.js +0 -2
  135. package/editorUtils.js +0 -205
  136. package/estimateRowHeight.js +0 -184
  137. package/featureLengthsToHide.js +0 -27
  138. package/featureTool.js +0 -34
  139. package/features.js +0 -19
  140. package/featuresSelector.js +0 -8
  141. package/filteredCutsitesSelector.js +0 -136
  142. package/filteredFeaturesSelector.js +0 -32
  143. package/filteredPartsSelector.js +0 -57
  144. package/filteredPrimersSelector.js +0 -27
  145. package/filteredRestrictionEnzymesSelector.js +0 -1
  146. package/find.png +0 -0
  147. package/findTool.js +0 -79
  148. package/findToolConstants.js +0 -1
  149. package/frameTranslations.js +0 -52
  150. package/fullscreen.png +0 -0
  151. package/getAdditionalEnzymesSelector.js +0 -46
  152. package/getAngleForPositionMidpoint.js +0 -3
  153. package/getAnnotationClassnames.js +0 -12
  154. package/getAnnotationNameAndStartStopString.js +0 -61
  155. package/getBpsPerRow.js +0 -19
  156. package/getCutsiteLabelHeights.js +0 -56
  157. package/getGapMap.js +0 -12
  158. package/getGaps.js +0 -27
  159. package/getInternalLabel.js +0 -40
  160. package/getOveHotkeyDefs.js +0 -12
  161. package/getPairwiseOverviewLinearViewOptions.js +0 -38
  162. package/getRangeAnglesSpecial.js +0 -12
  163. package/getStructuredBases.js +0 -97
  164. package/getTrackFromEvent.js +0 -25
  165. package/getVisibleStartEnd.js +0 -7
  166. package/getXStartAndWidthFromNonCircularRange.js +0 -12
  167. package/getXStartAndWidthOfRangeWrtRow.js +0 -27
  168. package/getXStartAndWidthOfRowAnnotation.js +0 -19
  169. package/getYOffset.js +0 -15
  170. package/hoveredAnnotation.js +0 -24
  171. package/importTool.js +0 -27
  172. package/index.js +0 -71
  173. package/inlineFindTool.js +0 -38
  174. package/isElementInViewport.js +0 -29
  175. package/isEnzymeFilterAndSelector.js +0 -1
  176. package/isTargetWithinEl.js +0 -6
  177. package/labelLineIntensity.js +0 -25
  178. package/labelSize.js +0 -23
  179. package/ladderDefaults.js +0 -25
  180. package/lastSavedId.js +0 -20
  181. package/lineageLines.js +0 -11
  182. package/linear.png +0 -0
  183. package/makeStore.js +0 -34
  184. package/massageTickSpacing.js +0 -19
  185. package/materiallyAvailable.js +0 -19
  186. package/middleware.js +0 -112
  187. package/minimumOrfSize.js +0 -24
  188. package/minimumOrfSizeSelector.js +0 -2
  189. package/modalActions.js +0 -3
  190. package/moveCaret.js +0 -58
  191. package/name.js +0 -19
  192. package/normalizeAngle.js +0 -3
  193. package/normalizeAngleRange.js +0 -9
  194. package/oligoTool.js +0 -30
  195. package/onlyUpdateForKeysDeep.js +0 -31
  196. package/orfFrameToColorMap.js +0 -10
  197. package/orfTool.js +0 -136
  198. package/orfsSelector.js +0 -15
  199. package/panelsShown.js +0 -294
  200. package/partLengthsToHide.js +0 -23
  201. package/partOverhangs.js +0 -6
  202. package/partTagSearch.js +0 -69
  203. package/partTool.js +0 -45
  204. package/parts.js +0 -19
  205. package/partsSelector.js +0 -8
  206. package/pie.png +0 -0
  207. package/polarToSpecialCartesian.js +0 -7
  208. package/positionCutsites.js +0 -6
  209. package/prepareRowData.js +0 -64
  210. package/primerBases.js +0 -221
  211. package/primerLengthsToHide.js +0 -27
  212. package/primers.js +0 -19
  213. package/primersSelector.js +0 -8
  214. package/print.png +0 -0
  215. package/printTool.js +0 -31
  216. package/propertiesTool.js +0 -40
  217. package/proteinUtils.js +0 -3
  218. package/pureNoFunc.js +0 -18
  219. package/readOnly.js +0 -25
  220. package/redoTool.js +0 -30
  221. package/reflex-styles.css +0 -128
  222. package/reflex-styles.css.map +0 -9
  223. package/relaxLabelAngles.js +0 -157
  224. package/relaxLabels_DEPRECATED.js +0 -105
  225. package/replacementLayers.js +0 -36
  226. package/restrictionEnzymes.js +0 -52
  227. package/restrictionEnzymesSelector.js +0 -34
  228. package/rowviewContants.js +0 -3
  229. package/ruler.css +0 -89
  230. package/save.png +0 -0
  231. package/saveTool.js +0 -44
  232. package/searchLayersSelector.js +0 -71
  233. package/selectedAnnotations.js +0 -89
  234. package/selectedAnnotationsSelector.js +0 -1
  235. package/selectedCutsitesSelector.js +0 -21
  236. package/selectedPartTags.js +0 -21
  237. package/selectionLayer.js +0 -25
  238. package/sequence.js +0 -12
  239. package/sequenceDataHistory.js +0 -43
  240. package/sequenceDataSelector.js +0 -2
  241. package/sequenceLengthSelector.js +0 -5
  242. package/sequenceSelector.js +0 -4
  243. package/sharedActionCreators.js +0 -0
  244. package/shouldFlipText.js +0 -4
  245. package/shouldRerender.js +0 -27
  246. package/showFileDialog.js +0 -25
  247. package/showGCContent.js +0 -23
  248. package/show_cut_sites.png +0 -0
  249. package/show_features.png +0 -0
  250. package/show_orfs.png +0 -0
  251. package/show_primers.png +0 -0
  252. package/simpleDialog.css +0 -13
  253. package/specialCutsiteFilterOptions.js +0 -22
  254. package/style.css +0 -10
  255. package/tagsToBoldSelector.js +0 -2
  256. package/toggle_views.svg +0 -1
  257. package/toolBar.js +0 -23
  258. package/translationSearchMatchesSelector.js +0 -14
  259. package/translations.js +0 -20
  260. package/translationsRawSelector.js +0 -8
  261. package/translationsSelector.js +0 -137
  262. package/typeField.js +0 -24
  263. package/undoTool.js +0 -30
  264. package/updateEditor.js +0 -200
  265. package/updateLabelsForInViewFeatures.js +0 -55
  266. package/updateLabelsForInViewFeaturesCircView.js +0 -41
  267. package/updateTrackHelper.js +0 -58
  268. package/uppercaseSequenceMapFont.js +0 -25
  269. package/upsertDeleteActionGenerator.js +0 -31
  270. package/useAAColorType.js +0 -8
  271. package/useAdditionalOrfStartCodons.js +0 -24
  272. package/useAnnotationLimits.js +0 -42
  273. package/useChromatogramPrefs.js +0 -31
  274. package/useFormValue.js +0 -7
  275. package/useLadders.js +0 -6
  276. package/useMeltingTemp.js +0 -7
  277. package/useTmType.js +0 -10
  278. package/userDefinedHandlersAndOpts.js +0 -61
  279. package/utils.js +0 -37
  280. package/versionHistory.js +0 -26
  281. package/versionHistoryTool.js +0 -21
  282. package/viewSubmenu.js +0 -479
  283. package/visibilityTool.js +0 -39
  284. package/withHover.js +0 -113
  285. 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
- }