jbrowse-plugin-msaview 5.14.1 → 5.16.0
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/README.md +2 -0
- package/dist/AddHighlightModel/index.js +1 -0
- package/dist/BgzipFastaMsaAdapter/configSchema.d.ts +1 -1
- package/dist/LaunchMsaView/components/BlastQuery/BlastMethodSelector.d.ts +3 -2
- package/dist/LaunchMsaView/components/BlastQuery/BlastMethodSelector.js +4 -2
- package/dist/LaunchMsaView/components/BlastQuery/BlastPanel.d.ts +3 -3
- package/dist/LaunchMsaView/components/BlastQuery/BlastPanel.js +4 -2
- package/dist/LaunchMsaView/components/BlastQuery/BlastSettingsDialog.d.ts +3 -2
- package/dist/LaunchMsaView/components/BlastQuery/BlastSettingsDialog.js +4 -2
- package/dist/LaunchMsaView/components/BlastQuery/MsaAlgorithmSelect.d.ts +3 -2
- package/dist/LaunchMsaView/components/BlastQuery/MsaAlgorithmSelect.js +4 -2
- package/dist/LaunchMsaView/components/HelpButton.d.ts +2 -1
- package/dist/LaunchMsaView/components/HelpButton.js +4 -2
- package/dist/LaunchMsaView/components/HelpDialog.d.ts +3 -2
- package/dist/LaunchMsaView/components/HelpDialog.js +4 -2
- package/dist/LaunchMsaView/components/LaunchMsaViewDialog.d.ts +3 -2
- package/dist/LaunchMsaView/components/LaunchMsaViewDialog.js +4 -2
- package/dist/LaunchMsaView/components/LaunchPanelContent.d.ts +3 -2
- package/dist/LaunchMsaView/components/LaunchPanelContent.js +4 -2
- package/dist/LaunchMsaView/components/OrthologQuery/OrthologSourceSelect.d.ts +3 -2
- package/dist/LaunchMsaView/components/OrthologQuery/OrthologSourceSelect.js +4 -2
- package/dist/LaunchMsaView/components/OrthologQuery/QuerySpeciesSelect.d.ts +3 -2
- package/dist/LaunchMsaView/components/OrthologQuery/QuerySpeciesSelect.js +4 -2
- package/dist/LaunchMsaView/components/PreLoadedMSA/types.d.ts +4 -1
- package/dist/LaunchMsaView/components/PreLoadedMSA/types.js +5 -1
- package/dist/LaunchMsaView/components/QueryRowSelector.d.ts +3 -2
- package/dist/LaunchMsaView/components/QueryRowSelector.js +4 -2
- package/dist/LaunchMsaView/components/SequenceStatus.d.ts +3 -2
- package/dist/LaunchMsaView/components/SequenceStatus.js +4 -2
- package/dist/LaunchMsaView/components/SubmitCancelActions.d.ts +3 -2
- package/dist/LaunchMsaView/components/SubmitCancelActions.js +6 -4
- package/dist/LaunchMsaView/components/TabPanel.d.ts +3 -2
- package/dist/LaunchMsaView/components/TabPanel.js +4 -2
- package/dist/LaunchMsaView/components/TabPanel.test.js +5 -4
- package/dist/LaunchMsaView/components/TranscriptSelector.d.ts +3 -2
- package/dist/LaunchMsaView/components/TranscriptSelector.js +4 -2
- package/dist/LaunchMsaView/components/fetchSeq.d.ts +2 -1
- package/dist/LaunchMsaView/components/fetchSeq.js +9 -3
- package/dist/LaunchMsaView/components/launchPlacement.d.ts +2 -2
- package/dist/LaunchMsaView/components/launchPlacement.js +3 -2
- package/dist/LaunchMsaView/components/useFeatureSequence.js +2 -1
- package/dist/MsaViewPanel/afterCreateAutoruns.d.ts +18 -0
- package/dist/MsaViewPanel/afterCreateAutoruns.js +25 -3
- package/dist/MsaViewPanel/components/JobLink.d.ts +2 -2
- package/dist/MsaViewPanel/components/JobLink.js +3 -2
- package/dist/MsaViewPanel/connectedDomains.js +1 -1
- package/dist/MsaViewPanel/launchAutoruns.test.js +1 -0
- package/dist/MsaViewPanel/loadProteinDomains.d.ts +5 -1
- package/dist/MsaViewPanel/loadProteinDomains.js +16 -4
- package/dist/MsaViewPanel/loadProteinDomains.test.js +36 -5
- package/dist/MsaViewPanel/model.d.ts +158 -6
- package/dist/MsaViewPanel/model.js +162 -8
- package/dist/MsaViewPanel/resolveConnectedTranscript.d.ts +35 -4
- package/dist/MsaViewPanel/resolveConnectedTranscript.js +93 -31
- package/dist/MsaViewPanel/resolveConnectedTranscript.test.js +162 -5
- package/dist/MsaViewPanel/transcriptMap.d.ts +17 -1
- package/dist/MsaViewPanel/transcriptMap.js +13 -13
- package/dist/MsaViewPanel/transcriptMap.test.js +20 -34
- package/dist/MsaViewPanel/util.d.ts +3 -0
- package/dist/MsaViewPanel/util.js +7 -0
- package/dist/MsaViewPanel/viewReport.d.ts +113 -0
- package/dist/MsaViewPanel/viewReport.js +124 -0
- package/dist/MsaViewPanel/viewState.test.d.ts +1 -0
- package/dist/MsaViewPanel/viewState.test.js +303 -0
- package/dist/chunks/AboutDialog-UIDZTTTE.js +2 -0
- package/dist/chunks/{AboutDialog-HJKHE6X5.js.map → AboutDialog-UIDZTTTE.js.map} +3 -3
- package/dist/chunks/AnnotationFileDialog-TFIHQACD.js +2 -0
- package/dist/chunks/{AnnotationFileDialog-MGUAGUEN.js.map → AnnotationFileDialog-TFIHQACD.js.map} +3 -3
- package/dist/chunks/BgzipFastaMsaAdapter-LXM6BNRP.js +4 -0
- package/dist/chunks/BgzipFastaMsaAdapter-LXM6BNRP.js.map +7 -0
- package/dist/chunks/ExportSVGDialog-AYE4AXS3.js +2 -0
- package/dist/chunks/{ExportSVGDialog-JNEIAPDD.js.map → ExportSVGDialog-AYE4AXS3.js.map} +3 -3
- package/dist/chunks/FeatureDialog-XHNPLPWX.js +2 -0
- package/dist/chunks/{FeatureDialog-36U3KHHS.js.map → FeatureDialog-XHNPLPWX.js.map} +3 -3
- package/dist/chunks/GapThresholdDialog-MNNNXRMM.js +2 -0
- package/dist/chunks/GapThresholdDialog-MNNNXRMM.js.map +7 -0
- package/dist/chunks/GoToDialog-U3TQYXIE.js +2 -0
- package/dist/chunks/{GoToDialog-HYG2ADFF.js.map → GoToDialog-U3TQYXIE.js.map} +3 -3
- package/dist/chunks/HelpDialog-3IR65NL3.js +2 -0
- package/dist/chunks/HelpDialog-3IR65NL3.js.map +7 -0
- package/dist/chunks/HelpDialog-QS4T2P3K.js +2 -0
- package/dist/chunks/{HelpDialog-5WXA5QYK.js.map → HelpDialog-QS4T2P3K.js.map} +3 -3
- package/dist/chunks/LaunchMsaViewDialog-CVUQSMRL.js +5 -0
- package/dist/chunks/LaunchMsaViewDialog-CVUQSMRL.js.map +7 -0
- package/dist/chunks/MetadataDialog-BC6EUBOJ.js +2 -0
- package/dist/chunks/MetadataDialog-BC6EUBOJ.js.map +7 -0
- package/dist/chunks/MsaViewPanel-UWT4FWLE.js +2 -0
- package/dist/chunks/MsaViewPanel-UWT4FWLE.js.map +7 -0
- package/dist/chunks/TrackInfoDialog-UCAJUIKI.js +2 -0
- package/dist/chunks/{TrackInfoDialog-WJAJNV5S.js.map → TrackInfoDialog-UCAJUIKI.js.map} +3 -3
- package/dist/chunks/TreeNodeInfoDialog-W6L2FDRH.js +2 -0
- package/dist/chunks/{TreeNodeInfoDialog-JATVC2AB.js.map → TreeNodeInfoDialog-W6L2FDRH.js.map} +3 -3
- package/dist/chunks/{chunk-4IRL4OLU.js → chunk-27DJABXI.js} +1 -1
- package/dist/chunks/{chunk-4IRL4OLU.js.map → chunk-27DJABXI.js.map} +1 -1
- package/dist/chunks/{chunk-2MRW3C7A.js → chunk-33ER5TMH.js} +2 -2
- package/dist/chunks/chunk-3KTCIF2L.js +2 -0
- package/dist/chunks/chunk-3KTCIF2L.js.map +7 -0
- package/dist/chunks/chunk-7JFWQZNK.js +2 -0
- package/dist/chunks/{chunk-GFANDTQR.js.map → chunk-7JFWQZNK.js.map} +3 -3
- package/dist/chunks/chunk-7WGSBPHS.js +6 -0
- package/dist/chunks/{chunk-6GRHBYHB.js.map → chunk-7WGSBPHS.js.map} +2 -2
- package/dist/chunks/chunk-AO3YMCKS.js +164 -0
- package/dist/chunks/chunk-AO3YMCKS.js.map +7 -0
- package/dist/chunks/chunk-AOTVWTUV.js +2 -0
- package/dist/chunks/chunk-AOTVWTUV.js.map +7 -0
- package/dist/chunks/chunk-BKGWP5O6.js +2 -0
- package/dist/chunks/chunk-BKGWP5O6.js.map +7 -0
- package/dist/chunks/chunk-ECXGXFKO.js +2 -0
- package/dist/chunks/chunk-ECXGXFKO.js.map +7 -0
- package/dist/chunks/chunk-EXFKF6XR.js +2 -0
- package/dist/chunks/chunk-EXFKF6XR.js.map +7 -0
- package/dist/chunks/{chunk-YTIKINP5.js → chunk-FYL5SHOE.js} +1 -1
- package/dist/chunks/{chunk-YTIKINP5.js.map → chunk-FYL5SHOE.js.map} +1 -1
- package/dist/chunks/chunk-JUE34WZU.js +2 -0
- package/dist/chunks/chunk-JUE34WZU.js.map +7 -0
- package/dist/chunks/chunk-KKFBYJZN.js +2 -0
- package/dist/chunks/{chunk-NRAUA3EX.js.map → chunk-KKFBYJZN.js.map} +3 -3
- package/dist/chunks/chunk-KVMUXFPB.js +2 -0
- package/dist/chunks/chunk-L75R2CI3.js +6 -0
- package/dist/chunks/{chunk-5YOLE75H.js.map → chunk-L75R2CI3.js.map} +3 -3
- package/dist/chunks/chunk-LXN7NIHB.js +2 -0
- package/dist/chunks/chunk-LXN7NIHB.js.map +7 -0
- package/dist/chunks/chunk-MLATYHL2.js +2 -0
- package/dist/chunks/chunk-MLATYHL2.js.map +7 -0
- package/dist/chunks/chunk-NDUZUXDJ.js +2 -0
- package/dist/chunks/chunk-NDUZUXDJ.js.map +7 -0
- package/dist/chunks/chunk-PFO3G4CM.js +2 -0
- package/dist/chunks/chunk-PFO3G4CM.js.map +7 -0
- package/dist/chunks/chunk-QBRNXRNU.js +2 -0
- package/dist/chunks/chunk-QBRNXRNU.js.map +7 -0
- package/dist/chunks/chunk-TEYYBCMF.js +2 -0
- package/dist/chunks/chunk-TEYYBCMF.js.map +7 -0
- package/dist/chunks/chunk-TVAJGJXO.js +2 -0
- package/dist/chunks/chunk-TVAJGJXO.js.map +7 -0
- package/dist/chunks/chunk-TVOPZHTJ.js +2 -0
- package/dist/chunks/{chunk-JYQQZRPF.js.map → chunk-TVOPZHTJ.js.map} +1 -1
- package/dist/chunks/{chunk-IBVOKJV3.js → chunk-UUDUJ6ZF.js} +1 -1
- package/dist/chunks/{chunk-IBVOKJV3.js.map → chunk-UUDUJ6ZF.js.map} +1 -1
- package/dist/chunks/chunk-YOLY6H5C.js +2 -0
- package/dist/chunks/chunk-YOLY6H5C.js.map +7 -0
- package/dist/chunks/chunk-YRZUKVPZ.js +3 -0
- package/dist/chunks/chunk-YRZUKVPZ.js.map +7 -0
- package/dist/chunks/dist-2VELCAWU.js +2 -0
- package/dist/chunks/{dist-J332RCWL.js → dist-34WACJJR.js} +2 -2
- package/dist/chunks/model-DAIL6BNQ.js +12 -0
- package/dist/chunks/model-DAIL6BNQ.js.map +7 -0
- package/dist/chunks/renderToSvg-VO23YN7B.js +2 -0
- package/dist/components/ExternalLink.d.ts +2 -1
- package/dist/components/ExternalLink.js +4 -2
- package/dist/components/ReadOnlyTextField2.d.ts +3 -2
- package/dist/components/ReadOnlyTextField2.js +4 -2
- package/dist/components/TextField2.d.ts +1 -1
- package/dist/components/TextField2.js +3 -2
- package/dist/index.d.ts +3 -3
- package/dist/jbrowse-plugin-msaview.esm.js +2 -2
- package/dist/jbrowse-plugin-msaview.esm.js.map +4 -4
- package/dist/utils/ncbiDomains.d.ts +14 -1
- package/dist/utils/ncbiDomains.js +23 -7
- package/dist/utils/ncbiDomains.test.js +54 -5
- package/dist/utils/ncbiOrthologs.test.js +2 -2
- package/dist/utils/taxonomyNamesAbort.test.js +2 -2
- package/dist/utils/unirefHomologs.d.ts +1 -2
- package/dist/utils/unirefHomologs.js +1 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +10 -9
- package/src/AddHighlightModel/index.tsx +1 -0
- package/src/LaunchMsaView/components/BlastQuery/BlastMethodSelector.tsx +5 -2
- package/src/LaunchMsaView/components/BlastQuery/BlastPanel.tsx +5 -2
- package/src/LaunchMsaView/components/BlastQuery/BlastSettingsDialog.tsx +5 -2
- package/src/LaunchMsaView/components/BlastQuery/MsaAlgorithmSelect.tsx +5 -2
- package/src/LaunchMsaView/components/HelpButton.tsx +5 -2
- package/src/LaunchMsaView/components/HelpDialog.tsx +5 -2
- package/src/LaunchMsaView/components/LaunchMsaViewDialog.tsx +5 -2
- package/src/LaunchMsaView/components/LaunchPanelContent.tsx +5 -2
- package/src/LaunchMsaView/components/OrthologQuery/OrthologSourceSelect.tsx +5 -2
- package/src/LaunchMsaView/components/OrthologQuery/QuerySpeciesSelect.tsx +6 -2
- package/src/LaunchMsaView/components/PreLoadedMSA/types.ts +9 -2
- package/src/LaunchMsaView/components/QueryRowSelector.tsx +5 -2
- package/src/LaunchMsaView/components/SequenceStatus.tsx +5 -2
- package/src/LaunchMsaView/components/SubmitCancelActions.tsx +7 -4
- package/src/LaunchMsaView/components/TabPanel.test.tsx +5 -4
- package/src/LaunchMsaView/components/TabPanel.tsx +6 -2
- package/src/LaunchMsaView/components/TranscriptSelector.tsx +5 -2
- package/src/LaunchMsaView/components/fetchSeq.ts +10 -2
- package/src/LaunchMsaView/components/launchPlacement.tsx +16 -12
- package/src/LaunchMsaView/components/useFeatureSequence.ts +2 -1
- package/src/MsaViewPanel/afterCreateAutoruns.ts +39 -3
- package/src/MsaViewPanel/components/JobLink.tsx +3 -2
- package/src/MsaViewPanel/connectedDomains.ts +1 -1
- package/src/MsaViewPanel/launchAutoruns.test.ts +1 -0
- package/src/MsaViewPanel/loadProteinDomains.test.ts +42 -7
- package/src/MsaViewPanel/loadProteinDomains.ts +16 -9
- package/src/MsaViewPanel/model.ts +189 -9
- package/src/MsaViewPanel/resolveConnectedTranscript.test.ts +198 -5
- package/src/MsaViewPanel/resolveConnectedTranscript.ts +129 -35
- package/src/MsaViewPanel/transcriptMap.test.ts +21 -38
- package/src/MsaViewPanel/transcriptMap.ts +15 -17
- package/src/MsaViewPanel/util.ts +9 -0
- package/src/MsaViewPanel/viewReport.ts +185 -0
- package/src/MsaViewPanel/viewState.test.ts +340 -0
- package/src/components/ExternalLink.tsx +5 -2
- package/src/components/ReadOnlyTextField2.tsx +9 -2
- package/src/components/TextField2.tsx +6 -2
- package/src/utils/ncbiDomains.test.ts +62 -5
- package/src/utils/ncbiDomains.ts +32 -8
- package/src/utils/ncbiOrthologs.test.ts +2 -2
- package/src/utils/taxonomyNamesAbort.test.ts +2 -2
- package/src/utils/unirefHomologs.ts +5 -4
- package/src/version.ts +1 -1
- package/dist/chunks/AboutDialog-HJKHE6X5.js +0 -2
- package/dist/chunks/AnnotationFileDialog-MGUAGUEN.js +0 -2
- package/dist/chunks/BgzipFastaMsaAdapter-WWIGI57O.js +0 -4
- package/dist/chunks/BgzipFastaMsaAdapter-WWIGI57O.js.map +0 -7
- package/dist/chunks/ExportSVGDialog-JNEIAPDD.js +0 -2
- package/dist/chunks/FeatureDialog-36U3KHHS.js +0 -2
- package/dist/chunks/GapThresholdDialog-MMQTM2ZY.js +0 -2
- package/dist/chunks/GapThresholdDialog-MMQTM2ZY.js.map +0 -7
- package/dist/chunks/GoToDialog-HYG2ADFF.js +0 -2
- package/dist/chunks/HelpDialog-5WXA5QYK.js +0 -2
- package/dist/chunks/HelpDialog-DF4Y536X.js +0 -2
- package/dist/chunks/HelpDialog-DF4Y536X.js.map +0 -7
- package/dist/chunks/LaunchMsaViewDialog-GR4BB3W2.js +0 -5
- package/dist/chunks/LaunchMsaViewDialog-GR4BB3W2.js.map +0 -7
- package/dist/chunks/MetadataDialog-QQNNQELM.js +0 -2
- package/dist/chunks/MetadataDialog-QQNNQELM.js.map +0 -7
- package/dist/chunks/MsaViewPanel-MYCLHDTC.js +0 -2
- package/dist/chunks/MsaViewPanel-MYCLHDTC.js.map +0 -7
- package/dist/chunks/TrackInfoDialog-WJAJNV5S.js +0 -2
- package/dist/chunks/TreeNodeInfoDialog-JATVC2AB.js +0 -2
- package/dist/chunks/chunk-2IWD4OO4.js +0 -2
- package/dist/chunks/chunk-2IWD4OO4.js.map +0 -7
- package/dist/chunks/chunk-5YOLE75H.js +0 -6
- package/dist/chunks/chunk-6GRHBYHB.js +0 -6
- package/dist/chunks/chunk-BX4Z274Q.js +0 -2
- package/dist/chunks/chunk-BX4Z274Q.js.map +0 -7
- package/dist/chunks/chunk-CVLB4VFP.js +0 -2
- package/dist/chunks/chunk-CVLB4VFP.js.map +0 -7
- package/dist/chunks/chunk-DNFD5II2.js +0 -2
- package/dist/chunks/chunk-DNFD5II2.js.map +0 -7
- package/dist/chunks/chunk-DYDEKAIN.js +0 -3
- package/dist/chunks/chunk-DYDEKAIN.js.map +0 -7
- package/dist/chunks/chunk-EKTRLQV7.js +0 -2
- package/dist/chunks/chunk-EKTRLQV7.js.map +0 -7
- package/dist/chunks/chunk-FCWXYIFC.js +0 -2
- package/dist/chunks/chunk-FCWXYIFC.js.map +0 -7
- package/dist/chunks/chunk-FY3BTKY4.js +0 -2
- package/dist/chunks/chunk-GFANDTQR.js +0 -2
- package/dist/chunks/chunk-J6KYLXRD.js +0 -2
- package/dist/chunks/chunk-J6KYLXRD.js.map +0 -7
- package/dist/chunks/chunk-JFL3LJPO.js +0 -2
- package/dist/chunks/chunk-JFL3LJPO.js.map +0 -7
- package/dist/chunks/chunk-JYQQZRPF.js +0 -2
- package/dist/chunks/chunk-M2AAIXY5.js +0 -2
- package/dist/chunks/chunk-M2AAIXY5.js.map +0 -7
- package/dist/chunks/chunk-MDZDMDUF.js +0 -2
- package/dist/chunks/chunk-MDZDMDUF.js.map +0 -7
- package/dist/chunks/chunk-NRAUA3EX.js +0 -2
- package/dist/chunks/chunk-NSASZ5FM.js +0 -2
- package/dist/chunks/chunk-NSASZ5FM.js.map +0 -7
- package/dist/chunks/chunk-QWXSEUZI.js +0 -2
- package/dist/chunks/chunk-QWXSEUZI.js.map +0 -7
- package/dist/chunks/chunk-RTIGCYCA.js +0 -164
- package/dist/chunks/chunk-RTIGCYCA.js.map +0 -7
- package/dist/chunks/chunk-W5VCM3IV.js +0 -2
- package/dist/chunks/chunk-W5VCM3IV.js.map +0 -7
- package/dist/chunks/chunk-Y7M36762.js +0 -2
- package/dist/chunks/chunk-Y7M36762.js.map +0 -7
- package/dist/chunks/dist-KSNV45ZL.js +0 -2
- package/dist/chunks/model-RLH5FCVU.js +0 -12
- package/dist/chunks/model-RLH5FCVU.js.map +0 -7
- package/dist/chunks/renderToSvg-EBTD7XU6.js +0 -2
- /package/dist/chunks/{chunk-2MRW3C7A.js.map → chunk-33ER5TMH.js.map} +0 -0
- /package/dist/chunks/{chunk-FY3BTKY4.js.map → chunk-KVMUXFPB.js.map} +0 -0
- /package/dist/chunks/{dist-KSNV45ZL.js.map → dist-2VELCAWU.js.map} +0 -0
- /package/dist/chunks/{dist-J332RCWL.js.map → dist-34WACJJR.js.map} +0 -0
- /package/dist/chunks/{renderToSvg-EBTD7XU6.js.map → renderToSvg-VO23YN7B.js.map} +0 -0
package/README.md
CHANGED
|
@@ -79,6 +79,8 @@ Linking and embedding:
|
|
|
79
79
|
- [Launch parameters](docs/launch-parameters.md): every argument and field.
|
|
80
80
|
- [Linked views](docs/linked-views.md): how a column reaches its codon and a
|
|
81
81
|
protein3d structure.
|
|
82
|
+
- [Reading the view](docs/reading-the-view.md): `view.report` and `notices`,
|
|
83
|
+
what a launch resolved to, as data a script or an agent reads.
|
|
82
84
|
|
|
83
85
|
Working on the plugin:
|
|
84
86
|
|
|
@@ -2,6 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import { getSession } from '@jbrowse/core/util';
|
|
3
3
|
import { isMsaView } from '../MsaViewPanel/isMsaView';
|
|
4
4
|
import HighlightComponents from './HighlightComponents';
|
|
5
|
+
// eslint-disable-next-line no-restricted-syntax -- a plugin install step, not a component; the element it returns renders inside the genome view's observer
|
|
5
6
|
export default function AddHighlightComponentsModelF(pluginManager) {
|
|
6
7
|
pluginManager.contributeToExtensionPoint('LinearGenomeView-TracksContainerComponent', ({ model }) => {
|
|
7
8
|
const { views } = getSession(model);
|
|
@@ -11,4 +11,4 @@ export default function configSchemaF(pluginManager: PluginManager): import("@jb
|
|
|
11
11
|
} & {
|
|
12
12
|
defaultValue: string;
|
|
13
13
|
};
|
|
14
|
-
}, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<any, undefined, undefined, import("@jbrowse/core/configuration").ConfigurationSchemaRequirement<Partial<Record<string, string[]>>, string
|
|
14
|
+
}, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<any, undefined, undefined, import("@jbrowse/core/configuration").ConfigurationSchemaRequirement<Partial<Record<string, string[]>>, string>, any>>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { BlastLookupMethod } from './BlastPanel';
|
|
3
|
-
|
|
3
|
+
declare const BlastMethodSelector: ({ lookupMethod, setLookupMethod, }: {
|
|
4
4
|
lookupMethod: BlastLookupMethod;
|
|
5
5
|
setLookupMethod: (method: BlastLookupMethod) => void;
|
|
6
|
-
})
|
|
6
|
+
}) => React.JSX.Element;
|
|
7
|
+
export default BlastMethodSelector;
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { FormControl, FormControlLabel, Radio, RadioGroup } from '@mui/material';
|
|
3
|
-
|
|
3
|
+
import { observer } from 'mobx-react';
|
|
4
|
+
const BlastMethodSelector = observer(function BlastMethodSelector({ lookupMethod, setLookupMethod, }) {
|
|
4
5
|
return (React.createElement(FormControl, { component: "fieldset" },
|
|
5
6
|
React.createElement(RadioGroup, { row: true, value: lookupMethod, onChange: event => {
|
|
6
7
|
setLookupMethod(event.target.value);
|
|
7
8
|
} },
|
|
8
9
|
React.createElement(FormControlLabel, { value: "automatic", control: React.createElement(Radio, null), label: "Automatic" }),
|
|
9
10
|
React.createElement(FormControlLabel, { value: "manual", control: React.createElement(Radio, null), label: "Manual" }))));
|
|
10
|
-
}
|
|
11
|
+
});
|
|
12
|
+
export default BlastMethodSelector;
|
|
@@ -17,11 +17,11 @@ declare const panelMap: {
|
|
|
17
17
|
}) => React.JSX.Element;
|
|
18
18
|
};
|
|
19
19
|
export type BlastLookupMethod = keyof typeof panelMap;
|
|
20
|
-
|
|
20
|
+
declare const BlastPanel: ({ handleClose, model, feature, preferredTranscriptId, }: {
|
|
21
21
|
handleClose: () => void;
|
|
22
22
|
model: AbstractTrackModel;
|
|
23
23
|
feature: Feature;
|
|
24
24
|
/** the isoform the user right-clicked, preselected in the picker */
|
|
25
25
|
preferredTranscriptId?: string;
|
|
26
|
-
})
|
|
27
|
-
export
|
|
26
|
+
}) => React.JSX.Element;
|
|
27
|
+
export default BlastPanel;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
2
|
import SettingsIcon from '@mui/icons-material/Settings';
|
|
3
3
|
import { IconButton, Tooltip } from '@mui/material';
|
|
4
|
+
import { observer } from 'mobx-react';
|
|
4
5
|
import { makeStyles } from 'tss-react/mui';
|
|
5
6
|
import { DEFAULT_EBI_EMAIL, EBI_EMAIL_STORAGE_KEY, } from '../../../utils/ebiJobDispatcher';
|
|
6
7
|
import { useLocalStorage } from '../../../utils/useLocalStorage';
|
|
@@ -17,7 +18,7 @@ const panelMap = {
|
|
|
17
18
|
automatic: BlastAutomaticPanel,
|
|
18
19
|
manual: BlastManualPanel,
|
|
19
20
|
};
|
|
20
|
-
|
|
21
|
+
const BlastPanel = observer(function BlastPanel({ handleClose, model, feature, preferredTranscriptId, }) {
|
|
21
22
|
const [lookupMethod, setLookupMethod] = useState('automatic');
|
|
22
23
|
const [ebiEmail, setEbiEmail] = useLocalStorage(EBI_EMAIL_STORAGE_KEY, DEFAULT_EBI_EMAIL);
|
|
23
24
|
const [settingsOpen, setSettingsOpen] = useState(false);
|
|
@@ -37,4 +38,5 @@ export default function BlastPanel({ handleClose, model, feature, preferredTrans
|
|
|
37
38
|
}
|
|
38
39
|
setSettingsOpen(false);
|
|
39
40
|
} })) : null));
|
|
40
|
-
}
|
|
41
|
+
});
|
|
42
|
+
export default BlastPanel;
|
|
@@ -2,7 +2,8 @@ import React from 'react';
|
|
|
2
2
|
export interface BlastSettings {
|
|
3
3
|
ebiEmail: string;
|
|
4
4
|
}
|
|
5
|
-
|
|
5
|
+
declare const BlastSettingsDialog: ({ handleClose, ebiEmail, }: {
|
|
6
6
|
handleClose: (arg?: BlastSettings) => void;
|
|
7
7
|
ebiEmail: string;
|
|
8
|
-
})
|
|
8
|
+
}) => React.JSX.Element;
|
|
9
|
+
export default BlastSettingsDialog;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
2
|
import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Typography, } from '@mui/material';
|
|
3
|
+
import { observer } from 'mobx-react';
|
|
3
4
|
import { makeStyles } from 'tss-react/mui';
|
|
4
5
|
import TextField2 from '../../../components/TextField2';
|
|
5
6
|
import { DEFAULT_EBI_EMAIL } from '../../../utils/ebiJobDispatcher';
|
|
@@ -11,7 +12,7 @@ const useStyles = makeStyles()({
|
|
|
11
12
|
marginBottom: 8,
|
|
12
13
|
},
|
|
13
14
|
});
|
|
14
|
-
|
|
15
|
+
const BlastSettingsDialog = observer(function BlastSettingsDialog({ handleClose, ebiEmail, }) {
|
|
15
16
|
const { classes } = useStyles();
|
|
16
17
|
const [tempEbiEmail, setTempEbiEmail] = useState(ebiEmail);
|
|
17
18
|
return (React.createElement(Dialog, { open: true, maxWidth: "lg", onClose: () => {
|
|
@@ -33,4 +34,5 @@ export default function BlastSettingsDialog({ handleClose, ebiEmail, }) {
|
|
|
33
34
|
React.createElement(Button, { color: "primary", variant: "contained", onClick: () => {
|
|
34
35
|
handleClose({ ebiEmail: tempEbiEmail });
|
|
35
36
|
} }, "Save"))));
|
|
36
|
-
}
|
|
37
|
+
});
|
|
38
|
+
export default BlastSettingsDialog;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { MsaAlgorithm } from './consts';
|
|
3
|
-
|
|
3
|
+
declare const MsaAlgorithmSelect: ({ value, onChange, className, }: {
|
|
4
4
|
value: MsaAlgorithm;
|
|
5
5
|
onChange: (val: MsaAlgorithm) => void;
|
|
6
6
|
className?: string;
|
|
7
|
-
})
|
|
7
|
+
}) => React.JSX.Element;
|
|
8
|
+
export default MsaAlgorithmSelect;
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { MenuItem } from '@mui/material';
|
|
3
|
+
import { observer } from 'mobx-react';
|
|
3
4
|
import TextField2 from '../../../components/TextField2';
|
|
4
5
|
import { msaAlgorithmLabels, msaAlgorithms } from './consts';
|
|
5
|
-
|
|
6
|
+
const MsaAlgorithmSelect = observer(function MsaAlgorithmSelect({ value, onChange, className, }) {
|
|
6
7
|
return (React.createElement(TextField2, { variant: "outlined", label: "MSA Algorithm", className: className, select: true, value: value, helperText: value === 'browser'
|
|
7
8
|
? 'no EBI job; rows aligned to the query'
|
|
8
9
|
: undefined, onChange: event => {
|
|
9
10
|
onChange(event.target.value);
|
|
10
11
|
} }, msaAlgorithms.map(val => (React.createElement(MenuItem, { value: val, key: val }, msaAlgorithmLabels[val])))));
|
|
11
|
-
}
|
|
12
|
+
});
|
|
13
|
+
export default MsaAlgorithmSelect;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import React, { Suspense, lazy, useState } from 'react';
|
|
2
2
|
import Help from '@mui/icons-material/Help';
|
|
3
3
|
import { IconButton, Tooltip } from '@mui/material';
|
|
4
|
+
import { observer } from 'mobx-react';
|
|
4
5
|
const HelpDialog = lazy(() => import('./HelpDialog'));
|
|
5
|
-
|
|
6
|
+
const HelpButton = observer(function HelpButton() {
|
|
6
7
|
const [show, setShow] = useState(false);
|
|
7
8
|
return (React.createElement(React.Fragment, null,
|
|
8
9
|
React.createElement(Tooltip, { title: "What each tab does" },
|
|
@@ -14,4 +15,5 @@ export default function HelpButton() {
|
|
|
14
15
|
React.createElement(HelpDialog, { handleClose: () => {
|
|
15
16
|
setShow(false);
|
|
16
17
|
} }))) : null));
|
|
17
|
-
}
|
|
18
|
+
});
|
|
19
|
+
export default HelpButton;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Dialog } from '@jbrowse/core/ui';
|
|
3
3
|
import { Button, DialogActions, DialogContent, Divider, Typography, } from '@mui/material';
|
|
4
|
-
|
|
4
|
+
import { observer } from 'mobx-react';
|
|
5
|
+
const HelpDialog = observer(function HelpDialog({ handleClose, }) {
|
|
5
6
|
return (React.createElement(Dialog, { open: true, maxWidth: "md", onClose: handleClose, title: "Launching an MSA" },
|
|
6
7
|
React.createElement(DialogContent, null,
|
|
7
8
|
React.createElement(Typography, { gutterBottom: true }, "Every tab aligns the same thing: the protein the selected transcript translates to. That transcript is the query row, which is what ties alignment columns back to codons in the genome view \u2014 hovering one highlights the other, and clicking navigates."),
|
|
@@ -15,4 +16,5 @@ export default function HelpDialog({ handleClose, }) {
|
|
|
15
16
|
React.createElement(Divider, null),
|
|
16
17
|
React.createElement(DialogActions, null,
|
|
17
18
|
React.createElement(Button, { onClick: handleClose, color: "primary" }, "Close"))));
|
|
18
|
-
}
|
|
19
|
+
});
|
|
20
|
+
export default HelpDialog;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { AbstractTrackModel, Feature } from '@jbrowse/core/util';
|
|
3
|
-
|
|
3
|
+
declare const LaunchMsaViewDialog: ({ handleClose, feature, model, preferredTranscriptId, }: {
|
|
4
4
|
handleClose: () => void;
|
|
5
5
|
feature: Feature;
|
|
6
6
|
model: AbstractTrackModel;
|
|
7
7
|
/** the isoform the right-click landed on, when this opened on its gene */
|
|
8
8
|
preferredTranscriptId?: string;
|
|
9
|
-
})
|
|
9
|
+
}) => React.JSX.Element;
|
|
10
|
+
export default LaunchMsaViewDialog;
|
|
@@ -2,6 +2,7 @@ import React, { useState } from 'react';
|
|
|
2
2
|
import { Dialog } from '@jbrowse/core/ui';
|
|
3
3
|
import { getSession } from '@jbrowse/core/util';
|
|
4
4
|
import { Tab, Tabs } from '@mui/material';
|
|
5
|
+
import { observer } from 'mobx-react';
|
|
5
6
|
import BlastPanel from './BlastQuery/BlastPanel';
|
|
6
7
|
import HelpButton from './HelpButton';
|
|
7
8
|
import ManualMSALoader from './ManualMSALoader/ManualMSALoader';
|
|
@@ -10,7 +11,7 @@ import PreLoadedMSA from './PreLoadedMSA/PreLoadedMSADataPanel';
|
|
|
10
11
|
import { readMsaDatasets } from './PreLoadedMSA/types';
|
|
11
12
|
import TabPanel from './TabPanel';
|
|
12
13
|
import { LaunchPlacementProvider } from './launchPlacement';
|
|
13
|
-
|
|
14
|
+
const LaunchMsaViewDialog = observer(function LaunchMsaViewDialog({ handleClose, feature, model, preferredTranscriptId, }) {
|
|
14
15
|
const session = getSession(model);
|
|
15
16
|
const datasets = readMsaDatasets(session.jbrowse);
|
|
16
17
|
const hasPreloadedDatasets = !!datasets?.length;
|
|
@@ -36,4 +37,5 @@ export default function LaunchMsaViewDialog({ handleClose, feature, model, prefe
|
|
|
36
37
|
React.createElement(PreLoadedMSA, { model: model, feature: feature, handleClose: handleClose, preferredTranscriptId: preferredTranscriptId }))) : null,
|
|
37
38
|
React.createElement(TabPanel, { value: value, index: "manual_msa" },
|
|
38
39
|
React.createElement(ManualMSALoader, { model: model, feature: feature, handleClose: handleClose, preferredTranscriptId: preferredTranscriptId })))));
|
|
39
|
-
}
|
|
40
|
+
});
|
|
41
|
+
export default LaunchMsaViewDialog;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
|
|
2
|
+
declare const LaunchPanelContent: ({ error, children, }: {
|
|
3
3
|
error?: unknown;
|
|
4
4
|
children: React.ReactNode;
|
|
5
|
-
})
|
|
5
|
+
}) => React.JSX.Element;
|
|
6
|
+
export default LaunchPanelContent;
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { ErrorMessage } from '@jbrowse/core/ui';
|
|
3
3
|
import { DialogContent } from '@mui/material';
|
|
4
|
+
import { observer } from 'mobx-react';
|
|
4
5
|
import { makeStyles } from 'tss-react/mui';
|
|
5
6
|
const useStyles = makeStyles()({
|
|
6
7
|
dialogContent: {
|
|
7
8
|
width: '80em',
|
|
8
9
|
},
|
|
9
10
|
});
|
|
10
|
-
|
|
11
|
+
const LaunchPanelContent = observer(function LaunchPanelContent({ error, children, }) {
|
|
11
12
|
const { classes } = useStyles();
|
|
12
13
|
return (React.createElement(DialogContent, { className: classes.dialogContent },
|
|
13
14
|
error ? React.createElement(ErrorMessage, { error: error }) : null,
|
|
14
15
|
children));
|
|
15
|
-
}
|
|
16
|
+
});
|
|
17
|
+
export default LaunchPanelContent;
|
|
@@ -2,8 +2,9 @@ import React from 'react';
|
|
|
2
2
|
import type { OrthologSource } from '../../../MsaViewPanel/model';
|
|
3
3
|
export declare function validOrthologSource(stored: unknown): OrthologSource;
|
|
4
4
|
export declare function useStoredOrthologSource(): readonly ["ncbi" | "panther" | "uniref", (source: OrthologSource) => void];
|
|
5
|
-
|
|
5
|
+
declare const OrthologSourceSelect: ({ value, onChange, className, }: {
|
|
6
6
|
value: OrthologSource;
|
|
7
7
|
onChange: (val: OrthologSource) => void;
|
|
8
8
|
className?: string;
|
|
9
|
-
})
|
|
9
|
+
}) => React.JSX.Element;
|
|
10
|
+
export default OrthologSourceSelect;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { MenuItem } from '@mui/material';
|
|
3
|
+
import { observer } from 'mobx-react';
|
|
3
4
|
import TextField2 from '../../../components/TextField2';
|
|
4
5
|
import { useLocalStorage } from '../../../utils/useLocalStorage';
|
|
5
6
|
const ORTHOLOG_SOURCE_STORAGE_KEY = 'msaview-ortholog-source';
|
|
@@ -32,8 +33,9 @@ const hints = {
|
|
|
32
33
|
panther: 'also yeast, worm, fly and plants',
|
|
33
34
|
uniref: 'all of UniProtKB within 50% identity',
|
|
34
35
|
};
|
|
35
|
-
|
|
36
|
+
const OrthologSourceSelect = observer(function OrthologSourceSelect({ value, onChange, className, }) {
|
|
36
37
|
return (React.createElement(TextField2, { variant: "outlined", label: "Source", className: className, select: true, value: value, helperText: hints[value], onChange: event => {
|
|
37
38
|
onChange(event.target.value);
|
|
38
39
|
} }, orthologSources.map(val => (React.createElement(MenuItem, { value: val, key: val }, orthologSourceLabels[val])))));
|
|
39
|
-
}
|
|
40
|
+
});
|
|
41
|
+
export default OrthologSourceSelect;
|
|
@@ -8,9 +8,10 @@ import React from 'react';
|
|
|
8
8
|
* organism rather than to nothing, and the only place that surfaces is the gene
|
|
9
9
|
* lookup, as "could not resolve NLRP1 in taxon 9986".
|
|
10
10
|
*/
|
|
11
|
-
|
|
11
|
+
declare const QuerySpeciesSelect: ({ value, assemblyName, onChange, className, }: {
|
|
12
12
|
value: number;
|
|
13
13
|
assemblyName?: string;
|
|
14
14
|
onChange: (taxId: number) => void;
|
|
15
15
|
className?: string;
|
|
16
|
-
})
|
|
16
|
+
}) => React.JSX.Element;
|
|
17
|
+
export default QuerySpeciesSelect;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
|
+
import { observer } from 'mobx-react';
|
|
2
3
|
import TextField2 from '../../../components/TextField2';
|
|
3
4
|
import { resolveAssemblySpecies, resolveTaxId, } from '../../../utils/ncbiTaxonomy';
|
|
4
5
|
import { fetchTaxonomyInfo } from '../../../utils/taxonomyNames';
|
|
@@ -32,7 +33,7 @@ async function describeTaxon(query, signal) {
|
|
|
32
33
|
* organism rather than to nothing, and the only place that surfaces is the gene
|
|
33
34
|
* lookup, as "could not resolve NLRP1 in taxon 9986".
|
|
34
35
|
*/
|
|
35
|
-
|
|
36
|
+
const QuerySpeciesSelect = observer(function QuerySpeciesSelect({ value, assemblyName, onChange, className, }) {
|
|
36
37
|
// undefined until the user types, which is what makes the two lookups
|
|
37
38
|
// exclusive rather than both firing on open
|
|
38
39
|
const [typed, setTyped] = useState();
|
|
@@ -71,4 +72,5 @@ export default function QuerySpeciesSelect({ value, assemblyName, onChange, clas
|
|
|
71
72
|
}, error: !!error, helperText: error
|
|
72
73
|
? `${error}`
|
|
73
74
|
: (resolved ?? `the species this gene is from (taxon ${value})`) }));
|
|
74
|
-
}
|
|
75
|
+
});
|
|
76
|
+
export default QuerySpeciesSelect;
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { AnyConfigurationModel } from '@jbrowse/core/configuration';
|
|
2
|
+
import type { JBrowseConfigModel } from '@jbrowse/core/util';
|
|
2
3
|
export interface Dataset {
|
|
3
4
|
datasetId: string;
|
|
4
5
|
name: string;
|
|
5
6
|
description?: string;
|
|
6
7
|
adapter: AnyConfigurationModel;
|
|
7
8
|
}
|
|
8
|
-
export declare function readMsaDatasets(jbrowse:
|
|
9
|
+
export declare function readMsaDatasets(jbrowse: JBrowseConfigModel & {
|
|
10
|
+
msa?: AnyConfigurationModel;
|
|
11
|
+
}): Dataset[] | undefined;
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { readConfObject } from '@jbrowse/core/configuration';
|
|
2
|
+
// `msa` is this plugin's rootConfigurationSchema, which the host mounts beside
|
|
3
|
+
// JBrowseConfigModel's declared members, so the core type does not name it
|
|
2
4
|
export function readMsaDatasets(jbrowse) {
|
|
3
|
-
return
|
|
5
|
+
return jbrowse.msa
|
|
6
|
+
? readConfObject(jbrowse.msa, 'datasets')
|
|
7
|
+
: undefined;
|
|
4
8
|
}
|
|
@@ -7,10 +7,11 @@ import type { QueryRowMatch } from '../detectQueryRow';
|
|
|
7
7
|
* itself in from the pasted alignment and offers that alignment's own row names
|
|
8
8
|
* rather than a free text box the user can typo.
|
|
9
9
|
*/
|
|
10
|
-
|
|
10
|
+
declare const QueryRowSelector: ({ names, detected, querySeqName, setQuerySeqName, isAutoDetected, }: {
|
|
11
11
|
names: string[];
|
|
12
12
|
detected?: QueryRowMatch;
|
|
13
13
|
querySeqName: string;
|
|
14
14
|
setQuerySeqName: (arg: string) => void;
|
|
15
15
|
isAutoDetected: boolean;
|
|
16
|
-
})
|
|
16
|
+
}) => React.JSX.Element;
|
|
17
|
+
export default QueryRowSelector;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Alert, MenuItem } from '@mui/material';
|
|
3
|
+
import { observer } from 'mobx-react';
|
|
3
4
|
import { makeStyles } from 'tss-react/mui';
|
|
4
5
|
import TextField2 from '../../components/TextField2';
|
|
5
6
|
const useStyles = makeStyles()({
|
|
@@ -30,7 +31,7 @@ function partialCoverage({ identity, offset, }) {
|
|
|
30
31
|
* itself in from the pasted alignment and offers that alignment's own row names
|
|
31
32
|
* rather than a free text box the user can typo.
|
|
32
33
|
*/
|
|
33
|
-
|
|
34
|
+
const QueryRowSelector = observer(function QueryRowSelector({ names, detected, querySeqName, setQuerySeqName, isAutoDetected, }) {
|
|
34
35
|
const { classes } = useStyles();
|
|
35
36
|
return (React.createElement(React.Fragment, null,
|
|
36
37
|
names.length > 0 ? (React.createElement(TextField2, { variant: "outlined", label: "MSA row matching the selected transcript", select: true, fullWidth: true, className: classes.field, value: names.includes(querySeqName) ? querySeqName : '', onChange: event => {
|
|
@@ -51,4 +52,5 @@ export default function QueryRowSelector({ names, detected, querySeqName, setQue
|
|
|
51
52
|
" to your protein sequence",
|
|
52
53
|
detected.quality === 'exact' ? '' : partialCoverage(detected),
|
|
53
54
|
". Clicking the alignment will navigate the genome view."))) : names.length > 0 && !querySeqName ? (React.createElement(Alert, { severity: "warning", className: classes.alert }, "No row matched your protein sequence \u2014 pick the one for your gene above. Without it the alignment still renders, but clicking it will not navigate the genome view.")) : null));
|
|
54
|
-
}
|
|
55
|
+
});
|
|
56
|
+
export default QueryRowSelector;
|
|
@@ -9,6 +9,7 @@ export type SequenceStatus = 'loading' | 'ready' | 'missing' | 'error';
|
|
|
9
9
|
* An error says so through the panel's own ErrorMessage, so this stays quiet
|
|
10
10
|
* for that one rather than saying it twice.
|
|
11
11
|
*/
|
|
12
|
-
|
|
12
|
+
declare const SequenceStatusMessage: ({ status, }: {
|
|
13
13
|
status: SequenceStatus;
|
|
14
|
-
})
|
|
14
|
+
}) => React.JSX.Element | null;
|
|
15
|
+
export default SequenceStatusMessage;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { LoadingEllipses } from '@jbrowse/core/ui';
|
|
3
3
|
import { Typography } from '@mui/material';
|
|
4
|
+
import { observer } from 'mobx-react';
|
|
4
5
|
/**
|
|
5
6
|
* Why Submit is grey. The query row is the selected transcript's translation,
|
|
6
7
|
* and fetching and translating it takes a round trip to the sequence adapter,
|
|
@@ -10,6 +11,7 @@ import { Typography } from '@mui/material';
|
|
|
10
11
|
* An error says so through the panel's own ErrorMessage, so this stays quiet
|
|
11
12
|
* for that one rather than saying it twice.
|
|
12
13
|
*/
|
|
13
|
-
|
|
14
|
+
const SequenceStatusMessage = observer(function SequenceStatusMessage({ status, }) {
|
|
14
15
|
return status === 'loading' ? (React.createElement(LoadingEllipses, { message: "Translating transcript" })) : status === 'missing' ? (React.createElement(Typography, { color: "textSecondary", variant: "body2" }, "no coding sequence to align")) : null;
|
|
15
|
-
}
|
|
16
|
+
});
|
|
17
|
+
export default SequenceStatusMessage;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { MsaViewPlacement } from '../../utils/workspaces';
|
|
3
3
|
import type { AbstractTrackModel } from '@jbrowse/core/util';
|
|
4
|
-
|
|
4
|
+
declare const SubmitCancelActions: ({ onSubmit, onCancel, submitDisabled, hint, submitLabel, model, }: {
|
|
5
5
|
/** handed the placement the box states, so no launch re-reads storage */
|
|
6
6
|
onSubmit: (placement: MsaViewPlacement) => void;
|
|
7
7
|
onCancel: () => void;
|
|
@@ -11,4 +11,5 @@ export default function SubmitCancelActions({ onSubmit, onCancel, submitDisabled
|
|
|
11
11
|
submitLabel?: string;
|
|
12
12
|
/** omitted by a panel that submits something other than a view launch */
|
|
13
13
|
model?: AbstractTrackModel;
|
|
14
|
-
})
|
|
14
|
+
}) => React.JSX.Element;
|
|
15
|
+
export default SubmitCancelActions;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { getSession } from '@jbrowse/core/util';
|
|
3
3
|
import { Button, Checkbox, DialogActions, FormControlLabel, } from '@mui/material';
|
|
4
|
+
import { observer } from 'mobx-react';
|
|
4
5
|
import { readLaunchPlacement, sessionSupportsPlacement, writeLaunchPlacement, } from '../../utils/workspaces';
|
|
5
6
|
import { useLaunchPlacement } from './launchPlacement';
|
|
6
7
|
/**
|
|
@@ -14,12 +15,12 @@ import { useLaunchPlacement } from './launchPlacement';
|
|
|
14
15
|
* release that places views its own way — because the box would do nothing
|
|
15
16
|
* there and every launch would quietly ignore it.
|
|
16
17
|
*/
|
|
17
|
-
function PlacementToggle({ checked, onChange, }) {
|
|
18
|
+
const PlacementToggle = observer(function PlacementToggle({ checked, onChange, }) {
|
|
18
19
|
return (React.createElement(FormControlLabel, { label: "Open beside the genome view", control: React.createElement(Checkbox, { checked: checked, onChange: event => {
|
|
19
20
|
onChange(event.target.checked);
|
|
20
21
|
} }) }));
|
|
21
|
-
}
|
|
22
|
-
|
|
22
|
+
});
|
|
23
|
+
const SubmitCancelActions = observer(function SubmitCancelActions({ onSubmit, onCancel, submitDisabled, hint, submitLabel = 'Submit', model, }) {
|
|
23
24
|
const [sideBySide, setSideBySide] = useLaunchPlacement();
|
|
24
25
|
// The stored value is what the next dialog opens on, so it is written on
|
|
25
26
|
// submit rather than on the click: a dialog the user backed out of must not
|
|
@@ -47,4 +48,5 @@ export default function SubmitCancelActions({ onSubmit, onCancel, submitDisabled
|
|
|
47
48
|
React.createElement(Button, { sx: { flexShrink: 0 }, color: "secondary", variant: "contained", onClick: () => {
|
|
48
49
|
onCancel();
|
|
49
50
|
} }, "Cancel"))));
|
|
50
|
-
}
|
|
51
|
+
});
|
|
52
|
+
export default SubmitCancelActions;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
|
|
2
|
+
declare const TabPanel: ({ children, value, index, }: {
|
|
3
3
|
children?: React.ReactNode;
|
|
4
4
|
index: number | string;
|
|
5
5
|
value: number | string;
|
|
6
|
-
})
|
|
6
|
+
}) => React.JSX.Element;
|
|
7
|
+
export default TabPanel;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
|
+
import { observer } from 'mobx-react';
|
|
2
3
|
// Once visited, a panel stays mounted and is hidden with the `hidden` attribute.
|
|
3
4
|
// Unmounting it discarded whatever the user had typed and re-ran every fetch the
|
|
4
5
|
// panel makes on the way back, so switching tabs to compare two of them cost an
|
|
@@ -7,11 +8,12 @@ import React, { useState } from 'react';
|
|
|
7
8
|
// Lazy on first visit rather than mounted up front, because a panel mounts
|
|
8
9
|
// fetches of its own: rendering all four on open would query the MSA dataset
|
|
9
10
|
// adapter and the BLAST cache for tabs nobody looked at.
|
|
10
|
-
|
|
11
|
+
const TabPanel = observer(function TabPanel({ children, value, index, }) {
|
|
11
12
|
const active = value === index;
|
|
12
13
|
const [visited, setVisited] = useState(active);
|
|
13
14
|
if (active && !visited) {
|
|
14
15
|
setVisited(true);
|
|
15
16
|
}
|
|
16
17
|
return (React.createElement("div", { role: "tabpanel", hidden: !active }, visited || active ? children : null));
|
|
17
|
-
}
|
|
18
|
+
});
|
|
19
|
+
export default TabPanel;
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
// @vitest-environment jsdom
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { cleanup, render, screen } from '@testing-library/react';
|
|
4
|
+
import { observer } from 'mobx-react';
|
|
4
5
|
import { afterEach, expect, test, vi } from 'vitest';
|
|
5
6
|
import TabPanel from './TabPanel';
|
|
6
7
|
afterEach(() => {
|
|
7
8
|
cleanup();
|
|
8
9
|
});
|
|
9
|
-
function Panels({ value }) {
|
|
10
|
+
const Panels = observer(function Panels({ value }) {
|
|
10
11
|
return (React.createElement(React.Fragment, null,
|
|
11
12
|
React.createElement(TabPanel, { value: value, index: "a" },
|
|
12
13
|
React.createElement(Probe, { name: "a" })),
|
|
13
14
|
React.createElement(TabPanel, { value: value, index: "b" },
|
|
14
15
|
React.createElement(Probe, { name: "b" }))));
|
|
15
|
-
}
|
|
16
|
+
});
|
|
16
17
|
const mounted = vi.fn();
|
|
17
|
-
function Probe({ name }) {
|
|
18
|
+
const Probe = observer(function Probe({ name }) {
|
|
18
19
|
React.useEffect(() => {
|
|
19
20
|
mounted(name);
|
|
20
21
|
}, [name]);
|
|
21
22
|
return React.createElement("input", { defaultValue: name });
|
|
22
|
-
}
|
|
23
|
+
});
|
|
23
24
|
test('a visited panel keeps its state while another tab is shown', () => {
|
|
24
25
|
const { rerender } = render(React.createElement(Panels, { value: "a" }));
|
|
25
26
|
const typed = screen.getByDisplayValue('a');
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { SequenceStatus } from './SequenceStatus';
|
|
3
3
|
import type { Feature } from '@jbrowse/core/util';
|
|
4
|
-
|
|
4
|
+
declare const TranscriptSelector: ({ feature, options, selectedId, selectedTranscript, setSelectedId, proteinSequence, sequenceStatus, validIds, }: {
|
|
5
5
|
feature: Feature;
|
|
6
6
|
options: Feature[];
|
|
7
7
|
selectedId: string;
|
|
@@ -10,4 +10,5 @@ export default function TranscriptSelector({ feature, options, selectedId, selec
|
|
|
10
10
|
proteinSequence: string | undefined;
|
|
11
11
|
sequenceStatus?: SequenceStatus;
|
|
12
12
|
validIds?: string[];
|
|
13
|
-
})
|
|
13
|
+
}) => React.JSX.Element;
|
|
14
|
+
export default TranscriptSelector;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
2
|
import { Button, MenuItem, TextField } from '@mui/material';
|
|
3
|
+
import { observer } from 'mobx-react';
|
|
3
4
|
import { makeStyles } from 'tss-react/mui';
|
|
4
5
|
import ReadOnlyTextField2 from '../../components/ReadOnlyTextField2';
|
|
5
6
|
import { featureMatchesId, getGeneDisplayName, getId, getTranscriptDisplayName, getTranscriptLength, } from '../util';
|
|
@@ -15,7 +16,7 @@ const useStyles = makeStyles()({
|
|
|
15
16
|
marginLeft: 20,
|
|
16
17
|
},
|
|
17
18
|
});
|
|
18
|
-
|
|
19
|
+
const TranscriptSelector = observer(function TranscriptSelector({ feature, options, selectedId, selectedTranscript, setSelectedId, proteinSequence, sequenceStatus = 'ready', validIds, }) {
|
|
19
20
|
const { classes } = useStyles();
|
|
20
21
|
const [showSequence, setShowSequence] = useState(false);
|
|
21
22
|
return (React.createElement(React.Fragment, null,
|
|
@@ -53,4 +54,5 @@ export default function TranscriptSelector({ feature, options, selectedId, selec
|
|
|
53
54
|
: sequenceStatus === 'error'
|
|
54
55
|
? 'The sequence could not be fetched.'
|
|
55
56
|
: 'Loading...' })) : null));
|
|
56
|
-
}
|
|
57
|
+
});
|
|
58
|
+
export default TranscriptSelector;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { AbstractSessionModel } from '@jbrowse/core/util';
|
|
2
|
-
export declare function fetchSeq({ start, end, refName, session, assemblyName, }: {
|
|
2
|
+
export declare function fetchSeq({ start, end, refName, session, assemblyName, signal, }: {
|
|
3
3
|
start: number;
|
|
4
4
|
end: number;
|
|
5
5
|
refName: string;
|
|
6
6
|
assemblyName: string;
|
|
7
7
|
session: AbstractSessionModel;
|
|
8
|
+
signal: AbortSignal;
|
|
8
9
|
}): Promise<{
|
|
9
10
|
seq: string;
|
|
10
11
|
assemblyGeneticCodeId: number;
|