@teselagen/ove 0.0.13 → 0.0.15
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/index.umd.js +164751 -135808
- package/package.json +78 -2
- package/src/AlignmentTool/index.js +16 -0
- package/src/AlignmentView/AlignmentVisibilityTool.js +105 -0
- package/src/AlignmentView/EditTrackNameDialog.js +34 -0
- package/src/AlignmentView/HorizontalPanelDragHandle.js +35 -0
- package/src/AlignmentView/Minimap.js +520 -0
- package/src/AlignmentView/Mismatches.js +134 -0
- package/src/AlignmentView/PairwiseAlignmentView.js +68 -0
- package/src/AlignmentView/PerformantSelectionLayer.js +32 -0
- package/src/AlignmentView/coerceInitialValue.js +7 -0
- package/src/AlignmentView/getGapMap.js +12 -0
- package/src/AlignmentView/getGaps.js +27 -0
- package/src/AlignmentView/getPairwiseOverviewLinearViewOptions.js +38 -0
- package/src/AlignmentView/getTrackFromEvent.js +25 -0
- package/src/AlignmentView/index.js +2058 -0
- package/src/AlignmentView/isTargetWithinEl.js +6 -0
- package/src/AlignmentView/style.css +100 -0
- package/src/AlignmentView/updateTrackHelper.js +58 -0
- package/src/AutoAnnotate.js +500 -0
- package/src/AutoAnnotateBpMatchingDialog.js +208 -0
- package/src/CircularView/Axis.js +40 -0
- package/src/CircularView/AxisNumbers.js +35 -0
- package/src/CircularView/Caret.js +63 -0
- package/src/CircularView/CircularDnaSequence.js +73 -0
- package/src/CircularView/CircularZoomMinimap.js +16 -0
- package/src/CircularView/Cutsite.js +18 -0
- package/src/CircularView/Cutsites.js +113 -0
- package/src/CircularView/DeletionLayer.js +28 -0
- package/src/CircularView/Feature.js +83 -0
- package/src/CircularView/Labels/index.js +536 -0
- package/src/CircularView/Labels/relaxLabelAngles.js +157 -0
- package/src/CircularView/Labels/relaxLabels_DEPRECATED.js +105 -0
- package/src/CircularView/Labels/style.css +55 -0
- package/src/CircularView/Orf.js +25 -0
- package/src/CircularView/Part.js +34 -0
- package/src/CircularView/PositionAnnotationOnCircle.js +26 -0
- package/src/CircularView/Primer.js +41 -0
- package/src/CircularView/RotateCircularViewSlider.js +82 -0
- package/src/CircularView/SelectionLayer.js +132 -0
- package/src/CircularView/VeTopRightContainer.js +12 -0
- package/src/CircularView/ZoomCircularViewSlider.js +62 -0
- package/src/CircularView/drawAnnotations.js +433 -0
- package/src/CircularView/drawDirectedPiePiece.js +142 -0
- package/src/CircularView/getAngleForPositionMidpoint.js +3 -0
- package/src/CircularView/getInternalLabel.js +40 -0
- package/src/CircularView/getRangeAnglesSpecial.js +12 -0
- package/src/CircularView/getYOffset.js +15 -0
- package/src/CircularView/index.d.ts +20 -0
- package/src/CircularView/index.js +930 -0
- package/src/CircularView/normalizeAngle.js +3 -0
- package/src/CircularView/normalizeAngleRange.js +9 -0
- package/src/CircularView/positionCutsites.js +6 -0
- package/src/CircularView/shouldFlipText.js +4 -0
- package/src/CircularView/style.css +47 -0
- package/src/CircularView/utils/polarToSpecialCartesian.js +7 -0
- package/src/CreateAnnotationsPage.js +96 -0
- package/src/CreateCustomEnzyme/index.js +337 -0
- package/src/CreateCustomEnzyme/style.css +100 -0
- package/src/CutsiteFilter/AdditionalCutsiteInfoDialog.js +599 -0
- package/src/CutsiteFilter/index.js +408 -0
- package/src/CutsiteFilter/style.css +23 -0
- package/src/CutsiteFilter/withRestrictionEnzymes.js +15 -0
- package/src/DigestTool/AddLaddersDialog.js +82 -0
- package/src/DigestTool/DigestTool.js +223 -0
- package/src/DigestTool/Ladder.css +20 -0
- package/src/DigestTool/Ladder.js +303 -0
- package/src/DigestTool/createFragmentLines.js +120 -0
- package/src/DigestTool/ladderDefaults.js +26 -0
- package/src/DigestTool/ruler.css +89 -0
- package/src/Editor/CommandHotkeyHandler.js +44 -0
- package/src/Editor/DropHandler.css +21 -0
- package/src/Editor/DropHandler.js +64 -0
- package/src/Editor/FillWindow.js +46 -0
- package/src/Editor/darkmode.css +98 -0
- package/src/Editor/index.js +1005 -0
- package/src/Editor/style.css +235 -0
- package/src/Editor/userDefinedHandlersAndOpts.js +56 -0
- package/src/EnzymeViewer/index.js +81 -0
- package/src/EnzymeViewer/style.css +6 -0
- package/src/FindBar/index.js +411 -0
- package/src/FindBar/style.css +46 -0
- package/src/GlobalDialog.js +66 -0
- package/src/GlobalDialogUtils.js +85 -0
- package/src/LinearView/SequenceName.js +15 -0
- package/src/LinearView/ZoomLinearView.js +47 -0
- package/src/LinearView/index.js +374 -0
- package/src/LinearView/style.css +12 -0
- package/src/ManageEnzymes/index.js +326 -0
- package/src/ManageEnzymes/style.css +100 -0
- package/src/MenuBar/defaultConfig.js +149 -0
- package/src/MenuBar/index.js +98 -0
- package/src/MenuBar/viewSubmenu.js +479 -0
- package/src/PCRTool/PCRTool.js +173 -0
- package/src/Reflex/Browser.js +107 -0
- package/src/Reflex/ReflexContainer.js +802 -0
- package/src/Reflex/ReflexElement.js +160 -0
- package/src/Reflex/ReflexEvents.js +77 -0
- package/src/Reflex/ReflexSplitter.js +205 -0
- package/src/Reflex/index.js +5 -0
- package/src/Reflex/reflex-styles.css +128 -0
- package/src/Reflex/reflex-styles.css.map +9 -0
- package/src/RowItem/AnnotationContainerHolder.js +20 -0
- package/src/RowItem/AnnotationPositioner.js +27 -0
- package/src/RowItem/Axis.js +149 -0
- package/src/RowItem/Caret/index.js +64 -0
- package/src/RowItem/Caret/style.css +8 -0
- package/src/RowItem/Chromatograms/Chromatogram.js +289 -0
- package/src/RowItem/CutsiteSelectionLayers.js +47 -0
- package/src/RowItem/Cutsites.js +271 -0
- package/src/RowItem/DeletionLayers/index.js +113 -0
- package/src/RowItem/DeletionLayers/style.css +5 -0
- package/src/RowItem/Labels.js +327 -0
- package/src/RowItem/Orf.js +109 -0
- package/src/RowItem/Orfs.js +35 -0
- package/src/RowItem/ReplacementLayers/style.css +5 -0
- package/src/RowItem/SelectionLayer/index.js +184 -0
- package/src/RowItem/SelectionLayer/style.css +21 -0
- package/src/RowItem/Sequence.js +269 -0
- package/src/RowItem/StackedAnnotations/PointedAnnotation.js +347 -0
- package/src/RowItem/StackedAnnotations/getStructuredBases.js +97 -0
- package/src/RowItem/StackedAnnotations/index.js +182 -0
- package/src/RowItem/StackedAnnotations/primerBases.js +218 -0
- package/src/RowItem/StackedAnnotations/style.css +14 -0
- package/src/RowItem/Translations/AASliver.js +190 -0
- package/src/RowItem/Translations/Translation.js +162 -0
- package/src/RowItem/Translations/index.js +54 -0
- package/src/RowItem/Translations/style.css +3 -0
- package/src/RowItem/constants.js +3 -0
- package/src/RowItem/getCutsiteLabelHeights.js +56 -0
- package/src/RowItem/getXStartAndWidthFromNonCircularRange.js +12 -0
- package/src/RowItem/getXStartAndWidthOfRangeWrtRow.js +27 -0
- package/src/RowItem/getXStartAndWidthOfRowAnnotation.js +19 -0
- package/src/RowItem/index.js +647 -0
- package/src/RowItem/partOverhangs.js +6 -0
- package/src/RowItem/style.css +103 -0
- package/src/RowItem/utils.js +32 -0
- package/src/RowView/estimateRowHeight.js +184 -0
- package/src/RowView/index.d.ts +10 -0
- package/src/RowView/index.js +554 -0
- package/src/RowView/style.css +12 -0
- package/src/SimpleCircularOrLinearView.js +379 -0
- package/src/SimpleOligoPreview.js +39 -0
- package/src/StatusBar/MeltingTemp.js +81 -0
- package/src/StatusBar/index.js +275 -0
- package/src/StatusBar/style.css +38 -0
- package/src/ToolBar/ToolbarItem.js +194 -0
- package/src/ToolBar/alignmentTool.js +503 -0
- package/src/ToolBar/array_move.js +10 -0
- package/src/ToolBar/cutsiteTool.js +88 -0
- package/src/ToolBar/downloadTool.js +38 -0
- package/src/ToolBar/editTool.js +26 -0
- package/src/ToolBar/featureTool.js +34 -0
- package/src/ToolBar/findTool.js +2 -0
- package/src/ToolBar/importTool.js +27 -0
- package/src/ToolBar/index.js +231 -0
- package/src/ToolBar/inlineFindTool.js +38 -0
- package/src/ToolBar/oligoTool.js +30 -0
- package/src/ToolBar/orfTool.js +141 -0
- package/src/ToolBar/partTool.js +47 -0
- package/src/ToolBar/printTool.js +31 -0
- package/src/ToolBar/redoTool.js +30 -0
- package/src/ToolBar/saveTool.js +48 -0
- package/src/ToolBar/style.css +138 -0
- package/src/ToolBar/undoTool.js +30 -0
- package/src/ToolBar/veToolbarIcons/find.png +0 -0
- package/src/ToolBar/veToolbarIcons/fullscreen.png +0 -0
- package/src/ToolBar/veToolbarIcons/linear.png +0 -0
- package/src/ToolBar/veToolbarIcons/pie.png +0 -0
- package/src/ToolBar/veToolbarIcons/print.png +0 -0
- package/src/ToolBar/veToolbarIcons/save.png +0 -0
- package/src/ToolBar/veToolbarIcons/show_cut_sites.png +0 -0
- package/src/ToolBar/veToolbarIcons/show_features.png +0 -0
- package/src/ToolBar/veToolbarIcons/show_orfs.png +0 -0
- package/src/ToolBar/veToolbarIcons/show_primers.png +0 -0
- package/src/ToolBar/veToolbarIcons/toggle_views.svg +1 -0
- package/src/ToolBar/versionHistoryTool.js +20 -0
- package/src/ToolBar/visibilityTool.js +39 -0
- package/src/VersionHistoryView/index.js +215 -0
- package/src/addAlignment.js +6 -0
- package/src/commands/getOveHotkeyDefs.js +12 -0
- package/src/commands/index.js +1585 -0
- package/src/constants/constants.js +2 -0
- package/src/constants/dnaToColor.js +17 -0
- package/src/constants/draggableClassnames.js +5 -0
- package/src/constants/findToolConstants.js +1 -0
- package/src/constants/orfFrameToColorMap.js +10 -0
- package/src/constants/rowviewContants.js +3 -0
- package/src/constants/specialCutsiteFilterOptions.js +22 -0
- package/src/constants.js +1 -0
- package/src/createVectorEditor/index.js +138 -0
- package/src/createVectorEditor/makeStore.js +34 -0
- package/src/fileUtils.js +103 -0
- package/src/helperComponents/AddOrEditAnnotationDialog/index.js +711 -0
- package/src/helperComponents/AddOrEditAnnotationDialog/style.css +11 -0
- package/src/helperComponents/AddOrEditFeatureDialog/index.js +58 -0
- package/src/helperComponents/AddOrEditPartDialog/index.js +101 -0
- package/src/helperComponents/AddOrEditPrimerDialog/EditCaretPosition.js +234 -0
- package/src/helperComponents/AddOrEditPrimerDialog/index.js +329 -0
- package/src/helperComponents/AddOrEditPrimerDialog/style.css +41 -0
- package/src/helperComponents/EnzymesDialog/index.js +904 -0
- package/src/helperComponents/EnzymesDialog/style.css +21 -0
- package/src/helperComponents/GoToDialog.js +21 -0
- package/src/helperComponents/MergeFeaturesDialog/index.js +253 -0
- package/src/helperComponents/MergeFeaturesDialog/style.css +3 -0
- package/src/helperComponents/MultipleSeqsDetectedOnImportDialog.js +74 -0
- package/src/helperComponents/PinchHelper/PinchHelper.js +24 -0
- package/src/helperComponents/PrintDialog/index.js +396 -0
- package/src/helperComponents/PrintDialog/style.css +4 -0
- package/src/helperComponents/PropertiesDialog/ColorPicker.js +30 -0
- package/src/helperComponents/PropertiesDialog/CutsiteProperties.js +185 -0
- package/src/helperComponents/PropertiesDialog/FeatureProperties.js +6 -0
- package/src/helperComponents/PropertiesDialog/GenbankView.js +74 -0
- package/src/helperComponents/PropertiesDialog/GeneralProperties.js +140 -0
- package/src/helperComponents/PropertiesDialog/GenericAnnotationProperties.js +406 -0
- package/src/helperComponents/PropertiesDialog/OrfProperties.js +117 -0
- package/src/helperComponents/PropertiesDialog/PartProperties.js +9 -0
- package/src/helperComponents/PropertiesDialog/PrimerProperties.js +19 -0
- package/src/helperComponents/PropertiesDialog/SingleEnzymeCutsiteInfo.js +131 -0
- package/src/helperComponents/PropertiesDialog/TranslationProperties.js +149 -0
- package/src/helperComponents/PropertiesDialog/index.js +166 -0
- package/src/helperComponents/PropertiesDialog/style.css +68 -0
- package/src/helperComponents/PropertiesDialog/typeField.js +24 -0
- package/src/helperComponents/PropertiesDialog/utils.js +37 -0
- package/src/helperComponents/RemoveDuplicates/index.js +194 -0
- package/src/helperComponents/RenameSequenceDialog.js +7 -0
- package/src/helperComponents/SelectDialog.js +150 -0
- package/src/helperComponents/UncontrolledSliderWithPlusMinusBtns.css +5 -0
- package/src/helperComponents/UncontrolledSliderWithPlusMinusBtns.js +134 -0
- package/src/helperComponents/VeWarning/index.js +22 -0
- package/src/helperComponents/VeWarning/style.css +10 -0
- package/src/helperComponents/createSimpleDialog.js +89 -0
- package/src/helperComponents/partTagSearch.js +72 -0
- package/src/helperComponents/simpleDialog.css +13 -0
- package/src/helperComponents/withHover.js +90 -0
- package/src/index.js +60 -0
- package/src/redux/alignments.js +373 -0
- package/src/redux/annotationLabelVisibility.js +53 -0
- package/src/redux/annotationVisibility.js +196 -0
- package/src/redux/annotationsToSupport.js +104 -0
- package/src/redux/caretPosition.js +27 -0
- package/src/redux/charWidth.js +22 -0
- package/src/redux/copyOptions.js +34 -0
- package/src/redux/createYourOwnEnzyme.js +39 -0
- package/src/redux/deletionLayers.js +36 -0
- package/src/redux/digestTool.js +34 -0
- package/src/redux/featureLengthsToHide.js +27 -0
- package/src/redux/findTool.js +79 -0
- package/src/redux/frameTranslations.js +52 -0
- package/src/redux/hoveredAnnotation.js +24 -0
- package/src/redux/index.js +196 -0
- package/src/redux/labelLineIntensity.js +25 -0
- package/src/redux/labelSize.js +23 -0
- package/src/redux/lastSavedId.js +20 -0
- package/src/redux/middleware.js +112 -0
- package/src/redux/minimumOrfSize.js +24 -0
- package/src/redux/modalActions.js +3 -0
- package/src/redux/panelsShown.js +273 -0
- package/src/redux/partLengthsToHide.js +23 -0
- package/src/redux/primerLengthsToHide.js +27 -0
- package/src/redux/propertiesTool.js +40 -0
- package/src/redux/readOnly.js +28 -0
- package/src/redux/replacementLayers.js +36 -0
- package/src/redux/restrictionEnzymes.js +52 -0
- package/src/redux/selectedAnnotations.js +89 -0
- package/src/redux/selectedPartTags.js +21 -0
- package/src/redux/selectionLayer.js +46 -0
- package/src/redux/sequenceData/circular.js +19 -0
- package/src/redux/sequenceData/description.js +21 -0
- package/src/redux/sequenceData/features.js +19 -0
- package/src/redux/sequenceData/index.js +81 -0
- package/src/redux/sequenceData/lineageLines.js +11 -0
- package/src/redux/sequenceData/materiallyAvailable.js +19 -0
- package/src/redux/sequenceData/name.js +19 -0
- package/src/redux/sequenceData/parts.js +19 -0
- package/src/redux/sequenceData/primers.js +19 -0
- package/src/redux/sequenceData/sequence.js +12 -0
- package/src/redux/sequenceData/sharedActionCreators.js +0 -0
- package/src/redux/sequenceData/translations.js +20 -0
- package/src/redux/sequenceData/upsertDeleteActionGenerator.js +31 -0
- package/src/redux/sequenceDataHistory.js +43 -0
- package/src/redux/showGCContent.js +23 -0
- package/src/redux/toolBar.js +25 -0
- package/src/redux/uppercaseSequenceMapFont.js +25 -0
- package/src/redux/useAdditionalOrfStartCodons.js +24 -0
- package/src/redux/utils/addDashesForMatchStartAndEndForTracks/index.js +71 -0
- package/src/redux/utils/addMetaToActionCreators.js +12 -0
- package/src/redux/utils/createMergedDefaultStateReducer.js +30 -0
- package/src/redux/utils/createMetaAction.js +12 -0
- package/src/redux/versionHistory.js +27 -0
- package/src/selectors/annotationLabelVisibility.js +2 -0
- package/src/selectors/annotationSearchSelector.js +24 -0
- package/src/selectors/cdsFeaturesSelector.js +9 -0
- package/src/selectors/circularSelector.js +4 -0
- package/src/selectors/cutsiteLabelColorSelector.js +6 -0
- package/src/selectors/cutsitesByRangeSelector.js +5 -0
- package/src/selectors/cutsitesSelector.js +61 -0
- package/src/selectors/editorSelector.js +2 -0
- package/src/selectors/featuresSelector.js +8 -0
- package/src/selectors/filteredCutsitesSelector.js +137 -0
- package/src/selectors/filteredFeaturesSelector.js +32 -0
- package/src/selectors/filteredPartsSelector.js +57 -0
- package/src/selectors/filteredPrimersSelector.js +27 -0
- package/src/selectors/filteredRestrictionEnzymesSelector.js +1 -0
- package/src/selectors/getAdditionalEnzymesSelector.js +46 -0
- package/src/selectors/index.js +41 -0
- package/src/selectors/isEnzymeFilterAndSelector.js +1 -0
- package/src/selectors/minimumOrfSizeSelector.js +2 -0
- package/src/selectors/orfsSelector.js +15 -0
- package/src/selectors/partsSelector.js +8 -0
- package/src/selectors/primersSelector.js +8 -0
- package/src/selectors/restrictionEnzymesSelector.js +34 -0
- package/src/selectors/searchLayersSelector.js +71 -0
- package/src/selectors/selectedAnnotationsSelector.js +1 -0
- package/src/selectors/selectedCutsitesSelector.js +21 -0
- package/src/selectors/sequenceDataSelector.js +2 -0
- package/src/selectors/sequenceLengthSelector.js +5 -0
- package/src/selectors/sequenceSelector.js +4 -0
- package/src/selectors/tagsToBoldSelector.js +2 -0
- package/src/selectors/translationSearchMatchesSelector.js +14 -0
- package/src/selectors/translationsRawSelector.js +8 -0
- package/src/selectors/translationsSelector.js +137 -0
- package/src/style.css +82 -0
- package/src/updateEditor.js +198 -0
- package/src/utils/PassThrough.js +3 -0
- package/src/utils/addWrappedAddons.js +20 -0
- package/src/utils/annotationTypes.js +37 -0
- package/src/utils/arrayUtils.js +19 -0
- package/src/utils/calculateTickMarkPositionsForGivenRange.js +47 -0
- package/src/utils/cleanSequenceData_DEPRECATED/arrayToObjWithIds.js +17 -0
- package/src/utils/combineReducersDontIgnoreKeys.js +12 -0
- package/src/utils/commandUtils.js +18 -0
- package/src/utils/editorUtils.js +223 -0
- package/src/utils/getAnnotationClassnames.js +12 -0
- package/src/utils/getAnnotationNameAndStartStopString.js +61 -0
- package/src/utils/getVisibleStartEnd.js +7 -0
- package/src/utils/massageTickSpacing.js +19 -0
- package/src/utils/onlyUpdateForKeysDeep.js +31 -0
- package/src/utils/prepareRowData.js +64 -0
- package/src/utils/proteinUtils.js +3 -0
- package/src/utils/pureNoFunc.js +18 -0
- package/src/utils/selectionLayer.js +25 -0
- package/src/utils/shouldRerender.js +27 -0
- package/src/utils/showFileDialog.js +26 -0
- package/src/utils/updateLabelsForInViewFeatures.js +55 -0
- package/src/utils/updateLabelsForInViewFeaturesCircView.js +41 -0
- package/src/utils/useAAColorType.js +8 -0
- package/src/utils/useAnnotationLimits.js +42 -0
- package/src/utils/useChromatogramPrefs.js +31 -0
- package/src/utils/useLadders.js +6 -0
- package/src/utils/useMeltingTemp.js +7 -0
- package/src/utils/useTmType.js +10 -0
- package/src/withEditorInteractions/Keyboard.js +86 -0
- package/src/withEditorInteractions/clickAndDragUtils.js +576 -0
- package/src/withEditorInteractions/createSequenceInputPopup.js +296 -0
- package/src/withEditorInteractions/createSequenceInputPopupStyle.css +85 -0
- package/src/withEditorInteractions/getBpsPerRow.js +19 -0
- package/src/withEditorInteractions/index.js +1252 -0
- package/src/withEditorInteractions/isElementInViewport.js +29 -0
- package/src/withEditorInteractions/moveCaret.js +58 -0
- package/src/withEditorProps/index.js +1010 -0
- package/index.mjs +0 -193201
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import classnames from "classnames";
|
|
2
|
+
import { compose } from "redux";
|
|
3
|
+
import { connect } from "react-redux";
|
|
4
|
+
import React from "react";
|
|
5
|
+
import { store } from "@risingstack/react-easy-state";
|
|
6
|
+
import * as hoveredAnnotationActions from "../redux/hoveredAnnotation";
|
|
7
|
+
import { withHandlers, branch } from "recompose";
|
|
8
|
+
import { modifiableTypes } from "@teselagen/sequence-utils";
|
|
9
|
+
|
|
10
|
+
export const HoveredIdContext = React.createContext({
|
|
11
|
+
hoveredId: "" // default value
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
export function withHoveredIdFromContext(Component) {
|
|
15
|
+
return function HoveredIdComponent(props) {
|
|
16
|
+
return (
|
|
17
|
+
<HoveredIdContext.Consumer>
|
|
18
|
+
{(contexts) => <Component {...props} {...contexts} />}
|
|
19
|
+
</HoveredIdContext.Consumer>
|
|
20
|
+
);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export const hoveredAnnEasyStore = store({
|
|
24
|
+
hoveredAnn: undefined,
|
|
25
|
+
selectedAnn: undefined
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
export default compose(
|
|
29
|
+
withHoveredIdFromContext,
|
|
30
|
+
branch(
|
|
31
|
+
({ noRedux }) => !noRedux,
|
|
32
|
+
connect(function (
|
|
33
|
+
state,
|
|
34
|
+
{
|
|
35
|
+
id,
|
|
36
|
+
editorName = "StandaloneEditor",
|
|
37
|
+
className,
|
|
38
|
+
hoveredId: hoveredIdFromContext,
|
|
39
|
+
passHoveredId
|
|
40
|
+
}
|
|
41
|
+
) {
|
|
42
|
+
if (!editorName) {
|
|
43
|
+
console.warn(
|
|
44
|
+
"please pass an editorName to the withHover() wrapped component"
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
const editorState = state.VectorEditor[editorName] || {};
|
|
48
|
+
const hoveredId = editorState.hoveredAnnotation || hoveredIdFromContext; //we can pass a hoveredId from context in order to still use the hover functionality without being connected to redux! see http://localhost:3344/#/SimpleCircularOrLinearView for an example
|
|
49
|
+
const isIdHashmap = typeof id === "object";
|
|
50
|
+
|
|
51
|
+
const hovered = !!(isIdHashmap ? id[hoveredId] : hoveredId === id);
|
|
52
|
+
const newClassName = classnames(className, "hoverHelper", {
|
|
53
|
+
veAnnotationHovered: hovered
|
|
54
|
+
});
|
|
55
|
+
const toReturn = {
|
|
56
|
+
hovered,
|
|
57
|
+
className: newClassName
|
|
58
|
+
};
|
|
59
|
+
if (hovered && passHoveredId) {
|
|
60
|
+
//only pass hoveredId if it is hovered
|
|
61
|
+
toReturn.hoveredId = hoveredId;
|
|
62
|
+
}
|
|
63
|
+
return toReturn;
|
|
64
|
+
},
|
|
65
|
+
hoveredAnnotationActions)
|
|
66
|
+
),
|
|
67
|
+
withHandlers({
|
|
68
|
+
onMouseOver: (props) => (e) => {
|
|
69
|
+
const { editorName, id, hoveredAnnotationUpdate } = props;
|
|
70
|
+
const isIdHashmap = typeof id === "object";
|
|
71
|
+
const idToPass = isIdHashmap ? Object.keys(id)[0] : id;
|
|
72
|
+
const annot = props?.annotation || props?.label?.annotation;
|
|
73
|
+
if (modifiableTypes.includes(annot?.annotationTypePlural)) {
|
|
74
|
+
hoveredAnnEasyStore.hoveredAnn = annot;
|
|
75
|
+
}
|
|
76
|
+
//because the calling onHover can slow things down, we disable it if dragging or scrolling
|
|
77
|
+
if (window.__veDragging || window.__veScrolling) return;
|
|
78
|
+
e.stopPropagation(); //this is important otherwise hovering labels inside circular view label groups won't work
|
|
79
|
+
hoveredAnnotationUpdate &&
|
|
80
|
+
hoveredAnnotationUpdate(idToPass, { editorName });
|
|
81
|
+
},
|
|
82
|
+
onMouseLeave: (props) => (e) => {
|
|
83
|
+
hoveredAnnEasyStore.hoveredAnn = undefined;
|
|
84
|
+
const { editorName, hoveredAnnotationClear } = props;
|
|
85
|
+
e.stopPropagation();
|
|
86
|
+
if (window.__veDragging || window.__veScrolling) return;
|
|
87
|
+
hoveredAnnotationClear && hoveredAnnotationClear(true, { editorName });
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
);
|
package/src/index.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import "@fontsource/ubuntu-mono";
|
|
2
|
+
import { FocusStyleManager } from "@blueprintjs/core";
|
|
3
|
+
import { showContextMenu } from "@teselagen/ui";
|
|
4
|
+
import "./createVectorEditor";
|
|
5
|
+
import "./style.css";
|
|
6
|
+
export { getUserGroupLabel } from "./CutsiteFilter/AdditionalCutsiteInfoDialog";
|
|
7
|
+
|
|
8
|
+
window.tgCreateMenu = showContextMenu;
|
|
9
|
+
// window.tgCreateMenu = (menu, e, e2) => {
|
|
10
|
+
// (e||e2).stopPropagation()
|
|
11
|
+
// (e || e2)
|
|
12
|
+
// } //add this to the window so people can easily override the default context menus
|
|
13
|
+
|
|
14
|
+
FocusStyleManager.onlyShowFocusOnTabs();
|
|
15
|
+
export { getGaps } from "./AlignmentView/getGaps";
|
|
16
|
+
export { default as createVectorEditor } from "./createVectorEditor";
|
|
17
|
+
export { default as withEditorProps, connectToEditor } from "./withEditorProps";
|
|
18
|
+
export { default as withEditorInteractions } from "./withEditorInteractions";
|
|
19
|
+
export { default as specialCutsiteFilterOptions } from "./constants/specialCutsiteFilterOptions";
|
|
20
|
+
//export components
|
|
21
|
+
export {
|
|
22
|
+
default as CircularView,
|
|
23
|
+
CircularView as CircularViewUnconnected
|
|
24
|
+
} from "./CircularView";
|
|
25
|
+
export { default as SimpleCircularOrLinearView } from "./SimpleCircularOrLinearView";
|
|
26
|
+
export { default as RowView, RowView as RowViewUnconnected } from "./RowView";
|
|
27
|
+
export { default as RowItem } from "./RowItem";
|
|
28
|
+
export { default as Editor, Editor as EditorUnconnected } from "./Editor";
|
|
29
|
+
export { ToolBar } from "./ToolBar";
|
|
30
|
+
export {
|
|
31
|
+
default as CutsiteFilter,
|
|
32
|
+
CutsiteFilter as CutsiteFilterUnconnected
|
|
33
|
+
} from "./CutsiteFilter";
|
|
34
|
+
export {
|
|
35
|
+
default as LinearView,
|
|
36
|
+
LinearView as LinearViewUnconnected
|
|
37
|
+
} from "./LinearView";
|
|
38
|
+
export {
|
|
39
|
+
default as StatusBar,
|
|
40
|
+
StatusBar as StatusBarUnconnected
|
|
41
|
+
} from "./StatusBar";
|
|
42
|
+
export {
|
|
43
|
+
default as DigestTool,
|
|
44
|
+
DigestTool as DigestToolUnconnected
|
|
45
|
+
} from "./DigestTool/DigestTool";
|
|
46
|
+
export { default as withHover } from "./helperComponents/withHover";
|
|
47
|
+
|
|
48
|
+
export {
|
|
49
|
+
default as vectorEditorReducer,
|
|
50
|
+
vectorEditorMiddleware,
|
|
51
|
+
actions
|
|
52
|
+
} from "./redux";
|
|
53
|
+
export { default as updateEditor } from "./updateEditor";
|
|
54
|
+
export { default as addAlignment } from "./addAlignment";
|
|
55
|
+
|
|
56
|
+
export { default as getRangeAnglesSpecial } from "./CircularView/getRangeAnglesSpecial";
|
|
57
|
+
export { default as PositionAnnotationOnCircle } from "./CircularView/PositionAnnotationOnCircle";
|
|
58
|
+
export { default as EnzymeViewer } from "./EnzymeViewer";
|
|
59
|
+
export { default as AlignmentView } from "./AlignmentView";
|
|
60
|
+
export { default as getOveHotkeyDefs } from "./commands/getOveHotkeyDefs";
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import {
|
|
2
|
+
tidyUpSequenceData /* generateSequenceData */,
|
|
3
|
+
condensePairwiseAlignmentDifferences
|
|
4
|
+
} from "@teselagen/sequence-utils";
|
|
5
|
+
import { convertBasePosTraceToPerBpTrace } from "@teselagen/bio-parsers";
|
|
6
|
+
import shortid from "shortid";
|
|
7
|
+
|
|
8
|
+
import addDashesForMatchStartAndEndForTracks from "./utils/addDashesForMatchStartAndEndForTracks";
|
|
9
|
+
|
|
10
|
+
import { /* createReducer, */ createAction } from "redux-act";
|
|
11
|
+
import { omit } from "lodash";
|
|
12
|
+
|
|
13
|
+
const alignmentAnnotationSettings = {
|
|
14
|
+
axis: true,
|
|
15
|
+
axisNumbers: true,
|
|
16
|
+
chromatogram: false,
|
|
17
|
+
dnaColors: false,
|
|
18
|
+
features: false,
|
|
19
|
+
parts: false,
|
|
20
|
+
reverseSequence: false,
|
|
21
|
+
sequence: true,
|
|
22
|
+
translations: true,
|
|
23
|
+
orfs: false,
|
|
24
|
+
orfTranslations: false,
|
|
25
|
+
cdsFeatureTranslations: false,
|
|
26
|
+
cutsites: false,
|
|
27
|
+
primers: false,
|
|
28
|
+
compactNames: false
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const defaultVisibilities = {
|
|
32
|
+
alignmentAnnotationVisibility: alignmentAnnotationSettings,
|
|
33
|
+
pairwise_alignmentAnnotationVisibility: alignmentAnnotationSettings,
|
|
34
|
+
alignmentAnnotationLabelVisibility: {
|
|
35
|
+
features: false,
|
|
36
|
+
parts: false,
|
|
37
|
+
cutsites: false
|
|
38
|
+
},
|
|
39
|
+
pairwise_alignmentAnnotationLabelVisibility: {
|
|
40
|
+
features: false,
|
|
41
|
+
parts: false,
|
|
42
|
+
cutsites: false
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const defaultVisibilityTypes = Object.keys(defaultVisibilities);
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
defaultVisibilityTypes.forEach((type) => {
|
|
49
|
+
const newVal = JSON.parse(window.localStorage.getItem(type));
|
|
50
|
+
if (newVal)
|
|
51
|
+
defaultVisibilities[type] = {
|
|
52
|
+
...defaultVisibilities[type],
|
|
53
|
+
...newVal
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
} catch (e) {
|
|
57
|
+
console.error("error setting localstorage visibility config", e);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// ------------------------------------
|
|
61
|
+
// Actions
|
|
62
|
+
// ------------------------------------
|
|
63
|
+
export const upsertAlignmentRun = createAction("UPSERT_ALIGNMENT_RUN");
|
|
64
|
+
export const removeAlignmentFromRedux = createAction(
|
|
65
|
+
"REMOVE_ALIGNMENT_FROM_REDUX"
|
|
66
|
+
);
|
|
67
|
+
export const updateAlignmentViewVisibility = createAction(
|
|
68
|
+
"UPDATE_ALIGNMENT_VIEW_VISIBILITY"
|
|
69
|
+
);
|
|
70
|
+
export const alignmentRunUpdate = createAction("ALIGNMENT_RUN_UPDATE");
|
|
71
|
+
|
|
72
|
+
const highlightRangeProps = {
|
|
73
|
+
color: "red",
|
|
74
|
+
hideCarets: true,
|
|
75
|
+
ignoreGaps: true
|
|
76
|
+
};
|
|
77
|
+
function addHighlightedDifferences(alignmentTracks) {
|
|
78
|
+
return alignmentTracks.map((track) => {
|
|
79
|
+
if (track.isUnmapped) {
|
|
80
|
+
return track;
|
|
81
|
+
}
|
|
82
|
+
const sequenceData = tidyUpSequenceData(track.sequenceData);
|
|
83
|
+
const matchHighlightRanges = getRangeMatchesBetweenTemplateAndNonTemplate(
|
|
84
|
+
alignmentTracks[0].alignmentData.sequence,
|
|
85
|
+
track.alignmentData.sequence
|
|
86
|
+
);
|
|
87
|
+
// .filter by the user-specified mismatch overrides (initially [])
|
|
88
|
+
const mismatches = matchHighlightRanges.filter(({ isMatch }) => !isMatch);
|
|
89
|
+
return {
|
|
90
|
+
...track,
|
|
91
|
+
sequenceData,
|
|
92
|
+
matchHighlightRanges,
|
|
93
|
+
additionalSelectionLayers: matchHighlightRanges
|
|
94
|
+
.filter(({ isMatch }) => !isMatch)
|
|
95
|
+
.map((range) => {
|
|
96
|
+
return { ...range, ...highlightRangeProps };
|
|
97
|
+
}),
|
|
98
|
+
mismatches
|
|
99
|
+
};
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// alignmentTracks = addHighlightedDifferences(alignmentTracks);
|
|
104
|
+
|
|
105
|
+
// ------------------------------------
|
|
106
|
+
// Reducer
|
|
107
|
+
// ------------------------------------
|
|
108
|
+
|
|
109
|
+
export default (state = {}, { payload = {}, type }) => {
|
|
110
|
+
if (type === "ALIGNMENT_RUN_UPDATE") {
|
|
111
|
+
const { alignmentId } = payload;
|
|
112
|
+
const newState = {
|
|
113
|
+
...state,
|
|
114
|
+
[alignmentId]: {
|
|
115
|
+
...state[alignmentId],
|
|
116
|
+
...payload
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
return newState;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (type === "UPDATE_ALIGNMENT_VIEW_VISIBILITY") {
|
|
123
|
+
defaultVisibilityTypes.forEach((type) => {
|
|
124
|
+
if (
|
|
125
|
+
(type.startsWith("pairwise_") && payload.pairwiseAlignments) ||
|
|
126
|
+
(!type.startsWith("pairwise_") && !payload.pairwiseAlignments)
|
|
127
|
+
) {
|
|
128
|
+
defaultVisibilities[type] = {
|
|
129
|
+
...defaultVisibilities[type],
|
|
130
|
+
...payload[type.replace("pairwise_", "")]
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
localStorage.setItem(
|
|
134
|
+
type,
|
|
135
|
+
JSON.stringify({
|
|
136
|
+
...defaultVisibilities[type],
|
|
137
|
+
...payload[type.replace("pairwise_", "")]
|
|
138
|
+
})
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
return {
|
|
143
|
+
...state,
|
|
144
|
+
[payload.id]: { ...payload }
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
if (type === "UPSERT_ALIGNMENT_RUN") {
|
|
148
|
+
const { id } = payload;
|
|
149
|
+
const payloadToUse = {
|
|
150
|
+
stateTrackingId: state[id]?.stateTrackingId ? shortid() : "initialLoadId",
|
|
151
|
+
alignmentType: state[id]?.alignmentType,
|
|
152
|
+
...payload,
|
|
153
|
+
//assign default visibilities
|
|
154
|
+
...defaultVisibilityTypes.reduce((acc, type) => {
|
|
155
|
+
if (
|
|
156
|
+
(type.startsWith("pairwise_") && payload.pairwiseAlignments) ||
|
|
157
|
+
(!type.startsWith("pairwise_") && !payload.pairwiseAlignments)
|
|
158
|
+
) {
|
|
159
|
+
acc[type.replace("pairwise_", "")] = {
|
|
160
|
+
...defaultVisibilities[type],
|
|
161
|
+
...payload[type.replace("pairwise_", "")]
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
return acc;
|
|
165
|
+
}, {})
|
|
166
|
+
};
|
|
167
|
+
if (payloadToUse.pairwiseAlignments) {
|
|
168
|
+
if (
|
|
169
|
+
payloadToUse.pairwiseAlignments[0][0].alignmentData.matchStart !==
|
|
170
|
+
undefined
|
|
171
|
+
) {
|
|
172
|
+
payloadToUse.pairwiseAlignments = payloadToUse.pairwiseAlignments.map(
|
|
173
|
+
addDashesForMatchStartAndEndForTracks
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
const templateSeq = payloadToUse.pairwiseAlignments[0][0];
|
|
177
|
+
//we need to get all of the sequences in a single alignment (turning inserts into single BP red highlights)
|
|
178
|
+
const pairwiseOverviewAlignmentTracks = [
|
|
179
|
+
{
|
|
180
|
+
//add the template seq as the first track in the Pairwise Alignment Overview
|
|
181
|
+
...templateSeq,
|
|
182
|
+
sequenceData: tidyUpSequenceData(templateSeq.sequenceData),
|
|
183
|
+
alignmentData: { sequence: templateSeq.sequenceData.sequence } //remove the gaps from the template sequence
|
|
184
|
+
}
|
|
185
|
+
]; // start with just the template seq in there!
|
|
186
|
+
|
|
187
|
+
payloadToUse.pairwiseAlignments.forEach(([template, alignedSeq]) => {
|
|
188
|
+
const condensedSeq = condensePairwiseAlignmentDifferences(
|
|
189
|
+
template.alignmentData.sequence,
|
|
190
|
+
alignedSeq.alignmentData.sequence
|
|
191
|
+
);
|
|
192
|
+
let re = /r+/gi;
|
|
193
|
+
let match;
|
|
194
|
+
const additionalSelectionLayers = [];
|
|
195
|
+
while ((match = re.exec(condensedSeq)) != null) {
|
|
196
|
+
additionalSelectionLayers.push({
|
|
197
|
+
start: match.index,
|
|
198
|
+
end: match.index + match[0].length - 1,
|
|
199
|
+
...highlightRangeProps
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
re = /g+/gi;
|
|
203
|
+
// let match;
|
|
204
|
+
while ((match = re.exec(condensedSeq)) != null) {
|
|
205
|
+
additionalSelectionLayers.push({
|
|
206
|
+
start: match.index,
|
|
207
|
+
end: match.index + match[0].length - 1,
|
|
208
|
+
...highlightRangeProps,
|
|
209
|
+
color: "grey"
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const alignedSeqMinusInserts = {
|
|
214
|
+
...alignedSeq,
|
|
215
|
+
sequenceData: {
|
|
216
|
+
...tidyUpSequenceData(alignedSeq.sequenceData),
|
|
217
|
+
sequence: template.sequenceData.sequence
|
|
218
|
+
},
|
|
219
|
+
additionalSelectionLayers,
|
|
220
|
+
alignmentData: {
|
|
221
|
+
sequence: condensedSeq
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
pairwiseOverviewAlignmentTracks.push(alignedSeqMinusInserts);
|
|
225
|
+
});
|
|
226
|
+
payloadToUse.pairwiseOverviewAlignmentTracks =
|
|
227
|
+
pairwiseOverviewAlignmentTracks;
|
|
228
|
+
payloadToUse.pairwiseAlignments = payloadToUse.pairwiseAlignments.map(
|
|
229
|
+
addHighlightedDifferences
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
if (payloadToUse.alignmentTracks) {
|
|
233
|
+
payloadToUse.alignmentTracks = addHighlightedDifferences(
|
|
234
|
+
payloadToUse.alignmentTracks
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
//check for issues
|
|
238
|
+
let hasError = checkForIssues(
|
|
239
|
+
payloadToUse.alignmentTracks,
|
|
240
|
+
payload.alignmentType
|
|
241
|
+
);
|
|
242
|
+
(payloadToUse.pairwiseAlignments || []).forEach((alignment) => {
|
|
243
|
+
const error = alignment;
|
|
244
|
+
if (error) {
|
|
245
|
+
hasError = error;
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
return {
|
|
249
|
+
...state,
|
|
250
|
+
[payload.id]: {
|
|
251
|
+
...payloadToUse,
|
|
252
|
+
hasError
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
if (type === "REMOVE_ALIGNMENT_FROM_REDUX") {
|
|
257
|
+
const { id } = payload;
|
|
258
|
+
state = omit(state, [id]);
|
|
259
|
+
}
|
|
260
|
+
return state;
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
//returns an array like so: [{start: 0, end: 4, isMatch: false}, {start,end,isMatch} ... etc]
|
|
264
|
+
function getRangeMatchesBetweenTemplateAndNonTemplate(tempSeq, nonTempSeq) {
|
|
265
|
+
//assume all sequences are the same length (with gap characters "-" in some places)
|
|
266
|
+
//loop through all non template sequences and compare them with the template
|
|
267
|
+
|
|
268
|
+
const seqLength = nonTempSeq.length;
|
|
269
|
+
const ranges = [];
|
|
270
|
+
// const startIndex = "".match/[-]/ Math.max(0, .indexOf("-"));
|
|
271
|
+
const nonTempSeqWithoutLeadingDashes = nonTempSeq.replace(/^-+/g, "");
|
|
272
|
+
const nonTempSeqWithoutTrailingDashes = nonTempSeq.replace(/-+$/g, "");
|
|
273
|
+
|
|
274
|
+
const startIndex = seqLength - nonTempSeqWithoutLeadingDashes.length;
|
|
275
|
+
const endIndex =
|
|
276
|
+
seqLength - (seqLength - nonTempSeqWithoutTrailingDashes.length);
|
|
277
|
+
for (let index = startIndex; index < endIndex; index++) {
|
|
278
|
+
const isMatch =
|
|
279
|
+
tempSeq[index].toLowerCase() === nonTempSeq[index].toLowerCase();
|
|
280
|
+
const previousRange = ranges[ranges.length - 1];
|
|
281
|
+
if (previousRange) {
|
|
282
|
+
if (previousRange.isMatch === isMatch) {
|
|
283
|
+
previousRange.end++;
|
|
284
|
+
} else {
|
|
285
|
+
ranges.push({
|
|
286
|
+
start: index,
|
|
287
|
+
end: index,
|
|
288
|
+
isMatch
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
} else {
|
|
292
|
+
ranges.push({
|
|
293
|
+
start: startIndex,
|
|
294
|
+
end: startIndex,
|
|
295
|
+
isMatch
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return ranges;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
function checkForIssues(alignmentTracks, alignmentType) {
|
|
303
|
+
if (
|
|
304
|
+
!alignmentTracks ||
|
|
305
|
+
!alignmentTracks[0] ||
|
|
306
|
+
!alignmentTracks[0].alignmentData
|
|
307
|
+
) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const alignmentTrackLength = alignmentTracks[0].alignmentData.sequence.length;
|
|
312
|
+
let hasError;
|
|
313
|
+
alignmentTracks.some((track) => {
|
|
314
|
+
if (track.alignmentData.sequence.length !== alignmentTrackLength) {
|
|
315
|
+
console.error("incorrect length", alignmentTracks);
|
|
316
|
+
|
|
317
|
+
return "incorrect length";
|
|
318
|
+
}
|
|
319
|
+
if (
|
|
320
|
+
track.chromatogramData &&
|
|
321
|
+
track.sequenceData.sequence.length !==
|
|
322
|
+
track.chromatogramData.baseCalls.length
|
|
323
|
+
) {
|
|
324
|
+
console.error("incorrect chromatogram length", alignmentTracks);
|
|
325
|
+
|
|
326
|
+
return "incorrect chromatogram length";
|
|
327
|
+
}
|
|
328
|
+
if (track.chromatogramData && !track.chromatogramData.baseTraces) {
|
|
329
|
+
if (!track.chromatogramData.basePos) {
|
|
330
|
+
console.error("corrupted chromatogram data", alignmentTracks);
|
|
331
|
+
return "corrupted chromatogram data";
|
|
332
|
+
}
|
|
333
|
+
track.chromatogramData = convertBasePosTraceToPerBpTrace(
|
|
334
|
+
track.chromatogramData
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
if (
|
|
338
|
+
alignmentType !== "Parallel Part Creation" &&
|
|
339
|
+
track.sequenceData.sequence.length !==
|
|
340
|
+
track.alignmentData.sequence.replace(/-/g, "").length
|
|
341
|
+
) {
|
|
342
|
+
console.error(
|
|
343
|
+
"sequence data length does not match alignment data w/o gaps"
|
|
344
|
+
);
|
|
345
|
+
console.error(
|
|
346
|
+
"track.sequenceData.sequence:",
|
|
347
|
+
track.sequenceData.sequence
|
|
348
|
+
);
|
|
349
|
+
console.error(
|
|
350
|
+
"track.sequenceData.sequence.length:",
|
|
351
|
+
track.sequenceData.sequence.length
|
|
352
|
+
);
|
|
353
|
+
console.error(
|
|
354
|
+
"track.alignmentData.sequence:",
|
|
355
|
+
track.alignmentData.sequence
|
|
356
|
+
);
|
|
357
|
+
console.error(
|
|
358
|
+
'track.alignmentData.sequence.replace(/-/g,""):',
|
|
359
|
+
track.alignmentData.sequence.replace(/-/g, "")
|
|
360
|
+
);
|
|
361
|
+
console.error(
|
|
362
|
+
'track.alignmentData.sequence.replace(/-/g,"").length:',
|
|
363
|
+
track.alignmentData.sequence.replace(/-/g, "").length
|
|
364
|
+
);
|
|
365
|
+
hasError = "sequence data length does not match alignment data w/o gaps";
|
|
366
|
+
return true;
|
|
367
|
+
}
|
|
368
|
+
return false;
|
|
369
|
+
});
|
|
370
|
+
if (hasError) {
|
|
371
|
+
return hasError;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
//./caretPosition.js
|
|
2
|
+
import createAction from "./utils/createMetaAction";
|
|
3
|
+
import createMergedDefaultStateReducer from "./utils/createMergedDefaultStateReducer";
|
|
4
|
+
|
|
5
|
+
const visibilityInitialValues = {
|
|
6
|
+
features: true,
|
|
7
|
+
parts: true,
|
|
8
|
+
primers: true,
|
|
9
|
+
cutsites: true,
|
|
10
|
+
assemblyPieces: true,
|
|
11
|
+
lineageAnnotations: true,
|
|
12
|
+
warnings: true
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// ------------------------------------
|
|
16
|
+
// Actions
|
|
17
|
+
// ------------------------------------
|
|
18
|
+
export const annotationLabelVisibilityToggle = createAction(
|
|
19
|
+
"annotationLabelVisibilityToggle"
|
|
20
|
+
);
|
|
21
|
+
export const annotationLabelVisibilityShow = createAction(
|
|
22
|
+
"annotationLabelVisibilityShow"
|
|
23
|
+
);
|
|
24
|
+
export const annotationLabelVisibilityHide = createAction(
|
|
25
|
+
"annotationLabelVisibilityHide"
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
// ------------------------------------
|
|
29
|
+
// Reducer
|
|
30
|
+
// ------------------------------------
|
|
31
|
+
export default createMergedDefaultStateReducer(
|
|
32
|
+
{
|
|
33
|
+
[annotationLabelVisibilityToggle]: (state, payload) => {
|
|
34
|
+
return {
|
|
35
|
+
...state,
|
|
36
|
+
[payload]: !state[payload]
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
[annotationLabelVisibilityShow]: (state, payload) => {
|
|
40
|
+
return {
|
|
41
|
+
...state,
|
|
42
|
+
[payload]: true
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
[annotationLabelVisibilityHide]: (state, payload) => {
|
|
46
|
+
return {
|
|
47
|
+
...state,
|
|
48
|
+
[payload]: false
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
visibilityInitialValues
|
|
53
|
+
);
|