@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,440 +0,0 @@
1
- import React from "react";
2
- import IntervalTree from "node-interval-tree";
3
- import { sortBy, noop } from "lodash-es";
4
- import { getRangeLength } from "@teselagen/range-utils";
5
- import getRangeAngles from "./getRangeAnglesSpecial";
6
- import getYOffset from "./getYOffset";
7
- import withHover from "../helperComponents/withHover";
8
- import PositionAnnotationOnCircle from "./PositionAnnotationOnCircle";
9
- import getAnnotationNameAndStartStopString from "../utils/getAnnotationNameAndStartStopString";
10
- import Feature from "./Feature";
11
- import getAnnotationClassnames from "../utils/getAnnotationClassnames";
12
- // import { normalizeAngleRange } from "./normalizeAngleRange";
13
- // import { normalizeAngle } from "./normalizeAngle";
14
-
15
- //annotations coming in can be positioned either by caretPosition or range
16
- function drawAnnotations(props) {
17
- const {
18
- readOnly,
19
- annotationType,
20
- radius,
21
- noHover,
22
- isProtein,
23
- type,
24
- annotations,
25
- annotationHeight,
26
- noTitle,
27
- spaceBetweenAnnotations,
28
- sequenceLength,
29
- showCicularViewInternalLabels,
30
- // reverseAnnotations, //set true when drawing annotations that use the drawDirectedPiePiece function because that function returns things that need to be flipped
31
- // editorName,
32
- getColor,
33
- useStartAngle, //use the startAngle instead of the centerAngle to position the labels
34
- onClick = noop,
35
- noHeight,
36
- positionBy, //by default the annotation.start and annotation.end are used to position the annotation on the circle, but passing a function here gives an option to override that
37
- allOnSameLevel, //by default overlapping annotations are given different yOffsets. Setting this to true prevents that and positions all annotations on the same level (no y-offsets given). Cutsites for example just get drawn all on the same level
38
- onRightClicked = noop,
39
- onDoubleClick = noop,
40
- showLabels,
41
- hideAnnotation,
42
- // rotationRadians,
43
- labelOptions,
44
- annotationProps,
45
- fontStyle
46
- // isZoomedIn,
47
- // visibleAngleRange
48
- } = props;
49
- const totalAnnotationHeight = annotationHeight + spaceBetweenAnnotations;
50
- const featureITree = new IntervalTree();
51
- let maxYOffset = 0;
52
- const svgGroup = [];
53
- const labels = {};
54
-
55
- if (!Object.keys(annotations).length) return null;
56
- sortBy(annotations, a => {
57
- return -getRangeLength(a, sequenceLength);
58
- })
59
- .map(annotation => {
60
- const { startAngle, endAngle, totalAngle, centerAngle, locationAngles } =
61
- getRangeAngles(
62
- positionBy ? positionBy(annotation) : annotation,
63
- sequenceLength
64
- );
65
- const spansOrigin = startAngle > endAngle;
66
- const annotationCopy = {
67
- ...annotation,
68
- startAngle,
69
- endAngle,
70
- locationAngles,
71
- totalAngle,
72
- centerAngle,
73
- yOffset: 0
74
- };
75
- if (!allOnSameLevel) {
76
- //expand the end angle if annotation spans the origin
77
- const expandedEndAngle = spansOrigin
78
- ? endAngle + 2 * Math.PI
79
- : endAngle;
80
- let yOffset1;
81
- let yOffset2;
82
- if (spansOrigin) {
83
- annotationCopy.yOffset = getYOffset(
84
- featureITree,
85
- startAngle,
86
- expandedEndAngle
87
- );
88
- } else {
89
- //we need to check both locations to account for annotations that span the origin
90
- yOffset1 = getYOffset(featureITree, startAngle, expandedEndAngle);
91
- yOffset2 = getYOffset(
92
- featureITree,
93
- startAngle + Math.PI * 2,
94
- expandedEndAngle + Math.PI * 2
95
- );
96
- annotationCopy.yOffset = Math.max(yOffset1, yOffset2);
97
- }
98
-
99
- if (spansOrigin) {
100
- featureITree.insert(startAngle, expandedEndAngle, {
101
- ...annotationCopy
102
- });
103
- } else {
104
- //normal feature
105
- // we need to add it twice to the interval tree to accomodate features which span the origin
106
- featureITree.insert(startAngle, expandedEndAngle, {
107
- ...annotationCopy
108
- });
109
- featureITree.insert(
110
- startAngle + 2 * Math.PI,
111
- expandedEndAngle + 2 * Math.PI,
112
-
113
- { ...annotationCopy }
114
- );
115
- }
116
-
117
- if (annotationCopy.yOffset > maxYOffset) {
118
- maxYOffset = annotationCopy.yOffset;
119
- }
120
- }
121
-
122
- return annotationCopy;
123
- })
124
- .forEach(function (annotation, index) {
125
- annotation.yOffset = maxYOffset - annotation.yOffset;
126
- function _onClick(event) {
127
- onClick && onClick({ event, annotation });
128
- annotation.onClick && annotation.onClick({ event, annotation });
129
- }
130
- function onContextMenu(event) {
131
- onRightClicked({ event, annotation });
132
- if (annotation.onRightClick) {
133
- annotation.onRightClick({ event, annotation });
134
- }
135
- }
136
- function _onDoubleClick(event) {
137
- onDoubleClick && onDoubleClick({ event, annotation });
138
- if (annotation.onDoubleClick) {
139
- annotation.onDoubleClick({ event, annotation });
140
- }
141
- }
142
-
143
- const {
144
- startAngle,
145
- endAngle,
146
- totalAngle,
147
- centerAngle,
148
- locationAngles,
149
- ...rest
150
- } = annotation;
151
-
152
- const _annotationProps = {
153
- ...annotationProps,
154
- ...rest
155
- };
156
-
157
- const titleText = getAnnotationNameAndStartStopString(annotation, {
158
- isProtein,
159
- readOnly
160
- });
161
-
162
- const classNames = getAnnotationClassnames(annotation, {
163
- viewName: "CircularView",
164
- type,
165
- isProtein,
166
- readOnly
167
- });
168
-
169
- const annotationRadius =
170
- radius + annotation.yOffset * totalAnnotationHeight;
171
- const name =
172
- annotation.name ||
173
- (annotation.restrictionEnzyme && annotation.restrictionEnzyme.name);
174
- let ellipsizedName;
175
- // let spaceBeforeName = 0;
176
- let angleAdjust;
177
-
178
- if (name && showCicularViewInternalLabels) {
179
- // eslint-disable-next-line no-inner-declarations
180
- function getEllipsizedName(totalAngle) {
181
- let ellipsizedName;
182
- const arcLength =
183
- 2 * Math.PI * (annotationRadius - annotationHeight) * totalAngle; //for arrowhead
184
-
185
- const annLength = Math.max(0, Math.floor(arcLength / 55 - 3));
186
- ellipsizedName = name.slice(0, annLength);
187
- if (ellipsizedName && ellipsizedName !== name) {
188
- if (ellipsizedName.length >= name.length - 2) {
189
- ellipsizedName = name;
190
- } else if (ellipsizedName.length > 3) {
191
- ellipsizedName += "..";
192
- } else {
193
- ellipsizedName = undefined;
194
- }
195
- }
196
- return ellipsizedName;
197
- }
198
- if (locationAngles) {
199
- annotation.locationAngles = locationAngles.map(l => {
200
- const en = getEllipsizedName(l.totalAngle);
201
- if (en?.length > (ellipsizedName?.length || 0)) {
202
- ellipsizedName = en;
203
- }
204
- return {
205
- ...l,
206
- ellipsizedName: en
207
- };
208
- });
209
- } else {
210
- ellipsizedName = getEllipsizedName(totalAngle);
211
- }
212
-
213
- // //tnr: WIP to try to adjust the inline label in the circular view to always show up even when zoomed in
214
- // if (ellipsizedName && isZoomedIn) {
215
- // const nameAngle =
216
- // ((ellipsizedName.length + 3) * 55) /
217
- // (2 * Math.PI * (annotationRadius - annotationHeight));
218
- // const maxAngleAdjust = (totalAngle - nameAngle) / 2;
219
- // const idealAngle = normalizeAngle(
220
- // -normalizeAngle(rotationRadians) - normalizeAngle(centerAngle)
221
- // );
222
- // angleAdjust = idealAngle;
223
- // if (
224
- // Math.min(maxAngleAdjust, idealAngle) !== idealAngle
225
- // // &&
226
- // // Math.min(maxAngleAdjust, 2 * Math.PI - idealAngle) !==
227
- // // 2 * Math.PI - idealAngle
228
- // ) {
229
- // angleAdjust = -maxAngleAdjust;
230
- // if (
231
- // normalizeAngle(
232
- // normalizeAngle(centerAngle) + normalizeAngle(rotationRadians)
233
- // ) > Math.PI
234
- // ) {
235
- // angleAdjust = -angleAdjust;
236
- // }
237
- // }
238
- // // angleAdjust =idealAngle
239
- // angleAdjust = (angleAdjust / Math.PI) * 180;
240
- // // if (normalizeAngle(normalizeAngle(centerAngle) + normalizeAngle(rotationRadians)) > Math.PI) {
241
- // // angleAdjust = -angleAdjust;
242
- // // }
243
- // }
244
- }
245
- if (showLabels && !ellipsizedName) {
246
- //add labels to the exported label array (to be drawn by the label component)
247
- labels[annotation.id] = {
248
- annotation,
249
- annotationType,
250
- annotationCenterAngle: useStartAngle ? startAngle : centerAngle,
251
- annotationCenterRadius: annotationRadius,
252
- text: name,
253
- id: annotation.id,
254
- title: titleText,
255
- className: `${classNames} ${annotation.labelClassName || ""}`,
256
- highPriorityLabel: annotation.highPriorityLabel,
257
- onClick: _onClick,
258
- onDoubleClick: _onDoubleClick,
259
- fontStyle: fontStyle || "normal",
260
- color:
261
- annotation.labelColor ||
262
- (annotationType === "part" ? "#ac68cc" : "black"),
263
- onContextMenu,
264
- ...labelOptions
265
- };
266
- }
267
- if (!hideAnnotation) {
268
- const annotationColor = getColor
269
- ? getColor(annotation)
270
- : annotation.color || "#ac68cc";
271
- DrawAnnotation.displayName = annotationType + "--- DrawAnnotation";
272
- const CompToUse = noHover ? DrawAnnotationInner : DrawAnnotation;
273
- svgGroup.push(
274
- <CompToUse
275
- {...{
276
- ...props,
277
- ...rest,
278
- ...annotation,
279
- angleAdjust,
280
- ellipsizedName,
281
- name,
282
- annotationHeight,
283
- annotationRadius,
284
- annotationType,
285
- isProtein,
286
- noTitle,
287
- titleText,
288
- classNames,
289
- onClick: _onClick,
290
- onDoubleClick: _onDoubleClick,
291
- onContextMenu,
292
- annotation,
293
- annotationColor,
294
- totalAngle,
295
- centerAngle,
296
- annotationProps: _annotationProps
297
- }}
298
- id={annotation.id}
299
- key={"veAnnotation-" + annotationType + index}
300
- />
301
- );
302
- }
303
- });
304
- return {
305
- component: (
306
- <g
307
- className={"veAnnotations-" + annotationType}
308
- key={"veAnnotations-" + annotationType}
309
- >
310
- {svgGroup}
311
- </g>
312
- ),
313
- height: noHeight
314
- ? 0
315
- : maxYOffset * totalAnnotationHeight + 0.5 * annotationHeight,
316
- labels
317
- };
318
- }
319
-
320
- export default drawAnnotations;
321
-
322
- function DrawAnnotationInner({
323
- className,
324
- startAngle,
325
- endAngle,
326
- onClick,
327
- onDoubleClick,
328
- onContextMenu,
329
- titleText,
330
- classNames,
331
- locationAngles,
332
- annotation,
333
- reverseAnnotations,
334
- Annotation = Feature,
335
- totalAngle,
336
- annotationColor,
337
- isProtein,
338
- annotationRadius,
339
- annotationHeight,
340
- onMouseLeave,
341
- onMouseOver,
342
- annotationType,
343
- annotationProps,
344
- addHeight,
345
- noTitle,
346
- useCenter,
347
- centerAngle,
348
- perAnnotationProps,
349
- passAnnotation,
350
- ellipsizedName,
351
- angleAdjust,
352
- rotationRadians
353
- }) {
354
- const sharedProps = {
355
- style: noTitle ? undefined : { cursor: "pointer" },
356
- className: `${className} ${classNames}`,
357
- onContextMenu: onContextMenu,
358
- onClick: onClick,
359
- onDoubleClick: onDoubleClick,
360
- onMouseLeave,
361
- onMouseOver
362
- };
363
- function getInner(
364
- {
365
- startAngle,
366
- endAngle,
367
- totalAngle,
368
- isNotLocation,
369
- containsLocations,
370
- ellipsizedName: ellipsizedNameLocation
371
- },
372
- i
373
- ) {
374
- const { transform, revTransform } = PositionAnnotationOnCircle({
375
- sAngle: useCenter ? centerAngle : startAngle,
376
- eAngle: useCenter ? centerAngle : endAngle,
377
- height: addHeight ? annotationRadius : undefined,
378
- forward: reverseAnnotations ? !annotation.forward : annotation.forward
379
- });
380
- return (
381
- <g
382
- transform={transform}
383
- data-title={noTitle ? null : titleText}
384
- {...avoidOverlapWith}
385
- key={
386
- isNotLocation
387
- ? "notLocation"
388
- : "location--" + annotation.id + "--" + i
389
- }
390
- {...sharedProps}
391
- >
392
- {noTitle ? null : (
393
- <g hidden style={{ display: "none" }}>
394
- {titleText}
395
- </g>
396
- )}
397
- <Annotation
398
- {...(passAnnotation && { annotation })}
399
- annotationType={annotationType}
400
- arrowheadType={annotation.arrowheadType}
401
- totalAngle={totalAngle}
402
- centerAngle={centerAngle}
403
- revTransform={revTransform}
404
- rotationRadians={rotationRadians}
405
- ellipsizedName={
406
- containsLocations ? ellipsizedNameLocation : ellipsizedName
407
- }
408
- locationNumber={i}
409
- angleAdjust={angleAdjust}
410
- color={annotationColor}
411
- isProtein={isProtein}
412
- containsLocations={containsLocations}
413
- radius={annotationRadius}
414
- annotationHeight={annotationHeight}
415
- {...annotationProps}
416
- {...(perAnnotationProps && perAnnotationProps(annotation))}
417
- />
418
- </g>
419
- );
420
- }
421
- return (
422
- <React.Fragment>
423
- {getInner({
424
- startAngle,
425
- endAngle,
426
- totalAngle,
427
- centerAngle,
428
- containsLocations: !!locationAngles
429
- })}
430
- {locationAngles && locationAngles.map(getInner)}
431
- </React.Fragment>
432
- );
433
- }
434
-
435
- const DrawAnnotation = withHover(DrawAnnotationInner);
436
-
437
- export const avoidOverlapWith = {
438
- "data-avoid": ".topLevelLabelGroup",
439
- "data-avoid-backup": ".veLabel.veAnnotationHovered"
440
- };
@@ -1,142 +0,0 @@
1
- import Path from "paths-js/path";
2
- function polarToSpecialCartesian(radius, angleInRadians) {
3
- //the 0 angle returns the 0,1 point on the unit circle instead of the 1,0 point like normal
4
- return {
5
- x: radius * Math.cos(angleInRadians - Math.PI / 2),
6
- y: radius * Math.sin(angleInRadians - Math.PI / 2)
7
- };
8
- }
9
- const stickOutThisMuch = 0.03;
10
-
11
- // draws a directed piece of the pie with an arrowhead, starts at 0 angle, only draws in one direction (use transforms to move it around the )
12
- export default function drawDirectedPiePiece({
13
- tailThickness = 0.6,
14
- // arrowheadLength = 1,
15
- radius,
16
- arrowheadType,
17
- overlapsSelf,
18
- annotationHeight,
19
- totalAngle,
20
- hasLabel,
21
- labelNeedsFlip,
22
- returnTextPath
23
- }) {
24
- const tailHeight = annotationHeight * tailThickness;
25
-
26
- const arrowheadOuterRadius = radius + annotationHeight / 2;
27
- const arrowheadInnerRadius = radius - annotationHeight / 2;
28
- const tailOuterRadius = radius + tailHeight / 2;
29
- const tailInnerRadius = radius - tailHeight / 2;
30
-
31
- // var arrowheadAngle = totalAngle / 2
32
- let arrowheadAngle = 80 / radius / (Math.PI * 2);
33
-
34
- if (totalAngle < arrowheadAngle) {
35
- //set arrowhead length to the angle in radians length
36
- arrowheadAngle = totalAngle;
37
- }
38
-
39
- if (arrowheadType === "NONE") arrowheadAngle = 0;
40
- const arcAngle = totalAngle - arrowheadAngle;
41
-
42
- //the main points we need to draw the arrow and in the order we draw them in:
43
- const arrowheadPoint = polarToSpecialCartesian(radius, 0);
44
-
45
- const arrowheadBottom = polarToSpecialCartesian(
46
- arrowheadInnerRadius,
47
- arrowheadAngle
48
- );
49
- const arcLeftBottom = polarToSpecialCartesian(
50
- tailInnerRadius,
51
- arrowheadAngle
52
- );
53
- const arcRightBottom = polarToSpecialCartesian(tailInnerRadius, totalAngle);
54
- const arcRightTop = polarToSpecialCartesian(tailOuterRadius, totalAngle);
55
- const arcRightMiddle = polarToSpecialCartesian(radius, totalAngle);
56
- const arcRightMiddleOuter = polarToSpecialCartesian(
57
- radius,
58
- totalAngle + stickOutThisMuch
59
- );
60
- const arcLeftTop = polarToSpecialCartesian(tailOuterRadius, arrowheadAngle);
61
- const arrowheadTop = polarToSpecialCartesian(
62
- arrowheadOuterRadius,
63
- arrowheadAngle
64
- );
65
-
66
- const largeArcFlag = arcAngle > Math.PI ? 1 : 0;
67
- let path = Path().moveto(arrowheadPoint.x, arrowheadPoint.y);
68
-
69
- if (overlapsSelf) {
70
- const arrowheadPointInner = polarToSpecialCartesian(
71
- radius,
72
- -stickOutThisMuch
73
- );
74
- path = path
75
- .lineto(arrowheadPointInner.x, arrowheadPointInner.y)
76
- .lineto(arrowheadPoint.x, arrowheadPoint.y);
77
- }
78
-
79
- path = path
80
- .lineto(arrowheadBottom.x, arrowheadBottom.y)
81
- .lineto(arcLeftBottom.x, arcLeftBottom.y)
82
- .arc({
83
- rx: tailInnerRadius,
84
- ry: tailInnerRadius,
85
- xrot: 0,
86
- largeArcFlag,
87
- sweepFlag: 1,
88
- x: arcRightBottom.x,
89
- y: arcRightBottom.y
90
- });
91
-
92
- if (overlapsSelf) {
93
- path = path
94
- .lineto(arcRightMiddle.x, arcRightMiddle.y)
95
- .lineto(arcRightMiddleOuter.x, arcRightMiddleOuter.y)
96
- .lineto(arcRightMiddle.x, arcRightMiddle.y);
97
- }
98
- let textPath;
99
- if (returnTextPath && hasLabel) {
100
- if (labelNeedsFlip) {
101
- const arcLeftTop = polarToSpecialCartesian(tailOuterRadius, 0);
102
- textPath = Path().moveto(arcRightTop.x, arcRightTop.y).arc({
103
- rx: tailOuterRadius,
104
- ry: tailOuterRadius,
105
- xrot: 0,
106
- largeArcFlag,
107
- sweepFlag: 0,
108
- x: arcLeftTop.x,
109
- y: arcLeftTop.y
110
- });
111
- } else {
112
- const arcLeftBottom = polarToSpecialCartesian(tailInnerRadius, 0);
113
- textPath = Path().moveto(arcLeftBottom.x, arcLeftBottom.y).arc({
114
- rx: tailInnerRadius,
115
- ry: tailInnerRadius,
116
- xrot: 0,
117
- largeArcFlag,
118
- sweepFlag: 1,
119
- x: arcRightBottom.x,
120
- y: arcRightBottom.y
121
- });
122
- }
123
- }
124
- path = path
125
-
126
- .lineto(arcRightTop.x, arcRightTop.y)
127
- .arc({
128
- rx: tailOuterRadius,
129
- ry: tailOuterRadius,
130
- xrot: 0,
131
- largeArcFlag,
132
- sweepFlag: 0,
133
- x: arcLeftTop.x,
134
- y: arcLeftTop.y
135
- })
136
- .lineto(arrowheadTop.x, arrowheadTop.y)
137
- .closepath();
138
- if (returnTextPath) {
139
- return [path, textPath];
140
- }
141
- return path;
142
- }
package/editTool.js DELETED
@@ -1,49 +0,0 @@
1
- import React, { useState } from "react";
2
- import { Icon } from "@blueprintjs/core";
3
- import ToolbarItem from "./ToolbarItem";
4
- import { connectToEditor } from "../withEditorProps";
5
-
6
- export default connectToEditor(editorState => {
7
- return {
8
- readOnly: editorState.readOnly
9
- };
10
- })(props => {
11
- const { toolbarItemProps, readOnly, disableSetReadOnly } = props;
12
- const [isLoading, setIsLoading] = useState(false);
13
- const readOnlyTooltip = ({ readOnly, disableSetReadOnly }) => {
14
- if (isLoading) {
15
- return "Loading...";
16
- } else if (disableSetReadOnly) {
17
- return "You do not have permission to edit locks on this sequence";
18
- }
19
- return readOnly ? "Click to enable editing" : "Click to disable editing";
20
- };
21
- return (
22
- <ToolbarItem
23
- {...{
24
- disabled: isLoading || disableSetReadOnly,
25
- Icon: <Icon icon={readOnly ? "lock" : "unlock"} />,
26
- onIconClick: () =>
27
- handleReadOnlyChange(!readOnly, { ...props, setIsLoading }),
28
- tooltip: readOnlyTooltip({ readOnly, disableSetReadOnly }),
29
- ...toolbarItemProps
30
- }}
31
- />
32
- );
33
- });
34
-
35
- export async function handleReadOnlyChange(
36
- newVal,
37
- // eslint-disable-next-line @typescript-eslint/no-empty-function
38
- { beforeReadOnlyChange, updateReadOnlyMode, setIsLoading = () => {} }
39
- ) {
40
- if (beforeReadOnlyChange) {
41
- setIsLoading(true);
42
- const shouldChange = await beforeReadOnlyChange(newVal);
43
- setIsLoading(false);
44
- if (shouldChange === false) {
45
- return;
46
- }
47
- }
48
- updateReadOnlyMode(newVal);
49
- }
package/editorSelector.js DELETED
@@ -1,2 +0,0 @@
1
- const sequenceDataSelector = state => state.sequenceData;
2
- export default sequenceDataSelector;