@apollo-annotation/jbrowse-plugin-apollo 0.3.11 → 0.3.12
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/dist/ApolloInternetAccount/components/AuthTypeSelector.d.ts +6 -0
- package/dist/ApolloInternetAccount/components/AuthTypeSelector.d.ts.map +1 -0
- package/dist/ApolloInternetAccount/components/LoginButtons.d.ts +5 -0
- package/dist/ApolloInternetAccount/components/LoginButtons.d.ts.map +1 -0
- package/dist/ApolloInternetAccount/components/LoginIcons.d.ts +4 -0
- package/dist/ApolloInternetAccount/components/LoginIcons.d.ts.map +1 -0
- package/dist/ApolloInternetAccount/index.d.ts +3 -0
- package/dist/ApolloInternetAccount/index.d.ts.map +1 -0
- package/dist/ApolloJobModel.d.ts +53 -0
- package/dist/ApolloJobModel.d.ts.map +1 -0
- package/dist/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.d.ts +12 -0
- package/dist/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.d.ts.map +1 -0
- package/dist/ApolloRefNameAliasAdapter/index.d.ts +3 -0
- package/dist/ApolloRefNameAliasAdapter/index.d.ts.map +1 -0
- package/dist/ApolloSequenceAdapter/ApolloSequenceAdapter.d.ts +27 -0
- package/dist/ApolloSequenceAdapter/ApolloSequenceAdapter.d.ts.map +1 -0
- package/dist/ApolloSequenceAdapter/index.d.ts +3 -0
- package/dist/ApolloSequenceAdapter/index.d.ts.map +1 -0
- package/dist/ApolloTextSearchAdapter/ApolloTextSearchAdapter.d.ts +13 -0
- package/dist/ApolloTextSearchAdapter/ApolloTextSearchAdapter.d.ts.map +1 -0
- package/dist/ApolloTextSearchAdapter/index.d.ts +3 -0
- package/dist/ApolloTextSearchAdapter/index.d.ts.map +1 -0
- package/dist/BackendDrivers/BackendDriver.d.ts +26 -0
- package/dist/BackendDrivers/BackendDriver.d.ts.map +1 -0
- package/dist/BackendDrivers/CollaborationServerDriver.d.ts +206 -0
- package/dist/BackendDrivers/CollaborationServerDriver.d.ts.map +1 -0
- package/dist/BackendDrivers/DesktopFileDriver.d.ts +160 -0
- package/dist/BackendDrivers/DesktopFileDriver.d.ts.map +1 -0
- package/dist/BackendDrivers/InMemoryFileDriver.d.ts +162 -0
- package/dist/BackendDrivers/InMemoryFileDriver.d.ts.map +1 -0
- package/dist/BackendDrivers/index.d.ts +5 -0
- package/dist/BackendDrivers/index.d.ts.map +1 -0
- package/dist/ChangeManager.d.ts +24 -0
- package/dist/ChangeManager.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/ApolloFeatureDetailsWidget.d.ts +6 -0
- package/dist/FeatureDetailsWidget/ApolloFeatureDetailsWidget.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.d.ts +12 -0
- package/dist/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/AttributeKey.d.ts +4 -0
- package/dist/FeatureDetailsWidget/AttributeKey.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/AttributeKeySelector.d.ts +6 -0
- package/dist/FeatureDetailsWidget/AttributeKeySelector.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/Attributes.d.ts +9 -0
- package/dist/FeatureDetailsWidget/Attributes.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/BasicInformation.d.ts +8 -0
- package/dist/FeatureDetailsWidget/BasicInformation.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/DefaultAttributeEditor.d.ts +9 -0
- package/dist/FeatureDetailsWidget/DefaultAttributeEditor.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/DefaultAttributeViewer.d.ts +5 -0
- package/dist/FeatureDetailsWidget/DefaultAttributeViewer.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/FeatureDetailsNavigation.d.ts +7 -0
- package/dist/FeatureDetailsWidget/FeatureDetailsNavigation.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/NumberTextField.d.ts +8 -0
- package/dist/FeatureDetailsWidget/NumberTextField.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/Sequence.d.ts +10 -0
- package/dist/FeatureDetailsWidget/Sequence.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/StringTextField.d.ts +8 -0
- package/dist/FeatureDetailsWidget/StringTextField.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/TranscriptSequence.d.ts +10 -0
- package/dist/FeatureDetailsWidget/TranscriptSequence.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/TranscriptWidgetEditLocation.d.ts +9 -0
- package/dist/FeatureDetailsWidget/TranscriptWidgetEditLocation.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/TranscriptWidgetSummary.d.ts +6 -0
- package/dist/FeatureDetailsWidget/TranscriptWidgetSummary.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/index.d.ts +5 -0
- package/dist/FeatureDetailsWidget/index.d.ts.map +1 -0
- package/dist/FeatureDetailsWidget/model.d.ts +123 -0
- package/dist/FeatureDetailsWidget/model.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/components/CheckResultWarnings.d.ts +5 -0
- package/dist/LinearApolloDisplay/components/CheckResultWarnings.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/components/LinearApolloDisplay.d.ts +7 -0
- package/dist/LinearApolloDisplay/components/LinearApolloDisplay.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/components/index.d.ts +2 -0
- package/dist/LinearApolloDisplay/components/index.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/glyphs/BoxGlyph.d.ts +4 -0
- package/dist/LinearApolloDisplay/glyphs/BoxGlyph.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/glyphs/GeneGlyph.d.ts +3 -0
- package/dist/LinearApolloDisplay/glyphs/GeneGlyph.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/glyphs/GenericChildGlyph.d.ts +3 -0
- package/dist/LinearApolloDisplay/glyphs/GenericChildGlyph.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/glyphs/Glyph.d.ts +26 -0
- package/dist/LinearApolloDisplay/glyphs/Glyph.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/glyphs/index.d.ts +4 -0
- package/dist/LinearApolloDisplay/glyphs/index.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/glyphs/util.d.ts +12 -0
- package/dist/LinearApolloDisplay/glyphs/util.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/index.d.ts +3 -0
- package/dist/LinearApolloDisplay/index.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/stateModel/base.d.ts +254 -0
- package/dist/LinearApolloDisplay/stateModel/base.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/stateModel/index.d.ts +349 -0
- package/dist/LinearApolloDisplay/stateModel/index.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/stateModel/layouts.d.ts +273 -0
- package/dist/LinearApolloDisplay/stateModel/layouts.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/stateModel/mouseEvents.d.ts +656 -0
- package/dist/LinearApolloDisplay/stateModel/mouseEvents.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/stateModel/rendering.d.ts +300 -0
- package/dist/LinearApolloDisplay/stateModel/rendering.d.ts.map +1 -0
- package/dist/LinearApolloDisplay/types.d.ts +2 -0
- package/dist/LinearApolloDisplay/types.d.ts.map +1 -0
- package/dist/LinearApolloReferenceSequenceDisplay/components/LinearApolloReferenceSequenceDisplay.d.ts +7 -0
- package/dist/LinearApolloReferenceSequenceDisplay/components/LinearApolloReferenceSequenceDisplay.d.ts.map +1 -0
- package/dist/LinearApolloReferenceSequenceDisplay/components/index.d.ts +2 -0
- package/dist/LinearApolloReferenceSequenceDisplay/components/index.d.ts.map +1 -0
- package/dist/LinearApolloReferenceSequenceDisplay/drawSequenceOverlay.d.ts +6 -0
- package/dist/LinearApolloReferenceSequenceDisplay/drawSequenceOverlay.d.ts.map +1 -0
- package/dist/LinearApolloReferenceSequenceDisplay/drawSequenceTrack.d.ts +5 -0
- package/dist/LinearApolloReferenceSequenceDisplay/drawSequenceTrack.d.ts.map +1 -0
- package/dist/LinearApolloReferenceSequenceDisplay/index.d.ts +4 -0
- package/dist/LinearApolloReferenceSequenceDisplay/index.d.ts.map +1 -0
- package/dist/LinearApolloReferenceSequenceDisplay/stateModel/base.d.ts +236 -0
- package/dist/LinearApolloReferenceSequenceDisplay/stateModel/base.d.ts.map +1 -0
- package/dist/LinearApolloReferenceSequenceDisplay/stateModel/index.d.ts +245 -0
- package/dist/LinearApolloReferenceSequenceDisplay/stateModel/index.d.ts.map +1 -0
- package/dist/LinearApolloReferenceSequenceDisplay/stateModel/rendering.d.ts +246 -0
- package/dist/LinearApolloReferenceSequenceDisplay/stateModel/rendering.d.ts.map +1 -0
- package/dist/LinearApolloSixFrameDisplay/components/LinearApolloSixFrameDisplay.d.ts +7 -0
- package/dist/LinearApolloSixFrameDisplay/components/LinearApolloSixFrameDisplay.d.ts.map +1 -0
- package/dist/LinearApolloSixFrameDisplay/components/TrackLines.d.ts +8 -0
- package/dist/LinearApolloSixFrameDisplay/components/TrackLines.d.ts.map +1 -0
- package/dist/LinearApolloSixFrameDisplay/components/index.d.ts +3 -0
- package/dist/LinearApolloSixFrameDisplay/components/index.d.ts.map +1 -0
- package/dist/LinearApolloSixFrameDisplay/glyphs/GeneGlyph.d.ts +3 -0
- package/dist/LinearApolloSixFrameDisplay/glyphs/GeneGlyph.d.ts.map +1 -0
- package/dist/LinearApolloSixFrameDisplay/glyphs/Glyph.d.ts +20 -0
- package/dist/LinearApolloSixFrameDisplay/glyphs/Glyph.d.ts.map +1 -0
- package/dist/LinearApolloSixFrameDisplay/glyphs/index.d.ts +2 -0
- package/dist/LinearApolloSixFrameDisplay/glyphs/index.d.ts.map +1 -0
- package/dist/LinearApolloSixFrameDisplay/index.d.ts +3 -0
- package/dist/LinearApolloSixFrameDisplay/index.d.ts.map +1 -0
- package/dist/LinearApolloSixFrameDisplay/stateModel/base.d.ts +257 -0
- package/dist/LinearApolloSixFrameDisplay/stateModel/base.d.ts.map +1 -0
- package/dist/LinearApolloSixFrameDisplay/stateModel/index.d.ts +355 -0
- package/dist/LinearApolloSixFrameDisplay/stateModel/index.d.ts.map +1 -0
- package/dist/LinearApolloSixFrameDisplay/stateModel/layouts.d.ts +283 -0
- package/dist/LinearApolloSixFrameDisplay/stateModel/layouts.d.ts.map +1 -0
- package/dist/LinearApolloSixFrameDisplay/stateModel/mouseEvents.d.ts +668 -0
- package/dist/LinearApolloSixFrameDisplay/stateModel/mouseEvents.d.ts.map +1 -0
- package/dist/LinearApolloSixFrameDisplay/stateModel/rendering.d.ts +306 -0
- package/dist/LinearApolloSixFrameDisplay/stateModel/rendering.d.ts.map +1 -0
- package/dist/LinearApolloSixFrameDisplay/types.d.ts +2 -0
- package/dist/LinearApolloSixFrameDisplay/types.d.ts.map +1 -0
- package/dist/OntologyManager/OntologyStore/fulltext-stopwords.d.ts +8 -0
- package/dist/OntologyManager/OntologyStore/fulltext-stopwords.d.ts.map +1 -0
- package/dist/OntologyManager/OntologyStore/fulltext.d.ts +27 -0
- package/dist/OntologyManager/OntologyStore/fulltext.d.ts.map +1 -0
- package/dist/OntologyManager/OntologyStore/index.d.ts +93 -0
- package/dist/OntologyManager/OntologyStore/index.d.ts.map +1 -0
- package/dist/OntologyManager/OntologyStore/indexeddb-schema.d.ts +71 -0
- package/dist/OntologyManager/OntologyStore/indexeddb-schema.d.ts.map +1 -0
- package/dist/OntologyManager/OntologyStore/indexeddb-storage.d.ts +11 -0
- package/dist/OntologyManager/OntologyStore/indexeddb-storage.d.ts.map +1 -0
- package/dist/OntologyManager/OntologyStore/obo-graph-json-schema.d.ts +107 -0
- package/dist/OntologyManager/OntologyStore/obo-graph-json-schema.d.ts.map +1 -0
- package/dist/OntologyManager/OntologyStore/prefixes.d.ts +20 -0
- package/dist/OntologyManager/OntologyStore/prefixes.d.ts.map +1 -0
- package/dist/OntologyManager/util.d.ts +4 -0
- package/dist/OntologyManager/util.d.ts.map +1 -0
- package/dist/TabularEditor/HybridGrid/ChangeHandling.d.ts +6 -0
- package/dist/TabularEditor/HybridGrid/ChangeHandling.d.ts.map +1 -0
- package/dist/TabularEditor/HybridGrid/Feature.d.ts +13 -0
- package/dist/TabularEditor/HybridGrid/Feature.d.ts.map +1 -0
- package/dist/TabularEditor/HybridGrid/FeatureAttributes.d.ts +6 -0
- package/dist/TabularEditor/HybridGrid/FeatureAttributes.d.ts.map +1 -0
- package/dist/TabularEditor/HybridGrid/Highlight.d.ts +6 -0
- package/dist/TabularEditor/HybridGrid/Highlight.d.ts.map +1 -0
- package/dist/TabularEditor/HybridGrid/HybridGrid.d.ts +14 -0
- package/dist/TabularEditor/HybridGrid/HybridGrid.d.ts.map +1 -0
- package/dist/TabularEditor/HybridGrid/NumberCell.d.ts +8 -0
- package/dist/TabularEditor/HybridGrid/NumberCell.d.ts.map +1 -0
- package/dist/TabularEditor/HybridGrid/ToolBar.d.ts +5 -0
- package/dist/TabularEditor/HybridGrid/ToolBar.d.ts.map +1 -0
- package/dist/TabularEditor/HybridGrid/featureContextMenuItems.d.ts +11 -0
- package/dist/TabularEditor/HybridGrid/featureContextMenuItems.d.ts.map +1 -0
- package/dist/TabularEditor/HybridGrid/index.d.ts +2 -0
- package/dist/TabularEditor/HybridGrid/index.d.ts.map +1 -0
- package/dist/TabularEditor/TabularEditorPane.d.ts +5 -0
- package/dist/TabularEditor/TabularEditorPane.d.ts.map +1 -0
- package/dist/TabularEditor/index.d.ts +3 -0
- package/dist/TabularEditor/index.d.ts.map +1 -0
- package/dist/TabularEditor/model.d.ts +17 -0
- package/dist/TabularEditor/model.d.ts.map +1 -0
- package/dist/TabularEditor/types.d.ts +4 -0
- package/dist/TabularEditor/types.d.ts.map +1 -0
- package/dist/components/AddAssembly.d.ts +10 -0
- package/dist/components/AddAssembly.d.ts.map +1 -0
- package/dist/components/AddAssemblyAliases.d.ts +10 -0
- package/dist/components/AddAssemblyAliases.d.ts.map +1 -0
- package/dist/components/AddChildFeature.d.ts +13 -0
- package/dist/components/AddChildFeature.d.ts.map +1 -0
- package/dist/components/AddFeature.d.ts +12 -0
- package/dist/components/AddFeature.d.ts.map +1 -0
- package/dist/components/AddRefSeqAliases.d.ts +10 -0
- package/dist/components/AddRefSeqAliases.d.ts.map +1 -0
- package/dist/components/CopyFeature.d.ts +13 -0
- package/dist/components/CopyFeature.d.ts.map +1 -0
- package/dist/components/CreateApolloAnnotation.d.ts +20 -0
- package/dist/components/CreateApolloAnnotation.d.ts.map +1 -0
- package/dist/components/DeleteAssembly.d.ts +10 -0
- package/dist/components/DeleteAssembly.d.ts.map +1 -0
- package/dist/components/DeleteFeature.d.ts +15 -0
- package/dist/components/DeleteFeature.d.ts.map +1 -0
- package/dist/components/Dialog.d.ts +7 -0
- package/dist/components/Dialog.d.ts.map +1 -0
- package/dist/components/DownloadGFF3.d.ts +8 -0
- package/dist/components/DownloadGFF3.d.ts.map +1 -0
- package/dist/components/DuplicateTranscript.d.ts +15 -0
- package/dist/components/DuplicateTranscript.d.ts.map +1 -0
- package/dist/components/EditZoomThresholdDialog.d.ts +11 -0
- package/dist/components/EditZoomThresholdDialog.d.ts.map +1 -0
- package/dist/components/FilterFeatures.d.ts +10 -0
- package/dist/components/FilterFeatures.d.ts.map +1 -0
- package/dist/components/FilterTranscripts.d.ts +10 -0
- package/dist/components/FilterTranscripts.d.ts.map +1 -0
- package/dist/components/ImportFeatures.d.ts +10 -0
- package/dist/components/ImportFeatures.d.ts.map +1 -0
- package/dist/components/LogOut.d.ts +8 -0
- package/dist/components/LogOut.d.ts.map +1 -0
- package/dist/components/ManageChecks.d.ts +8 -0
- package/dist/components/ManageChecks.d.ts.map +1 -0
- package/dist/components/ManageUsers.d.ts +10 -0
- package/dist/components/ManageUsers.d.ts.map +1 -0
- package/dist/components/MergeExons.d.ts +15 -0
- package/dist/components/MergeExons.d.ts.map +1 -0
- package/dist/components/MergeTranscripts.d.ts +15 -0
- package/dist/components/MergeTranscripts.d.ts.map +1 -0
- package/dist/components/OntologyTermAutocomplete.d.ts +25 -0
- package/dist/components/OntologyTermAutocomplete.d.ts.map +1 -0
- package/dist/components/OntologyTermMultiSelect.d.ts +12 -0
- package/dist/components/OntologyTermMultiSelect.d.ts.map +1 -0
- package/dist/components/OpenLocalFile.d.ts +15 -0
- package/dist/components/OpenLocalFile.d.ts.map +1 -0
- package/dist/components/SplitExon.d.ts +15 -0
- package/dist/components/SplitExon.d.ts.map +1 -0
- package/dist/components/ViewChangeLog.d.ts +8 -0
- package/dist/components/ViewChangeLog.d.ts.map +1 -0
- package/dist/components/ViewCheckResults.d.ts +8 -0
- package/dist/components/ViewCheckResults.d.ts.map +1 -0
- package/dist/components/index.d.ts +21 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/extensions/annotationFromJBrowseFeature.d.ts +6 -0
- package/dist/extensions/annotationFromJBrowseFeature.d.ts.map +1 -0
- package/dist/extensions/annotationFromPileup.d.ts +3 -0
- package/dist/extensions/annotationFromPileup.d.ts.map +1 -0
- package/dist/extensions/index.d.ts +3 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/index.esm.js +843 -1330
- package/dist/index.esm.js.map +1 -1
- package/dist/jbrowse-plugin-apollo.cjs.development.js +919 -1455
- package/dist/jbrowse-plugin-apollo.cjs.development.js.map +1 -1
- package/dist/jbrowse-plugin-apollo.cjs.production.min.js +1 -1
- package/dist/jbrowse-plugin-apollo.cjs.production.min.js.map +1 -1
- package/dist/jbrowse-plugin-apollo.umd.development.js +46351 -63687
- package/dist/jbrowse-plugin-apollo.umd.development.js.map +1 -1
- package/dist/jbrowse-plugin-apollo.umd.production.min.js +1 -1
- package/dist/jbrowse-plugin-apollo.umd.production.min.js.map +1 -1
- package/dist/makeDisplayComponent.d.ts +9 -0
- package/dist/makeDisplayComponent.d.ts.map +1 -0
- package/dist/menus/index.d.ts +2 -0
- package/dist/menus/index.d.ts.map +1 -0
- package/dist/menus/topLevelMenu.d.ts +3 -0
- package/dist/menus/topLevelMenu.d.ts.map +1 -0
- package/dist/menus/topLevelMenuAdmin.d.ts +3 -0
- package/dist/menus/topLevelMenuAdmin.d.ts.map +1 -0
- package/dist/session/index.d.ts +2 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/util/annotationFeatureUtils.d.ts +7 -0
- package/dist/util/annotationFeatureUtils.d.ts.map +1 -0
- package/dist/util/copyToClipboard.d.ts +2 -0
- package/dist/util/copyToClipboard.d.ts.map +1 -0
- package/dist/util/glyphUtils.d.ts +31 -0
- package/dist/util/glyphUtils.d.ts.map +1 -0
- package/dist/util/index.d.ts +10 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/loadAssemblyIntoClient.d.ts +5 -0
- package/dist/util/loadAssemblyIntoClient.d.ts.map +1 -0
- package/dist/util/mouseEventsUtils.d.ts +25 -0
- package/dist/util/mouseEventsUtils.d.ts.map +1 -0
- package/package.json +48 -25
- package/src/ApolloInternetAccount/components/AuthTypeSelector.tsx +7 -2
- package/src/ApolloInternetAccount/components/LoginButtons.tsx +1 -1
- package/src/ApolloInternetAccount/configSchema.ts +1 -1
- package/src/ApolloInternetAccount/model.ts +13 -6
- package/src/ApolloJobModel.ts +3 -3
- package/src/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.ts +2 -2
- package/src/ApolloSequenceAdapter/ApolloSequenceAdapter.ts +2 -2
- package/src/ApolloTextSearchAdapter/ApolloTextSearchAdapter.ts +28 -5
- package/src/BackendDrivers/BackendDriver.ts +8 -8
- package/src/BackendDrivers/CollaborationServerDriver.ts +6 -6
- package/src/BackendDrivers/DesktopFileDriver.ts +4 -4
- package/src/BackendDrivers/InMemoryFileDriver.ts +5 -8
- package/src/ChangeManager.ts +8 -3
- package/src/FeatureDetailsWidget/ApolloFeatureDetailsWidget.tsx +3 -3
- package/src/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.tsx +7 -7
- package/src/FeatureDetailsWidget/AttributeKey.tsx +1 -1
- package/src/FeatureDetailsWidget/AttributeKeySelector.tsx +1 -1
- package/src/FeatureDetailsWidget/Attributes.tsx +4 -4
- package/src/FeatureDetailsWidget/BasicInformation.tsx +3 -3
- package/src/FeatureDetailsWidget/DefaultAttributeEditor.tsx +1 -1
- package/src/FeatureDetailsWidget/FeatureDetailsNavigation.tsx +2 -2
- package/src/FeatureDetailsWidget/Sequence.tsx +3 -3
- package/src/FeatureDetailsWidget/TranscriptSequence.tsx +2 -2
- package/src/FeatureDetailsWidget/TranscriptWidgetEditLocation.tsx +3 -6
- package/src/FeatureDetailsWidget/TranscriptWidgetSummary.tsx +1 -1
- package/src/FeatureDetailsWidget/model.ts +3 -3
- package/src/LinearApolloDisplay/components/CheckResultWarnings.tsx +2 -2
- package/src/LinearApolloDisplay/components/LinearApolloDisplay.tsx +6 -4
- package/src/LinearApolloDisplay/glyphs/BoxGlyph.ts +7 -7
- package/src/LinearApolloDisplay/glyphs/GeneGlyph.ts +56 -30
- package/src/LinearApolloDisplay/glyphs/GenericChildGlyph.ts +6 -6
- package/src/LinearApolloDisplay/glyphs/Glyph.ts +7 -7
- package/src/LinearApolloDisplay/glyphs/util.ts +2 -2
- package/src/LinearApolloDisplay/stateModel/base.ts +17 -8
- package/src/LinearApolloDisplay/stateModel/index.ts +2 -2
- package/src/LinearApolloDisplay/stateModel/layouts.ts +4 -4
- package/src/LinearApolloDisplay/stateModel/mouseEvents.ts +6 -6
- package/src/LinearApolloDisplay/stateModel/rendering.ts +3 -3
- package/src/LinearApolloReferenceSequenceDisplay/components/LinearApolloReferenceSequenceDisplay.tsx +4 -2
- package/src/LinearApolloReferenceSequenceDisplay/drawSequenceOverlay.ts +4 -4
- package/src/LinearApolloReferenceSequenceDisplay/drawSequenceTrack.ts +3 -3
- package/src/LinearApolloReferenceSequenceDisplay/stateModel/base.ts +11 -8
- package/src/LinearApolloReferenceSequenceDisplay/stateModel/index.ts +2 -2
- package/src/LinearApolloReferenceSequenceDisplay/stateModel/rendering.ts +2 -2
- package/src/LinearApolloSixFrameDisplay/components/LinearApolloSixFrameDisplay.tsx +17 -9
- package/src/LinearApolloSixFrameDisplay/components/TrackLines.tsx +1 -1
- package/src/LinearApolloSixFrameDisplay/glyphs/GeneGlyph.ts +36 -23
- package/src/LinearApolloSixFrameDisplay/glyphs/Glyph.ts +6 -6
- package/src/LinearApolloSixFrameDisplay/stateModel/base.ts +17 -8
- package/src/LinearApolloSixFrameDisplay/stateModel/index.ts +2 -2
- package/src/LinearApolloSixFrameDisplay/stateModel/layouts.ts +12 -8
- package/src/LinearApolloSixFrameDisplay/stateModel/mouseEvents.ts +11 -10
- package/src/LinearApolloSixFrameDisplay/stateModel/rendering.ts +3 -3
- package/src/OntologyManager/OntologyStore/fulltext.test.ts +1 -1
- package/src/OntologyManager/OntologyStore/fulltext.ts +11 -4
- package/src/OntologyManager/OntologyStore/index.test.ts +3 -0
- package/src/OntologyManager/OntologyStore/indexeddb-schema.ts +6 -6
- package/src/OntologyManager/OntologyStore/indexeddb-storage.ts +2 -1
- package/src/OntologyManager/index.ts +4 -4
- package/src/OntologyManager/util.ts +1 -1
- package/src/TabularEditor/HybridGrid/ChangeHandling.ts +2 -2
- package/src/TabularEditor/HybridGrid/Feature.tsx +6 -6
- package/src/TabularEditor/HybridGrid/FeatureAttributes.tsx +2 -2
- package/src/TabularEditor/HybridGrid/Highlight.tsx +1 -1
- package/src/TabularEditor/HybridGrid/HybridGrid.tsx +2 -2
- package/src/TabularEditor/HybridGrid/NumberCell.tsx +1 -1
- package/src/TabularEditor/HybridGrid/ToolBar.tsx +3 -2
- package/src/TabularEditor/HybridGrid/featureContextMenuItems.ts +26 -4
- package/src/TabularEditor/TabularEditorPane.tsx +1 -1
- package/src/TabularEditor/model.ts +2 -2
- package/src/TabularEditor/types.ts +2 -2
- package/src/components/AddAssembly.tsx +61 -42
- package/src/components/AddAssemblyAliases.tsx +5 -5
- package/src/components/AddChildFeature.tsx +3 -3
- package/src/components/AddFeature.tsx +4 -4
- package/src/components/AddRefSeqAliases.tsx +7 -7
- package/src/components/CopyFeature.tsx +8 -8
- package/src/components/CreateApolloAnnotation.tsx +5 -5
- package/src/components/DeleteAssembly.tsx +8 -8
- package/src/components/DeleteFeature.tsx +4 -4
- package/src/components/Dialog.tsx +1 -1
- package/src/components/DownloadGFF3.tsx +8 -8
- package/src/components/DuplicateTranscript.tsx +132 -0
- package/src/components/FilterFeatures.tsx +1 -1
- package/src/components/FilterTranscripts.tsx +1 -1
- package/src/components/ImportFeatures.tsx +51 -33
- package/src/components/LogOut.tsx +4 -4
- package/src/components/ManageChecks.tsx +8 -8
- package/src/components/ManageUsers.tsx +18 -26
- package/src/components/MergeExons.tsx +4 -4
- package/src/components/MergeTranscripts.tsx +4 -4
- package/src/components/OntologyTermAutocomplete.tsx +14 -4
- package/src/components/OntologyTermMultiSelect.tsx +12 -5
- package/src/components/OpenLocalFile.tsx +2 -2
- package/src/components/SplitExon.tsx +6 -6
- package/src/components/ViewChangeLog.tsx +8 -8
- package/src/components/ViewCheckResults.tsx +4 -4
- package/src/components/index.ts +1 -0
- package/src/config.ts +1 -1
- package/src/extensions/annotationFromJBrowseFeature.ts +29 -24
- package/src/extensions/annotationFromPileup.ts +8 -6
- package/src/index.ts +25 -1
- package/src/makeDisplayComponent.tsx +8 -5
- package/src/menus/topLevelMenu.ts +4 -4
- package/src/menus/topLevelMenuAdmin.ts +4 -4
- package/src/session/ClientDataStore.ts +20 -15
- package/src/session/session.ts +30 -19
- package/src/types.ts +10 -4
- package/src/util/annotationFeatureUtils.ts +1 -1
- package/src/util/displayUtils.ts +3 -3
- package/src/util/glyphUtils.ts +10 -10
- package/src/util/index.ts +4 -4
- package/src/util/loadAssemblyIntoClient.ts +4 -4
- package/src/util/mouseEventsUtils.ts +2 -2
|
@@ -10,21 +10,22 @@ var pluggableElementTypes = require('@jbrowse/core/pluggableElementTypes');
|
|
|
10
10
|
var util = require('@jbrowse/core/util');
|
|
11
11
|
var AddIcon = require('@mui/icons-material/Add');
|
|
12
12
|
var material = require('@mui/material');
|
|
13
|
+
var mobxStateTree = require('@jbrowse/mobx-state-tree');
|
|
13
14
|
var mobx = require('mobx');
|
|
14
|
-
var mobxStateTree = require('mobx-state-tree');
|
|
15
15
|
var socket_ioClient = require('socket.io-client');
|
|
16
16
|
var AdminPanelSettingsIcon = require('@mui/icons-material/AdminPanelSettings');
|
|
17
17
|
var DeleteIcon = require('@mui/icons-material/Delete');
|
|
18
18
|
var InputIcon = require('@mui/icons-material/Input');
|
|
19
19
|
var PersonIcon = require('@mui/icons-material/Person');
|
|
20
20
|
var RuleIcon = require('@mui/icons-material/Rule');
|
|
21
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
22
|
+
var tssReact = require('@jbrowse/core/util/tss-react');
|
|
21
23
|
var InfoIcon = require('@mui/icons-material/Info');
|
|
22
24
|
var LinkIcon = require('@mui/icons-material/Link');
|
|
23
25
|
var RadioButtonCheckedIcon = require('@mui/icons-material/RadioButtonChecked');
|
|
24
26
|
var RadioButtonUncheckedIcon = require('@mui/icons-material/RadioButtonUnchecked');
|
|
25
27
|
var ObjectID = require('bson-objectid');
|
|
26
28
|
var React = require('react');
|
|
27
|
-
var mui = require('tss-react/mui');
|
|
28
29
|
var gff = require('@gmod/gff');
|
|
29
30
|
var SkipNextRoundedIcon = require('@mui/icons-material/SkipNextRounded');
|
|
30
31
|
var SkipPreviousRoundedIcon = require('@mui/icons-material/SkipPreviousRounded');
|
|
@@ -39,9 +40,6 @@ var jsonpath = require('jsonpath');
|
|
|
39
40
|
var io = require('@jbrowse/core/util/io');
|
|
40
41
|
var equal = require('fast-deep-equal/es6');
|
|
41
42
|
var fileSaver = require('file-saver');
|
|
42
|
-
var Checkbox = require('@mui/material/Checkbox');
|
|
43
|
-
var FormControlLabel = require('@mui/material/FormControlLabel');
|
|
44
|
-
var LinearProgress = require('@mui/material/LinearProgress');
|
|
45
43
|
var nanoid = require('nanoid');
|
|
46
44
|
var AccountCircleIcon = require('@mui/icons-material/AccountCircle');
|
|
47
45
|
var AdapterType = require('@jbrowse/core/pluggableElementTypes/AdapterType');
|
|
@@ -73,56 +71,7 @@ var TrackChangesIcon = require('@mui/icons-material/TrackChanges');
|
|
|
73
71
|
var UndoIcon = require('@mui/icons-material/Undo');
|
|
74
72
|
var SaveIcon = require('@mui/icons-material/Save');
|
|
75
73
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
var Plugin__default = /*#__PURE__*/_interopDefaultLegacy(Plugin);
|
|
79
|
-
var AddIcon__default = /*#__PURE__*/_interopDefaultLegacy(AddIcon);
|
|
80
|
-
var AdminPanelSettingsIcon__default = /*#__PURE__*/_interopDefaultLegacy(AdminPanelSettingsIcon);
|
|
81
|
-
var DeleteIcon__default = /*#__PURE__*/_interopDefaultLegacy(DeleteIcon);
|
|
82
|
-
var InputIcon__default = /*#__PURE__*/_interopDefaultLegacy(InputIcon);
|
|
83
|
-
var PersonIcon__default = /*#__PURE__*/_interopDefaultLegacy(PersonIcon);
|
|
84
|
-
var RuleIcon__default = /*#__PURE__*/_interopDefaultLegacy(RuleIcon);
|
|
85
|
-
var InfoIcon__default = /*#__PURE__*/_interopDefaultLegacy(InfoIcon);
|
|
86
|
-
var LinkIcon__default = /*#__PURE__*/_interopDefaultLegacy(LinkIcon);
|
|
87
|
-
var RadioButtonCheckedIcon__default = /*#__PURE__*/_interopDefaultLegacy(RadioButtonCheckedIcon);
|
|
88
|
-
var RadioButtonUncheckedIcon__default = /*#__PURE__*/_interopDefaultLegacy(RadioButtonUncheckedIcon);
|
|
89
|
-
var ObjectID__default = /*#__PURE__*/_interopDefaultLegacy(ObjectID);
|
|
90
|
-
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
91
|
-
var SkipNextRoundedIcon__default = /*#__PURE__*/_interopDefaultLegacy(SkipNextRoundedIcon);
|
|
92
|
-
var SkipPreviousRoundedIcon__default = /*#__PURE__*/_interopDefaultLegacy(SkipPreviousRoundedIcon);
|
|
93
|
-
var CloseIcon__default = /*#__PURE__*/_interopDefaultLegacy(CloseIcon);
|
|
94
|
-
var jsonpath__default = /*#__PURE__*/_interopDefaultLegacy(jsonpath);
|
|
95
|
-
var equal__default = /*#__PURE__*/_interopDefaultLegacy(equal);
|
|
96
|
-
var Checkbox__default = /*#__PURE__*/_interopDefaultLegacy(Checkbox);
|
|
97
|
-
var FormControlLabel__default = /*#__PURE__*/_interopDefaultLegacy(FormControlLabel);
|
|
98
|
-
var LinearProgress__default = /*#__PURE__*/_interopDefaultLegacy(LinearProgress);
|
|
99
|
-
var AccountCircleIcon__default = /*#__PURE__*/_interopDefaultLegacy(AccountCircleIcon);
|
|
100
|
-
var AdapterType__default = /*#__PURE__*/_interopDefaultLegacy(AdapterType);
|
|
101
|
-
var SimpleFeature__default = /*#__PURE__*/_interopDefaultLegacy(SimpleFeature);
|
|
102
|
-
var BaseResult__default = /*#__PURE__*/_interopDefaultLegacy(BaseResult);
|
|
103
|
-
var ExpandMoreIcon__default = /*#__PURE__*/_interopDefaultLegacy(ExpandMoreIcon);
|
|
104
|
-
var EditIcon__default = /*#__PURE__*/_interopDefaultLegacy(EditIcon);
|
|
105
|
-
var MoreHorizIcon__default = /*#__PURE__*/_interopDefaultLegacy(MoreHorizIcon);
|
|
106
|
-
var AddBoxIcon__default = /*#__PURE__*/_interopDefaultLegacy(AddBoxIcon);
|
|
107
|
-
var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled);
|
|
108
|
-
var ContentCopyIcon__default = /*#__PURE__*/_interopDefaultLegacy(ContentCopyIcon);
|
|
109
|
-
var ContentCutIcon__default = /*#__PURE__*/_interopDefaultLegacy(ContentCutIcon);
|
|
110
|
-
var RemoveIcon__default = /*#__PURE__*/_interopDefaultLegacy(RemoveIcon);
|
|
111
|
-
var ClearIcon__default = /*#__PURE__*/_interopDefaultLegacy(ClearIcon);
|
|
112
|
-
var UnfoldLessIcon__default = /*#__PURE__*/_interopDefaultLegacy(UnfoldLessIcon);
|
|
113
|
-
var ExpandLessIcon__default = /*#__PURE__*/_interopDefaultLegacy(ExpandLessIcon);
|
|
114
|
-
var LockIcon__default = /*#__PURE__*/_interopDefaultLegacy(LockIcon);
|
|
115
|
-
var ErrorIcon__default = /*#__PURE__*/_interopDefaultLegacy(ErrorIcon);
|
|
116
|
-
var DownloadIcon__default = /*#__PURE__*/_interopDefaultLegacy(DownloadIcon);
|
|
117
|
-
var FactCheckIcon__default = /*#__PURE__*/_interopDefaultLegacy(FactCheckIcon);
|
|
118
|
-
var FileOpenIcon__default = /*#__PURE__*/_interopDefaultLegacy(FileOpenIcon);
|
|
119
|
-
var LogoutIcon__default = /*#__PURE__*/_interopDefaultLegacy(LogoutIcon);
|
|
120
|
-
var RedoIcon__default = /*#__PURE__*/_interopDefaultLegacy(RedoIcon);
|
|
121
|
-
var TrackChangesIcon__default = /*#__PURE__*/_interopDefaultLegacy(TrackChangesIcon);
|
|
122
|
-
var UndoIcon__default = /*#__PURE__*/_interopDefaultLegacy(UndoIcon);
|
|
123
|
-
var SaveIcon__default = /*#__PURE__*/_interopDefaultLegacy(SaveIcon);
|
|
124
|
-
|
|
125
|
-
var version = "0.3.11";
|
|
74
|
+
var version = "0.3.12";
|
|
126
75
|
|
|
127
76
|
const ApolloConfigSchema = configuration.ConfigurationSchema('ApolloInternetAccount', {
|
|
128
77
|
baseURL: {
|
|
@@ -405,21 +354,21 @@ function getAdjacentExons(currentExon, display, mousePosition, session) {
|
|
|
405
354
|
function getStreamIcon(strand, isUpstream, isFlipped) {
|
|
406
355
|
// This is the icon you would use for strand=1, downstream, straight
|
|
407
356
|
// (non-flipped) view
|
|
408
|
-
let icon =
|
|
357
|
+
let icon = SkipNextRoundedIcon;
|
|
409
358
|
if (strand === -1) {
|
|
410
|
-
icon =
|
|
359
|
+
icon = SkipPreviousRoundedIcon;
|
|
411
360
|
}
|
|
412
361
|
if (isUpstream) {
|
|
413
362
|
icon =
|
|
414
|
-
icon ===
|
|
415
|
-
?
|
|
416
|
-
:
|
|
363
|
+
icon === SkipPreviousRoundedIcon
|
|
364
|
+
? SkipNextRoundedIcon
|
|
365
|
+
: SkipPreviousRoundedIcon;
|
|
417
366
|
}
|
|
418
367
|
if (isFlipped) {
|
|
419
368
|
icon =
|
|
420
|
-
icon ===
|
|
421
|
-
?
|
|
422
|
-
:
|
|
369
|
+
icon === SkipPreviousRoundedIcon
|
|
370
|
+
? SkipNextRoundedIcon
|
|
371
|
+
: SkipPreviousRoundedIcon;
|
|
423
372
|
}
|
|
424
373
|
return icon;
|
|
425
374
|
}
|
|
@@ -677,8 +626,7 @@ function getApolloInternetAccount(session) {
|
|
|
677
626
|
return internetAccounts.find((ia) => ia.type === 'ApolloInternetAccount');
|
|
678
627
|
}
|
|
679
628
|
|
|
680
|
-
|
|
681
|
-
const useStyles$g = mui.makeStyles()((theme) => ({
|
|
629
|
+
const useStyles$g = tssReact.makeStyles()((theme) => ({
|
|
682
630
|
dialogTitle: {
|
|
683
631
|
background: theme.palette.primary.main,
|
|
684
632
|
color: theme.palette.primary.contrastText,
|
|
@@ -694,13 +642,9 @@ const useStyles$g = mui.makeStyles()((theme) => ({
|
|
|
694
642
|
const Dialog = mobxReact.observer(function JBrowseDialog(props) {
|
|
695
643
|
const { classes } = useStyles$g();
|
|
696
644
|
const { handleClose, title, ...other } = props;
|
|
697
|
-
return (
|
|
698
|
-
React__default["default"].createElement(material.DialogTitle, { className: classes.dialogTitle }, title),
|
|
699
|
-
React__default["default"].createElement(material.IconButton, { "aria-label": "close", onClick: handleClose, className: classes.closeButton },
|
|
700
|
-
React__default["default"].createElement(CloseIcon__default["default"], null))) }));
|
|
645
|
+
return (jsxRuntime.jsx(ui.Dialog, { ...other, header: jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(material.DialogTitle, { className: classes.dialogTitle, children: title }), jsxRuntime.jsx(material.IconButton, { "aria-label": "close", onClick: handleClose, className: classes.closeButton, children: jsxRuntime.jsx(CloseIcon, {}) })] }) }));
|
|
701
646
|
});
|
|
702
647
|
|
|
703
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
704
648
|
var FileType;
|
|
705
649
|
(function (FileType) {
|
|
706
650
|
FileType["GFF3"] = "text/x-gff3";
|
|
@@ -710,7 +654,7 @@ var FileType;
|
|
|
710
654
|
FileType["GZI"] = "application/x-gzi";
|
|
711
655
|
FileType["EXTERNAL"] = "text/x-external";
|
|
712
656
|
})(FileType || (FileType = {}));
|
|
713
|
-
const useStyles$f =
|
|
657
|
+
const useStyles$f = tssReact.makeStyles()((theme) => ({
|
|
714
658
|
accordion: {
|
|
715
659
|
border: `1px solid ${theme.palette.divider}`,
|
|
716
660
|
'&:not(:last-child)': {
|
|
@@ -766,6 +710,7 @@ function AddAssembly({ changeManager, handleClose, session, }) {
|
|
|
766
710
|
const [importFeatures, setImportFeatures] = React.useState(true);
|
|
767
711
|
const [sequenceIsEditable, setSequenceIsEditable] = React.useState(false);
|
|
768
712
|
const [submitted, setSubmitted] = React.useState(false);
|
|
713
|
+
const [strict, setStrict] = React.useState(true);
|
|
769
714
|
const [fastaFile, setFastaFile] = React.useState(null);
|
|
770
715
|
const [fastaIndexFile, setFastaIndexFile] = React.useState(null);
|
|
771
716
|
const [fastaGziIndexFile, setFastaGziIndexFile] = React.useState(null);
|
|
@@ -812,36 +757,33 @@ function AddAssembly({ changeManager, handleClose, session, }) {
|
|
|
812
757
|
locationType: 'UriLocation',
|
|
813
758
|
uri,
|
|
814
759
|
});
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
return '';
|
|
838
|
-
}
|
|
839
|
-
const result = await response.json();
|
|
840
|
-
const fileId = result._id;
|
|
841
|
-
jobsManager.done(job);
|
|
842
|
-
return fileId;
|
|
760
|
+
const job = {
|
|
761
|
+
name: `UploadAssemblyFile for ${assemblyName}`,
|
|
762
|
+
statusMessage: 'Pre-validating',
|
|
763
|
+
progressPct: 0,
|
|
764
|
+
cancelCallback: () => {
|
|
765
|
+
controller.abort(new DOMException(`Canceling adding of assembly "${assemblyName}"`, 'AbortError'));
|
|
766
|
+
jobsManager.abortJob(job.name);
|
|
767
|
+
},
|
|
768
|
+
};
|
|
769
|
+
jobsManager.runJob(job);
|
|
770
|
+
jobsManager.update(job.name, `Uploading ${file.name}, this may take awhile`);
|
|
771
|
+
const { signal } = controller;
|
|
772
|
+
const response = await apolloFetchFile(uri, {
|
|
773
|
+
method: 'POST',
|
|
774
|
+
body: formData,
|
|
775
|
+
signal,
|
|
776
|
+
});
|
|
777
|
+
if (!response.ok) {
|
|
778
|
+
const newErrorMessage = await createFetchErrorMessage(response, 'Error when inserting new assembly (while uploading file)');
|
|
779
|
+
jobsManager.abortJob(job.name, newErrorMessage);
|
|
780
|
+
setErrorMessage(newErrorMessage);
|
|
781
|
+
return '';
|
|
843
782
|
}
|
|
844
|
-
|
|
783
|
+
const result = await response.json();
|
|
784
|
+
const fileId = result._id;
|
|
785
|
+
jobsManager.done(job);
|
|
786
|
+
return fileId;
|
|
845
787
|
}
|
|
846
788
|
async function onSubmit(event) {
|
|
847
789
|
event.preventDefault();
|
|
@@ -855,7 +797,7 @@ function AddAssembly({ changeManager, handleClose, session, }) {
|
|
|
855
797
|
if (fileType === FileType.EXTERNAL) {
|
|
856
798
|
change = new shared.AddAssemblyFromExternalChange({
|
|
857
799
|
typeName: 'AddAssemblyFromExternalChange',
|
|
858
|
-
assembly: new
|
|
800
|
+
assembly: new ObjectID().toHexString(),
|
|
859
801
|
assemblyName,
|
|
860
802
|
externalLocation: {
|
|
861
803
|
fa: fastaUrl,
|
|
@@ -872,16 +814,17 @@ function AddAssembly({ changeManager, handleClose, session, }) {
|
|
|
872
814
|
const faId = await uploadFile(fastaFile, FileType.GFF3);
|
|
873
815
|
change = new shared.AddAssemblyAndFeaturesFromFileChange({
|
|
874
816
|
typeName: 'AddAssemblyAndFeaturesFromFileChange',
|
|
875
|
-
assembly: new
|
|
817
|
+
assembly: new ObjectID().toHexString(),
|
|
876
818
|
assemblyName,
|
|
877
819
|
fileIds: { fa: faId },
|
|
820
|
+
parseOptions: { strict },
|
|
878
821
|
});
|
|
879
822
|
}
|
|
880
823
|
else if (fileType === FileType.GFF3) {
|
|
881
824
|
const faId = await uploadFile(fastaFile, FileType.GFF3);
|
|
882
825
|
change = new shared.AddAssemblyFromFileChange({
|
|
883
826
|
typeName: 'AddAssemblyFromFileChange',
|
|
884
|
-
assembly: new
|
|
827
|
+
assembly: new ObjectID().toHexString(),
|
|
885
828
|
assemblyName,
|
|
886
829
|
fileIds: {
|
|
887
830
|
fa: faId,
|
|
@@ -892,7 +835,7 @@ function AddAssembly({ changeManager, handleClose, session, }) {
|
|
|
892
835
|
const faId = await uploadFile(fastaFile, FileType.FASTA);
|
|
893
836
|
change = new shared.AddAssemblyFromFileChange({
|
|
894
837
|
typeName: 'AddAssemblyFromFileChange',
|
|
895
|
-
assembly: new
|
|
838
|
+
assembly: new ObjectID().toHexString(),
|
|
896
839
|
assemblyName,
|
|
897
840
|
fileIds: {
|
|
898
841
|
fa: faId,
|
|
@@ -908,7 +851,7 @@ function AddAssembly({ changeManager, handleClose, session, }) {
|
|
|
908
851
|
const gziId = await uploadFile(fastaGziIndexFile, FileType.GZI);
|
|
909
852
|
change = new shared.AddAssemblyFromFileChange({
|
|
910
853
|
typeName: 'AddAssemblyFromFileChange',
|
|
911
|
-
assembly: new
|
|
854
|
+
assembly: new ObjectID().toHexString(),
|
|
912
855
|
assemblyName,
|
|
913
856
|
fileIds: {
|
|
914
857
|
fa: faId,
|
|
@@ -956,157 +899,82 @@ function AddAssembly({ changeManager, handleClose, session, }) {
|
|
|
956
899
|
catch {
|
|
957
900
|
// pass
|
|
958
901
|
}
|
|
959
|
-
const [expanded, setExpanded] =
|
|
902
|
+
const [expanded, setExpanded] = React.useState('panelFastaInput');
|
|
960
903
|
const handleAccordionChange = (panel) => (event, newExpanded) => {
|
|
961
904
|
if (newExpanded) {
|
|
962
905
|
setExpanded(panel);
|
|
963
906
|
}
|
|
964
907
|
};
|
|
965
|
-
return (
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
if (file
|
|
1022
|
-
|
|
908
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, handleClose: handleClose, "data-testid": "add-assembly-dialog", title: "Add new assembly", maxWidth: false, children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, "data-testid": "submit-form", children: [jsxRuntime.jsxs(material.DialogContent, { className: classes.dialog, children: [loading ? jsxRuntime.jsx(material.LinearProgress, {}) : null, jsxRuntime.jsx(material.TextField, { margin: "dense", id: "name", label: "Assembly name", type: "TextField", fullWidth: true, variant: "outlined", onChange: (e) => {
|
|
909
|
+
setSubmitted(false);
|
|
910
|
+
setAssemblyName(e.target.value);
|
|
911
|
+
checkAssemblyName(e.target.value);
|
|
912
|
+
}, disabled: submitted && !errorMessage }), jsxRuntime.jsxs(material.Accordion, { disableGutters: true, elevation: 0, square: true, className: classes.accordion, expanded: expanded === 'panelFastaInput', onChange: handleAccordionChange('panelFastaInput'), children: [jsxRuntime.jsx(material.AccordionSummary, { className: classes.accordionSummary, expandIcon: expanded === 'panelFastaInput' ? (jsxRuntime.jsx(RadioButtonCheckedIcon, { className: classes.radioIcon, sx: { fontSize: '1.2rem', ml: 5 } })) : (jsxRuntime.jsx(RadioButtonUncheckedIcon, { className: classes.radioIcon, sx: { fontSize: '1.2rem', mr: 5 } })), "aria-controls": "panelFastaInputd-content", id: "panelFastaInputd-header", children: jsxRuntime.jsx(material.Typography, { component: "span", children: "FASTA input" }) }), jsxRuntime.jsx(material.AccordionDetails, { className: classes.accordionDetails, children: jsxRuntime.jsxs(material.FormGroup, { children: [jsxRuntime.jsx(material.FormControlLabel, { "data-testid": "files-on-url-checkbox", control: jsxRuntime.jsx(material.Checkbox, { onChange: () => {
|
|
913
|
+
setFileType(fileType === FileType.EXTERNAL
|
|
914
|
+
? FileType.BGZIP_FASTA
|
|
915
|
+
: FileType.EXTERNAL);
|
|
916
|
+
if (fileType === FileType.EXTERNAL) {
|
|
917
|
+
setSequenceIsEditable(false);
|
|
918
|
+
}
|
|
919
|
+
}, checked: fileType === FileType.EXTERNAL, disabled: sequenceIsEditable && fileType !== FileType.GFF3 }), label: jsxRuntime.jsxs(material.Box, { display: "flex", alignItems: "center", children: ["Use external URLs", jsxRuntime.jsx(material.Tooltip, { title: "Use external URLs to provide FASTA and index files. Does not copy the files to the Apollo collaboration server, so ensure the URLs are stable.", placement: "top-start", children: jsxRuntime.jsx(material.IconButton, { size: "small", children: jsxRuntime.jsx(InfoIcon, { sx: { fontSize: 18 } }) }) })] }) }), jsxRuntime.jsx(material.FormControlLabel, { "data-testid": "sequence-is-editable-checkbox", control: jsxRuntime.jsx(material.Checkbox, { onChange: () => {
|
|
920
|
+
setSequenceIsEditable(!sequenceIsEditable);
|
|
921
|
+
} }), checked: sequenceIsEditable, disabled: fileType === FileType.EXTERNAL, label: jsxRuntime.jsxs(material.Box, { display: "flex", alignItems: "center", children: ["Store sequence in database", jsxRuntime.jsx(material.Tooltip, { title: "Enables users to edit the genomic sequence, but comes with performance impacts. Use with care.", placement: "top-start", children: jsxRuntime.jsx(material.IconButton, { size: "small", children: jsxRuntime.jsx(InfoIcon, { sx: { fontSize: 18 } }) }) })] }) }), jsxRuntime.jsx(material.FormControlLabel, { "data-testid": "fasta-is-gzip-checkbox", control: jsxRuntime.jsx(material.Checkbox, { checked: !sequenceIsEditable || fastaGzipChecked, onChange: () => {
|
|
922
|
+
if (sequenceIsEditable) {
|
|
923
|
+
setFastaGzipChecked(!fastaGzipChecked);
|
|
924
|
+
}
|
|
925
|
+
else {
|
|
926
|
+
setFastaGzipChecked(true);
|
|
927
|
+
}
|
|
928
|
+
}, disabled: !sequenceIsEditable }), label: "FASTA is gzip compressed" }), fileType === FileType.BGZIP_FASTA ||
|
|
929
|
+
fileType === FileType.GFF3 ? (jsxRuntime.jsx(material.Table, { size: "small", sx: { mt: 2 }, children: jsxRuntime.jsxs(material.TableBody, { children: [jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: jsxRuntime.jsxs(material.Box, { display: "flex", alignItems: "center", children: [jsxRuntime.jsx("span", { children: "FASTA" }), jsxRuntime.jsx(material.Tooltip, { title: 'Unless "Store sequence in database" enabled, FASTA input must be compressed with bgzip and indexed with samtools faidx (or equivalent). Compression is optional for sequences stored in the database.', children: jsxRuntime.jsx(material.IconButton, { size: "small", children: jsxRuntime.jsx(InfoIcon, { sx: { fontSize: 18 } }) }) })] }) }), jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: jsxRuntime.jsx("input", { "data-testid": "fasta-input-file", type: "file", onChange: (e) => {
|
|
930
|
+
const file = e.target.files?.item(0);
|
|
931
|
+
if (file) {
|
|
932
|
+
setFastaFile(file);
|
|
933
|
+
if (file.name.endsWith('.gz')) {
|
|
934
|
+
setFastaGzipChecked(true);
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
}, disabled: submitted && !errorMessage }) })] }), jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: "FASTA index (.fai)" }), jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: jsxRuntime.jsx("input", { "data-testid": "fai-input-file", type: "file", onChange: (e) => {
|
|
938
|
+
setFastaIndexFile(e.target.files?.item(0) ?? null);
|
|
939
|
+
}, disabled: (submitted && !errorMessage) || sequenceIsEditable }) })] }), jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: "FASTA binary index (.gzi)" }), jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: jsxRuntime.jsx("input", { "data-testid": "gzi-input-file", type: "file", onChange: (e) => {
|
|
940
|
+
setFastaGziIndexFile(e.target.files?.item(0) ?? null);
|
|
941
|
+
}, disabled: (submitted && !errorMessage) || sequenceIsEditable }) })] })] }) })) : (jsxRuntime.jsx(material.Table, { size: "small", sx: { mt: 2 }, children: jsxRuntime.jsxs(material.TableBody, { children: [jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: jsxRuntime.jsxs(material.Box, { display: "flex", alignItems: "center", children: [jsxRuntime.jsx("span", { children: "FASTA" }), jsxRuntime.jsx(material.Tooltip, { title: "Remote FASTA input must be compressed with bgzip and indexed with samtools faidx (or equivalent)", children: jsxRuntime.jsx(material.IconButton, { size: "small", children: jsxRuntime.jsx(InfoIcon, { sx: { fontSize: 18 } }) }) })] }) }), jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: jsxRuntime.jsx(material.TextField, { "data-testid": "fasta-input-url", variant: "outlined", value: fastaUrl, error: !validFastaUrl, onChange: (e) => {
|
|
942
|
+
const { value } = e.target;
|
|
943
|
+
setFastaUrl(value);
|
|
944
|
+
setFastaIndexUrl(value ? `${value}.fai` : '');
|
|
945
|
+
setFastaGziIndexUrl(value ? `${value}.gzi` : '');
|
|
946
|
+
}, disabled: submitted && !errorMessage, slotProps: {
|
|
947
|
+
input: {
|
|
948
|
+
startAdornment: (jsxRuntime.jsx(material.InputAdornment, { position: "start", children: jsxRuntime.jsx(LinkIcon, {}) })),
|
|
949
|
+
},
|
|
950
|
+
} }) })] }), jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: "FASTA index (.fai)" }), jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: jsxRuntime.jsx(material.TextField, { "data-testid": "fai-input-url", variant: "outlined", value: fastaIndexUrl, error: !validFastaIndexUrl, onChange: (e) => {
|
|
951
|
+
setFastaIndexUrl(e.target.value);
|
|
952
|
+
}, disabled: submitted && !errorMessage, slotProps: {
|
|
953
|
+
input: {
|
|
954
|
+
startAdornment: (jsxRuntime.jsx(material.InputAdornment, { position: "start", children: jsxRuntime.jsx(LinkIcon, {}) })),
|
|
955
|
+
},
|
|
956
|
+
} }) })] }), jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: "FASTA binary index (.gzi)" }), jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: jsxRuntime.jsx(material.TextField, { "data-testid": "gzi-input-url", variant: "outlined", value: fastaGziIndexUrl, error: !validFastaGziIndexUrl, onChange: (e) => {
|
|
957
|
+
setFastaGziIndexUrl(e.target.value);
|
|
958
|
+
}, disabled: submitted && !errorMessage, slotProps: {
|
|
959
|
+
input: {
|
|
960
|
+
startAdornment: (jsxRuntime.jsx(material.InputAdornment, { position: "start", children: jsxRuntime.jsx(LinkIcon, {}) })),
|
|
961
|
+
},
|
|
962
|
+
} }) })] })] }) }))] }) })] }), jsxRuntime.jsxs(material.Accordion, { disableGutters: true, elevation: 0, square: true, className: classes.accordion, expanded: expanded === 'panelGffInput', onChange: handleAccordionChange('panelGffInput'), children: [jsxRuntime.jsx(material.AccordionSummary, { className: classes.accordionSummary, expandIcon: expanded === 'panelGffInput' ? (jsxRuntime.jsx(RadioButtonCheckedIcon, { className: classes.radioIcon, sx: { fontSize: '1.2rem', ml: 5 } })) : (jsxRuntime.jsx(RadioButtonUncheckedIcon, { className: classes.radioIcon, sx: { fontSize: '1.2rem', mr: 5 } })), "aria-controls": "panelGffInputd-content", children: jsxRuntime.jsxs(material.Typography, { component: "span", children: ["GFF3 input", jsxRuntime.jsx(material.Tooltip, { title: "GFF3 must includes FASTA sequences. File can be gzip compressed.", children: jsxRuntime.jsx(InfoIcon, { className: classes.radioIcon, sx: { fontSize: 18 } }) })] }) }), jsxRuntime.jsx(material.AccordionDetails, { className: classes.accordionDetails, children: jsxRuntime.jsxs(material.Box, { style: { marginTop: 20 }, children: [jsxRuntime.jsx("input", { "data-testid": "gff3-input-file", type: "file", disabled: submitted && !errorMessage, onChange: (e) => {
|
|
963
|
+
const file = e.target.files?.item(0);
|
|
964
|
+
if (file) {
|
|
965
|
+
setFastaFile(file);
|
|
966
|
+
setFileType(FileType.GFF3);
|
|
967
|
+
if (file.name.endsWith('.gz')) {
|
|
968
|
+
setGff3GzipChecked(true);
|
|
969
|
+
}
|
|
1023
970
|
}
|
|
1024
|
-
}
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
}, disabled: (submitted && !errorMessage) || sequenceIsEditable }))),
|
|
1032
|
-
React__default["default"].createElement(material.TableRow, null,
|
|
1033
|
-
React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } }, "FASTA binary index (.gzi)"),
|
|
1034
|
-
React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } },
|
|
1035
|
-
React__default["default"].createElement("input", { "data-testid": "gzi-input-file", type: "file", onChange: (e) => {
|
|
1036
|
-
setFastaGziIndexFile(e.target.files?.item(0) ?? null);
|
|
1037
|
-
}, disabled: (submitted && !errorMessage) || sequenceIsEditable })))))) : (React__default["default"].createElement(material.Table, { size: "small", sx: { mt: 2 } },
|
|
1038
|
-
React__default["default"].createElement(material.TableBody, null,
|
|
1039
|
-
React__default["default"].createElement(material.TableRow, null,
|
|
1040
|
-
React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } },
|
|
1041
|
-
React__default["default"].createElement(material.Box, { display: "flex", alignItems: "center" },
|
|
1042
|
-
React__default["default"].createElement("span", null, "FASTA"),
|
|
1043
|
-
React__default["default"].createElement(material.Tooltip, { title: "Remote FASTA input must be compressed with bgzip and indexed with samtools faidx (or equivalent)" },
|
|
1044
|
-
React__default["default"].createElement(material.IconButton, { size: "small" },
|
|
1045
|
-
React__default["default"].createElement(InfoIcon__default["default"], { sx: { fontSize: 18 } }))))),
|
|
1046
|
-
React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } },
|
|
1047
|
-
React__default["default"].createElement(material.TextField, { "data-testid": "fasta-input-url", variant: "outlined", value: fastaUrl, error: !validFastaUrl, onChange: (e) => {
|
|
1048
|
-
const { value } = e.target;
|
|
1049
|
-
setFastaUrl(value);
|
|
1050
|
-
setFastaIndexUrl(value ? `${value}.fai` : '');
|
|
1051
|
-
setFastaGziIndexUrl(value ? `${value}.gzi` : '');
|
|
1052
|
-
}, disabled: submitted && !errorMessage, slotProps: {
|
|
1053
|
-
input: {
|
|
1054
|
-
startAdornment: (React__default["default"].createElement(material.InputAdornment, { position: "start" },
|
|
1055
|
-
React__default["default"].createElement(LinkIcon__default["default"], null))),
|
|
1056
|
-
},
|
|
1057
|
-
} }))),
|
|
1058
|
-
React__default["default"].createElement(material.TableRow, null,
|
|
1059
|
-
React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } }, "FASTA index (.fai)"),
|
|
1060
|
-
React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } },
|
|
1061
|
-
React__default["default"].createElement(material.TextField, { "data-testid": "fai-input-url", variant: "outlined", value: fastaIndexUrl, error: !validFastaIndexUrl, onChange: (e) => {
|
|
1062
|
-
setFastaIndexUrl(e.target.value);
|
|
1063
|
-
}, disabled: submitted && !errorMessage, slotProps: {
|
|
1064
|
-
input: {
|
|
1065
|
-
startAdornment: (React__default["default"].createElement(material.InputAdornment, { position: "start" },
|
|
1066
|
-
React__default["default"].createElement(LinkIcon__default["default"], null))),
|
|
1067
|
-
},
|
|
1068
|
-
} }))),
|
|
1069
|
-
React__default["default"].createElement(material.TableRow, null,
|
|
1070
|
-
React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } }, "FASTA binary index (.gzi)"),
|
|
1071
|
-
React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } },
|
|
1072
|
-
React__default["default"].createElement(material.TextField, { "data-testid": "gzi-input-url", variant: "outlined", value: fastaGziIndexUrl, error: !validFastaGziIndexUrl, onChange: (e) => {
|
|
1073
|
-
setFastaGziIndexUrl(e.target.value);
|
|
1074
|
-
}, disabled: submitted && !errorMessage, slotProps: {
|
|
1075
|
-
input: {
|
|
1076
|
-
startAdornment: (React__default["default"].createElement(material.InputAdornment, { position: "start" },
|
|
1077
|
-
React__default["default"].createElement(LinkIcon__default["default"], null))),
|
|
1078
|
-
},
|
|
1079
|
-
} }))))))))),
|
|
1080
|
-
React__default["default"].createElement(material.Accordion, { disableGutters: true, elevation: 0, square: true, className: classes.accordion, expanded: expanded === 'panelGffInput', onChange: handleAccordionChange('panelGffInput') },
|
|
1081
|
-
React__default["default"].createElement(material.AccordionSummary, { className: classes.accordionSummary, expandIcon: expanded === 'panelGffInput' ? (React__default["default"].createElement(RadioButtonCheckedIcon__default["default"], { className: classes.radioIcon, sx: { fontSize: '1.2rem', ml: 5 } })) : (React__default["default"].createElement(RadioButtonUncheckedIcon__default["default"], { className: classes.radioIcon, sx: { fontSize: '1.2rem', mr: 5 } })), "aria-controls": "panelGffInputd-content" },
|
|
1082
|
-
React__default["default"].createElement(material.Typography, { component: "span" },
|
|
1083
|
-
"GFF3 input",
|
|
1084
|
-
React__default["default"].createElement(material.Tooltip, { title: "GFF3 must includes FASTA sequences. File can be gzip compressed." },
|
|
1085
|
-
React__default["default"].createElement(InfoIcon__default["default"], { className: classes.radioIcon, sx: { fontSize: 18 } })))),
|
|
1086
|
-
React__default["default"].createElement(material.AccordionDetails, { className: classes.accordionDetails },
|
|
1087
|
-
React__default["default"].createElement(material.Box, { style: { marginTop: 20 } },
|
|
1088
|
-
React__default["default"].createElement("input", { "data-testid": "gff3-input-file", type: "file", disabled: submitted && !errorMessage, onChange: (e) => {
|
|
1089
|
-
const file = e.target.files?.item(0);
|
|
1090
|
-
if (file) {
|
|
1091
|
-
setFastaFile(file);
|
|
1092
|
-
setFileType(FileType.GFF3);
|
|
1093
|
-
if (file.name.endsWith('.gz')) {
|
|
1094
|
-
setGff3GzipChecked(true);
|
|
1095
|
-
}
|
|
1096
|
-
}
|
|
1097
|
-
} }),
|
|
1098
|
-
React__default["default"].createElement(material.FormGroup, { style: { display: 'grid' } },
|
|
1099
|
-
React__default["default"].createElement(material.FormControlLabel, { control: React__default["default"].createElement(material.Checkbox, { checked: importFeatures, onChange: () => {
|
|
1100
|
-
setImportFeatures(!importFeatures);
|
|
1101
|
-
}, disabled: submitted && !errorMessage }), label: "Load features from GFF3 file" }),
|
|
1102
|
-
React__default["default"].createElement(material.FormControlLabel, { "data-testid": "gff3-is-gzip-checkbox", control: React__default["default"].createElement(material.Checkbox, { checked: gff3GzipChecked, onChange: () => {
|
|
1103
|
-
setGff3GzipChecked(!gff3GzipChecked);
|
|
1104
|
-
}, disabled: submitted && !errorMessage }), label: "GFF3 is gzip compressed" })))))),
|
|
1105
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
1106
|
-
React__default["default"].createElement(material.Button, { disabled: !checkSumbission(validAsm, sequenceIsEditable, fileType, fastaFile, fastaIndexFile, fastaGziIndexFile, validFastaUrl, validFastaIndexUrl, validFastaGziIndexUrl) || submitted, variant: "contained", type: "submit", "data-testid": "submit-button" }, submitted ? 'Submitting...' : 'Submit'),
|
|
1107
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
|
|
1108
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
1109
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
971
|
+
} }), jsxRuntime.jsxs(material.FormGroup, { style: { display: 'grid' }, children: [jsxRuntime.jsx(material.FormControlLabel, { control: jsxRuntime.jsx(material.Checkbox, { checked: importFeatures, onChange: () => {
|
|
972
|
+
setImportFeatures(!importFeatures);
|
|
973
|
+
}, disabled: submitted && !errorMessage }), label: "Load features from GFF3 file" }), jsxRuntime.jsx(material.FormControlLabel, { label: "Strict parsing", disabled: !importFeatures || (submitted && !errorMessage), control: jsxRuntime.jsx(material.Checkbox, { checked: strict, onChange: (e) => {
|
|
974
|
+
setStrict(e.target.checked);
|
|
975
|
+
} }) }), jsxRuntime.jsx(material.FormHelperText, { children: "Don't import any features if any lines in the GFF3 are unable to be processed" }), jsxRuntime.jsx(material.FormControlLabel, { "data-testid": "gff3-is-gzip-checkbox", control: jsxRuntime.jsx(material.Checkbox, { checked: gff3GzipChecked, onChange: () => {
|
|
976
|
+
setGff3GzipChecked(!gff3GzipChecked);
|
|
977
|
+
}, disabled: submitted && !errorMessage }), label: "GFF3 is gzip compressed" })] })] }) })] })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { disabled: !checkSumbission(validAsm, sequenceIsEditable, fileType, fastaFile, fastaIndexFile, fastaGziIndexFile, validFastaUrl, validFastaIndexUrl, validFastaGziIndexUrl) || submitted, variant: "contained", type: "submit", "data-testid": "submit-button", children: submitted ? 'Submitting...' : 'Submit' }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
1110
978
|
}
|
|
1111
979
|
|
|
1112
980
|
const columns$1 = [
|
|
@@ -1134,7 +1002,7 @@ function AddAssemblyAliases({ changeManager, handleClose, session, }) {
|
|
|
1134
1002
|
aliases: assembly.aliases.join(', '),
|
|
1135
1003
|
};
|
|
1136
1004
|
});
|
|
1137
|
-
const [errorMessage, setErrorMessage] =
|
|
1005
|
+
const [errorMessage, setErrorMessage] = React.useState('');
|
|
1138
1006
|
const processRowUpdate = (newRow, _oldRow) => {
|
|
1139
1007
|
const change = new shared.AddAssemblyAliasesChange({
|
|
1140
1008
|
typeName: 'AddAssemblyAliasesChange',
|
|
@@ -1147,18 +1015,13 @@ function AddAssemblyAliases({ changeManager, handleClose, session, }) {
|
|
|
1147
1015
|
handleClose();
|
|
1148
1016
|
return newRow;
|
|
1149
1017
|
};
|
|
1150
|
-
return (
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
paginationModel: {
|
|
1156
|
-
pageSize: 5,
|
|
1018
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Add assembly aliases", handleClose: handleClose, maxWidth: 'sm', "data-testid": "add-assembly-alias", fullWidth: true, children: [jsxRuntime.jsx(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: jsxRuntime.jsx(material.Box, { sx: { height: 400, width: '100%' }, children: jsxRuntime.jsx(xDataGrid.DataGrid, { rows: rows, columns: columns$1, initialState: {
|
|
1019
|
+
pagination: {
|
|
1020
|
+
paginationModel: {
|
|
1021
|
+
pageSize: 5,
|
|
1022
|
+
},
|
|
1157
1023
|
},
|
|
1158
|
-
},
|
|
1159
|
-
}, pageSizeOptions: [5], processRowUpdate: processRowUpdate, disableRowSelectionOnClick: true }))),
|
|
1160
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
1161
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
1024
|
+
}, pageSizeOptions: [5], processRowUpdate: processRowUpdate, disableRowSelectionOnClick: true }) }) }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
1162
1025
|
}
|
|
1163
1026
|
|
|
1164
1027
|
/** set of words that should be ignored by fulltext indexing */
|
|
@@ -1342,6 +1205,8 @@ function expandPrefixes(uri, prefixes) {
|
|
|
1342
1205
|
}
|
|
1343
1206
|
|
|
1344
1207
|
/* eslint-disable @typescript-eslint/no-unnecessary-condition */
|
|
1208
|
+
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
1209
|
+
// jsonpath triggers this rule for some reason. import { query } from 'jsonpath' does not work
|
|
1345
1210
|
/** special value of jsonPath that gets the IRI (that is, ID) of the node with the configured prefixes applied */
|
|
1346
1211
|
const PREFIXED_ID_PATH = '$PREFIXED_ID';
|
|
1347
1212
|
/** small wrapper for jsonpath.query that intercepts requests for the special prefixed ID path */
|
|
@@ -1349,7 +1214,15 @@ function jsonPathQuery(node, path, prefixes) {
|
|
|
1349
1214
|
if (path === PREFIXED_ID_PATH) {
|
|
1350
1215
|
return [applyPrefixes(node.id, prefixes)];
|
|
1351
1216
|
}
|
|
1352
|
-
|
|
1217
|
+
let response;
|
|
1218
|
+
try {
|
|
1219
|
+
response = jsonpath.query(node, path);
|
|
1220
|
+
}
|
|
1221
|
+
catch {
|
|
1222
|
+
// eslint-disable-next-line unicorn/prefer-structured-clone
|
|
1223
|
+
response = jsonpath.query(JSON.parse(JSON.stringify(node)), path);
|
|
1224
|
+
}
|
|
1225
|
+
return response;
|
|
1353
1226
|
}
|
|
1354
1227
|
function wordsInString(str) {
|
|
1355
1228
|
return str
|
|
@@ -1372,7 +1245,7 @@ function* extractStrings(things) {
|
|
|
1372
1245
|
yield thing;
|
|
1373
1246
|
}
|
|
1374
1247
|
else if (typeof thing === 'object') {
|
|
1375
|
-
const members =
|
|
1248
|
+
const members = jsonpath.query(thing, '$..*');
|
|
1376
1249
|
yield* extractStrings(members);
|
|
1377
1250
|
}
|
|
1378
1251
|
}
|
|
@@ -1685,11 +1558,12 @@ async function isDatabaseCurrent(db) {
|
|
|
1685
1558
|
return false;
|
|
1686
1559
|
}
|
|
1687
1560
|
// check that the index paths and prefixes are the same as our current ones
|
|
1688
|
-
return (
|
|
1689
|
-
|
|
1561
|
+
return (equal(this.options.prefixes, meta.storeOptions.prefixes) &&
|
|
1562
|
+
equal(this.options.textIndexing, meta.storeOptions.textIndexing));
|
|
1690
1563
|
}
|
|
1691
1564
|
|
|
1692
1565
|
/* eslint-disable @typescript-eslint/only-throw-error */
|
|
1566
|
+
/* eslint-disable unicorn/no-await-expression-member */
|
|
1693
1567
|
async function arrayFromAsync(iter) {
|
|
1694
1568
|
const a = [];
|
|
1695
1569
|
for await (const i of iter) {
|
|
@@ -2185,7 +2059,6 @@ async function fetchValidDescendantTerms(parentFeature, ontologyStore, _signal)
|
|
|
2185
2059
|
return subpartTerms;
|
|
2186
2060
|
}
|
|
2187
2061
|
|
|
2188
|
-
/* eslint-disable @typescript-eslint/no-unnecessary-condition */
|
|
2189
2062
|
function OntologyTermAutocomplete({ fetchValidTerms, filterTerms: filterTermsProp, includeDeprecated, onChange, ontologyName, ontologyVersion, renderInput, session, style, value: valueString, }) {
|
|
2190
2063
|
const [open, setOpen] = React.useState(false);
|
|
2191
2064
|
const [termChoices, setTermChoices] = React.useState();
|
|
@@ -2216,7 +2089,7 @@ function OntologyTermAutocomplete({ fetchValidTerms, filterTerms: filterTermsPro
|
|
|
2216
2089
|
});
|
|
2217
2090
|
}
|
|
2218
2091
|
return () => {
|
|
2219
|
-
controller.abort('
|
|
2092
|
+
controller.abort(new DOMException('Cancel getting current term from ontology store', 'AbortError'));
|
|
2220
2093
|
};
|
|
2221
2094
|
}, [session, valueString, filterTerms, ontologyStore, needToLoadCurrentTerm]);
|
|
2222
2095
|
// effect for loading term autocompletions
|
|
@@ -2235,7 +2108,7 @@ function OntologyTermAutocomplete({ fetchValidTerms, filterTerms: filterTermsPro
|
|
|
2235
2108
|
});
|
|
2236
2109
|
}
|
|
2237
2110
|
return () => {
|
|
2238
|
-
controller.abort('
|
|
2111
|
+
controller.abort(new DOMException('Canceling getting valid terms from ontology store', 'AbortError'));
|
|
2239
2112
|
};
|
|
2240
2113
|
}, [
|
|
2241
2114
|
needToLoadTermChoices,
|
|
@@ -2263,14 +2136,14 @@ function OntologyTermAutocomplete({ fetchValidTerms, filterTerms: filterTermsPro
|
|
|
2263
2136
|
extraTextFieldParams.error = true;
|
|
2264
2137
|
extraTextFieldParams.helperText = currentOntologyTermInvalid;
|
|
2265
2138
|
}
|
|
2266
|
-
return (
|
|
2139
|
+
return (jsxRuntime.jsx(material.Autocomplete, { style: style, autoComplete: true, filterSelectedOptions: true, disableClearable: true, selectOnFocus: true, clearOnBlur: true, handleHomeEndKeys: true, freeSolo: true, value: valueString, options: termChoices ?? [], onOpen: () => {
|
|
2267
2140
|
setOpen(true);
|
|
2268
2141
|
}, onClose: () => {
|
|
2269
2142
|
setOpen(false);
|
|
2270
2143
|
},
|
|
2271
2144
|
// noOptionsText={valueString ? 'No matches' : 'Start typing to search'}
|
|
2272
2145
|
loading: needToLoadTermChoices, renderInput: renderInput ??
|
|
2273
|
-
((params) =>
|
|
2146
|
+
((params) => jsxRuntime.jsx(material.TextField, { ...params, ...extraTextFieldParams })), getOptionLabel: (option) => {
|
|
2274
2147
|
if (typeof option === 'string') {
|
|
2275
2148
|
return option;
|
|
2276
2149
|
}
|
|
@@ -2303,7 +2176,6 @@ async function getValidTerms(ontologyStore, fetchValidTerms, filterTerms, signal
|
|
|
2303
2176
|
return filterTerms ? result.filter((element) => filterTerms(element)) : result;
|
|
2304
2177
|
}
|
|
2305
2178
|
|
|
2306
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
2307
2179
|
function AddChildFeature({ changeManager, handleClose, session, sourceAssemblyId, sourceFeature, }) {
|
|
2308
2180
|
const [end, setEnd] = React.useState(String(sourceFeature.max));
|
|
2309
2181
|
const [start, setStart] = React.useState(String(sourceFeature.min + 1));
|
|
@@ -2321,7 +2193,7 @@ function AddChildFeature({ changeManager, handleClose, session, sourceAssemblyId
|
|
|
2321
2193
|
function onSubmit(event) {
|
|
2322
2194
|
event.preventDefault();
|
|
2323
2195
|
setErrorMessage('');
|
|
2324
|
-
const _id = new
|
|
2196
|
+
const _id = new ObjectID().toHexString();
|
|
2325
2197
|
const change = new shared.AddFeatureChange({
|
|
2326
2198
|
changedIds: [sourceFeature._id],
|
|
2327
2199
|
typeName: 'AddFeatureChange',
|
|
@@ -2346,25 +2218,15 @@ function AddChildFeature({ changeManager, handleClose, session, sourceAssemblyId
|
|
|
2346
2218
|
setType(newType);
|
|
2347
2219
|
}
|
|
2348
2220
|
const error = Number(end) <= Number(start);
|
|
2349
|
-
return (
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
|
|
2357
|
-
|
|
2358
|
-
React__default["default"].createElement(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", style: { width: 170 }, value: type, filterTerms: isOntologyClass, fetchValidTerms: fetchValidTerms.bind(null, sourceFeature), renderInput: (params) => (React__default["default"].createElement(material.TextField, { ...params, label: "Type", variant: "outlined", fullWidth: true, error: Boolean(typeWarningText), helperText: typeWarningText })), onChange: (oldValue, newValue) => {
|
|
2359
|
-
if (newValue) {
|
|
2360
|
-
handleChangeType(newValue);
|
|
2361
|
-
}
|
|
2362
|
-
} })),
|
|
2363
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
2364
|
-
React__default["default"].createElement(material.Button, { variant: "contained", type: "submit", disabled: error || !(start && end && type) }, "Submit"),
|
|
2365
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
|
|
2366
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
2367
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
2221
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Add new child feature", handleClose: handleClose, maxWidth: false, "data-testid": "add-feature-dialog", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [jsxRuntime.jsx(material.TextField, { margin: "dense", id: "start", label: "Start", type: "number", fullWidth: true, variant: "outlined", value: start, onChange: (e) => {
|
|
2222
|
+
setStart(e.target.value);
|
|
2223
|
+
} }), jsxRuntime.jsx(material.TextField, { margin: "dense", id: "end", label: "End", type: "number", fullWidth: true, variant: "outlined", value: end, onChange: (e) => {
|
|
2224
|
+
setEnd(e.target.value);
|
|
2225
|
+
}, error: error, helperText: error ? '"End" must be greater than "Start"' : null }), jsxRuntime.jsx(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", style: { width: 170 }, value: type, filterTerms: isOntologyClass, fetchValidTerms: fetchValidTerms.bind(null, sourceFeature), renderInput: (params) => (jsxRuntime.jsx(material.TextField, { ...params, label: "Type", variant: "outlined", fullWidth: true, error: Boolean(typeWarningText), helperText: typeWarningText })), onChange: (oldValue, newValue) => {
|
|
2226
|
+
if (newValue) {
|
|
2227
|
+
handleChangeType(newValue);
|
|
2228
|
+
}
|
|
2229
|
+
} })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", disabled: error || !(start && end && type), children: "Submit" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
2368
2230
|
}
|
|
2369
2231
|
|
|
2370
2232
|
class BackendDriver {
|
|
@@ -2375,6 +2237,8 @@ class BackendDriver {
|
|
|
2375
2237
|
}
|
|
2376
2238
|
|
|
2377
2239
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
2240
|
+
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
2241
|
+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
2378
2242
|
class ChangeManager {
|
|
2379
2243
|
dataStore;
|
|
2380
2244
|
constructor(dataStore) {
|
|
@@ -2404,7 +2268,7 @@ class ChangeManager {
|
|
|
2404
2268
|
statusMessage: 'Pre-validating',
|
|
2405
2269
|
progressPct: 0,
|
|
2406
2270
|
cancelCallback: () => {
|
|
2407
|
-
controller.abort('
|
|
2271
|
+
controller.abort(new DOMException(`Cancelling change "${change.typeName}"`, 'AbortError'));
|
|
2408
2272
|
},
|
|
2409
2273
|
};
|
|
2410
2274
|
if (updateJobsManager) {
|
|
@@ -2519,6 +2383,11 @@ class ChangeManager {
|
|
|
2519
2383
|
}
|
|
2520
2384
|
|
|
2521
2385
|
/* eslint-disable @typescript-eslint/no-base-to-string */
|
|
2386
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
2387
|
+
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
2388
|
+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
2389
|
+
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
2390
|
+
/* eslint-disable @typescript-eslint/no-unnecessary-condition */
|
|
2522
2391
|
class CollaborationServerDriver extends BackendDriver {
|
|
2523
2392
|
inFlight = new Map();
|
|
2524
2393
|
refSeqMaps = new Map();
|
|
@@ -3016,7 +2885,6 @@ class DesktopFileDriver extends BackendDriver {
|
|
|
3016
2885
|
}
|
|
3017
2886
|
}
|
|
3018
2887
|
|
|
3019
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
3020
2888
|
var NewFeature;
|
|
3021
2889
|
(function (NewFeature) {
|
|
3022
2890
|
NewFeature["GENE_AND_SUBFEATURES"] = "GENE_AND_SUBFEATURES";
|
|
@@ -3025,7 +2893,7 @@ var NewFeature;
|
|
|
3025
2893
|
})(NewFeature || (NewFeature = {}));
|
|
3026
2894
|
function makeCodingMrna(refSeqId, strand, min, max) {
|
|
3027
2895
|
const cds = {
|
|
3028
|
-
_id: new
|
|
2896
|
+
_id: new ObjectID().toHexString(),
|
|
3029
2897
|
refSeq: refSeqId,
|
|
3030
2898
|
type: 'CDS',
|
|
3031
2899
|
min,
|
|
@@ -3033,7 +2901,7 @@ function makeCodingMrna(refSeqId, strand, min, max) {
|
|
|
3033
2901
|
strand,
|
|
3034
2902
|
};
|
|
3035
2903
|
const exon = {
|
|
3036
|
-
_id: new
|
|
2904
|
+
_id: new ObjectID().toHexString(),
|
|
3037
2905
|
refSeq: refSeqId,
|
|
3038
2906
|
type: 'exon',
|
|
3039
2907
|
min,
|
|
@@ -3044,7 +2912,7 @@ function makeCodingMrna(refSeqId, strand, min, max) {
|
|
|
3044
2912
|
children[cds._id] = cds;
|
|
3045
2913
|
children[exon._id] = exon;
|
|
3046
2914
|
const mRNA = {
|
|
3047
|
-
_id: new
|
|
2915
|
+
_id: new ObjectID().toHexString(),
|
|
3048
2916
|
refSeq: refSeqId,
|
|
3049
2917
|
type: 'mRNA',
|
|
3050
2918
|
min,
|
|
@@ -3082,7 +2950,7 @@ function AddFeature({ changeManager, handleClose, region, session, }) {
|
|
|
3082
2950
|
const mRNA = makeCodingMrna(refSeqId, strand, Number(start) - 1, Number(end));
|
|
3083
2951
|
const children = {};
|
|
3084
2952
|
children[mRNA._id] = mRNA;
|
|
3085
|
-
const id = new
|
|
2953
|
+
const id = new ObjectID().toHexString();
|
|
3086
2954
|
const change = new shared.AddFeatureChange({
|
|
3087
2955
|
changedIds: [id],
|
|
3088
2956
|
typeName: 'AddFeatureChange',
|
|
@@ -3121,7 +2989,7 @@ function AddFeature({ changeManager, handleClose, region, session, }) {
|
|
|
3121
2989
|
setErrorMessage('No type selected');
|
|
3122
2990
|
return;
|
|
3123
2991
|
}
|
|
3124
|
-
const id = new
|
|
2992
|
+
const id = new ObjectID().toHexString();
|
|
3125
2993
|
const change = new shared.AddFeatureChange({
|
|
3126
2994
|
changedIds: [id],
|
|
3127
2995
|
typeName: 'AddFeatureChange',
|
|
@@ -3175,45 +3043,16 @@ function AddFeature({ changeManager, handleClose, region, session, }) {
|
|
|
3175
3043
|
(!strand && type === NewFeature.TRANSCRIPT_AND_SUBFEATURES)) {
|
|
3176
3044
|
submitDisabled = true;
|
|
3177
3045
|
}
|
|
3178
|
-
return (
|
|
3179
|
-
|
|
3180
|
-
|
|
3181
|
-
|
|
3182
|
-
|
|
3183
|
-
|
|
3184
|
-
|
|
3185
|
-
|
|
3186
|
-
|
|
3187
|
-
|
|
3188
|
-
React__default["default"].createElement(material.InputLabel, { id: "demo-simple-select-label" }, "Strand"),
|
|
3189
|
-
React__default["default"].createElement(material.Select, { labelId: "demo-simple-select-label", id: "demo-simple-select", label: "Strand", value: strand?.toString(), onChange: handleChangeStrand },
|
|
3190
|
-
React__default["default"].createElement(material.MenuItem, { value: undefined }),
|
|
3191
|
-
React__default["default"].createElement(material.MenuItem, { value: 1 }, "+"),
|
|
3192
|
-
React__default["default"].createElement(material.MenuItem, { value: -1 }, "-"))),
|
|
3193
|
-
React__default["default"].createElement(material.FormControl, { style: { marginTop: 20 } },
|
|
3194
|
-
React__default["default"].createElement(material.RadioGroup, { "aria-labelledby": "demo-radio-buttons-group-label", defaultValue: NewFeature.GENE_AND_SUBFEATURES, name: "radio-buttons-group", value: type, onChange: handleTypeChange },
|
|
3195
|
-
React__default["default"].createElement(material.FormControlLabel, { value: NewFeature.GENE_AND_SUBFEATURES, control: React__default["default"].createElement(material.Radio, null), label: React__default["default"].createElement(material.Box, { display: "flex", alignItems: "center" },
|
|
3196
|
-
"Add gene and sub-features",
|
|
3197
|
-
React__default["default"].createElement(material.Tooltip, { title: "This is a shortcut to create a gene with a single mRNA, exon, and CDS" },
|
|
3198
|
-
React__default["default"].createElement(material.IconButton, { size: "small" },
|
|
3199
|
-
React__default["default"].createElement(InfoIcon__default["default"], { sx: { fontSize: 18 } })))) }),
|
|
3200
|
-
React__default["default"].createElement(material.FormControlLabel, { value: NewFeature.TRANSCRIPT_AND_SUBFEATURES, control: React__default["default"].createElement(material.Radio, null), label: React__default["default"].createElement(material.Box, { display: "flex", alignItems: "center" },
|
|
3201
|
-
"Add transcript and sub-features",
|
|
3202
|
-
React__default["default"].createElement(material.Tooltip, { title: "This is a shortcut to create a single mRNA with exon and CDS, but without a parent gene" },
|
|
3203
|
-
React__default["default"].createElement(material.IconButton, { size: "small" },
|
|
3204
|
-
React__default["default"].createElement(InfoIcon__default["default"], { sx: { fontSize: 18 } })))) }),
|
|
3205
|
-
React__default["default"].createElement(material.FormControlLabel, { value: NewFeature.CUSTOM, checked: type !== NewFeature.GENE_AND_SUBFEATURES &&
|
|
3206
|
-
type !== NewFeature.TRANSCRIPT_AND_SUBFEATURES, control: React__default["default"].createElement(material.Radio, null), label: "Add feature with a sequence ontology type" }))),
|
|
3207
|
-
type === NewFeature.CUSTOM ? (React__default["default"].createElement(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", style: { width: 170 }, value: customType, filterTerms: isOntologyClass, renderInput: (params) => (React__default["default"].createElement(material.TextField, { ...params, label: "Type", variant: "outlined", fullWidth: true })), onChange: (_oldValue, newValue) => {
|
|
3208
|
-
if (newValue) {
|
|
3209
|
-
handleChangeOntologyType(newValue);
|
|
3210
|
-
}
|
|
3211
|
-
} })) : null),
|
|
3212
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
3213
|
-
React__default["default"].createElement(material.Button, { variant: "contained", type: "submit", disabled: submitDisabled }, "Submit"),
|
|
3214
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
|
|
3215
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
3216
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
3046
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Add new feature", handleClose: handleClose, maxWidth: false, "data-testid": "add-feature-dialog", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, "data-testid": "submit-form", children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [jsxRuntime.jsx(material.TextField, { margin: "dense", id: "start", label: "Start", type: "number", fullWidth: true, variant: "outlined", value: Number(start), onChange: (e) => {
|
|
3047
|
+
setStart(e.target.value);
|
|
3048
|
+
} }), jsxRuntime.jsx(material.TextField, { margin: "dense", id: "end", label: "End", type: "number", fullWidth: true, variant: "outlined", value: end, onChange: (e) => {
|
|
3049
|
+
setEnd(e.target.value);
|
|
3050
|
+
}, error: error, helperText: error ? '"End" must be greater than "Start"' : null }), jsxRuntime.jsxs(material.FormControl, { children: [jsxRuntime.jsx(material.InputLabel, { id: "demo-simple-select-label", children: "Strand" }), jsxRuntime.jsxs(material.Select, { labelId: "demo-simple-select-label", id: "demo-simple-select", label: "Strand", value: strand?.toString(), onChange: handleChangeStrand, children: [jsxRuntime.jsx(material.MenuItem, { value: undefined }), jsxRuntime.jsx(material.MenuItem, { value: 1, children: "+" }), jsxRuntime.jsx(material.MenuItem, { value: -1, children: "-" })] })] }), jsxRuntime.jsx(material.FormControl, { style: { marginTop: 20 }, children: jsxRuntime.jsxs(material.RadioGroup, { "aria-labelledby": "demo-radio-buttons-group-label", defaultValue: NewFeature.GENE_AND_SUBFEATURES, name: "radio-buttons-group", value: type, onChange: handleTypeChange, children: [jsxRuntime.jsx(material.FormControlLabel, { value: NewFeature.GENE_AND_SUBFEATURES, control: jsxRuntime.jsx(material.Radio, {}), label: jsxRuntime.jsxs(material.Box, { display: "flex", alignItems: "center", children: ["Add gene and sub-features", jsxRuntime.jsx(material.Tooltip, { title: "This is a shortcut to create a gene with a single mRNA, exon, and CDS", children: jsxRuntime.jsx(material.IconButton, { size: "small", children: jsxRuntime.jsx(InfoIcon, { sx: { fontSize: 18 } }) }) })] }) }), jsxRuntime.jsx(material.FormControlLabel, { value: NewFeature.TRANSCRIPT_AND_SUBFEATURES, control: jsxRuntime.jsx(material.Radio, {}), label: jsxRuntime.jsxs(material.Box, { display: "flex", alignItems: "center", children: ["Add transcript and sub-features", jsxRuntime.jsx(material.Tooltip, { title: "This is a shortcut to create a single mRNA with exon and CDS, but without a parent gene", children: jsxRuntime.jsx(material.IconButton, { size: "small", children: jsxRuntime.jsx(InfoIcon, { sx: { fontSize: 18 } }) }) })] }) }), jsxRuntime.jsx(material.FormControlLabel, { value: NewFeature.CUSTOM, checked: type !== NewFeature.GENE_AND_SUBFEATURES &&
|
|
3051
|
+
type !== NewFeature.TRANSCRIPT_AND_SUBFEATURES, control: jsxRuntime.jsx(material.Radio, {}), label: "Add feature with a sequence ontology type" })] }) }), type === NewFeature.CUSTOM ? (jsxRuntime.jsx(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", style: { width: 170 }, value: customType, filterTerms: isOntologyClass, renderInput: (params) => (jsxRuntime.jsx(material.TextField, { ...params, label: "Type", variant: "outlined", fullWidth: true })), onChange: (_oldValue, newValue) => {
|
|
3052
|
+
if (newValue) {
|
|
3053
|
+
handleChangeOntologyType(newValue);
|
|
3054
|
+
}
|
|
3055
|
+
} })) : null] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", disabled: submitDisabled, children: "Submit" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
3217
3056
|
}
|
|
3218
3057
|
|
|
3219
3058
|
/**
|
|
@@ -3224,7 +3063,7 @@ function AddFeature({ changeManager, handleClose, region, session, }) {
|
|
|
3224
3063
|
function generateNewIds(
|
|
3225
3064
|
// feature: AnnotationFeatureSnapshot,
|
|
3226
3065
|
feature, featureIds) {
|
|
3227
|
-
const newId = new
|
|
3066
|
+
const newId = new ObjectID().toHexString();
|
|
3228
3067
|
featureIds.push(newId);
|
|
3229
3068
|
const children = {};
|
|
3230
3069
|
if (feature.children) {
|
|
@@ -3379,27 +3218,13 @@ function CopyFeature({ changeManager, handleClose, session, sourceAssemblyId, so
|
|
|
3379
3218
|
_id: id,
|
|
3380
3219
|
};
|
|
3381
3220
|
}
|
|
3382
|
-
return (
|
|
3383
|
-
|
|
3384
|
-
|
|
3385
|
-
|
|
3386
|
-
|
|
3387
|
-
.filter((option) => option.name !== sourceAssemblyId)
|
|
3388
|
-
.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.name, value: option.name }, configuration.readConfObject(option, 'displayName'))))),
|
|
3389
|
-
React__default["default"].createElement(material.DialogContentText, null, "Target reference sequence"),
|
|
3390
|
-
React__default["default"].createElement(material.Select, { labelId: "label", value: selectedRefSeqId, onChange: handleChangeRefSeq }, refNames.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option._id, value: option._id }, option.name)))),
|
|
3391
|
-
React__default["default"].createElement(material.DialogContentText, null, "Start position in target reference sequence"),
|
|
3392
|
-
React__default["default"].createElement(material.TextField, { margin: "dense", type: "number", fullWidth: true, variant: "outlined", value: start, onChange: (e) => {
|
|
3393
|
-
setStart(Number(e.target.value));
|
|
3394
|
-
} })),
|
|
3395
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
3396
|
-
React__default["default"].createElement(material.Button, { disabled: !selectedAssemblyId || !selectedRefSeqId || !start, variant: "contained", type: "submit" }, "Submit"),
|
|
3397
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
|
|
3398
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
3399
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
3221
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Copy features and annotations", handleClose: handleClose, maxWidth: false, "data-testid": "copy-feature", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [jsxRuntime.jsx(material.DialogContentText, { children: "Target assembly" }), jsxRuntime.jsx(material.Select, { labelId: "label", value: selectedAssemblyId, onChange: handleChangeAssembly, children: assemblies
|
|
3222
|
+
.filter((option) => option.name !== sourceAssemblyId)
|
|
3223
|
+
.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.name, children: configuration.readConfObject(option, 'displayName') }, option.name))) }), jsxRuntime.jsx(material.DialogContentText, { children: "Target reference sequence" }), jsxRuntime.jsx(material.Select, { labelId: "label", value: selectedRefSeqId, onChange: handleChangeRefSeq, children: refNames.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option._id, children: option.name }, option._id))) }), jsxRuntime.jsx(material.DialogContentText, { children: "Start position in target reference sequence" }), jsxRuntime.jsx(material.TextField, { margin: "dense", type: "number", fullWidth: true, variant: "outlined", value: start, onChange: (e) => {
|
|
3224
|
+
setStart(Number(e.target.value));
|
|
3225
|
+
} })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { disabled: !selectedAssemblyId || !selectedRefSeqId || !start, variant: "contained", type: "submit", children: "Submit" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
3400
3226
|
}
|
|
3401
3227
|
|
|
3402
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
3403
3228
|
function DeleteAssembly({ changeManager, handleClose, session, }) {
|
|
3404
3229
|
const { internetAccounts } = mobxStateTree.getRoot(session);
|
|
3405
3230
|
const [errorMessage, setErrorMessage] = React.useState('');
|
|
@@ -3443,28 +3268,11 @@ function DeleteAssembly({ changeManager, handleClose, session, }) {
|
|
|
3443
3268
|
handleClose();
|
|
3444
3269
|
event.preventDefault();
|
|
3445
3270
|
}
|
|
3446
|
-
return (
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
apolloInternetAccounts.length > 1 ? (React__default["default"].createElement(React__default["default"].Fragment, null,
|
|
3450
|
-
React__default["default"].createElement(material.DialogContentText, null, "Select account"),
|
|
3451
|
-
React__default["default"].createElement(material.Select, { value: selectedInternetAccount.internetAccountId, onChange: handleChangeInternetAccount, disabled: submitted && !errorMessage }, internetAccounts.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.id, value: option.internetAccountId }, option.name)))))) : null,
|
|
3452
|
-
React__default["default"].createElement(material.DialogContentText, null, "Select assembly"),
|
|
3453
|
-
React__default["default"].createElement(material.Select, { labelId: "label", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: assemblies.length === 0 }, assemblies.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.name, value: option.name }, option.displayName)))),
|
|
3454
|
-
React__default["default"].createElement(material.DialogContentText, null,
|
|
3455
|
-
React__default["default"].createElement("strong", { style: { color: 'red' } }, "NOTE: All assembly data will be deleted and this operation cannot be undone!")),
|
|
3456
|
-
React__default["default"].createElement(material.FormGroup, null,
|
|
3457
|
-
React__default["default"].createElement(material.FormControlLabel, { control: React__default["default"].createElement(material.Checkbox, { checked: confirmDelete, onChange: () => {
|
|
3458
|
-
setconfirmDelete(!confirmDelete);
|
|
3459
|
-
} }), label: "I understand that all assembly data will be deleted" }))),
|
|
3460
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
3461
|
-
React__default["default"].createElement(material.Button, { disabled: !selectedAssembly || !confirmDelete, variant: "contained", type: "submit" }, "Delete"),
|
|
3462
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
|
|
3463
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
3464
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
3271
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Delete Assembly", handleClose: handleClose, maxWidth: false, "data-testid": "delete-assembly", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [apolloInternetAccounts.length > 1 ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(material.DialogContentText, { children: "Select account" }), jsxRuntime.jsx(material.Select, { value: selectedInternetAccount.internetAccountId, onChange: handleChangeInternetAccount, disabled: submitted && !errorMessage, children: internetAccounts.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.internetAccountId, children: option.name }, option.id))) })] })) : null, jsxRuntime.jsx(material.DialogContentText, { children: "Select assembly" }), jsxRuntime.jsx(material.Select, { labelId: "label", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: assemblies.length === 0, children: assemblies.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.name, children: option.displayName }, option.name))) }), jsxRuntime.jsx(material.DialogContentText, { children: jsxRuntime.jsx("strong", { style: { color: 'red' }, children: "NOTE: All assembly data will be deleted and this operation cannot be undone!" }) }), jsxRuntime.jsx(material.FormGroup, { children: jsxRuntime.jsx(material.FormControlLabel, { control: jsxRuntime.jsx(material.Checkbox, { checked: confirmDelete, onChange: () => {
|
|
3272
|
+
setconfirmDelete(!confirmDelete);
|
|
3273
|
+
} }), label: "I understand that all assembly data will be deleted" }) })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { disabled: !selectedAssembly || !confirmDelete, variant: "contained", type: "submit", children: "Delete" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
3465
3274
|
}
|
|
3466
3275
|
|
|
3467
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
3468
3276
|
function lumpLocationChanges(changes, assembly) {
|
|
3469
3277
|
if (changes.length === 0) {
|
|
3470
3278
|
return;
|
|
@@ -3772,17 +3580,9 @@ function DeleteFeature({ changeManager, handleClose, selectedFeature, session, s
|
|
|
3772
3580
|
handleClose();
|
|
3773
3581
|
event.preventDefault();
|
|
3774
3582
|
}
|
|
3775
|
-
return (
|
|
3776
|
-
|
|
3777
|
-
|
|
3778
|
-
} },
|
|
3779
|
-
React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
|
|
3780
|
-
React__default["default"].createElement(material.DialogContentText, null, "Are you sure you want to delete the selected feature?")),
|
|
3781
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
3782
|
-
React__default["default"].createElement(material.Button, { variant: "contained", type: "submit" }, "Yes"),
|
|
3783
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
|
|
3784
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
3785
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
3583
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Delete feature", handleClose: handleClose, maxWidth: false, "data-testid": "delete-feature", children: [jsxRuntime.jsxs("form", { onSubmit: (event) => {
|
|
3584
|
+
void onSubmit(event);
|
|
3585
|
+
}, children: [jsxRuntime.jsx(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: jsxRuntime.jsx(material.DialogContentText, { children: "Are you sure you want to delete the selected feature?" }) }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", children: "Yes" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
3786
3586
|
}
|
|
3787
3587
|
|
|
3788
3588
|
function DownloadGFF3({ handleClose, session }) {
|
|
@@ -3892,24 +3692,11 @@ function DownloadGFF3({ handleClose, session }) {
|
|
|
3892
3692
|
const gff3Blob = new Blob([gff3], { type: 'text/plain;charset=utf-8' });
|
|
3893
3693
|
fileSaver.saveAs(gff3Blob, `${selectedAssembly.displayName ?? selectedAssembly.name}.gff3`);
|
|
3894
3694
|
}
|
|
3895
|
-
return (
|
|
3896
|
-
|
|
3897
|
-
|
|
3898
|
-
|
|
3899
|
-
|
|
3900
|
-
React__default["default"].createElement(material.DialogContentText, null, "Select assembly to export to GFF3"),
|
|
3901
|
-
React__default["default"].createElement(material.FormGroup, null,
|
|
3902
|
-
React__default["default"].createElement(material.FormControlLabel, { "data-testid": "include-fasta-checkbox", control: React__default["default"].createElement(material.Checkbox, { checked: includeFASTA, onChange: () => {
|
|
3903
|
-
setincludeFASTA(!includeFASTA);
|
|
3904
|
-
} }), label: "Include fasta sequence in GFF output" }))),
|
|
3905
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
3906
|
-
React__default["default"].createElement(material.Button, { disabled: !selectedAssembly, variant: "contained", type: "submit" }, "Download"),
|
|
3907
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
|
|
3908
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
3909
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
3910
|
-
}
|
|
3911
|
-
|
|
3912
|
-
/* eslint-disable @typescript-eslint/use-unknown-in-catch-callback-variable */
|
|
3695
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Export GFF3", handleClose: handleClose, maxWidth: false, "data-testid": "download-gff3", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [jsxRuntime.jsx(material.DialogContentText, { children: "Select assembly" }), jsxRuntime.jsx(material.Select, { labelId: "label", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: assemblies.length === 0, children: assemblies.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.name, children: option.displayName ?? option.name }, option.name))) }), jsxRuntime.jsx(material.DialogContentText, { children: "Select assembly to export to GFF3" }), jsxRuntime.jsx(material.FormGroup, { children: jsxRuntime.jsx(material.FormControlLabel, { "data-testid": "include-fasta-checkbox", control: jsxRuntime.jsx(material.Checkbox, { checked: includeFASTA, onChange: () => {
|
|
3696
|
+
setincludeFASTA(!includeFASTA);
|
|
3697
|
+
} }), label: "Include fasta sequence in GFF output" }) })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { disabled: !selectedAssembly, variant: "contained", type: "submit", children: "Download" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
3698
|
+
}
|
|
3699
|
+
|
|
3913
3700
|
function ImportFeatures({ changeManager, handleClose, session, }) {
|
|
3914
3701
|
const { apolloDataStore } = session;
|
|
3915
3702
|
const [file, setFile] = React.useState();
|
|
@@ -3919,6 +3706,7 @@ function ImportFeatures({ changeManager, handleClose, session, }) {
|
|
|
3919
3706
|
// default is -1, submit button should be disabled until count is set
|
|
3920
3707
|
const [featuresCount, setFeaturesCount] = React.useState();
|
|
3921
3708
|
const [deleteFeatures, setDeleteFeatures] = React.useState(false);
|
|
3709
|
+
const [strict, setStrict] = React.useState(true);
|
|
3922
3710
|
const [loading, setLoading] = React.useState(false);
|
|
3923
3711
|
const { collaborationServerDriver, getInternetAccount } = apolloDataStore;
|
|
3924
3712
|
const assemblies = collaborationServerDriver.getAssemblies();
|
|
@@ -3930,6 +3718,9 @@ function ImportFeatures({ changeManager, handleClose, session, }) {
|
|
|
3930
3718
|
function handleDeleteFeatures(e) {
|
|
3931
3719
|
setDeleteFeatures(e.target.checked);
|
|
3932
3720
|
}
|
|
3721
|
+
function handleSetStrict(e) {
|
|
3722
|
+
setStrict(e.target.checked);
|
|
3723
|
+
}
|
|
3933
3724
|
// fetch and set features count for selected assembly
|
|
3934
3725
|
React.useEffect(() => {
|
|
3935
3726
|
if (!selectedAssembly) {
|
|
@@ -4019,7 +3810,7 @@ function ImportFeatures({ changeManager, handleClose, session, }) {
|
|
|
4019
3810
|
statusMessage: 'Uploading file, this may take awhile',
|
|
4020
3811
|
progressPct: 0,
|
|
4021
3812
|
cancelCallback: () => {
|
|
4022
|
-
controller.abort('
|
|
3813
|
+
controller.abort(new DOMException(`Canceling importing of features to ${selectedAssembly.displayName}`, 'AbortError'));
|
|
4023
3814
|
jobsManager.abortJob(job.name);
|
|
4024
3815
|
},
|
|
4025
3816
|
};
|
|
@@ -4046,35 +3837,16 @@ function ImportFeatures({ changeManager, handleClose, session, }) {
|
|
|
4046
3837
|
typeName: 'AddFeaturesFromFileChange',
|
|
4047
3838
|
assembly: selectedAssembly.name,
|
|
4048
3839
|
fileId,
|
|
3840
|
+
parseOptions: { strict },
|
|
4049
3841
|
deleteExistingFeatures: deleteFeatures,
|
|
4050
3842
|
});
|
|
4051
3843
|
jobsManager.done(job);
|
|
4052
3844
|
await changeManager.submit(change, { updateJobsManager: true });
|
|
4053
3845
|
}
|
|
4054
|
-
return (
|
|
4055
|
-
|
|
4056
|
-
React__default["default"].createElement("form", { onSubmit: onSubmit },
|
|
4057
|
-
React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
|
|
4058
|
-
React__default["default"].createElement(material.DialogContentText, null, "Select assembly"),
|
|
4059
|
-
React__default["default"].createElement(material.Select, { labelId: "label", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: submitted && !errorMessage }, assemblies.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.name, value: option.name }, option.displayName ?? option.name))))),
|
|
4060
|
-
React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
|
|
4061
|
-
React__default["default"].createElement(material.DialogContentText, null, "Upload GFF3 to load features"),
|
|
4062
|
-
React__default["default"].createElement("input", { type: "file", onChange: handleChangeFile, disabled: submitted && !errorMessage })),
|
|
4063
|
-
featuresCount && featuresCount > 0 ? (React__default["default"].createElement(material.DialogContent, null,
|
|
4064
|
-
React__default["default"].createElement(material.DialogContentText, null,
|
|
4065
|
-
"This assembly already has ",
|
|
4066
|
-
featuresCount,
|
|
4067
|
-
" features, would you like to delete the existing features before importing new ones?"),
|
|
4068
|
-
React__default["default"].createElement(FormControlLabel__default["default"], { label: "Yes, delete existing features", disabled: submitted && !errorMessage, control: React__default["default"].createElement(Checkbox__default["default"], { checked: deleteFeatures, onChange: handleDeleteFeatures, slotProps: { input: { 'aria-label': 'controlled' } }, color: "warning" }) }))) : null,
|
|
4069
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
4070
|
-
React__default["default"].createElement(material.Button, { disabled: !(selectedAssembly && file && featuresCount !== undefined) ||
|
|
4071
|
-
submitted, variant: "contained", type: "submit" }, submitted ? 'Submitting...' : 'Submit'),
|
|
4072
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Close"))),
|
|
4073
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
4074
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
3846
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Import Features from GFF3 file", handleClose: handleClose, maxWidth: false, "data-testid": "import-features-dialog", children: [loading ? jsxRuntime.jsx(material.LinearProgress, {}) : null, jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [jsxRuntime.jsx(material.DialogContentText, { children: "Select assembly" }), jsxRuntime.jsx(material.Select, { labelId: "label", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: submitted && !errorMessage, children: assemblies.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.name, children: option.displayName ?? option.name }, option.name))) }), jsxRuntime.jsx(material.DialogContentText, { children: "Upload GFF3 to load features" }), jsxRuntime.jsx("input", { type: "file", onChange: handleChangeFile, disabled: submitted && !errorMessage }), jsxRuntime.jsx(material.FormControlLabel, { label: "Strict parsing", disabled: submitted && !errorMessage, control: jsxRuntime.jsx(material.Checkbox, { checked: strict, onChange: handleSetStrict }) }), jsxRuntime.jsx(material.FormHelperText, { children: "Don't import any features if any lines in the GFF3 are unable to be processed" }), featuresCount && featuresCount > 0 ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(material.FormControlLabel, { label: "Delete existing features", disabled: submitted && !errorMessage, control: jsxRuntime.jsx(material.Checkbox, { checked: deleteFeatures, onChange: handleDeleteFeatures, slotProps: { input: { 'aria-label': 'controlled' } }, color: "warning" }) }), jsxRuntime.jsxs(material.FormHelperText, { children: ["This assembly has ", featuresCount, " features that will be deleted"] })] })) : null] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { disabled: !(selectedAssembly && file && featuresCount !== undefined) ||
|
|
3847
|
+
submitted, variant: "contained", type: "submit", children: submitted ? 'Submitting...' : 'Submit' }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Close" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
4075
3848
|
}
|
|
4076
3849
|
|
|
4077
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
4078
3850
|
function LogOut({ handleClose, session }) {
|
|
4079
3851
|
const { internetAccounts } = mobxStateTree.getRoot(session);
|
|
4080
3852
|
const [errorMessage, setErrorMessage] = React.useState('');
|
|
@@ -4096,18 +3868,7 @@ function LogOut({ handleClose, session }) {
|
|
|
4096
3868
|
selectedInternetAccount.removeToken();
|
|
4097
3869
|
globalThis.location.reload();
|
|
4098
3870
|
}
|
|
4099
|
-
return (
|
|
4100
|
-
React__default["default"].createElement("form", { onSubmit: onSubmit },
|
|
4101
|
-
React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
|
|
4102
|
-
apolloInternetAccounts.length > 1 ? (React__default["default"].createElement(React__default["default"].Fragment, null,
|
|
4103
|
-
React__default["default"].createElement(material.DialogContentText, null, "Select account"),
|
|
4104
|
-
React__default["default"].createElement(material.Select, { value: selectedInternetAccount.internetAccountId, onChange: handleChangeInternetAccount }, internetAccounts.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.id, value: option.internetAccountId }, option.name)))))) : null,
|
|
4105
|
-
React__default["default"].createElement(material.DialogContentText, null, "Are you sure you want to log out?")),
|
|
4106
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
4107
|
-
React__default["default"].createElement(material.Button, { disabled: !selectedInternetAccount, variant: "contained", type: "submit" }, "Log Out"),
|
|
4108
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
|
|
4109
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
4110
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
3871
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Log out", handleClose: handleClose, maxWidth: false, "data-testid": "log-out", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [apolloInternetAccounts.length > 1 ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(material.DialogContentText, { children: "Select account" }), jsxRuntime.jsx(material.Select, { value: selectedInternetAccount.internetAccountId, onChange: handleChangeInternetAccount, children: internetAccounts.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.internetAccountId, children: option.name }, option.id))) })] })) : null, jsxRuntime.jsx(material.DialogContentText, { children: "Are you sure you want to log out?" })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { disabled: !selectedInternetAccount, variant: "contained", type: "submit", children: "Log Out" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
4111
3872
|
}
|
|
4112
3873
|
|
|
4113
3874
|
function ManageChecks({ handleClose, session }) {
|
|
@@ -4224,37 +3985,18 @@ function ManageChecks({ handleClose, session }) {
|
|
|
4224
3985
|
}
|
|
4225
3986
|
setSelectedInternetAccount(newlySelectedInternetAccount);
|
|
4226
3987
|
}
|
|
4227
|
-
return (
|
|
4228
|
-
|
|
4229
|
-
|
|
4230
|
-
|
|
4231
|
-
|
|
4232
|
-
React__default["default"].createElement(material.Select, { value: selectedInternetAccount.internetAccountId, onChange: handleChangeInternetAccount, disabled: submitted && !errorMessage }, internetAccounts.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.id, value: option.internetAccountId }, option.name)))))) : null,
|
|
4233
|
-
React__default["default"].createElement(material.DialogContentText, null, "Select assembly"),
|
|
4234
|
-
React__default["default"].createElement(material.Select, { style: { width: 300 }, labelId: "label", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: assemblies.length === 0 }, assemblies.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.name, value: option.name }, option.displayName)))),
|
|
4235
|
-
React__default["default"].createElement("br", null),
|
|
4236
|
-
React__default["default"].createElement("br", null),
|
|
4237
|
-
React__default["default"].createElement(material.TableContainer, { component: material.Paper },
|
|
4238
|
-
React__default["default"].createElement(material.Table, null,
|
|
4239
|
-
React__default["default"].createElement(material.TableHead, null,
|
|
4240
|
-
React__default["default"].createElement(material.TableRow, null,
|
|
4241
|
-
React__default["default"].createElement(material.TableCell, null, "Check name"),
|
|
4242
|
-
React__default["default"].createElement(material.TableCell, null, "Use check"))),
|
|
4243
|
-
React__default["default"].createElement(material.TableBody, null, checks.map((check) => (React__default["default"].createElement(material.TableRow, { key: check._id },
|
|
4244
|
-
React__default["default"].createElement(material.TableCell, null, check.name),
|
|
4245
|
-
React__default["default"].createElement(material.TableCell, null,
|
|
4246
|
-
React__default["default"].createElement(material.Checkbox, { value: check._id, checked: selectedChecks.includes(check._id), onChange: handleCheckboxChange }))))))))),
|
|
4247
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
4248
|
-
React__default["default"].createElement(material.Button, { variant: "contained", type: "submit" }, "Submit"),
|
|
4249
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
|
|
4250
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
4251
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
3988
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Manage Checks", handleClose: handleClose, "data-testid": "manage-checks", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { children: [apolloInternetAccounts.length > 1 ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(material.DialogContentText, { children: "Select account" }), jsxRuntime.jsx(material.Select, { value: selectedInternetAccount.internetAccountId, onChange: handleChangeInternetAccount, disabled: submitted && !errorMessage, children: internetAccounts.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.internetAccountId, children: option.name }, option.id))) })] })) : null, jsxRuntime.jsx(material.DialogContentText, { children: "Select assembly" }), jsxRuntime.jsx(material.Select, { style: { width: 300 }, labelId: "label", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: assemblies.length === 0, children: assemblies.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.name, children: option.displayName }, option.name))) }), jsxRuntime.jsx("br", {}), jsxRuntime.jsx("br", {}), jsxRuntime.jsx(material.TableContainer, { component: material.Paper, children: jsxRuntime.jsxs(material.Table, { children: [jsxRuntime.jsx(material.TableHead, { children: jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(material.TableCell, { children: "Check name" }), jsxRuntime.jsx(material.TableCell, { children: "Use check" })] }) }), jsxRuntime.jsx(material.TableBody, { children: checks.map((check) => (jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(material.TableCell, { children: check.name }), jsxRuntime.jsx(material.TableCell, { children: jsxRuntime.jsx(material.Checkbox, { value: check._id, checked: selectedChecks.includes(check._id), onChange: handleCheckboxChange }) })] }, check._id))) })] }) })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", children: "Submit" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
3989
|
+
}
|
|
3990
|
+
|
|
3991
|
+
function isApolloInternetAccount(internetAccount) {
|
|
3992
|
+
return internetAccount.type === 'ApolloInternetAccount';
|
|
4252
3993
|
}
|
|
4253
3994
|
|
|
4254
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
4255
3995
|
function ManageUsers({ changeManager, handleClose, session, }) {
|
|
4256
3996
|
const { internetAccounts } = mobxStateTree.getRoot(session);
|
|
4257
|
-
const apolloInternetAccounts = internetAccounts
|
|
3997
|
+
const apolloInternetAccounts = internetAccounts
|
|
3998
|
+
.filter((ia) => isApolloInternetAccount(ia))
|
|
3999
|
+
.filter((ia) => ia.role?.includes('admin'));
|
|
4258
4000
|
if (apolloInternetAccounts.length === 0) {
|
|
4259
4001
|
throw new Error('No Apollo internet account found');
|
|
4260
4002
|
}
|
|
@@ -4269,16 +4011,14 @@ function ManageUsers({ changeManager, handleClose, session, }) {
|
|
|
4269
4011
|
locationType: 'UriLocation',
|
|
4270
4012
|
uri,
|
|
4271
4013
|
});
|
|
4272
|
-
|
|
4273
|
-
|
|
4274
|
-
|
|
4275
|
-
|
|
4276
|
-
|
|
4277
|
-
return;
|
|
4278
|
-
}
|
|
4279
|
-
const data = (await response.json());
|
|
4280
|
-
setUsers(data.map((u) => (u.role === undefined ? { ...u, role: '' } : u)));
|
|
4014
|
+
const response = await apolloFetch(uri, { method: 'GET' });
|
|
4015
|
+
if (!response.ok) {
|
|
4016
|
+
const newErrorMessage = await createFetchErrorMessage(response, 'Error when getting user data from db');
|
|
4017
|
+
setErrorMessage(newErrorMessage);
|
|
4018
|
+
return;
|
|
4281
4019
|
}
|
|
4020
|
+
const data = (await response.json());
|
|
4021
|
+
setUsers(data.map((u) => (u.role === undefined ? { ...u, role: '' } : u)));
|
|
4282
4022
|
}
|
|
4283
4023
|
getUsers().catch((error) => {
|
|
4284
4024
|
setErrorMessage(String(error));
|
|
@@ -4334,11 +4074,11 @@ function ManageUsers({ changeManager, handleClose, session, }) {
|
|
|
4334
4074
|
field: 'actions',
|
|
4335
4075
|
type: 'actions',
|
|
4336
4076
|
getActions: (params) => [
|
|
4337
|
-
|
|
4077
|
+
jsxRuntime.jsx(xDataGrid.GridActionsCellItem, { icon: jsxRuntime.jsx(DeleteIcon, {}), onClick: async () => {
|
|
4338
4078
|
if (globalThis.confirm('Delete this user?')) {
|
|
4339
4079
|
await deleteUser(params.id);
|
|
4340
4080
|
}
|
|
4341
|
-
}, disabled: isCurrentUser(params.id), label: "Delete" }),
|
|
4081
|
+
}, disabled: isCurrentUser(params.id), label: "Delete" }, `delete-${params.id}`),
|
|
4342
4082
|
],
|
|
4343
4083
|
},
|
|
4344
4084
|
];
|
|
@@ -4360,22 +4100,11 @@ function ManageUsers({ changeManager, handleClose, session, }) {
|
|
|
4360
4100
|
});
|
|
4361
4101
|
return newRow;
|
|
4362
4102
|
}
|
|
4363
|
-
return (
|
|
4364
|
-
|
|
4365
|
-
|
|
4366
|
-
React__default["default"].createElement(material.DialogContentText, null, "Select account"),
|
|
4367
|
-
React__default["default"].createElement(material.Select, { value: selectedInternetAccount.internetAccountId, onChange: handleChangeInternetAccount, disabled: !errorMessage }, internetAccounts.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.id, value: option.internetAccountId }, option.name)))))) : null,
|
|
4368
|
-
React__default["default"].createElement("div", { style: { height: '100%', width: '100%' } },
|
|
4369
|
-
React__default["default"].createElement(xDataGrid.DataGrid, { pagination: true, rows: users, columns: gridColumns, getRowId: (row) => row._id, slots: { toolbar: xDataGrid.GridToolbar }, getRowHeight: () => 'auto', isCellEditable: (params) => !isCurrentUser(params.id), processRowUpdate: processRowUpdate, onProcessRowUpdateError: (error) => {
|
|
4370
|
-
setErrorMessage(String(error));
|
|
4371
|
-
} }))),
|
|
4372
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
4373
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Close")),
|
|
4374
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
4375
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
4103
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, fullScreen: true, title: "Manage users", handleClose: handleClose, "data-testid": "manage-users", children: [jsxRuntime.jsxs(material.DialogContent, { children: [apolloInternetAccounts.length > 1 ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(material.DialogContentText, { children: "Select account" }), jsxRuntime.jsx(material.Select, { value: selectedInternetAccount.internetAccountId, onChange: handleChangeInternetAccount, disabled: !errorMessage, children: internetAccounts.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.internetAccountId, children: option.name }, option.id))) })] })) : null, jsxRuntime.jsx("div", { style: { height: '100%', width: '100%' }, children: jsxRuntime.jsx(xDataGrid.DataGrid, { pagination: true, rows: users, columns: gridColumns, getRowId: (row) => row._id, slots: { toolbar: xDataGrid.GridToolbar }, getRowHeight: () => 'auto', isCellEditable: (params) => !isCurrentUser(params.id), processRowUpdate: processRowUpdate, onProcessRowUpdateError: (error) => {
|
|
4104
|
+
setErrorMessage(String(error));
|
|
4105
|
+
} }) })] }), jsxRuntime.jsx(material.DialogActions, { children: jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Close" }) }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
4376
4106
|
}
|
|
4377
4107
|
|
|
4378
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
4379
4108
|
function getNeighboringExons(referenceExon) {
|
|
4380
4109
|
const neighboringExons = {};
|
|
4381
4110
|
const tx = referenceExon.parent;
|
|
@@ -4459,20 +4188,10 @@ function MergeExons({ changeManager, handleClose, selectedFeature, setSelectedFe
|
|
|
4459
4188
|
setSelectedExon(neighboringExons[value]);
|
|
4460
4189
|
};
|
|
4461
4190
|
const neighboringExons = getNeighboringExons(sourceFeature);
|
|
4462
|
-
return (
|
|
4463
|
-
|
|
4464
|
-
|
|
4465
|
-
|
|
4466
|
-
? 'There are no neighbouring exons to merge with'
|
|
4467
|
-
: 'Merge with exon on:',
|
|
4468
|
-
React__default["default"].createElement(material.FormControl, { style: { marginTop: 5 } },
|
|
4469
|
-
React__default["default"].createElement(material.RadioGroup, { "aria-labelledby": "demo-radio-buttons-group-label", name: "radio-buttons-group", value: selectedExon, onChange: handleTypeChange }, Object.keys(neighboringExons).map((key) => (React__default["default"].createElement(material.FormControlLabel, { value: key, key: key, control: React__default["default"].createElement(material.Radio, null), label: React__default["default"].createElement(material.Box, { display: "flex", alignItems: "center" }, makeRadioButtonName$1(key, neighboringExons)) })))))),
|
|
4470
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
4471
|
-
React__default["default"].createElement(material.Button, { variant: "contained", type: "submit", disabled: Object.keys(neighboringExons).length === 0 ||
|
|
4472
|
-
selectedExon === undefined }, "Submit"),
|
|
4473
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
|
|
4474
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
4475
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
4191
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Merge exons", handleClose: handleClose, maxWidth: false, "data-testid": "merge-exons", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [Object.keys(neighboringExons).length === 0
|
|
4192
|
+
? 'There are no neighbouring exons to merge with'
|
|
4193
|
+
: 'Merge with exon on:', jsxRuntime.jsx(material.FormControl, { style: { marginTop: 5 }, children: jsxRuntime.jsx(material.RadioGroup, { "aria-labelledby": "demo-radio-buttons-group-label", name: "radio-buttons-group", value: selectedExon, onChange: handleTypeChange, children: Object.keys(neighboringExons).map((key) => (jsxRuntime.jsx(material.FormControlLabel, { value: key, control: jsxRuntime.jsx(material.Radio, {}), label: jsxRuntime.jsx(material.Box, { display: "flex", alignItems: "center", children: makeRadioButtonName$1(key, neighboringExons) }) }, key))) }) })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", disabled: Object.keys(neighboringExons).length === 0 ||
|
|
4194
|
+
selectedExon === undefined, children: "Submit" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
4476
4195
|
}
|
|
4477
4196
|
|
|
4478
4197
|
function getTranscripts(referenceTranscript, session) {
|
|
@@ -4542,23 +4261,12 @@ function MergeTranscripts({ changeManager, handleClose, selectedFeature, session
|
|
|
4542
4261
|
const { value } = e.target;
|
|
4543
4262
|
setSelectedTranscriptId(value);
|
|
4544
4263
|
};
|
|
4545
|
-
return (
|
|
4546
|
-
|
|
4547
|
-
|
|
4548
|
-
|
|
4549
|
-
? 'There are no transcripts to merge with'
|
|
4550
|
-
: 'Merge with transcript:',
|
|
4551
|
-
React__default["default"].createElement(material.FormControl, { style: { marginTop: 5 } },
|
|
4552
|
-
React__default["default"].createElement(material.RadioGroup, { "aria-labelledby": "demo-radio-buttons-group-label", name: "radio-buttons-group", value: selectedTranscriptId, onChange: handleTypeChange }, Object.keys(transcripts).map((key) => (React__default["default"].createElement(material.FormControlLabel, { value: key, key: key, control: React__default["default"].createElement(material.Radio, null), label: React__default["default"].createElement(material.Box, { display: "flex", alignItems: "center" }, makeRadioButtonName(transcripts[key])) })))))),
|
|
4553
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
4554
|
-
React__default["default"].createElement(material.Button, { variant: "contained", type: "submit", disabled: Object.keys(transcripts).length === 0 ||
|
|
4555
|
-
selectedTranscriptId === undefined }, "Submit"),
|
|
4556
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
|
|
4557
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
4558
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
4264
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Merge transcripts", handleClose: handleClose, maxWidth: false, "data-testid": "merge-transcripts", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [Object.keys(transcripts).length === 0
|
|
4265
|
+
? 'There are no transcripts to merge with'
|
|
4266
|
+
: 'Merge with transcript:', jsxRuntime.jsx(material.FormControl, { style: { marginTop: 5 }, children: jsxRuntime.jsx(material.RadioGroup, { "aria-labelledby": "demo-radio-buttons-group-label", name: "radio-buttons-group", value: selectedTranscriptId, onChange: handleTypeChange, children: Object.keys(transcripts).map((key) => (jsxRuntime.jsx(material.FormControlLabel, { value: key, control: jsxRuntime.jsx(material.Radio, {}), label: jsxRuntime.jsx(material.Box, { display: "flex", alignItems: "center", children: makeRadioButtonName(transcripts[key]) }) }, key))) }) })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", disabled: Object.keys(transcripts).length === 0 ||
|
|
4267
|
+
selectedTranscriptId === undefined, children: "Submit" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
4559
4268
|
}
|
|
4560
4269
|
|
|
4561
|
-
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
4562
4270
|
function OpenLocalFile({ handleClose, session }) {
|
|
4563
4271
|
const { apolloDataStore } = session;
|
|
4564
4272
|
const { addAssembly, addSessionAssembly, assemblyManager, notify } = session;
|
|
@@ -4640,26 +4348,10 @@ function OpenLocalFile({ handleClose, session }) {
|
|
|
4640
4348
|
function handleAssemblyNameChange(event) {
|
|
4641
4349
|
setAssemblyName(event.target.value);
|
|
4642
4350
|
}
|
|
4643
|
-
return (
|
|
4644
|
-
React__default["default"].createElement("form", { onSubmit: onSubmit },
|
|
4645
|
-
React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
|
|
4646
|
-
React__default["default"].createElement(material.FormControl, null,
|
|
4647
|
-
React__default["default"].createElement("div", { style: { flexDirection: 'row' } },
|
|
4648
|
-
React__default["default"].createElement(material.Button, { variant: "contained", component: "label", style: { marginRight: theme.spacing() } },
|
|
4649
|
-
"Choose File",
|
|
4650
|
-
React__default["default"].createElement("input", { type: "file", required: true, hidden: true, onChange: handleChangeFile })),
|
|
4651
|
-
file ? file.name : 'No file chosen'),
|
|
4652
|
-
React__default["default"].createElement(material.FormHelperText, null, "Make sure your GFF3 has an embedded FASTA section")),
|
|
4653
|
-
React__default["default"].createElement(material.TextField, { required: true, label: "Assembly name", value: assemblyName, onChange: handleAssemblyNameChange })),
|
|
4654
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
4655
|
-
React__default["default"].createElement(material.Button, { disabled: false, variant: "contained", type: "submit" }, submitted ? 'Submitting...' : 'Submit'),
|
|
4656
|
-
React__default["default"].createElement(material.Button, { disabled: submitted, variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
|
|
4657
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
4658
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
4351
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Open local GFF3 file", handleClose: handleClose, maxWidth: false, "data-testid": "open-local-file", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [jsxRuntime.jsxs(material.FormControl, { children: [jsxRuntime.jsxs("div", { style: { flexDirection: 'row' }, children: [jsxRuntime.jsxs(material.Button, { variant: "contained", component: "label", style: { marginRight: theme.spacing() }, children: ["Choose File", jsxRuntime.jsx("input", { type: "file", required: true, hidden: true, onChange: handleChangeFile })] }), file ? file.name : 'No file chosen'] }), jsxRuntime.jsx(material.FormHelperText, { children: "Make sure your GFF3 has an embedded FASTA section" })] }), jsxRuntime.jsx(material.TextField, { required: true, label: "Assembly name", value: assemblyName, onChange: handleAssemblyNameChange })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { disabled: false, variant: "contained", type: "submit", children: submitted ? 'Submitting...' : 'Submit' }), jsxRuntime.jsx(material.Button, { disabled: submitted, variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
4659
4352
|
}
|
|
4660
4353
|
|
|
4661
|
-
|
|
4662
|
-
const useStyles$e = mui.makeStyles()((theme) => ({
|
|
4354
|
+
const useStyles$e = tssReact.makeStyles()((theme) => ({
|
|
4663
4355
|
changeTextarea: {
|
|
4664
4356
|
fontFamily: 'monospace',
|
|
4665
4357
|
width: 600,
|
|
@@ -4695,7 +4387,7 @@ function ViewChangeLog({ handleClose, session }) {
|
|
|
4695
4387
|
field: 'changes',
|
|
4696
4388
|
headerName: 'Change JSON',
|
|
4697
4389
|
width: 600,
|
|
4698
|
-
renderCell: ({ value }) => (
|
|
4390
|
+
renderCell: ({ value }) => (jsxRuntime.jsx("textarea", { className: classes.changeTextarea, value: JSON.stringify(value), readOnly: true })),
|
|
4699
4391
|
},
|
|
4700
4392
|
{ field: 'user', headerName: 'User', width: 140 },
|
|
4701
4393
|
{
|
|
@@ -4743,20 +4435,12 @@ function ViewChangeLog({ handleClose, session }) {
|
|
|
4743
4435
|
const newAssembly = assemblies.find((asm) => asm.name === e.target.value);
|
|
4744
4436
|
setSelectedAssembly(newAssembly);
|
|
4745
4437
|
}
|
|
4746
|
-
return (
|
|
4747
|
-
|
|
4748
|
-
|
|
4749
|
-
|
|
4750
|
-
sorting: { sortModel: [{ field: 'sequence', sort: 'desc' }] },
|
|
4751
|
-
columns: { columnVisibilityModel: { sequence: false } },
|
|
4752
|
-
} })),
|
|
4753
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
4754
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Close")),
|
|
4755
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
4756
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
4438
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, fullScreen: true, title: "View change log", handleClose: handleClose, "data-testid": "view-changelog", children: [jsxRuntime.jsx(material.Select, { style: { width: 200, marginLeft: 40 }, value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, children: assemblies.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.name, children: option.displayName || option.name }, option.name))) }), jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(xDataGrid.DataGrid, { pagination: true, rows: displayGridData, columns: gridColumns, getRowId: (row) => row._id, slots: { toolbar: xDataGrid.GridToolbar }, initialState: {
|
|
4439
|
+
sorting: { sortModel: [{ field: 'sequence', sort: 'desc' }] },
|
|
4440
|
+
columns: { columnVisibilityModel: { sequence: false } },
|
|
4441
|
+
} }) }), jsxRuntime.jsx(material.DialogActions, { children: jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Close" }) }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
4757
4442
|
}
|
|
4758
4443
|
|
|
4759
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
4760
4444
|
const columns = [
|
|
4761
4445
|
{ field: 'refName', headerName: 'Ref Name' },
|
|
4762
4446
|
{ field: 'aliases', headerName: 'Aliases', editable: true, flex: 1 },
|
|
@@ -4900,31 +4584,13 @@ const AddRefSeqAliases = mobxReact.observer(function AddRefSeqAliases({ changeMa
|
|
|
4900
4584
|
});
|
|
4901
4585
|
handleClose();
|
|
4902
4586
|
};
|
|
4903
|
-
return (
|
|
4904
|
-
|
|
4905
|
-
|
|
4906
|
-
|
|
4907
|
-
|
|
4908
|
-
React__default["default"].createElement(material.InputLabel, { id: "demo-simple-select-label" }, "Assembly"),
|
|
4909
|
-
React__default["default"].createElement(material.Select, { labelId: "demo-simple-select-label", id: "demo-simple-select", label: "Assembly", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, style: { minWidth: 150 } }, assemblies.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.name, value: option.name }, option.displayName)))))),
|
|
4910
|
-
React__default["default"].createElement(material.Grid, null,
|
|
4911
|
-
React__default["default"].createElement(material.InputLabel, null, "Load RefName alias"),
|
|
4912
|
-
React__default["default"].createElement("input", { type: "file", onChange: handleChangeFileHandler, ref: fileRef, disabled: (enableSubmit && !errorMessage) || !selectedAssembly }))),
|
|
4913
|
-
selectedAssembly && refNameAliasMap.size > 0 ? (React__default["default"].createElement("div", { style: { height: 200, width: '100%', marginTop: 20 } },
|
|
4914
|
-
React__default["default"].createElement(material.InputLabel, null, "Refname aliases found for selected assembly."),
|
|
4915
|
-
React__default["default"].createElement(xDataGrid.DataGrid, { rows: getTableRows(), columns: columns, initialState: {
|
|
4916
|
-
pagination: {
|
|
4917
|
-
paginationModel: { page: 0, pageSize: 5 },
|
|
4918
|
-
},
|
|
4919
|
-
}, pageSizeOptions: [5, 10], onRowSelectionModelChange: rowSelectionChange, processRowUpdate: processRowUpdate, checkboxSelection: true, disableRowSelectionExcludeModel: true }))) : null),
|
|
4920
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
4921
|
-
React__default["default"].createElement(material.Button, { variant: "contained", type: "submit", disabled: !enableSubmit, onClick: handleSubmit }, "Submit"),
|
|
4922
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Close")),
|
|
4923
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
4924
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
4587
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Add reference sequence aliases", handleClose: handleClose, maxWidth: 'sm', "data-testid": "add-refseq-alias", fullWidth: true, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [jsxRuntime.jsxs(material.Grid, { container: true, spacing: 2, children: [jsxRuntime.jsx(material.Grid, { children: jsxRuntime.jsxs(material.FormControl, { disabled: enableSubmit && !errorMessage, fullWidth: true, children: [jsxRuntime.jsx(material.InputLabel, { id: "demo-simple-select-label", children: "Assembly" }), jsxRuntime.jsx(material.Select, { labelId: "demo-simple-select-label", id: "demo-simple-select", label: "Assembly", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, style: { minWidth: 150 }, children: assemblies.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.name, children: option.displayName }, option.name))) })] }) }), jsxRuntime.jsxs(material.Grid, { children: [jsxRuntime.jsx(material.InputLabel, { children: "Load RefName alias" }), jsxRuntime.jsx("input", { type: "file", onChange: handleChangeFileHandler, ref: fileRef, disabled: (enableSubmit && !errorMessage) || !selectedAssembly })] })] }), selectedAssembly && refNameAliasMap.size > 0 ? (jsxRuntime.jsxs("div", { style: { height: 200, width: '100%', marginTop: 20 }, children: [jsxRuntime.jsx(material.InputLabel, { children: "Refname aliases found for selected assembly." }), jsxRuntime.jsx(xDataGrid.DataGrid, { rows: getTableRows(), columns: columns, initialState: {
|
|
4588
|
+
pagination: {
|
|
4589
|
+
paginationModel: { page: 0, pageSize: 5 },
|
|
4590
|
+
},
|
|
4591
|
+
}, pageSizeOptions: [5, 10], onRowSelectionModelChange: rowSelectionChange, processRowUpdate: processRowUpdate, checkboxSelection: true, disableRowSelectionExcludeModel: true })] })) : null] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", disabled: !enableSubmit, onClick: handleSubmit, children: "Submit" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Close" })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
4925
4592
|
});
|
|
4926
4593
|
|
|
4927
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
4928
4594
|
function ViewCheckResults({ handleClose, session, }) {
|
|
4929
4595
|
const { internetAccounts } = mobxStateTree.getRoot(session);
|
|
4930
4596
|
const { collaborationServerDriver } = session.apolloDataStore;
|
|
@@ -4983,20 +4649,12 @@ function ViewCheckResults({ handleClose, session, }) {
|
|
|
4983
4649
|
const newAssembly = assemblies.find((asm) => asm.name === e.target.value);
|
|
4984
4650
|
setSelectedAssembly(newAssembly);
|
|
4985
4651
|
}
|
|
4986
|
-
return (
|
|
4987
|
-
|
|
4988
|
-
|
|
4989
|
-
|
|
4990
|
-
sorting: { sortModel: [{ field: 'name', sort: 'asc' }] },
|
|
4991
|
-
columns: { columnVisibilityModel: { name: true } },
|
|
4992
|
-
} })),
|
|
4993
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
4994
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Close")),
|
|
4995
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
4996
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
4652
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, fullScreen: true, title: "View check results", handleClose: handleClose, "data-testid": "view-check-results", children: [jsxRuntime.jsx(material.Select, { style: { width: 200, marginLeft: 40 }, value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: assemblies.length === 0, children: assemblies.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.name, children: option.displayName }, option.name))) }), jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(xDataGrid.DataGrid, { pagination: true, rows: displayGridData, columns: gridColumns, getRowId: (row) => row._id, slots: { toolbar: xDataGrid.GridToolbar }, initialState: {
|
|
4653
|
+
sorting: { sortModel: [{ field: 'name', sort: 'asc' }] },
|
|
4654
|
+
columns: { columnVisibilityModel: { name: true } },
|
|
4655
|
+
} }) }), jsxRuntime.jsx(material.DialogActions, { children: jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Close" }) }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
4997
4656
|
}
|
|
4998
4657
|
|
|
4999
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
5000
4658
|
function exonIsSplittable(exonToBeSplit) {
|
|
5001
4659
|
if (exonToBeSplit.max - exonToBeSplit.min < 2) {
|
|
5002
4660
|
return {
|
|
@@ -5036,33 +4694,79 @@ function SplitExon({ changeManager, handleClose, selectedFeature, setSelectedFea
|
|
|
5036
4694
|
parentFeatureId: sourceFeature.parent._id,
|
|
5037
4695
|
upstreamCut,
|
|
5038
4696
|
downstreamCut,
|
|
5039
|
-
leftExonId: new
|
|
5040
|
-
rightExonId: new
|
|
4697
|
+
leftExonId: new ObjectID().toHexString(),
|
|
4698
|
+
rightExonId: new ObjectID().toHexString(),
|
|
5041
4699
|
});
|
|
5042
4700
|
void changeManager.submit(change);
|
|
5043
4701
|
handleClose();
|
|
5044
4702
|
event.preventDefault();
|
|
5045
4703
|
}
|
|
5046
|
-
return (
|
|
5047
|
-
|
|
5048
|
-
|
|
5049
|
-
|
|
5050
|
-
|
|
5051
|
-
|
|
5052
|
-
|
|
5053
|
-
|
|
5054
|
-
|
|
4704
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Split exon", handleClose: handleClose, maxWidth: false, "data-testid": "split-exon", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsx(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: jsxRuntime.jsx(material.DialogContentText, { children: makeDialogText(exonToBeSplit) }) }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", disabled: !exonIsSplittable(exonToBeSplit).isSplittable, children: "Yes" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
4705
|
+
}
|
|
4706
|
+
|
|
4707
|
+
function DuplicateTranscript({ changeManager, handleClose, session, sourceAssemblyId, sourceFeature, setSelectedFeature, }) {
|
|
4708
|
+
const [errorMessage, setErrorMessage] = React.useState('');
|
|
4709
|
+
const { notify } = session;
|
|
4710
|
+
async function onSubmit(event) {
|
|
4711
|
+
event.preventDefault();
|
|
4712
|
+
setErrorMessage('');
|
|
4713
|
+
try {
|
|
4714
|
+
const parentGene = sourceFeature.parent;
|
|
4715
|
+
if (!parentGene) {
|
|
4716
|
+
setErrorMessage('No parent gene found for this transcript');
|
|
4717
|
+
return;
|
|
4718
|
+
}
|
|
4719
|
+
const transcriptSnapshot = mobxStateTree.getSnapshot(sourceFeature);
|
|
4720
|
+
const newTranscriptId = new ObjectID().toHexString();
|
|
4721
|
+
const duplicateTranscript = {
|
|
4722
|
+
...transcriptSnapshot,
|
|
4723
|
+
_id: newTranscriptId,
|
|
4724
|
+
};
|
|
4725
|
+
if (duplicateTranscript.children) {
|
|
4726
|
+
const newChildren = {};
|
|
4727
|
+
for (const [, child] of Object.entries(duplicateTranscript.children)) {
|
|
4728
|
+
const newChildId = new ObjectID().toHexString();
|
|
4729
|
+
newChildren[newChildId] = {
|
|
4730
|
+
...child,
|
|
4731
|
+
_id: newChildId,
|
|
4732
|
+
};
|
|
4733
|
+
}
|
|
4734
|
+
duplicateTranscript.children = newChildren;
|
|
4735
|
+
}
|
|
4736
|
+
const change = new shared.AddFeatureChange({
|
|
4737
|
+
parentFeatureId: parentGene._id,
|
|
4738
|
+
changedIds: [parentGene._id],
|
|
4739
|
+
typeName: 'AddFeatureChange',
|
|
4740
|
+
assembly: sourceAssemblyId,
|
|
4741
|
+
addedFeature: duplicateTranscript,
|
|
4742
|
+
});
|
|
4743
|
+
await changeManager.submit(change).then(() => {
|
|
4744
|
+
setSelectedFeature(undefined);
|
|
4745
|
+
session.apolloSetSelectedFeature(newTranscriptId);
|
|
4746
|
+
notify('Successfully duplicated transcript', 'success');
|
|
4747
|
+
});
|
|
4748
|
+
handleClose();
|
|
4749
|
+
}
|
|
4750
|
+
catch (error) {
|
|
4751
|
+
setErrorMessage(error instanceof Error
|
|
4752
|
+
? error.message
|
|
4753
|
+
: 'Failed to duplicate transcript');
|
|
4754
|
+
}
|
|
4755
|
+
}
|
|
4756
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Duplicate transcript", handleClose: handleClose, maxWidth: false, "data-testid": "duplicate-transcript", children: [jsxRuntime.jsxs("form", { onSubmit: (event) => {
|
|
4757
|
+
void onSubmit(event);
|
|
4758
|
+
}, children: [jsxRuntime.jsx(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: jsxRuntime.jsx(material.DialogContentText, { children: "Are you sure you want to create a duplicate of this transcript?" }) }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", children: "Yes" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "button", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
5055
4759
|
}
|
|
5056
4760
|
|
|
5057
4761
|
function addTopLevelAdminMenus(rootModel) {
|
|
5058
4762
|
rootModel.appendToMenu('Apollo', {
|
|
5059
4763
|
label: 'Admin',
|
|
5060
4764
|
type: 'subMenu',
|
|
5061
|
-
icon:
|
|
4765
|
+
icon: AdminPanelSettingsIcon,
|
|
5062
4766
|
subMenu: [
|
|
5063
4767
|
{
|
|
5064
4768
|
label: 'Add Assembly',
|
|
5065
|
-
icon:
|
|
4769
|
+
icon: AddIcon,
|
|
5066
4770
|
onClick: (session) => {
|
|
5067
4771
|
session.queueDialog((doneCallback) => [
|
|
5068
4772
|
AddAssembly,
|
|
@@ -5078,7 +4782,7 @@ function addTopLevelAdminMenus(rootModel) {
|
|
|
5078
4782
|
},
|
|
5079
4783
|
{
|
|
5080
4784
|
label: 'Delete Assembly',
|
|
5081
|
-
icon:
|
|
4785
|
+
icon: DeleteIcon,
|
|
5082
4786
|
onClick: (session) => {
|
|
5083
4787
|
session.queueDialog((doneCallback) => [
|
|
5084
4788
|
DeleteAssembly,
|
|
@@ -5094,7 +4798,7 @@ function addTopLevelAdminMenus(rootModel) {
|
|
|
5094
4798
|
},
|
|
5095
4799
|
{
|
|
5096
4800
|
label: 'Import Features',
|
|
5097
|
-
icon:
|
|
4801
|
+
icon: InputIcon,
|
|
5098
4802
|
onClick: (session) => {
|
|
5099
4803
|
session.queueDialog((doneCallback) => [
|
|
5100
4804
|
ImportFeatures,
|
|
@@ -5140,7 +4844,7 @@ function addTopLevelAdminMenus(rootModel) {
|
|
|
5140
4844
|
},
|
|
5141
4845
|
{
|
|
5142
4846
|
label: 'Manage Users',
|
|
5143
|
-
icon:
|
|
4847
|
+
icon: PersonIcon,
|
|
5144
4848
|
onClick: (session) => {
|
|
5145
4849
|
session.queueDialog((doneCallback) => [
|
|
5146
4850
|
ManageUsers,
|
|
@@ -5156,7 +4860,7 @@ function addTopLevelAdminMenus(rootModel) {
|
|
|
5156
4860
|
},
|
|
5157
4861
|
{
|
|
5158
4862
|
label: 'Manage Checks',
|
|
5159
|
-
icon:
|
|
4863
|
+
icon: RuleIcon,
|
|
5160
4864
|
onClick: (session) => {
|
|
5161
4865
|
session.queueDialog((doneCallback) => [
|
|
5162
4866
|
ManageChecks,
|
|
@@ -5176,23 +4880,15 @@ function addTopLevelAdminMenus(rootModel) {
|
|
|
5176
4880
|
// Icon source: https://developers.google.com/identity/branding-guidelines
|
|
5177
4881
|
function Google(props) {
|
|
5178
4882
|
const { color } = props;
|
|
5179
|
-
return (
|
|
5180
|
-
React__default["default"].createElement("path", { d: "M17.64,9.20454545 c0,-0.638,-0.057,-1.252,-0.164,-1.841 l-8.476,0 l0,3.481 l4.844,0 c-0.209,1.125,-0.843,2.079,-1.796,2.717 l0,2.258 l2.908,0 c1.702,-1.567,2.684,-3.874,2.684,-6.615 l0,0 z", fill: "#4285F4" }),
|
|
5181
|
-
React__default["default"].createElement("path", { d: "M9,18 c2.43,0,4.467,-0.806,5.956,-2.18 l-2.908,-2.259 c-0.806,0.54,-1.837,0.859,-3.048,0.859 c-2.344,0,-4.328,-1.583,-5.036,-3.71 l-3.007,0 l0,2.332 c1.481,2.941,4.525,4.958,8.043,4.958 l0,0 z", fill: "#34A853" }),
|
|
5182
|
-
React__default["default"].createElement("path", { d: "M3.96409091,10.71 c-0.18,-0.54,-0.282,-1.117,-0.282,-1.71 c0,-0.593,0.102,-1.17,0.282,-1.71 l0,-2.332 l-3.007,0 c-0.609,1.215,-0.957,2.59,-0.957,4.042 c0,1.452,0.348,2.827,0.957,4.042 l3.007,-2.332 l0,0 z", fill: "#FBBC05" }),
|
|
5183
|
-
React__default["default"].createElement("path", { d: "M9,3.57954545 c1.321,0,2.508,0.454,3.44,1.346 l2.582,-2.581 c-1.559,-1.453,-3.596,-2.345,-6.022,-2.345 c-3.518,0,-6.562,2.017,-8.043,4.959 l3.007,2.331 c0.708,-2.127,2.692,-3.71,5.036,-3.71 l0,0 z", fill: "#EA4335" })))));
|
|
4883
|
+
return (jsxRuntime.jsx(material.SvgIcon, { viewBox: "0 0 18 18", style: { fontSize: 18, marginRight: 4 }, ...props, children: color === 'disabled' ? (jsxRuntime.jsx("path", { d: "M9.001,10.71 l0,-3.348 l8.424,0 c0.126,0.567,0.225,1.098,0.225,1.845 c0,5.139,-3.447,8.793,-8.64,8.793 c-4.968,0,-9,-4.032,-9,-9 c0,-4.968,4.032,-9,9,-9 c2.43,0,4.464,0.891,6.021,2.349 l-2.556,2.484 c-0.648,-0.612,-1.782,-1.332,-3.465,-1.332 c-2.979,0,-5.409,2.475,-5.409,5.508 c0,3.033,2.43,5.508,5.409,5.508 c3.447,0,4.716,-2.385,4.95,-3.798 l-4.959,0 l0,-0.009 z" })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M17.64,9.20454545 c0,-0.638,-0.057,-1.252,-0.164,-1.841 l-8.476,0 l0,3.481 l4.844,0 c-0.209,1.125,-0.843,2.079,-1.796,2.717 l0,2.258 l2.908,0 c1.702,-1.567,2.684,-3.874,2.684,-6.615 l0,0 z", fill: "#4285F4" }), jsxRuntime.jsx("path", { d: "M9,18 c2.43,0,4.467,-0.806,5.956,-2.18 l-2.908,-2.259 c-0.806,0.54,-1.837,0.859,-3.048,0.859 c-2.344,0,-4.328,-1.583,-5.036,-3.71 l-3.007,0 l0,2.332 c1.481,2.941,4.525,4.958,8.043,4.958 l0,0 z", fill: "#34A853" }), jsxRuntime.jsx("path", { d: "M3.96409091,10.71 c-0.18,-0.54,-0.282,-1.117,-0.282,-1.71 c0,-0.593,0.102,-1.17,0.282,-1.71 l0,-2.332 l-3.007,0 c-0.609,1.215,-0.957,2.59,-0.957,4.042 c0,1.452,0.348,2.827,0.957,4.042 l3.007,-2.332 l0,0 z", fill: "#FBBC05" }), jsxRuntime.jsx("path", { d: "M9,3.57954545 c1.321,0,2.508,0.454,3.44,1.346 l2.582,-2.581 c-1.559,-1.453,-3.596,-2.345,-6.022,-2.345 c-3.518,0,-6.562,2.017,-8.043,4.959 l3.007,2.331 c0.708,-2.127,2.692,-3.71,5.036,-3.71 l0,0 z", fill: "#EA4335" })] })) }));
|
|
5184
4884
|
}
|
|
5185
4885
|
// Icon source: https://learn.microsoft.com/en-us/azure/active-directory/develop/howto-add-branding-in-azure-ad-apps
|
|
5186
4886
|
function Microsoft(props) {
|
|
5187
4887
|
const { color } = props;
|
|
5188
|
-
return (
|
|
5189
|
-
React__default["default"].createElement("rect", { x: "1", y: "1", width: "9", height: "9", fill: color === 'disabled' ? '#7B7B7B' : '#F25022' }),
|
|
5190
|
-
React__default["default"].createElement("rect", { x: "1", y: "11", width: "9", height: "9", fill: color === 'disabled' ? '#7B7B7B' : '#00A4EF' }),
|
|
5191
|
-
React__default["default"].createElement("rect", { x: "11", y: "1", width: "9", height: "9", fill: color === 'disabled' ? '#939393' : '#7FBA00' }),
|
|
5192
|
-
React__default["default"].createElement("rect", { x: "11", y: "11", width: "9", height: "9", fill: color === 'disabled' ? '#B9B9B9' : '#FFB900' })));
|
|
4888
|
+
return (jsxRuntime.jsxs(material.SvgIcon, { viewBox: "0 0 21 21", style: { fontSize: 21 }, ...props, children: [jsxRuntime.jsx("rect", { x: "1", y: "1", width: "9", height: "9", fill: color === 'disabled' ? '#7B7B7B' : '#F25022' }), jsxRuntime.jsx("rect", { x: "1", y: "11", width: "9", height: "9", fill: color === 'disabled' ? '#7B7B7B' : '#00A4EF' }), jsxRuntime.jsx("rect", { x: "11", y: "1", width: "9", height: "9", fill: color === 'disabled' ? '#939393' : '#7FBA00' }), jsxRuntime.jsx("rect", { x: "11", y: "11", width: "9", height: "9", fill: color === 'disabled' ? '#B9B9B9' : '#FFB900' })] }));
|
|
5193
4889
|
}
|
|
5194
4890
|
|
|
5195
|
-
const useStyles$d =
|
|
4891
|
+
const useStyles$d = tssReact.makeStyles()((theme) => ({
|
|
5196
4892
|
loginButton: {
|
|
5197
4893
|
marginBottom: theme.spacing(1),
|
|
5198
4894
|
width: '220px',
|
|
@@ -5206,20 +4902,19 @@ const useStyles$d = mui.makeStyles()((theme) => ({
|
|
|
5206
4902
|
function GoogleButton(props) {
|
|
5207
4903
|
const { classes } = useStyles$d();
|
|
5208
4904
|
const { disabled } = props;
|
|
5209
|
-
return (
|
|
4905
|
+
return (jsxRuntime.jsx(material.Button, { className: classes.loginButton, variant: "outlined", startIcon: jsxRuntime.jsx(Google, { color: disabled ? 'disabled' : undefined }), ...props, children: "Sign in with Google" }));
|
|
5210
4906
|
}
|
|
5211
4907
|
function MicrosoftButton(props) {
|
|
5212
4908
|
const { classes } = useStyles$d();
|
|
5213
4909
|
const { disabled } = props;
|
|
5214
|
-
return (
|
|
4910
|
+
return (jsxRuntime.jsx(material.Button, { className: classes.loginButton, variant: "outlined", startIcon: jsxRuntime.jsx(Microsoft, { color: disabled ? 'disabled' : undefined }), ...props, children: "Sign in with Microsoft" }));
|
|
5215
4911
|
}
|
|
5216
4912
|
function GuestButton(props) {
|
|
5217
4913
|
const { classes } = useStyles$d();
|
|
5218
|
-
return (
|
|
4914
|
+
return (jsxRuntime.jsx(material.Button, { className: classes.loginButton, variant: "outlined", startIcon: jsxRuntime.jsx(AccountCircleIcon, { fontSize: "small" }), ...props, children: "Continue as Guest" }));
|
|
5219
4915
|
}
|
|
5220
4916
|
|
|
5221
|
-
|
|
5222
|
-
const useStyles$c = mui.makeStyles()((theme) => ({
|
|
4917
|
+
const useStyles$c = tssReact.makeStyles()((theme) => ({
|
|
5223
4918
|
divider: {
|
|
5224
4919
|
marginTop: theme.spacing(4),
|
|
5225
4920
|
marginBottom: theme.spacing(5),
|
|
@@ -5249,7 +4944,7 @@ const AuthTypeSelector = ({ baseURL, handleClose, name, }) => {
|
|
|
5249
4944
|
}
|
|
5250
4945
|
});
|
|
5251
4946
|
return () => {
|
|
5252
|
-
controller.abort('
|
|
4947
|
+
controller.abort(new DOMException('Error retrieving valid authentication types', 'AbortError'));
|
|
5253
4948
|
};
|
|
5254
4949
|
}, [baseURL]);
|
|
5255
4950
|
function handleClick(authType) {
|
|
@@ -5266,28 +4961,24 @@ const AuthTypeSelector = ({ baseURL, handleClose, name, }) => {
|
|
|
5266
4961
|
const allowGoogle = loginTypes.includes('google');
|
|
5267
4962
|
const allowMicrosoft = loginTypes.includes('microsoft');
|
|
5268
4963
|
const allowGuest = loginTypes.includes('guest');
|
|
5269
|
-
return (
|
|
5270
|
-
|
|
5271
|
-
|
|
5272
|
-
|
|
5273
|
-
|
|
5274
|
-
|
|
5275
|
-
|
|
5276
|
-
|
|
5277
|
-
|
|
5278
|
-
React__default["default"].createElement(material.Divider, { className: classes.divider }),
|
|
5279
|
-
React__default["default"].createElement(GuestButton, { onClick: () => {
|
|
5280
|
-
handleClick('guest');
|
|
5281
|
-
} }))) : null),
|
|
5282
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
5283
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: () => {
|
|
5284
|
-
handleClose();
|
|
5285
|
-
} }, "Cancel")),
|
|
5286
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
5287
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
4964
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: `Log in to ${name}`, handleClose: handleClose, maxWidth: false, "data-testid": "login-apollo", children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column', paddingTop: 8 }, children: [allowGoogle ? (jsxRuntime.jsx(GoogleButton, { disabled: !allowGoogle, onClick: () => {
|
|
4965
|
+
handleClick('google');
|
|
4966
|
+
} })) : null, allowMicrosoft ? (jsxRuntime.jsx(MicrosoftButton, { disabled: !allowMicrosoft, onClick: () => {
|
|
4967
|
+
handleClick('microsoft');
|
|
4968
|
+
} })) : null, allowGuest ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(material.Divider, { className: classes.divider }), jsxRuntime.jsx(GuestButton, { onClick: () => {
|
|
4969
|
+
handleClick('guest');
|
|
4970
|
+
} })] })) : null] }), jsxRuntime.jsx(material.DialogActions, { children: jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: () => {
|
|
4971
|
+
handleClose();
|
|
4972
|
+
}, children: "Cancel" }) }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
5288
4973
|
};
|
|
5289
4974
|
|
|
5290
4975
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
4976
|
+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
4977
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
4978
|
+
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
4979
|
+
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
4980
|
+
/* eslint-disable @typescript-eslint/unbound-method */
|
|
4981
|
+
/* eslint-disable @typescript-eslint/no-misused-promises */
|
|
5291
4982
|
const inWebWorker$1 = typeof sessionStorage === 'undefined';
|
|
5292
4983
|
const stateModelFactory$3 = (configSchema) => {
|
|
5293
4984
|
return pluggableElementTypes.InternetAccount.named('ApolloInternetAccount')
|
|
@@ -5340,7 +5031,6 @@ const stateModelFactory$3 = (configSchema) => {
|
|
|
5340
5031
|
},
|
|
5341
5032
|
finishOAuthWindow(event, resolve, reject) {
|
|
5342
5033
|
if (event.data.name !== `JBrowseAuthWindow-${self.internetAccountId}`) {
|
|
5343
|
-
this.deleteMessageChannel();
|
|
5344
5034
|
return;
|
|
5345
5035
|
}
|
|
5346
5036
|
const redirectUriWithInfo = event.data.redirectUri;
|
|
@@ -5699,7 +5389,7 @@ const stateModelFactory$3 = (configSchema) => {
|
|
|
5699
5389
|
beforeDestroy() {
|
|
5700
5390
|
self.removeBeforeUnloadListener();
|
|
5701
5391
|
self.removeVisibilityChangeListener();
|
|
5702
|
-
self.controller.abort('
|
|
5392
|
+
self.controller.abort(new DOMException('Cleaning up Apollo connection', 'AbortError'));
|
|
5703
5393
|
self.socket.close();
|
|
5704
5394
|
},
|
|
5705
5395
|
}));
|
|
@@ -5770,7 +5460,7 @@ var configSchema$5 = configuration.ConfigurationSchema('ApolloRefNameAliasAdapte
|
|
|
5770
5460
|
}, { explicitlyTyped: true });
|
|
5771
5461
|
|
|
5772
5462
|
function installApolloRefNameAliasAdapter(pluginManager) {
|
|
5773
|
-
pluginManager.addAdapterType(() => new
|
|
5463
|
+
pluginManager.addAdapterType(() => new AdapterType({
|
|
5774
5464
|
name: 'ApolloRefNameAliasAdapter',
|
|
5775
5465
|
configSchema: configSchema$5,
|
|
5776
5466
|
adapterMetadata: {
|
|
@@ -5783,6 +5473,10 @@ function installApolloRefNameAliasAdapter(pluginManager) {
|
|
|
5783
5473
|
}
|
|
5784
5474
|
|
|
5785
5475
|
/* eslint-disable @typescript-eslint/prefer-promise-reject-errors */
|
|
5476
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
5477
|
+
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
5478
|
+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
5479
|
+
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
5786
5480
|
function isApolloMessageData$1(data) {
|
|
5787
5481
|
return (typeof data === 'object' &&
|
|
5788
5482
|
data !== null &&
|
|
@@ -5874,7 +5568,7 @@ class ApolloSequenceAdapter extends BaseAdapter.BaseSequenceAdapter {
|
|
|
5874
5568
|
regionWithAssemblyName.end = region.end;
|
|
5875
5569
|
}
|
|
5876
5570
|
const { seq } = await backendDriver.getSequence(regionWithAssemblyName);
|
|
5877
|
-
observer.next(new
|
|
5571
|
+
observer.next(new SimpleFeature({
|
|
5878
5572
|
id: `${refName} ${start}-${end}`,
|
|
5879
5573
|
data: { refName, start, end, seq },
|
|
5880
5574
|
}));
|
|
@@ -5907,7 +5601,7 @@ class ApolloSequenceAdapter extends BaseAdapter.BaseSequenceAdapter {
|
|
|
5907
5601
|
messageId,
|
|
5908
5602
|
});
|
|
5909
5603
|
});
|
|
5910
|
-
observer.next(new
|
|
5604
|
+
observer.next(new SimpleFeature({
|
|
5911
5605
|
id: `${refName} ${start}-${end}`,
|
|
5912
5606
|
data: { refName, start, end, seq },
|
|
5913
5607
|
}));
|
|
@@ -5931,7 +5625,7 @@ var configSchema$4 = configuration.ConfigurationSchema('ApolloSequenceAdapter',
|
|
|
5931
5625
|
}, { explicitlyTyped: true });
|
|
5932
5626
|
|
|
5933
5627
|
function installApolloSequenceAdapter(pluginManager) {
|
|
5934
|
-
pluginManager.addAdapterType(() => new
|
|
5628
|
+
pluginManager.addAdapterType(() => new AdapterType({
|
|
5935
5629
|
name: 'ApolloSequenceAdapter',
|
|
5936
5630
|
configSchema: configSchema$4,
|
|
5937
5631
|
adapterMetadata: {
|
|
@@ -5943,6 +5637,23 @@ function installApolloSequenceAdapter(pluginManager) {
|
|
|
5943
5637
|
}));
|
|
5944
5638
|
}
|
|
5945
5639
|
|
|
5640
|
+
function getMatchedFeature(query, feature) {
|
|
5641
|
+
// @ts-expect-error this actually has a bit more info that a plain snapshot
|
|
5642
|
+
const { children, indexedIds, ...featureWithoutChildren } = feature;
|
|
5643
|
+
const featureString = JSON.stringify(featureWithoutChildren);
|
|
5644
|
+
if (featureString.includes(query)) {
|
|
5645
|
+
return feature;
|
|
5646
|
+
}
|
|
5647
|
+
if (!children) {
|
|
5648
|
+
return undefined;
|
|
5649
|
+
}
|
|
5650
|
+
for (const subFeature of Object.values(children)) {
|
|
5651
|
+
const matchedFeature = getMatchedFeature(query, subFeature);
|
|
5652
|
+
if (matchedFeature) {
|
|
5653
|
+
return matchedFeature;
|
|
5654
|
+
}
|
|
5655
|
+
}
|
|
5656
|
+
}
|
|
5946
5657
|
class ApolloTextSearchAdapter extends BaseAdapter.BaseAdapter {
|
|
5947
5658
|
get baseURL() {
|
|
5948
5659
|
return configuration.readConfObject(this.config, 'baseURL').uri;
|
|
@@ -5955,11 +5666,13 @@ class ApolloTextSearchAdapter extends BaseAdapter.BaseAdapter {
|
|
|
5955
5666
|
}
|
|
5956
5667
|
mapBaseResult(features, assembly, query) {
|
|
5957
5668
|
return features.map((feature) => {
|
|
5669
|
+
const matchedObject = getMatchedFeature(query, feature) ?? feature;
|
|
5958
5670
|
const refName = assembly.getCanonicalRefName(feature.refSeq);
|
|
5959
|
-
return new
|
|
5671
|
+
return new BaseResult({
|
|
5960
5672
|
label: query,
|
|
5961
5673
|
trackId: this.trackId,
|
|
5962
|
-
locString: `${refName}:${
|
|
5674
|
+
locString: `${refName}:${matchedObject.min + 1}..${matchedObject.max}`,
|
|
5675
|
+
matchedObject,
|
|
5963
5676
|
});
|
|
5964
5677
|
});
|
|
5965
5678
|
}
|
|
@@ -6018,7 +5731,7 @@ function installApolloTextSearchAdapter(pluginManager) {
|
|
|
6018
5731
|
}));
|
|
6019
5732
|
}
|
|
6020
5733
|
|
|
6021
|
-
const useStyles$b =
|
|
5734
|
+
const useStyles$b = tssReact.makeStyles()((theme) => ({
|
|
6022
5735
|
attributeKey: {
|
|
6023
5736
|
fontWeight: 'bold',
|
|
6024
5737
|
marginRight: theme.spacing(2),
|
|
@@ -6041,10 +5754,7 @@ function AttributeKey({ attributeKey: key }) {
|
|
|
6041
5754
|
titleText =
|
|
6042
5755
|
'On GFF3 export, this attribute will be changed to start with a lower-case letter because attributes starting with an upper-case letter are reserved in GFF3';
|
|
6043
5756
|
}
|
|
6044
|
-
return (
|
|
6045
|
-
React__default["default"].createElement(material.Typography, { className: classes.attributeKey }, displayKey),
|
|
6046
|
-
titleText ? (React__default["default"].createElement(material.Tooltip, { title: titleText },
|
|
6047
|
-
React__default["default"].createElement(material.Chip, { icon: React__default["default"].createElement(InfoIcon__default["default"], null), label: "GFF3", size: "small", variant: "outlined" }))) : null));
|
|
5757
|
+
return (jsxRuntime.jsxs("div", { style: { display: 'flex' }, children: [jsxRuntime.jsx(material.Typography, { className: classes.attributeKey, children: displayKey }), titleText ? (jsxRuntime.jsx(material.Tooltip, { title: titleText, children: jsxRuntime.jsx(material.Chip, { icon: jsxRuntime.jsx(InfoIcon, {}), label: "GFF3", size: "small", variant: "outlined" }) })) : null] }));
|
|
6048
5758
|
}
|
|
6049
5759
|
|
|
6050
5760
|
const customKeyName = 'Custom';
|
|
@@ -6075,22 +5785,13 @@ const AttributeKeySelector = mobxReact.observer(function AttributeKeySelector({
|
|
|
6075
5785
|
function handleCancel() {
|
|
6076
5786
|
setKey();
|
|
6077
5787
|
}
|
|
6078
|
-
return (
|
|
6079
|
-
|
|
6080
|
-
|
|
6081
|
-
|
|
6082
|
-
|
|
6083
|
-
setSelectedKey(event.target.value);
|
|
6084
|
-
} }, Object.keys(reservedKeys).map((val) => (React__default["default"].createElement(material.MenuItem, { key: val, value: val }, val))))),
|
|
6085
|
-
isCustom ? (React__default["default"].createElement(material.TextField, { label: "Attribute key", variant: "outlined", id: "attributeKey", onChange: (event) => {
|
|
6086
|
-
setCustomKey(event.target.value);
|
|
6087
|
-
} })) : null),
|
|
6088
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
6089
|
-
React__default["default"].createElement(material.Button, { color: "primary", variant: "contained", type: "submit", disabled: isCustom && !customKey }, "Add"),
|
|
6090
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", onClick: handleCancel }, "Cancel"))));
|
|
5788
|
+
return (jsxRuntime.jsxs("form", { onSubmit: handleSubmit, children: [jsxRuntime.jsxs("div", { style: { display: 'flex', flexDirection: 'column', margin: 8 }, children: [jsxRuntime.jsxs(material.FormControl, { variant: "outlined", children: [jsxRuntime.jsx(material.InputLabel, { id: "attribute-key-select-label", children: "Key" }), jsxRuntime.jsx(material.Select, { labelId: "attribute-key-select-label", value: selectedKey, label: "Key", onChange: (event) => {
|
|
5789
|
+
setSelectedKey(event.target.value);
|
|
5790
|
+
}, children: Object.keys(reservedKeys).map((val) => (jsxRuntime.jsx(material.MenuItem, { value: val, children: val }, val))) })] }), isCustom ? (jsxRuntime.jsx(material.TextField, { label: "Attribute key", variant: "outlined", id: "attributeKey", onChange: (event) => {
|
|
5791
|
+
setCustomKey(event.target.value);
|
|
5792
|
+
} })) : null] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { color: "primary", variant: "contained", type: "submit", disabled: isCustom && !customKey, children: "Add" }), jsxRuntime.jsx(material.Button, { variant: "outlined", onClick: handleCancel, children: "Cancel" })] })] }));
|
|
6091
5793
|
});
|
|
6092
5794
|
|
|
6093
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
6094
5795
|
const StringTextField = mobxReact.observer(function StringTextField({ onChangeCommitted, value: initialValue, ...props }) {
|
|
6095
5796
|
const [value, setValue] = React.useState(String(initialValue));
|
|
6096
5797
|
const [blur, setBlur] = React.useState(false);
|
|
@@ -6107,7 +5808,7 @@ const StringTextField = mobxReact.observer(function StringTextField({ onChangeCo
|
|
|
6107
5808
|
function onChange(event) {
|
|
6108
5809
|
setValue(event.target.value);
|
|
6109
5810
|
}
|
|
6110
|
-
return (
|
|
5811
|
+
return (jsxRuntime.jsx(material.TextField, { ...props, type: "text", onChange: onChange, value: value, onKeyDown: (event) => {
|
|
6111
5812
|
if (event.key === 'Enter') {
|
|
6112
5813
|
inputNode?.blur();
|
|
6113
5814
|
}
|
|
@@ -6147,31 +5848,22 @@ const DefaultAttributeEditor = mobxReact.observer(function DefaultAttributeEdito
|
|
|
6147
5848
|
return newValues;
|
|
6148
5849
|
});
|
|
6149
5850
|
}
|
|
6150
|
-
return (
|
|
6151
|
-
|
|
6152
|
-
|
|
6153
|
-
|
|
6154
|
-
|
|
6155
|
-
|
|
6156
|
-
|
|
6157
|
-
|
|
6158
|
-
|
|
6159
|
-
React__default["default"].createElement(material.IconButton, { "aria-label": "add", size: "medium", color: "secondary", edge: "start", onClick: addValue },
|
|
6160
|
-
React__default["default"].createElement(AddBoxIcon__default["default"], { fontSize: "inherit" })),
|
|
6161
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
6162
|
-
React__default["default"].createElement(material.Button, { color: "primary", variant: "contained", onClick: () => {
|
|
6163
|
-
setAttribute(newValues.filter(Boolean));
|
|
6164
|
-
} }, isNew ? 'Add' : 'Update'),
|
|
6165
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: () => {
|
|
6166
|
-
setAttribute();
|
|
6167
|
-
} }, "Cancel"))));
|
|
5851
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [newValues.map((value, idx) => (jsxRuntime.jsxs("div", { style: { display: 'flex' }, children: [jsxRuntime.jsx(StringTextField, { value: value, onChangeCommitted: (editedValue) => {
|
|
5852
|
+
updateValue(idx, editedValue);
|
|
5853
|
+
}, variant: "outlined", fullWidth: true }), jsxRuntime.jsx(material.IconButton, { "aria-label": "delete", size: "medium", edge: "end", onClick: () => {
|
|
5854
|
+
deleteValue(idx);
|
|
5855
|
+
}, children: jsxRuntime.jsx(DeleteIcon, { fontSize: "inherit" }) })] }, `${idx}-${value}`))), jsxRuntime.jsx(material.IconButton, { "aria-label": "add", size: "medium", color: "secondary", edge: "start", onClick: addValue, children: jsxRuntime.jsx(AddBoxIcon, { fontSize: "inherit" }) }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { color: "primary", variant: "contained", onClick: () => {
|
|
5856
|
+
setAttribute(newValues.filter(Boolean));
|
|
5857
|
+
}, children: isNew ? 'Add' : 'Update' }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: () => {
|
|
5858
|
+
setAttribute();
|
|
5859
|
+
}, children: "Cancel" })] })] }));
|
|
6168
5860
|
});
|
|
6169
5861
|
|
|
6170
5862
|
function DefaultAttributeViewer({ values }) {
|
|
6171
|
-
return (
|
|
5863
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: values?.map((value, idx) => (jsxRuntime.jsx(material.Typography, { variant: "body2", color: "textSecondary", children: value }, `${idx}.${value}`))) }));
|
|
6172
5864
|
}
|
|
6173
5865
|
|
|
6174
|
-
const useStyles$a =
|
|
5866
|
+
const useStyles$a = tssReact.makeStyles()((theme) => ({
|
|
6175
5867
|
list: {
|
|
6176
5868
|
'li:nth-of-type(odd)': {
|
|
6177
5869
|
backgroundColor: theme.palette.action.focus,
|
|
@@ -6267,49 +5959,30 @@ const Attributes = mobxReact.observer(function Attributes({ assembly, editable,
|
|
|
6267
5959
|
void changeManager.submit(change);
|
|
6268
5960
|
}
|
|
6269
5961
|
const NewKeyAttributeEditor = pluginManager.evaluateExtensionPoint('Apollo-AttributeEditorComponent', DefaultAttributeEditor, { key: newKey });
|
|
6270
|
-
return (
|
|
6271
|
-
|
|
6272
|
-
|
|
6273
|
-
|
|
6274
|
-
|
|
6275
|
-
|
|
6276
|
-
|
|
6277
|
-
|
|
6278
|
-
|
|
6279
|
-
|
|
6280
|
-
|
|
6281
|
-
|
|
6282
|
-
|
|
6283
|
-
|
|
6284
|
-
|
|
6285
|
-
|
|
6286
|
-
|
|
6287
|
-
|
|
6288
|
-
|
|
6289
|
-
|
|
6290
|
-
|
|
6291
|
-
|
|
6292
|
-
}, isNew: true }) }))) : null),
|
|
6293
|
-
editable ? (React__default["default"].createElement(material.Button, { color: "primary", variant: "contained", disabled: showAddNewForm || Boolean(newKey), onClick: () => {
|
|
6294
|
-
setShowAddNewForm(true);
|
|
6295
|
-
} }, "Add new")) : null,
|
|
6296
|
-
showAddNewForm ? (React__default["default"].createElement(material.Paper, { variant: "outlined", style: { marginTop: 8 } },
|
|
6297
|
-
React__default["default"].createElement(AttributeKeySelector, { session: session, setKey: (newKey) => {
|
|
6298
|
-
setNewKey(newKey);
|
|
6299
|
-
setShowAddNewForm(false);
|
|
6300
|
-
} }))) : null,
|
|
6301
|
-
React__default["default"].createElement(material.Menu, { anchorEl: anchorEl, open: open, onClose: handleClose },
|
|
6302
|
-
React__default["default"].createElement(material.MenuItem, { onClick: handleDelete },
|
|
6303
|
-
React__default["default"].createElement(material.ListItemIcon, null,
|
|
6304
|
-
React__default["default"].createElement(DeleteIcon__default["default"], { fontSize: "small" })),
|
|
6305
|
-
React__default["default"].createElement(material.Typography, { variant: "inherit" }, "Delete")),
|
|
6306
|
-
React__default["default"].createElement(material.MenuItem, { onClick: handleEdit },
|
|
6307
|
-
React__default["default"].createElement(material.ListItemIcon, null,
|
|
6308
|
-
React__default["default"].createElement(EditIcon__default["default"], { fontSize: "small" })),
|
|
6309
|
-
React__default["default"].createElement(material.Typography, { variant: "inherit" }, "Edit")))));
|
|
5962
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs(material.List, { className: classes.list, children: [mobx.entries(attributes).map(([key, values]) => {
|
|
5963
|
+
const AttributeEditor = pluginManager.evaluateExtensionPoint('Apollo-AttributeEditorComponent', DefaultAttributeEditor, { key });
|
|
5964
|
+
const AttributeViewer = pluginManager.evaluateExtensionPoint('Apollo-AttributeViewerComponent', DefaultAttributeViewer, { key });
|
|
5965
|
+
return (jsxRuntime.jsx(material.ListItem, { secondaryAction: editable && !editingKey ? (jsxRuntime.jsx(material.IconButton, { edge: "end", onClick: (event) => {
|
|
5966
|
+
handleListMenuClick(event, key);
|
|
5967
|
+
}, children: jsxRuntime.jsx(MoreHorizIcon, {}) })) : null, children: jsxRuntime.jsx(material.ListItemText, { disableTypography: true, primary: jsxRuntime.jsx(AttributeKey, { attributeKey: key }), secondary: editingKey === key ? (jsxRuntime.jsx(AttributeEditor, { session: session, attributeValues: values, setAttribute: (newValues) => {
|
|
5968
|
+
setEditingKey(null);
|
|
5969
|
+
if (newValues) {
|
|
5970
|
+
modifyFeatureAttribute(key, newValues);
|
|
5971
|
+
}
|
|
5972
|
+
} })) : (jsxRuntime.jsx(AttributeViewer, { values: values })) }) }, key));
|
|
5973
|
+
}), newKey ? (jsxRuntime.jsx(material.ListItem, { children: jsxRuntime.jsx(material.ListItemText, { disableTypography: true, primary: jsxRuntime.jsx(AttributeKey, { attributeKey: newKey }), secondary: jsxRuntime.jsx(NewKeyAttributeEditor, { session: session, attributeValues: [], setAttribute: (newValues) => {
|
|
5974
|
+
if (newValues) {
|
|
5975
|
+
addFeatureAttribute(newKey, newValues);
|
|
5976
|
+
}
|
|
5977
|
+
setNewKey(undefined);
|
|
5978
|
+
}, isNew: true }) }) })) : null] }), editable ? (jsxRuntime.jsx(material.Button, { color: "primary", variant: "contained", disabled: showAddNewForm || Boolean(newKey), onClick: () => {
|
|
5979
|
+
setShowAddNewForm(true);
|
|
5980
|
+
}, children: "Add new" })) : null, showAddNewForm ? (jsxRuntime.jsx(material.Paper, { variant: "outlined", style: { marginTop: 8 }, children: jsxRuntime.jsx(AttributeKeySelector, { session: session, setKey: (newKey) => {
|
|
5981
|
+
setNewKey(newKey);
|
|
5982
|
+
setShowAddNewForm(false);
|
|
5983
|
+
} }) })) : null, jsxRuntime.jsxs(material.Menu, { anchorEl: anchorEl, open: open, onClose: handleClose, children: [jsxRuntime.jsxs(material.MenuItem, { onClick: handleDelete, children: [jsxRuntime.jsx(material.ListItemIcon, { children: jsxRuntime.jsx(DeleteIcon, { fontSize: "small" }) }), jsxRuntime.jsx(material.Typography, { variant: "inherit", children: "Delete" })] }), jsxRuntime.jsxs(material.MenuItem, { onClick: handleEdit, children: [jsxRuntime.jsx(material.ListItemIcon, { children: jsxRuntime.jsx(EditIcon, { fontSize: "small" }) }), jsxRuntime.jsx(material.Typography, { variant: "inherit", children: "Edit" })] })] })] }));
|
|
6310
5984
|
});
|
|
6311
5985
|
|
|
6312
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
6313
5986
|
const NumberTextField = mobxReact.observer(function NumberTextField({ onChangeCommitted, value: initialValue, ...props }) {
|
|
6314
5987
|
const [value, setValue] = React.useState(String(initialValue));
|
|
6315
5988
|
const [blur, setBlur] = React.useState(false);
|
|
@@ -6327,7 +6000,7 @@ const NumberTextField = mobxReact.observer(function NumberTextField({ onChangeCo
|
|
|
6327
6000
|
setValue(event.target.value);
|
|
6328
6001
|
}
|
|
6329
6002
|
const error = Number.isNaN(Number(value));
|
|
6330
|
-
return (
|
|
6003
|
+
return (jsxRuntime.jsx(material.TextField, { ...props, type: "text", onChange: onChange, value: value, onKeyDown: (event) => {
|
|
6331
6004
|
if (event.key === 'Enter') {
|
|
6332
6005
|
inputNode?.blur();
|
|
6333
6006
|
}
|
|
@@ -6420,24 +6093,11 @@ const BasicInformation = mobxReact.observer(function BasicInformation({ assembly
|
|
|
6420
6093
|
}
|
|
6421
6094
|
return terms;
|
|
6422
6095
|
}
|
|
6423
|
-
return (
|
|
6424
|
-
|
|
6425
|
-
|
|
6426
|
-
|
|
6427
|
-
|
|
6428
|
-
handleTypeChange(newValue).catch(notifyError);
|
|
6429
|
-
}
|
|
6430
|
-
} }),
|
|
6431
|
-
React__default["default"].createElement("label", null,
|
|
6432
|
-
React__default["default"].createElement("input", { type: "radio", value: "1", checked: strand === 1, onChange: handleStrandChange }),
|
|
6433
|
-
"Positive Strand (+)"),
|
|
6434
|
-
React__default["default"].createElement("label", null,
|
|
6435
|
-
React__default["default"].createElement("input", { type: "radio", value: "-1", checked: strand === -1, onChange: handleStrandChange }),
|
|
6436
|
-
"Negative Strand (-)"),
|
|
6437
|
-
React__default["default"].createElement("label", null,
|
|
6438
|
-
React__default["default"].createElement("input", { type: "radio", value: "", checked: strand === undefined, onChange: handleStrandChange }),
|
|
6439
|
-
"No Strand Information"),
|
|
6440
|
-
errorMessage ? (React__default["default"].createElement(material.Typography, { color: "error" }, errorMessage)) : null));
|
|
6096
|
+
return (jsxRuntime.jsxs("div", { "data-testid": "basic_information", children: [jsxRuntime.jsx(NumberTextField, { margin: "dense", id: "start", label: "Start", fullWidth: true, variant: "outlined", value: min + 1, onChangeCommitted: handleStartChange }), jsxRuntime.jsx(NumberTextField, { margin: "dense", id: "end", label: "End", fullWidth: true, variant: "outlined", value: max, onChangeCommitted: handleEndChange }), jsxRuntime.jsx(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", value: type, filterTerms: isOntologyClass, fetchValidTerms: fetchValidTerms.bind(null, feature), renderInput: (params) => (jsxRuntime.jsx(material.TextField, { ...params, label: "Type", variant: "outlined", fullWidth: true, error: Boolean(typeWarningText), helperText: typeWarningText })), onChange: (oldValue, newValue) => {
|
|
6097
|
+
if (newValue) {
|
|
6098
|
+
handleTypeChange(newValue).catch(notifyError);
|
|
6099
|
+
}
|
|
6100
|
+
} }), jsxRuntime.jsxs("label", { children: [jsxRuntime.jsx("input", { type: "radio", value: "1", checked: strand === 1, onChange: handleStrandChange }), "Positive Strand (+)"] }), jsxRuntime.jsxs("label", { children: [jsxRuntime.jsx("input", { type: "radio", value: "-1", checked: strand === -1, onChange: handleStrandChange }), "Negative Strand (-)"] }), jsxRuntime.jsxs("label", { children: [jsxRuntime.jsx("input", { type: "radio", value: "", checked: strand === undefined, onChange: handleStrandChange }), "No Strand Information"] }), errorMessage ? (jsxRuntime.jsx(material.Typography, { color: "error", children: errorMessage })) : null] }));
|
|
6441
6101
|
});
|
|
6442
6102
|
|
|
6443
6103
|
const FeatureDetailsNavigation = mobxReact.observer(function FeatureDetailsNavigation(props) {
|
|
@@ -6452,42 +6112,19 @@ const FeatureDetailsNavigation = mobxReact.observer(function FeatureDetailsNavig
|
|
|
6452
6112
|
if (!(parent ?? childFeatures.length > 0)) {
|
|
6453
6113
|
return null;
|
|
6454
6114
|
}
|
|
6455
|
-
return (
|
|
6456
|
-
|
|
6457
|
-
|
|
6458
|
-
|
|
6459
|
-
|
|
6460
|
-
} },
|
|
6461
|
-
parent.type,
|
|
6462
|
-
getFeatureNameOrId$1(parent),
|
|
6463
|
-
" (",
|
|
6464
|
-
parent.min,
|
|
6465
|
-
"..",
|
|
6466
|
-
parent.max,
|
|
6467
|
-
")"))),
|
|
6468
|
-
childFeatures.length > 0 && (React__default["default"].createElement("div", null,
|
|
6469
|
-
React__default["default"].createElement(material.Typography, { variant: "h6" },
|
|
6470
|
-
childFeatures.length === 1 ? 'Child' : 'Children',
|
|
6471
|
-
":"),
|
|
6472
|
-
childFeatures.map((child) => (React__default["default"].createElement("div", { key: child._id, style: { marginBottom: 5 } },
|
|
6473
|
-
React__default["default"].createElement(material.Button, { variant: "contained", onClick: () => {
|
|
6474
|
-
model.setFeature(child);
|
|
6475
|
-
} },
|
|
6476
|
-
child.type,
|
|
6477
|
-
getFeatureNameOrId$1(child),
|
|
6478
|
-
" (",
|
|
6479
|
-
child.min,
|
|
6480
|
-
"..",
|
|
6481
|
-
child.max,
|
|
6482
|
-
")"))))))));
|
|
6115
|
+
return (jsxRuntime.jsxs("div", { style: { marginTop: 10 }, children: [parent && (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx(material.Typography, { variant: "h6", children: "Parent:" }), jsxRuntime.jsxs(material.Button, { variant: "contained", onClick: () => {
|
|
6116
|
+
model.setFeature(parent);
|
|
6117
|
+
}, children: [parent.type, getFeatureNameOrId$1(parent), " (", parent.min, "..", parent.max, ")"] })] })), childFeatures.length > 0 && (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs(material.Typography, { variant: "h6", children: [childFeatures.length === 1 ? 'Child' : 'Children', ":"] }), childFeatures.map((child) => (jsxRuntime.jsx("div", { style: { marginBottom: 5 }, children: jsxRuntime.jsxs(material.Button, { variant: "contained", onClick: () => {
|
|
6118
|
+
model.setFeature(child);
|
|
6119
|
+
}, children: [child.type, getFeatureNameOrId$1(child), " (", child.min, "..", child.max, ")"] }) }, child._id)))] }))] }));
|
|
6483
6120
|
});
|
|
6484
6121
|
|
|
6485
6122
|
function formatSequence(seq, refName, start, end, wrap) {
|
|
6486
6123
|
const header = `>${refName}:${start + 1}–${end}\n`;
|
|
6487
|
-
const body =
|
|
6124
|
+
const body = seq ;
|
|
6488
6125
|
return `${header}${body}`;
|
|
6489
6126
|
}
|
|
6490
|
-
const useStyles$9 =
|
|
6127
|
+
const useStyles$9 = tssReact.makeStyles()({
|
|
6491
6128
|
sequence: {
|
|
6492
6129
|
width: '100%',
|
|
6493
6130
|
resize: 'vertical',
|
|
@@ -6513,11 +6150,10 @@ const Sequence = mobxReact.observer(function Sequence({ assembly, feature, refNa
|
|
|
6513
6150
|
{ assemblyName: assembly, refName, start: min, end: max },
|
|
6514
6151
|
]);
|
|
6515
6152
|
}
|
|
6516
|
-
return (
|
|
6517
|
-
React__default["default"].createElement("textarea", { readOnly: true, rows: 20, className: classes.sequence, value: sequence })));
|
|
6153
|
+
return (jsxRuntime.jsx("div", { children: jsxRuntime.jsx("textarea", { readOnly: true, rows: 20, className: classes.sequence, value: sequence }) }));
|
|
6518
6154
|
});
|
|
6519
6155
|
|
|
6520
|
-
const useStyles$8 =
|
|
6156
|
+
const useStyles$8 = tssReact.makeStyles()((theme) => ({
|
|
6521
6157
|
root: {
|
|
6522
6158
|
padding: theme.spacing(2),
|
|
6523
6159
|
},
|
|
@@ -6554,31 +6190,17 @@ const ApolloFeatureDetailsWidget = mobxReact.observer(function ApolloFeatureDeta
|
|
|
6554
6190
|
setPanelState(panelState.filter((p) => p !== panel));
|
|
6555
6191
|
}
|
|
6556
6192
|
}
|
|
6557
|
-
return (
|
|
6558
|
-
|
|
6559
|
-
|
|
6560
|
-
|
|
6561
|
-
|
|
6562
|
-
|
|
6563
|
-
|
|
6564
|
-
React__default["default"].createElement(material.AccordionDetails, null,
|
|
6565
|
-
React__default["default"].createElement(Attributes, { feature: feature, session: session, assembly: currentAssembly._id, editable: true }))),
|
|
6566
|
-
React__default["default"].createElement(material.Accordion, { style: { marginTop: 10 }, expanded: panelState.includes('sequence'), onChange: (e, expanded) => {
|
|
6567
|
-
handlePanelChange(expanded, 'sequence');
|
|
6568
|
-
} },
|
|
6569
|
-
React__default["default"].createElement(material.AccordionSummary, { expandIcon: React__default["default"].createElement(ExpandMoreIcon__default["default"], { style: { color: 'white' } }), "aria-controls": "panel2-content", id: "panel2-header" },
|
|
6570
|
-
React__default["default"].createElement(material.Typography, { component: "span" }, "Sequence")),
|
|
6571
|
-
React__default["default"].createElement(material.AccordionDetails, null, panelState.includes('sequence') && (React__default["default"].createElement(Sequence, { feature: feature, session: session, assembly: currentAssembly._id, refName: refName })))),
|
|
6572
|
-
React__default["default"].createElement(material.Accordion, { style: { marginTop: 10 }, expanded: panelState.includes('related_features'), onChange: (e, expanded) => {
|
|
6573
|
-
handlePanelChange(expanded, 'related_features');
|
|
6574
|
-
} },
|
|
6575
|
-
React__default["default"].createElement(material.AccordionSummary, { expandIcon: React__default["default"].createElement(ExpandMoreIcon__default["default"], { style: { color: 'white' } }), "aria-controls": "panel3-content", id: "panel3-header" },
|
|
6576
|
-
React__default["default"].createElement(material.Typography, { component: "span" }, "Related features")),
|
|
6577
|
-
React__default["default"].createElement(material.AccordionDetails, null,
|
|
6578
|
-
React__default["default"].createElement(FeatureDetailsNavigation, { model: model, feature: feature })))));
|
|
6193
|
+
return (jsxRuntime.jsxs("div", { className: classes.root, children: [jsxRuntime.jsx(BasicInformation, { feature: feature, session: session, assembly: currentAssembly._id }), jsxRuntime.jsxs(material.Accordion, { style: { marginTop: 10 }, expanded: panelState.includes('attributes'), onChange: (e, expanded) => {
|
|
6194
|
+
handlePanelChange(expanded, 'attributes');
|
|
6195
|
+
}, children: [jsxRuntime.jsx(material.AccordionSummary, { expandIcon: jsxRuntime.jsx(ExpandMoreIcon, { style: { color: 'white' } }), "aria-controls": "panel1-content", id: "panel1-header", children: jsxRuntime.jsx(material.Typography, { component: "span", children: "Attributes" }) }), jsxRuntime.jsx(material.AccordionDetails, { children: jsxRuntime.jsx(Attributes, { feature: feature, session: session, assembly: currentAssembly._id, editable: true }) })] }), jsxRuntime.jsxs(material.Accordion, { style: { marginTop: 10 }, expanded: panelState.includes('sequence'), onChange: (e, expanded) => {
|
|
6196
|
+
handlePanelChange(expanded, 'sequence');
|
|
6197
|
+
}, children: [jsxRuntime.jsx(material.AccordionSummary, { expandIcon: jsxRuntime.jsx(ExpandMoreIcon, { style: { color: 'white' } }), "aria-controls": "panel2-content", id: "panel2-header", children: jsxRuntime.jsx(material.Typography, { component: "span", children: "Sequence" }) }), jsxRuntime.jsx(material.AccordionDetails, { children: panelState.includes('sequence') && (jsxRuntime.jsx(Sequence, { feature: feature, session: session, assembly: currentAssembly._id, refName: refName })) })] }), jsxRuntime.jsxs(material.Accordion, { style: { marginTop: 10 }, expanded: panelState.includes('related_features'), onChange: (e, expanded) => {
|
|
6198
|
+
handlePanelChange(expanded, 'related_features');
|
|
6199
|
+
}, children: [jsxRuntime.jsx(material.AccordionSummary, { expandIcon: jsxRuntime.jsx(ExpandMoreIcon, { style: { color: 'white' } }), "aria-controls": "panel3-content", id: "panel3-header", children: jsxRuntime.jsx(material.Typography, { component: "span", children: "Related features" }) }), jsxRuntime.jsx(material.AccordionDetails, { children: jsxRuntime.jsx(FeatureDetailsNavigation, { model: model, feature: feature }) })] })] }));
|
|
6579
6200
|
});
|
|
6580
6201
|
|
|
6581
6202
|
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
6203
|
+
/* eslint-disable @typescript-eslint/no-unnecessary-condition */
|
|
6582
6204
|
const ApolloFeatureDetailsWidgetModel = mobxStateTree.types
|
|
6583
6205
|
.model('ApolloFeatureDetailsWidget', {
|
|
6584
6206
|
id: mst.ElementId,
|
|
@@ -6888,41 +6510,27 @@ const TranscriptSequence = mobxReact.observer(function TranscriptSequence({ asse
|
|
|
6888
6510
|
segment.sequence.slice(0, sequenceWrapLength - lastLineLength);
|
|
6889
6511
|
const remainingLines = shared.splitStringIntoChunks(segment.sequence.slice(firstLine.length), sequenceWrapLength);
|
|
6890
6512
|
const printLines = [firstLine, ...remainingLines];
|
|
6891
|
-
const span = (
|
|
6513
|
+
const span = (jsxRuntime.jsx("span", { style: {
|
|
6892
6514
|
background: getSegmentColor(segment.type),
|
|
6893
6515
|
color: theme.palette.getContrastText(getSegmentColor(segment.type)),
|
|
6894
6516
|
whiteSpace: 'pre-line',
|
|
6895
|
-
}
|
|
6517
|
+
}, children: printLines.join('\n') }, `${segment.type}-${index}`));
|
|
6896
6518
|
seqElements.push(span);
|
|
6897
6519
|
}
|
|
6898
6520
|
return seqElements;
|
|
6899
6521
|
}
|
|
6900
|
-
return (
|
|
6901
|
-
|
|
6902
|
-
|
|
6903
|
-
|
|
6904
|
-
|
|
6905
|
-
|
|
6906
|
-
|
|
6907
|
-
|
|
6908
|
-
|
|
6909
|
-
refSeq.name,
|
|
6910
|
-
":",
|
|
6911
|
-
locationIntervals
|
|
6912
|
-
.map((interval) => feature.strand === 1
|
|
6913
|
-
? `${interval.min + 1}-${interval.max}`
|
|
6914
|
-
: `${interval.max}-${interval.min + 1}`)
|
|
6915
|
-
.join(';'),
|
|
6916
|
-
"(strand=",
|
|
6917
|
-
feature.strand === 1 ? '+' : '-',
|
|
6918
|
-
";length=",
|
|
6919
|
-
getSequenceLength(sequenceSegments),
|
|
6920
|
-
")",
|
|
6921
|
-
React__default["default"].createElement("br", null),
|
|
6922
|
-
wrapSequence(sequenceSegments, SEQUENCE_WRAP_LENGTH))));
|
|
6522
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(material.Select, { defaultValue: "genomic", value: selectedOption, onChange: handleChangeSeqOption, size: "small", "data-testid": "sequenceOptionSelector", children: sequenceOptions.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option, "data-testid": `sequenceOption-${option}`, children: option }, option))) }), jsxRuntime.jsx(material.Button, { variant: "contained", onClick: onCopyClick, style: { marginLeft: 10 }, size: "medium", children: "Copy sequence" }), jsxRuntime.jsxs(material.Paper, { style: {
|
|
6523
|
+
fontFamily: 'monospace',
|
|
6524
|
+
padding: theme.spacing(),
|
|
6525
|
+
overflowX: 'auto',
|
|
6526
|
+
}, ref: seqRef, children: [">", refSeq.name, ":", locationIntervals
|
|
6527
|
+
.map((interval) => feature.strand === 1
|
|
6528
|
+
? `${interval.min + 1}-${interval.max}`
|
|
6529
|
+
: `${interval.max}-${interval.min + 1}`)
|
|
6530
|
+
.join(';'), "(strand=", feature.strand === 1 ? '+' : '-', ";length=", getSequenceLength(sequenceSegments), ")", jsxRuntime.jsx("br", {}), wrapSequence(sequenceSegments, SEQUENCE_WRAP_LENGTH)] })] }));
|
|
6923
6531
|
});
|
|
6924
6532
|
|
|
6925
|
-
const StyledTextField =
|
|
6533
|
+
const StyledTextField = styled(NumberTextField)(() => ({
|
|
6926
6534
|
'&.MuiFormControl-root': {
|
|
6927
6535
|
marginTop: 0,
|
|
6928
6536
|
marginBottom: 0,
|
|
@@ -6935,7 +6543,7 @@ const StyledTextField = styled__default["default"](NumberTextField)(() => ({
|
|
|
6935
6543
|
paddingLeft: 10,
|
|
6936
6544
|
},
|
|
6937
6545
|
}));
|
|
6938
|
-
const SequenceContainer =
|
|
6546
|
+
const SequenceContainer = styled('div')({
|
|
6939
6547
|
display: 'flex',
|
|
6940
6548
|
justifyContent: 'center',
|
|
6941
6549
|
alignItems: 'center',
|
|
@@ -6950,7 +6558,7 @@ const SequenceContainer = styled__default["default"]('div')({
|
|
|
6950
6558
|
});
|
|
6951
6559
|
const Strand = (props) => {
|
|
6952
6560
|
const { strand } = props;
|
|
6953
|
-
return (
|
|
6561
|
+
return (jsxRuntime.jsx("div", { children: strand === 1 ? (jsxRuntime.jsx(AddIcon, {})) : strand === -1 ? (jsxRuntime.jsx(RemoveIcon, {})) : (jsxRuntime.jsx(material.Typography, { component: 'span', children: "N/A" })) }));
|
|
6954
6562
|
};
|
|
6955
6563
|
const minMaxExonTranscriptLocation = (transcript, featureTypeOntology) => {
|
|
6956
6564
|
const { transcriptExonParts } = transcript;
|
|
@@ -7414,11 +7022,11 @@ const TranscriptWidgetEditLocation = mobxReact.observer(function TranscriptWidge
|
|
|
7414
7022
|
const protein = util.defaultCodonTable[codonSeq] || '&';
|
|
7415
7023
|
// highlight start codon and stop codons
|
|
7416
7024
|
if (codonSeq === 'ATG') {
|
|
7417
|
-
elements.push(
|
|
7025
|
+
elements.push(jsxRuntime.jsx(material.Typography, { component: 'span', style: {
|
|
7418
7026
|
backgroundColor: changeInProgress ? 'lightgray' : 'yellow',
|
|
7419
7027
|
cursor: 'pointer',
|
|
7420
7028
|
border: '1px solid black',
|
|
7421
|
-
},
|
|
7029
|
+
}, onClick: () => {
|
|
7422
7030
|
if (changeInProgress) {
|
|
7423
7031
|
return;
|
|
7424
7032
|
}
|
|
@@ -7432,17 +7040,15 @@ const TranscriptWidgetEditLocation = mobxReact.observer(function TranscriptWidge
|
|
|
7432
7040
|
if (startCodonGenomicLocation !== cdsMax && strand === -1) {
|
|
7433
7041
|
updateCDSLocation(cdsMax, startCodonGenomicLocation, feature, false);
|
|
7434
7042
|
}
|
|
7435
|
-
} },
|
|
7043
|
+
}, children: protein }, codonGenomicPos));
|
|
7436
7044
|
}
|
|
7437
7045
|
else if (['TAA', 'TAG', 'TGA'].includes(codonSeq)) {
|
|
7438
|
-
elements.push(
|
|
7439
|
-
// Pass the codonGenomicPos as the key to maintain the genomic position of the codon
|
|
7440
|
-
key: codonGenomicPos }, protein));
|
|
7046
|
+
elements.push(jsxRuntime.jsx(material.Typography, { style: { backgroundColor: 'red', color: 'white' }, component: 'span', children: protein }, codonGenomicPos));
|
|
7441
7047
|
}
|
|
7442
7048
|
else {
|
|
7443
7049
|
elements.push(
|
|
7444
7050
|
// Pass the codonGenomicPos as the key to maintain the genomic position of the codon
|
|
7445
|
-
|
|
7051
|
+
jsxRuntime.jsx(material.Typography, { component: 'span', children: protein }, codonGenomicPos));
|
|
7446
7052
|
}
|
|
7447
7053
|
}
|
|
7448
7054
|
return elements;
|
|
@@ -7573,108 +7179,51 @@ const TranscriptWidgetEditLocation = mobxReact.observer(function TranscriptWidge
|
|
|
7573
7179
|
}
|
|
7574
7180
|
void copyToClipboard(seqDiv);
|
|
7575
7181
|
};
|
|
7576
|
-
return (
|
|
7577
|
-
|
|
7578
|
-
|
|
7579
|
-
|
|
7580
|
-
|
|
7581
|
-
|
|
7582
|
-
|
|
7583
|
-
|
|
7584
|
-
|
|
7585
|
-
|
|
7586
|
-
|
|
7587
|
-
|
|
7588
|
-
|
|
7589
|
-
|
|
7590
|
-
|
|
7591
|
-
|
|
7592
|
-
|
|
7593
|
-
|
|
7594
|
-
|
|
7595
|
-
|
|
7596
|
-
|
|
7597
|
-
|
|
7598
|
-
|
|
7599
|
-
|
|
7600
|
-
|
|
7601
|
-
|
|
7602
|
-
|
|
7603
|
-
React__default["default"].createElement(StyledTextField, { margin: "dense", variant: "outlined", value: cdsMax, onChangeCommitted: (newLocation) => {
|
|
7604
|
-
return updateCDSLocation(cdsMax, newLocation, feature, false);
|
|
7605
|
-
}, style: { border: '1px solid black', borderRadius: 5 }, disabled: changeInProgress }))),
|
|
7606
|
-
React__default["default"].createElement(material.Grid, { size: 2 },
|
|
7607
|
-
React__default["default"].createElement(material.Typography, { component: 'span' }, "CDS")),
|
|
7608
|
-
strand === 1 ? (React__default["default"].createElement(material.Grid, { size: 4 },
|
|
7609
|
-
React__default["default"].createElement(StyledTextField, { margin: "dense", variant: "outlined", value: cdsMax, onChangeCommitted: (newLocation) => {
|
|
7610
|
-
return updateCDSLocation(cdsMax, newLocation, feature, false);
|
|
7611
|
-
}, style: { border: '1px solid black', borderRadius: 5 }, disabled: changeInProgress }))) : (React__default["default"].createElement(material.Grid, { size: 4 },
|
|
7612
|
-
React__default["default"].createElement(StyledTextField, { margin: "dense", variant: "outlined", value: cdsMin + 1, onChangeCommitted: (newLocation) => {
|
|
7613
|
-
return updateCDSLocation(cdsMin, newLocation - 1, feature, true);
|
|
7614
|
-
}, style: { border: '1px solid black', borderRadius: 5 }, disabled: changeInProgress }))),
|
|
7615
|
-
React__default["default"].createElement(material.Grid, { size: 1 })))),
|
|
7616
|
-
React__default["default"].createElement("div", { style: { marginTop: 5 } }, transcriptExonParts.map((loc, index) => {
|
|
7617
|
-
return (React__default["default"].createElement("div", { key: index }, loc.type === 'exon' && (React__default["default"].createElement(material.Grid, { container: true, justifyContent: "center", alignItems: "center", style: { textAlign: 'center' } },
|
|
7618
|
-
React__default["default"].createElement(material.Grid, { size: 1 }, index !== 0 &&
|
|
7619
|
-
getFivePrimeSpliceSite(loc, index).map((site, idx) => (React__default["default"].createElement(material.Typography, { key: idx, component: 'span', color: site.color }, site.spliceSite)))),
|
|
7620
|
-
strand === 1 ? (React__default["default"].createElement(material.Grid, { size: 4, style: { padding: 0 } },
|
|
7621
|
-
React__default["default"].createElement(StyledTextField, { margin: "dense", variant: "outlined", value: loc.min + 1, onChangeCommitted: (newLocation) => {
|
|
7622
|
-
return handleExonLocationChange(loc.min, newLocation - 1, feature, true);
|
|
7623
|
-
}, disabled: changeInProgress }))) : (React__default["default"].createElement(material.Grid, { size: 4, style: { padding: 0 } },
|
|
7624
|
-
React__default["default"].createElement(StyledTextField, { margin: "dense", variant: "outlined", value: loc.max, onChangeCommitted: (newLocation) => {
|
|
7625
|
-
return handleExonLocationChange(loc.max, newLocation, feature, false);
|
|
7626
|
-
}, disabled: changeInProgress }))),
|
|
7627
|
-
React__default["default"].createElement(material.Grid, { size: 2 },
|
|
7628
|
-
React__default["default"].createElement(Strand, { strand: feature.strand })),
|
|
7629
|
-
strand === 1 ? (React__default["default"].createElement(material.Grid, { size: 4, style: { padding: 0 } },
|
|
7630
|
-
React__default["default"].createElement(StyledTextField, { margin: "dense", variant: "outlined", value: loc.max, onChangeCommitted: (newLocation) => {
|
|
7631
|
-
return handleExonLocationChange(loc.max, newLocation, feature, false);
|
|
7632
|
-
}, disabled: changeInProgress }))) : (React__default["default"].createElement(material.Grid, { size: 4, style: { padding: 0 } },
|
|
7633
|
-
React__default["default"].createElement(StyledTextField, { margin: "dense", variant: "outlined", value: loc.min + 1, onChangeCommitted: (newLocation) => {
|
|
7634
|
-
return handleExonLocationChange(loc.min, newLocation - 1, feature, true);
|
|
7635
|
-
}, disabled: changeInProgress }))),
|
|
7636
|
-
React__default["default"].createElement(material.Grid, { size: 1 }, index !== transcriptExonParts.length - 1 &&
|
|
7637
|
-
getThreePrimeSpliceSite(loc, index).map((site, idx) => (React__default["default"].createElement(material.Typography, { key: idx, component: 'span', color: site.color }, site.spliceSite))))))));
|
|
7638
|
-
}))));
|
|
7182
|
+
return (jsxRuntime.jsxs("div", { children: [cdsPresent && (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs(material.Accordion, { children: [jsxRuntime.jsx(StyledAccordionSummary, { expandIcon: jsxRuntime.jsx(ExpandMoreIcon, { style: { color: 'white' } }), "aria-controls": "panel1-content", id: "panel1-header", children: jsxRuntime.jsx(material.Typography, { component: "span", fontWeight: 'bold', children: "Translation" }) }), jsxRuntime.jsxs(material.AccordionDetails, { children: [jsxRuntime.jsx(SequenceContainer, { children: jsxRuntime.jsx(material.Typography, { component: 'span', ref: seqRef, style: { maxHeight: 120, overflowY: 'scroll' }, children: getTranslationSequence() }) }), jsxRuntime.jsxs("div", { style: {
|
|
7183
|
+
marginTop: 10,
|
|
7184
|
+
display: 'flex',
|
|
7185
|
+
flexDirection: 'row',
|
|
7186
|
+
alignItems: 'center',
|
|
7187
|
+
gap: 10,
|
|
7188
|
+
}, children: [jsxRuntime.jsx(material.Tooltip, { title: "Copy", children: jsxRuntime.jsx("button", { onClick: onCopyClick, style: { border: 'none', background: 'none', padding: 0 }, disabled: changeInProgress, children: jsxRuntime.jsx(ContentCopyIcon, { style: { fontSize: 15 } }) }) }), jsxRuntime.jsx(material.Tooltip, { title: "Trim", children: jsxRuntime.jsx("button", { onClick: trimTranslationSequence, style: { border: 'none', background: 'none', padding: 0 }, disabled: changeInProgress, children: jsxRuntime.jsx(ContentCutIcon, { style: { fontSize: 15 } }) }) })] })] })] }), jsxRuntime.jsxs(material.Grid, { container: true, justifyContent: "center", alignItems: "center", style: { textAlign: 'center', marginTop: 10 }, children: [jsxRuntime.jsx(material.Grid, { size: 1 }), strand === 1 ? (jsxRuntime.jsx(material.Grid, { size: 4, children: jsxRuntime.jsx(StyledTextField, { margin: "dense", variant: "outlined", value: cdsMin + 1, onChangeCommitted: (newLocation) => {
|
|
7189
|
+
return updateCDSLocation(cdsMin, newLocation - 1, feature, true);
|
|
7190
|
+
}, style: { border: '1px solid black', borderRadius: 5 }, disabled: changeInProgress }) })) : (jsxRuntime.jsx(material.Grid, { size: 4, children: jsxRuntime.jsx(StyledTextField, { margin: "dense", variant: "outlined", value: cdsMax, onChangeCommitted: (newLocation) => {
|
|
7191
|
+
return updateCDSLocation(cdsMax, newLocation, feature, false);
|
|
7192
|
+
}, style: { border: '1px solid black', borderRadius: 5 }, disabled: changeInProgress }) })), jsxRuntime.jsx(material.Grid, { size: 2, children: jsxRuntime.jsx(material.Typography, { component: 'span', children: "CDS" }) }), strand === 1 ? (jsxRuntime.jsx(material.Grid, { size: 4, children: jsxRuntime.jsx(StyledTextField, { margin: "dense", variant: "outlined", value: cdsMax, onChangeCommitted: (newLocation) => {
|
|
7193
|
+
return updateCDSLocation(cdsMax, newLocation, feature, false);
|
|
7194
|
+
}, style: { border: '1px solid black', borderRadius: 5 }, disabled: changeInProgress }) })) : (jsxRuntime.jsx(material.Grid, { size: 4, children: jsxRuntime.jsx(StyledTextField, { margin: "dense", variant: "outlined", value: cdsMin + 1, onChangeCommitted: (newLocation) => {
|
|
7195
|
+
return updateCDSLocation(cdsMin, newLocation - 1, feature, true);
|
|
7196
|
+
}, style: { border: '1px solid black', borderRadius: 5 }, disabled: changeInProgress }) })), jsxRuntime.jsx(material.Grid, { size: 1 })] })] })), jsxRuntime.jsx("div", { style: { marginTop: 5 }, children: transcriptExonParts.map((loc, index) => {
|
|
7197
|
+
return (jsxRuntime.jsx("div", { children: loc.type === 'exon' && (jsxRuntime.jsxs(material.Grid, { container: true, justifyContent: "center", alignItems: "center", style: { textAlign: 'center' }, children: [jsxRuntime.jsx(material.Grid, { size: 1, children: index !== 0 &&
|
|
7198
|
+
getFivePrimeSpliceSite(loc, index).map((site, idx) => (jsxRuntime.jsx(material.Typography, { component: 'span', color: site.color, children: site.spliceSite }, idx))) }), strand === 1 ? (jsxRuntime.jsx(material.Grid, { size: 4, style: { padding: 0 }, children: jsxRuntime.jsx(StyledTextField, { margin: "dense", variant: "outlined", value: loc.min + 1, onChangeCommitted: (newLocation) => {
|
|
7199
|
+
return handleExonLocationChange(loc.min, newLocation - 1, feature, true);
|
|
7200
|
+
}, disabled: changeInProgress }) })) : (jsxRuntime.jsx(material.Grid, { size: 4, style: { padding: 0 }, children: jsxRuntime.jsx(StyledTextField, { margin: "dense", variant: "outlined", value: loc.max, onChangeCommitted: (newLocation) => {
|
|
7201
|
+
return handleExonLocationChange(loc.max, newLocation, feature, false);
|
|
7202
|
+
}, disabled: changeInProgress }) })), jsxRuntime.jsx(material.Grid, { size: 2, children: jsxRuntime.jsx(Strand, { strand: feature.strand }) }), strand === 1 ? (jsxRuntime.jsx(material.Grid, { size: 4, style: { padding: 0 }, children: jsxRuntime.jsx(StyledTextField, { margin: "dense", variant: "outlined", value: loc.max, onChangeCommitted: (newLocation) => {
|
|
7203
|
+
return handleExonLocationChange(loc.max, newLocation, feature, false);
|
|
7204
|
+
}, disabled: changeInProgress }) })) : (jsxRuntime.jsx(material.Grid, { size: 4, style: { padding: 0 }, children: jsxRuntime.jsx(StyledTextField, { margin: "dense", variant: "outlined", value: loc.min + 1, onChangeCommitted: (newLocation) => {
|
|
7205
|
+
return handleExonLocationChange(loc.min, newLocation - 1, feature, true);
|
|
7206
|
+
}, disabled: changeInProgress }) })), jsxRuntime.jsx(material.Grid, { size: 1, children: index !== transcriptExonParts.length - 1 &&
|
|
7207
|
+
getThreePrimeSpliceSite(loc, index).map((site, idx) => (jsxRuntime.jsx(material.Typography, { component: 'span', color: site.color, children: site.spliceSite }, idx))) })] })) }, index));
|
|
7208
|
+
}) })] }));
|
|
7639
7209
|
});
|
|
7640
7210
|
|
|
7641
|
-
const HeaderTableCell =
|
|
7211
|
+
const HeaderTableCell = styled(material.TableCell)(() => ({
|
|
7642
7212
|
fontWeight: 'bold',
|
|
7643
7213
|
}));
|
|
7644
7214
|
const TranscriptWidgetSummary = mobxReact.observer(function TranscriptWidgetSummary(props) {
|
|
7645
7215
|
const { feature } = props;
|
|
7646
7216
|
const name = getFeatureName$1(feature);
|
|
7647
7217
|
const id = getFeatureId$1(feature);
|
|
7648
|
-
return (
|
|
7649
|
-
React__default["default"].createElement(material.TableBody, null,
|
|
7650
|
-
name !== '' && (React__default["default"].createElement(material.TableRow, null,
|
|
7651
|
-
React__default["default"].createElement(HeaderTableCell, null, "Name"),
|
|
7652
|
-
React__default["default"].createElement(material.TableCell, null, getFeatureName$1(feature)))),
|
|
7653
|
-
id !== '' && (React__default["default"].createElement(material.TableRow, null,
|
|
7654
|
-
React__default["default"].createElement(HeaderTableCell, null, "ID"),
|
|
7655
|
-
React__default["default"].createElement(material.TableCell, null, getFeatureId$1(feature)))),
|
|
7656
|
-
React__default["default"].createElement(material.TableRow, null,
|
|
7657
|
-
React__default["default"].createElement(HeaderTableCell, null, "Type"),
|
|
7658
|
-
React__default["default"].createElement(material.TableCell, null, feature.type)),
|
|
7659
|
-
React__default["default"].createElement(material.TableRow, null,
|
|
7660
|
-
React__default["default"].createElement(HeaderTableCell, null, "Location"),
|
|
7661
|
-
React__default["default"].createElement(material.TableCell, null,
|
|
7662
|
-
props.refName,
|
|
7663
|
-
":",
|
|
7664
|
-
feature.min,
|
|
7665
|
-
"..",
|
|
7666
|
-
feature.max)),
|
|
7667
|
-
React__default["default"].createElement(material.TableRow, null,
|
|
7668
|
-
React__default["default"].createElement(HeaderTableCell, null, "Strand"),
|
|
7669
|
-
React__default["default"].createElement(material.TableCell, null, getStrand(feature.strand))))));
|
|
7218
|
+
return (jsxRuntime.jsx(material.Table, { size: "small", sx: { fontSize: '0.75rem', '& .MuiTableCell-root': { padding: '4px' } }, children: jsxRuntime.jsxs(material.TableBody, { children: [name !== '' && (jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(HeaderTableCell, { children: "Name" }), jsxRuntime.jsx(material.TableCell, { children: getFeatureName$1(feature) })] })), id !== '' && (jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(HeaderTableCell, { children: "ID" }), jsxRuntime.jsx(material.TableCell, { children: getFeatureId$1(feature) })] })), jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(HeaderTableCell, { children: "Type" }), jsxRuntime.jsx(material.TableCell, { children: feature.type })] }), jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(HeaderTableCell, { children: "Location" }), jsxRuntime.jsxs(material.TableCell, { children: [props.refName, ":", feature.min, "..", feature.max] })] }), jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(HeaderTableCell, { children: "Strand" }), jsxRuntime.jsx(material.TableCell, { children: getStrand(feature.strand) })] })] }) }));
|
|
7670
7219
|
});
|
|
7671
7220
|
|
|
7672
|
-
const useStyles$7 =
|
|
7221
|
+
const useStyles$7 = tssReact.makeStyles()((theme) => ({
|
|
7673
7222
|
root: {
|
|
7674
7223
|
padding: theme.spacing(2),
|
|
7675
7224
|
},
|
|
7676
7225
|
}));
|
|
7677
|
-
const StyledAccordionSummary =
|
|
7226
|
+
const StyledAccordionSummary = styled(material.AccordionSummary)(() => ({
|
|
7678
7227
|
minHeight: 30,
|
|
7679
7228
|
maxHeight: 30,
|
|
7680
7229
|
'&.Mui-expanded': {
|
|
@@ -7733,48 +7282,15 @@ const ApolloTranscriptDetailsWidget = mobxReact.observer(function ApolloTranscri
|
|
|
7733
7282
|
const CustomComponentAfterAttributes = pluginManager.evaluateExtensionPoint('Apollo-TranscriptDetailsCustomComponent-AfterAttributes', NoOpCustomComponent, { feature, session });
|
|
7734
7283
|
const CustomComponentInsideSequence = pluginManager.evaluateExtensionPoint('Apollo-TranscriptDetailsCustomComponent-InsideSequence', NoOpCustomComponent, { feature, session });
|
|
7735
7284
|
const CustomComponentAfterSequence = pluginManager.evaluateExtensionPoint('Apollo-TranscriptDetailsCustomComponent-AfterSequence', NoOpCustomComponent, { feature, session });
|
|
7736
|
-
return (
|
|
7737
|
-
|
|
7738
|
-
|
|
7739
|
-
|
|
7740
|
-
|
|
7741
|
-
|
|
7742
|
-
|
|
7743
|
-
|
|
7744
|
-
|
|
7745
|
-
React__default["default"].createElement(CustomComponentAfterSummary, { session: session, feature: feature }),
|
|
7746
|
-
React__default["default"].createElement(material.Accordion, { style: { marginTop: 5 }, expanded: panelState.includes('location'), onChange: (e, expanded) => {
|
|
7747
|
-
handlePanelChange(expanded, 'location');
|
|
7748
|
-
} },
|
|
7749
|
-
React__default["default"].createElement(StyledAccordionSummary, { expandIcon: React__default["default"].createElement(ExpandMoreIcon__default["default"], { style: { color: 'white' } }), "aria-controls": "panel2-content", id: "panel2-header" },
|
|
7750
|
-
React__default["default"].createElement(material.Typography, { component: "span", fontWeight: 'bold' }, "Location")),
|
|
7751
|
-
React__default["default"].createElement(material.AccordionDetails, null,
|
|
7752
|
-
React__default["default"].createElement(TranscriptWidgetEditLocation, { feature: feature, refName: refName, session: apolloSession, assembly: currentAssembly._id || '' }),
|
|
7753
|
-
React__default["default"].createElement(CustomComponentInsideLocation, { session: session, feature: feature }))),
|
|
7754
|
-
React__default["default"].createElement(CustomComponentAfterLocation, { session: session, feature: feature }),
|
|
7755
|
-
React__default["default"].createElement(material.Accordion, { style: { marginTop: 5 }, expanded: panelState.includes('attrs'), onChange: (e, expanded) => {
|
|
7756
|
-
handlePanelChange(expanded, 'attrs');
|
|
7757
|
-
} },
|
|
7758
|
-
React__default["default"].createElement(StyledAccordionSummary, { expandIcon: React__default["default"].createElement(ExpandMoreIcon__default["default"], { style: { color: 'white' } }), "aria-controls": "panel3-content", id: "panel3-header" },
|
|
7759
|
-
React__default["default"].createElement("div", { style: { display: 'flex', alignItems: 'center' } },
|
|
7760
|
-
React__default["default"].createElement(material.Typography, { component: "span", fontWeight: 'bold' },
|
|
7761
|
-
"Attributes",
|
|
7762
|
-
' '),
|
|
7763
|
-
React__default["default"].createElement(material.Tooltip, { title: "Separate multiple values for the attribute with commas" },
|
|
7764
|
-
React__default["default"].createElement(InfoIcon__default["default"], { style: { color: 'white', fontSize: 15, marginLeft: 10 } })))),
|
|
7765
|
-
React__default["default"].createElement(material.AccordionDetails, null,
|
|
7766
|
-
React__default["default"].createElement(Attributes, { feature: feature, session: apolloSession, assembly: currentAssembly._id || '', editable: editable }),
|
|
7767
|
-
React__default["default"].createElement(CustomComponentInsideAttributes, { session: session, feature: feature }))),
|
|
7768
|
-
React__default["default"].createElement(CustomComponentAfterAttributes, { session: session, feature: feature }),
|
|
7769
|
-
React__default["default"].createElement(material.Accordion, { style: { marginTop: 5 }, expanded: panelState.includes('sequence'), onChange: (e, expanded) => {
|
|
7770
|
-
handlePanelChange(expanded, 'sequence');
|
|
7771
|
-
} },
|
|
7772
|
-
React__default["default"].createElement(StyledAccordionSummary, { expandIcon: React__default["default"].createElement(ExpandMoreIcon__default["default"], { style: { color: 'white' } }), "aria-controls": "panel4-content", id: "panel4-header" },
|
|
7773
|
-
React__default["default"].createElement(material.Typography, { component: "span", fontWeight: 'bold' }, "Sequence")),
|
|
7774
|
-
React__default["default"].createElement(material.AccordionDetails, null,
|
|
7775
|
-
panelState.includes('sequence') && (React__default["default"].createElement(TranscriptSequence, { feature: feature, session: apolloSession, assembly: currentAssembly._id || '', refName: refName })),
|
|
7776
|
-
React__default["default"].createElement(CustomComponentInsideSequence, { session: session, feature: feature }))),
|
|
7777
|
-
React__default["default"].createElement(CustomComponentAfterSequence, { feature: feature, session: session })));
|
|
7285
|
+
return (jsxRuntime.jsxs("div", { className: classes.root, children: [jsxRuntime.jsxs(material.Accordion, { expanded: panelState.includes('summary'), onChange: (e, expanded) => {
|
|
7286
|
+
handlePanelChange(expanded, 'summary');
|
|
7287
|
+
}, children: [jsxRuntime.jsx(StyledAccordionSummary, { expandIcon: jsxRuntime.jsx(ExpandMoreIcon, { style: { color: 'white' } }), "aria-controls": "panel1-content", id: "panel1-header", children: jsxRuntime.jsx(material.Typography, { component: "span", fontWeight: 'bold', children: "Summary" }) }), jsxRuntime.jsxs(material.AccordionDetails, { children: [jsxRuntime.jsx(TranscriptWidgetSummary, { feature: feature, refName: refName }), jsxRuntime.jsx(CustomComponentInsideSummary, { session: session, feature: feature })] })] }), jsxRuntime.jsx(CustomComponentAfterSummary, { session: session, feature: feature }), jsxRuntime.jsxs(material.Accordion, { style: { marginTop: 5 }, expanded: panelState.includes('location'), onChange: (e, expanded) => {
|
|
7288
|
+
handlePanelChange(expanded, 'location');
|
|
7289
|
+
}, children: [jsxRuntime.jsx(StyledAccordionSummary, { expandIcon: jsxRuntime.jsx(ExpandMoreIcon, { style: { color: 'white' } }), "aria-controls": "panel2-content", id: "panel2-header", children: jsxRuntime.jsx(material.Typography, { component: "span", fontWeight: 'bold', children: "Location" }) }), jsxRuntime.jsxs(material.AccordionDetails, { children: [jsxRuntime.jsx(TranscriptWidgetEditLocation, { feature: feature, refName: refName, session: apolloSession, assembly: currentAssembly._id || '' }), jsxRuntime.jsx(CustomComponentInsideLocation, { session: session, feature: feature })] })] }), jsxRuntime.jsx(CustomComponentAfterLocation, { session: session, feature: feature }), jsxRuntime.jsxs(material.Accordion, { style: { marginTop: 5 }, expanded: panelState.includes('attrs'), onChange: (e, expanded) => {
|
|
7290
|
+
handlePanelChange(expanded, 'attrs');
|
|
7291
|
+
}, children: [jsxRuntime.jsx(StyledAccordionSummary, { expandIcon: jsxRuntime.jsx(ExpandMoreIcon, { style: { color: 'white' } }), "aria-controls": "panel3-content", id: "panel3-header", children: jsxRuntime.jsxs("div", { style: { display: 'flex', alignItems: 'center' }, children: [jsxRuntime.jsxs(material.Typography, { component: "span", fontWeight: 'bold', children: ["Attributes", ' '] }), jsxRuntime.jsx(material.Tooltip, { title: "Separate multiple values for the attribute with commas", children: jsxRuntime.jsx(InfoIcon, { style: { color: 'white', fontSize: 15, marginLeft: 10 } }) })] }) }), jsxRuntime.jsxs(material.AccordionDetails, { children: [jsxRuntime.jsx(Attributes, { feature: feature, session: apolloSession, assembly: currentAssembly._id || '', editable: editable }), jsxRuntime.jsx(CustomComponentInsideAttributes, { session: session, feature: feature })] })] }), jsxRuntime.jsx(CustomComponentAfterAttributes, { session: session, feature: feature }), jsxRuntime.jsxs(material.Accordion, { style: { marginTop: 5 }, expanded: panelState.includes('sequence'), onChange: (e, expanded) => {
|
|
7292
|
+
handlePanelChange(expanded, 'sequence');
|
|
7293
|
+
}, children: [jsxRuntime.jsx(StyledAccordionSummary, { expandIcon: jsxRuntime.jsx(ExpandMoreIcon, { style: { color: 'white' } }), "aria-controls": "panel4-content", id: "panel4-header", children: jsxRuntime.jsx(material.Typography, { component: "span", fontWeight: 'bold', children: "Sequence" }) }), jsxRuntime.jsxs(material.AccordionDetails, { children: [panelState.includes('sequence') && (jsxRuntime.jsx(TranscriptSequence, { feature: feature, session: apolloSession, assembly: currentAssembly._id || '', refName: refName })), jsxRuntime.jsx(CustomComponentInsideSequence, { session: session, feature: feature })] })] }), jsxRuntime.jsx(CustomComponentAfterSequence, { feature: feature, session: session })] }));
|
|
7778
7294
|
});
|
|
7779
7295
|
|
|
7780
7296
|
const configSchema$2 = configuration.ConfigurationSchema('LinearApolloDisplay', {}, { explicitIdentifier: 'displayId', explicitlyTyped: true });
|
|
@@ -7816,7 +7332,7 @@ function handleFeatureEndChange(changeManager, feature, oldEnd, newEnd) {
|
|
|
7816
7332
|
return changeManager.submit(change);
|
|
7817
7333
|
}
|
|
7818
7334
|
|
|
7819
|
-
const useStyles$6 =
|
|
7335
|
+
const useStyles$6 = tssReact.makeStyles()({
|
|
7820
7336
|
highlighted: {
|
|
7821
7337
|
background: 'orange',
|
|
7822
7338
|
},
|
|
@@ -7824,19 +7340,17 @@ const useStyles$6 = mui.makeStyles()({
|
|
|
7824
7340
|
const Highlight = ({ highlight, text, }) => {
|
|
7825
7341
|
const { classes } = useStyles$6();
|
|
7826
7342
|
if (!highlight) {
|
|
7827
|
-
return
|
|
7343
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: text });
|
|
7828
7344
|
}
|
|
7829
7345
|
const split = text.split(highlight);
|
|
7830
7346
|
if (split.length === 1) {
|
|
7831
|
-
return
|
|
7347
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: text });
|
|
7832
7348
|
}
|
|
7833
7349
|
const highlighted = [];
|
|
7834
7350
|
for (let i = 0; i < split.length - 1; i++) {
|
|
7835
|
-
highlighted.push(split[i],
|
|
7351
|
+
highlighted.push(split[i], jsxRuntime.jsx("span", { className: classes.highlighted, children: highlight }));
|
|
7836
7352
|
}
|
|
7837
|
-
return (
|
|
7838
|
-
highlighted,
|
|
7839
|
-
split.at(-1)));
|
|
7353
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [highlighted, split.at(-1)] }));
|
|
7840
7354
|
};
|
|
7841
7355
|
|
|
7842
7356
|
const FeatureAttributes = mobxReact.observer(function FeatureAttributes({ feature, filterText, }) {
|
|
@@ -7855,11 +7369,10 @@ const FeatureAttributes = mobxReact.observer(function FeatureAttributes({ featur
|
|
|
7855
7369
|
.filter(([key]) => key) // Leave empty keys off
|
|
7856
7370
|
.map(([key, values]) => `${key}=${Array.isArray(values) ? values.join(', ') : values}`)
|
|
7857
7371
|
.join(', ');
|
|
7858
|
-
return
|
|
7372
|
+
return jsxRuntime.jsx(Highlight, { text: attrString, highlight: filterText });
|
|
7859
7373
|
});
|
|
7860
7374
|
|
|
7861
|
-
|
|
7862
|
-
const useStyles$5 = mui.makeStyles()((theme) => ({
|
|
7375
|
+
const useStyles$5 = tssReact.makeStyles()((theme) => ({
|
|
7863
7376
|
inputWrapper: {
|
|
7864
7377
|
position: 'relative',
|
|
7865
7378
|
},
|
|
@@ -7899,23 +7412,21 @@ const NumberCell = mobxReact.observer(function NumberCell({ initialValue, notify
|
|
|
7899
7412
|
setValue(newValue);
|
|
7900
7413
|
}
|
|
7901
7414
|
}
|
|
7902
|
-
return (
|
|
7903
|
-
|
|
7904
|
-
|
|
7905
|
-
|
|
7906
|
-
|
|
7907
|
-
|
|
7908
|
-
|
|
7909
|
-
|
|
7910
|
-
|
|
7911
|
-
|
|
7912
|
-
|
|
7913
|
-
|
|
7914
|
-
|
|
7915
|
-
|
|
7916
|
-
|
|
7917
|
-
setInputNode(node);
|
|
7918
|
-
} })));
|
|
7415
|
+
return (jsxRuntime.jsxs("span", { className: classes.inputWrapper, children: [jsxRuntime.jsx("span", { className: classes.hiddenWidthSpan, "aria-hidden": true, children: value }), jsxRuntime.jsx("input", { type: "text", value: value, className: classes.numberTextInput, onChange: onChange, onKeyDown: (event) => {
|
|
7416
|
+
if (event.key === 'Enter') {
|
|
7417
|
+
inputNode?.blur();
|
|
7418
|
+
}
|
|
7419
|
+
else if (event.key === 'Escape') {
|
|
7420
|
+
setValue(initialValue);
|
|
7421
|
+
setBlur(true);
|
|
7422
|
+
}
|
|
7423
|
+
}, onBlur: () => {
|
|
7424
|
+
if (value !== initialValue) {
|
|
7425
|
+
onChangeCommitted(value).catch(notifyError);
|
|
7426
|
+
}
|
|
7427
|
+
}, ref: (node) => {
|
|
7428
|
+
setInputNode(node);
|
|
7429
|
+
} })] }));
|
|
7919
7430
|
});
|
|
7920
7431
|
|
|
7921
7432
|
function featureContextMenuItems(feature, region, getAssemblyId, selectedFeature, setSelectedFeature, session, changeManager, filteredTranscripts, updateFilteredTranscripts) {
|
|
@@ -8068,6 +7579,24 @@ function featureContextMenuItems(feature, region, getAssemblyId, selectedFeature
|
|
|
8068
7579
|
});
|
|
8069
7580
|
session.showWidget(apolloTranscriptWidget);
|
|
8070
7581
|
},
|
|
7582
|
+
}, {
|
|
7583
|
+
label: 'Duplicate feature',
|
|
7584
|
+
onClick: () => {
|
|
7585
|
+
session.queueDialog((doneCallback) => [
|
|
7586
|
+
DuplicateTranscript,
|
|
7587
|
+
{
|
|
7588
|
+
session,
|
|
7589
|
+
handleClose: () => {
|
|
7590
|
+
doneCallback();
|
|
7591
|
+
},
|
|
7592
|
+
changeManager,
|
|
7593
|
+
sourceFeature: feature,
|
|
7594
|
+
sourceAssemblyId: currentAssemblyId,
|
|
7595
|
+
selectedFeature,
|
|
7596
|
+
setSelectedFeature,
|
|
7597
|
+
},
|
|
7598
|
+
]);
|
|
7599
|
+
},
|
|
8071
7600
|
}, {
|
|
8072
7601
|
label: 'Visible',
|
|
8073
7602
|
type: 'checkbox',
|
|
@@ -8086,8 +7615,7 @@ function featureContextMenuItems(feature, region, getAssemblyId, selectedFeature
|
|
|
8086
7615
|
return menuItems;
|
|
8087
7616
|
}
|
|
8088
7617
|
|
|
8089
|
-
|
|
8090
|
-
const useStyles$4 = mui.makeStyles()((theme) => ({
|
|
7618
|
+
const useStyles$4 = tssReact.makeStyles()((theme) => ({
|
|
8091
7619
|
typeContent: {
|
|
8092
7620
|
display: 'inline-block',
|
|
8093
7621
|
width: '174px',
|
|
@@ -8142,70 +7670,55 @@ const Feature = mobxReact.observer(function Feature({ depth, feature, isHovered,
|
|
|
8142
7670
|
const notifyError = (e) => {
|
|
8143
7671
|
session.notify(e.message, 'error');
|
|
8144
7672
|
};
|
|
8145
|
-
return (
|
|
8146
|
-
|
|
8147
|
-
|
|
8148
|
-
|
|
8149
|
-
|
|
8150
|
-
|
|
8151
|
-
|
|
8152
|
-
|
|
8153
|
-
|
|
8154
|
-
|
|
8155
|
-
|
|
8156
|
-
|
|
8157
|
-
|
|
8158
|
-
|
|
8159
|
-
|
|
8160
|
-
|
|
8161
|
-
|
|
8162
|
-
|
|
8163
|
-
|
|
8164
|
-
|
|
8165
|
-
|
|
8166
|
-
|
|
8167
|
-
|
|
8168
|
-
|
|
8169
|
-
|
|
8170
|
-
|
|
8171
|
-
|
|
8172
|
-
|
|
8173
|
-
|
|
8174
|
-
|
|
8175
|
-
|
|
8176
|
-
|
|
8177
|
-
|
|
8178
|
-
|
|
8179
|
-
|
|
8180
|
-
|
|
8181
|
-
|
|
8182
|
-
|
|
8183
|
-
|
|
8184
|
-
|
|
8185
|
-
|
|
8186
|
-
|
|
8187
|
-
|
|
8188
|
-
|
|
8189
|
-
|
|
8190
|
-
|
|
8191
|
-
|
|
8192
|
-
|
|
8193
|
-
|
|
8194
|
-
.filter((entry) => {
|
|
8195
|
-
if (!filterText) {
|
|
8196
|
-
return true;
|
|
8197
|
-
}
|
|
8198
|
-
const [, childFeature] = entry;
|
|
8199
|
-
// search feature and its subfeatures for the text
|
|
8200
|
-
const text = JSON.stringify(childFeature);
|
|
8201
|
-
return text.includes(filterText);
|
|
8202
|
-
})
|
|
8203
|
-
.map(([featureId, childFeature]) => {
|
|
8204
|
-
const childHovered = hoveredFeature?.feature._id === childFeature._id;
|
|
8205
|
-
const childSelected = selectedFeature?._id === childFeature._id;
|
|
8206
|
-
return (React__default["default"].createElement(Feature, { isHovered: childHovered, isSelected: childSelected, selectedFeatureClass: selectedFeatureClass, key: featureId, depth: (depth || 0) + 1, feature: childFeature, model: displayState, setContextMenu: setContextMenu }));
|
|
8207
|
-
})
|
|
8208
|
-
: null));
|
|
7673
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("tr", { onMouseEnter: (_e) => {
|
|
7674
|
+
displayState.setHoveredFeature({ feature, bp: min });
|
|
7675
|
+
}, className: classes.feature +
|
|
7676
|
+
(isSelected
|
|
7677
|
+
? ` ${selectedFeatureClass}`
|
|
7678
|
+
: isHovered
|
|
7679
|
+
? ` ${classes.hoveredFeature}`
|
|
7680
|
+
: ''), onClick: (e) => {
|
|
7681
|
+
e.stopPropagation();
|
|
7682
|
+
displayState.setSelectedFeature(feature);
|
|
7683
|
+
}, onDoubleClick: () => {
|
|
7684
|
+
displayState.setSelectedFeature(feature);
|
|
7685
|
+
navigateHere(displayState, feature);
|
|
7686
|
+
}, onContextMenu: (e) => {
|
|
7687
|
+
e.preventDefault();
|
|
7688
|
+
setContextMenu({
|
|
7689
|
+
position: { left: e.clientX + 2, top: e.clientY - 6 },
|
|
7690
|
+
items: makeContextMenuItems(displayState, feature),
|
|
7691
|
+
});
|
|
7692
|
+
return false;
|
|
7693
|
+
}, children: [jsxRuntime.jsxs("td", { style: {
|
|
7694
|
+
whiteSpace: 'nowrap',
|
|
7695
|
+
borderLeft: `${depth * 2}em solid transparent`,
|
|
7696
|
+
}, children: [children?.size ? (
|
|
7697
|
+
// TODO: a11y
|
|
7698
|
+
// eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
|
|
7699
|
+
jsxRuntime.jsx("div", { onClick: toggleExpanded, className: classes.arrow + (expanded ? ` ${classes.arrowExpanded}` : ''), children: "\u276F" })) : null, jsxRuntime.jsx("div", { className: classes.typeContent, children: jsxRuntime.jsx(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", style: { width: 170 }, value: type, filterTerms: isOntologyClass, fetchValidTerms: fetchValidTypeTerms.bind(null, feature), renderInput: (params) => {
|
|
7700
|
+
return (jsxRuntime.jsxs("div", { ref: params.InputProps.ref, children: [jsxRuntime.jsx("input", { type: "text", ...params.inputProps, className: classes.typeInputElement, style: { width: 170 } }), params.error ? (jsxRuntime.jsx("div", { className: classes.typeErrorMessage, children: params.errorMessage ?? 'unknown error' })) : null] }));
|
|
7701
|
+
}, onChange: (oldValue, newValue) => {
|
|
7702
|
+
if (newValue) {
|
|
7703
|
+
handleFeatureTypeChange(changeManager, feature, oldValue, newValue).catch(notifyError);
|
|
7704
|
+
}
|
|
7705
|
+
} }) })] }), jsxRuntime.jsx("td", { children: jsxRuntime.jsx(NumberCell, { initialValue: min + 1, notifyError: notifyError, onChangeCommitted: (newStart) => handleFeatureStartChange(changeManager, feature, min, newStart - 1) }) }), jsxRuntime.jsx("td", { children: jsxRuntime.jsx(NumberCell, { initialValue: max, notifyError: notifyError, onChangeCommitted: (newEnd) => handleFeatureEndChange(changeManager, feature, max, newEnd) }) }), jsxRuntime.jsx("td", { children: strand === 1 ? '+' : strand === -1 ? '-' : undefined }), jsxRuntime.jsx("td", { children: jsxRuntime.jsx(FeatureAttributes, { filterText: filterText, feature: feature }) })] }), expanded && children
|
|
7706
|
+
? [...children.entries()]
|
|
7707
|
+
.filter((entry) => {
|
|
7708
|
+
if (!filterText) {
|
|
7709
|
+
return true;
|
|
7710
|
+
}
|
|
7711
|
+
const [, childFeature] = entry;
|
|
7712
|
+
// search feature and its subfeatures for the text
|
|
7713
|
+
const text = JSON.stringify(childFeature);
|
|
7714
|
+
return text.includes(filterText);
|
|
7715
|
+
})
|
|
7716
|
+
.map(([featureId, childFeature]) => {
|
|
7717
|
+
const childHovered = hoveredFeature?.feature._id === childFeature._id;
|
|
7718
|
+
const childSelected = selectedFeature?._id === childFeature._id;
|
|
7719
|
+
return (jsxRuntime.jsx(Feature, { isHovered: childHovered, isSelected: childSelected, selectedFeatureClass: selectedFeatureClass, depth: (depth || 0) + 1, feature: childFeature, model: displayState, setContextMenu: setContextMenu }, featureId));
|
|
7720
|
+
})
|
|
7721
|
+
: null] }));
|
|
8209
7722
|
});
|
|
8210
7723
|
async function fetchValidTypeTerms(feature, ontologyStore, _signal) {
|
|
8211
7724
|
const { parent: parentFeature } = feature;
|
|
@@ -8223,7 +7736,7 @@ async function fetchValidTypeTerms(feature, ontologyStore, _signal) {
|
|
|
8223
7736
|
return;
|
|
8224
7737
|
}
|
|
8225
7738
|
|
|
8226
|
-
const useStyles$3 =
|
|
7739
|
+
const useStyles$3 = tssReact.makeStyles()((theme) => ({
|
|
8227
7740
|
scrollableTable: {
|
|
8228
7741
|
width: '100%',
|
|
8229
7742
|
height: '100%',
|
|
@@ -8264,49 +7777,38 @@ const HybridGrid = mobxReact.observer(function HybridGrid({ model, }) {
|
|
|
8264
7777
|
}
|
|
8265
7778
|
}
|
|
8266
7779
|
}, [selectedFeature, seenFeatures, classes.selectedFeature]);
|
|
8267
|
-
return (
|
|
8268
|
-
|
|
8269
|
-
|
|
8270
|
-
|
|
8271
|
-
|
|
8272
|
-
|
|
8273
|
-
|
|
8274
|
-
|
|
8275
|
-
|
|
8276
|
-
|
|
8277
|
-
|
|
8278
|
-
|
|
8279
|
-
|
|
8280
|
-
|
|
8281
|
-
|
|
8282
|
-
|
|
8283
|
-
|
|
8284
|
-
|
|
8285
|
-
|
|
8286
|
-
|
|
8287
|
-
|
|
8288
|
-
|
|
8289
|
-
|
|
8290
|
-
|
|
8291
|
-
|
|
8292
|
-
|
|
8293
|
-
|
|
8294
|
-
React__default["default"].createElement(ui.Menu, { open: Boolean(contextMenu), onMenuItemClick: (_, callback) => {
|
|
8295
|
-
callback();
|
|
8296
|
-
setContextMenu(null);
|
|
8297
|
-
}, onClose: () => {
|
|
8298
|
-
setContextMenu(null);
|
|
8299
|
-
}, slotProps: {
|
|
8300
|
-
transition: {
|
|
8301
|
-
onExit: () => {
|
|
8302
|
-
setContextMenu(null);
|
|
7780
|
+
return (jsxRuntime.jsxs("div", { ref: scrollContainerRef, style: { width: '100%', overflowY: 'auto', height: '100%' }, children: [jsxRuntime.jsxs("table", { className: classes.scrollableTable, children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { children: "Type" }), jsxRuntime.jsx("th", { children: "Start" }), jsxRuntime.jsx("th", { children: "End" }), jsxRuntime.jsx("th", { children: "Strand" }), jsxRuntime.jsx("th", { children: "Attributes" })] }) }), jsxRuntime.jsx("tbody", { children: [...seenFeatures.entries()]
|
|
7781
|
+
.filter((entry) => {
|
|
7782
|
+
if (!filterText) {
|
|
7783
|
+
return true;
|
|
7784
|
+
}
|
|
7785
|
+
const [, feature] = entry;
|
|
7786
|
+
// search feature and its subfeatures for the text
|
|
7787
|
+
const text = JSON.stringify(feature);
|
|
7788
|
+
return text.includes(filterText);
|
|
7789
|
+
})
|
|
7790
|
+
.sort((a, b) => {
|
|
7791
|
+
return a[1].min - b[1].min;
|
|
7792
|
+
})
|
|
7793
|
+
.map(([featureId, feature]) => {
|
|
7794
|
+
const isSelected = selectedFeature?._id === featureId;
|
|
7795
|
+
const isHovered = hoveredFeature?.feature._id === featureId;
|
|
7796
|
+
return (jsxRuntime.jsx(Feature, { isSelected: isSelected, isHovered: isHovered, selectedFeatureClass: classes.selectedFeature, feature: feature, model: model, depth: 0, setContextMenu: setContextMenu }, featureId));
|
|
7797
|
+
}) })] }), jsxRuntime.jsx(ui.Menu, { open: Boolean(contextMenu), onMenuItemClick: (_, callback) => {
|
|
7798
|
+
callback();
|
|
7799
|
+
setContextMenu(null);
|
|
7800
|
+
}, onClose: () => {
|
|
7801
|
+
setContextMenu(null);
|
|
7802
|
+
}, slotProps: {
|
|
7803
|
+
transition: {
|
|
7804
|
+
onExit: () => {
|
|
7805
|
+
setContextMenu(null);
|
|
7806
|
+
},
|
|
8303
7807
|
},
|
|
8304
|
-
},
|
|
8305
|
-
}, style: { zIndex: theme.zIndex.tooltip }, menuItems: contextMenu?.items ?? [], anchorReference: "anchorPosition", anchorPosition: contextMenu?.position })));
|
|
7808
|
+
}, style: { zIndex: theme.zIndex.tooltip }, menuItems: contextMenu?.items ?? [], anchorReference: "anchorPosition", anchorPosition: contextMenu?.position })] }));
|
|
8306
7809
|
});
|
|
8307
7810
|
|
|
8308
|
-
|
|
8309
|
-
const useStyles$2 = mui.makeStyles()({
|
|
7811
|
+
const useStyles$2 = tssReact.makeStyles()({
|
|
8310
7812
|
toolbar: {
|
|
8311
7813
|
width: '100%',
|
|
8312
7814
|
display: 'flex',
|
|
@@ -8321,21 +7823,15 @@ const useStyles$2 = mui.makeStyles()({
|
|
|
8321
7823
|
const ToolBar = mobxReact.observer(function ToolBar({ model: displayState, }) {
|
|
8322
7824
|
const model = displayState.tabularEditor;
|
|
8323
7825
|
const { classes } = useStyles$2();
|
|
8324
|
-
return (
|
|
8325
|
-
|
|
8326
|
-
|
|
8327
|
-
|
|
8328
|
-
|
|
8329
|
-
|
|
8330
|
-
|
|
8331
|
-
|
|
8332
|
-
|
|
8333
|
-
React__default["default"].createElement(material.IconButton, { onClick: () => {
|
|
8334
|
-
model.clearFilterText();
|
|
8335
|
-
} },
|
|
8336
|
-
React__default["default"].createElement(ClearIcon__default["default"], null)))),
|
|
8337
|
-
},
|
|
8338
|
-
} })));
|
|
7826
|
+
return (jsxRuntime.jsxs("div", { className: classes.toolbar, children: [jsxRuntime.jsx(material.Tooltip, { title: "Collapse all", children: jsxRuntime.jsx(material.IconButton, { "aria-label": "collapse", sx: { marginTop: 0 }, onClick: model.collapseAllFeatures, children: jsxRuntime.jsx(UnfoldLessIcon, {}) }) }), jsxRuntime.jsx(material.TextField, { className: classes.filterText, label: "Filter features", value: model.filterText, sx: { marginTop: 0 }, variant: "outlined", onChange: (event) => {
|
|
7827
|
+
model.setFilterText(event.target.value);
|
|
7828
|
+
}, slotProps: {
|
|
7829
|
+
input: {
|
|
7830
|
+
endAdornment: (jsxRuntime.jsx(material.InputAdornment, { position: "end", children: jsxRuntime.jsx(material.IconButton, { onClick: () => {
|
|
7831
|
+
model.clearFilterText();
|
|
7832
|
+
}, children: jsxRuntime.jsx(ClearIcon, {}) }) })),
|
|
7833
|
+
},
|
|
7834
|
+
} })] }));
|
|
8339
7835
|
});
|
|
8340
7836
|
|
|
8341
7837
|
function stopPropagation(e) {
|
|
@@ -8349,9 +7845,7 @@ const TabularEditorPane = mobxReact.observer(function TabularEditorPane({ model:
|
|
|
8349
7845
|
return (
|
|
8350
7846
|
// TODO: a11y
|
|
8351
7847
|
// eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
|
|
8352
|
-
|
|
8353
|
-
React__default["default"].createElement(ToolBar, { model: displayState }),
|
|
8354
|
-
React__default["default"].createElement(HybridGrid, { model: displayState })));
|
|
7848
|
+
jsxRuntime.jsxs("div", { onMouseDown: stopPropagation, onClick: stopPropagation, style: { width: '100%', height: '100%', position: 'relative' }, children: [jsxRuntime.jsx(ToolBar, { model: displayState }), jsxRuntime.jsx(HybridGrid, { model: displayState })] }));
|
|
8355
7849
|
});
|
|
8356
7850
|
|
|
8357
7851
|
const TabularEditorStateModelType = mobxStateTree.types
|
|
@@ -8705,10 +8199,7 @@ function drawBackground(ctx, feature, stateModel, displayedRegionIndex, row, col
|
|
|
8705
8199
|
const topLevelFeatureTop = row * apolloRowHeight;
|
|
8706
8200
|
const topLevelFeatureHeight = getRowCount$1(feature, featureTypeOntology) * apolloRowHeight;
|
|
8707
8201
|
let selectedColor;
|
|
8708
|
-
|
|
8709
|
-
selectedColor = color;
|
|
8710
|
-
}
|
|
8711
|
-
else {
|
|
8202
|
+
{
|
|
8712
8203
|
selectedColor = configuration.readConfObject(session.getPluginConfiguration(), 'geneBackgroundColor', { featureType: feature.type });
|
|
8713
8204
|
if (!selectedColor) {
|
|
8714
8205
|
selectedColor = material.alpha(theme.palette.background.paper, 0.6);
|
|
@@ -9299,6 +8790,26 @@ function getContextMenuItems$2(display, mousePosition) {
|
|
|
9299
8790
|
},
|
|
9300
8791
|
]);
|
|
9301
8792
|
},
|
|
8793
|
+
}, {
|
|
8794
|
+
label: 'Duplicate feature',
|
|
8795
|
+
onClick: () => {
|
|
8796
|
+
session.queueDialog((doneCallback) => [
|
|
8797
|
+
DuplicateTranscript,
|
|
8798
|
+
{
|
|
8799
|
+
session,
|
|
8800
|
+
handleClose: () => {
|
|
8801
|
+
doneCallback();
|
|
8802
|
+
},
|
|
8803
|
+
changeManager,
|
|
8804
|
+
sourceFeature: feature,
|
|
8805
|
+
sourceAssemblyId: currentAssemblyId,
|
|
8806
|
+
selectedFeature,
|
|
8807
|
+
setSelectedFeature: (feature) => {
|
|
8808
|
+
display.setSelectedFeature(feature);
|
|
8809
|
+
},
|
|
8810
|
+
},
|
|
8811
|
+
]);
|
|
8812
|
+
},
|
|
9302
8813
|
});
|
|
9303
8814
|
if (util.isSessionModelWithWidgets(session)) {
|
|
9304
8815
|
contextMenuItemsForFeature.splice(1, 0, {
|
|
@@ -9505,48 +9016,30 @@ const FilterFeatures = mobxReact.observer(function FilterFeatures({ featureTypes
|
|
|
9505
9016
|
onUpdate(newTypes);
|
|
9506
9017
|
setSelectedFeatureTypes(newTypes);
|
|
9507
9018
|
};
|
|
9508
|
-
return (
|
|
9509
|
-
|
|
9510
|
-
|
|
9511
|
-
|
|
9512
|
-
|
|
9513
|
-
|
|
9514
|
-
|
|
9515
|
-
handleChange(newValue);
|
|
9516
|
-
}
|
|
9517
|
-
} })),
|
|
9518
|
-
React__default["default"].createElement(material.Grid, { size: 4 },
|
|
9519
|
-
React__default["default"].createElement(material.Button, { variant: "contained", onClick: handleAddFeatureType, disabled: !type, style: { marginTop: 9 }, size: "medium" }, "Add"))),
|
|
9520
|
-
selectedFeatureTypes.length > 0 && (React__default["default"].createElement("div", null,
|
|
9521
|
-
React__default["default"].createElement("hr", null),
|
|
9522
|
-
React__default["default"].createElement("div", { style: { width: 300 } },
|
|
9523
|
-
React__default["default"].createElement(material.DialogContentText, null, "Selected feature types:"),
|
|
9524
|
-
React__default["default"].createElement(material.Box, { sx: { display: 'flex', flexWrap: 'wrap', gap: 0.5 } }, selectedFeatureTypes.map((value) => (React__default["default"].createElement(material.Chip, { key: value, label: value, onDelete: () => {
|
|
9525
|
-
handleFeatureTypeDelete(value);
|
|
9526
|
-
} }))))))))));
|
|
9019
|
+
return (jsxRuntime.jsx(Dialog, { open: true, maxWidth: false, "data-testid": "filter-features-dialog", title: "Filter features by type", handleClose: handleClose, children: jsxRuntime.jsxs(material.DialogContent, { children: [jsxRuntime.jsx(material.DialogContentText, { children: "Select the feature types you want to display in the apollo track" }), jsxRuntime.jsxs(material.Grid, { container: true, spacing: 2, children: [jsxRuntime.jsx(material.Grid, { size: 8, children: jsxRuntime.jsx(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", style: { width: '100%' }, value: type, filterTerms: isOntologyClass, renderInput: (params) => (jsxRuntime.jsx(material.TextField, { ...params, label: "Feature type", variant: "outlined", fullWidth: true })), onChange: (oldValue, newValue) => {
|
|
9020
|
+
if (newValue) {
|
|
9021
|
+
handleChange(newValue);
|
|
9022
|
+
}
|
|
9023
|
+
} }) }), jsxRuntime.jsx(material.Grid, { size: 4, children: jsxRuntime.jsx(material.Button, { variant: "contained", onClick: handleAddFeatureType, disabled: !type, style: { marginTop: 9 }, size: "medium", children: "Add" }) })] }), selectedFeatureTypes.length > 0 && (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("hr", {}), jsxRuntime.jsxs("div", { style: { width: 300 }, children: [jsxRuntime.jsx(material.DialogContentText, { children: "Selected feature types:" }), jsxRuntime.jsx(material.Box, { sx: { display: 'flex', flexWrap: 'wrap', gap: 0.5 }, children: selectedFeatureTypes.map((value) => (jsxRuntime.jsx(material.Chip, { label: value, onDelete: () => {
|
|
9024
|
+
handleFeatureTypeDelete(value);
|
|
9025
|
+
} }, value))) })] })] }))] }) }));
|
|
9527
9026
|
});
|
|
9528
9027
|
|
|
9529
9028
|
const EditZoomThresholdDialog = mobxReact.observer(function ({ model, handleClose, }) {
|
|
9530
9029
|
const [zoomThreshold, setZoomThreshold] = React.useState(`${model.zoomThresholdSetting}`);
|
|
9531
|
-
return (
|
|
9532
|
-
|
|
9533
|
-
|
|
9534
|
-
|
|
9535
|
-
|
|
9536
|
-
|
|
9537
|
-
|
|
9538
|
-
|
|
9539
|
-
|
|
9540
|
-
|
|
9541
|
-
});
|
|
9542
|
-
handleClose();
|
|
9543
|
-
} }, "Submit"),
|
|
9544
|
-
React__default["default"].createElement(material.Button, { variant: "contained", color: "secondary", onClick: () => {
|
|
9545
|
-
handleClose();
|
|
9546
|
-
} }, "Cancel")))));
|
|
9030
|
+
return (jsxRuntime.jsx(ui.Dialog, { open: true, onClose: handleClose, title: "Edit zoom threshold setting", children: jsxRuntime.jsxs(material.DialogContent, { children: [jsxRuntime.jsx(material.Typography, { children: "The zoom level in base pairs (bp) per pixel at which features are rendered in this Annotations track. Increasing the value will allow features to render when zooming out, but might impact performance." }), jsxRuntime.jsx(material.TextField, { label: "Threshold value (bpPerPx)", value: zoomThreshold, onChange: (event) => {
|
|
9031
|
+
setZoomThreshold(event.target.value);
|
|
9032
|
+
} }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", onClick: () => {
|
|
9033
|
+
model.setZoomThresholdSetting({
|
|
9034
|
+
zoomThreshold: +zoomThreshold,
|
|
9035
|
+
});
|
|
9036
|
+
handleClose();
|
|
9037
|
+
}, children: "Submit" }), jsxRuntime.jsx(material.Button, { variant: "contained", color: "secondary", onClick: () => {
|
|
9038
|
+
handleClose();
|
|
9039
|
+
}, children: "Cancel" })] })] }) }));
|
|
9547
9040
|
});
|
|
9548
9041
|
|
|
9549
|
-
const useStyles$1 =
|
|
9042
|
+
const useStyles$1 = tssReact.makeStyles()((theme) => ({
|
|
9550
9043
|
canvasContainer: {
|
|
9551
9044
|
position: 'relative',
|
|
9552
9045
|
left: 0,
|
|
@@ -9600,7 +9093,7 @@ function clusterResultByMessage(items, width, touchesAsOverlap) {
|
|
|
9600
9093
|
(byMsg.get(it.message) ?? byMsg.set(it.message, []).get(it.message)).push(it);
|
|
9601
9094
|
}
|
|
9602
9095
|
const clusters = [];
|
|
9603
|
-
const overlaps = (aEnd, bStart) =>
|
|
9096
|
+
const overlaps = (aEnd, bStart) => bStart <= aEnd ;
|
|
9604
9097
|
for (const [message, arr] of byMsg.entries()) {
|
|
9605
9098
|
if (arr.length === 0) {
|
|
9606
9099
|
continue;
|
|
@@ -10974,7 +10467,6 @@ function stateModelFactory$1(pluginManager, configSchema) {
|
|
|
10974
10467
|
return renderingModelFactory$1(pluginManager, configSchema).named('LinearApolloReferenceSequenceDisplay');
|
|
10975
10468
|
}
|
|
10976
10469
|
|
|
10977
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
10978
10470
|
const LinearApolloReferenceSequenceDisplay = mobxReact.observer(function LinearApolloReferenceSequenceDisplay(props) {
|
|
10979
10471
|
const theme = material.useTheme();
|
|
10980
10472
|
const { model } = props;
|
|
@@ -10985,24 +10477,21 @@ const LinearApolloReferenceSequenceDisplay = mobxReact.observer(function LinearA
|
|
|
10985
10477
|
}, [theme, setTheme]);
|
|
10986
10478
|
const lgv = util.getContainingView(model);
|
|
10987
10479
|
const message = regionCannotBeRendered();
|
|
10480
|
+
// This type is wrong in @jbrowse/core
|
|
10988
10481
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
10989
10482
|
if (message) {
|
|
10990
|
-
return (
|
|
10991
|
-
|
|
10992
|
-
|
|
10993
|
-
|
|
10994
|
-
|
|
10995
|
-
|
|
10996
|
-
|
|
10997
|
-
|
|
10998
|
-
|
|
10999
|
-
|
|
11000
|
-
|
|
11001
|
-
|
|
11002
|
-
React__default["default"].createElement("canvas", { ref: async (node) => {
|
|
11003
|
-
await Promise.resolve();
|
|
11004
|
-
setSeqTrackOverlayCanvas(node);
|
|
11005
|
-
}, width: lgv.dynamicBlocks.totalWidthPx, height: height, className: classes.canvas, "data-testid": "seqTrackOverlayCanvas" }))) : null));
|
|
10483
|
+
return (jsxRuntime.jsx(material.Alert, { severity: "warning", classes: { message: classes.ellipses }, slotProps: { root: { className: classes.center } }, children: jsxRuntime.jsx(material.Tooltip, { title: message, children: jsxRuntime.jsx("div", { children: message }) }) }));
|
|
10484
|
+
}
|
|
10485
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: 3 / lgv.bpPerPx >= 1 ? (jsxRuntime.jsxs("div", { className: classes.canvasContainer, style: {
|
|
10486
|
+
width: lgv.dynamicBlocks.totalWidthPx,
|
|
10487
|
+
height,
|
|
10488
|
+
}, children: [jsxRuntime.jsx("canvas", { ref: async (node) => {
|
|
10489
|
+
await Promise.resolve();
|
|
10490
|
+
setSeqTrackCanvas(node);
|
|
10491
|
+
}, width: lgv.dynamicBlocks.totalWidthPx, height: height, className: classes.canvas, "data-testid": "seqTrackCanvas" }), jsxRuntime.jsx("canvas", { ref: async (node) => {
|
|
10492
|
+
await Promise.resolve();
|
|
10493
|
+
setSeqTrackOverlayCanvas(node);
|
|
10494
|
+
}, width: lgv.dynamicBlocks.totalWidthPx, height: height, className: classes.canvas, "data-testid": "seqTrackOverlayCanvas" })] })) : null }));
|
|
11006
10495
|
});
|
|
11007
10496
|
|
|
11008
10497
|
const configSchema = configuration.ConfigurationSchema('LinearApolloSixFrameDisplay', {}, { explicitIdentifier: 'displayId', explicitlyTyped: true });
|
|
@@ -11027,16 +10516,11 @@ const FilterTranscripts = mobxReact.observer(function FilterTranscripts({ source
|
|
|
11027
10516
|
onUpdate(newForms);
|
|
11028
10517
|
setExcludedTranscripts(newForms);
|
|
11029
10518
|
};
|
|
11030
|
-
return (
|
|
11031
|
-
|
|
11032
|
-
|
|
11033
|
-
|
|
11034
|
-
|
|
11035
|
-
React__default["default"].createElement(material.FormGroup, null, allTranscripts.map((item) => (
|
|
11036
|
-
// eslint-disable-next-line react/jsx-key
|
|
11037
|
-
React__default["default"].createElement(material.FormControlLabel, { control: React__default["default"].createElement(material.Checkbox, { checked: !excludedTranscripts.includes(item), onChange: () => {
|
|
11038
|
-
handleChange(item);
|
|
11039
|
-
}, slotProps: { input: { 'aria-label': 'controlled' } } }), label: item })))))))));
|
|
10519
|
+
return (jsxRuntime.jsx(Dialog, { open: true, maxWidth: false, "data-testid": "filter-transcripts-dialog", title: "Filter transcripts by ID", handleClose: handleClose, children: jsxRuntime.jsxs(material.DialogContent, { children: [jsxRuntime.jsx(material.DialogContentText, { children: "Select the alternate transcripts you want to display in the apollo track" }), jsxRuntime.jsx(material.Grid, { container: true, spacing: 2, children: jsxRuntime.jsx(material.Grid, { size: 8, children: jsxRuntime.jsx(material.FormGroup, { children: allTranscripts.map((item) => (
|
|
10520
|
+
// eslint-disable-next-line react/jsx-key
|
|
10521
|
+
jsxRuntime.jsx(material.FormControlLabel, { control: jsxRuntime.jsx(material.Checkbox, { checked: !excludedTranscripts.includes(item), onChange: () => {
|
|
10522
|
+
handleChange(item);
|
|
10523
|
+
}, slotProps: { input: { 'aria-label': 'controlled' } } }), label: item }))) }) }) })] }) }));
|
|
11040
10524
|
});
|
|
11041
10525
|
|
|
11042
10526
|
let forwardFillLight = null;
|
|
@@ -11091,7 +10575,7 @@ if (canvas?.getContext) {
|
|
|
11091
10575
|
}
|
|
11092
10576
|
function deepSetHas(set, item) {
|
|
11093
10577
|
for (const elem of set) {
|
|
11094
|
-
if (
|
|
10578
|
+
if (equal(elem, item)) {
|
|
11095
10579
|
return true;
|
|
11096
10580
|
}
|
|
11097
10581
|
}
|
|
@@ -11263,8 +10747,14 @@ function draw(ctx, topLevelFeature, _row, stateModel, displayedRegionIndex) {
|
|
|
11263
10747
|
cdsStartPx = reversed ? minX - cdsWidthPx : minX;
|
|
11264
10748
|
ctx.fillStyle = theme.palette.text.primary;
|
|
11265
10749
|
const frame = util.getFrame(cds.min, cds.max, child.strand ?? 1, cds.phase);
|
|
11266
|
-
const
|
|
11267
|
-
|
|
10750
|
+
const frameOffsets = showFeatureLabels
|
|
10751
|
+
? [0, 4, 2, 0, 14, 12, 10]
|
|
10752
|
+
: [0, 2, 1, 0, 7, 6, 5];
|
|
10753
|
+
const row = frameOffsets.at(frame);
|
|
10754
|
+
if (row === undefined) {
|
|
10755
|
+
continue;
|
|
10756
|
+
}
|
|
10757
|
+
cdsTop = row * rowHeight;
|
|
11268
10758
|
ctx.fillRect(cdsStartPx, cdsTop, cdsWidthPx, cdsHeight);
|
|
11269
10759
|
// Draw lines to connect CDS features with shared mRNA parent
|
|
11270
10760
|
if (counter > 1) {
|
|
@@ -11397,8 +10887,14 @@ function drawHover(stateModel, ctx) {
|
|
|
11397
10887
|
})?.offsetPx ?? 0) - offsetPx;
|
|
11398
10888
|
const cdsStartPx = reversed ? minX - cdsWidthPx : minX;
|
|
11399
10889
|
const frame = util.getFrame(cds.min, cds.max, strand ?? 1, cds.phase);
|
|
11400
|
-
const
|
|
11401
|
-
|
|
10890
|
+
const frameOffsets = showFeatureLabels
|
|
10891
|
+
? [0, 4, 2, 0, 14, 12, 10]
|
|
10892
|
+
: [0, 2, 1, 0, 7, 6, 5];
|
|
10893
|
+
const row = frameOffsets.at(frame);
|
|
10894
|
+
if (row === undefined) {
|
|
10895
|
+
continue;
|
|
10896
|
+
}
|
|
10897
|
+
const cdsTop = row * rowHeight;
|
|
11402
10898
|
if (counter > 1) {
|
|
11403
10899
|
// Mid-point for intron line "hat"
|
|
11404
10900
|
const midPoint = [
|
|
@@ -11578,8 +11074,6 @@ function drawTooltip(display, context) {
|
|
|
11578
11074
|
const displayedRegion = displayedRegions[layoutIndex];
|
|
11579
11075
|
const { refName, reversed } = displayedRegion;
|
|
11580
11076
|
const rowHeight = apolloRowHeight;
|
|
11581
|
-
const cdsHeight = Math.round(0.7 * rowHeight);
|
|
11582
|
-
const featureLabelSpacer = showFeatureLabels ? 2 : 1;
|
|
11583
11077
|
let location = 'Loc: ';
|
|
11584
11078
|
let cds = undefined;
|
|
11585
11079
|
for (const loc of feature.cdsLocations) {
|
|
@@ -11601,8 +11095,14 @@ function drawTooltip(display, context) {
|
|
|
11601
11095
|
regionNumber: layoutIndex,
|
|
11602
11096
|
})?.offsetPx ?? 0) - offsetPx;
|
|
11603
11097
|
const frame = util.getFrame(min, max, strand ?? 1, phase);
|
|
11604
|
-
const
|
|
11605
|
-
|
|
11098
|
+
const frameOffsets = showFeatureLabels
|
|
11099
|
+
? [0, 4, 2, 0, 14, 12, 10]
|
|
11100
|
+
: [0, 2, 1, 0, 7, 6, 5];
|
|
11101
|
+
const row = frameOffsets.at(frame);
|
|
11102
|
+
if (row === undefined) {
|
|
11103
|
+
return;
|
|
11104
|
+
}
|
|
11105
|
+
const cdsTop = row * rowHeight;
|
|
11606
11106
|
const cdsWidthPx = (max - min) / bpPerPx;
|
|
11607
11107
|
const featureType = `Type: ${cds.type}`;
|
|
11608
11108
|
const featureName = attributes.get('gff_name')?.find((name) => name !== '');
|
|
@@ -12190,8 +11690,14 @@ function layoutsModelFactory(pluginManager, configSchema) {
|
|
|
12190
11690
|
}
|
|
12191
11691
|
for (const cdsRow of cdsLocations) {
|
|
12192
11692
|
for (const cds of cdsRow) {
|
|
12193
|
-
|
|
12194
|
-
|
|
11693
|
+
const frame = util.getFrame(cds.min, cds.max, strand ?? 1, cds.phase);
|
|
11694
|
+
const frameOffsets = self.showFeatureLabels
|
|
11695
|
+
? [0, 5, 3, 1, 15, 13, 11]
|
|
11696
|
+
: [0, 2, 1, 0, 8, 7, 6];
|
|
11697
|
+
const rowNum = frameOffsets.at(frame);
|
|
11698
|
+
if (!rowNum) {
|
|
11699
|
+
continue;
|
|
11700
|
+
}
|
|
12195
11701
|
if (!featureLayout.get(rowNum)) {
|
|
12196
11702
|
featureLayout.set(rowNum, []);
|
|
12197
11703
|
}
|
|
@@ -12462,8 +11968,11 @@ function mouseEventsModelIntermediateFactory(pluginManager, configSchema) {
|
|
|
12462
11968
|
}
|
|
12463
11969
|
for (const loc of feature.cdsLocations) {
|
|
12464
11970
|
for (const cds of loc) {
|
|
12465
|
-
|
|
12466
|
-
|
|
11971
|
+
const frame = util.getFrame(cds.min, cds.max, feature.strand ?? 1, cds.phase);
|
|
11972
|
+
const frameOffsets = self.showFeatureLabels
|
|
11973
|
+
? [0, 5, 3, 1, 15, 13, 11]
|
|
11974
|
+
: [0, 2, 1, 0, 8, 7, 6];
|
|
11975
|
+
const rowNum = frameOffsets.at(frame);
|
|
12467
11976
|
if (row === rowNum && bp >= cds.min && bp <= cds.max) {
|
|
12468
11977
|
return (featureID === undefined ||
|
|
12469
11978
|
!self.filteredTranscripts.includes(featureID));
|
|
@@ -12691,7 +12200,6 @@ const ApolloPluginConfigurationSchema = configuration.ConfigurationSchema('Apoll
|
|
|
12691
12200
|
},
|
|
12692
12201
|
});
|
|
12693
12202
|
|
|
12694
|
-
/* eslint-disable react-hooks/exhaustive-deps */
|
|
12695
12203
|
const isGeneOrTranscript = (annotationFeature, apolloSessionModel) => {
|
|
12696
12204
|
const { featureTypeOntology } = apolloSessionModel.apolloDataStore.ontologyManager;
|
|
12697
12205
|
if (!featureTypeOntology) {
|
|
@@ -12948,7 +12456,7 @@ function CreateApolloAnnotation({ annotationFeature, assembly, handleClose, refS
|
|
|
12948
12456
|
}
|
|
12949
12457
|
};
|
|
12950
12458
|
const createNewGeneFeatureWithTranscripts = async (childrens) => {
|
|
12951
|
-
const newGeneId = new
|
|
12459
|
+
const newGeneId = new ObjectID().toHexString();
|
|
12952
12460
|
const min = Math.min(...Object.values(childrens).map((child) => child.min));
|
|
12953
12461
|
const max = Math.max(...Object.values(childrens).map((child) => child.max));
|
|
12954
12462
|
const change = new shared.AddFeatureChange({
|
|
@@ -13011,40 +12519,22 @@ function CreateApolloAnnotation({ annotationFeature, assembly, handleClose, refS
|
|
|
13011
12519
|
const handleCreateNewGeneChange = (e) => {
|
|
13012
12520
|
setCreateNewGene(e.target.checked);
|
|
13013
12521
|
};
|
|
13014
|
-
return (
|
|
13015
|
-
|
|
13016
|
-
|
|
13017
|
-
|
|
13018
|
-
|
|
13019
|
-
|
|
13020
|
-
|
|
13021
|
-
|
|
13022
|
-
|
|
13023
|
-
|
|
13024
|
-
|
|
13025
|
-
|
|
13026
|
-
|
|
13027
|
-
|
|
13028
|
-
|
|
13029
|
-
|
|
13030
|
-
padding: 10,
|
|
13031
|
-
borderRadius: 5,
|
|
13032
|
-
} },
|
|
13033
|
-
React__default["default"].createElement(material.Box, { sx: { ml: 3 } },
|
|
13034
|
-
React__default["default"].createElement(material.Typography, { variant: "caption", fontSize: 12 }, "Select the destination feature to copy the selected features"),
|
|
13035
|
-
React__default["default"].createElement(material.Box, { sx: { mt: 1 } },
|
|
13036
|
-
React__default["default"].createElement(material.Select, { labelId: "label", style: { width: '100%' }, value: selectedDestinationFeature?._id ?? '', onChange: handleDestinationFeatureChange, disabled: createNewGene }, destinationFeatures.map((f) => (React__default["default"].createElement(material.MenuItem, { key: f._id, value: f._id }, `${getFeatureNameOrId(f)} (${f.min + 1}..${f.max})`)))))),
|
|
13037
|
-
React__default["default"].createElement(material.Box, { sx: { ml: 3 } },
|
|
13038
|
-
React__default["default"].createElement(material.FormGroup, null,
|
|
13039
|
-
React__default["default"].createElement(material.FormControlLabel, { control: React__default["default"].createElement(material.Checkbox, { checked: createNewGene, onChange: handleCreateNewGeneChange }), label: "Create new gene" })))))),
|
|
13040
|
-
React__default["default"].createElement(material.DialogActions, null,
|
|
13041
|
-
React__default["default"].createElement(material.Button, { variant: "contained", type: "submit", disabled: checkedChildrens.length === 0 ||
|
|
13042
|
-
(!parentFeatureChecked &&
|
|
13043
|
-
checkedChildrens.length > 0 &&
|
|
13044
|
-
!selectedDestinationFeature), onClick: handleCreateApolloAnnotation }, "Create"),
|
|
13045
|
-
React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel")),
|
|
13046
|
-
errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
|
|
13047
|
-
React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
|
|
12522
|
+
return (jsxRuntime.jsxs(Dialog, { open: true, title: "Create Apollo Annotation", handleClose: handleClose, fullWidth: true, maxWidth: "sm", children: [jsxRuntime.jsx(material.DialogTitle, { fontSize: 15, children: "Select the feature to be copied to apollo track" }), jsxRuntime.jsxs(material.DialogContent, { children: [jsxRuntime.jsxs(material.Box, { sx: { ml: 3 }, children: [isGeneOrTranscript(annotationFeature, apolloSessionModel) && (jsxRuntime.jsx(material.FormControlLabel, { control: jsxRuntime.jsx(material.Checkbox, { size: "small", checked: parentFeatureChecked, onChange: handleParentFeatureCheck }), label: `${getFeatureNameOrId(annotationFeature)} (${annotationFeature.min + 1}..${annotationFeature.max})` })), annotationFeature.children && (jsxRuntime.jsx(material.Box, { sx: { display: 'flex', flexDirection: 'column', ml: 3 }, children: Object.values(annotationFeature.children)
|
|
12523
|
+
.filter((child) => isTranscript(child, apolloSessionModel))
|
|
12524
|
+
.map((child) => (jsxRuntime.jsx(material.FormControlLabel, { control: jsxRuntime.jsx(material.Checkbox, { size: "small", checked: checkedChildrens.includes(child._id), onChange: (e) => {
|
|
12525
|
+
handleChildFeatureCheck(e, child);
|
|
12526
|
+
} }), label: `${getFeatureNameOrId(child)} (${child.min + 1}..${child.max})` }, child._id))) }))] }), destinationFeatures.length > 0 &&
|
|
12527
|
+
((!parentFeatureChecked && checkedChildrens.length > 0) ||
|
|
12528
|
+
(parentFeatureChecked &&
|
|
12529
|
+
isTranscript(annotationFeature, apolloSessionModel))) && (jsxRuntime.jsxs("div", { style: {
|
|
12530
|
+
border: '1px solid #ccc',
|
|
12531
|
+
marginTop: 20,
|
|
12532
|
+
padding: 10,
|
|
12533
|
+
borderRadius: 5,
|
|
12534
|
+
}, children: [jsxRuntime.jsxs(material.Box, { sx: { ml: 3 }, children: [jsxRuntime.jsx(material.Typography, { variant: "caption", fontSize: 12, children: "Select the destination feature to copy the selected features" }), jsxRuntime.jsx(material.Box, { sx: { mt: 1 }, children: jsxRuntime.jsx(material.Select, { labelId: "label", style: { width: '100%' }, value: selectedDestinationFeature?._id ?? '', onChange: handleDestinationFeatureChange, disabled: createNewGene, children: destinationFeatures.map((f) => (jsxRuntime.jsx(material.MenuItem, { value: f._id, children: `${getFeatureNameOrId(f)} (${f.min + 1}..${f.max})` }, f._id))) }) })] }), jsxRuntime.jsx(material.Box, { sx: { ml: 3 }, children: jsxRuntime.jsx(material.FormGroup, { children: jsxRuntime.jsx(material.FormControlLabel, { control: jsxRuntime.jsx(material.Checkbox, { checked: createNewGene, onChange: handleCreateNewGeneChange }), label: "Create new gene" }) }) })] }))] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", disabled: checkedChildrens.length === 0 ||
|
|
12535
|
+
(!parentFeatureChecked &&
|
|
12536
|
+
checkedChildrens.length > 0 &&
|
|
12537
|
+
!selectedDestinationFeature), onClick: handleCreateApolloAnnotation, children: "Create" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
|
|
13048
12538
|
}
|
|
13049
12539
|
|
|
13050
12540
|
function parseCigar(cigar) {
|
|
@@ -13161,7 +12651,7 @@ function annotationFromPileup(pluggableElement) {
|
|
|
13161
12651
|
});
|
|
13162
12652
|
}
|
|
13163
12653
|
const newFeature = {
|
|
13164
|
-
_id:
|
|
12654
|
+
_id: ObjectID().toHexString(),
|
|
13165
12655
|
refSeq: refSeqId,
|
|
13166
12656
|
min: start,
|
|
13167
12657
|
max: end,
|
|
@@ -13178,7 +12668,7 @@ function annotationFromPileup(pluggableElement) {
|
|
|
13178
12668
|
newFeature.children = children;
|
|
13179
12669
|
for (const exon of exons) {
|
|
13180
12670
|
const newExon = {
|
|
13181
|
-
_id:
|
|
12671
|
+
_id: ObjectID().toHexString(),
|
|
13182
12672
|
refSeq: refSeqId,
|
|
13183
12673
|
min: exon.start,
|
|
13184
12674
|
max: exon.end,
|
|
@@ -13205,7 +12695,7 @@ function annotationFromPileup(pluggableElement) {
|
|
|
13205
12695
|
...superContextMenuItems(),
|
|
13206
12696
|
{
|
|
13207
12697
|
label: 'Create Apollo annotation',
|
|
13208
|
-
icon:
|
|
12698
|
+
icon: AddIcon,
|
|
13209
12699
|
onClick: () => {
|
|
13210
12700
|
session.queueDialog((doneCallback) => [
|
|
13211
12701
|
CreateApolloAnnotation,
|
|
@@ -13231,22 +12721,25 @@ function annotationFromPileup(pluggableElement) {
|
|
|
13231
12721
|
}
|
|
13232
12722
|
|
|
13233
12723
|
function simpleFeatureToGFF3Feature(feature, refSeqId) {
|
|
13234
|
-
|
|
13235
|
-
const xfeature = JSON.parse(JSON.stringify(feature));
|
|
13236
|
-
const children = xfeature.subfeatures;
|
|
12724
|
+
const children = feature.get('subfeatures');
|
|
13237
12725
|
const gff3Feature = [
|
|
13238
12726
|
{
|
|
13239
|
-
start:
|
|
13240
|
-
end:
|
|
12727
|
+
start: feature.get('start') + 1,
|
|
12728
|
+
end: feature.get('end'),
|
|
13241
12729
|
seq_id: refSeqId,
|
|
13242
|
-
source:
|
|
13243
|
-
type:
|
|
13244
|
-
score:
|
|
13245
|
-
strand:
|
|
13246
|
-
|
|
13247
|
-
|
|
12730
|
+
source: feature.get('source') ?? null,
|
|
12731
|
+
type: feature.get('type') ?? null,
|
|
12732
|
+
score: feature.get('score') ?? null,
|
|
12733
|
+
strand: feature.get('strand')
|
|
12734
|
+
? // eslint-disable-next-line unicorn/no-nested-ternary
|
|
12735
|
+
feature.get('strand') === 1
|
|
12736
|
+
? '+'
|
|
12737
|
+
: '-'
|
|
13248
12738
|
: null,
|
|
13249
|
-
|
|
12739
|
+
phase: feature.get('phase') !== null || feature.get('phase') !== undefined
|
|
12740
|
+
? feature.get('phase')
|
|
12741
|
+
: null,
|
|
12742
|
+
attributes: convertFeatureAttributes(feature),
|
|
13250
12743
|
derived_features: [],
|
|
13251
12744
|
child_features: children
|
|
13252
12745
|
? children.map((x) => simpleFeatureToGFF3Feature(x, refSeqId))
|
|
@@ -13272,7 +12765,7 @@ function convertFeatureAttributes(feature) {
|
|
|
13272
12765
|
'source',
|
|
13273
12766
|
'score',
|
|
13274
12767
|
]);
|
|
13275
|
-
for (const [key, value] of Object.entries(feature)) {
|
|
12768
|
+
for (const [key, value] of Object.entries(feature.toJSON())) {
|
|
13276
12769
|
if (defaultFields.has(key)) {
|
|
13277
12770
|
continue;
|
|
13278
12771
|
}
|
|
@@ -13321,10 +12814,9 @@ function annotationFromJBrowseFeature(pluggableElement) {
|
|
|
13321
12814
|
}
|
|
13322
12815
|
return refSeqId;
|
|
13323
12816
|
},
|
|
13324
|
-
getAnnotationFeature(assembly) {
|
|
12817
|
+
getAnnotationFeature(assembly, feature) {
|
|
13325
12818
|
const refSeqId = self.getRefSeqId(assembly);
|
|
13326
|
-
|
|
13327
|
-
return jbrowseFeatureToAnnotationFeature(sfeature, refSeqId);
|
|
12819
|
+
return jbrowseFeatureToAnnotationFeature(feature, refSeqId);
|
|
13328
12820
|
},
|
|
13329
12821
|
}))
|
|
13330
12822
|
.views((self) => {
|
|
@@ -13342,7 +12834,7 @@ function annotationFromJBrowseFeature(pluggableElement) {
|
|
|
13342
12834
|
...superContextMenuItems(),
|
|
13343
12835
|
{
|
|
13344
12836
|
label: 'Create Apollo annotation',
|
|
13345
|
-
icon:
|
|
12837
|
+
icon: AddIcon,
|
|
13346
12838
|
onClick: () => {
|
|
13347
12839
|
session.queueDialog((doneCallback) => [
|
|
13348
12840
|
CreateApolloAnnotation,
|
|
@@ -13351,7 +12843,7 @@ function annotationFromJBrowseFeature(pluggableElement) {
|
|
|
13351
12843
|
handleClose: () => {
|
|
13352
12844
|
doneCallback();
|
|
13353
12845
|
},
|
|
13354
|
-
annotationFeature: self.getAnnotationFeature(assembly),
|
|
12846
|
+
annotationFeature: self.getAnnotationFeature(assembly, feature),
|
|
13355
12847
|
assembly,
|
|
13356
12848
|
refSeqId: self.getRefSeqId(assembly),
|
|
13357
12849
|
region,
|
|
@@ -13385,7 +12877,7 @@ const CheckResultWarnings = mobxReact.observer(function CheckResultWarnings({ di
|
|
|
13385
12877
|
].filter((checkResult) => assembly.isValidRefName(checkResult.refSeq) &&
|
|
13386
12878
|
assembly.getCanonicalRefName(checkResult.refSeq) === block.refName &&
|
|
13387
12879
|
util.doesIntersect2(block.start, block.end, checkResult.start, checkResult.end));
|
|
13388
|
-
const checkResults = clusterResultByMessage(filteredCheckResults, widthBp
|
|
12880
|
+
const checkResults = clusterResultByMessage(filteredCheckResults, widthBp);
|
|
13389
12881
|
return checkResults.map((checkResult) => {
|
|
13390
12882
|
const left = Math.round(getLeftPx(display, checkResult.range, block));
|
|
13391
12883
|
const [feature] = checkResult.featureIds;
|
|
@@ -13399,22 +12891,17 @@ const CheckResultWarnings = mobxReact.observer(function CheckResultWarnings({ di
|
|
|
13399
12891
|
}
|
|
13400
12892
|
const top = row * apolloRowHeight;
|
|
13401
12893
|
const height = apolloRowHeight;
|
|
13402
|
-
return (
|
|
13403
|
-
React__default["default"].createElement(material.Box, { className: classes.box, style: {
|
|
12894
|
+
return (jsxRuntime.jsx(material.Tooltip, { title: checkResult.message, children: jsxRuntime.jsx(material.Box, { className: classes.box, style: {
|
|
13404
12895
|
top,
|
|
13405
12896
|
left,
|
|
13406
12897
|
height,
|
|
13407
12898
|
width: height,
|
|
13408
12899
|
pointerEvents: apolloDragging ? 'none' : 'auto',
|
|
13409
|
-
} },
|
|
13410
|
-
React__default["default"].createElement(material.Badge, { className: classes.badge, badgeContent: checkResult.count, color: "primary", overlap: "circular", anchorOrigin: { vertical: 'bottom', horizontal: 'right' }, invisible: checkResult.count <= 1 },
|
|
13411
|
-
React__default["default"].createElement(material.Avatar, { className: classes.avatar },
|
|
13412
|
-
React__default["default"].createElement(ErrorIcon__default["default"], { "data-testid": `ErrorIcon-${checkResult.start}` }))))));
|
|
12900
|
+
}, children: jsxRuntime.jsx(material.Badge, { className: classes.badge, badgeContent: checkResult.count, color: "primary", overlap: "circular", anchorOrigin: { vertical: 'bottom', horizontal: 'right' }, invisible: checkResult.count <= 1, children: jsxRuntime.jsx(material.Avatar, { className: classes.avatar, children: jsxRuntime.jsx(ErrorIcon, { "data-testid": `ErrorIcon-${checkResult.start}` }) }) }) }) }, checkResult._id));
|
|
13413
12901
|
});
|
|
13414
12902
|
});
|
|
13415
12903
|
});
|
|
13416
12904
|
|
|
13417
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
13418
12905
|
// Lock icon when isLocked === true
|
|
13419
12906
|
const LinearApolloDisplay = mobxReact.observer(function LinearApolloDisplay(props) {
|
|
13420
12907
|
const theme = material.useTheme();
|
|
@@ -13431,8 +12918,7 @@ const LinearApolloDisplay = mobxReact.observer(function LinearApolloDisplay(prop
|
|
|
13431
12918
|
if (!isShown) {
|
|
13432
12919
|
return null;
|
|
13433
12920
|
}
|
|
13434
|
-
return (
|
|
13435
|
-
React__default["default"].createElement("div", { className: classes.canvasContainer, style: {
|
|
12921
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs("div", { className: classes.canvasContainer, style: {
|
|
13436
12922
|
width: lgv.dynamicBlocks.totalWidthPx,
|
|
13437
12923
|
height: featuresHeight,
|
|
13438
12924
|
}, onContextMenu: (event) => {
|
|
@@ -13446,63 +12932,50 @@ const LinearApolloDisplay = mobxReact.observer(function LinearApolloDisplay(prop
|
|
|
13446
12932
|
setContextCoord(coord);
|
|
13447
12933
|
setContextMenuItems(getContextMenuItems(event));
|
|
13448
12934
|
}
|
|
13449
|
-
} },
|
|
13450
|
-
|
|
13451
|
-
|
|
13452
|
-
|
|
13453
|
-
|
|
13454
|
-
|
|
13455
|
-
|
|
13456
|
-
|
|
13457
|
-
|
|
13458
|
-
|
|
13459
|
-
|
|
13460
|
-
|
|
13461
|
-
|
|
13462
|
-
|
|
13463
|
-
}, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, className: classes.canvas, "data-testid": "collaboratorCanvas" }),
|
|
13464
|
-
React__default["default"].createElement("canvas", { ref: async (node) => {
|
|
13465
|
-
await Promise.resolve();
|
|
13466
|
-
setCanvas(node);
|
|
13467
|
-
}, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, className: classes.canvas, "data-testid": "canvas" }),
|
|
13468
|
-
React__default["default"].createElement("canvas", { ref: async (node) => {
|
|
13469
|
-
await Promise.resolve();
|
|
13470
|
-
setOverlayCanvas(node);
|
|
13471
|
-
}, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, onMouseMove: onMouseMove, onMouseLeave: onMouseLeave, onMouseDown: onMouseDown, onMouseUp: onMouseUp, className: classes.canvas, style: { cursor: cursor ?? 'default' }, "data-testid": "overlayCanvas" }),
|
|
13472
|
-
React__default["default"].createElement(CheckResultWarnings, { display: model }),
|
|
13473
|
-
React__default["default"].createElement(ui.Menu, { open: contextMenuItems.length > 0, onMenuItemClick: (_, callback) => {
|
|
13474
|
-
callback();
|
|
13475
|
-
setContextMenuItems([]);
|
|
13476
|
-
}, onClose: () => {
|
|
13477
|
-
setContextMenuItems([]);
|
|
13478
|
-
}, slotProps: {
|
|
13479
|
-
transition: {
|
|
13480
|
-
onExit: () => {
|
|
12935
|
+
}, children: [session.isLocked ? (jsxRuntime.jsx("div", { className: classes.locked, "data-testid": "lock-icon", children: jsxRuntime.jsx(LockIcon, {}) })) : null, loading ? (jsxRuntime.jsx("div", { className: classes.loading, children: jsxRuntime.jsx(material.CircularProgress, { size: "18px" }) })) : null, message ? (jsxRuntime.jsx(material.Alert, { severity: "warning", classes: { message: classes.ellipses }, slotProps: { root: { className: classes.center } }, children: jsxRuntime.jsx(material.Tooltip, { title: message, children: jsxRuntime.jsx("div", { children: message }) }) })) : (
|
|
12936
|
+
// Promise.resolve() in these 3 callbacks is to avoid infinite rendering loop
|
|
12937
|
+
// https://github.com/mobxjs/mobx/issues/3728#issuecomment-1715400931
|
|
12938
|
+
jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("canvas", { ref: async (node) => {
|
|
12939
|
+
await Promise.resolve();
|
|
12940
|
+
setCollaboratorCanvas(node);
|
|
12941
|
+
}, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, className: classes.canvas, "data-testid": "collaboratorCanvas" }), jsxRuntime.jsx("canvas", { ref: async (node) => {
|
|
12942
|
+
await Promise.resolve();
|
|
12943
|
+
setCanvas(node);
|
|
12944
|
+
}, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, className: classes.canvas, "data-testid": "canvas" }), jsxRuntime.jsx("canvas", { ref: async (node) => {
|
|
12945
|
+
await Promise.resolve();
|
|
12946
|
+
setOverlayCanvas(node);
|
|
12947
|
+
}, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, onMouseMove: onMouseMove, onMouseLeave: onMouseLeave, onMouseDown: onMouseDown, onMouseUp: onMouseUp, className: classes.canvas, style: { cursor: cursor ?? 'default' }, "data-testid": "overlayCanvas" }), jsxRuntime.jsx(CheckResultWarnings, { display: model }), jsxRuntime.jsx(ui.Menu, { open: contextMenuItems.length > 0, onMenuItemClick: (_, callback) => {
|
|
12948
|
+
callback();
|
|
13481
12949
|
setContextMenuItems([]);
|
|
13482
|
-
},
|
|
13483
|
-
|
|
13484
|
-
|
|
13485
|
-
|
|
13486
|
-
|
|
12950
|
+
}, onClose: () => {
|
|
12951
|
+
setContextMenuItems([]);
|
|
12952
|
+
}, slotProps: {
|
|
12953
|
+
transition: {
|
|
12954
|
+
onExit: () => {
|
|
12955
|
+
setContextMenuItems([]);
|
|
12956
|
+
},
|
|
12957
|
+
},
|
|
12958
|
+
}, anchorReference: "anchorPosition", anchorPosition: contextCoord
|
|
12959
|
+
? { top: contextCoord[1], left: contextCoord[0] }
|
|
12960
|
+
: undefined, menuItems: contextMenuItems })] }))] }) }));
|
|
13487
12961
|
});
|
|
13488
12962
|
|
|
13489
12963
|
const TrackLines = mobxReact.observer(function TrackLines({ model, hrStyle = { margin: 0, top: 0, color: 'black' }, idx = 0, }) {
|
|
13490
12964
|
const { apolloRowHeight, highestRow, showFeatureLabels } = model;
|
|
13491
12965
|
const featureLabelSpacer = showFeatureLabels ? 2 : 1;
|
|
13492
|
-
return (
|
|
12966
|
+
return (jsxRuntime.jsx("div", { style: {
|
|
13493
12967
|
position: 'absolute',
|
|
13494
12968
|
left: 0,
|
|
13495
12969
|
top: (apolloRowHeight * featureLabelSpacer * (highestRow + 1)) / 2 +
|
|
13496
12970
|
idx * featureLabelSpacer * apolloRowHeight,
|
|
13497
12971
|
width: '100%',
|
|
13498
|
-
} }
|
|
13499
|
-
React__default["default"].createElement("hr", { style: hrStyle })));
|
|
12972
|
+
}, children: jsxRuntime.jsx("hr", { style: hrStyle }) }));
|
|
13500
12973
|
});
|
|
13501
12974
|
|
|
13502
12975
|
const LinearApolloSixFrameDisplay = mobxReact.observer(function LinearApolloSixFrameDisplay(props, apolloDragging) {
|
|
13503
12976
|
const theme = material.useTheme();
|
|
13504
12977
|
const { model } = props;
|
|
13505
|
-
const { apolloRowHeight, contextMenuItems: getContextMenuItems, cursor, featuresHeight,
|
|
12978
|
+
const { apolloRowHeight, contextMenuItems: getContextMenuItems, cursor, featuresHeight, geneTrackRowNums, isShown, onMouseDown, onMouseLeave, onMouseMove, onMouseUp, regionCannotBeRendered, session, setCanvas, setCollaboratorCanvas, setOverlayCanvas, setTheme, showCheckResults, showFeatureLabels, } = model;
|
|
13506
12979
|
const { classes } = useStyles$1();
|
|
13507
12980
|
const lgv = util.getContainingView(model);
|
|
13508
12981
|
React.useEffect(() => {
|
|
@@ -13515,8 +12988,7 @@ const LinearApolloSixFrameDisplay = mobxReact.observer(function LinearApolloSixF
|
|
|
13515
12988
|
return null;
|
|
13516
12989
|
}
|
|
13517
12990
|
const { assemblyManager } = session;
|
|
13518
|
-
return (
|
|
13519
|
-
React__default["default"].createElement("div", { className: classes.canvasContainer, style: {
|
|
12991
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs("div", { className: classes.canvasContainer, style: {
|
|
13520
12992
|
width: lgv.dynamicBlocks.totalWidthPx,
|
|
13521
12993
|
height: featuresHeight,
|
|
13522
12994
|
}, onContextMenu: (event) => {
|
|
@@ -13530,108 +13002,96 @@ const LinearApolloSixFrameDisplay = mobxReact.observer(function LinearApolloSixF
|
|
|
13530
13002
|
setContextCoord(coord);
|
|
13531
13003
|
setContextMenuItems(getContextMenuItems(event));
|
|
13532
13004
|
}
|
|
13533
|
-
} },
|
|
13534
|
-
|
|
13535
|
-
|
|
13536
|
-
|
|
13537
|
-
|
|
13538
|
-
|
|
13539
|
-
|
|
13540
|
-
|
|
13541
|
-
|
|
13542
|
-
|
|
13543
|
-
|
|
13544
|
-
|
|
13545
|
-
|
|
13546
|
-
|
|
13547
|
-
|
|
13548
|
-
|
|
13549
|
-
|
|
13550
|
-
|
|
13551
|
-
|
|
13552
|
-
|
|
13553
|
-
|
|
13554
|
-
|
|
13555
|
-
|
|
13556
|
-
|
|
13557
|
-
|
|
13558
|
-
|
|
13559
|
-
|
|
13560
|
-
|
|
13561
|
-
|
|
13562
|
-
|
|
13563
|
-
|
|
13564
|
-
|
|
13565
|
-
|
|
13566
|
-
|
|
13567
|
-
|
|
13568
|
-
|
|
13569
|
-
|
|
13570
|
-
|
|
13571
|
-
|
|
13572
|
-
|
|
13573
|
-
|
|
13574
|
-
|
|
13575
|
-
|
|
13576
|
-
|
|
13577
|
-
|
|
13578
|
-
|
|
13579
|
-
|
|
13580
|
-
|
|
13581
|
-
|
|
13582
|
-
|
|
13583
|
-
|
|
13584
|
-
|
|
13005
|
+
}, children: [session.isLocked ? (jsxRuntime.jsx("div", { className: classes.locked, "data-testid": "lock-icon", children: jsxRuntime.jsx(LockIcon, {}) })) : null, message ? (jsxRuntime.jsx(material.Alert, { severity: "warning", classes: { message: classes.ellipses }, slotProps: { root: { className: classes.center } }, children: jsxRuntime.jsx(material.Tooltip, { title: message, children: jsxRuntime.jsx("div", { children: message }) }) })) : (
|
|
13006
|
+
// Promise.resolve() in these 3 callbacks is to avoid infinite rendering loop
|
|
13007
|
+
// https://github.com/mobxjs/mobx/issues/3728#issuecomment-1715400931
|
|
13008
|
+
jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(TrackLines, { model: model, idx: 0 }), jsxRuntime.jsx(TrackLines, { model: model, hrStyle: { margin: 0, top: 0, color: 'grey', opacity: 0.4 }, idx: 1 }), jsxRuntime.jsx(TrackLines, { model: model, idx: 2 }), jsxRuntime.jsx("canvas", { ref: async (node) => {
|
|
13009
|
+
await Promise.resolve();
|
|
13010
|
+
setCollaboratorCanvas(node);
|
|
13011
|
+
}, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, className: classes.canvas, "data-testid": "collaboratorCanvas" }), jsxRuntime.jsx("canvas", { ref: async (node) => {
|
|
13012
|
+
await Promise.resolve();
|
|
13013
|
+
setCanvas(node);
|
|
13014
|
+
}, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, className: classes.canvas, "data-testid": "canvas" }), jsxRuntime.jsx("canvas", { ref: async (node) => {
|
|
13015
|
+
await Promise.resolve();
|
|
13016
|
+
setOverlayCanvas(node);
|
|
13017
|
+
}, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, onMouseMove: onMouseMove, onMouseLeave: onMouseLeave, onMouseDown: onMouseDown, onMouseUp: onMouseUp, className: classes.canvas, style: { cursor: cursor ?? 'default' }, "data-testid": "overlayCanvas" }), lgv.displayedRegions.flatMap((region, idx) => {
|
|
13018
|
+
const widthBp = lgv.bpPerPx * apolloRowHeight;
|
|
13019
|
+
const assembly = assemblyManager.get(region.assemblyName);
|
|
13020
|
+
if (showCheckResults) {
|
|
13021
|
+
const filteredCheckResults = [
|
|
13022
|
+
...session.apolloDataStore.checkResults.values(),
|
|
13023
|
+
].filter((checkResult) => assembly?.isValidRefName(checkResult.refSeq) &&
|
|
13024
|
+
assembly.getCanonicalRefName(checkResult.refSeq) ===
|
|
13025
|
+
region.refName &&
|
|
13026
|
+
util.doesIntersect2(region.start, region.end, checkResult.start, checkResult.end));
|
|
13027
|
+
const checkResults = clusterResultByMessage(filteredCheckResults, widthBp);
|
|
13028
|
+
return checkResults.map((checkResult) => {
|
|
13029
|
+
const left = (lgv.bpToPx({
|
|
13030
|
+
refName: region.refName,
|
|
13031
|
+
coord: checkResult.start,
|
|
13032
|
+
regionNumber: idx,
|
|
13033
|
+
})?.offsetPx ?? 0) - lgv.offsetPx;
|
|
13034
|
+
const [feature] = checkResult.featureIds;
|
|
13035
|
+
if (!feature || !feature.parent?.looksLikeGene) {
|
|
13036
|
+
return null;
|
|
13037
|
+
}
|
|
13038
|
+
let row;
|
|
13039
|
+
for (const loc of feature.cdsLocations) {
|
|
13040
|
+
for (const cds of loc) {
|
|
13041
|
+
const frame = util.getFrame(cds.min, cds.max, feature.strand ?? 1, cds.phase);
|
|
13042
|
+
const frameOffsets = showFeatureLabels
|
|
13043
|
+
? [0, 5, 3, 1, 15, 13, 11]
|
|
13044
|
+
: [0, 2, 1, 0, 8, 7, 6];
|
|
13045
|
+
const rowNum = frameOffsets.at(frame);
|
|
13046
|
+
if (!rowNum) {
|
|
13047
|
+
continue;
|
|
13048
|
+
}
|
|
13049
|
+
if (checkResult.start >= cds.min &&
|
|
13050
|
+
checkResult.start <= cds.max) {
|
|
13051
|
+
row = rowNum - 1;
|
|
13052
|
+
break;
|
|
13053
|
+
}
|
|
13054
|
+
}
|
|
13055
|
+
}
|
|
13056
|
+
if (row === undefined) {
|
|
13057
|
+
const rowNum = feature.strand == 1
|
|
13058
|
+
? geneTrackRowNums[0]
|
|
13059
|
+
: geneTrackRowNums[1];
|
|
13585
13060
|
row = rowNum - 1;
|
|
13586
|
-
break;
|
|
13587
13061
|
}
|
|
13588
|
-
|
|
13589
|
-
|
|
13590
|
-
|
|
13591
|
-
|
|
13592
|
-
|
|
13593
|
-
|
|
13594
|
-
|
|
13062
|
+
const top = row * apolloRowHeight;
|
|
13063
|
+
const height = apolloRowHeight;
|
|
13064
|
+
return (jsxRuntime.jsx(material.Tooltip, { title: checkResult.message, children: jsxRuntime.jsx(material.Box, { className: classes.box, style: {
|
|
13065
|
+
top,
|
|
13066
|
+
left,
|
|
13067
|
+
height,
|
|
13068
|
+
width: height,
|
|
13069
|
+
pointerEvents: apolloDragging ? 'none' : 'auto',
|
|
13070
|
+
}, children: jsxRuntime.jsx(material.Badge, { className: classes.badge, badgeContent: checkResult.count, color: "primary", overlap: "circular", anchorOrigin: {
|
|
13071
|
+
vertical: 'bottom',
|
|
13072
|
+
horizontal: 'right',
|
|
13073
|
+
}, invisible: checkResult.count <= 1, children: jsxRuntime.jsx(material.Avatar, { className: classes.avatar, children: jsxRuntime.jsx(ErrorIcon, { "data-testid": `ErrorIcon-${checkResult.start}` }) }) }) }) }, checkResult._id));
|
|
13074
|
+
});
|
|
13595
13075
|
}
|
|
13596
|
-
|
|
13597
|
-
|
|
13598
|
-
|
|
13599
|
-
React__default["default"].createElement(material.Box, { className: classes.box, style: {
|
|
13600
|
-
top,
|
|
13601
|
-
left,
|
|
13602
|
-
height,
|
|
13603
|
-
width: height,
|
|
13604
|
-
pointerEvents: apolloDragging ? 'none' : 'auto',
|
|
13605
|
-
} },
|
|
13606
|
-
React__default["default"].createElement(material.Badge, { className: classes.badge, badgeContent: checkResult.count, color: "primary", overlap: "circular", anchorOrigin: {
|
|
13607
|
-
vertical: 'bottom',
|
|
13608
|
-
horizontal: 'right',
|
|
13609
|
-
}, invisible: checkResult.count <= 1 },
|
|
13610
|
-
React__default["default"].createElement(material.Avatar, { className: classes.avatar },
|
|
13611
|
-
React__default["default"].createElement(ErrorIcon__default["default"], { "data-testid": `ErrorIcon-${checkResult.start}` }))))));
|
|
13612
|
-
});
|
|
13613
|
-
}
|
|
13614
|
-
return null;
|
|
13615
|
-
}),
|
|
13616
|
-
React__default["default"].createElement(ui.Menu, { open: contextMenuItems.length > 0, onMenuItemClick: (_, callback) => {
|
|
13617
|
-
callback();
|
|
13618
|
-
setContextMenuItems([]);
|
|
13619
|
-
}, onClose: () => {
|
|
13620
|
-
setContextMenuItems([]);
|
|
13621
|
-
}, slotProps: {
|
|
13622
|
-
transition: {
|
|
13623
|
-
onExit: () => {
|
|
13076
|
+
return null;
|
|
13077
|
+
}), jsxRuntime.jsx(ui.Menu, { open: contextMenuItems.length > 0, onMenuItemClick: (_, callback) => {
|
|
13078
|
+
callback();
|
|
13624
13079
|
setContextMenuItems([]);
|
|
13625
|
-
},
|
|
13626
|
-
|
|
13627
|
-
|
|
13628
|
-
|
|
13629
|
-
|
|
13080
|
+
}, onClose: () => {
|
|
13081
|
+
setContextMenuItems([]);
|
|
13082
|
+
}, slotProps: {
|
|
13083
|
+
transition: {
|
|
13084
|
+
onExit: () => {
|
|
13085
|
+
setContextMenuItems([]);
|
|
13086
|
+
},
|
|
13087
|
+
},
|
|
13088
|
+
}, anchorReference: "anchorPosition", anchorPosition: contextCoord
|
|
13089
|
+
? { top: contextCoord[1], left: contextCoord[0] }
|
|
13090
|
+
: undefined, style: { zIndex: theme.zIndex.tooltip }, menuItems: contextMenuItems })] }))] }) }));
|
|
13630
13091
|
});
|
|
13631
13092
|
|
|
13632
|
-
/* eslint-disable @typescript-eslint/unbound-method */
|
|
13633
13093
|
const accordionControlHeight = 12;
|
|
13634
|
-
const useStyles =
|
|
13094
|
+
const useStyles = tssReact.makeStyles()((theme) => ({
|
|
13635
13095
|
shading: {
|
|
13636
13096
|
background: material.alpha(theme.palette.primary.main, 0.2),
|
|
13637
13097
|
overflowX: 'hidden',
|
|
@@ -13693,12 +13153,12 @@ const ResizeHandle = ({ onResize, }) => {
|
|
|
13693
13153
|
return (
|
|
13694
13154
|
// TODO: a11y
|
|
13695
13155
|
// eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
|
|
13696
|
-
|
|
13156
|
+
jsxRuntime.jsx("div", { onMouseDown: (event) => {
|
|
13697
13157
|
event.stopPropagation();
|
|
13698
13158
|
const controller = new AbortController();
|
|
13699
13159
|
const { signal } = controller;
|
|
13700
13160
|
function abortDrag() {
|
|
13701
|
-
controller.abort('
|
|
13161
|
+
controller.abort(new DOMException('Canceling drag event listener', 'AbortError'));
|
|
13702
13162
|
}
|
|
13703
13163
|
globalThis.addEventListener('mousemove', mouseMove, { signal });
|
|
13704
13164
|
globalThis.addEventListener('mouseup', abortDrag, { signal });
|
|
@@ -13710,11 +13170,7 @@ const ResizeHandle = ({ onResize, }) => {
|
|
|
13710
13170
|
};
|
|
13711
13171
|
const AccordionControl = mobxReact.observer(function AccordionControl({ onClick, onResize, open, title, }) {
|
|
13712
13172
|
const { classes } = useStyles();
|
|
13713
|
-
return (
|
|
13714
|
-
open && onResize ? React__default["default"].createElement(ResizeHandle, { onResize: onResize }) : null,
|
|
13715
|
-
React__default["default"].createElement("div", { className: classes.accordionControl, onClick: onClick },
|
|
13716
|
-
open ? (React__default["default"].createElement(ExpandLessIcon__default["default"], { className: classes.expandIcon })) : (React__default["default"].createElement(ExpandMoreIcon__default["default"], { className: classes.expandIcon })),
|
|
13717
|
-
title ? (React__default["default"].createElement(material.Typography, { className: classes.title, variant: "caption", component: "span" }, title)) : null)));
|
|
13173
|
+
return (jsxRuntime.jsxs("div", { className: classes.accordionRoot, children: [open && onResize ? jsxRuntime.jsx(ResizeHandle, { onResize: onResize }) : null, jsxRuntime.jsxs("div", { className: classes.accordionControl, onClick: onClick, children: [open ? (jsxRuntime.jsx(ExpandLessIcon, { className: classes.expandIcon })) : (jsxRuntime.jsx(ExpandMoreIcon, { className: classes.expandIcon })), title ? (jsxRuntime.jsx(material.Typography, { className: classes.title, variant: "caption", component: "span", children: title })) : null] })] }));
|
|
13718
13174
|
});
|
|
13719
13175
|
const LinearApolloDisplayComponent = mobxReact.observer(function DisplayComponent({ model, ...other }) {
|
|
13720
13176
|
const session = util.getSession(model);
|
|
@@ -13731,28 +13187,19 @@ const LinearApolloDisplayComponent = mobxReact.observer(function DisplayComponen
|
|
|
13731
13187
|
model.setDetailsHeight(model.detailsHeight - delta);
|
|
13732
13188
|
};
|
|
13733
13189
|
if (!ontologyStore) {
|
|
13734
|
-
return (
|
|
13735
|
-
React__default["default"].createElement(material.Alert, { severity: "error" }, "Could not load feature type ontology.")));
|
|
13190
|
+
return (jsxRuntime.jsx("div", { className: classes.alertContainer, children: jsxRuntime.jsx(material.Alert, { severity: "error", children: "Could not load feature type ontology." }) }));
|
|
13736
13191
|
}
|
|
13737
13192
|
if (graphical && table) {
|
|
13738
13193
|
const tabularHeight = tabularEditor.isShown ? model.detailsHeight : 0;
|
|
13739
13194
|
const featureAreaHeight = isShown
|
|
13740
13195
|
? overallHeight - model.detailsHeight - accordionControlHeight * 2
|
|
13741
13196
|
: 0;
|
|
13742
|
-
return (
|
|
13743
|
-
React__default["default"].createElement(AccordionControl, { open: isShown, title: "Graphical", onClick: toggleShown }),
|
|
13744
|
-
React__default["default"].createElement("div", { className: classes.shading, ref: canvasScrollContainerRef, style: { height: featureAreaHeight } },
|
|
13745
|
-
React__default["default"].createElement(LinearApolloDisplay, { model: model, ...other })),
|
|
13746
|
-
React__default["default"].createElement(AccordionControl, { title: "Table", open: tabularEditor.isShown, onClick: tabularEditor.togglePane, onResize: onDetailsResize }),
|
|
13747
|
-
React__default["default"].createElement("div", { className: classes.details, style: { height: tabularHeight } },
|
|
13748
|
-
React__default["default"].createElement(TabularEditorPane, { model: model }))));
|
|
13197
|
+
return (jsxRuntime.jsxs("div", { style: { height: overallHeight }, children: [jsxRuntime.jsx(AccordionControl, { open: isShown, title: "Graphical", onClick: toggleShown }), jsxRuntime.jsx("div", { className: classes.shading, ref: canvasScrollContainerRef, style: { height: featureAreaHeight }, children: jsxRuntime.jsx(LinearApolloDisplay, { model: model, ...other }) }), jsxRuntime.jsx(AccordionControl, { title: "Table", open: tabularEditor.isShown, onClick: tabularEditor.togglePane, onResize: onDetailsResize }), jsxRuntime.jsx("div", { className: classes.details, style: { height: tabularHeight }, children: jsxRuntime.jsx(TabularEditorPane, { model: model }) })] }));
|
|
13749
13198
|
}
|
|
13750
13199
|
if (graphical) {
|
|
13751
|
-
return (
|
|
13752
|
-
React__default["default"].createElement(LinearApolloDisplay, { model: model, ...other })));
|
|
13200
|
+
return (jsxRuntime.jsx("div", { className: classes.shading, ref: canvasScrollContainerRef, style: { height: overallHeight }, children: jsxRuntime.jsx(LinearApolloDisplay, { model: model, ...other }) }));
|
|
13753
13201
|
}
|
|
13754
|
-
return (
|
|
13755
|
-
React__default["default"].createElement(TabularEditorPane, { model: model })));
|
|
13202
|
+
return (jsxRuntime.jsx("div", { className: classes.details, style: { height: overallHeight }, children: jsxRuntime.jsx(TabularEditorPane, { model: model }) }));
|
|
13756
13203
|
});
|
|
13757
13204
|
const LinearApolloSixFrameDisplayComponent = mobxReact.observer(function DisplayComponent({ model, ...other }) {
|
|
13758
13205
|
const session = util.getSession(model);
|
|
@@ -13769,34 +13216,25 @@ const LinearApolloSixFrameDisplayComponent = mobxReact.observer(function Display
|
|
|
13769
13216
|
model.setDetailsHeight(detailsHeight - delta);
|
|
13770
13217
|
};
|
|
13771
13218
|
if (!ontologyStore) {
|
|
13772
|
-
return (
|
|
13773
|
-
React__default["default"].createElement(material.Alert, { severity: "error" }, "Could not load feature type ontology.")));
|
|
13219
|
+
return (jsxRuntime.jsx("div", { className: classes.alertContainer, children: jsxRuntime.jsx(material.Alert, { severity: "error", children: "Could not load feature type ontology." }) }));
|
|
13774
13220
|
}
|
|
13775
13221
|
if (graphical && table) {
|
|
13776
13222
|
const tabularHeight = tabularEditor.isShown ? detailsHeight : 0;
|
|
13777
13223
|
const featureAreaHeight = isShown
|
|
13778
13224
|
? overallHeight - detailsHeight - accordionControlHeight * 2
|
|
13779
13225
|
: 0;
|
|
13780
|
-
return (
|
|
13781
|
-
React__default["default"].createElement(AccordionControl, { open: isShown, title: "Graphical", onClick: toggleShown }),
|
|
13782
|
-
React__default["default"].createElement("div", { className: classes.shading, ref: canvasScrollContainerRef, style: { height: featureAreaHeight } },
|
|
13783
|
-
React__default["default"].createElement(LinearApolloSixFrameDisplay, { model: model, ...other })),
|
|
13784
|
-
React__default["default"].createElement(AccordionControl, { title: "Table", open: tabularEditor.isShown, onClick: tabularEditor.togglePane, onResize: onDetailsResize }),
|
|
13785
|
-
React__default["default"].createElement("div", { className: classes.details, style: { height: tabularHeight } },
|
|
13786
|
-
React__default["default"].createElement(TabularEditorPane, { model: model }))));
|
|
13226
|
+
return (jsxRuntime.jsxs("div", { style: { height: overallHeight }, children: [jsxRuntime.jsx(AccordionControl, { open: isShown, title: "Graphical", onClick: toggleShown }), jsxRuntime.jsx("div", { className: classes.shading, ref: canvasScrollContainerRef, style: { height: featureAreaHeight }, children: jsxRuntime.jsx(LinearApolloSixFrameDisplay, { model: model, ...other }) }), jsxRuntime.jsx(AccordionControl, { title: "Table", open: tabularEditor.isShown, onClick: tabularEditor.togglePane, onResize: onDetailsResize }), jsxRuntime.jsx("div", { className: classes.details, style: { height: tabularHeight }, children: jsxRuntime.jsx(TabularEditorPane, { model: model }) })] }));
|
|
13787
13227
|
}
|
|
13788
13228
|
if (graphical) {
|
|
13789
|
-
return (
|
|
13790
|
-
React__default["default"].createElement(LinearApolloSixFrameDisplay, { model: model, ...other })));
|
|
13229
|
+
return (jsxRuntime.jsx("div", { className: classes.shading, ref: canvasScrollContainerRef, style: { height: overallHeight }, children: jsxRuntime.jsx(LinearApolloSixFrameDisplay, { model: model, ...other }) }));
|
|
13791
13230
|
}
|
|
13792
|
-
return (
|
|
13793
|
-
React__default["default"].createElement(TabularEditorPane, { model: model })));
|
|
13231
|
+
return (jsxRuntime.jsx("div", { className: classes.details, style: { height: overallHeight }, children: jsxRuntime.jsx(TabularEditorPane, { model: model }) }));
|
|
13794
13232
|
});
|
|
13795
13233
|
|
|
13796
13234
|
function addTopLevelMenus(rootModel) {
|
|
13797
13235
|
rootModel.insertInMenu('Apollo', {
|
|
13798
13236
|
label: 'Redo',
|
|
13799
|
-
icon:
|
|
13237
|
+
icon: RedoIcon,
|
|
13800
13238
|
onClick(session) {
|
|
13801
13239
|
const { apolloDataStore } = session;
|
|
13802
13240
|
void apolloDataStore.changeManager.redoLastChange();
|
|
@@ -13804,7 +13242,7 @@ function addTopLevelMenus(rootModel) {
|
|
|
13804
13242
|
}, 0);
|
|
13805
13243
|
rootModel.insertInMenu('Apollo', {
|
|
13806
13244
|
label: 'Undo',
|
|
13807
|
-
icon:
|
|
13245
|
+
icon: UndoIcon,
|
|
13808
13246
|
onClick(session) {
|
|
13809
13247
|
const { apolloDataStore } = session;
|
|
13810
13248
|
void apolloDataStore.changeManager.undoLastChange();
|
|
@@ -13812,7 +13250,7 @@ function addTopLevelMenus(rootModel) {
|
|
|
13812
13250
|
}, 0);
|
|
13813
13251
|
rootModel.appendToMenu('Apollo', {
|
|
13814
13252
|
label: 'Download GFF3',
|
|
13815
|
-
icon:
|
|
13253
|
+
icon: DownloadIcon,
|
|
13816
13254
|
onClick: (session) => {
|
|
13817
13255
|
session.queueDialog((doneCallback) => [
|
|
13818
13256
|
DownloadGFF3,
|
|
@@ -13827,7 +13265,7 @@ function addTopLevelMenus(rootModel) {
|
|
|
13827
13265
|
});
|
|
13828
13266
|
rootModel.appendToMenu('Apollo', {
|
|
13829
13267
|
label: 'View Change Log',
|
|
13830
|
-
icon:
|
|
13268
|
+
icon: TrackChangesIcon,
|
|
13831
13269
|
onClick: (session) => {
|
|
13832
13270
|
session.queueDialog((doneCallback) => [
|
|
13833
13271
|
ViewChangeLog,
|
|
@@ -13842,7 +13280,7 @@ function addTopLevelMenus(rootModel) {
|
|
|
13842
13280
|
});
|
|
13843
13281
|
rootModel.appendToMenu('Apollo', {
|
|
13844
13282
|
label: 'Open local GFF3 file',
|
|
13845
|
-
icon:
|
|
13283
|
+
icon: FileOpenIcon,
|
|
13846
13284
|
onClick: (session) => {
|
|
13847
13285
|
session.queueDialog((doneCallback) => [
|
|
13848
13286
|
OpenLocalFile,
|
|
@@ -13858,7 +13296,7 @@ function addTopLevelMenus(rootModel) {
|
|
|
13858
13296
|
});
|
|
13859
13297
|
rootModel.appendToMenu('Apollo', {
|
|
13860
13298
|
label: 'View check results',
|
|
13861
|
-
icon:
|
|
13299
|
+
icon: FactCheckIcon,
|
|
13862
13300
|
onClick: (session) => {
|
|
13863
13301
|
session.queueDialog((doneCallback) => [
|
|
13864
13302
|
ViewCheckResults,
|
|
@@ -13879,7 +13317,7 @@ function addTopLevelMenus(rootModel) {
|
|
|
13879
13317
|
});
|
|
13880
13318
|
rootModel.appendToMenu('Apollo', {
|
|
13881
13319
|
label: 'Log out',
|
|
13882
|
-
icon:
|
|
13320
|
+
icon: LogoutIcon,
|
|
13883
13321
|
onClick: (session) => {
|
|
13884
13322
|
session.queueDialog((doneCallback) => [
|
|
13885
13323
|
LogOut,
|
|
@@ -13895,6 +13333,7 @@ function addTopLevelMenus(rootModel) {
|
|
|
13895
13333
|
}
|
|
13896
13334
|
|
|
13897
13335
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
13336
|
+
/* eslint-disable @typescript-eslint/no-confusing-void-expression */
|
|
13898
13337
|
const ApolloJobModel = mobxStateTree.types
|
|
13899
13338
|
.model('JobsManager', {})
|
|
13900
13339
|
.views((self) => ({
|
|
@@ -14102,7 +13541,7 @@ function clientDataStoreFactory(AnnotationFeatureExtended) {
|
|
|
14102
13541
|
statusMessage: `Loading ontology "${name}", version "${version}", this may take a while`,
|
|
14103
13542
|
progressPct: 0,
|
|
14104
13543
|
cancelCallback: () => {
|
|
14105
|
-
controller.abort('
|
|
13544
|
+
controller.abort(new DOMException(`Canceling loading of ontology "${name}"`, 'AbortError'));
|
|
14106
13545
|
jobsManager.abortJob(job.name);
|
|
14107
13546
|
},
|
|
14108
13547
|
};
|
|
@@ -14358,6 +13797,12 @@ function extendSession(pluginManager, sessionModel) {
|
|
|
14358
13797
|
}
|
|
14359
13798
|
}
|
|
14360
13799
|
},
|
|
13800
|
+
}))
|
|
13801
|
+
.actions((self) => ({
|
|
13802
|
+
apolloSetEventualSelectedFeature: mobx.flow(function* apolloSetEventualSelectedFeature(featureId) {
|
|
13803
|
+
yield mobx.when(() => Boolean(self.apolloDataStore.getFeature(featureId)));
|
|
13804
|
+
self.apolloSetSelectedFeature(featureId);
|
|
13805
|
+
}),
|
|
14361
13806
|
}))
|
|
14362
13807
|
.volatile((self) => ({
|
|
14363
13808
|
previousSnapshot: mobxStateTree.getSnapshot(self),
|
|
@@ -14463,6 +13908,10 @@ function extendSession(pluginManager, sessionModel) {
|
|
|
14463
13908
|
console.error(error);
|
|
14464
13909
|
continue;
|
|
14465
13910
|
}
|
|
13911
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
13912
|
+
if (!jbrowseConfig.configuration.ApolloPlugin.hasRole) {
|
|
13913
|
+
continue;
|
|
13914
|
+
}
|
|
14466
13915
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
14467
13916
|
reloadPluginManagerCallback(jbrowseConfig, self.previousSnapshot);
|
|
14468
13917
|
reaction.dispose();
|
|
@@ -14470,7 +13919,7 @@ function extendSession(pluginManager, sessionModel) {
|
|
|
14470
13919
|
}, { name: 'ApolloSessionLoadConfig' }));
|
|
14471
13920
|
},
|
|
14472
13921
|
beforeDestroy() {
|
|
14473
|
-
self.abortController.abort('
|
|
13922
|
+
self.abortController.abort(new DOMException('Clean up Apollo session', 'AbortError'));
|
|
14474
13923
|
},
|
|
14475
13924
|
}))
|
|
14476
13925
|
.views((self) => {
|
|
@@ -14512,6 +13961,7 @@ function extendSession(pluginManager, sessionModel) {
|
|
|
14512
13961
|
oldJBrowseConfig: filteredConfig,
|
|
14513
13962
|
newJBrowseConfig: {
|
|
14514
13963
|
...filteredConfig,
|
|
13964
|
+
// @ts-expect-error The track types are in the snapshot
|
|
14515
13965
|
tracks: filteredConfig?.tracks && [
|
|
14516
13966
|
...filteredConfig.tracks,
|
|
14517
13967
|
newTrackConfigSnapshot,
|
|
@@ -14530,7 +13980,7 @@ function extendSession(pluginManager, sessionModel) {
|
|
|
14530
13980
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
14531
13981
|
jbrowse.addTrackConf(newTrackConfigSnapshot);
|
|
14532
13982
|
},
|
|
14533
|
-
icon:
|
|
13983
|
+
icon: SaveIcon,
|
|
14534
13984
|
},
|
|
14535
13985
|
]
|
|
14536
13986
|
: [
|
|
@@ -14570,7 +14020,7 @@ function extendSession(pluginManager, sessionModel) {
|
|
|
14570
14020
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
14571
14021
|
jbrowse.deleteTrackConf(conf);
|
|
14572
14022
|
},
|
|
14573
|
-
icon:
|
|
14023
|
+
icon: SaveIcon,
|
|
14574
14024
|
},
|
|
14575
14025
|
];
|
|
14576
14026
|
},
|
|
@@ -14607,6 +14057,9 @@ function extendSession(pluginManager, sessionModel) {
|
|
|
14607
14057
|
}
|
|
14608
14058
|
|
|
14609
14059
|
/* eslint-disable @typescript-eslint/unbound-method */
|
|
14060
|
+
/* eslint-disable @typescript-eslint/no-unnecessary-condition */
|
|
14061
|
+
/* eslint-disable @typescript-eslint/no-misused-promises */
|
|
14062
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
14610
14063
|
function isApolloMessageData(data) {
|
|
14611
14064
|
return (typeof data === 'object' &&
|
|
14612
14065
|
data !== null &&
|
|
@@ -14623,7 +14076,7 @@ const transcriptCheck = new shared.TranscriptCheck();
|
|
|
14623
14076
|
common.checkRegistry.registerCheck(transcriptCheck.name, transcriptCheck);
|
|
14624
14077
|
shared.validationRegistry.registerValidation(new shared.CoreValidation());
|
|
14625
14078
|
shared.validationRegistry.registerValidation(new shared.ParentChildValidation());
|
|
14626
|
-
class ApolloPlugin extends
|
|
14079
|
+
class ApolloPlugin extends Plugin {
|
|
14627
14080
|
name = 'ApolloPlugin';
|
|
14628
14081
|
version = version;
|
|
14629
14082
|
configurationSchema = ApolloPluginConfigurationSchema;
|
|
@@ -14720,7 +14173,7 @@ class ApolloPlugin extends Plugin__default["default"] {
|
|
|
14720
14173
|
...superRubberBandMenuItems(),
|
|
14721
14174
|
{
|
|
14722
14175
|
label: 'Add new feature',
|
|
14723
|
-
icon:
|
|
14176
|
+
icon: AddIcon,
|
|
14724
14177
|
onClick: () => {
|
|
14725
14178
|
const session = util.getSession(self);
|
|
14726
14179
|
const { leftOffset, rightOffset } = self;
|
|
@@ -14748,6 +14201,17 @@ class ApolloPlugin extends Plugin__default["default"] {
|
|
|
14748
14201
|
});
|
|
14749
14202
|
pluginManager.addToExtensionPoint('Core-extendPluggableElement', annotationFromPileup);
|
|
14750
14203
|
pluginManager.addToExtensionPoint('Core-extendPluggableElement', annotationFromJBrowseFeature);
|
|
14204
|
+
pluginManager.addToExtensionPoint('LinearGenomeView-searchResultSelected', (_, props) => {
|
|
14205
|
+
const { session, result } = props;
|
|
14206
|
+
const trackId = result.getTrackId();
|
|
14207
|
+
const matchedFeature = result.matchedObject;
|
|
14208
|
+
if (trackId?.startsWith('apollo_track_') && matchedFeature) {
|
|
14209
|
+
const geneFeature = matchedFeature;
|
|
14210
|
+
void session.apolloSetEventualSelectedFeature(geneFeature._id);
|
|
14211
|
+
}
|
|
14212
|
+
/* eslint-disable-next-line @typescript-eslint/no-unsafe-return */
|
|
14213
|
+
return _;
|
|
14214
|
+
});
|
|
14751
14215
|
if (!inWebWorker) {
|
|
14752
14216
|
pluginManager.addToExtensionPoint('Core-extendWorker', (handle) => {
|
|
14753
14217
|
if (!('on' in handle && handle.on)) {
|
|
@@ -14836,5 +14300,5 @@ class ApolloPlugin extends Plugin__default["default"] {
|
|
|
14836
14300
|
}
|
|
14837
14301
|
}
|
|
14838
14302
|
|
|
14839
|
-
exports
|
|
14303
|
+
exports.default = ApolloPlugin;
|
|
14840
14304
|
//# sourceMappingURL=jbrowse-plugin-apollo.cjs.development.js.map
|