@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,120 +0,0 @@
1
- // let {getCutsitesFromSequence} = require('@teselagen/sequence-utils');
2
- // let {assign} = require('lodash');
3
-
4
- // module.exports = function createFragmentsLines({input: {geneRuler, enzymes}, state, output}) {
5
- // if (geneRuler === "geneRuler1kb") {
6
- // geneRuler = [20000, 10000, 7000, 5000, 4000, 3000, 2000, 1500, 1000, 700, 500, 400, 300, 200, 75];
7
- // } else {
8
- // geneRuler = [3000, 2000, 1500, 1200, 1000, 900, 800, 700, 600, 500, 400, 300, 200, 100];
9
- // }
10
-
11
- // let cutsites = state.get('digestCutsites');
12
- // if (cutsites.length === 0) {
13
- // state.set('fragmentsNum', 0);
14
- // state.set('fragments', []);
15
- // return;
16
- // }
17
-
18
- // let sequenceLength = state.get(['sequenceData', 'sequence']).length;
19
- // let circular = state.get(['sequenceData', 'circular']);
20
-
21
- // function sortNumber(a,b) {
22
- // if (a.position) {
23
- // return a.position - b.position;
24
- // }
25
- // if (a.segmentLength) {
26
- // return a.segmentLength - b.segmentLength;
27
- // }
28
- // }
29
-
30
- // let cutsitesData = [];
31
- // let position;
32
- // let cutsite;
33
- // for (let i = 0; i < cutsites.length; i++) {
34
- // cutsite = Object.assign({}, cutsites[i]);
35
- // position = Math.floor((cutsite.end + cutsite.start)/2);
36
- // cutsite.position = position;
37
- // cutsitesData.push(cutsite);
38
- // }
39
-
40
- // // circular or linear
41
- // cutsitesData = cutsitesData.sort(sortNumber);
42
- // if (circular) {
43
- // var lines = [ // if circular, fragment wraps around origin
44
- // {
45
- // segmentLength: sequenceLength - cutsitesData[cutsitesData.length-1].start + cutsitesData[0].end,
46
- // enzyme1: cutsitesData[cutsitesData.length-1].start + '('+cutsitesData[cutsitesData.length-1].name+')',
47
- // enzyme2: cutsitesData[0].end + '('+cutsitesData[0].name+')'
48
- // }
49
- // ];
50
- // } else {
51
- // var lines = [ // if not ciruclar, need to split into two seperate fragments
52
- // {
53
- // segmentLength: sequenceLength - cutsitesData[cutsitesData.length-1].start,
54
- // enzyme1: cutsitesData[cutsitesData.length-1].start + '('+cutsitesData[cutsitesData.length-1].name+')',
55
- // enzyme2: sequenceLength
56
- // },
57
- // {
58
- // segmentLength: cutsitesData[0].end,
59
- // enzyme1: 0,
60
- // enzyme2: cutsitesData[0].end + '('+cutsitesData[0].name+')'
61
- // }
62
- // ];
63
- // }
64
-
65
- // // get fragments
66
- // for (let i=0; i<cutsitesData.length-1; i++) {
67
- // lines.push({
68
- // segmentLength: Math.abs(cutsitesData[i+1].end - cutsitesData[i].start),
69
- // enzyme1: cutsitesData[i].start + ' ('+cutsitesData[i].name+')',
70
- // enzyme2: cutsitesData[i+1].end + ' ('+cutsitesData[i+1].name+')'
71
- // });
72
- // }
73
-
74
- // lines = lines.sort(sortNumber).reverse();
75
-
76
- // let fragmentsNum = 0; // counter for number of fragments
77
- // let lineWidth = 1;
78
- // let boxHeight = 275;
79
- // let upperBoundary = lines[0].segmentLength > geneRuler[0] ? lines[0].segmentLength : geneRuler[0];
80
- // let fragments = [];
81
-
82
- // // position fragments on the ladder
83
- // for (let iLeft = 0, iRight = 0; ; ) {
84
- // if (iLeft == geneRuler.length && iRight === lines.length) {
85
- // break;
86
-
87
- // } else if (iRight == lines.length || geneRuler[iLeft] >= lines[iRight].segmentLength) {
88
- // fragments.push({
89
- // align: "left",
90
- // bottom: (boxHeight * Math.log(geneRuler[iLeft]) / Math.log(upperBoundary)) - 25,
91
- // left: 15,
92
- // width: '25%',
93
- // borderWidth: 1,
94
- // position: geneRuler[iLeft],
95
- // tooltip: geneRuler[iLeft]
96
- // });
97
- // iLeft++;
98
-
99
- // } else if (iLeft == geneRuler.length || geneRuler[iLeft] < lines[iRight].segmentLength) {
100
- // fragments.push({
101
- // align: "right",
102
- // bottom: (boxHeight * Math.log(lines[iRight].segmentLength) / Math.log(upperBoundary)) - 25,
103
- // left: 75,
104
- // width: '75%',
105
- // borderWidth: lineWidth,
106
- // position: lines[iRight].segmentLength,
107
- // tooltip: lines[iRight].segmentLength + ' : ' + lines[iRight].enzyme1 + ' .. ' + lines[iRight].enzyme2
108
- // });
109
- // fragmentsNum++;
110
- // iRight++;
111
-
112
- // } else {
113
- // console.warn("error getting digest fragments");
114
- // break;
115
- // }
116
- // }
117
-
118
- // state.set('fragmentsNum', fragmentsNum);
119
- // state.set('fragments', fragments);
120
- // };
@@ -1,30 +0,0 @@
1
- import { createReducer } from "redux-act";
2
- //simple wrapper function around createReducer to keep around the default state if type === VECTOR_EDITOR_UPDATE or meta.mergeStateDeep=true
3
- // example:
4
- // defaultState = {features: true, parts: true}
5
- // newState = {features: false}
6
- // stateToUse = {features: false, parts: true}
7
- // instead of
8
- // stateToUse = {features: false}
9
- // these will also be handled differently in the reducer. The __shouldUseMergedState
10
- // attribute will make them not clear unless full overwritten
11
- export default function createMergedDefaultStateReducer(
12
- handlers,
13
- defaultState
14
- ) {
15
- const reducer = createReducer(handlers);
16
- function enhancedReducer(newState = {}, action) {
17
- const stateToUse =
18
- action &&
19
- (action.type === "VECTOR_EDITOR_UPDATE" ||
20
- (action.meta && action.meta.mergeStateDeep))
21
- ? {
22
- ...defaultState,
23
- ...newState
24
- }
25
- : newState;
26
- return reducer(stateToUse, action);
27
- }
28
- enhancedReducer.__shouldUseMergedState = true;
29
- return enhancedReducer;
30
- }
@@ -1,12 +0,0 @@
1
- import { createAction } from "redux-act";
2
-
3
- //this makes it so we can call our actionCreator like:
4
- //addFeature(myFeatureData, {editorName})
5
- export default function createMetaAction(actionName, payloadHelper) {
6
- return createAction(actionName, payloadHelper, function (unused, meta) {
7
- return {
8
- ...meta,
9
- editorName: meta.editorName
10
- };
11
- });
12
- }
@@ -1,290 +0,0 @@
1
- import { render, unmountComponentAtNode, findDOMNode } from "react-dom";
2
-
3
- import { getRangeLength } from "@teselagen/range-utils";
4
- // import Tether from "tether";
5
- import Popper from "popper.js";
6
-
7
- import {
8
- getInsertBetweenVals,
9
- convertDnaCaretPositionOrRangeToAA,
10
- filterSequenceString
11
- } from "@teselagen/sequence-utils";
12
- import React from "react";
13
- import { divideBy3 } from "../utils/proteinUtils";
14
- import "./createSequenceInputPopupStyle.css";
15
- import { Classes } from "@blueprintjs/core";
16
- import { getNodeToRefocus } from "../utils/editorUtils";
17
- import { noop } from "lodash-es";
18
-
19
- let div;
20
-
21
- class SequenceInputNoHotkeys extends React.Component {
22
- state = {
23
- charsToInsert: "",
24
- hasTempError: false
25
- };
26
- componentDidMount() {
27
- document.addEventListener(
28
- "mousedown",
29
- this.handleUnmountIfClickOustidePopup
30
- );
31
- }
32
-
33
- componentWillUnmount() {
34
- document.removeEventListener(
35
- "mousedown",
36
- this.handleUnmountIfClickOustidePopup
37
- );
38
- }
39
- handleUnmountIfClickOustidePopup = e => {
40
- const n = findDOMNode(this);
41
- if (!n) return;
42
- const node = n.parentNode;
43
- if (!node) return;
44
- if (node.contains(e.target)) {
45
- return;
46
- }
47
- this.handleUnmount();
48
- };
49
- handleUnmount = () => {
50
- setTimeout(() => {
51
- const n = findDOMNode(this);
52
- if (!n) return;
53
- const node = n.parentNode;
54
- if (!node) return;
55
- unmountComponentAtNode(node);
56
- this.props.nodeToReFocus && this.props.nodeToReFocus.focus();
57
- document.getElementById("sequenceInputBubble").outerHTML = "";
58
- });
59
- };
60
- handleInsert() {
61
- const { handleInsert = noop, isProtein } = this.props;
62
- const { charsToInsert } = this.state;
63
- if (!charsToInsert.length) {
64
- return;
65
- }
66
- const seqToInsert = isProtein
67
- ? {
68
- proteinSequence: charsToInsert
69
- }
70
- : {
71
- sequence: charsToInsert
72
- };
73
- handleInsert(seqToInsert);
74
- }
75
- render() {
76
- const {
77
- isReplace,
78
- selectionLayer,
79
- sequenceLength,
80
- isProtein,
81
- caretPosition,
82
- sequenceData,
83
- maxInsertSize
84
- } = this.props;
85
- const { charsToInsert, hasTempError } = this.state;
86
-
87
- let message;
88
- if (isReplace) {
89
- const betweenVals = getInsertBetweenVals(
90
- -1,
91
- selectionLayer,
92
- sequenceLength
93
- );
94
-
95
- message = (
96
- <span>
97
- Press <span style={{ fontWeight: "bolder" }}>ENTER</span> to replace{" "}
98
- {divideBy3(getRangeLength(selectionLayer, sequenceLength), isProtein)}{" "}
99
- {isProtein ? "AAs" : "base pairs"} between{" "}
100
- {isProtein
101
- ? convertDnaCaretPositionOrRangeToAA(betweenVals[0])
102
- : betweenVals[0]}{" "}
103
- and{" "}
104
- {isProtein
105
- ? convertDnaCaretPositionOrRangeToAA(betweenVals[1] + 2)
106
- : betweenVals[1]}
107
- </span>
108
- );
109
- } else {
110
- message = (
111
- <span>
112
- Press <span style={{ fontWeight: "bolder" }}>ENTER</span> to insert{" "}
113
- {charsToInsert.length} {isProtein ? "AAs" : "base pairs"} after{" "}
114
- {isProtein ? "AA" : "base"}{" "}
115
- {isProtein
116
- ? convertDnaCaretPositionOrRangeToAA(caretPosition)
117
- : caretPosition}
118
- </span>
119
- );
120
- }
121
- return (
122
- <div className="sequenceInputBubble">
123
- <input
124
- autoCorrect="off"
125
- onKeyDown={e => {
126
- if (e.keyCode === 27) {
127
- this.handleUnmount();
128
- }
129
- if (e.keyCode === 13) {
130
- this.handleInsert();
131
- this.handleUnmount();
132
- }
133
- }}
134
- className={Classes.INPUT}
135
- value={charsToInsert}
136
- autoFocus
137
- style={hasTempError ? { borderColor: "red" } : {}}
138
- onChange={e => {
139
- const [sanitizedVal, warnings] = filterSequenceString(
140
- e.target.value,
141
- {
142
- ...sequenceData,
143
- name: undefined
144
- }
145
- );
146
- if (warnings.length) {
147
- this.setState({
148
- hasTempError: true
149
- });
150
- setTimeout(() => {
151
- this.setState({
152
- hasTempError: false
153
- });
154
- }, 200);
155
- }
156
- if (maxInsertSize && sanitizedVal.lenth > maxInsertSize) {
157
- return window.toastr.error(
158
- "Sorry, your insert is greater than ",
159
- maxInsertSize
160
- );
161
- }
162
- e.target.value = sanitizedVal;
163
- this.setState({ charsToInsert: sanitizedVal });
164
- }}
165
- />
166
- <div style={{ marginTop: 10 }}>{message}</div>
167
- <div style={{ marginTop: 10 }}>
168
- Press <span style={{ fontWeight: "bolder" }}>ESC</span> to{" "}
169
- <button className="link-button" onClick={this.handleUnmount}>
170
- cancel
171
- </button>
172
- </div>
173
- </div>
174
- );
175
- }
176
- }
177
-
178
- export default function createSequenceInputPopup(props) {
179
- const { useEventPositioning } = props;
180
-
181
- let caretEl;
182
- if (useEventPositioning) {
183
- //we have to make a fake event here so that popper.js will position on the page correctly
184
- const { e, nodeToReFocus } = useEventPositioning;
185
- // e.persist();
186
- const top = e.clientY;
187
- const right = e.clientX;
188
- const bottom = e.clientY;
189
- const left = e.clientX;
190
- caretEl = {
191
- nodeToRefocus: nodeToReFocus,
192
- getBoundingClientRect: () => ({
193
- top,
194
- right,
195
- bottom,
196
- left
197
- }),
198
- clientWidth: 0,
199
- clientHeight: 0
200
- };
201
- }
202
-
203
- if (!caretEl || !caretEl === 0 || !isElementInViewport(caretEl)) {
204
- const activeEl = getActiveElement();
205
- if (activeEl) {
206
- caretEl = activeEl.querySelector(".veCaret");
207
- }
208
- }
209
- if (!caretEl || !caretEl === 0 || !isElementInViewport(caretEl)) {
210
- caretEl = getActiveElement();
211
- }
212
- if (!caretEl || !caretEl === 0 || !isElementInViewport(caretEl)) {
213
- caretEl = document.querySelector(".veCaret");
214
- }
215
- if (document.body.classList.contains("sequenceDragging")) {
216
- window.toastr.warning("Can't insert new sequence while dragging");
217
- //don't allow this
218
- return;
219
- }
220
-
221
- // function closeInput() {
222
- // sequenceInputBubble.remove();
223
- // }
224
- div = document.createElement("div");
225
- div.style.zIndex = "400000";
226
- div.id = "sequenceInputBubble";
227
- document.body.appendChild(div);
228
-
229
- const innerEl = (
230
- <SequenceInputNoHotkeys
231
- nodeToReFocus={caretEl.nodeToRefocus || getNodeToRefocus(caretEl)}
232
- {...props}
233
- />
234
- );
235
-
236
- render(innerEl, div);
237
-
238
- if (!caretEl) {
239
- return console.error(
240
- "there must be a caret element present in order to display the insertSequence popup"
241
- );
242
- }
243
-
244
- new Popper(caretEl, div, {
245
- placement: "bottom",
246
- modifiers: {
247
- offset: { offset: "94" }
248
- }
249
- });
250
- }
251
-
252
- const getActiveElement = function (document) {
253
- document = document || window.document;
254
-
255
- // Check if the active element is in the main web or iframe
256
- if (
257
- document.body === document.activeElement ||
258
- /* eslint-disable eqeqeq*/
259
-
260
- document.activeElement.tagName == "IFRAME"
261
- /* eslint-enable eqeqeq*/
262
- ) {
263
- // Get iframes
264
- const iframes = document.getElementsByTagName("iframe");
265
- for (let i = 0; i < iframes.length; i++) {
266
- // Recall
267
- const focused = getActiveElement(iframes[i].contentWindow.document);
268
- if (focused !== false) {
269
- return focused; // The focused
270
- }
271
- }
272
- } else return document.activeElement;
273
-
274
- return false;
275
- };
276
-
277
- function isElementInViewport(el) {
278
- const rect = el.getBoundingClientRect();
279
-
280
- return (
281
- rect.top >= 0 &&
282
- rect.left >= 0 &&
283
- rect.bottom <=
284
- (window.innerHeight ||
285
- document.documentElement.clientHeight) /*or $(window).height() */ &&
286
- rect.right <=
287
- (window.innerWidth ||
288
- document.documentElement.clientWidth) /*or $(window).width() */
289
- );
290
- }
@@ -1,87 +0,0 @@
1
- .insertReplaceButton {
2
- width: 140px;
3
- }
4
-
5
- .insertInputBubble {
6
- height: 140px !important;
7
- }
8
-
9
- .borderRed {
10
- box-shadow: 0 0 5px red !important;
11
- outline: none;
12
- border: 1px solid red !important;
13
- }
14
-
15
- .sequenceInputBubble {
16
- position: relative;
17
- width: 230px;
18
- padding: 8px;
19
- font-size: 14px;
20
- background: #e9e9e9;
21
- -webkit-border-radius: 5px;
22
- -moz-border-radius: 5px;
23
- border-radius: 5px;
24
- box-shadow: 0px 5px 15px 3px rgba(0, 0, 0, 0.3);
25
- }
26
-
27
- .sequenceInputBubble.tether-out-of-bounds-right {
28
- position: relative;
29
- padding: 8px;
30
- background: #e9e9e9;
31
- margin-left: -165px;
32
- -webkit-border-radius: 5px;
33
- -moz-border-radius: 5px;
34
- border-radius: 5px;
35
- box-shadow: 0px 5px 15px 3px rgba(0, 0, 0, 0.3);
36
- }
37
-
38
- .sequenceInputBubble.tether-element-attached-bottom {
39
- margin-top: -28px;
40
- }
41
-
42
- .sequenceInputBubble:after {
43
- content: "";
44
- position: absolute;
45
- border-style: solid;
46
- border-color: #e9e9e9 transparent;
47
- display: block;
48
- width: 0;
49
- left: 9px;
50
- border-width: 0 13px 12px;
51
- top: -12px;
52
- }
53
-
54
- .sequenceInputBubble.tether-element-attached-bottom:after {
55
- border-width: 12px 13px 0;
56
- top: 100%;
57
- }
58
-
59
- .sequenceInputBubble.tether-out-of-bounds-right:after {
60
- left: 76%;
61
- }
62
-
63
- .sequenceInputBubble.tether-out-of-bounds-top,
64
- .sequenceInputBubble.tether-out-of-bounds-bottom {
65
- display: none;
66
- }
67
-
68
- .sequenceInputBubble input {
69
- box-sizing: border-box;
70
- width: 100%;
71
- padding: 8px;
72
- border: solid 1px #dcdcdc;
73
- transition:
74
- box-shadow 0.3s,
75
- border 0.3s;
76
- }
77
-
78
- .sequenceInputBubble input:focus,
79
- .sequenceInputBubble input.focus {
80
- border: solid 1px #1585c5;
81
- }
82
- .bp3-dark .sequenceInputBubble {
83
- background: #394b59;
84
- }
85
- .bp3-dark .sequenceInputBubble:after {
86
- border-color: #394b59 transparent;
87
- }
@@ -1,89 +0,0 @@
1
- import React from "react";
2
-
3
- import { reduxForm } from "redux-form";
4
- import { startCase } from "lodash-es";
5
- import { withProps } from "recompose";
6
- import { InputField, wrapDialog } from "@teselagen/ui";
7
- import { compose } from "redux";
8
- import { Button, Intent, Classes } from "@blueprintjs/core";
9
- import classNames from "classnames";
10
- import "./simpleDialog.css";
11
- import { tryToRefocusEditor } from "../utils/editorUtils";
12
-
13
- // TODO: move to TRC
14
- class SimpleGenericDialogForm extends React.Component {
15
- render() {
16
- const {
17
- hideModal,
18
- handleSubmit,
19
- fields,
20
- buttonText = "OK",
21
- showCancel = true,
22
- onSubmit,
23
- invalid,
24
- extraProps = {}
25
- } = this.props;
26
- return (
27
- <form
28
- onSubmit={handleSubmit(data => {
29
- if (onSubmit) onSubmit(data);
30
- hideModal();
31
- tryToRefocusEditor();
32
- })}
33
- className={classNames(
34
- Classes.DIALOG_BODY,
35
- "tg-min-width-dialog simple-dialog"
36
- )}
37
- >
38
- {fields.map((field, i) => {
39
- const { component, isRequired, ...props } = field;
40
- const FieldComp = component || InputField;
41
- const fieldProps = {
42
- autoFocus: i === 0,
43
- ...props,
44
- ...extraProps[props.name]
45
- };
46
- fieldProps.label =
47
- fieldProps.label || startCase(fieldProps.name) + ":";
48
- if (isRequired) fieldProps.validate = required;
49
- return <FieldComp key={field.name} {...fieldProps} />;
50
- })}
51
- <div className="dialog-buttons">
52
- {showCancel && (
53
- <Button
54
- onClick={() => {
55
- hideModal();
56
- tryToRefocusEditor();
57
- }}
58
- text="Cancel"
59
- />
60
- )}
61
- <Button
62
- type="submit"
63
- intent={Intent.PRIMARY}
64
- text={buttonText}
65
- disabled={invalid}
66
- />
67
- </div>
68
- </form>
69
- );
70
- }
71
- }
72
-
73
- function required(val) {
74
- if (!val) return "Required";
75
- }
76
-
77
- export default function createSimpleDialog(props) {
78
- return compose(
79
- wrapDialog({
80
- isDraggable: true,
81
- width: 400,
82
- ...props.withDialogProps
83
- }),
84
- reduxForm({
85
- form: props.formName
86
- }),
87
- withProps(props)
88
- )(SimpleGenericDialogForm);
89
- }
@@ -1,39 +0,0 @@
1
- //./selectionLayer.js
2
- import { createReducer, createAction } from "redux-act";
3
- // ------------------------------------
4
- // Actions
5
- // ------------------------------------
6
- export const createYourOwnEnzymeUpdate = createAction(
7
- "CREATE_YOUR_OWN_ENZYME_UPDATE"
8
- );
9
- export const createYourOwnEnzymeReset = createAction(
10
- "CREATE_YOUR_OWN_ENZYME_RESET"
11
- );
12
- export const createYourOwnEnzymeClose = createAction(
13
- "CREATE_YOUR_OWN_ENZYME_CLOSE"
14
- );
15
-
16
- // ------------------------------------
17
- // Reducer
18
- // ------------------------------------
19
- const initialValues = {
20
- name: "Example Enzyme",
21
- sequence: "ggatcc",
22
- chop_top_index: 1,
23
- chop_bottom_index: 5,
24
- isOpen: false
25
- };
26
- export default createReducer(
27
- {
28
- [createYourOwnEnzymeClose]: () => {
29
- return { ...initialValues, isOpen: false };
30
- },
31
- [createYourOwnEnzymeReset]: (state, payload = {}) => {
32
- return { ...initialValues, ...payload };
33
- },
34
- [createYourOwnEnzymeUpdate]: (state, payload) => {
35
- return payload;
36
- }
37
- },
38
- initialValues
39
- );
@@ -1,6 +0,0 @@
1
- import { createSelector } from "reselect";
2
- import sequenceDataSelector from "./sequenceDataSelector";
3
-
4
- export default createSelector(sequenceDataSelector, function (sequenceData) {
5
- return sequenceData.cutsiteLabelColors;
6
- });