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