@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,196 @@
|
|
|
1
|
+
import { merge } from "lodash";
|
|
2
|
+
import * as createYourOwnEnzyme from "./createYourOwnEnzyme";
|
|
3
|
+
import * as showGCContent from "./showGCContent";
|
|
4
|
+
import * as annotationLabelVisibility from "./annotationLabelVisibility";
|
|
5
|
+
import * as annotationsToSupport from "./annotationsToSupport";
|
|
6
|
+
import * as annotationVisibility from "./annotationVisibility";
|
|
7
|
+
import * as caretPosition from "./caretPosition";
|
|
8
|
+
import * as copyOptions from "./copyOptions";
|
|
9
|
+
import * as deletionLayers from "./deletionLayers";
|
|
10
|
+
import * as digestTool from "./digestTool";
|
|
11
|
+
import * as findTool from "./findTool";
|
|
12
|
+
import * as toolBar from "./toolBar";
|
|
13
|
+
import * as frameTranslations from "./frameTranslations";
|
|
14
|
+
import * as hoveredAnnotation from "./hoveredAnnotation";
|
|
15
|
+
import * as minimumOrfSize from "./minimumOrfSize";
|
|
16
|
+
import * as alignments from "./alignments";
|
|
17
|
+
import * as panelsShown from "./panelsShown";
|
|
18
|
+
import * as propertiesTool from "./propertiesTool";
|
|
19
|
+
import * as lastSavedId from "./lastSavedId";
|
|
20
|
+
import * as readOnly from "./readOnly";
|
|
21
|
+
import * as versionHistory from "./versionHistory";
|
|
22
|
+
import * as replacementLayers from "./replacementLayers";
|
|
23
|
+
import * as restrictionEnzymes from "./restrictionEnzymes";
|
|
24
|
+
import * as selectedAnnotations from "./selectedAnnotations";
|
|
25
|
+
import * as selectionLayer from "./selectionLayer";
|
|
26
|
+
import * as sequenceDataHistory from "./sequenceDataHistory";
|
|
27
|
+
import * as sequenceData from "./sequenceData";
|
|
28
|
+
import * as useAdditionalOrfStartCodons from "./useAdditionalOrfStartCodons";
|
|
29
|
+
import * as uppercaseSequenceMapFont from "./uppercaseSequenceMapFont";
|
|
30
|
+
import * as charWidth from "./charWidth";
|
|
31
|
+
import * as labelLineIntensity from "./labelLineIntensity";
|
|
32
|
+
import * as labelSize from "./labelSize";
|
|
33
|
+
import * as featureLengthsToHide from "./featureLengthsToHide";
|
|
34
|
+
import * as primerLengthsToHide from "./primerLengthsToHide";
|
|
35
|
+
import * as partLengthsToHide from "./partLengthsToHide";
|
|
36
|
+
import * as selectedPartTags from "./selectedPartTags";
|
|
37
|
+
import { combineReducers } from "redux";
|
|
38
|
+
import createAction from "./utils/createMetaAction";
|
|
39
|
+
export { default as vectorEditorMiddleware } from "./middleware";
|
|
40
|
+
|
|
41
|
+
const subReducers = {
|
|
42
|
+
createYourOwnEnzyme,
|
|
43
|
+
annotationLabelVisibility,
|
|
44
|
+
annotationsToSupport,
|
|
45
|
+
annotationVisibility,
|
|
46
|
+
caretPosition,
|
|
47
|
+
copyOptions,
|
|
48
|
+
deletionLayers,
|
|
49
|
+
digestTool,
|
|
50
|
+
toolBar,
|
|
51
|
+
findTool,
|
|
52
|
+
frameTranslations,
|
|
53
|
+
hoveredAnnotation,
|
|
54
|
+
minimumOrfSize,
|
|
55
|
+
panelsShown,
|
|
56
|
+
propertiesTool,
|
|
57
|
+
lastSavedId,
|
|
58
|
+
readOnly,
|
|
59
|
+
versionHistory,
|
|
60
|
+
replacementLayers,
|
|
61
|
+
restrictionEnzymes,
|
|
62
|
+
selectedAnnotations,
|
|
63
|
+
selectionLayer,
|
|
64
|
+
sequenceDataHistory,
|
|
65
|
+
sequenceData,
|
|
66
|
+
useAdditionalOrfStartCodons,
|
|
67
|
+
charWidth,
|
|
68
|
+
uppercaseSequenceMapFont,
|
|
69
|
+
showGCContent,
|
|
70
|
+
labelLineIntensity,
|
|
71
|
+
labelSize,
|
|
72
|
+
partLengthsToHide,
|
|
73
|
+
primerLengthsToHide,
|
|
74
|
+
featureLengthsToHide,
|
|
75
|
+
selectedPartTags
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const vectorEditorInitialize = createAction("VECTOR_EDITOR_UPDATE");
|
|
79
|
+
const vectorEditorClear = createAction("VECTOR_EDITOR_CLEAR");
|
|
80
|
+
|
|
81
|
+
//export the actions for use elsewhere
|
|
82
|
+
export const actions = {
|
|
83
|
+
...Object.keys(subReducers).reduce(
|
|
84
|
+
(acc, k) => ({
|
|
85
|
+
...acc,
|
|
86
|
+
...subReducers[k]
|
|
87
|
+
}),
|
|
88
|
+
{}
|
|
89
|
+
),
|
|
90
|
+
...alignments,
|
|
91
|
+
vectorEditorInitialize,
|
|
92
|
+
vectorEditorClear
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const mergeDeepKeys = [];
|
|
96
|
+
//define the reducer
|
|
97
|
+
const reducers = {
|
|
98
|
+
...Object.keys(subReducers).reduce((acc, k) => {
|
|
99
|
+
if (
|
|
100
|
+
subReducers[k].default &&
|
|
101
|
+
subReducers[k].default.__shouldUseMergedState
|
|
102
|
+
) {
|
|
103
|
+
mergeDeepKeys.push(k);
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
...acc,
|
|
107
|
+
[k]: subReducers[k].default
|
|
108
|
+
};
|
|
109
|
+
}, {}),
|
|
110
|
+
instantiated: () => true
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
export const editorReducer = combineReducers(reducers);
|
|
114
|
+
const customDeepMerge = (state = {}, newState = {}) => {
|
|
115
|
+
return {
|
|
116
|
+
...state,
|
|
117
|
+
...newState,
|
|
118
|
+
...mergeDeepKeys.reduce((acc, key) => {
|
|
119
|
+
acc[key] = merge(state[key], newState[key]);
|
|
120
|
+
return acc;
|
|
121
|
+
}, {})
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
export default function reducerFactory(initialState = {}) {
|
|
126
|
+
// if (!initialState || !Object.keys(initialState).length) {
|
|
127
|
+
// throw new Error(
|
|
128
|
+
// "Please pass an initial state to the vector editor reducer like: {DemoEditor: {}}!"
|
|
129
|
+
// );
|
|
130
|
+
// }
|
|
131
|
+
return function (state = initialState, action) {
|
|
132
|
+
let editorNames;
|
|
133
|
+
const newState = {};
|
|
134
|
+
if (action.meta && action.meta.editorName) {
|
|
135
|
+
editorNames = Array.isArray(action.meta.editorName)
|
|
136
|
+
? action.meta.editorName
|
|
137
|
+
: [action.meta.editorName];
|
|
138
|
+
}
|
|
139
|
+
let stateToReturn;
|
|
140
|
+
if (editorNames) {
|
|
141
|
+
//we're dealing with an action specific to a given editor
|
|
142
|
+
editorNames.forEach(function (editorName) {
|
|
143
|
+
let currentState = state[editorName];
|
|
144
|
+
if (action.type === "VECTOR_EDITOR_UPDATE") {
|
|
145
|
+
//deep merge certain parts of the exisiting state with the new payload of props
|
|
146
|
+
//(if you want to do a clean wipe, use VECTOR_EDITOR_CLEAR)
|
|
147
|
+
currentState = customDeepMerge(state[editorName], action.payload);
|
|
148
|
+
}
|
|
149
|
+
if (action.type === "VECTOR_EDITOR_CLEAR") {
|
|
150
|
+
currentState = undefined;
|
|
151
|
+
}
|
|
152
|
+
newState[editorName] = editorReducer(currentState, action);
|
|
153
|
+
});
|
|
154
|
+
stateToReturn = {
|
|
155
|
+
...state,
|
|
156
|
+
...newState
|
|
157
|
+
};
|
|
158
|
+
} else {
|
|
159
|
+
//just a normal action
|
|
160
|
+
Object.keys(state).forEach(function (editorName) {
|
|
161
|
+
if (editorName === "__allEditorsOptions") return; //we deal with __allEditorsOptions below so don't pass it here
|
|
162
|
+
newState[editorName] = editorReducer(state[editorName], action);
|
|
163
|
+
});
|
|
164
|
+
stateToReturn = newState;
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
...stateToReturn,
|
|
168
|
+
//these are reducers that are not editor specific (aka shared across editor instances)
|
|
169
|
+
__allEditorsOptions: [
|
|
170
|
+
["createYourOwnEnzyme", createYourOwnEnzyme],
|
|
171
|
+
["uppercaseSequenceMapFont", uppercaseSequenceMapFont],
|
|
172
|
+
["showGCContent", showGCContent],
|
|
173
|
+
["labelLineIntensity", labelLineIntensity],
|
|
174
|
+
["labelSize", labelSize],
|
|
175
|
+
["alignments", alignments]
|
|
176
|
+
].reduce((acc, [key, val]) => {
|
|
177
|
+
acc[key] = val.default(
|
|
178
|
+
!state.__allEditorsOptions
|
|
179
|
+
? undefined
|
|
180
|
+
: state.__allEditorsOptions[key],
|
|
181
|
+
action
|
|
182
|
+
);
|
|
183
|
+
return acc;
|
|
184
|
+
}, {})
|
|
185
|
+
};
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// export const getBlankEditor = (state) => (state.blankEditor)
|
|
190
|
+
export const getEditorByName = (state, editorName) => state[editorName];
|
|
191
|
+
|
|
192
|
+
// export default connect((state, ownProps) => {
|
|
193
|
+
// return {
|
|
194
|
+
// toggled: state.VectorEditor[ownProps.editorName].annotationVisibility.features
|
|
195
|
+
// }
|
|
196
|
+
// })()
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createReducer } from "redux-act";
|
|
2
|
+
|
|
3
|
+
import createAction from "./utils/createMetaAction";
|
|
4
|
+
|
|
5
|
+
// ------------------------------------
|
|
6
|
+
// Actions
|
|
7
|
+
// ------------------------------------
|
|
8
|
+
export const changeLabelLineIntensity = createAction(
|
|
9
|
+
"changeLabelLineIntensity"
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
const newVal = window.localStorage.getItem("labelLineIntensity");
|
|
13
|
+
|
|
14
|
+
// ------------------------------------
|
|
15
|
+
// Reducer
|
|
16
|
+
// ------------------------------------
|
|
17
|
+
export default createReducer(
|
|
18
|
+
{
|
|
19
|
+
[changeLabelLineIntensity]: (state, payload) => {
|
|
20
|
+
localStorage.setItem("labelLineIntensity", payload);
|
|
21
|
+
return payload;
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
newVal ? parseFloat(newVal) : 0.1 // 0.1 (low) || 0.4 (med) || 0.7 (high) || 1.0 (full)
|
|
25
|
+
);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createReducer } from "redux-act";
|
|
2
|
+
|
|
3
|
+
import createAction from "./utils/createMetaAction";
|
|
4
|
+
|
|
5
|
+
// ------------------------------------
|
|
6
|
+
// Actions
|
|
7
|
+
// ------------------------------------
|
|
8
|
+
export const changeLabelSize = createAction("changeLabelSize");
|
|
9
|
+
|
|
10
|
+
const newVal = window.localStorage.getItem("labelSize");
|
|
11
|
+
|
|
12
|
+
// ------------------------------------
|
|
13
|
+
// Reducer
|
|
14
|
+
// ------------------------------------
|
|
15
|
+
export default createReducer(
|
|
16
|
+
{
|
|
17
|
+
[changeLabelSize]: (state, payload) => {
|
|
18
|
+
localStorage.setItem("labelSize", payload);
|
|
19
|
+
return payload;
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
newVal ? parseInt(newVal) : 8 // 8 is 100% label size
|
|
23
|
+
);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//./caretPosition.js
|
|
2
|
+
import { createReducer } from "redux-act";
|
|
3
|
+
import createAction from "./utils/createMetaAction";
|
|
4
|
+
|
|
5
|
+
// ------------------------------------
|
|
6
|
+
// Actions
|
|
7
|
+
// ------------------------------------
|
|
8
|
+
export const lastSavedIdUpdate = createAction("lastSavedIdUpdate"); //NOTE!!:: second argument sanitizes actions so no payload is passed
|
|
9
|
+
|
|
10
|
+
// ------------------------------------
|
|
11
|
+
// Reducer
|
|
12
|
+
// ------------------------------------
|
|
13
|
+
export default createReducer(
|
|
14
|
+
{
|
|
15
|
+
[lastSavedIdUpdate]: (state, payload) => {
|
|
16
|
+
return payload;
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
null
|
|
20
|
+
);
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
//vectorEditorMiddleware
|
|
2
|
+
//used to add undo/redo abilities to OVE
|
|
3
|
+
|
|
4
|
+
// To Batch actions together use this api:
|
|
5
|
+
// deleteFeature([id1, id2], {
|
|
6
|
+
// batchUndoStart: true
|
|
7
|
+
// });
|
|
8
|
+
// upsertFeature(
|
|
9
|
+
// {
|
|
10
|
+
// ...feat1,
|
|
11
|
+
// id: uuid(),
|
|
12
|
+
// start: start - 1,
|
|
13
|
+
// end: end - 1,
|
|
14
|
+
// name
|
|
15
|
+
// },
|
|
16
|
+
// {
|
|
17
|
+
// batchUndoEnd: true
|
|
18
|
+
// }
|
|
19
|
+
// );
|
|
20
|
+
|
|
21
|
+
export default (store) => (next) => (action) => {
|
|
22
|
+
if (action.meta && action.meta.disregardUndo) {
|
|
23
|
+
return next(action);
|
|
24
|
+
}
|
|
25
|
+
const disregardUndo = true;
|
|
26
|
+
if (action.type === "VE_UNDO" || action.type === "VE_REDO") {
|
|
27
|
+
const { VectorEditor } = store.getState();
|
|
28
|
+
const editorName = action.meta.editorName;
|
|
29
|
+
const editorState = VectorEditor[editorName];
|
|
30
|
+
const stack =
|
|
31
|
+
editorState.sequenceDataHistory[
|
|
32
|
+
action.type === "VE_UNDO" ? "past" : "future"
|
|
33
|
+
] || [];
|
|
34
|
+
const stateToUse = stack[stack.length - 1];
|
|
35
|
+
store.dispatch({
|
|
36
|
+
type: action.type === "VE_UNDO" ? "VE_UNDO_META" : "VE_REDO_META",
|
|
37
|
+
payload: {
|
|
38
|
+
sequenceData: editorState.sequenceData,
|
|
39
|
+
selectionLayer: editorState.selectionLayer,
|
|
40
|
+
caretPosition: editorState.caretPosition
|
|
41
|
+
},
|
|
42
|
+
meta: { editorName, disregardUndo }
|
|
43
|
+
});
|
|
44
|
+
store.dispatch({
|
|
45
|
+
type: "SEQUENCE_DATA_UPDATE",
|
|
46
|
+
payload: stateToUse.sequenceData,
|
|
47
|
+
meta: { editorName, disregardUndo }
|
|
48
|
+
});
|
|
49
|
+
if (stateToUse.caretPosition > -1) {
|
|
50
|
+
store.dispatch({
|
|
51
|
+
type: "CARET_POSITION_UPDATE",
|
|
52
|
+
payload: stateToUse.caretPosition,
|
|
53
|
+
meta: { editorName, disregardUndo }
|
|
54
|
+
});
|
|
55
|
+
} else {
|
|
56
|
+
store.dispatch({
|
|
57
|
+
type: "SELECTION_LAYER_UPDATE",
|
|
58
|
+
payload: { ...stateToUse.selectionLayer, forceUpdate: Math.random() },
|
|
59
|
+
meta: { editorName, disregardUndo }
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
store.dispatch({
|
|
63
|
+
type: "VE_SEQUENCE_CHANGED", //used for external autosave functionality
|
|
64
|
+
payload: {
|
|
65
|
+
sequenceData: stateToUse.sequenceData,
|
|
66
|
+
editorName
|
|
67
|
+
},
|
|
68
|
+
meta: { editorName, disregardUndo: true }
|
|
69
|
+
});
|
|
70
|
+
return next(action);
|
|
71
|
+
} else {
|
|
72
|
+
//pass batchUndoStart, batchUndoMiddle and batchUndoEnd to group actions together
|
|
73
|
+
const { batchUndoEnd, batchUndoStart, batchUndoMiddle } = action.meta || {};
|
|
74
|
+
//get editor state(s)
|
|
75
|
+
const OldVectorEditor = store.getState().VectorEditor;
|
|
76
|
+
const result = next(action);
|
|
77
|
+
const NewVectorEditor = store.getState().VectorEditor;
|
|
78
|
+
Object.keys(NewVectorEditor).forEach((editorName) => {
|
|
79
|
+
const newEditorState = NewVectorEditor[editorName];
|
|
80
|
+
const oldEditorState = OldVectorEditor[editorName];
|
|
81
|
+
if (
|
|
82
|
+
oldEditorState &&
|
|
83
|
+
oldEditorState.sequenceData &&
|
|
84
|
+
oldEditorState.sequenceData !== newEditorState.sequenceData
|
|
85
|
+
) {
|
|
86
|
+
const { sequenceData, selectionLayer, caretPosition } = oldEditorState;
|
|
87
|
+
!batchUndoEnd &&
|
|
88
|
+
!batchUndoMiddle &&
|
|
89
|
+
store.dispatch({
|
|
90
|
+
type: "ADD_TO_UNDO_STACK",
|
|
91
|
+
payload: {
|
|
92
|
+
selectionLayer,
|
|
93
|
+
sequenceData,
|
|
94
|
+
caretPosition
|
|
95
|
+
},
|
|
96
|
+
meta: { editorName, disregardUndo }
|
|
97
|
+
});
|
|
98
|
+
!batchUndoStart &&
|
|
99
|
+
!batchUndoMiddle &&
|
|
100
|
+
store.dispatch({
|
|
101
|
+
type: "VE_SEQUENCE_CHANGED", //used for external autosave functionality
|
|
102
|
+
payload: {
|
|
103
|
+
sequenceData: newEditorState.sequenceData,
|
|
104
|
+
editorName
|
|
105
|
+
},
|
|
106
|
+
meta: { editorName, disregardUndo: true }
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//./caretPosition.js
|
|
2
|
+
import { createReducer } from "redux-act";
|
|
3
|
+
import createAction from "./utils/createMetaAction";
|
|
4
|
+
|
|
5
|
+
// ------------------------------------
|
|
6
|
+
// Actions
|
|
7
|
+
// ------------------------------------
|
|
8
|
+
export const minimumOrfSizeUpdate = createAction("minimumOrfSizeUpdate");
|
|
9
|
+
|
|
10
|
+
// ------------------------------------
|
|
11
|
+
// Reducer
|
|
12
|
+
// ------------------------------------
|
|
13
|
+
export default createReducer(
|
|
14
|
+
{
|
|
15
|
+
[minimumOrfSizeUpdate]: (state, payload) => {
|
|
16
|
+
return payload;
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
300
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
export function getMinimumOrfSize(state) {
|
|
23
|
+
return state;
|
|
24
|
+
}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { map, flatMap } from "lodash";
|
|
2
|
+
import { createReducer } from "redux-act";
|
|
3
|
+
import createAction from "./utils/createMetaAction";
|
|
4
|
+
import { removeItem } from "../utils/arrayUtils";
|
|
5
|
+
import immer from "immer";
|
|
6
|
+
|
|
7
|
+
//manages which tab panels are shown in the editor
|
|
8
|
+
|
|
9
|
+
// ------------------------------------
|
|
10
|
+
// Actions
|
|
11
|
+
// ------------------------------------
|
|
12
|
+
export const panelsShownUpdate = createAction("PANELS_SHOWN_UPDATE");
|
|
13
|
+
export const addPanelIfItDoesntAlreadyExist = createAction(
|
|
14
|
+
"addPanelIfItDoesntAlreadyExist"
|
|
15
|
+
);
|
|
16
|
+
export const togglePanelFullScreen = createAction("togglePanelFullScreen");
|
|
17
|
+
export const collapsePanel = createAction("collapsePanel");
|
|
18
|
+
export const closePanel = createAction("closePanel");
|
|
19
|
+
export const _collapseSplitScreen = createAction("_collapseSplitScreen");
|
|
20
|
+
export const setPanelAsActive = createAction("setPanelAsActive");
|
|
21
|
+
export const flipActiveTabFromLinearOrCircularIfNecessary = createAction(
|
|
22
|
+
"flipActiveTabFromLinearOrCircularIfNecessary"
|
|
23
|
+
);
|
|
24
|
+
export const expandTabToSplitScreen = createAction("expandTabToSplitScreen");
|
|
25
|
+
export const propertiesViewOpen = (unused, meta) => {
|
|
26
|
+
return setPanelAsActive("properties", meta);
|
|
27
|
+
};
|
|
28
|
+
export const createNewDigest = (unused, meta) => {
|
|
29
|
+
return (dispatch) => {
|
|
30
|
+
dispatch(
|
|
31
|
+
addPanelIfItDoesntAlreadyExist(
|
|
32
|
+
{
|
|
33
|
+
id: "digestTool",
|
|
34
|
+
name: "New Digest",
|
|
35
|
+
active: true,
|
|
36
|
+
canClose: true
|
|
37
|
+
},
|
|
38
|
+
meta
|
|
39
|
+
)
|
|
40
|
+
);
|
|
41
|
+
dispatch(setPanelAsActive("digestTool", meta));
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
export const createNewPCR = (unused, meta) => {
|
|
45
|
+
return (dispatch) => {
|
|
46
|
+
dispatch(
|
|
47
|
+
addPanelIfItDoesntAlreadyExist(
|
|
48
|
+
{
|
|
49
|
+
id: "pcrTool",
|
|
50
|
+
name: "New PCR",
|
|
51
|
+
active: true,
|
|
52
|
+
canClose: true
|
|
53
|
+
},
|
|
54
|
+
meta
|
|
55
|
+
)
|
|
56
|
+
);
|
|
57
|
+
dispatch(setPanelAsActive("pcrTool", meta));
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export const createNewAlignment = (payload, meta) => {
|
|
62
|
+
return (dispatch) => {
|
|
63
|
+
dispatch(
|
|
64
|
+
addPanelIfItDoesntAlreadyExist(
|
|
65
|
+
{
|
|
66
|
+
type: "alignment",
|
|
67
|
+
name: "New Alignment",
|
|
68
|
+
active: true,
|
|
69
|
+
canClose: true,
|
|
70
|
+
...payload
|
|
71
|
+
},
|
|
72
|
+
meta
|
|
73
|
+
)
|
|
74
|
+
);
|
|
75
|
+
dispatch(setPanelAsActive(payload.id, meta));
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const createNewMismatchesList = (payload, meta) => {
|
|
80
|
+
return (dispatch) => {
|
|
81
|
+
dispatch(
|
|
82
|
+
addPanelIfItDoesntAlreadyExist(
|
|
83
|
+
{
|
|
84
|
+
type: "mismatches",
|
|
85
|
+
name: "Mismatches",
|
|
86
|
+
active: true,
|
|
87
|
+
canClose: true,
|
|
88
|
+
...payload
|
|
89
|
+
},
|
|
90
|
+
meta
|
|
91
|
+
)
|
|
92
|
+
);
|
|
93
|
+
dispatch(setPanelAsActive(payload.id, meta));
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export const collapseSplitScreen = (activePanelId, meta) => {
|
|
98
|
+
return (dispatch) => {
|
|
99
|
+
dispatch(_collapseSplitScreen(activePanelId, meta));
|
|
100
|
+
activePanelId && dispatch(setPanelAsActive(activePanelId, meta));
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
// ------------------------------------
|
|
105
|
+
// Reducer
|
|
106
|
+
// ------------------------------------
|
|
107
|
+
export default createReducer(
|
|
108
|
+
{
|
|
109
|
+
[addPanelIfItDoesntAlreadyExist]: (state, panelToAdd) => {
|
|
110
|
+
if (
|
|
111
|
+
!state.some((panelGroup) => {
|
|
112
|
+
return panelGroup.some(({ id }) => {
|
|
113
|
+
return id === panelToAdd.id;
|
|
114
|
+
});
|
|
115
|
+
})
|
|
116
|
+
) {
|
|
117
|
+
return state.map((panelGroup, index) => {
|
|
118
|
+
if (index === 0) return [panelToAdd, ...panelGroup];
|
|
119
|
+
return panelGroup;
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return state;
|
|
123
|
+
},
|
|
124
|
+
[panelsShownUpdate]: (state, payload) => {
|
|
125
|
+
return payload.filter((group) => group.length); //filter out any empty groups
|
|
126
|
+
},
|
|
127
|
+
[flipActiveTabFromLinearOrCircularIfNecessary]: (state, setCircActive) => {
|
|
128
|
+
const newState = immer(state, (s) => {
|
|
129
|
+
s.forEach((g) => {
|
|
130
|
+
flipActiveForGroup(g, setCircActive);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
return newState;
|
|
135
|
+
},
|
|
136
|
+
[closePanel]: (state, idToClose) => {
|
|
137
|
+
const newState = state.map((group) => {
|
|
138
|
+
let indexToClose;
|
|
139
|
+
group.forEach(({ id }, i) => {
|
|
140
|
+
if (id === idToClose) indexToClose = i;
|
|
141
|
+
});
|
|
142
|
+
if (indexToClose > -1) {
|
|
143
|
+
return removeItem(group, indexToClose).map((tab, i) => {
|
|
144
|
+
if (i === 0) return { ...tab, active: true };
|
|
145
|
+
else {
|
|
146
|
+
return tab;
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
return group;
|
|
151
|
+
});
|
|
152
|
+
return newState.filter((group) => group.length); //filter out any empty groups
|
|
153
|
+
},
|
|
154
|
+
[_collapseSplitScreen]: (state) => {
|
|
155
|
+
return [flatMap(state)];
|
|
156
|
+
},
|
|
157
|
+
[expandTabToSplitScreen]: (state, activePanelId) => {
|
|
158
|
+
let panelToMove;
|
|
159
|
+
return [
|
|
160
|
+
state[0]
|
|
161
|
+
.filter((panel) => {
|
|
162
|
+
if (panel.id === activePanelId) {
|
|
163
|
+
panelToMove = panel;
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
return true;
|
|
167
|
+
})
|
|
168
|
+
.map((panel, i) => {
|
|
169
|
+
return i === 0 ? { ...panel, active: true } : panel;
|
|
170
|
+
}),
|
|
171
|
+
[{ ...panelToMove, active: true }]
|
|
172
|
+
];
|
|
173
|
+
},
|
|
174
|
+
[setPanelAsActive]: (state, panelId) => {
|
|
175
|
+
return map(state, (panelGroup) => {
|
|
176
|
+
const isPanelInGroup = panelGroup.some(({ id }) => {
|
|
177
|
+
return panelId === id;
|
|
178
|
+
});
|
|
179
|
+
return panelGroup.map((panel) => {
|
|
180
|
+
return {
|
|
181
|
+
...panel,
|
|
182
|
+
active:
|
|
183
|
+
panelId === panel.id
|
|
184
|
+
? true
|
|
185
|
+
: isPanelInGroup
|
|
186
|
+
? false
|
|
187
|
+
: panel.active
|
|
188
|
+
};
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
},
|
|
192
|
+
[togglePanelFullScreen]: (state, panelId) => {
|
|
193
|
+
return map(state, (panelGroup) => {
|
|
194
|
+
const isPanelInGroup = panelGroup.some(({ id }) => {
|
|
195
|
+
return panelId === id;
|
|
196
|
+
});
|
|
197
|
+
return panelGroup.map((panel) => {
|
|
198
|
+
return {
|
|
199
|
+
...panel,
|
|
200
|
+
active:
|
|
201
|
+
panelId === panel.id
|
|
202
|
+
? true
|
|
203
|
+
: isPanelInGroup
|
|
204
|
+
? false
|
|
205
|
+
: panel.active,
|
|
206
|
+
fullScreen:
|
|
207
|
+
panelId === panel.id
|
|
208
|
+
? !panel.fullScreen
|
|
209
|
+
: isPanelInGroup
|
|
210
|
+
? false
|
|
211
|
+
: panel.fullScreen
|
|
212
|
+
};
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
},
|
|
216
|
+
[collapsePanel]: (state, panelToCloseId) => {
|
|
217
|
+
return [
|
|
218
|
+
flatMap(state, (panelGroup) => {
|
|
219
|
+
return panelGroup;
|
|
220
|
+
}).map((panel) => {
|
|
221
|
+
if (panel.id === panelToCloseId) {
|
|
222
|
+
return {
|
|
223
|
+
...panel,
|
|
224
|
+
active: false
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
return panel;
|
|
228
|
+
})
|
|
229
|
+
];
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
[
|
|
233
|
+
[
|
|
234
|
+
{
|
|
235
|
+
id: "circular",
|
|
236
|
+
name: "Circular Map",
|
|
237
|
+
active: true
|
|
238
|
+
// canClose: true
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
id: "rail",
|
|
242
|
+
name: "Linear Map",
|
|
243
|
+
active: false
|
|
244
|
+
}
|
|
245
|
+
],
|
|
246
|
+
[
|
|
247
|
+
{
|
|
248
|
+
id: "sequence",
|
|
249
|
+
name: "Sequence Map",
|
|
250
|
+
active: true
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
id: "properties",
|
|
254
|
+
name: "Properties",
|
|
255
|
+
active: false
|
|
256
|
+
}
|
|
257
|
+
]
|
|
258
|
+
]
|
|
259
|
+
);
|
|
260
|
+
|
|
261
|
+
function flipActiveForGroup(group, setCircActive) {
|
|
262
|
+
const activeTab = group.find(({ active }) => active);
|
|
263
|
+
if (activeTab?.id === (setCircActive ? "rail" : "circular")) {
|
|
264
|
+
//we're on the wrong tab type so check if the other tab is in
|
|
265
|
+
const newTabToActivate = group.find(
|
|
266
|
+
({ id }) => id === (setCircActive ? "circular" : "rail")
|
|
267
|
+
);
|
|
268
|
+
if (newTabToActivate) {
|
|
269
|
+
newTabToActivate.active = true;
|
|
270
|
+
activeTab.active = false;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import createMergedDefaultStateReducer from "./utils/createMergedDefaultStateReducer";
|
|
2
|
+
import createAction from "./utils/createMetaAction";
|
|
3
|
+
|
|
4
|
+
// ------------------------------------
|
|
5
|
+
// Actions
|
|
6
|
+
// ------------------------------------
|
|
7
|
+
export const updatePartLengthsToHide = createAction("updatePartLengthsToHide");
|
|
8
|
+
export const togglePartLengthsToHide = createAction("togglePartLengthsToHide");
|
|
9
|
+
|
|
10
|
+
// ------------------------------------
|
|
11
|
+
// Reducer
|
|
12
|
+
// ------------------------------------
|
|
13
|
+
export default createMergedDefaultStateReducer(
|
|
14
|
+
{
|
|
15
|
+
[updatePartLengthsToHide]: (state, payload) => {
|
|
16
|
+
return { ...state, ...payload };
|
|
17
|
+
},
|
|
18
|
+
[togglePartLengthsToHide]: (state) => {
|
|
19
|
+
return { ...state, enabled: !state["enabled"] };
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
{ enabled: false, min: 0, max: 800 }
|
|
23
|
+
);
|