@teselagen/ove 0.7.27 → 0.7.28
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.
- package/AASliver.js +187 -0
- package/AddLaddersDialog.js +82 -0
- package/AdditionalCutsiteInfoDialog.js +599 -0
- package/AlignmentView/Mismatches.d.ts +3 -3
- package/AlignmentVisibilityTool.js +105 -0
- package/AnnotationContainerHolder.js +20 -0
- package/AnnotationPositioner.js +27 -0
- package/AutoAnnotate.js +501 -0
- package/AutoAnnotateBpMatchingDialog.js +208 -0
- package/Axis.js +151 -0
- package/AxisNumbers.js +35 -0
- package/Browser.js +106 -0
- package/Caret.js +63 -0
- package/Chromatogram.js +293 -0
- package/CircularDnaSequence.js +73 -0
- package/CircularView/Labels/index.d.ts +1 -1
- package/CircularView/index.d.ts +0 -1
- package/CircularZoomMinimap.js +16 -0
- package/ColorPicker.js +30 -0
- package/CommandHotkeyHandler.js +44 -0
- package/CreateAnnotationsPage.d.ts +4 -4
- package/CreateAnnotationsPage.js +98 -0
- package/Cutsite.js +18 -0
- package/CutsiteProperties.js +176 -0
- package/CutsiteSelectionLayers.js +47 -0
- package/Cutsites.js +271 -0
- package/DeletionLayer.js +28 -0
- package/DigestTool/Ladder.d.ts +1 -1
- package/DropHandler.css +21 -0
- package/DropHandler.js +64 -0
- package/EditCaretPosition.js +234 -0
- package/EditTrackNameDialog.js +30 -0
- package/Feature.js +83 -0
- package/FeatureProperties.js +6 -0
- package/FillWindow.js +47 -0
- package/GenbankView.js +74 -0
- package/GeneralProperties.js +117 -0
- package/GenericAnnotationProperties.js +406 -0
- package/GlobalDialog.js +73 -0
- package/GlobalDialogUtils.js +110 -0
- package/GoToDialog.js +25 -0
- package/HorizontalPanelDragHandle.js +35 -0
- package/Keyboard.js +85 -0
- package/Labels.js +327 -0
- package/Ladder.css +20 -0
- package/Ladder.js +303 -0
- package/MeltingTemp.js +85 -0
- package/Menlo.ttf +0 -0
- package/Minimap.js +515 -0
- package/Mismatches.js +134 -0
- package/Monaco.ttf +0 -0
- package/MultipleSeqsDetectedOnImportDialog.js +74 -0
- package/Orf.js +109 -0
- package/OrfProperties.js +117 -0
- package/Orfs.js +35 -0
- package/PCRTool.js +179 -0
- package/PairwiseAlignmentView.js +68 -0
- package/Part.js +34 -0
- package/PartProperties.js +9 -0
- package/PassThrough.js +3 -0
- package/PerformantSelectionLayer.js +32 -0
- package/PinchHelper.js +24 -0
- package/PointedAnnotation.js +347 -0
- package/PositionAnnotationOnCircle.js +26 -0
- package/Primer.js +41 -0
- package/PrimerProperties.js +19 -0
- package/Reflex/index.d.ts +0 -1
- package/ReflexContainer.js +802 -0
- package/ReflexElement.js +160 -0
- package/ReflexEvents.js +77 -0
- package/ReflexSplitter.js +205 -0
- package/RenameSequenceDialog.js +7 -0
- package/RotateCircularViewSlider.js +93 -0
- package/RowView/index.d.ts +0 -1
- package/SelectDialog.js +150 -0
- package/SequenceName.js +15 -0
- package/SimpleCircularOrLinearView.js +381 -0
- package/SimpleOligoPreview.js +39 -0
- package/SingleEnzymeCutsiteInfo.js +139 -0
- package/ToolBar/ToolbarItem.d.ts +1 -3
- package/ToolbarItem.js +192 -0
- package/Translation.js +198 -0
- package/TranslationProperties.js +149 -0
- package/UncontrolledSliderWithPlusMinusBtns.css +5 -0
- package/UncontrolledSliderWithPlusMinusBtns.js +134 -0
- package/VeTopRightContainer.js +12 -0
- package/ZoomCircularViewSlider.js +62 -0
- package/ZoomLinearView.js +47 -0
- package/addAlignment.js +6 -0
- package/addMetaToActionCreators.js +12 -0
- package/addWrappedAddons.js +20 -0
- package/alignmentTool.js +503 -0
- package/alignments.js +379 -0
- package/annotationLabelVisibility.js +2 -0
- package/annotationSearchSelector.js +24 -0
- package/annotationTypes.js +35 -0
- package/annotationVisibility.js +196 -0
- package/annotationsToSupport.js +104 -0
- package/arrayToObjWithIds.js +17 -0
- package/arrayUtils.js +19 -0
- package/array_move.js +10 -0
- package/calculateTickMarkPositionsForGivenRange.js +47 -0
- package/caretPosition.js +27 -0
- package/cdsFeaturesSelector.js +9 -0
- package/charWidth.js +22 -0
- package/circular.js +19 -0
- package/circularSelector.js +4 -0
- package/clickAndDragUtils.js +576 -0
- package/coerceInitialValue.js +7 -0
- package/combineReducersDontIgnoreKeys.js +12 -0
- package/commandUtils.js +20 -0
- package/constants.js +2 -0
- package/copyOptions.js +34 -0
- package/createFragmentLines.js +120 -0
- package/createMergedDefaultStateReducer.js +30 -0
- package/createMetaAction.js +12 -0
- package/createSequenceInputPopup.js +290 -0
- package/createSequenceInputPopupStyle.css +87 -0
- package/createSimpleDialog.js +89 -0
- package/createYourOwnEnzyme.js +39 -0
- package/cutsiteLabelColorSelector.js +6 -0
- package/cutsiteTool.js +88 -0
- package/cutsitesByRangeSelector.js +5 -0
- package/cutsitesSelector.js +61 -0
- package/darkmode.css +98 -0
- package/defaultConfig.js +150 -0
- package/deletionLayers.js +36 -0
- package/description.js +21 -0
- package/digestTool.js +34 -0
- package/dnaToColor.js +17 -0
- package/downloadTool.js +39 -0
- package/draggableClassnames.js +5 -0
- package/drawAnnotations.js +440 -0
- package/drawDirectedPiePiece.js +142 -0
- package/editTool.js +49 -0
- package/editorSelector.js +2 -0
- package/editorUtils.js +205 -0
- package/estimateRowHeight.js +184 -0
- package/featureLengthsToHide.js +27 -0
- package/featureTool.js +34 -0
- package/features.js +19 -0
- package/featuresSelector.js +8 -0
- package/filteredCutsitesSelector.js +136 -0
- package/filteredFeaturesSelector.js +32 -0
- package/filteredPartsSelector.js +57 -0
- package/filteredPrimersSelector.js +27 -0
- package/filteredRestrictionEnzymesSelector.js +1 -0
- package/find.png +0 -0
- package/findTool.js +79 -0
- package/findToolConstants.js +1 -0
- package/frameTranslations.js +52 -0
- package/fullscreen.png +0 -0
- package/getAdditionalEnzymesSelector.js +46 -0
- package/getAngleForPositionMidpoint.js +3 -0
- package/getAnnotationClassnames.js +12 -0
- package/getAnnotationNameAndStartStopString.js +61 -0
- package/getBpsPerRow.js +19 -0
- package/getCutsiteLabelHeights.js +56 -0
- package/getGapMap.js +12 -0
- package/getGaps.js +27 -0
- package/getInternalLabel.js +40 -0
- package/getOveHotkeyDefs.js +12 -0
- package/getPairwiseOverviewLinearViewOptions.js +38 -0
- package/getRangeAnglesSpecial.js +12 -0
- package/getStructuredBases.js +97 -0
- package/getTrackFromEvent.js +25 -0
- package/getVisibleStartEnd.js +7 -0
- package/getXStartAndWidthFromNonCircularRange.js +12 -0
- package/getXStartAndWidthOfRangeWrtRow.js +27 -0
- package/getXStartAndWidthOfRowAnnotation.js +19 -0
- package/getYOffset.js +15 -0
- package/hoveredAnnotation.js +24 -0
- package/{html2canvas.esm--JN4fLQL.js → html2canvas.esm-DiGWN1gP.js} +187 -229
- package/{html2canvas.esm-B7d7VJmQ.cjs → html2canvas.esm-J1esNpMJ.cjs} +187 -229
- package/importTool.js +27 -0
- package/index.cjs.js +48165 -47142
- package/index.es.js +47699 -46676
- package/index.js +71 -0
- package/inlineFindTool.js +38 -0
- package/isElementInViewport.js +29 -0
- package/isEnzymeFilterAndSelector.js +1 -0
- package/isTargetWithinEl.js +6 -0
- package/labelLineIntensity.js +25 -0
- package/labelSize.js +23 -0
- package/ladderDefaults.js +25 -0
- package/lastSavedId.js +20 -0
- package/lineageLines.js +11 -0
- package/linear.png +0 -0
- package/makeStore.js +34 -0
- package/massageTickSpacing.js +19 -0
- package/materiallyAvailable.js +19 -0
- package/middleware.js +112 -0
- package/minimumOrfSize.js +24 -0
- package/minimumOrfSizeSelector.js +2 -0
- package/modalActions.js +3 -0
- package/moveCaret.js +58 -0
- package/name.js +19 -0
- package/normalizeAngle.js +3 -0
- package/normalizeAngleRange.js +9 -0
- package/oligoTool.js +30 -0
- package/onlyUpdateForKeysDeep.js +31 -0
- package/orfFrameToColorMap.js +10 -0
- package/orfTool.js +136 -0
- package/orfsSelector.js +15 -0
- package/ove.css +12107 -0
- package/package.json +6 -5
- package/panelsShown.js +294 -0
- package/partLengthsToHide.js +23 -0
- package/partOverhangs.js +6 -0
- package/partTagSearch.js +69 -0
- package/partTool.js +45 -0
- package/parts.js +19 -0
- package/partsSelector.js +8 -0
- package/pie.png +0 -0
- package/polarToSpecialCartesian.js +7 -0
- package/positionCutsites.js +6 -0
- package/prepareRowData.js +64 -0
- package/primerBases.js +221 -0
- package/primerLengthsToHide.js +27 -0
- package/primers.js +19 -0
- package/primersSelector.js +8 -0
- package/print.png +0 -0
- package/printTool.js +31 -0
- package/propertiesTool.js +40 -0
- package/proteinUtils.js +3 -0
- package/pureNoFunc.js +18 -0
- package/readOnly.js +25 -0
- package/redoTool.js +30 -0
- package/reflex-styles.css +128 -0
- package/reflex-styles.css.map +9 -0
- package/relaxLabelAngles.js +157 -0
- package/relaxLabels_DEPRECATED.js +105 -0
- package/replacementLayers.js +36 -0
- package/restrictionEnzymes.js +52 -0
- package/restrictionEnzymesSelector.js +34 -0
- package/rowviewContants.js +3 -0
- package/ruler.css +89 -0
- package/save.png +0 -0
- package/saveTool.js +44 -0
- package/searchLayersSelector.js +71 -0
- package/selectedAnnotations.js +89 -0
- package/selectedAnnotationsSelector.js +1 -0
- package/selectedCutsitesSelector.js +21 -0
- package/selectedPartTags.js +21 -0
- package/selectionLayer.js +25 -0
- package/selectors/annotationSearchSelector.d.ts +1 -1
- package/sequence.js +12 -0
- package/sequenceDataHistory.js +43 -0
- package/sequenceDataSelector.js +2 -0
- package/sequenceLengthSelector.js +5 -0
- package/sequenceSelector.js +4 -0
- package/sharedActionCreators.js +0 -0
- package/shouldFlipText.js +4 -0
- package/shouldRerender.js +27 -0
- package/showFileDialog.js +25 -0
- package/showGCContent.js +23 -0
- package/show_cut_sites.png +0 -0
- package/show_features.png +0 -0
- package/show_orfs.png +0 -0
- package/show_primers.png +0 -0
- package/simpleDialog.css +13 -0
- package/specialCutsiteFilterOptions.js +22 -0
- package/src/Editor/DropHandler.js +2 -1
- package/src/Editor/index.js +0 -2
- package/src/RowItem/StackedAnnotations/getStructuredBases.js +20 -6
- package/src/ToolBar/cutsiteTool.js +1 -1
- package/src/helperComponents/PropertiesDialog/TranslationProperties.js +2 -1
- package/style.css +3 -12100
- package/tagsToBoldSelector.js +2 -0
- package/toggle_views.svg +1 -0
- package/toolBar.js +23 -0
- package/translationSearchMatchesSelector.js +14 -0
- package/translations.js +20 -0
- package/translationsRawSelector.js +8 -0
- package/translationsSelector.js +137 -0
- package/typeField.js +24 -0
- package/undoTool.js +30 -0
- package/updateEditor.d.ts +1 -3
- package/updateEditor.js +200 -0
- package/updateLabelsForInViewFeatures.js +55 -0
- package/updateLabelsForInViewFeaturesCircView.js +41 -0
- package/updateTrackHelper.js +58 -0
- package/uppercaseSequenceMapFont.js +25 -0
- package/upsertDeleteActionGenerator.js +31 -0
- package/useAAColorType.js +8 -0
- package/useAdditionalOrfStartCodons.js +24 -0
- package/useAnnotationLimits.js +42 -0
- package/useChromatogramPrefs.js +31 -0
- package/useFormValue.js +7 -0
- package/useLadders.js +6 -0
- package/useMeltingTemp.js +7 -0
- package/useTmType.js +10 -0
- package/userDefinedHandlersAndOpts.js +61 -0
- package/utils/getAnnotationNameAndStartStopString.d.ts +1 -5
- package/utils/selectionLayer.d.ts +2 -2
- package/utils.js +37 -0
- package/versionHistory.js +26 -0
- package/versionHistoryTool.js +21 -0
- package/viewSubmenu.js +479 -0
- package/visibilityTool.js +39 -0
- package/withEditorInteractions/getBpsPerRow.d.ts +1 -3
- package/withHover.js +113 -0
- package/withRestrictionEnzymes.js +15 -0
- package/index.umd.js +0 -188322
package/toggle_views.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M17 17h-10v-10h10v10zm7 3l-5-3v-10l5-3v16zm-24-16l5 3v10l-5 3v-16z"/></svg>
|
package/toolBar.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import createAction from "./utils/createMetaAction";
|
|
2
|
+
import createMergedDefaultStateReducer from "./utils/createMergedDefaultStateReducer";
|
|
3
|
+
// ------------------------------------
|
|
4
|
+
// Actions
|
|
5
|
+
// ------------------------------------
|
|
6
|
+
export const openToolbarItemUpdate = createAction("openToolbarItemUpdate");
|
|
7
|
+
|
|
8
|
+
// ------------------------------------
|
|
9
|
+
// Reducer
|
|
10
|
+
// ------------------------------------
|
|
11
|
+
export default createMergedDefaultStateReducer(
|
|
12
|
+
{
|
|
13
|
+
[openToolbarItemUpdate]: (state, payload) => {
|
|
14
|
+
return {
|
|
15
|
+
...state,
|
|
16
|
+
openItem: payload
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
openItem: ""
|
|
22
|
+
}
|
|
23
|
+
);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createSelector } from "reselect";
|
|
2
|
+
import searchLayersSelector from "./searchLayersSelector";
|
|
3
|
+
|
|
4
|
+
export default createSelector(
|
|
5
|
+
searchLayersSelector,
|
|
6
|
+
state => state.findTool && state.findTool.dnaOrAA,
|
|
7
|
+
state => state.findTool && state.findTool.highlightAll,
|
|
8
|
+
state => state.findTool && state.findTool.matchNumber,
|
|
9
|
+
(searchLayers, dnaOrAA, highlightAll, matchNumber) => {
|
|
10
|
+
if (dnaOrAA === "DNA") return [];
|
|
11
|
+
if (!highlightAll) return [searchLayers[matchNumber]];
|
|
12
|
+
return searchLayers;
|
|
13
|
+
}
|
|
14
|
+
);
|
package/translations.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createReducer } from "redux-act";
|
|
2
|
+
import createAction from "../utils/createMetaAction";
|
|
3
|
+
import upsertDeleteActionGenerator from "./upsertDeleteActionGenerator";
|
|
4
|
+
|
|
5
|
+
// ------------------------------------
|
|
6
|
+
// Actions
|
|
7
|
+
// ------------------------------------
|
|
8
|
+
export const _upsertTranslation = createAction("UPSERT_TRANSLATION");
|
|
9
|
+
export const deleteTranslation = createAction("DELETE_TRANSLATION");
|
|
10
|
+
|
|
11
|
+
const defaultValue = {};
|
|
12
|
+
// ------------------------------------
|
|
13
|
+
// Reducer
|
|
14
|
+
// ------------------------------------
|
|
15
|
+
export default createReducer(
|
|
16
|
+
{
|
|
17
|
+
...upsertDeleteActionGenerator(_upsertTranslation, deleteTranslation)
|
|
18
|
+
},
|
|
19
|
+
defaultValue
|
|
20
|
+
);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createSelector } from "reselect";
|
|
2
|
+
import sequenceDataSelector from "./sequenceDataSelector";
|
|
3
|
+
|
|
4
|
+
function translationsRawSelector(sequenceData) {
|
|
5
|
+
return sequenceData.translations;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export default createSelector(sequenceDataSelector, translationsRawSelector);
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { reduce } from "lodash-es";
|
|
2
|
+
import uuid from "shortid";
|
|
3
|
+
import sequenceSelector from "./sequenceSelector";
|
|
4
|
+
import orfsSelector from "./orfsSelector";
|
|
5
|
+
import { createSelector } from "reselect";
|
|
6
|
+
|
|
7
|
+
import { getAminoAcidDataForEachBaseOfDna } from "@teselagen/sequence-utils";
|
|
8
|
+
import each from "lodash/each";
|
|
9
|
+
import translationsRawSelector from "./translationsRawSelector";
|
|
10
|
+
import translationSearchMatchesSelector from "./translationSearchMatchesSelector";
|
|
11
|
+
import { normalizePositionByRangeLength } from "@teselagen/range-utils";
|
|
12
|
+
import cdsFeaturesSelector from "./cdsFeaturesSelector";
|
|
13
|
+
import circularSelector from "./circularSelector";
|
|
14
|
+
|
|
15
|
+
function translationsSelector(
|
|
16
|
+
isCircular,
|
|
17
|
+
translationSearchMatches,
|
|
18
|
+
sequence,
|
|
19
|
+
orfs,
|
|
20
|
+
showOrfTranslations,
|
|
21
|
+
showOrfs,
|
|
22
|
+
cdsFeatures,
|
|
23
|
+
showCdsFeatureTranslations,
|
|
24
|
+
showFeatures,
|
|
25
|
+
translations,
|
|
26
|
+
frameTranslations
|
|
27
|
+
) {
|
|
28
|
+
const translationsToPass = {
|
|
29
|
+
...translationSearchMatches.reduce((acc, match) => {
|
|
30
|
+
if (!match) return acc;
|
|
31
|
+
const id = match.id || uuid();
|
|
32
|
+
acc[id] = {
|
|
33
|
+
...match,
|
|
34
|
+
id,
|
|
35
|
+
translationType: "AA Search Match",
|
|
36
|
+
isOrf: true, //pass isOrf = true here in order to not have it show up in the properties window
|
|
37
|
+
forward: !match.bottomStrand
|
|
38
|
+
};
|
|
39
|
+
return acc;
|
|
40
|
+
}, {}),
|
|
41
|
+
...reduce(
|
|
42
|
+
translations,
|
|
43
|
+
(acc, translation) => {
|
|
44
|
+
if (!translation.isOrf) {
|
|
45
|
+
acc[translation.id] = {
|
|
46
|
+
...translation,
|
|
47
|
+
translationType: "User Created"
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return acc;
|
|
51
|
+
},
|
|
52
|
+
{}
|
|
53
|
+
),
|
|
54
|
+
...(showOrfTranslations && showOrfs
|
|
55
|
+
? reduce(
|
|
56
|
+
orfs,
|
|
57
|
+
(acc, orf) => {
|
|
58
|
+
acc[orf.id] = { ...orf, translationType: "ORF" };
|
|
59
|
+
return acc;
|
|
60
|
+
},
|
|
61
|
+
{}
|
|
62
|
+
)
|
|
63
|
+
: {}),
|
|
64
|
+
...(showCdsFeatureTranslations &&
|
|
65
|
+
showFeatures &&
|
|
66
|
+
reduce(
|
|
67
|
+
cdsFeatures,
|
|
68
|
+
(acc, cdsFeature) => {
|
|
69
|
+
acc[cdsFeature.id] = {
|
|
70
|
+
...cdsFeature,
|
|
71
|
+
translationType: "CDS Feature"
|
|
72
|
+
};
|
|
73
|
+
return acc;
|
|
74
|
+
},
|
|
75
|
+
{}
|
|
76
|
+
)),
|
|
77
|
+
...reduce(
|
|
78
|
+
frameTranslations,
|
|
79
|
+
(acc, isActive, frameName) => {
|
|
80
|
+
const frameOffset = Number(frameName);
|
|
81
|
+
if (isActive) {
|
|
82
|
+
const id = uuid();
|
|
83
|
+
acc[id] = {
|
|
84
|
+
id,
|
|
85
|
+
start:
|
|
86
|
+
isCircular || frameOffset > 0
|
|
87
|
+
? normalizePositionByRangeLength(
|
|
88
|
+
0 + frameOffset + (frameOffset > 0 ? -1 : 1),
|
|
89
|
+
sequence.length
|
|
90
|
+
)
|
|
91
|
+
: 0,
|
|
92
|
+
end:
|
|
93
|
+
isCircular || frameOffset < 0
|
|
94
|
+
? normalizePositionByRangeLength(
|
|
95
|
+
sequence.length -
|
|
96
|
+
1 +
|
|
97
|
+
frameOffset +
|
|
98
|
+
(frameOffset > 0 ? -1 : 1),
|
|
99
|
+
sequence.length
|
|
100
|
+
)
|
|
101
|
+
: sequence.length - 1,
|
|
102
|
+
translationType: "Frame",
|
|
103
|
+
forward: frameOffset > 0,
|
|
104
|
+
isOrf: true //pass isOrf = true here in order to not have it show up in the properties window
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return acc;
|
|
108
|
+
},
|
|
109
|
+
{}
|
|
110
|
+
)
|
|
111
|
+
};
|
|
112
|
+
each(translationsToPass, function (translation) {
|
|
113
|
+
translation.aminoAcids = getAminoAcidDataForEachBaseOfDna(
|
|
114
|
+
sequence,
|
|
115
|
+
translation.forward,
|
|
116
|
+
translation
|
|
117
|
+
);
|
|
118
|
+
});
|
|
119
|
+
return translationsToPass;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export default createSelector(
|
|
123
|
+
circularSelector,
|
|
124
|
+
translationSearchMatchesSelector,
|
|
125
|
+
sequenceSelector,
|
|
126
|
+
orfsSelector,
|
|
127
|
+
state => state.annotationVisibility.orfTranslations,
|
|
128
|
+
state => state.annotationVisibility.orfs,
|
|
129
|
+
cdsFeaturesSelector,
|
|
130
|
+
state => state.annotationVisibility.cdsFeatureTranslations,
|
|
131
|
+
state => state.annotationVisibility.features,
|
|
132
|
+
translationsRawSelector,
|
|
133
|
+
state => state.frameTranslations,
|
|
134
|
+
state => state.sequenceData.isProtein,
|
|
135
|
+
state => state.sequenceData.proteinSequence,
|
|
136
|
+
translationsSelector
|
|
137
|
+
);
|
package/typeField.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { getFeatureToColorMap } from "@teselagen/sequence-utils";
|
|
3
|
+
|
|
4
|
+
export const typeField = {
|
|
5
|
+
path: "type",
|
|
6
|
+
type: "string",
|
|
7
|
+
render: (name, { color }) => {
|
|
8
|
+
const colorToUse =
|
|
9
|
+
color || getFeatureToColorMap({ includeHidden: true })[name];
|
|
10
|
+
return (
|
|
11
|
+
<div style={{ display: "flex", alignItems: "center" }}>
|
|
12
|
+
<div
|
|
13
|
+
style={{
|
|
14
|
+
height: 20,
|
|
15
|
+
width: 20,
|
|
16
|
+
background: colorToUse,
|
|
17
|
+
marginRight: 3
|
|
18
|
+
}}
|
|
19
|
+
/>
|
|
20
|
+
{name}
|
|
21
|
+
</div>
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
};
|
package/undoTool.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React 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
|
+
disabled: !(
|
|
9
|
+
editorState.sequenceDataHistory &&
|
|
10
|
+
editorState.sequenceDataHistory.past &&
|
|
11
|
+
editorState.sequenceDataHistory.past.length
|
|
12
|
+
)
|
|
13
|
+
};
|
|
14
|
+
})(({ toolbarItemProps, undo, disabled }) => {
|
|
15
|
+
return (
|
|
16
|
+
<ToolbarItem
|
|
17
|
+
{...{
|
|
18
|
+
Icon: <Icon data-test="veUndoTool" icon="undo" />,
|
|
19
|
+
disabled,
|
|
20
|
+
onIconClick: undo,
|
|
21
|
+
tooltip: (
|
|
22
|
+
<span>
|
|
23
|
+
Undo <span style={{ fontSize: 10 }}>(Cmd/Ctrl+Z)</span>
|
|
24
|
+
</span>
|
|
25
|
+
),
|
|
26
|
+
...toolbarItemProps
|
|
27
|
+
}}
|
|
28
|
+
/>
|
|
29
|
+
);
|
|
30
|
+
});
|
package/updateEditor.d.ts
CHANGED
|
@@ -1,3 +1 @@
|
|
|
1
|
-
export default function updateEditor(store: any, editorName: any, initialValues?: {}, extraMeta?: {}, { convertAnnotationsFromAAIndices }?: {
|
|
2
|
-
convertAnnotationsFromAAIndices: any;
|
|
3
|
-
}): void;
|
|
1
|
+
export default function updateEditor(store: any, editorName: any, initialValues?: {}, extraMeta?: {}, { convertAnnotationsFromAAIndices }?: {}): void;
|
package/updateEditor.js
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { set } from "lodash-es";
|
|
2
|
+
import { tidyUpSequenceData } from "@teselagen/sequence-utils";
|
|
3
|
+
import { annotationTypes } from "@teselagen/sequence-utils";
|
|
4
|
+
|
|
5
|
+
export default function updateEditor(
|
|
6
|
+
store,
|
|
7
|
+
editorName,
|
|
8
|
+
initialValues = {},
|
|
9
|
+
extraMeta = {},
|
|
10
|
+
{ convertAnnotationsFromAAIndices } = {}
|
|
11
|
+
) {
|
|
12
|
+
const {
|
|
13
|
+
sequenceData,
|
|
14
|
+
annotationVisibility,
|
|
15
|
+
annotationsToSupport,
|
|
16
|
+
findTool,
|
|
17
|
+
justPassingPartialSeqData
|
|
18
|
+
} = initialValues;
|
|
19
|
+
const currentEditor = store.getState().VectorEditor[editorName] || {};
|
|
20
|
+
const isAlreadyProteinEditor =
|
|
21
|
+
currentEditor.sequenceData && currentEditor.sequenceData.isProtein;
|
|
22
|
+
const isAlreadyRnaEditor =
|
|
23
|
+
currentEditor.sequenceData && currentEditor.sequenceData.isRna;
|
|
24
|
+
const isAlreadyOligoEditor =
|
|
25
|
+
currentEditor.sequenceData && currentEditor.sequenceData.isOligo;
|
|
26
|
+
const reverseSequenceShouldBeUpdate =
|
|
27
|
+
currentEditor.sequenceData?.isSingleStrandedDNA !==
|
|
28
|
+
sequenceData?.isSingleStrandedDNA ||
|
|
29
|
+
currentEditor.sequenceData?.isDoubleStrandedRNA !==
|
|
30
|
+
sequenceData?.isDoubleStrandedRNA;
|
|
31
|
+
|
|
32
|
+
const isAlreadySpecialEditor =
|
|
33
|
+
isAlreadyProteinEditor ||
|
|
34
|
+
isAlreadyRnaEditor ||
|
|
35
|
+
isAlreadyOligoEditor ||
|
|
36
|
+
reverseSequenceShouldBeUpdate;
|
|
37
|
+
|
|
38
|
+
let toSpread = {};
|
|
39
|
+
let payload;
|
|
40
|
+
if (justPassingPartialSeqData) {
|
|
41
|
+
payload = {
|
|
42
|
+
sequenceData: tidyUpSequenceData(
|
|
43
|
+
{ ...currentEditor.sequenceData, ...sequenceData },
|
|
44
|
+
{
|
|
45
|
+
convertAnnotationsFromAAIndices,
|
|
46
|
+
//if we have sequence data coming in make sure to tidy it up for the user :)
|
|
47
|
+
annotationsAsObjects: true
|
|
48
|
+
}
|
|
49
|
+
)
|
|
50
|
+
};
|
|
51
|
+
} else {
|
|
52
|
+
if (sequenceData) {
|
|
53
|
+
const isDna =
|
|
54
|
+
!sequenceData.isOligo && !sequenceData.isRna && !sequenceData.isProtein;
|
|
55
|
+
if (sequenceData.isProtein && !isAlreadyProteinEditor) {
|
|
56
|
+
//we're editing a protein but haven't initialized the protein editor yet
|
|
57
|
+
toSpread = {
|
|
58
|
+
findTool: {
|
|
59
|
+
dnaOrAA: "AA",
|
|
60
|
+
...findTool //we spread this here to allow the user to override this .. if they must!
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
annotationVisibility: {
|
|
64
|
+
caret: true,
|
|
65
|
+
sequence: false,
|
|
66
|
+
reverseSequence: false,
|
|
67
|
+
cutsites: false,
|
|
68
|
+
translations: false,
|
|
69
|
+
aminoAcidNumbers: false,
|
|
70
|
+
primaryProteinSequence: true,
|
|
71
|
+
...annotationVisibility //we spread this here to allow the user to override this .. if they must!
|
|
72
|
+
},
|
|
73
|
+
annotationsToSupport: {
|
|
74
|
+
features: true,
|
|
75
|
+
translations: false,
|
|
76
|
+
primaryProteinSequence: true,
|
|
77
|
+
parts: true,
|
|
78
|
+
orfs: false,
|
|
79
|
+
cutsites: false,
|
|
80
|
+
primers: false,
|
|
81
|
+
...annotationsToSupport
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
} else if (sequenceData.isOligo && !isAlreadyOligoEditor) {
|
|
85
|
+
toSpread = {
|
|
86
|
+
findTool: {
|
|
87
|
+
dnaOrAA: "DNA",
|
|
88
|
+
...findTool //we spread this here to allow the user to override this .. if they must!
|
|
89
|
+
},
|
|
90
|
+
annotationVisibility: {
|
|
91
|
+
caret: true,
|
|
92
|
+
sequence: true,
|
|
93
|
+
cutsites: false,
|
|
94
|
+
reverseSequence: false,
|
|
95
|
+
translations: false,
|
|
96
|
+
aminoAcidNumbers: false,
|
|
97
|
+
primaryProteinSequence: false,
|
|
98
|
+
...annotationVisibility //we spread this here to allow the user to override this .. if they must!
|
|
99
|
+
},
|
|
100
|
+
annotationsToSupport: {
|
|
101
|
+
features: true,
|
|
102
|
+
translations: true,
|
|
103
|
+
primaryProteinSequence: false,
|
|
104
|
+
parts: true,
|
|
105
|
+
orfs: false,
|
|
106
|
+
cutsites: true,
|
|
107
|
+
primers: false,
|
|
108
|
+
...annotationsToSupport //we spread this here to allow the user to override this .. if they must!
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
} else if (sequenceData.isRna && !isAlreadyRnaEditor) {
|
|
112
|
+
toSpread = {
|
|
113
|
+
findTool: {
|
|
114
|
+
dnaOrAA: "DNA",
|
|
115
|
+
...findTool //we spread this here to allow the user to override this .. if they must!
|
|
116
|
+
},
|
|
117
|
+
annotationVisibility: {
|
|
118
|
+
caret: true,
|
|
119
|
+
sequence: true,
|
|
120
|
+
cutsites: false,
|
|
121
|
+
reverseSequence: Boolean(sequenceData?.isDoubleStrandedRNA),
|
|
122
|
+
translations: false,
|
|
123
|
+
aminoAcidNumbers: false,
|
|
124
|
+
primaryProteinSequence: false,
|
|
125
|
+
...annotationVisibility //we spread this here to allow the user to override this .. if they must!
|
|
126
|
+
},
|
|
127
|
+
annotationsToSupport: {
|
|
128
|
+
features: true,
|
|
129
|
+
translations: true,
|
|
130
|
+
primaryProteinSequence: false,
|
|
131
|
+
parts: true,
|
|
132
|
+
orfs: true,
|
|
133
|
+
cutsites: true,
|
|
134
|
+
primers: true,
|
|
135
|
+
...annotationsToSupport //we spread this here to allow the user to override this .. if they must!
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
} else if (isAlreadySpecialEditor && isDna) {
|
|
139
|
+
//we're editing dna but haven't initialized the dna editor yet
|
|
140
|
+
sequenceData.isProtein = false;
|
|
141
|
+
toSpread = {
|
|
142
|
+
findTool: {
|
|
143
|
+
dnaOrAA: "DNA",
|
|
144
|
+
...findTool //we spread this here to allow the user to override this .. if they must!
|
|
145
|
+
},
|
|
146
|
+
annotationVisibility: {
|
|
147
|
+
caret: true,
|
|
148
|
+
sequence: true,
|
|
149
|
+
reverseSequence: !sequenceData?.isSingleStrandedDNA,
|
|
150
|
+
translations: false,
|
|
151
|
+
aminoAcidNumbers: false,
|
|
152
|
+
primaryProteinSequence: false,
|
|
153
|
+
...annotationVisibility //we spread this here to allow the user to override this .. if they must!
|
|
154
|
+
},
|
|
155
|
+
annotationsToSupport: {
|
|
156
|
+
features: true,
|
|
157
|
+
translations: true,
|
|
158
|
+
primaryProteinSequence: false,
|
|
159
|
+
parts: true,
|
|
160
|
+
orfs: true,
|
|
161
|
+
cutsites: true,
|
|
162
|
+
primers: true,
|
|
163
|
+
...annotationsToSupport //we spread this here to allow the user to override this .. if they must!
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
payload = {
|
|
169
|
+
...initialValues,
|
|
170
|
+
...toSpread,
|
|
171
|
+
...(sequenceData && {
|
|
172
|
+
sequenceData: tidyUpSequenceData(sequenceData, {
|
|
173
|
+
convertAnnotationsFromAAIndices,
|
|
174
|
+
//if we have sequence data coming in make sure to tidy it up for the user :)
|
|
175
|
+
annotationsAsObjects: true
|
|
176
|
+
})
|
|
177
|
+
})
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
annotationTypes.forEach(t => {
|
|
181
|
+
if (Object.keys(sequenceData?.[t] || {}).length > 100) {
|
|
182
|
+
set(payload, `annotationLabelVisibility.${t}`, false);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
if (sequenceData && sequenceData.size > 20000) {
|
|
186
|
+
set(payload, "annotationVisibility.translations", false);
|
|
187
|
+
set(payload, "annotationVisibility.cutsites", false);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
store.dispatch({
|
|
191
|
+
type: "VECTOR_EDITOR_UPDATE",
|
|
192
|
+
payload,
|
|
193
|
+
meta: {
|
|
194
|
+
mergeStateDeep: true,
|
|
195
|
+
editorName,
|
|
196
|
+
disregardUndo: true,
|
|
197
|
+
...extraMeta
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isElWithinAnotherEl,
|
|
3
|
+
isElWithinAnotherElWithDiff
|
|
4
|
+
} from "../withEditorInteractions/isElementInViewport";
|
|
5
|
+
|
|
6
|
+
export function updateLabelsForInViewFeatures({
|
|
7
|
+
rectElement = ".veLinearView"
|
|
8
|
+
} = {}) {
|
|
9
|
+
const feats = Array.from(
|
|
10
|
+
document.querySelectorAll(`.veLinearView .veRowViewFeature`)
|
|
11
|
+
);
|
|
12
|
+
const parts = Array.from(
|
|
13
|
+
document.querySelectorAll(`.veLinearView .veRowViewPart`)
|
|
14
|
+
);
|
|
15
|
+
const primers = Array.from(
|
|
16
|
+
document.querySelectorAll(`.veLinearView .veRowViewPrimer`)
|
|
17
|
+
);
|
|
18
|
+
const els = [...feats, ...parts, ...primers];
|
|
19
|
+
const boundingRect = document
|
|
20
|
+
.querySelector(rectElement)
|
|
21
|
+
.getBoundingClientRect();
|
|
22
|
+
|
|
23
|
+
els.forEach(el => {
|
|
24
|
+
const elBounds = el.getBoundingClientRect();
|
|
25
|
+
const isElIn = isElWithinAnotherEl(elBounds, boundingRect);
|
|
26
|
+
|
|
27
|
+
if (isElIn) {
|
|
28
|
+
const label = el.querySelector(".veLabelText");
|
|
29
|
+
if (!label) return;
|
|
30
|
+
const labelBounds = label.getBoundingClientRect();
|
|
31
|
+
const [isLabelIn, diff] = isElWithinAnotherElWithDiff(labelBounds, {
|
|
32
|
+
left: Math.max(boundingRect.left, elBounds.left),
|
|
33
|
+
right: Math.min(boundingRect.right, elBounds.right)
|
|
34
|
+
});
|
|
35
|
+
if (!isLabelIn) {
|
|
36
|
+
const l = window.getComputedStyle(label, null),
|
|
37
|
+
t = l.getPropertyValue("transform");
|
|
38
|
+
|
|
39
|
+
// If t return other than "none"
|
|
40
|
+
// Split content into several value
|
|
41
|
+
// The fourth one is the translateX value
|
|
42
|
+
|
|
43
|
+
if (t !== "none") {
|
|
44
|
+
const v = t.split("(")[1],
|
|
45
|
+
// w = v.split(")")[0],
|
|
46
|
+
x = v.split(",");
|
|
47
|
+
|
|
48
|
+
const newX = Number(x[4]) + diff;
|
|
49
|
+
const newY = Number(x[5].replace(")", ""));
|
|
50
|
+
label.setAttribute("transform", `translate(${newX},${newY})`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// import {
|
|
2
|
+
// isElWithinAnotherEl,
|
|
3
|
+
// isElWithinAnotherElWithDiff
|
|
4
|
+
// } from "../withEditorInteractions/isElementInViewport";
|
|
5
|
+
|
|
6
|
+
// export function updateLabelsForInViewFeaturesCircView({
|
|
7
|
+
// rectElement = ".veCircularView",
|
|
8
|
+
// radius
|
|
9
|
+
// } = {}) {
|
|
10
|
+
// const feats = Array.from(
|
|
11
|
+
// document.querySelectorAll(`.veCircularView .veFeature`)
|
|
12
|
+
// );
|
|
13
|
+
// // const parts = Array.from(
|
|
14
|
+
// // document.querySelectorAll(`.veCircularView .vePart`)
|
|
15
|
+
// // );
|
|
16
|
+
// // const primers = Array.from(
|
|
17
|
+
// // document.querySelectorAll(`.veCircularView .vePrimer`)
|
|
18
|
+
// // );
|
|
19
|
+
// const els = [...feats];
|
|
20
|
+
// // const els = [...feats, ...parts, ...primers];
|
|
21
|
+
// const boundingRect = document
|
|
22
|
+
// .querySelector(rectElement)
|
|
23
|
+
// .getBoundingClientRect();
|
|
24
|
+
// els.forEach((el) => {
|
|
25
|
+
// // const elBounds = el.getBoundingClientRect();
|
|
26
|
+
// // const isElIn = isElWithinAnotherEl(elBounds, boundingRect);
|
|
27
|
+
// const label = el.querySelector(".veLabelText");
|
|
28
|
+
// if (!label) return;
|
|
29
|
+
// const labelBounds = label.getBoundingClientRect();
|
|
30
|
+
// const [isLabelIn, diff] = isElWithinAnotherElWithDiff(labelBounds, {
|
|
31
|
+
// left: Math.max(boundingRect.left, 0 /* elBounds.left */),
|
|
32
|
+
// right: Math.min(boundingRect.right, 0 /* elBounds.right */)
|
|
33
|
+
// });
|
|
34
|
+
// if (!isLabelIn) {
|
|
35
|
+
// label.setAttribute("transform", `rotate(-40)`);
|
|
36
|
+
// }
|
|
37
|
+
// // if (isElIn) {
|
|
38
|
+
|
|
39
|
+
// // }
|
|
40
|
+
// });
|
|
41
|
+
// }
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { insertItem, removeItem } from "../utils/arrayUtils";
|
|
2
|
+
|
|
3
|
+
export function updateTrackHelper({
|
|
4
|
+
currentPairwiseAlignmentIndex,
|
|
5
|
+
pairwiseAlignments,
|
|
6
|
+
upsertAlignmentRun,
|
|
7
|
+
hasBeenTrimmed,
|
|
8
|
+
alignmentId,
|
|
9
|
+
alignmentTracks,
|
|
10
|
+
alignmentTrackIndex,
|
|
11
|
+
update
|
|
12
|
+
}) {
|
|
13
|
+
const updateATs = (atsToUse, alignmentTrackIndex) => {
|
|
14
|
+
const removed = removeItem(atsToUse, alignmentTrackIndex);
|
|
15
|
+
return insertItem(
|
|
16
|
+
removed,
|
|
17
|
+
{
|
|
18
|
+
...atsToUse[alignmentTrackIndex],
|
|
19
|
+
alignmentData: {
|
|
20
|
+
...atsToUse[alignmentTrackIndex].alignmentData,
|
|
21
|
+
...update
|
|
22
|
+
},
|
|
23
|
+
sequenceData: {
|
|
24
|
+
...atsToUse[alignmentTrackIndex].sequenceData,
|
|
25
|
+
...update
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
alignmentTrackIndex
|
|
29
|
+
);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
upsertAlignmentRun({
|
|
33
|
+
id: alignmentId,
|
|
34
|
+
hasBeenTrimmed,
|
|
35
|
+
...(pairwiseAlignments
|
|
36
|
+
? {
|
|
37
|
+
pairwiseAlignments: pairwiseAlignments.map((ats, i) => {
|
|
38
|
+
if (alignmentTrackIndex === 0) {
|
|
39
|
+
return updateATs(ats, 0);
|
|
40
|
+
}
|
|
41
|
+
if (
|
|
42
|
+
currentPairwiseAlignmentIndex !== undefined
|
|
43
|
+
? currentPairwiseAlignmentIndex === i
|
|
44
|
+
: alignmentTrackIndex - 1 === i
|
|
45
|
+
) {
|
|
46
|
+
return updateATs(ats, 1);
|
|
47
|
+
}
|
|
48
|
+
return ats;
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
: {
|
|
52
|
+
alignmentTracks: updateATs(
|
|
53
|
+
alignmentTracks,
|
|
54
|
+
Number(alignmentTrackIndex)
|
|
55
|
+
)
|
|
56
|
+
})
|
|
57
|
+
});
|
|
58
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createReducer } from "redux-act";
|
|
2
|
+
|
|
3
|
+
//./caretPosition.js
|
|
4
|
+
import createAction from "./utils/createMetaAction";
|
|
5
|
+
// import createReducer from "./utils/createMergedDefaultStateReducer";
|
|
6
|
+
|
|
7
|
+
// ------------------------------------
|
|
8
|
+
// Actions
|
|
9
|
+
// ------------------------------------
|
|
10
|
+
export const updateSequenceCase = createAction("updateSequenceCase");
|
|
11
|
+
|
|
12
|
+
const newVal = window.localStorage.getItem("uppercaseSequenceMapFont");
|
|
13
|
+
|
|
14
|
+
// ------------------------------------
|
|
15
|
+
// Reducer
|
|
16
|
+
// ------------------------------------
|
|
17
|
+
export default createReducer(
|
|
18
|
+
{
|
|
19
|
+
[updateSequenceCase]: (state, payload) => {
|
|
20
|
+
localStorage.setItem("uppercaseSequenceMapFont", payload);
|
|
21
|
+
return payload;
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
newVal || "noPreference" // noPreference || uppercase || lowercase
|
|
25
|
+
);
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import omit from "lodash/omit";
|
|
2
|
+
import uuid from "shortid";
|
|
3
|
+
|
|
4
|
+
// ------------------------------------
|
|
5
|
+
// Reducer
|
|
6
|
+
// ------------------------------------
|
|
7
|
+
export default function upsertDeleteActionGenerator(
|
|
8
|
+
upsertAction,
|
|
9
|
+
deleteAction
|
|
10
|
+
) {
|
|
11
|
+
return {
|
|
12
|
+
[upsertAction]: (state, payload) => {
|
|
13
|
+
const idToUse = payload.id || uuid();
|
|
14
|
+
return {
|
|
15
|
+
...state,
|
|
16
|
+
[idToUse]: { ...(state[idToUse] || {}), ...payload, id: idToUse }
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
[deleteAction]: (state, payload) => {
|
|
20
|
+
let ids;
|
|
21
|
+
if (Array.isArray(payload)) {
|
|
22
|
+
ids = payload.map(val => {
|
|
23
|
+
return val.id || val;
|
|
24
|
+
});
|
|
25
|
+
} else {
|
|
26
|
+
ids = [payload.id || payload];
|
|
27
|
+
}
|
|
28
|
+
return omit(state, ids);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|