@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,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;