@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,131 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { DataTable } from "@teselagen/ui";
|
|
3
|
+
|
|
4
|
+
import { CutsiteTag } from "../../CutsiteFilter/AdditionalCutsiteInfoDialog";
|
|
5
|
+
|
|
6
|
+
import EnzymeViewer from "../../EnzymeViewer";
|
|
7
|
+
import { getEnzymeAliases } from "../../utils/editorUtils";
|
|
8
|
+
|
|
9
|
+
export default function SingleEnzymeCutsiteInfo({
|
|
10
|
+
cutsiteGroup,
|
|
11
|
+
enzyme,
|
|
12
|
+
dispatch,
|
|
13
|
+
allRestrictionEnzymes,
|
|
14
|
+
editorName,
|
|
15
|
+
selectedAnnotationId,
|
|
16
|
+
allCutsites,
|
|
17
|
+
filteredCutsites: { cutsitesByName: cutsitesByNameActive }
|
|
18
|
+
}) {
|
|
19
|
+
const onRowSelect = ([record]) => {
|
|
20
|
+
if (!record) return;
|
|
21
|
+
|
|
22
|
+
dispatch({
|
|
23
|
+
type: "CARET_POSITION_UPDATE",
|
|
24
|
+
payload: record.topSnipPosition,
|
|
25
|
+
meta: {
|
|
26
|
+
editorName
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
const aliases = getEnzymeAliases(enzyme);
|
|
31
|
+
const entities = cutsiteGroup
|
|
32
|
+
.sort((a, b) => a.topSnipPosition - b.topSnipPosition)
|
|
33
|
+
.map(
|
|
34
|
+
({
|
|
35
|
+
restrictionEnzyme: { forwardRegex, reverseRegex } = {},
|
|
36
|
+
forward,
|
|
37
|
+
id,
|
|
38
|
+
topSnipBeforeBottom,
|
|
39
|
+
topSnipPosition,
|
|
40
|
+
bottomSnipPosition
|
|
41
|
+
}) => {
|
|
42
|
+
return {
|
|
43
|
+
id,
|
|
44
|
+
topSnipPosition,
|
|
45
|
+
position: topSnipBeforeBottom
|
|
46
|
+
? topSnipPosition + " - " + bottomSnipPosition
|
|
47
|
+
: bottomSnipPosition + " - " + topSnipPosition,
|
|
48
|
+
strand:
|
|
49
|
+
forwardRegex === reverseRegex ? "Palindromic" : forward ? "1" : "-1"
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
<div>
|
|
56
|
+
<div
|
|
57
|
+
className="ve-enzymeSubrow"
|
|
58
|
+
style={{
|
|
59
|
+
margin: 10
|
|
60
|
+
}}
|
|
61
|
+
>
|
|
62
|
+
{enzyme && (
|
|
63
|
+
<EnzymeViewer
|
|
64
|
+
{...{
|
|
65
|
+
sequence: enzyme.site,
|
|
66
|
+
reverseSnipPosition: enzyme.bottomSnipOffset,
|
|
67
|
+
forwardSnipPosition: enzyme.topSnipOffset
|
|
68
|
+
}}
|
|
69
|
+
/>
|
|
70
|
+
)}
|
|
71
|
+
<br></br>
|
|
72
|
+
{entities && !!entities.length && (
|
|
73
|
+
<div>
|
|
74
|
+
<DataTable
|
|
75
|
+
style={{ minHeight: 0, maxHeight: 200 }}
|
|
76
|
+
selectedIds={selectedAnnotationId}
|
|
77
|
+
maxHeight={300}
|
|
78
|
+
onRowSelect={onRowSelect}
|
|
79
|
+
formName="cutLocations"
|
|
80
|
+
isSingleSelect
|
|
81
|
+
compact
|
|
82
|
+
noRouter
|
|
83
|
+
minimalStyle
|
|
84
|
+
scrollToSelectedRowRelativeToDom
|
|
85
|
+
noHeader
|
|
86
|
+
isSimple
|
|
87
|
+
noFullscreenButton
|
|
88
|
+
isInfinite
|
|
89
|
+
withSearch={false}
|
|
90
|
+
withFilter={false}
|
|
91
|
+
schema={schema}
|
|
92
|
+
entities={entities}
|
|
93
|
+
/>
|
|
94
|
+
</div>
|
|
95
|
+
)}
|
|
96
|
+
{aliases && aliases.length && (
|
|
97
|
+
<div style={{ marginTop: 10 }}>
|
|
98
|
+
Aliases:
|
|
99
|
+
<div style={{ display: "flex", flexWrap: "wrap" }}>
|
|
100
|
+
{aliases.map((n, i) => {
|
|
101
|
+
return (
|
|
102
|
+
<CutsiteTag
|
|
103
|
+
allRestrictionEnzymes={allRestrictionEnzymes}
|
|
104
|
+
cutsitesByNameActive={cutsitesByNameActive}
|
|
105
|
+
cutsitesByName={allCutsites.cutsitesByName}
|
|
106
|
+
key={i}
|
|
107
|
+
name={n}
|
|
108
|
+
doNotShowCuts
|
|
109
|
+
></CutsiteTag>
|
|
110
|
+
);
|
|
111
|
+
})}
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
)}
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const schema = {
|
|
121
|
+
fields: [
|
|
122
|
+
{ path: "topSnipPosition", displayName: "Top Snip", type: "string" },
|
|
123
|
+
{ path: "position", type: "string" },
|
|
124
|
+
{ path: "strand", type: "string" }
|
|
125
|
+
]
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
// export default compose(
|
|
129
|
+
// withEditorProps,
|
|
130
|
+
// withRestrictionEnzymes
|
|
131
|
+
// )(SingleEnzymeCutsiteInfo);
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { Tooltip, AnchorButton } from "@blueprintjs/core";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import {
|
|
4
|
+
DataTable,
|
|
5
|
+
withSelectedEntities,
|
|
6
|
+
createCommandMenu
|
|
7
|
+
} from "@teselagen/ui";
|
|
8
|
+
import getCommands from "../../commands";
|
|
9
|
+
import { map } from "lodash";
|
|
10
|
+
import { getRangeLength } from "@teselagen/range-utils";
|
|
11
|
+
import { connectToEditor } from "../../withEditorProps";
|
|
12
|
+
import { compose } from "recompose";
|
|
13
|
+
import selectors from "../../selectors";
|
|
14
|
+
import { getMassOfAaString } from "@teselagen/sequence-utils";
|
|
15
|
+
import { translationsSubmenu } from "../../MenuBar/viewSubmenu";
|
|
16
|
+
import { getVisFilter } from "./GenericAnnotationProperties";
|
|
17
|
+
|
|
18
|
+
class TranslationProperties extends React.Component {
|
|
19
|
+
constructor(props) {
|
|
20
|
+
super(props);
|
|
21
|
+
this.commands = getCommands(this);
|
|
22
|
+
}
|
|
23
|
+
onRowSelect = ([record]) => {
|
|
24
|
+
if (!record) return;
|
|
25
|
+
const { dispatch, editorName } = this.props;
|
|
26
|
+
dispatch({
|
|
27
|
+
type: "SELECTION_LAYER_UPDATE",
|
|
28
|
+
payload: record,
|
|
29
|
+
meta: {
|
|
30
|
+
editorName
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
render() {
|
|
35
|
+
const {
|
|
36
|
+
readOnly,
|
|
37
|
+
translations,
|
|
38
|
+
translationPropertiesSelectedEntities,
|
|
39
|
+
deleteTranslation,
|
|
40
|
+
sequenceLength,
|
|
41
|
+
selectedAnnotationId,
|
|
42
|
+
annotationVisibility
|
|
43
|
+
} = this.props;
|
|
44
|
+
const translationsToUse = map(translations, (translation) => {
|
|
45
|
+
let aaString = "";
|
|
46
|
+
for (let i = 0; i < translation.aminoAcids.length; i++) {
|
|
47
|
+
aaString += translation.aminoAcids[i].aminoAcid.value;
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
...translation,
|
|
51
|
+
sizeBps: getRangeLength(translation, sequenceLength),
|
|
52
|
+
sizeAa:
|
|
53
|
+
translation.translationType === "ORF"
|
|
54
|
+
? Math.floor(getRangeLength(translation, sequenceLength) / 3 - 1)
|
|
55
|
+
: Math.floor(getRangeLength(translation, sequenceLength) / 3),
|
|
56
|
+
...(translation.strand === undefined && {
|
|
57
|
+
strand: translation.forward ? 1 : -1
|
|
58
|
+
}),
|
|
59
|
+
mass: getMassOfAaString(aaString, 2, true)
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
return (
|
|
63
|
+
<div style={{ display: "flex", flexDirection: "column" }}>
|
|
64
|
+
<DataTable
|
|
65
|
+
withCheckboxes
|
|
66
|
+
noPadding
|
|
67
|
+
onRowSelect={this.onRowSelect}
|
|
68
|
+
selectedIds={selectedAnnotationId}
|
|
69
|
+
formName="translationProperties"
|
|
70
|
+
noRouter
|
|
71
|
+
compact
|
|
72
|
+
topLeftItems={getVisFilter(
|
|
73
|
+
createCommandMenu(translationsSubmenu, this.commands, {
|
|
74
|
+
useTicks: true
|
|
75
|
+
})
|
|
76
|
+
)}
|
|
77
|
+
leftOfSearchBarItems={
|
|
78
|
+
!readOnly && (
|
|
79
|
+
<Tooltip
|
|
80
|
+
content={
|
|
81
|
+
translationPropertiesSelectedEntities.length &&
|
|
82
|
+
translationPropertiesSelectedEntities[0].translationType !==
|
|
83
|
+
"User Created"
|
|
84
|
+
? `Only "User Created" translations can be deleted`
|
|
85
|
+
: undefined
|
|
86
|
+
}
|
|
87
|
+
>
|
|
88
|
+
<AnchorButton
|
|
89
|
+
onClick={() => {
|
|
90
|
+
deleteTranslation(translationPropertiesSelectedEntities);
|
|
91
|
+
}}
|
|
92
|
+
intent="danger"
|
|
93
|
+
icon="trash"
|
|
94
|
+
style={{ marginLeft: 10, marginRight: 15, height: 30 }}
|
|
95
|
+
disabled={
|
|
96
|
+
!translationPropertiesSelectedEntities.length ||
|
|
97
|
+
translationPropertiesSelectedEntities[0].translationType !==
|
|
98
|
+
"User Created"
|
|
99
|
+
}
|
|
100
|
+
></AnchorButton>
|
|
101
|
+
</Tooltip>
|
|
102
|
+
)
|
|
103
|
+
}
|
|
104
|
+
annotationVisibility={annotationVisibility} //we need to pass this in order to force the DT to rerender
|
|
105
|
+
hideSelectedCount
|
|
106
|
+
noFooter
|
|
107
|
+
noFullscreenButton
|
|
108
|
+
isInfinite
|
|
109
|
+
schema={{
|
|
110
|
+
fields: [
|
|
111
|
+
{
|
|
112
|
+
path: "translationType",
|
|
113
|
+
displayName: "Type",
|
|
114
|
+
type: "string"
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
path: "sizeAa",
|
|
118
|
+
displayName: "Size (aa)",
|
|
119
|
+
type: "number"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
path: "mass",
|
|
123
|
+
displayName: "Mass (g/mol)",
|
|
124
|
+
type: "number"
|
|
125
|
+
},
|
|
126
|
+
{ path: "strand", type: "number" }
|
|
127
|
+
]
|
|
128
|
+
}}
|
|
129
|
+
entities={translationsToUse}
|
|
130
|
+
/>
|
|
131
|
+
</div>
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export default compose(
|
|
137
|
+
connectToEditor((editorState) => {
|
|
138
|
+
const { readOnly, annotationVisibility = {}, sequenceData } = editorState;
|
|
139
|
+
return {
|
|
140
|
+
readOnly,
|
|
141
|
+
translations: selectors.translationsSelector(editorState),
|
|
142
|
+
orfs: selectors.orfsSelector(editorState),
|
|
143
|
+
annotationVisibility,
|
|
144
|
+
sequenceLength: (sequenceData.sequence || "").length,
|
|
145
|
+
sequenceData
|
|
146
|
+
};
|
|
147
|
+
}),
|
|
148
|
+
withSelectedEntities("translationProperties")
|
|
149
|
+
)(TranslationProperties);
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { compose } from "redux";
|
|
3
|
+
import { Tab, Tabs } from "@blueprintjs/core";
|
|
4
|
+
import { flatMap, startCase } from "lodash";
|
|
5
|
+
import FeatureProperties from "./FeatureProperties";
|
|
6
|
+
import GeneralProperties from "./GeneralProperties";
|
|
7
|
+
import CutsiteProperties from "./CutsiteProperties";
|
|
8
|
+
import OrfProperties from "./OrfProperties";
|
|
9
|
+
import GenbankView from "./GenbankView";
|
|
10
|
+
import TranslationProperties from "./TranslationProperties";
|
|
11
|
+
import PrimerProperties from "./PrimerProperties";
|
|
12
|
+
import PartProperties from "./PartProperties";
|
|
13
|
+
import { connectToEditor } from "../../withEditorProps";
|
|
14
|
+
import "./style.css";
|
|
15
|
+
import { userDefinedHandlersAndOpts } from "../../Editor/userDefinedHandlersAndOpts";
|
|
16
|
+
import { pick } from "lodash";
|
|
17
|
+
|
|
18
|
+
const PropertiesContainer = (Comp) => (props) => {
|
|
19
|
+
const { additionalFooterEls, additionalHeaderEls, ...rest } = props;
|
|
20
|
+
return (
|
|
21
|
+
<React.Fragment>
|
|
22
|
+
{additionalHeaderEls}
|
|
23
|
+
<Comp {...rest} />
|
|
24
|
+
{additionalFooterEls}
|
|
25
|
+
</React.Fragment>
|
|
26
|
+
);
|
|
27
|
+
};
|
|
28
|
+
const allTabs = {
|
|
29
|
+
general: PropertiesContainer(GeneralProperties),
|
|
30
|
+
features: PropertiesContainer(FeatureProperties),
|
|
31
|
+
parts: PropertiesContainer(PartProperties),
|
|
32
|
+
primers: PropertiesContainer(PrimerProperties),
|
|
33
|
+
translations: PropertiesContainer(TranslationProperties),
|
|
34
|
+
cutsites: PropertiesContainer(CutsiteProperties),
|
|
35
|
+
orfs: PropertiesContainer(OrfProperties),
|
|
36
|
+
genbank: PropertiesContainer(GenbankView)
|
|
37
|
+
};
|
|
38
|
+
export class PropertiesDialog extends React.Component {
|
|
39
|
+
render() {
|
|
40
|
+
const {
|
|
41
|
+
propertiesTool = {},
|
|
42
|
+
propertiesViewTabUpdate,
|
|
43
|
+
dimensions = {},
|
|
44
|
+
height,
|
|
45
|
+
editorName,
|
|
46
|
+
onSave,
|
|
47
|
+
showReadOnly,
|
|
48
|
+
showAvailability,
|
|
49
|
+
isProtein,
|
|
50
|
+
annotationsToSupport = {},
|
|
51
|
+
disableSetReadOnly,
|
|
52
|
+
propertiesList = [
|
|
53
|
+
"general",
|
|
54
|
+
"features",
|
|
55
|
+
"parts",
|
|
56
|
+
"primers",
|
|
57
|
+
"translations",
|
|
58
|
+
"cutsites",
|
|
59
|
+
"orfs",
|
|
60
|
+
"genbank"
|
|
61
|
+
],
|
|
62
|
+
closePanelButton
|
|
63
|
+
} = { ...this.props, ...this.props.PropertiesProps };
|
|
64
|
+
|
|
65
|
+
const { width, height: heightFromDim } = dimensions;
|
|
66
|
+
|
|
67
|
+
let { tabId, selectedAnnotationId } = propertiesTool;
|
|
68
|
+
if (
|
|
69
|
+
propertiesList
|
|
70
|
+
.map((nameOrOverride) => nameOrOverride.name || nameOrOverride)
|
|
71
|
+
.indexOf(tabId) === -1
|
|
72
|
+
) {
|
|
73
|
+
tabId = propertiesList[0].name || propertiesList[0];
|
|
74
|
+
}
|
|
75
|
+
const propertiesTabs = flatMap(propertiesList, (nameOrOverride) => {
|
|
76
|
+
if (annotationsToSupport[nameOrOverride] === false) {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const name = nameOrOverride.name || nameOrOverride;
|
|
81
|
+
const Comp = nameOrOverride.Comp || allTabs[name];
|
|
82
|
+
if (isProtein) {
|
|
83
|
+
if (
|
|
84
|
+
name === "translations" ||
|
|
85
|
+
name === "orfs" ||
|
|
86
|
+
name === "primers" ||
|
|
87
|
+
name === "cutsites"
|
|
88
|
+
) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const title = (() => {
|
|
93
|
+
if (nameOrOverride.Comp) return name; //just use the user supplied name because this is a custom panel
|
|
94
|
+
if (name === "orfs") return "ORFs";
|
|
95
|
+
if (name === "cutsites") return "Cut Sites";
|
|
96
|
+
return startCase(name);
|
|
97
|
+
})();
|
|
98
|
+
return (
|
|
99
|
+
<Tab
|
|
100
|
+
key={name}
|
|
101
|
+
title={title}
|
|
102
|
+
id={name}
|
|
103
|
+
panel={
|
|
104
|
+
<Comp
|
|
105
|
+
{...{
|
|
106
|
+
...pick(this.props, userDefinedHandlersAndOpts),
|
|
107
|
+
editorName,
|
|
108
|
+
onSave,
|
|
109
|
+
isProtein,
|
|
110
|
+
showReadOnly,
|
|
111
|
+
showAvailability,
|
|
112
|
+
disableSetReadOnly,
|
|
113
|
+
selectedAnnotationId,
|
|
114
|
+
...(nameOrOverride.name && nameOrOverride)
|
|
115
|
+
}}
|
|
116
|
+
/>
|
|
117
|
+
}
|
|
118
|
+
/>
|
|
119
|
+
);
|
|
120
|
+
});
|
|
121
|
+
const heightToUse = Math.max(0, Number((heightFromDim || height) - 30));
|
|
122
|
+
return (
|
|
123
|
+
<div
|
|
124
|
+
style={{
|
|
125
|
+
position: "relative"
|
|
126
|
+
}}
|
|
127
|
+
>
|
|
128
|
+
{closePanelButton}
|
|
129
|
+
<div
|
|
130
|
+
className="ve-propertiesPanel"
|
|
131
|
+
style={{
|
|
132
|
+
display: "flex",
|
|
133
|
+
width,
|
|
134
|
+
height: heightToUse || 300,
|
|
135
|
+
zIndex: 10,
|
|
136
|
+
padding: 10
|
|
137
|
+
// paddingBottom: '31px',
|
|
138
|
+
}}
|
|
139
|
+
>
|
|
140
|
+
{propertiesTabs.length ? (
|
|
141
|
+
<Tabs
|
|
142
|
+
style={{ width }}
|
|
143
|
+
renderActiveTabPanelOnly
|
|
144
|
+
selectedTabId={tabId}
|
|
145
|
+
onChange={propertiesViewTabUpdate}
|
|
146
|
+
>
|
|
147
|
+
<Tabs.Expander />
|
|
148
|
+
{propertiesTabs}
|
|
149
|
+
<Tabs.Expander />
|
|
150
|
+
</Tabs>
|
|
151
|
+
) : (
|
|
152
|
+
<div style={{ margin: 20, fontSize: 20 }}>
|
|
153
|
+
No Properties to display
|
|
154
|
+
</div>
|
|
155
|
+
)}
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export default compose(
|
|
163
|
+
connectToEditor(({ propertiesTool, annotationsToSupport }) => {
|
|
164
|
+
return { propertiesTool, annotationsToSupport };
|
|
165
|
+
})
|
|
166
|
+
)(PropertiesDialog);
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
.ve-propertiesPanel .bp3-tabs {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
width: 100%;
|
|
5
|
+
height: 100%;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.ve-propertiesPanel .bp3-tab-list::-webkit-scrollbar {
|
|
9
|
+
display: none;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.ve-propertiesPanel .data-table-header {
|
|
13
|
+
margin-top: 3px;
|
|
14
|
+
margin-right: 3px;
|
|
15
|
+
}
|
|
16
|
+
.ve-propertiesPanel .bp3-tab-list {
|
|
17
|
+
overflow: scroll;
|
|
18
|
+
}
|
|
19
|
+
.ve-propertiesPanel .bp3-tabs .bp3-tab-panel {
|
|
20
|
+
display: flex;
|
|
21
|
+
flex-direction: column;
|
|
22
|
+
overflow-y: auto;
|
|
23
|
+
overflow-x: visible;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.ve-flex-row {
|
|
27
|
+
display: flex;
|
|
28
|
+
flex-direction: row;
|
|
29
|
+
justify-content: space-between;
|
|
30
|
+
align-items: top;
|
|
31
|
+
min-height: 40px;
|
|
32
|
+
/* padding-top: 15px; */
|
|
33
|
+
}
|
|
34
|
+
/* .ve-column-right {
|
|
35
|
+
display: flex;
|
|
36
|
+
|
|
37
|
+
align-items: center;
|
|
38
|
+
} */
|
|
39
|
+
|
|
40
|
+
/* .data-table-container > * {
|
|
41
|
+
flex-shrink: 0;
|
|
42
|
+
} */
|
|
43
|
+
|
|
44
|
+
.ve-propertiesPanel .bp3-popover-wrapper {
|
|
45
|
+
width: fit-content;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.ve-propertiesPanel .data-table-container {
|
|
49
|
+
min-height: 250px;
|
|
50
|
+
}
|
|
51
|
+
.ve-propertiesPanel .data-table-footer {
|
|
52
|
+
margin-top: 5px;
|
|
53
|
+
margin-bottom: 5px;
|
|
54
|
+
}
|
|
55
|
+
.genbankFileView-type {
|
|
56
|
+
display: block;
|
|
57
|
+
width: fit-content;
|
|
58
|
+
margin-bottom: 5px;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.ve-enzymeSubrow .data-table-container {
|
|
62
|
+
height: fit-content;
|
|
63
|
+
min-height: 0px;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.ve-enzymeSubrow .ReactTable .rt-tr-group:last-child {
|
|
67
|
+
margin-bottom: 0px;
|
|
68
|
+
}
|
|
@@ -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
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { convertDnaCaretPositionOrRangeToAA } from "@teselagen/sequence-utils";
|
|
3
|
+
import { convertRangeTo1Based } from "@teselagen/range-utils";
|
|
4
|
+
|
|
5
|
+
export const sizeSchema = {
|
|
6
|
+
path: "size",
|
|
7
|
+
type: "number",
|
|
8
|
+
render: (val, _record, i, props) => {
|
|
9
|
+
const record = props.isProtein
|
|
10
|
+
? convertDnaCaretPositionOrRangeToAA(_record)
|
|
11
|
+
: _record;
|
|
12
|
+
const base1Range = convertRangeTo1Based(record);
|
|
13
|
+
const hasJoinedLocations = record.locations && record.locations.length > 1;
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<span>
|
|
17
|
+
{props.isProtein ? Math.floor(val / 3) : val}{" "}
|
|
18
|
+
<span style={{ fontSize: 10 }}>
|
|
19
|
+
{hasJoinedLocations ? (
|
|
20
|
+
record.locations.map((loc, i) => {
|
|
21
|
+
const base1Range = convertRangeTo1Based(loc);
|
|
22
|
+
return (
|
|
23
|
+
<span key={i}>
|
|
24
|
+
({base1Range.start}-{base1Range.end})
|
|
25
|
+
</span>
|
|
26
|
+
);
|
|
27
|
+
})
|
|
28
|
+
) : (
|
|
29
|
+
<span>
|
|
30
|
+
({base1Range.start}-{base1Range.end})
|
|
31
|
+
</span>
|
|
32
|
+
)}
|
|
33
|
+
</span>
|
|
34
|
+
</span>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
};
|